diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 194d8391a9c4..bb421ac6b3bf 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -15,5 +15,6 @@ updates: - dependency-name: "beefy-*" - dependency-name: "try-runtime-*" - dependency-name: "test-runner" + - dependency-name: "generate-bags" schedule: interval: "daily" diff --git a/.github/workflows/extrinsic-ordering-check-from-bin.yml b/.github/workflows/extrinsic-ordering-check-from-bin.yml index fa70a3071c4a..199b3be6fe66 100644 --- a/.github/workflows/extrinsic-ordering-check-from-bin.yml +++ b/.github/workflows/extrinsic-ordering-check-from-bin.yml @@ -6,15 +6,15 @@ on: inputs: reference_url: description: The WebSocket url of the reference node - default: wss://rpc.polkadot.io + default: wss://kusama-rpc.polkadot.io required: true binary_url: description: A url to a Linux binary for the node containing the runtime to test - default: https://releases.parity.io/polkadot/x86_64-debian:stretch/v0.9.9-rc1/polkadot + default: https://releases.parity.io/polkadot/x86_64-debian:stretch/v0.9.10/polkadot required: true chain: description: The name of the chain under test. Usually, you would pass a local chain - default: polkadot-local + default: kusama-local required: true jobs: @@ -27,6 +27,8 @@ jobs: REF_URL: ${{github.event.inputs.reference_url}} steps: + - uses: actions/checkout@v2 + - name: Fetch binary run: | echo Fetching $BIN_URL @@ -46,17 +48,26 @@ jobs: echo "Date: $(date)" >> output.txt echo "Reference: $REF_URL" >> output.txt echo "Target version: $VERSION" >> output.txt - echo "-------------------------------------------" >> output.txt + echo "Chain: $CHAIN" >> output.txt + echo "----------------------------------------------------------------------" >> output.txt + + - name: Pull polkadot-js-tools image + run: docker pull jacogr/polkadot-js-tools - name: Compare the metadata run: | - CMD="docker run --network host jacogr/polkadot-js-tools metadata $REF_URL ws://localhost:9944" + CMD="docker run --pull always --network host jacogr/polkadot-js-tools metadata $REF_URL ws://localhost:9944" echo -e "Running:\n$CMD" $CMD >> output.txt sed -z -i 's/\n\n/\n/g' output.txt + cat output.txt | egrep -n -i '' + SUMMARY=$(./scripts/github/extrinsic-ordering-filter.sh output.txt) + echo -e $SUMMARY + echo -e $SUMMARY >> output.txt - name: Show result - run: cat output.txt + run: | + cat output.txt - name: Stop our local node run: pkill polkadot diff --git a/.github/workflows/honggfuzz.yml b/.github/workflows/honggfuzz.yml index af0de3eb5017..ab1cdf0d2ef2 100644 --- a/.github/workflows/honggfuzz.yml +++ b/.github/workflows/honggfuzz.yml @@ -13,6 +13,13 @@ jobs: with: fetch-depth: 1 + - name: Cache Seed + id: cache-seed-round-trip + uses: actions/cache@v2 + with: + path: erasure-coding/fuzzer/hfuzz_workspace + key: ${{ runner.os }}-erasure-coding + - name: Install minimal stable Rust uses: actions-rs/toolchain@v1 with: @@ -52,6 +59,13 @@ jobs: with: fetch-depth: 1 + - name: Cache Seed + id: cache-seed-reconstruct + uses: actions/cache@v2 + with: + path: erasure-coding/fuzzer/hfuzz_workspace + key: ${{ runner.os }}-erasure-coding + - name: Install minimal stable Rust uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/publish-docker-release.yml b/.github/workflows/publish-docker-release.yml index 811849c561a5..1c5ae13caaa3 100644 --- a/.github/workflows/publish-docker-release.yml +++ b/.github/workflows/publish-docker-release.yml @@ -29,7 +29,7 @@ jobs: uses: docker/build-push-action@v2 with: push: true - file: scripts/docker/release.Dockerfile + file: scripts/docker/polkadot_injected_release.Dockerfile tags: | parity/polkadot:latest parity/polkadot:${{ github.event.release.tag_name }} @@ -37,6 +37,7 @@ jobs: POLKADOT_VERSION=${{ github.event.release.tag_name }} VCS_REF=${{ github.ref }} BUILD_DATE=${{ github.event.release.published_at }} + GPG_KEYSERVER="hkps://keys.mailvelope.com" cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache - name: Image digest diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 07f8fc5a558d..6a7d381c0722 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,6 +28,9 @@ variables: CI_SERVER_NAME: "GitLab CI" DOCKER_OS: "debian:stretch" ARCH: "x86_64" + VAULT_SERVER_URL: "https://vault.parity-mgmt-vault.parity.io" + VAULT_AUTH_PATH: "gitlab-parity-io-jwt" + VAULT_AUTH_ROLE: "cicd_gitlab_parity_${CI_PROJECT_NAME}" default: cache: {} @@ -84,6 +87,55 @@ default: when: never - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs +#### Vault secrets +.vault-secrets: &vault-secrets + secrets: + AWS_ACCESS_KEY_ID: + vault: cicd/gitlab/$CI_PROJECT_PATH/AWS_ACCESS_KEY_ID@kv + file: false + AWS_SECRET_ACCESS_KEY: + vault: cicd/gitlab/$CI_PROJECT_PATH/AWS_SECRET_ACCESS_KEY@kv + file: false + DOCKER_HUB_USER: + vault: cicd/gitlab/parity/DOCKER_HUB_USER@kv + file: false + DOCKER_HUB_PASS: + vault: cicd/gitlab/parity/DOCKER_HUB_PASS@kv + file: false + GITHUB_PR_TOKEN: + vault: cicd/gitlab/parity/GITHUB_PR_TOKEN@kv + file: false + GITHUB_USER: + vault: cicd/gitlab/$CI_PROJECT_PATH/GITHUB_USER@kv + file: false + GITHUB_RELEASE_TOKEN: + vault: cicd/gitlab/$CI_PROJECT_PATH/GITHUB_RELEASE_TOKEN@kv + file: false + GITHUB_TOKEN: + vault: cicd/gitlab/$CI_PROJECT_PATH/GITHUB_TOKEN@kv + file: false + MATRIX_ACCESS_TOKEN: + vault: cicd/gitlab/$CI_PROJECT_PATH/MATRIX_ACCESS_TOKEN@kv + file: false + MATRIX_ROOM_ID: + vault: cicd/gitlab/$CI_PROJECT_PATH/MATRIX_ROOM_ID@kv + file: false + PARITYPR_USER: + vault: cicd/gitlab/$CI_PROJECT_PATH/PARITYPR_USER@kv + file: false + PARITYPR_PASS: + vault: cicd/gitlab/$CI_PROJECT_PATH/PARITYPR_PASS@kv + file: false + PIPELINE_TOKEN: + vault: cicd/gitlab/$CI_PROJECT_PATH/PIPELINE_TOKEN@kv + file: false + REL_MAN_ROOM_ID: + vault: cicd/gitlab/$CI_PROJECT_PATH/REL_MAN_ROOM_ID@kv + file: false + SSH_PRIVATE_KEY: + vault: cicd/gitlab/$CI_PROJECT_PATH/SSH_PRIVATE_KEY@kv + file: false + #### stage: test check-runtime: @@ -91,6 +143,7 @@ check-runtime: image: paritytech/tools:latest <<: *kubernetes-env <<: *rules-pr-only + <<: *vault-secrets variables: GITLAB_API: "https://gitlab.parity.io/api/v4" GITHUB_API_PROJECT: "parity%2Finfrastructure%2Fgithub-api" @@ -120,6 +173,7 @@ test-deterministic-wasm: <<: *rules-test <<: *docker-env <<: *compiler-info + <<: *vault-secrets script: - ./scripts/gitlab/test_deterministic_wasm.sh @@ -128,6 +182,7 @@ test-build-linux-stable: <<: *docker-env <<: *compiler-info <<: *collect-artifacts + <<: *vault-secrets variables: RUST_TOOLCHAIN: stable # Enable debug assertions since we are running optimized builds for testing @@ -155,18 +210,30 @@ test-build-linux-stable: - echo "Polkadot version = ${VERSION} (EXTRATAG = ${EXTRATAG})" - echo -n ${VERSION} > ./artifacts/VERSION - echo -n ${EXTRATAG} > ./artifacts/EXTRATAG - - cp -r scripts/docker/* ./artifacts + - cp -r scripts/* ./artifacts check-runtime-benchmarks: stage: test <<: *rules-test <<: *docker-env <<: *compiler-info + <<: *vault-secrets script: # Check that the node will compile with `runtime-benchmarks` feature flag. - ./scripts/gitlab/check_runtime_benchmarks.sh - sccache -s +check-no-default-features: + stage: test + <<: *rules-test + <<: *docker-env + <<: *compiler-info + <<: *vault-secrets + script: + # Check that polkadot-cli will compile no default features. + - ./scripts/gitlab/check_no_default_features.sh + - sccache -s + spellcheck: stage: test <<: *docker-env @@ -175,8 +242,9 @@ spellcheck: - cargo spellcheck --version # compare with the commit parent to the PR, given it's from a default branch - git fetch origin +${CI_DEFAULT_BRANCH}:${CI_DEFAULT_BRANCH} + - cargo spellcheck list-files -vvv $(git diff --diff-filter=AM --name-only $(git merge-base ${CI_COMMIT_SHA} ${CI_DEFAULT_BRANCH})) - time cargo spellcheck check -vvv --cfg=scripts/gitlab/spellcheck.toml --checkers hunspell --code 1 - -r $(git diff --name-only ${CI_COMMIT_SHA} $(git merge-base ${CI_COMMIT_SHA} ${CI_DEFAULT_BRANCH})) + $(git diff --diff-filter=AM --name-only $(git merge-base ${CI_COMMIT_SHA} ${CI_DEFAULT_BRANCH})) allow_failure: true build-adder-collator: @@ -198,15 +266,17 @@ build-adder-collator: - echo -n "${CI_COMMIT_REF_NAME}" > ./artifacts/VERSION - echo -n "${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" > ./artifacts/EXTRATAG - echo "adder-collator version = $(cat ./artifacts/VERSION) (EXTRATAG = $(cat ./artifacts/EXTRATAG))" - - cp -r scripts/docker/* ./artifacts + - cp -r scripts/* ./artifacts #### stage: build check-transaction-versions: - image: node:15 + # image must be ubuntu:20.04 based to match the linkers, this image has npm installed + image: paritytech/contracts-ci-linux:production stage: build <<: *rules-test <<: *docker-env + <<: *vault-secrets needs: - job: test-build-linux-stable artifacts: true @@ -251,6 +321,7 @@ build-rustdoc: .build-push-image: &build-push-image <<: *kubernetes-env + <<: *vault-secrets image: quay.io/buildah/stable variables: &image-variables GIT_STRATEGY: none @@ -281,15 +352,15 @@ build-rustdoc: - buildah push --format=v2s2 "$IMAGE_NAME:$VERSION" - buildah push --format=v2s2 "$IMAGE_NAME:$EXTRATAG" after_script: - - buildah logout "$IMAGE_NAME" + - buildah logout --all publish-polkadot-image: stage: build <<: *build-push-image variables: <<: *image-variables - # scripts/docker/Dockerfile - DOCKERFILE: Dockerfile + # scripts/dockerfiles/polkadot_injected_debug.Dockerfile + DOCKERFILE: dockerfiles/polkadot_injected_debug.Dockerfile IMAGE_NAME: docker.io/paritypr/synth-wave rules: # Don't run on releases - this is handled by the Github Action here: @@ -303,8 +374,8 @@ publish-polkadot-image: variables: <<: *image-variables IMAGE_NAME: docker.io/parity/rococo - DOCKER_USER: ${Docker_Hub_User_Parity} - DOCKER_PASS: ${Docker_Hub_Pass_Parity} + DOCKER_USER: ${DOCKER_HUB_USER} + DOCKER_PASS: ${DOCKER_HUB_PASS} needs: - job: test-build-linux-stable artifacts: true @@ -324,8 +395,8 @@ publish-adder-collator-image: <<: *build-push-image variables: <<: *image-variables - # scripts/docker/collator.Dockerfile - DOCKERFILE: collator.Dockerfile + # scripts/dockerfiles/collator_injected.Dockerfile + DOCKERFILE: dockerfiles/collator_injected.Dockerfile IMAGE_NAME: docker.io/paritypr/colander rules: - if: $CI_PIPELINE_SOURCE == "schedule" @@ -336,7 +407,7 @@ publish-adder-collator-image: - job: build-adder-collator artifacts: true after_script: - - buildah logout "$IMAGE_NAME" + - buildah logout --all # pass artifacts to the simnet-tests job - echo "COLLATOR_IMAGE_NAME=${IMAGE_NAME}" > ./artifacts/collator.env - echo "COLLATOR_IMAGE_TAG=$(cat ./artifacts/EXTRATAG)" >> ./artifacts/collator.env @@ -380,6 +451,7 @@ publish-s3-release: &publish-s3 - job: test-build-linux-stable artifacts: true <<: *kubernetes-env + <<: *vault-secrets image: paritytech/awscli:latest variables: GIT_STRATEGY: none @@ -415,6 +487,7 @@ publish-s3-release: &publish-s3 publish-rustdoc: stage: publish <<: *kubernetes-env + <<: *vault-secrets image: paritytech/tools:latest variables: GIT_DEPTH: 100 @@ -504,4 +577,4 @@ simnet-tests: allow_failure: true retry: 2 tags: - - parity-simnet + - polkadot-simnet diff --git a/Cargo.lock b/Cargo.lock index b2ec0aa33dd6..da471c464f6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,20 +14,11 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" -dependencies = [ - "gimli 0.23.0", -] - -[[package]] -name = "addr2line" -version = "0.15.1" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03345e98af8f3d786b6d9f656ccfa6ac316d954e92bc4841f0bba20789d5fb5a" +checksum = "3e61f2b7f93d2c7d2b08263acaa4a363b3e276806c68af6134c44f523bf1aacd" dependencies = [ - "gimli 0.24.0", + "gimli", ] [[package]] @@ -290,9 +281,9 @@ dependencies = [ [[package]] name = "async-std" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f06685bad74e0570f5213741bea82158279a4103d988e57bfada11ad230341" +checksum = "f8056f1455169ab86dd47b47391e4ab0cbd25410a70e9fe675544f49bafaf952" dependencies = [ "async-attributes", "async-channel", @@ -408,15 +399,16 @@ checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" [[package]] name = "backtrace" -version = "0.3.56" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc" +checksum = "e7a905d892734eea339e896738c14b9afce22b5318f64b951e70bf3844419b01" dependencies = [ - "addr2line 0.14.1", + "addr2line", + "cc", "cfg-if 1.0.0", "libc", "miniz_oxide", - "object 0.23.0", + "object", "rustc-demangle", ] @@ -468,13 +460,12 @@ dependencies = [ [[package]] name = "beefy-gadget" -version = "0.1.0" -source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#8b04f0ecbd97cfe0199dba444264baafb6d35eca" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "beefy-primitives", "fnv", "futures 0.3.17", - "hex", "log", "parity-scale-codec", "parking_lot 0.11.1", @@ -487,7 +478,6 @@ dependencies = [ "sp-application-crypto", "sp-arithmetic", "sp-blockchain", - "sp-consensus", "sp-core", "sp-keystore", "sp-runtime", @@ -498,8 +488,8 @@ dependencies = [ [[package]] name = "beefy-gadget-rpc" -version = "0.1.0" -source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#8b04f0ecbd97cfe0199dba444264baafb6d35eca" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "beefy-gadget", "beefy-primitives", @@ -512,22 +502,22 @@ dependencies = [ "parity-scale-codec", "sc-rpc", "serde", - "serde_json", "sp-core", "sp-runtime", ] [[package]] name = "beefy-merkle-tree" -version = "0.1.0" -source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#8b04f0ecbd97cfe0199dba444264baafb6d35eca" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" [[package]] name = "beefy-primitives" -version = "0.1.0" -source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#8b04f0ecbd97cfe0199dba444264baafb6d35eca" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", + "scale-info", "sp-api", "sp-application-crypto", "sp-core", @@ -723,6 +713,7 @@ dependencies = [ "finality-grandpa", "frame-support", "parity-scale-codec", + "scale-info", "serde", "sp-core", "sp-finality-grandpa", @@ -737,6 +728,7 @@ dependencies = [ "bp-runtime", "frame-support", "parity-scale-codec", + "scale-info", "sp-std", ] @@ -750,6 +742,7 @@ dependencies = [ "frame-system", "impl-trait-for-tuples", "parity-scale-codec", + "scale-info", "serde", "sp-std", ] @@ -764,6 +757,7 @@ dependencies = [ "frame-system", "hex", "parity-scale-codec", + "scale-info", "sp-api", "sp-core", "sp-runtime", @@ -809,6 +803,7 @@ dependencies = [ "hash-db", "num-traits", "parity-scale-codec", + "scale-info", "sp-core", "sp-io", "sp-runtime", @@ -860,6 +855,7 @@ dependencies = [ "pallet-bridge-messages", "pallet-transaction-payment", "parity-scale-codec", + "scale-info", "sp-core", "sp-runtime", "sp-state-machine", @@ -1013,9 +1009,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chacha20" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8756167ea0aca10e066cdbe7813bd71d2f24e69b0bc7b50509590cef2ce0b9" +checksum = "fee7ad89dc1128635074c268ee661f90c3f7e83d9fd12910608c36b47d6c3412" dependencies = [ "cfg-if 1.0.0", "cipher", @@ -1025,9 +1021,9 @@ dependencies = [ [[package]] name = "chacha20poly1305" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175a11316f33592cf2b71416ee65283730b5b7849813c4891d02a12906ed9acc" +checksum = "1580317203210c517b6d44794abfbe600698276db18127e37ad3e69bf5e848e5" dependencies = [ "aead", "chacha20", @@ -1199,24 +1195,24 @@ checksum = "6d375c433320f6c5057ae04a04376eef4d04ce2801448cf8863a78da99107be4" [[package]] name = "cranelift-bforest" -version = "0.74.0" +version = "0.76.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ca3560686e7c9c7ed7e0fe77469f2410ba5d7781b1acaa9adc8d8deea28e3e" +checksum = "7e6bea67967505247f54fa2c85cf4f6e0e31c4e5692c9b70e4ae58e339067333" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.74.0" +version = "0.76.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf9bf1ffffb6ce3d2e5ebc83549bd2436426c99b31cc550d521364cbe35d276" +checksum = "48194035d2752bdd5bdae429e3ab88676e95f52a2b1355a5d4e809f9e39b1d74" dependencies = [ "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.24.0", + "gimli", "log", "regalloc", "serde", @@ -1226,9 +1222,9 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.74.0" +version = "0.76.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cc21936a5a6d07e23849ffe83e5c1f6f50305c074f4b2970ca50c13bf55b821" +checksum = "976efb22fcab4f2cd6bd4e9913764616a54d895c1a23530128d04e03633c555f" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -1236,27 +1232,27 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.74.0" +version = "0.76.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5b6ffaa87560bebe69a5446449da18090b126037920b0c1c6d5945f72faf6b" +checksum = "9dabb5fe66e04d4652e434195b45ae65b5c8172d520247b8f66d8df42b2b45dc" dependencies = [ "serde", ] [[package]] name = "cranelift-entity" -version = "0.74.0" +version = "0.76.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d6b4a8bef04f82e4296782646f733c641d09497df2fabf791323fefaa44c64c" +checksum = "3329733e4d4b8e91c809efcaa4faee80bf66f20164e3dd16d707346bd3494799" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.74.0" +version = "0.76.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" +checksum = "279afcc0d3e651b773f94837c3d581177b348c8d69e928104b2e9fccb226f921" dependencies = [ "cranelift-codegen", "log", @@ -1266,19 +1262,20 @@ dependencies = [ [[package]] name = "cranelift-native" -version = "0.74.0" +version = "0.76.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c88d3dd48021ff1e37e978a00098524abd3513444ae252c08d37b310b3d2a" +checksum = "4c04d1fe6a5abb5bb0edc78baa8ef238370fb8e389cc88b6d153f7c3e9680425" dependencies = [ "cranelift-codegen", + "libc", "target-lexicon", ] [[package]] name = "cranelift-wasm" -version = "0.74.0" +version = "0.76.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb6d408e2da77cdbbd65466298d44c86ae71c1785d2ab0d8657753cdb4d9d89" +checksum = "e0d260ad44f6fd2c91f7f5097191a2a9e3edcbb36df1fb787b600dad5ea148ec" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1867,9 +1864,9 @@ dependencies = [ [[package]] name = "finality-grandpa" -version = "0.14.1" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74a1bfdcc776e63e49f741c7ce6116fa1b887e8ac2e3ccb14dd4aa113e54feb9" +checksum = "e8ac3ff5224ef91f3c97e03eb1de2db82743427e91aaa5ac635f454f0b164f5a" dependencies = [ "either", "futures 0.3.17", @@ -1878,6 +1875,7 @@ dependencies = [ "num-traits", "parity-scale-codec", "parking_lot 0.11.1", + "scale-info", ] [[package]] @@ -1920,7 +1918,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", ] @@ -1938,14 +1936,15 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", "linregress", "log", "parity-scale-codec", - "paste 1.0.5", + "paste", + "scale-info", "sp-api", "sp-io", "sp-runtime", @@ -1957,7 +1956,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "Inflector", "chrono", @@ -1983,11 +1982,12 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-arithmetic", "sp-npos-elections", "sp-std", @@ -1996,11 +1996,12 @@ dependencies = [ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-core", "sp-io", "sp-runtime", @@ -2010,19 +2011,20 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "14.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +version = "14.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96616f82e069102b95a72c87de4c84d2f87ef7f0f20630e78ce3824436483110" dependencies = [ + "cfg-if 1.0.0", "parity-scale-codec", + "scale-info", "serde", - "sp-core", - "sp-std", ] [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "bitflags", "frame-metadata", @@ -2031,7 +2033,8 @@ dependencies = [ "log", "once_cell", "parity-scale-codec", - "paste 1.0.5", + "paste", + "scale-info", "serde", "smallvec", "sp-arithmetic", @@ -2048,7 +2051,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "Inflector", "frame-support-procedural-tools", @@ -2060,10 +2063,10 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support-procedural-tools-derive", - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -2072,7 +2075,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "proc-macro2", "quote", @@ -2082,42 +2085,46 @@ dependencies = [ [[package]] name = "frame-support-test" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ - "frame-metadata", "frame-support", "frame-support-test-pallet", "frame-system", "parity-scale-codec", "pretty_assertions", "rustversion", + "scale-info", "serde", + "sp-arithmetic", "sp-core", "sp-io", "sp-runtime", "sp-state-machine", "sp-std", + "sp-version", "trybuild", ] [[package]] name = "frame-support-test-pallet" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", + "scale-info", ] [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "log", "parity-scale-codec", + "scale-info", "serde", "sp-core", "sp-io", @@ -2129,12 +2136,13 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-core", "sp-runtime", "sp-std", @@ -2143,7 +2151,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", "sp-api", @@ -2152,7 +2160,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "sp-api", @@ -2194,12 +2202,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f2a4a2034423744d2cc7ca2068453168dcdb82c438419e639a26bd87839c674" -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -2368,6 +2370,22 @@ version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" +[[package]] +name = "generate-bags" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" +dependencies = [ + "chrono", + "frame-election-provider-support", + "frame-support", + "frame-system", + "git2", + "num-format", + "pallet-staking", + "sp-io", + "structopt", +] + [[package]] name = "generator" version = "0.6.23" @@ -2434,21 +2452,28 @@ dependencies = [ [[package]] name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - -[[package]] -name = "gimli" -version = "0.24.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" +checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] +[[package]] +name = "git2" +version = "0.13.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c1cbbfc9a1996c6af82c2b4caf828d2c653af4fcdbb0e5674cc966eee5a4197" +dependencies = [ + "bitflags", + "libc", + "libgit2-sys", + "log", + "url 2.2.0", +] + [[package]] name = "glob" version = "0.3.0" @@ -2876,38 +2901,6 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" -[[package]] -name = "jemalloc-ctl" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c502a5ff9dd2924f1ed32ba96e3b65735d837b4bfd978d3161b1702e66aca4b7" -dependencies = [ - "jemalloc-sys", - "libc", - "paste 0.1.18", -] - -[[package]] -name = "jemalloc-sys" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d3b9f3f5c9b31aa0f5ed3260385ac205db665baa41d49bb8338008ae94ede45" -dependencies = [ - "cc", - "fs_extra", - "libc", -] - -[[package]] -name = "jemallocator" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43ae63fcfc45e99ab3d1b29a46782ad679e98436c3169d15a167a1108a724b69" -dependencies = [ - "jemalloc-sys", - "libc", -] - [[package]] name = "jobserver" version = "0.1.21" @@ -3066,7 +3059,7 @@ checksum = "f37924e16300e249a52a22cabb5632f846dc9760b39355f5e8bc70cd23dc6300" dependencies = [ "Inflector", "bae", - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -3074,9 +3067,9 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d67724d368c59e08b557a516cf8fcc51100e7a708850f502e1044b151fe89788" +checksum = "4cc738fd55b676ada3271ef7c383a14a0867a2a88b0fa941311bf5fc0a29d498" dependencies = [ "async-trait", "beef", @@ -3092,9 +3085,9 @@ dependencies = [ [[package]] name = "jsonrpsee-ws-client" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2834b6e7f57ce9a4412ed4d6dc95125d2c8612e68f86b9d9a07369164e4198" +checksum = "9841352dbecf4c2ed5dc71698df9f1660262ae4e0b610e968602529bdbcf7b30" dependencies = [ "async-trait", "fnv", @@ -3132,7 +3125,7 @@ dependencies = [ [[package]] name = "kusama-runtime" -version = "0.9.9" +version = "0.9.11" dependencies = [ "beefy-primitives", "bitvec 0.20.1", @@ -3149,6 +3142,7 @@ dependencies = [ "pallet-authority-discovery", "pallet-authorship", "pallet-babe", + "pallet-bags-list", "pallet-balances", "pallet-bounties", "pallet-collective", @@ -3187,6 +3181,7 @@ dependencies = [ "polkadot-runtime-common", "polkadot-runtime-parachains", "rustc-hex", + "scale-info", "separator", "serde", "serde_derive", @@ -3280,9 +3275,21 @@ checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" [[package]] name = "libc" -version = "0.2.101" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21" +checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6" + +[[package]] +name = "libgit2-sys" +version = "0.12.23+1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29730a445bae719db3107078b46808cc45a5b7a6bae3f31272923af969453356" +dependencies = [ + "cc", + "libc", + "libz-sys", + "pkg-config", +] [[package]] name = "libloading" @@ -3766,9 +3773,9 @@ dependencies = [ "base64 0.12.3", "digest 0.9.0", "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", + "libsecp256k1-core 0.2.2", + "libsecp256k1-gen-ecmult 0.2.1", + "libsecp256k1-gen-genmult 0.2.1", "rand 0.7.3", "serde", "sha2 0.9.2", @@ -3785,15 +3792,34 @@ dependencies = [ "base64 0.12.3", "digest 0.9.0", "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", + "libsecp256k1-core 0.2.2", + "libsecp256k1-gen-ecmult 0.2.1", + "libsecp256k1-gen-genmult 0.2.1", "rand 0.7.3", "serde", "sha2 0.9.2", "typenum", ] +[[package]] +name = "libsecp256k1" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0452aac8bab02242429380e9b2f94ea20cea2b37e2c1777a1358799bbe97f37" +dependencies = [ + "arrayref", + "base64 0.13.0", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core 0.3.0", + "libsecp256k1-gen-ecmult 0.3.0", + "libsecp256k1-gen-genmult 0.3.0", + "rand 0.8.4", + "serde", + "sha2 0.9.2", + "typenum", +] + [[package]] name = "libsecp256k1-core" version = "0.2.2" @@ -3805,13 +3831,33 @@ dependencies = [ "subtle 2.4.1", ] +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle 2.4.1", +] + [[package]] name = "libsecp256k1-gen-ecmult" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" dependencies = [ - "libsecp256k1-core", + "libsecp256k1-core 0.2.2", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core 0.3.0", ] [[package]] @@ -3820,14 +3866,23 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" dependencies = [ - "libsecp256k1-core", + "libsecp256k1-core 0.2.2", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core 0.3.0", ] [[package]] name = "libz-sys" -version = "1.0.25" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" +checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" dependencies = [ "cc", "libc", @@ -3992,9 +4047,9 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" -version = "2.3.3" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "memmap2" @@ -4063,11 +4118,16 @@ dependencies = [ [[package]] name = "metered-channel" -version = "0.9.9" +version = "0.9.11" dependencies = [ + "assert_matches", "derive_more", + "env_logger 0.9.0", "futures 0.3.17", "futures-timer 3.0.2", + "log", + "thiserror", + "tracing", ] [[package]] @@ -4246,7 +4306,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "424f6e86263cd5294cbd7f1e95746b95aca0e0d66bff31e5a40d6baa87b4aa99" dependencies = [ - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro-error 1.0.4", "proc-macro2", "quote", @@ -4305,11 +4365,11 @@ dependencies = [ [[package]] name = "names" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" +checksum = "10a8690bf09abf659851e58cd666c3d37ac6af07c2bd7a9e332cfba471715775" dependencies = [ - "rand 0.3.23", + "rand 0.8.4", ] [[package]] @@ -4335,9 +4395,9 @@ dependencies = [ [[package]] name = "nix" -version = "0.19.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ccba0cfe4fdf15982d1674c69b1fd80bad427d293849982668dfe454bd61f2" +checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a" dependencies = [ "bitflags", "cc", @@ -4359,9 +4419,9 @@ checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] name = "nom" -version = "6.2.1" +version = "6.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c5c51b9083a3c620fa67a2a635d1ce7d95b897e957d6b28ff9a5da960a103a6" +checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2" dependencies = [ "bitvec 0.19.5", "funty", @@ -4398,6 +4458,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-format" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafe4179722c2894288ee77a9f044f02811c86af699344c498b0840c698a2465" +dependencies = [ + "arrayvec 0.4.12", + "itoa", +] + [[package]] name = "num-integer" version = "0.1.43" @@ -4453,18 +4523,13 @@ dependencies = [ [[package]] name = "object" -version = "0.23.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" - -[[package]] -name = "object" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" +checksum = "39f37e50073ccad23b6d09bcb5b263f4e76d3bb6038e4a3c08e52162ffa8abc2" dependencies = [ "crc32fast", "indexmap", + "memchr", ] [[package]] @@ -4527,15 +4592,30 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13370dae44474229701bb69b90b4f4dca6404cb0357a2d50d635f1171dc3aa7b" +[[package]] +name = "pallet-assets" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", "pallet-session", "parity-scale-codec", + "scale-info", "sp-application-crypto", "sp-authority-discovery", "sp-runtime", @@ -4545,12 +4625,13 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", "impl-trait-for-tuples", "parity-scale-codec", + "scale-info", "sp-authorship", "sp-runtime", "sp-std", @@ -4559,7 +4640,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", @@ -4569,6 +4650,7 @@ dependencies = [ "pallet-session", "pallet-timestamp", "parity-scale-codec", + "scale-info", "sp-application-crypto", "sp-consensus-babe", "sp-consensus-vrf", @@ -4579,24 +4661,45 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-bags-list" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-tracing", +] + [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", "parity-scale-codec", + "scale-info", "sp-runtime", "sp-std", ] [[package]] name = "pallet-beefy" -version = "0.1.0" -source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#8b04f0ecbd97cfe0199dba444264baafb6d35eca" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "beefy-primitives", "frame-support", @@ -4611,15 +4714,15 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" -version = "0.1.0" -source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#8b04f0ecbd97cfe0199dba444264baafb6d35eca" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "beefy-merkle-tree", "beefy-primitives", "frame-support", "frame-system", "hex", - "libsecp256k1 0.6.0", + "libsecp256k1 0.7.0", "log", "pallet-beefy", "pallet-mmr", @@ -4637,13 +4740,17 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "log", "pallet-treasury", "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", "sp-runtime", "sp-std", ] @@ -4658,6 +4765,7 @@ dependencies = [ "frame-system", "log", "parity-scale-codec", + "scale-info", "serde", "sp-core", "sp-io", @@ -4679,6 +4787,7 @@ dependencies = [ "log", "num-traits", "parity-scale-codec", + "scale-info", "serde", "sp-finality-grandpa", "sp-io", @@ -4705,6 +4814,7 @@ dependencies = [ "num-traits", "pallet-balances", "parity-scale-codec", + "scale-info", "serde", "sp-core", "sp-io", @@ -4715,13 +4825,14 @@ dependencies = [ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", "parity-scale-codec", + "scale-info", "sp-core", "sp-io", "sp-runtime", @@ -4731,12 +4842,13 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "serde", "sp-io", "sp-runtime", @@ -4746,7 +4858,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4755,6 +4867,7 @@ dependencies = [ "log", "parity-scale-codec", "rand 0.7.3", + "scale-info", "sp-arithmetic", "sp-core", "sp-io", @@ -4769,13 +4882,14 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", "parity-scale-codec", + "scale-info", "sp-core", "sp-io", "sp-npos-elections", @@ -4786,12 +4900,13 @@ dependencies = [ [[package]] name = "pallet-gilt" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-arithmetic", "sp-runtime", "sp-std", @@ -4800,7 +4915,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", @@ -4809,6 +4924,7 @@ dependencies = [ "pallet-authorship", "pallet-session", "parity-scale-codec", + "scale-info", "sp-application-crypto", "sp-core", "sp-finality-grandpa", @@ -4822,13 +4938,14 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "enumflags2", "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-io", "sp-runtime", "sp-std", @@ -4837,7 +4954,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", @@ -4845,6 +4962,7 @@ dependencies = [ "log", "pallet-authorship", "parity-scale-codec", + "scale-info", "sp-application-crypto", "sp-core", "sp-io", @@ -4856,12 +4974,13 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-core", "sp-io", "sp-keyring", @@ -4872,13 +4991,15 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", "parity-scale-codec", + "scale-info", + "sp-core", "sp-io", "sp-runtime", "sp-std", @@ -4887,7 +5008,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "ckb-merkle-mountain-range", "frame-benchmarking", @@ -4895,6 +5016,7 @@ dependencies = [ "frame-system", "pallet-mmr-primitives", "parity-scale-codec", + "scale-info", "sp-core", "sp-io", "sp-runtime", @@ -4904,7 +5026,7 @@ dependencies = [ [[package]] name = "pallet-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", @@ -4920,7 +5042,7 @@ dependencies = [ [[package]] name = "pallet-mmr-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4937,12 +5059,13 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-io", "sp-runtime", "sp-std", @@ -4951,11 +5074,12 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-io", "sp-runtime", "sp-std", @@ -4964,13 +5088,14 @@ dependencies = [ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", "log", "pallet-balances", "parity-scale-codec", + "scale-info", "serde", "sp-runtime", "sp-staking", @@ -4980,7 +5105,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4994,6 +5119,7 @@ dependencies = [ "pallet-session", "pallet-staking", "parity-scale-codec", + "scale-info", "sp-runtime", "sp-staking", "sp-std", @@ -5002,12 +5128,13 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-io", "sp-runtime", "sp-std", @@ -5016,11 +5143,12 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-io", "sp-runtime", "sp-std", @@ -5029,13 +5157,14 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", "parity-scale-codec", + "scale-info", "sp-io", "sp-runtime", "sp-std", @@ -5044,7 +5173,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", @@ -5052,6 +5181,7 @@ dependencies = [ "log", "pallet-timestamp", "parity-scale-codec", + "scale-info", "sp-core", "sp-io", "sp-runtime", @@ -5064,7 +5194,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", @@ -5080,12 +5210,13 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", "rand_chacha 0.2.2", + "scale-info", "sp-runtime", "sp-std", ] @@ -5093,7 +5224,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5104,6 +5235,7 @@ dependencies = [ "pallet-session", "parity-scale-codec", "rand_chacha 0.2.2", + "scale-info", "serde", "sp-application-crypto", "sp-io", @@ -5115,9 +5247,9 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -5126,7 +5258,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "log", "sp-arithmetic", @@ -5135,11 +5267,12 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-io", "sp-runtime", "sp-std", @@ -5148,13 +5281,14 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", "parity-scale-codec", + "scale-info", "sp-inherents", "sp-io", "sp-runtime", @@ -5165,14 +5299,18 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "log", "pallet-treasury", "parity-scale-codec", + "scale-info", "serde", + "sp-core", + "sp-io", "sp-runtime", "sp-std", ] @@ -5180,11 +5318,12 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "serde", "smallvec", "sp-core", @@ -5196,7 +5335,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -5213,7 +5352,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5224,7 +5363,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", @@ -5232,6 +5371,7 @@ dependencies = [ "impl-trait-for-tuples", "pallet-balances", "parity-scale-codec", + "scale-info", "serde", "sp-runtime", "sp-std", @@ -5240,12 +5380,13 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-core", "sp-io", "sp-runtime", @@ -5255,20 +5396,21 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", "parity-scale-codec", + "scale-info", "sp-runtime", "sp-std", ] [[package]] name = "pallet-xcm" -version = "0.9.9" +version = "0.9.11" dependencies = [ "frame-support", "frame-system", @@ -5277,6 +5419,7 @@ dependencies = [ "parity-scale-codec", "polkadot-parachain", "polkadot-runtime-parachains", + "scale-info", "serde", "sp-core", "sp-io", @@ -5287,6 +5430,31 @@ dependencies = [ "xcm-executor", ] +[[package]] +name = "pallet-xcm-benchmarks" +version = "0.9.8" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-assets", + "pallet-balances", + "pallet-xcm", + "parity-scale-codec", + "polkadot-primitives", + "polkadot-runtime-common", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-tracing", + "xcm", + "xcm-builder", + "xcm-executor", +] + [[package]] name = "parity-db" version = "0.3.1" @@ -5308,9 +5476,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8975095a2a03bbbdc70a74ab11a4f76a6d0b84680d87c68d722531b0ac28e8a9" +checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" dependencies = [ "arrayvec 0.7.0", "bitvec 0.20.1", @@ -5322,11 +5490,11 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40dbbfef7f0a1143c5b06e0d76a6278e25dac0bc1af4be51a0fbb73f07e7ad09" +checksum = "1557010476e0595c9b568d16dcfb81b93cdeb157612726f5170d31aa707bed27" dependencies = [ - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -5354,20 +5522,21 @@ dependencies = [ [[package]] name = "parity-util-mem" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad6f1acec69b95caf435bbd158d486e5a0a44fcf51531e84922c59ff09e8457" +checksum = "6f4cb4e169446179cbc6b8b6320cc9fca49bd2e94e8db25f25f200a8ea774770" dependencies = [ "cfg-if 1.0.0", "ethereum-types", "hashbrown", "impl-trait-for-tuples", - "jemallocator", "lru", "parity-util-mem-derive", "parking_lot 0.11.1", "primitive-types", "smallvec", + "tikv-jemalloc-ctl", + "tikv-jemallocator", "winapi 0.3.9", ] @@ -5471,31 +5640,12 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "paste" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880" -dependencies = [ - "paste-impl", - "proc-macro-hack", -] - [[package]] name = "paste" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" -[[package]] -name = "paste-impl" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6" -dependencies = [ - "proc-macro-hack", -] - [[package]] name = "pbkdf2" version = "0.3.0" @@ -5658,7 +5808,7 @@ checksum = "989d43012e2ca1c4a02507c67282691a0a3207f9dc67cec596b43fe925b3d325" [[package]] name = "polkadot" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_cmd", "color-eyre", @@ -5670,7 +5820,7 @@ dependencies = [ [[package]] name = "polkadot-approval-distribution" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "env_logger 0.9.0", @@ -5690,7 +5840,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "bitvec 0.20.1", @@ -5711,7 +5861,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "derive_more", @@ -5738,7 +5888,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "env_logger 0.9.0", @@ -5765,7 +5915,7 @@ dependencies = [ [[package]] name = "polkadot-cli" -version = "0.9.9" +version = "0.9.11" dependencies = [ "frame-benchmarking-cli", "futures 0.3.17", @@ -5784,7 +5934,7 @@ dependencies = [ [[package]] name = "polkadot-client" -version = "0.9.9" +version = "0.9.11" dependencies = [ "beefy-primitives", "frame-benchmarking", @@ -5816,7 +5966,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" -version = "0.9.9" +version = "0.9.11" dependencies = [ "always-assert", "assert_matches", @@ -5843,10 +5993,11 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" -version = "0.9.9" +version = "0.9.11" dependencies = [ "parity-scale-codec", "parity-util-mem", + "scale-info", "sp-core", "sp-runtime", "sp-std", @@ -5854,7 +6005,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "async-trait", @@ -5883,7 +6034,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.9.9" +version = "0.9.11" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -5896,10 +6047,13 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", + "async-trait", "futures 0.3.17", + "futures-timer 3.0.2", + "lazy_static", "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", @@ -5907,17 +6061,19 @@ dependencies = [ "polkadot-primitives", "rand 0.8.4", "rand_chacha 0.3.1", + "sc-network", "sp-application-crypto", "sp-consensus-babe", "sp-core", "sp-keyring", "sp-keystore", + "sp-tracing", "tracing", ] [[package]] name = "polkadot-network-bridge" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "async-trait", @@ -5940,7 +6096,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" -version = "0.9.9" +version = "0.9.11" dependencies = [ "futures 0.3.17", "parity-scale-codec", @@ -5958,7 +6114,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "bitvec 0.20.1", @@ -5994,7 +6150,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "bitvec 0.20.1", @@ -6021,7 +6177,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "bitvec 0.20.1", @@ -6045,7 +6201,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" -version = "0.9.9" +version = "0.9.11" dependencies = [ "futures 0.3.17", "polkadot-node-subsystem", @@ -6060,7 +6216,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "async-trait", @@ -6081,7 +6237,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" -version = "0.9.9" +version = "0.9.11" dependencies = [ "futures 0.3.17", "maplit", @@ -6100,7 +6256,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "futures 0.3.17", @@ -6121,7 +6277,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "bitvec 0.20.1", @@ -6145,7 +6301,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-participation" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "futures 0.3.17", @@ -6161,7 +6317,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" -version = "0.9.9" +version = "0.9.11" dependencies = [ "async-trait", "futures 0.3.17", @@ -6177,7 +6333,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" -version = "0.9.9" +version = "0.9.11" dependencies = [ "bitvec 0.20.1", "futures 0.3.17", @@ -6194,7 +6350,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" -version = "0.9.9" +version = "0.9.11" dependencies = [ "always-assert", "assert_matches", @@ -6228,7 +6384,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" -version = "0.9.9" +version = "0.9.11" dependencies = [ "futures 0.3.17", "memory-lru", @@ -6247,7 +6403,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" -version = "0.9.9" +version = "0.9.11" dependencies = [ "async-std", "lazy_static", @@ -6264,18 +6420,17 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" -version = "0.9.9" +version = "0.9.11" dependencies = [ "futures 0.3.17", "futures-timer 3.0.2", - "jemalloc-ctl", "metered-channel", "substrate-prometheus-endpoint", ] [[package]] name = "polkadot-node-network-protocol" -version = "0.9.9" +version = "0.9.11" dependencies = [ "async-trait", "derive_more", @@ -6292,7 +6447,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" -version = "0.9.9" +version = "0.9.11" dependencies = [ "bounded-vec", "futures 0.3.17", @@ -6314,7 +6469,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" -version = "0.9.9" +version = "0.9.11" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -6323,7 +6478,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" -version = "0.9.9" +version = "0.9.11" dependencies = [ "async-trait", "futures 0.3.17", @@ -6341,7 +6496,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" -version = "0.9.9" +version = "0.9.11" dependencies = [ "derive_more", "futures 0.3.17", @@ -6359,7 +6514,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "async-trait", @@ -6389,7 +6544,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "femme", @@ -6397,12 +6552,12 @@ dependencies = [ "futures-timer 3.0.2", "lru", "metered-channel", + "parity-util-mem", "parking_lot 0.11.1", "polkadot-node-metrics", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem-types", - "polkadot-overseer-all-subsystems-gen", "polkadot-overseer-gen", "polkadot-primitives", "sc-client-api", @@ -6411,19 +6566,9 @@ dependencies = [ "tracing", ] -[[package]] -name = "polkadot-overseer-all-subsystems-gen" -version = "0.9.9" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "trybuild", -] - [[package]] name = "polkadot-overseer-gen" -version = "0.9.9" +version = "0.9.11" dependencies = [ "async-trait", "futures 0.3.17", @@ -6440,10 +6585,10 @@ dependencies = [ [[package]] name = "polkadot-overseer-gen-proc-macro" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -6451,13 +6596,14 @@ dependencies = [ [[package]] name = "polkadot-parachain" -version = "0.9.9" +version = "0.9.11" dependencies = [ "derive_more", "frame-support", "parity-scale-codec", "parity-util-mem", "polkadot-core-primitives", + "scale-info", "serde", "sp-core", "sp-runtime", @@ -6466,7 +6612,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.9.9" +version = "0.9.11" dependencies = [ "bitvec 0.20.1", "frame-system", @@ -6475,6 +6621,7 @@ dependencies = [ "parity-util-mem", "polkadot-core-primitives", "polkadot-parachain", + "scale-info", "serde", "sp-api", "sp-application-crypto", @@ -6494,7 +6641,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.9.9" +version = "0.9.11" dependencies = [ "beefy-gadget", "beefy-gadget-rpc", @@ -6524,7 +6671,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.9.9" +version = "0.9.11" dependencies = [ "beefy-primitives", "bitvec 0.20.1", @@ -6573,7 +6720,9 @@ dependencies = [ "parity-scale-codec", "polkadot-primitives", "polkadot-runtime-common", + "polkadot-runtime-parachains", "rustc-hex", + "scale-info", "separator", "serde", "serde_derive", @@ -6604,19 +6753,22 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.9.9" +version = "0.9.11" dependencies = [ + "beefy-primitives", "bitvec 0.20.1", "frame-benchmarking", + "frame-election-provider-support", "frame-support", "frame-support-test", "frame-system", "hex-literal", "impl-trait-for-tuples", - "libsecp256k1 0.6.0", + "libsecp256k1 0.7.0", "log", "pallet-authorship", "pallet-babe", + "pallet-bags-list", "pallet-balances", "pallet-beefy-mmr", "pallet-election-provider-multi-phase", @@ -6630,6 +6782,7 @@ dependencies = [ "polkadot-primitives", "polkadot-runtime-parachains", "rustc-hex", + "scale-info", "serde", "serde_derive", "serde_json", @@ -6639,6 +6792,7 @@ dependencies = [ "sp-inherents", "sp-io", "sp-keystore", + "sp-npos-elections", "sp-runtime", "sp-session", "sp-staking", @@ -6649,7 +6803,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" -version = "0.9.9" +version = "0.9.11" dependencies = [ "bitflags", "bitvec 0.20.1", @@ -6674,6 +6828,7 @@ dependencies = [ "rand_chacha 0.3.1", "rustc-hex", "sc-keystore", + "scale-info", "serde", "sp-api", "sp-core", @@ -6691,7 +6846,7 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "async-trait", @@ -6705,6 +6860,7 @@ dependencies = [ "kvdb", "kvdb-rocksdb", "log", + "lru", "pallet-babe", "pallet-im-online", "pallet-mmr-primitives", @@ -6792,7 +6948,7 @@ dependencies = [ [[package]] name = "polkadot-simnet" -version = "0.9.9" +version = "0.9.11" dependencies = [ "frame-benchmarking", "frame-support", @@ -6824,14 +6980,14 @@ dependencies = [ [[package]] name = "polkadot-simnet-node" -version = "0.9.9" +version = "0.9.11" dependencies = [ "polkadot-simnet", ] [[package]] name = "polkadot-simnet-test" -version = "0.9.9" +version = "0.9.11" dependencies = [ "frame-system", "pallet-balances", @@ -6845,7 +7001,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" -version = "0.9.9" +version = "0.9.11" dependencies = [ "arrayvec 0.5.2", "assert_matches", @@ -6874,7 +7030,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "0.9.9" +version = "0.9.11" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -6883,7 +7039,7 @@ dependencies = [ [[package]] name = "polkadot-test-client" -version = "0.9.9" +version = "0.9.11" dependencies = [ "futures 0.3.17", "parity-scale-codec", @@ -6909,23 +7065,26 @@ dependencies = [ [[package]] name = "polkadot-test-malus" -version = "0.9.9" +version = "0.9.11" dependencies = [ "assert_matches", "async-trait", "color-eyre", + "futures 0.3.17", "parity-util-mem", "polkadot-cli", "polkadot-node-core-candidate-validation", "polkadot-node-core-pvf", "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", "polkadot-node-subsystem-util", + "sp-core", "structopt", ] [[package]] name = "polkadot-test-runtime" -version = "0.9.9" +version = "0.9.11" dependencies = [ "beefy-primitives", "bitvec 0.20.1", @@ -6960,6 +7119,7 @@ dependencies = [ "polkadot-runtime-common", "polkadot-runtime-parachains", "rustc-hex", + "scale-info", "serde", "serde_derive", "serde_json", @@ -6989,7 +7149,7 @@ dependencies = [ [[package]] name = "polkadot-test-service" -version = "0.9.9" +version = "0.9.11" dependencies = [ "frame-benchmarking", "frame-system", @@ -7041,6 +7201,18 @@ dependencies = [ "tracing", ] +[[package]] +name = "polkadot-voter-bags" +version = "0.9.0" +dependencies = [ + "generate-bags", + "kusama-runtime", + "polkadot-runtime", + "sp-io", + "structopt", + "westend-runtime", +] + [[package]] name = "polling" version = "2.0.2" @@ -7131,6 +7303,7 @@ dependencies = [ "impl-codec", "impl-rlp", "impl-serde", + "scale-info", "uint", ] @@ -7145,9 +7318,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fdbd1df62156fbc5945f4762632564d7d038153091c3fcf1067f6aef7cff92" +checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" dependencies = [ "thiserror", "toml", @@ -7217,9 +7390,9 @@ checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a" [[package]] name = "proc-macro2" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" +checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" dependencies = [ "unicode-xid", ] @@ -7334,9 +7507,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" dependencies = [ "proc-macro2", ] @@ -7353,29 +7526,6 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" -[[package]] -name = "rand" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" -dependencies = [ - "libc", - "rand 0.4.6", -] - -[[package]] -name = "rand" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" -dependencies = [ - "fuchsia-cprng", - "libc", - "rand_core 0.3.1", - "rdrand", - "winapi 0.3.9", -] - [[package]] name = "rand" version = "0.7.3" @@ -7422,21 +7572,6 @@ dependencies = [ "rand_core 0.6.1", ] -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - [[package]] name = "rand_core" version = "0.5.1" @@ -7523,15 +7658,6 @@ dependencies = [ "num_cpus", ] -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - [[package]] name = "redox_syscall" version = "0.1.56" @@ -7642,10 +7768,32 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "remote-ext-tests-bags-list" +version = "0.9.11" +dependencies = [ + "frame-election-provider-support", + "frame-support", + "kusama-runtime", + "log", + "pallet-bags-list", + "pallet-election-provider-multi-phase", + "pallet-staking", + "polkadot-runtime", + "remote-externalities", + "sp-core", + "sp-runtime", + "sp-std", + "sp-storage", + "sp-tracing", + "structopt", + "tokio", +] + [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "env_logger 0.9.0", "jsonrpsee-proc-macros", @@ -7722,7 +7870,7 @@ dependencies = [ [[package]] name = "rococo-runtime" -version = "0.9.9" +version = "0.9.11" dependencies = [ "beefy-primitives", "bp-messages", @@ -7730,10 +7878,12 @@ dependencies = [ "bp-runtime", "bp-wococo", "bridge-runtime-common", + "frame-benchmarking", "frame-executive", "frame-support", "frame-system", "frame-system-rpc-runtime-api", + "hex-literal", "log", "pallet-authority-discovery", "pallet-authorship", @@ -7751,6 +7901,7 @@ dependencies = [ "pallet-membership", "pallet-mmr", "pallet-mmr-primitives", + "pallet-multisig", "pallet-offences", "pallet-proxy", "pallet-session", @@ -7766,6 +7917,7 @@ dependencies = [ "polkadot-primitives", "polkadot-runtime-common", "polkadot-runtime-parachains", + "scale-info", "serde", "serde_derive", "smallvec", @@ -7866,16 +8018,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb5d2a036dc6d2d8fd16fde3498b04306e29bd193bf306a57427019b823d5acd" -[[package]] -name = "ruzstd" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d425143485a37727c7a46e689bbe3b883a00f42b4a52c4ac0f44855c1009b00" -dependencies = [ - "byteorder", - "twox-hash", -] - [[package]] name = "rw-stream-sink" version = "0.2.1" @@ -7914,7 +8056,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "log", "sp-core", @@ -7925,7 +8067,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "derive_more", @@ -7952,7 +8094,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "futures 0.3.17", "futures-timer 3.0.2", @@ -7975,7 +8117,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -7991,7 +8133,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8007,9 +8149,9 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -8018,7 +8160,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "chrono", "fdlimit", @@ -8056,7 +8198,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "fnv", "futures 0.3.17", @@ -8084,7 +8226,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "hash-db", "kvdb", @@ -8109,7 +8251,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "futures 0.3.17", @@ -8133,7 +8275,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "derive_more", @@ -8176,7 +8318,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "derive_more", "futures 0.3.17", @@ -8200,7 +8342,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "fork-tree", "parity-scale-codec", @@ -8213,7 +8355,7 @@ dependencies = [ [[package]] name = "sc-consensus-manual-seal" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "assert_matches", "async-trait", @@ -8247,7 +8389,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "futures 0.3.17", @@ -8273,7 +8415,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "sc-client-api", "sp-authorship", @@ -8284,7 +8426,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "lazy_static", "libsecp256k1 0.6.0", @@ -8310,9 +8452,10 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "derive_more", + "environmental", "parity-scale-codec", "pwasm-utils", "sc-allocator", @@ -8327,7 +8470,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "log", "parity-scale-codec", @@ -8343,7 +8486,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "cfg-if 1.0.0", "libc", @@ -8352,7 +8495,6 @@ dependencies = [ "parity-wasm 0.42.2", "sc-allocator", "sc-executor-common", - "scoped-tls", "sp-core", "sp-runtime-interface", "sp-wasm-interface", @@ -8362,7 +8504,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "derive_more", @@ -8399,7 +8541,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "derive_more", "finality-grandpa", @@ -8423,7 +8565,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "ansi_term 0.12.1", "futures 0.3.17", @@ -8440,7 +8582,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "derive_more", @@ -8455,7 +8597,7 @@ dependencies = [ [[package]] name = "sc-light" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "hash-db", "parity-scale-codec", @@ -8473,7 +8615,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-std", "async-trait", @@ -8524,7 +8666,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "futures 0.3.17", "futures-timer 3.0.2", @@ -8540,7 +8682,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "bytes 1.0.1", "fnv", @@ -8567,7 +8709,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "futures 0.3.17", "libp2p", @@ -8580,7 +8722,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -8589,7 +8731,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "futures 0.3.17", "hash-db", @@ -8620,7 +8762,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "futures 0.3.17", "jsonrpc-core", @@ -8645,7 +8787,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "futures 0.3.17", "jsonrpc-core", @@ -8656,12 +8798,13 @@ dependencies = [ "log", "serde_json", "substrate-prometheus-endpoint", + "tokio", ] [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "directories", @@ -8718,6 +8861,7 @@ dependencies = [ "substrate-prometheus-endpoint", "tempfile", "thiserror", + "tokio", "tracing", "tracing-futures", ] @@ -8725,7 +8869,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "log", "parity-scale-codec", @@ -8739,7 +8883,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -8761,7 +8905,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "chrono", "futures 0.3.17", @@ -8779,7 +8923,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "ansi_term 0.12.1", "atty", @@ -8808,9 +8952,9 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -8819,7 +8963,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "futures 0.3.17", "intervalier", @@ -8846,7 +8990,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "derive_more", "futures 0.3.17", @@ -8860,7 +9004,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "futures 0.3.17", "futures-timer 3.0.2", @@ -8879,6 +9023,7 @@ dependencies = [ "derive_more", "parity-scale-codec", "scale-info-derive", + "serde", ] [[package]] @@ -8887,7 +9032,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baeb2780690380592f86205aa4ee49815feb2acad8c2f59e6dd207148c3f1fcd" dependencies = [ - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -8933,6 +9078,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "scroll" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda28d4b4830b807a8b43f7b0e6b5df875311b3e7621d84577188c175b6ec1ec" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaaae8f38bb311444cfb7f1979af0bc9240d95795f75f9ceddf6a59b79ceffa0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sct" version = "0.6.0" @@ -9046,9 +9211,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.67" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f9e390c27c3c0ce8bc5d725f6e4d30a29d26659494aa4b17535f7522c5c950" +checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" dependencies = [ "itoa", "ryu", @@ -9167,7 +9332,7 @@ dependencies = [ "approx", "num-complex", "num-traits", - "paste 1.0.5", + "paste", ] [[package]] @@ -9187,29 +9352,29 @@ dependencies = [ [[package]] name = "slot-range-helper" -version = "0.9.9" +version = "0.9.11" dependencies = [ "enumn", "parity-scale-codec", - "paste 1.0.5", + "paste", "sp-runtime", "sp-std", ] [[package]] name = "slotmap" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a952280edbecfb1d4bd3cf2dbc309dc6ab523e53487c438ae21a6df09fe84bc4" +checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" dependencies = [ "version_check", ] [[package]] name = "smallvec" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" [[package]] name = "snap" @@ -9291,7 +9456,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "hash-db", "log", @@ -9308,10 +9473,10 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "blake2-rfc", - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -9320,9 +9485,10 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", + "scale-info", "serde", "sp-core", "sp-io", @@ -9332,11 +9498,12 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "integer-sqrt", "num-traits", "parity-scale-codec", + "scale-info", "serde", "sp-debug-derive", "sp-std", @@ -9346,9 +9513,10 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", + "scale-info", "sp-api", "sp-application-crypto", "sp-runtime", @@ -9358,7 +9526,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "parity-scale-codec", @@ -9370,7 +9538,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", "sp-api", @@ -9382,7 +9550,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "futures 0.3.17", "log", @@ -9400,7 +9568,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "futures 0.3.17", @@ -9419,11 +9587,12 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "merlin", "parity-scale-codec", + "scale-info", "serde", "sp-api", "sp-application-crypto", @@ -9441,9 +9610,10 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", + "scale-info", "sp-arithmetic", "sp-runtime", ] @@ -9451,7 +9621,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -9463,7 +9633,7 @@ dependencies = [ [[package]] name = "sp-core" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "base58", "blake2-rfc", @@ -9486,6 +9656,7 @@ dependencies = [ "primitive-types", "rand 0.7.3", "regex", + "scale-info", "schnorrkel", "secrecy", "serde", @@ -9507,7 +9678,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "kvdb", "parking_lot 0.11.1", @@ -9516,7 +9687,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "proc-macro2", "quote", @@ -9526,7 +9697,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "environmental", "parity-scale-codec", @@ -9537,11 +9708,12 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "finality-grandpa", "log", "parity-scale-codec", + "scale-info", "serde", "sp-api", "sp-application-crypto", @@ -9554,7 +9726,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -9568,7 +9740,7 @@ dependencies = [ [[package]] name = "sp-io" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "futures 0.3.17", "hash-db", @@ -9579,7 +9751,6 @@ dependencies = [ "sp-core", "sp-externalities", "sp-keystore", - "sp-maybe-compressed-blob", "sp-runtime-interface", "sp-state-machine", "sp-std", @@ -9593,7 +9764,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "lazy_static", "sp-core", @@ -9604,7 +9775,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "derive_more", @@ -9621,31 +9792,32 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ - "ruzstd", "zstd", ] [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", + "scale-info", "serde", "sp-arithmetic", "sp-core", "sp-npos-elections-solution-type", + "sp-runtime", "sp-std", ] [[package]] name = "sp-npos-elections-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -9654,7 +9826,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "sp-api", "sp-core", @@ -9664,7 +9836,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "backtrace", ] @@ -9672,7 +9844,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "rustc-hash", "serde", @@ -9682,7 +9854,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "either", "hash256-std-hasher", @@ -9690,8 +9862,9 @@ dependencies = [ "log", "parity-scale-codec", "parity-util-mem", - "paste 1.0.5", + "paste", "rand 0.7.3", + "scale-info", "serde", "sp-application-crypto", "sp-arithmetic", @@ -9703,7 +9876,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -9720,10 +9893,10 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "Inflector", - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -9732,7 +9905,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "serde", "serde_json", @@ -9741,9 +9914,10 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", + "scale-info", "sp-api", "sp-core", "sp-runtime", @@ -9754,9 +9928,10 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", + "scale-info", "sp-runtime", "sp-std", ] @@ -9764,7 +9939,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "hash-db", "log", @@ -9787,12 +9962,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" [[package]] name = "sp-storage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "impl-serde", "parity-scale-codec", @@ -9805,7 +9980,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "log", "sp-core", @@ -9818,7 +9993,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "futures-timer 3.0.2", @@ -9834,7 +10009,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "erased-serde", "log", @@ -9852,7 +10027,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "sp-api", "sp-runtime", @@ -9861,11 +10036,12 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "log", "parity-scale-codec", + "scale-info", "sp-core", "sp-inherents", "sp-runtime", @@ -9876,11 +10052,12 @@ dependencies = [ [[package]] name = "sp-trie" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "hash-db", "memory-db", "parity-scale-codec", + "scale-info", "sp-core", "sp-std", "trie-db", @@ -9890,11 +10067,12 @@ dependencies = [ [[package]] name = "sp-version" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "impl-serde", "parity-scale-codec", "parity-wasm 0.42.2", + "scale-info", "serde", "sp-runtime", "sp-std", @@ -9905,7 +10083,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -9916,7 +10094,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -9938,9 +10116,10 @@ checksum = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" [[package]] name = "staking-miner" -version = "0.9.9" +version = "0.9.11" dependencies = [ "env_logger 0.9.0", + "frame-election-provider-support", "frame-support", "frame-system", "jsonrpsee-ws-client", @@ -9951,7 +10130,7 @@ dependencies = [ "pallet-staking", "pallet-transaction-payment", "parity-scale-codec", - "paste 1.0.5", + "paste", "polkadot-core-primitives", "polkadot-runtime", "polkadot-runtime-common", @@ -9961,6 +10140,7 @@ dependencies = [ "serde_json", "sp-core", "sp-io", + "sp-npos-elections", "sp-runtime", "sp-version", "structopt", @@ -10110,7 +10290,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "platforms", ] @@ -10118,7 +10298,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.17", @@ -10140,7 +10320,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-std", "derive_more", @@ -10154,7 +10334,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "async-trait", "futures 0.3.17", @@ -10181,7 +10361,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "futures 0.3.17", "substrate-test-utils-derive", @@ -10191,9 +10371,9 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -10202,7 +10382,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "ansi_term 0.12.1", "build-helper", @@ -10228,9 +10408,9 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.75" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7" +checksum = "a4eac2e6c19f5c3abc0c229bea31ff0b9b091c7b14990e8924b92902a303a0c0" dependencies = [ "proc-macro2", "quote", @@ -10297,7 +10477,7 @@ dependencies = [ [[package]] name = "test-parachain-adder" -version = "0.9.9" +version = "0.9.11" dependencies = [ "dlmalloc", "parity-scale-codec", @@ -10310,7 +10490,7 @@ dependencies = [ [[package]] name = "test-parachain-adder-collator" -version = "0.9.9" +version = "0.9.11" dependencies = [ "futures 0.3.17", "futures-timer 3.0.2", @@ -10336,14 +10516,14 @@ dependencies = [ [[package]] name = "test-parachain-halt" -version = "0.9.9" +version = "0.9.11" dependencies = [ "substrate-wasm-builder", ] [[package]] name = "test-parachains" -version = "0.9.9" +version = "0.9.11" dependencies = [ "parity-scale-codec", "sp-core", @@ -10355,7 +10535,7 @@ dependencies = [ [[package]] name = "test-runner" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ "frame-system", "futures 0.3.17", @@ -10408,18 +10588,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c" dependencies = [ "proc-macro2", "quote", @@ -10457,6 +10637,38 @@ dependencies = [ "threadpool", ] +[[package]] +name = "tikv-jemalloc-ctl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb833c46ecbf8b6daeccb347cefcabf9c1beb5c9b0f853e1cec45632d9963e69" +dependencies = [ + "libc", + "paste", + "tikv-jemalloc-sys", +] + +[[package]] +name = "tikv-jemalloc-sys" +version = "0.4.2+5.2.1-patched.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5844e429d797c62945a566f8da4e24c7fe3fbd5d6617fd8bf7a0b7dc1ee0f22e" +dependencies = [ + "cc", + "fs_extra", + "libc", +] + +[[package]] +name = "tikv-jemallocator" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c14a5a604eb8715bc5785018a37d00739b180bcf609916ddf4393d33d49ccdf" +dependencies = [ + "libc", + "tikv-jemalloc-sys", +] + [[package]] name = "time" version = "0.1.43" @@ -10517,9 +10729,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.10.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92036be488bb6594459f2e03b60e42df6f937fe6ca5c5ffdcb539c6b84dc40f5" +checksum = "c2c2416fdedca8443ae44b4527de1ea633af61d8f7169ffa6e72c5b53d24efcc" dependencies = [ "autocfg", "bytes 1.0.1", @@ -10599,11 +10811,12 @@ checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" [[package]] name = "tracing" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" +checksum = "84f96e095c0c82419687c20ddf5cb3eadb61f4e1405923c9dc8e53a1adacbda8" dependencies = [ "cfg-if 1.0.0", + "log", "pin-project-lite 0.2.4", "tracing-attributes", "tracing-core", @@ -10611,9 +10824,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +checksum = "98863d0dd09fa59a1b79c6750ad80dbda6b75f4e71c437a6a1a8cb91a8bcbd77" dependencies = [ "proc-macro2", "quote", @@ -10622,9 +10835,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" +checksum = "46125608c26121c81b0c6d693eab5a420e416da7e43c426d2e8f7df8da8a3acf" dependencies = [ "lazy_static", ] @@ -10762,8 +10975,9 @@ checksum = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#d73c37ecc16f4895c5f6ed5126d72af8cf87d9b3" +source = "git+https://github.com/paritytech/substrate?branch=master#125092f355c11166c57deeef0e1841301a351889" dependencies = [ + "jsonrpsee-ws-client", "log", "parity-scale-codec", "remote-externalities", @@ -10773,9 +10987,12 @@ dependencies = [ "sc-service", "serde", "sp-core", + "sp-externalities", + "sp-io", "sp-keystore", "sp-runtime", "sp-state-machine", + "sp-version", "structopt", ] @@ -11149,15 +11366,15 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.78.2" +version = "0.79.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" +checksum = "5b5894be15a559c85779254700e1d35f02f843b5a69152e5c82c626d9fd66c0e" [[package]] name = "wasmtime" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b310b9d20fcf59385761d1ade7a3ef06aecc380e3d3172035b919eaf7465d9f7" +checksum = "8bbb8a082a8ef50f7eeb8b82dda9709ef1e68963ea3c94e45581644dd4041835" dependencies = [ "anyhow", "backtrace", @@ -11168,7 +11385,7 @@ dependencies = [ "lazy_static", "libc", "log", - "paste 1.0.5", + "paste", "psm", "region", "rustc-demangle", @@ -11186,9 +11403,9 @@ dependencies = [ [[package]] name = "wasmtime-cache" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d14d500d5c3dc5f5c097158feee123d64b3097f0d836a2a27dff9c761c73c843" +checksum = "d73391579ca7f24573138ef768b73b2aed5f9d542385c64979b65d60d0912399" dependencies = [ "anyhow", "base64 0.13.0", @@ -11207,9 +11424,9 @@ dependencies = [ [[package]] name = "wasmtime-cranelift" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c525b39f062eada7db3c1298287b96dcb6e472b9f6b22501300b28d9fa7582f6" +checksum = "81c6f5ae9205382345c7cd7454932a906186836999a2161c385e38a15f52e1fe" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -11222,14 +11439,14 @@ dependencies = [ [[package]] name = "wasmtime-debug" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5d2a763e7a6fc734218e0e463196762a4f409c483063d81e0e85f96343b2e0a" +checksum = "c69e08f55e12f15f50b1b533bc3626723e7224254a065de6576934c86258c9e8" dependencies = [ "anyhow", - "gimli 0.24.0", + "gimli", "more-asserts", - "object 0.24.0", + "object", "target-lexicon", "thiserror", "wasmparser", @@ -11238,15 +11455,15 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64d0c2d881c31b0d65c1f2695e022d71eb60b9fbdd336aacca28208b58eac90" +checksum = "005d93174040af37fb8625f891cd9827afdad314261f7ec4ee61ec497d6e9d3c" dependencies = [ "cfg-if 1.0.0", "cranelift-codegen", "cranelift-entity", "cranelift-wasm", - "gimli 0.24.0", + "gimli", "indexmap", "log", "more-asserts", @@ -11257,11 +11474,11 @@ dependencies = [ [[package]] name = "wasmtime-jit" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4539ea734422b7c868107e2187d7746d8affbcaa71916d72639f53757ad707" +checksum = "d0bf1dfb213a35d8f21aefae40e597fe72778a907011ffdff7affb029a02af9a" dependencies = [ - "addr2line 0.15.1", + "addr2line", "anyhow", "cfg-if 1.0.0", "cranelift-codegen", @@ -11269,10 +11486,10 @@ dependencies = [ "cranelift-frontend", "cranelift-native", "cranelift-wasm", - "gimli 0.24.0", + "gimli", "log", "more-asserts", - "object 0.24.0", + "object", "rayon", "region", "serde", @@ -11290,13 +11507,13 @@ dependencies = [ [[package]] name = "wasmtime-obj" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1a8ff85246d091828e2225af521a6208ed28c997bb5c39eb697366dc2e2f2b" +checksum = "d231491878e710c68015228c9f9fc5955fe5c96dbf1485c15f7bed55b622c83c" dependencies = [ "anyhow", "more-asserts", - "object 0.24.0", + "object", "target-lexicon", "wasmtime-debug", "wasmtime-environ", @@ -11304,14 +11521,17 @@ dependencies = [ [[package]] name = "wasmtime-profiling" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24364d522dcd67c897c8fffc42e5bdfc57207bbb6d7eeade0da9d4a7d70105b" +checksum = "21486cfb5255c2069666c1f116f9e949d4e35c9a494f11112fa407879e42198d" dependencies = [ "anyhow", "cfg-if 1.0.0", + "gimli", "lazy_static", "libc", + "object", + "scroll", "serde", "target-lexicon", "wasmtime-environ", @@ -11320,9 +11540,9 @@ dependencies = [ [[package]] name = "wasmtime-runtime" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51e57976e8a19a18a18e002c6eb12e5769554204238e47ff155fda1809ef0f7" +checksum = "d7ddfdf32e0a20d81f48be9dacd31612bc61de5a174d1356fef806d300f507de" dependencies = [ "anyhow", "backtrace", @@ -11382,7 +11602,7 @@ dependencies = [ [[package]] name = "westend-runtime" -version = "0.9.9" +version = "0.9.11" dependencies = [ "beefy-primitives", "bitvec 0.20.1", @@ -11399,6 +11619,7 @@ dependencies = [ "pallet-authority-discovery", "pallet-authorship", "pallet-babe", + "pallet-bags-list", "pallet-balances", "pallet-collective", "pallet-democracy", @@ -11430,12 +11651,14 @@ dependencies = [ "pallet-utility", "pallet-vesting", "pallet-xcm", + "pallet-xcm-benchmarks", "parity-scale-codec", "polkadot-parachain", "polkadot-primitives", "polkadot-runtime-common", "polkadot-runtime-parachains", "rustc-hex", + "scale-info", "serde", "serde_derive", "serde_json", @@ -11561,27 +11784,30 @@ dependencies = [ [[package]] name = "xcm" -version = "0.9.9" +version = "0.9.11" dependencies = [ "derivative", "impl-trait-for-tuples", "log", "parity-scale-codec", + "scale-info", "xcm-procedural", ] [[package]] name = "xcm-builder" -version = "0.9.9" +version = "0.9.11" dependencies = [ "frame-support", "frame-system", + "log", "pallet-balances", "pallet-transaction-payment", "pallet-xcm", "parity-scale-codec", "polkadot-parachain", "polkadot-runtime-parachains", + "scale-info", "sp-arithmetic", "sp-core", "sp-io", @@ -11593,8 +11819,9 @@ dependencies = [ [[package]] name = "xcm-executor" -version = "0.9.9" +version = "0.9.11" dependencies = [ + "frame-benchmarking", "frame-support", "impl-trait-for-tuples", "log", @@ -11609,7 +11836,7 @@ dependencies = [ [[package]] name = "xcm-executor-integration-tests" -version = "0.9.9" +version = "0.9.11" dependencies = [ "frame-support", "frame-system", @@ -11638,11 +11865,11 @@ dependencies = [ [[package]] name = "xcm-simulator" -version = "0.9.9" +version = "0.9.11" dependencies = [ "frame-support", "parity-scale-codec", - "paste 1.0.5", + "paste", "polkadot-core-primitives", "polkadot-parachain", "polkadot-runtime-parachains", @@ -11654,7 +11881,7 @@ dependencies = [ [[package]] name = "xcm-simulator-example" -version = "0.9.9" +version = "0.9.11" dependencies = [ "frame-support", "frame-system", @@ -11664,6 +11891,7 @@ dependencies = [ "polkadot-core-primitives", "polkadot-parachain", "polkadot-runtime-parachains", + "scale-info", "sp-core", "sp-io", "sp-runtime", @@ -11690,9 +11918,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "377db0846015f7ae377174787dd452e1c5f5a9050bc6f954911d01f116daa0cd" dependencies = [ "zeroize_derive", ] @@ -11711,18 +11939,18 @@ dependencies = [ [[package]] name = "zstd" -version = "0.6.1+zstd.1.4.9" +version = "0.9.0+zstd.1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de55e77f798f205d8561b8fe2ef57abfb6e0ff2abe7fd3c089e119cdb5631a3" +checksum = "07749a5dc2cb6b36661290245e350f15ec3bbb304e493db54a1d354480522ccd" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "3.0.1+zstd.1.4.9" +version = "4.1.1+zstd.1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1387cabcd938127b30ce78c4bf00b30387dddf704e3f0881dbc4ff62b5566f8c" +checksum = "c91c90f2c593b003603e5e0493c837088df4469da25aafff8bce42ba48caf079" dependencies = [ "libc", "zstd-sys", @@ -11730,9 +11958,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "1.4.20+zstd.1.4.9" +version = "1.6.1+zstd.1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd5b733d7cf2d9447e2c3e76a5589b4f5e5ae065c22a2bc0b023cbc331b6c8e" +checksum = "615120c7a2431d16cf1cf979e7fc31ba7a5b5e5707b29c8a99e5dbf8a8392a33" dependencies = [ "cc", "libc", diff --git a/Cargo.toml b/Cargo.toml index 2b5cc259d429..114d7ab2e986 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ path = "src/main.rs" name = "polkadot" description = "Implementation of a https://polkadot.network node in Rust based on the Substrate framework." license = "GPL-3.0-only" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" readme = "README.md" @@ -18,7 +18,7 @@ parity-util-mem = { version = "*", default-features = false, features = ["jemall [dev-dependencies] assert_cmd = "1.0.2" -nix = "0.19.1" +nix = "0.20.0" tempfile = "3.2.0" [workspace] @@ -43,6 +43,7 @@ members = [ "xcm/xcm-simulator", "xcm/xcm-simulator/example", "xcm/pallet-xcm", + "xcm/pallet-xcm-benchmarks", "xcm/procedural", "node/client", "node/collation-generation", @@ -72,7 +73,6 @@ members = [ "node/overseer", "node/overseer/overseer-gen", "node/overseer/overseer-gen/proc-macro", - "node/overseer/all-subsystems-gen", "node/malus", "node/primitives", "node/service", @@ -92,6 +92,8 @@ members = [ "parachain/test-parachains/adder", "parachain/test-parachains/adder/collator", "utils/staking-miner", + "utils/remote-ext-tests/bags-list", + "utils/voter-bags", ] # We want to be able to build the bridge relayer without pulling it (and all of its diff --git a/README.md b/README.md index d5251eb319d1..5ea7ac433562 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Implementation of a node in Rust based on the Substra This repo contains runtimes for the Polkadot, Kusama, and Westend networks. The README provides information about installing the `polkadot` binary and developing on the codebase. For more specific guides, like how to be a validator, see the -[Polkadot Wiki](https://wiki.polkadot.network/docs/en/). +[Polkadot Wiki](https://wiki.polkadot.network/docs/getting-started). ## Installation @@ -108,6 +108,22 @@ cargo build --release Note that compilation is a memory intensive process. We recommend having 4 GiB of physical RAM or swap available (keep in mind that if a build hits swap it tends to be very slow). +#### Build from Source with Docker + +You can also build from source using +[Parity CI docker image](https://github.com/paritytech/scripts/tree/master/dockerfiles/ci-linux): + +```bash +git checkout +docker run --rm -it -w /shellhere/polkadot \ + -v $(pwd):/shellhere/polkadot \ + paritytech/ci-linux:production cargo build --release +sudo chown -R $(id -u):$(id -g) target/ +``` + +If you want to reproduce other steps of CI process you can use the following +[guide](https://github.com/paritytech/scripts#gitlab-ci-for-building-docker-images). + ## Networks This repo supports runtimes for Polkadot, Kusama, and Westend. @@ -154,7 +170,7 @@ If you want to do anything on Polkadot, Kusama, or Westend, then you'll need to some DOT, KSM, or WND tokens, respectively. See the [claims instructions](https://claims.polkadot.network/) for Polkadot if you have DOTs to claim. For Westend's WND tokens, see the faucet -[instructions](https://wiki.polkadot.network/docs/en/learn-DOT#getting-westies) on the Wiki. +[instructions](https://wiki.polkadot.network/docs/learn-DOT#getting-westies) on the Wiki. ## Hacking on Polkadot diff --git a/bridges/.config/lingua.dic b/bridges/.config/lingua.dic index 8db035c2c28a..ee369c0f1095 100644 --- a/bridges/.config/lingua.dic +++ b/bridges/.config/lingua.dic @@ -65,6 +65,7 @@ isn io js keccak256/M +keypair/MS KSM/S Lane1 Lane2 @@ -101,13 +102,14 @@ parablock/MS parachain/MS parameterize/D pallet_message_lane +plancks polkadot/MS pov-block/MS PoA PoV/MS precommit -promethius -promethius' +prometheus +proxying prune_end prune_depth provisioner/MS diff --git a/bridges/Dockerfile b/bridges/Dockerfile index 2d03db8a76f2..cfd7fc456e50 100644 --- a/bridges/Dockerfile +++ b/bridges/Dockerfile @@ -8,7 +8,7 @@ # # See the `deployments/README.md` for all the available `PROJECT` values. -FROM paritytech/bridges-ci:latest as builder +FROM docker.io/paritytech/bridges-ci:latest as builder WORKDIR /parity-bridges-common COPY . . @@ -19,7 +19,7 @@ RUN cargo build --release --verbose -p ${PROJECT} && \ # In this final stage we copy over the final binary and do some checks # to make sure that everything looks good. -FROM ubuntu:20.04 as runtime +FROM docker.io/library/ubuntu:20.04 as runtime # show backtraces ENV RUST_BACKTRACE 1 diff --git a/bridges/bin/millau/runtime/src/lib.rs b/bridges/bin/millau/runtime/src/lib.rs index 496ad0362139..65c54c3046c1 100644 --- a/bridges/bin/millau/runtime/src/lib.rs +++ b/bridges/bin/millau/runtime/src/lib.rs @@ -464,7 +464,7 @@ impl_runtime_apis! { impl sp_api::Metadata for Runtime { fn metadata() -> OpaqueMetadata { - Runtime::metadata().into() + OpaqueMetadata::new(Runtime::metadata().into()) } } diff --git a/bridges/bin/rialto/runtime/src/lib.rs b/bridges/bin/rialto/runtime/src/lib.rs index bfd825bb4639..3a8b8651e346 100644 --- a/bridges/bin/rialto/runtime/src/lib.rs +++ b/bridges/bin/rialto/runtime/src/lib.rs @@ -353,6 +353,7 @@ impl pallet_grandpa::Config for Runtime { type HandleEquivocation = (); // TODO: update me (https://github.com/paritytech/parity-bridges-common/issues/78) type WeightInfo = (); + type MaxAuthorities = MaxAuthorities; } parameter_types! { @@ -589,7 +590,7 @@ impl_runtime_apis! { impl sp_api::Metadata for Runtime { fn metadata() -> OpaqueMetadata { - Runtime::metadata().into() + OpaqueMetadata::new(Runtime::metadata().into()) } } diff --git a/bridges/bin/runtime-common/Cargo.toml b/bridges/bin/runtime-common/Cargo.toml index 07fe8910c21f..928523af0256 100644 --- a/bridges/bin/runtime-common/Cargo.toml +++ b/bridges/bin/runtime-common/Cargo.toml @@ -11,6 +11,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ["derive"] } ed25519-dalek = { version = "1.0", default-features = false, optional = true } hash-db = { version = "0.15.2", default-features = false } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } # Bridge dependencies @@ -40,10 +41,12 @@ std = [ "codec/std", "frame-support/std", "hash-db/std", + "scale-info/std", "pallet-bridge-dispatch/std", "pallet-bridge-grandpa/std", "pallet-bridge-messages/std", "pallet-transaction-payment/std", + "scale-info/std", "sp-core/std", "sp-runtime/std", "sp-state-machine/std", diff --git a/bridges/bin/runtime-common/src/messages.rs b/bridges/bin/runtime-common/src/messages.rs index 72249e4f4e33..08f766e23686 100644 --- a/bridges/bin/runtime-common/src/messages.rs +++ b/bridges/bin/runtime-common/src/messages.rs @@ -37,6 +37,7 @@ use frame_support::{ RuntimeDebug, }; use hash_db::Hasher; +use scale_info::TypeInfo; use sp_runtime::{ traits::{AtLeast32BitUnsigned, CheckedAdd, CheckedDiv, CheckedMul}, FixedPointNumber, FixedPointOperand, FixedU128, @@ -200,7 +201,7 @@ pub mod source { /// - hash of finalized header; /// - storage proof of inbound lane state; /// - lane id. - #[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug)] + #[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] pub struct FromBridgedChainMessagesDeliveryProof { /// Hash of the bridge header the proof is for. pub bridged_header_hash: BridgedHeaderHash, @@ -431,7 +432,7 @@ pub mod target { /// - storage proof of messages and (optionally) outbound lane state; /// - lane id; /// - nonces (inclusive range) of messages which are included in this proof. - #[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug)] + #[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] pub struct FromBridgedChainMessagesProof { /// Hash of the finalized bridged header the proof is for. pub bridged_header_hash: BridgedHeaderHash, diff --git a/bridges/ci.Dockerfile b/bridges/ci.Dockerfile index 0bd2bc4dae83..d1cab4f92f22 100644 --- a/bridges/ci.Dockerfile +++ b/bridges/ci.Dockerfile @@ -1,7 +1,7 @@ # This file is a "runtime" part from a builder-pattern in Dockerfile, it's used in CI. # The only different part is that the compilation happens externally, # so COPY has a different source. -FROM ubuntu:20.04 +FROM docker.io/library/ubuntu:20.04 # show backtraces ENV RUST_BACKTRACE 1 diff --git a/bridges/deployments/BridgeDeps.Dockerfile b/bridges/deployments/BridgeDeps.Dockerfile index a18a94a7155a..6d3b3fa17048 100644 --- a/bridges/deployments/BridgeDeps.Dockerfile +++ b/bridges/deployments/BridgeDeps.Dockerfile @@ -2,7 +2,7 @@ # # This image is meant to be used as a building block when building images for # the various components in the bridge repo, such as nodes and relayers. -FROM ubuntu:20.04 +FROM docker.io/library/ubuntu:20.04 ENV LAST_DEPS_UPDATE 2021-04-01 ENV DEBIAN_FRONTEND=noninteractive diff --git a/bridges/deployments/bridges/poa-rialto/Front-end.Dockerfile b/bridges/deployments/bridges/poa-rialto/Front-end.Dockerfile index 427f0504e57d..25c49cf56c15 100644 --- a/bridges/deployments/bridges/poa-rialto/Front-end.Dockerfile +++ b/bridges/deployments/bridges/poa-rialto/Front-end.Dockerfile @@ -1,4 +1,4 @@ -FROM node:12 as build-deps +FROM docker.io/library/node:12 as build-deps # install tools and dependencies RUN set -eux; \ @@ -19,7 +19,7 @@ ENV EXPECTED_ETHEREUM_NETWORK_ID $EXPECTED_ETHEREUM_NETWORK_ID RUN yarn build:docker # Stage 2 - the production environment -FROM nginx:1.12 +FROM docker.io/library/nginx:1.12 COPY --from=build-deps /usr/src/bridge-ui/nginx/*.conf /etc/nginx/conf.d/ COPY --from=build-deps /usr/src/bridge-ui/dist /usr/share/nginx/html EXPOSE 80 diff --git a/bridges/deployments/monitoring/GrafanaMatrix.Dockerfile b/bridges/deployments/monitoring/GrafanaMatrix.Dockerfile index 420e134716a6..df80f7002159 100644 --- a/bridges/deployments/monitoring/GrafanaMatrix.Dockerfile +++ b/bridges/deployments/monitoring/GrafanaMatrix.Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:alpine +FROM docker.io/library/ruby:alpine RUN apk add --no-cache git diff --git a/bridges/deployments/networks/OpenEthereum.Dockerfile b/bridges/deployments/networks/OpenEthereum.Dockerfile index d47708ca29bf..15fe72d295eb 100644 --- a/bridges/deployments/networks/OpenEthereum.Dockerfile +++ b/bridges/deployments/networks/OpenEthereum.Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:xenial AS builder +FROM docker.io/library/ubuntu:xenial AS builder # show backtraces ENV RUST_BACKTRACE 1 @@ -60,7 +60,7 @@ WORKDIR /openethereum RUN cargo build --release --verbose RUN strip ./target/release/openethereum -FROM ubuntu:xenial +FROM docker.io/library/ubuntu:xenial # show backtraces ENV RUST_BACKTRACE 1 diff --git a/bridges/fuzz/storage-proof/Cargo.toml b/bridges/fuzz/storage-proof/Cargo.toml index c5848ebed00e..43e58ddb73e9 100644 --- a/bridges/fuzz/storage-proof/Cargo.toml +++ b/bridges/fuzz/storage-proof/Cargo.toml @@ -9,7 +9,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "2.0.0" } -finality-grandpa = "0.14.0" +finality-grandpa = "0.14.4" hash-db = "0.15.2" honggfuzz = "0.5.54" log = "0.4.0" diff --git a/bridges/modules/dispatch/Cargo.toml b/bridges/modules/dispatch/Cargo.toml index 6170af272ad9..fb601a70a1e2 100644 --- a/bridges/modules/dispatch/Cargo.toml +++ b/bridges/modules/dispatch/Cargo.toml @@ -8,6 +8,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } log = { version = "0.4.14", default-features = false } # Bridge dependencies @@ -32,9 +33,11 @@ default = ["std"] std = [ "bp-message-dispatch/std", "bp-runtime/std", + "codec/std", "frame-support/std", "frame-system/std", "log/std", + "scale-info/std", "sp-core/std", "sp-runtime/std", "sp-std/std", diff --git a/bridges/modules/dispatch/src/lib.rs b/bridges/modules/dispatch/src/lib.rs index 8d089f330506..00858272365a 100644 --- a/bridges/modules/dispatch/src/lib.rs +++ b/bridges/modules/dispatch/src/lib.rs @@ -399,6 +399,7 @@ mod tests { use super::*; use frame_support::{dispatch::GetDispatchInfo, parameter_types, weights::Weight}; use frame_system::{EventRecord, Phase}; + use scale_info::TypeInfo; use sp_core::H256; use sp_runtime::{ testing::Header, @@ -412,7 +413,7 @@ mod tests { const SOURCE_CHAIN_ID: ChainId = *b"srce"; const TARGET_CHAIN_ID: ChainId = *b"trgt"; - #[derive(Debug, Encode, Decode, Clone, PartialEq, Eq)] + #[derive(Debug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] pub struct TestAccountPublic(AccountId); impl IdentifyAccount for TestAccountPublic { @@ -423,7 +424,7 @@ mod tests { } } - #[derive(Debug, Encode, Decode, Clone, PartialEq, Eq)] + #[derive(Debug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] pub struct TestSignature(AccountId); impl Verify for TestSignature { @@ -516,7 +517,7 @@ mod tests { impl Contains for TestCallFilter { fn contains(call: &Call) -> bool { - !matches!(*call, Call::System(frame_system::Call::fill_block(_))) + !matches!(*call, Call::System(frame_system::Call::fill_block { .. })) } } @@ -569,8 +570,9 @@ mod tests { let id = [0; 4]; const BAD_SPEC_VERSION: SpecVersion = 99; - let mut message = - prepare_root_message(Call::System(>::remark(vec![1, 2, 3]))); + let mut message = prepare_root_message(Call::System(frame_system::Call::::remark { + remark: vec![1, 2, 3], + })); let weight = message.weight; message.spec_version = BAD_SPEC_VERSION; @@ -599,7 +601,7 @@ mod tests { fn should_fail_on_weight_mismatch() { new_test_ext().execute_with(|| { let id = [0; 4]; - let call = Call::System(>::remark(vec![1, 2, 3])); + let call = Call::System(frame_system::Call::::remark { remark: vec![1, 2, 3] }); let call_weight = call.get_dispatch_info().weight; let mut message = prepare_root_message(call); message.weight = 7; @@ -637,7 +639,7 @@ mod tests { let call_origin = CallOrigin::TargetAccount(1, TestAccountPublic(1), TestSignature(99)); let message = prepare_message( call_origin, - Call::System(>::remark(vec![1, 2, 3])), + Call::System(frame_system::Call::::remark { remark: vec![1, 2, 3] }), ); let weight = message.weight; @@ -687,8 +689,9 @@ mod tests { new_test_ext().execute_with(|| { let id = [0; 4]; - let mut message = - prepare_root_message(Call::System(>::remark(vec![1, 2, 3]))); + let mut message = prepare_root_message(Call::System(frame_system::Call::::remark { + remark: vec![1, 2, 3], + })); let weight = message.weight; message.call.0 = vec![]; @@ -716,7 +719,9 @@ mod tests { new_test_ext().execute_with(|| { let id = [0; 4]; - let call = Call::System(>::fill_block(Perbill::from_percent(75))); + let call = Call::System(frame_system::Call::::fill_block { + ratio: Perbill::from_percent(75), + }); let weight = call.get_dispatch_info().weight; let mut message = prepare_root_message(call); message.weight = weight; @@ -745,8 +750,9 @@ mod tests { new_test_ext().execute_with(|| { let id = [0; 4]; - let mut message = - prepare_root_message(Call::System(>::remark(vec![1, 2, 3]))); + let mut message = prepare_root_message(Call::System(frame_system::Call::::remark { + remark: vec![1, 2, 3], + })); let weight = message.weight; message.dispatch_fee_payment = DispatchFeePayment::AtTargetChain; @@ -779,8 +785,9 @@ mod tests { new_test_ext().execute_with(|| { let id = [0; 4]; - let mut message = - prepare_root_message(Call::System(>::remark(vec![1, 2, 3]))); + let mut message = prepare_root_message(Call::System(frame_system::Call::::remark { + remark: vec![1, 2, 3], + })); message.dispatch_fee_payment = DispatchFeePayment::AtTargetChain; System::set_block_number(1); @@ -808,7 +815,7 @@ mod tests { new_test_ext().execute_with(|| { let id = [0; 4]; - let call = Call::System(>::set_heap_pages(1)); + let call = Call::System(frame_system::Call::::set_heap_pages { pages: 1 }); let message = prepare_target_message(call); System::set_block_number(1); @@ -835,7 +842,9 @@ mod tests { fn should_dispatch_bridge_message_from_root_origin() { new_test_ext().execute_with(|| { let id = [0; 4]; - let message = prepare_root_message(Call::System(>::remark(vec![1, 2, 3]))); + let message = prepare_root_message(Call::System(frame_system::Call::::remark { + remark: vec![1, 2, 3], + })); System::set_block_number(1); let result = Dispatch::dispatch(SOURCE_CHAIN_ID, TARGET_CHAIN_ID, id, Ok(message), |_, _| unreachable!()); @@ -862,7 +871,7 @@ mod tests { new_test_ext().execute_with(|| { let id = [0; 4]; - let call = Call::System(>::remark(vec![])); + let call = Call::System(frame_system::Call::::remark { remark: vec![] }); let message = prepare_target_message(call); System::set_block_number(1); @@ -890,7 +899,7 @@ mod tests { new_test_ext().execute_with(|| { let id = [0; 4]; - let call = Call::System(>::remark(vec![])); + let call = Call::System(frame_system::Call::::remark { remark: vec![] }); let message = prepare_source_message(call); System::set_block_number(1); @@ -915,7 +924,7 @@ mod tests { #[test] fn origin_is_checked_when_verifying_sending_message_using_source_root_account() { - let call = Call::System(>::remark(vec![])); + let call = Call::System(frame_system::Call::::remark { remark: vec![] }); let message = prepare_root_message(call); // When message is sent by Root, CallOrigin::SourceRoot is allowed @@ -930,7 +939,7 @@ mod tests { #[test] fn origin_is_checked_when_verifying_sending_message_using_target_account() { - let call = Call::System(>::remark(vec![])); + let call = Call::System(frame_system::Call::::remark { remark: vec![] }); let message = prepare_target_message(call); // When message is sent by Root, CallOrigin::TargetAccount is not allowed @@ -955,7 +964,7 @@ mod tests { #[test] fn origin_is_checked_when_verifying_sending_message_using_source_account() { - let call = Call::System(>::remark(vec![])); + let call = Call::System(frame_system::Call::::remark { remark: vec![] }); let message = prepare_source_message(call); // Sending a message from the expected origin account works diff --git a/bridges/modules/ethereum-contract-builtin/Cargo.toml b/bridges/modules/ethereum-contract-builtin/Cargo.toml index d20b0d0be85b..6177ed3734ca 100644 --- a/bridges/modules/ethereum-contract-builtin/Cargo.toml +++ b/bridges/modules/ethereum-contract-builtin/Cargo.toml @@ -9,7 +9,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "2.0.0" } ethereum-types = "0.11.0" -finality-grandpa = "0.14.1" +finality-grandpa = "0.14.4" hex = "0.4" log = "0.4.14" diff --git a/bridges/modules/grandpa/Cargo.toml b/bridges/modules/grandpa/Cargo.toml index aa2e33cf447b..0347af07b77c 100644 --- a/bridges/modules/grandpa/Cargo.toml +++ b/bridges/modules/grandpa/Cargo.toml @@ -9,9 +9,10 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false } -finality-grandpa = { version = "0.14.1", default-features = false } +finality-grandpa = { version = "0.14.4", default-features = false } log = { version = "0.4.14", default-features = false } num-traits = { version = "0.2", default-features = false } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } serde = { version = "1.0", optional = true } # Bridge Dependencies @@ -47,6 +48,7 @@ std = [ "frame-system/std", "log/std", "num-traits/std", + "scale-info/std", "serde", "sp-finality-grandpa/std", "sp-runtime/std", diff --git a/bridges/modules/messages/Cargo.toml b/bridges/modules/messages/Cargo.toml index a26cf65c028b..1d664e421695 100644 --- a/bridges/modules/messages/Cargo.toml +++ b/bridges/modules/messages/Cargo.toml @@ -11,6 +11,7 @@ bitvec = { version = "0.20", default-features = false, features = ["alloc"] } codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false } log = { version = "0.4.14", default-features = false } num-traits = { version = "0.2", default-features = false } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } # Bridge dependencies @@ -47,6 +48,7 @@ std = [ "frame-system/std", "log/std", "num-traits/std", + "scale-info/std", "serde", "sp-core/std", "sp-runtime/std", diff --git a/bridges/modules/messages/src/mock.rs b/bridges/modules/messages/src/mock.rs index 4fc8d3ed6b17..35358b76f26d 100644 --- a/bridges/modules/messages/src/mock.rs +++ b/bridges/modules/messages/src/mock.rs @@ -32,6 +32,7 @@ use bp_messages::{ use bp_runtime::{messages::MessageDispatchResult, Size}; use codec::{Decode, Encode}; use frame_support::{parameter_types, weights::Weight}; +use scale_info::TypeInfo; use sp_core::H256; use sp_runtime::{ testing::Header as SubstrateHeader, @@ -42,7 +43,7 @@ use std::collections::BTreeMap; pub type AccountId = u64; pub type Balance = u64; -#[derive(Decode, Encode, Clone, Debug, PartialEq, Eq)] +#[derive(Decode, Encode, Clone, Debug, PartialEq, Eq, TypeInfo)] pub struct TestPayload { /// Field that may be used to identify messages. pub id: u64, @@ -138,7 +139,7 @@ parameter_types! { pub storage TokenConversionRate: FixedU128 = 1.into(); } -#[derive(Debug, Clone, Encode, Decode, PartialEq, Eq)] +#[derive(Debug, Clone, Encode, Decode, PartialEq, Eq, TypeInfo)] pub enum TestMessagesParameter { TokenConversionRate(FixedU128), } @@ -211,7 +212,7 @@ pub const PAYLOAD_REJECTED_BY_TARGET_CHAIN: TestPayload = message_payload(1, 50) pub type MessagesByLaneVec = Vec<(LaneId, ProvedLaneMessages>)>; /// Test messages proof. -#[derive(Debug, Encode, Decode, Clone, PartialEq, Eq)] +#[derive(Debug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] pub struct TestMessagesProof { pub result: Result, } @@ -242,7 +243,7 @@ impl From>, ()>> for TestMessagesProof { } /// Messages delivery proof used in tests. -#[derive(Debug, Encode, Decode, Eq, Clone, PartialEq)] +#[derive(Debug, Encode, Decode, Eq, Clone, PartialEq, TypeInfo)] pub struct TestMessagesDeliveryProof(pub Result<(LaneId, InboundLaneData), ()>); impl Size for TestMessagesDeliveryProof { diff --git a/bridges/primitives/chain-millau/Cargo.toml b/bridges/primitives/chain-millau/Cargo.toml index 671bcbd53d00..3628f9092091 100644 --- a/bridges/primitives/chain-millau/Cargo.toml +++ b/bridges/primitives/chain-millau/Cargo.toml @@ -16,7 +16,7 @@ fixed-hash = { version = "0.7.0", default-features = false } hash256-std-hasher = { version = "0.15.2", default-features = false } impl-codec = { version = "0.5.1", default-features = false } impl-serde = { version = "0.3.1", optional = true } -parity-util-mem = { version = "0.9.0", default-features = false, features = ["primitive-types"] } +parity-util-mem = { version = "0.10.0", default-features = false, features = ["primitive-types"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } # Substrate Based Dependencies diff --git a/bridges/primitives/header-chain/Cargo.toml b/bridges/primitives/header-chain/Cargo.toml index 844e59865202..e64a54a1ad20 100644 --- a/bridges/primitives/header-chain/Cargo.toml +++ b/bridges/primitives/header-chain/Cargo.toml @@ -8,7 +8,8 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false } -finality-grandpa = { version = "0.14.1", default-features = false } +finality-grandpa = { version = "0.14.4", default-features = false } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } serde = { version = "1.0", optional = true } # Substrate Dependencies @@ -28,6 +29,7 @@ default = ["std"] std = [ "codec/std", "finality-grandpa/std", + "scale-info/std", "serde/std", "frame-support/std", "sp-core/std", diff --git a/bridges/primitives/header-chain/src/justification.rs b/bridges/primitives/header-chain/src/justification.rs index cc47070b8ca2..fc7256481068 100644 --- a/bridges/primitives/header-chain/src/justification.rs +++ b/bridges/primitives/header-chain/src/justification.rs @@ -22,6 +22,7 @@ use codec::{Decode, Encode}; use finality_grandpa::voter_set::VoterSet; use frame_support::RuntimeDebug; +use scale_info::TypeInfo; use sp_finality_grandpa::{AuthorityId, AuthoritySignature, SetId}; use sp_runtime::traits::Header as HeaderT; use sp_std::collections::{btree_map::BTreeMap, btree_set::BTreeSet}; @@ -32,7 +33,7 @@ use sp_std::prelude::*; /// /// This particular proof is used to prove that headers on a bridged chain /// (so not our chain) have been finalized correctly. -#[derive(Encode, Decode, RuntimeDebug, Clone, PartialEq, Eq)] +#[derive(Encode, Decode, RuntimeDebug, Clone, PartialEq, Eq, TypeInfo)] pub struct GrandpaJustification { /// The round (voting period) this justification is valid for. pub round: u64, diff --git a/bridges/primitives/header-chain/src/lib.rs b/bridges/primitives/header-chain/src/lib.rs index adac6eb26880..16511e99f79e 100644 --- a/bridges/primitives/header-chain/src/lib.rs +++ b/bridges/primitives/header-chain/src/lib.rs @@ -24,6 +24,7 @@ use core::clone::Clone; use core::cmp::Eq; use core::default::Default; use core::fmt::Debug; +use scale_info::TypeInfo; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; use sp_finality_grandpa::{AuthorityList, ConsensusLog, SetId, GRANDPA_ENGINE_ID}; @@ -39,7 +40,7 @@ pub trait Parameter: Codec + EncodeLike + Clone + Eq + Debug {} impl Parameter for T where T: Codec + EncodeLike + Clone + Eq + Debug {} /// A GRANDPA Authority List and ID. -#[derive(Default, Encode, Decode, RuntimeDebug, PartialEq, Clone)] +#[derive(Default, Encode, Decode, RuntimeDebug, PartialEq, Clone, TypeInfo)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct AuthoritySet { /// List of GRANDPA authorities for the current round. @@ -58,7 +59,7 @@ impl AuthoritySet { /// Data required for initializing the bridge pallet. /// /// The bridge needs to know where to start its sync from, and this provides that initial context. -#[derive(Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, Clone)] +#[derive(Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, Clone, TypeInfo)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct InitializationData { /// The header from which we should start syncing. diff --git a/bridges/primitives/message-dispatch/Cargo.toml b/bridges/primitives/message-dispatch/Cargo.toml index 84fa48553a21..9b24ae86a067 100644 --- a/bridges/primitives/message-dispatch/Cargo.toml +++ b/bridges/primitives/message-dispatch/Cargo.toml @@ -9,6 +9,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] bp-runtime = { path = "../runtime", default-features = false } codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } # Substrate Dependencies @@ -21,5 +22,6 @@ std = [ "bp-runtime/std", "codec/std", "frame-support/std", + "scale-info/std", "sp-std/std", ] diff --git a/bridges/primitives/message-dispatch/src/lib.rs b/bridges/primitives/message-dispatch/src/lib.rs index 859dc5e469ad..b2683674b776 100644 --- a/bridges/primitives/message-dispatch/src/lib.rs +++ b/bridges/primitives/message-dispatch/src/lib.rs @@ -25,6 +25,7 @@ use bp_runtime::{ }; use codec::{Decode, Encode}; use frame_support::RuntimeDebug; +use scale_info::TypeInfo; use sp_std::prelude::*; /// Message dispatch weight. @@ -71,7 +72,7 @@ pub trait MessageDispatch { /// The source chain can (and should) verify that the message can be dispatched on the target chain /// with a particular origin given the source chain's origin. This can be done with the /// `verify_message_origin()` function. -#[derive(RuntimeDebug, Encode, Decode, Clone, PartialEq, Eq)] +#[derive(RuntimeDebug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] pub enum CallOrigin { /// Call is sent by the Root origin on the source chain. On the target chain it is dispatched /// from a derived account. @@ -111,7 +112,7 @@ pub enum CallOrigin { /// Runtime specification version. We only dispatch messages that have the same /// runtime version. Otherwise we risk to misinterpret encoded calls. diff --git a/bridges/primitives/messages/Cargo.toml b/bridges/primitives/messages/Cargo.toml index b5b68220a409..191742005f44 100644 --- a/bridges/primitives/messages/Cargo.toml +++ b/bridges/primitives/messages/Cargo.toml @@ -10,6 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" bitvec = { version = "0.20", default-features = false, features = ["alloc"] } codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ["derive", "bit-vec"] } impl-trait-for-tuples = "0.2" +scale-info = { version = "1.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } # Bridge dependencies @@ -29,6 +30,7 @@ std = [ "codec/std", "frame-support/std", "frame-system/std", + "scale-info/std", "serde", - "sp-std/std" + "sp-std/std", ] diff --git a/bridges/primitives/messages/src/lib.rs b/bridges/primitives/messages/src/lib.rs index 963543ec3213..344735b53c91 100644 --- a/bridges/primitives/messages/src/lib.rs +++ b/bridges/primitives/messages/src/lib.rs @@ -26,6 +26,7 @@ use bitvec::prelude::*; use bp_runtime::messages::DispatchFeePayment; use codec::{Decode, Encode}; use frame_support::RuntimeDebug; +use scale_info::TypeInfo; use sp_std::{collections::vec_deque::VecDeque, prelude::*}; pub mod source_chain; @@ -35,7 +36,7 @@ pub mod target_chain; pub use frame_support::weights::Weight; /// Messages pallet operating mode. -#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)] #[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] pub enum OperatingMode { /// Normal mode, when all operations are allowed. @@ -81,7 +82,7 @@ pub type MessageId = (LaneId, MessageNonce); pub type MessagePayload = Vec; /// Message key (unique message identifier) as it is stored in the storage. -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] pub struct MessageKey { /// ID of the message lane. pub lane_id: LaneId, @@ -90,7 +91,7 @@ pub struct MessageKey { } /// Message data as it is stored in the storage. -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] pub struct MessageData { /// Message payload. pub payload: MessagePayload, @@ -99,7 +100,7 @@ pub struct MessageData { } /// Message as it is stored in the storage. -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] pub struct Message { /// Message key. pub key: MessageKey, @@ -108,7 +109,7 @@ pub struct Message { } /// Inbound lane data. -#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq)] +#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq, TypeInfo)] pub struct InboundLaneData { /// Identifiers of relayers and messages that they have delivered to this lane (ordered by message nonce). /// @@ -195,7 +196,7 @@ pub type DispatchResultsBitVec = BitVec; /// /// This struct represents a continuous range of messages that have been delivered by the same relayer /// and whose confirmations are still pending. -#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq)] +#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq, TypeInfo)] pub struct UnrewardedRelayer { /// Identifier of the relayer. pub relayer: RelayerId, @@ -204,7 +205,7 @@ pub struct UnrewardedRelayer { } /// Delivered messages with their dispatch result. -#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq)] +#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] pub struct DeliveredMessages { /// Nonce of the first message that has been delivered (inclusive). pub begin: MessageNonce, @@ -254,7 +255,7 @@ impl DeliveredMessages { } /// Gist of `InboundLaneData::relayers` field used by runtime APIs. -#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq)] +#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] pub struct UnrewardedRelayersState { /// Number of entries in the `InboundLaneData::relayers` set. pub unrewarded_relayer_entries: MessageNonce, @@ -266,7 +267,7 @@ pub struct UnrewardedRelayersState { } /// Outbound lane data. -#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq)] +#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq, TypeInfo)] pub struct OutboundLaneData { /// Nonce of oldest message that we haven't yet pruned. May point to not-yet-generated message if /// all sent messages are already pruned. diff --git a/bridges/primitives/messages/src/target_chain.rs b/bridges/primitives/messages/src/target_chain.rs index d1b87fd02323..873059763791 100644 --- a/bridges/primitives/messages/src/target_chain.rs +++ b/bridges/primitives/messages/src/target_chain.rs @@ -21,13 +21,14 @@ use crate::{LaneId, Message, MessageData, MessageKey, OutboundLaneData}; use bp_runtime::{messages::MessageDispatchResult, Size}; use codec::{Decode, Encode, Error as CodecError}; use frame_support::{weights::Weight, Parameter, RuntimeDebug}; +use scale_info::TypeInfo; use sp_std::{collections::btree_map::BTreeMap, fmt::Debug, prelude::*}; /// Proved messages from the source chain. pub type ProvedMessages = BTreeMap>; /// Proved messages from single lane of the source chain. -#[derive(RuntimeDebug, Encode, Decode, Clone, PartialEq, Eq)] +#[derive(RuntimeDebug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] pub struct ProvedLaneMessages { /// Optional outbound lane state. pub lane_state: Option, diff --git a/bridges/primitives/polkadot-core/Cargo.toml b/bridges/primitives/polkadot-core/Cargo.toml index 995f948e5d47..5e95c223ce2e 100644 --- a/bridges/primitives/polkadot-core/Cargo.toml +++ b/bridges/primitives/polkadot-core/Cargo.toml @@ -8,6 +8,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } # Bridge Dependencies @@ -35,6 +36,7 @@ std = [ "frame-support/std", "frame-system/std", "parity-scale-codec/std", + "scale-info/std", "sp-api/std", "sp-core/std", "sp-runtime/std", diff --git a/bridges/primitives/polkadot-core/src/lib.rs b/bridges/primitives/polkadot-core/src/lib.rs index a1619b27bcf4..151e374e6603 100644 --- a/bridges/primitives/polkadot-core/src/lib.rs +++ b/bridges/primitives/polkadot-core/src/lib.rs @@ -213,7 +213,7 @@ pub type AdditionalSigned = (u32, u32, Hash, Hash, (), (), ()); /// A simplified version of signed extensions meant for producing signed transactions /// and signed payload in the client code. -#[derive(PartialEq, Eq, Clone, RuntimeDebug)] +#[derive(PartialEq, Eq, Clone, RuntimeDebug, scale_info::TypeInfo)] pub struct SignedExtensions { encode_payload: SignedExtra, additional_signed: AdditionalSigned, @@ -266,7 +266,14 @@ impl SignedExtensions { impl sp_runtime::traits::SignedExtension for SignedExtensions where - Call: parity_scale_codec::Codec + sp_std::fmt::Debug + Sync + Send + Clone + Eq + PartialEq, + Call: parity_scale_codec::Codec + + sp_std::fmt::Debug + + Sync + + Send + + Clone + + Eq + + PartialEq + + scale_info::StaticTypeInfo, Call: Dispatchable, { const IDENTIFIER: &'static str = "Not needed."; diff --git a/bridges/primitives/runtime/Cargo.toml b/bridges/primitives/runtime/Cargo.toml index 17fa96b2c908..cdd47e30d3f8 100644 --- a/bridges/primitives/runtime/Cargo.toml +++ b/bridges/primitives/runtime/Cargo.toml @@ -10,6 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false } hash-db = { version = "0.15.2", default-features = false } num-traits = { version = "0.2", default-features = false } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } # Substrate Dependencies @@ -32,6 +33,7 @@ std = [ "frame-support/std", "hash-db/std", "num-traits/std", + "scale-info/std", "sp-core/std", "sp-io/std", "sp-runtime/std", diff --git a/bridges/primitives/runtime/src/messages.rs b/bridges/primitives/runtime/src/messages.rs index f6e04619c723..3ab867773f9f 100644 --- a/bridges/primitives/runtime/src/messages.rs +++ b/bridges/primitives/runtime/src/messages.rs @@ -18,9 +18,10 @@ use codec::{Decode, Encode}; use frame_support::{weights::Weight, RuntimeDebug}; +use scale_info::TypeInfo; /// Where message dispatch fee is paid? -#[derive(Encode, Decode, RuntimeDebug, Clone, Copy, PartialEq, Eq)] +#[derive(Encode, Decode, RuntimeDebug, Clone, Copy, PartialEq, Eq, TypeInfo)] pub enum DispatchFeePayment { /// The dispacth fee is paid at the source chain. AtSourceChain, @@ -34,7 +35,7 @@ pub enum DispatchFeePayment { } /// Message dispatch result. -#[derive(Encode, Decode, RuntimeDebug, Clone, PartialEq, Eq)] +#[derive(Encode, Decode, RuntimeDebug, Clone, PartialEq, Eq, TypeInfo)] pub struct MessageDispatchResult { /// Dispatch result flag. This flag is relayed back to the source chain and, generally /// speaking, may bring any (that fits in single bit) information from the dispatcher at diff --git a/bridges/primitives/test-utils/Cargo.toml b/bridges/primitives/test-utils/Cargo.toml index fe6a68087873..14d3c031b4c8 100644 --- a/bridges/primitives/test-utils/Cargo.toml +++ b/bridges/primitives/test-utils/Cargo.toml @@ -9,7 +9,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" bp-header-chain = { path = "../header-chain", default-features = false } codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false } ed25519-dalek = { version = "1.0", default-features = false, features = ["u64_backend"] } -finality-grandpa = { version = "0.14.1", default-features = false } +finality-grandpa = { version = "0.14.4", default-features = false } sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } diff --git a/bridges/relays/bin-substrate/Cargo.toml b/bridges/relays/bin-substrate/Cargo.toml index c2f30546f30f..99f56cc3be48 100644 --- a/bridges/relays/bin-substrate/Cargo.toml +++ b/bridges/relays/bin-substrate/Cargo.toml @@ -32,7 +32,7 @@ bp-wococo = { path = "../../primitives/chain-wococo" } bp-runtime = { path = "../../primitives/runtime" } bp-westend = { path = "../../primitives/chain-westend" } bridge-runtime-common = { path = "../../bin/runtime-common" } -finality-grandpa = { version = "0.14.1" } +finality-grandpa = "0.14.1" finality-relay = { path = "../finality" } headers-relay = { path = "../headers" } messages-relay = { path = "../messages" } diff --git a/bridges/relays/bin-substrate/src/cli/derive_account.rs b/bridges/relays/bin-substrate/src/cli/derive_account.rs index dff62c21f6fe..c7ac8761f133 100644 --- a/bridges/relays/bin-substrate/src/cli/derive_account.rs +++ b/bridges/relays/bin-substrate/src/cli/derive_account.rs @@ -27,7 +27,7 @@ use structopt::StructOpt; /// since messages sent over the bridge will be able to spend these. #[derive(StructOpt)] pub struct DeriveAccount { - /// A bridge instance to initalize. + /// A bridge instance to initialize. #[structopt(possible_values = &FullBridge::variants(), case_insensitive = true)] bridge: FullBridge, /// Source-chain address to derive Target-chain address from. diff --git a/bridges/relays/bin-substrate/src/cli/encode_message.rs b/bridges/relays/bin-substrate/src/cli/encode_message.rs index 213c8377678f..79b7b9a42cd3 100644 --- a/bridges/relays/bin-substrate/src/cli/encode_message.rs +++ b/bridges/relays/bin-substrate/src/cli/encode_message.rs @@ -40,7 +40,7 @@ pub enum MessagePayload { /// A `MessagePayload` to encode. #[derive(StructOpt)] pub struct EncodeMessage { - /// A bridge instance to initalize. + /// A bridge instance to initialize. #[structopt(possible_values = &FullBridge::variants(), case_insensitive = true)] bridge: FullBridge, #[structopt(flatten)] diff --git a/bridges/relays/bin-substrate/src/cli/init_bridge.rs b/bridges/relays/bin-substrate/src/cli/init_bridge.rs index 20e6daa500e5..25f220d7f6ce 100644 --- a/bridges/relays/bin-substrate/src/cli/init_bridge.rs +++ b/bridges/relays/bin-substrate/src/cli/init_bridge.rs @@ -25,7 +25,7 @@ use structopt::{clap::arg_enum, StructOpt}; /// Initialize bridge pallet. #[derive(StructOpt)] pub struct InitBridge { - /// A bridge instance to initalize. + /// A bridge instance to initialize. #[structopt(possible_values = &InitBridgeName::variants(), case_insensitive = true)] bridge: InitBridgeName, #[structopt(flatten)] diff --git a/bridges/relays/bin-substrate/src/cli/mod.rs b/bridges/relays/bin-substrate/src/cli/mod.rs index 49bc5dc8c837..042ae320d502 100644 --- a/bridges/relays/bin-substrate/src/cli/mod.rs +++ b/bridges/relays/bin-substrate/src/cli/mod.rs @@ -72,7 +72,7 @@ pub enum Command { /// The message is being sent to the source chain, delivered to the target chain and dispatched /// there. SendMessage(send_message::SendMessage), - /// Generate SCALE-encoded `Call` for choosen network. + /// Generate SCALE-encoded `Call` for the chosen network. /// /// The call can be used either as message payload or can be wrapped into a transaction /// and executed on the chain directly. @@ -235,7 +235,7 @@ pub trait CliChain: relay_substrate_client::Chain { /// Bridge Message Payload type. /// - /// TODO [#854] This should be removed in favour of target-specifc types. + /// TODO [#854] This should be removed in favor of target-specifc types. type MessagePayload; /// Numeric value of SS58 format. @@ -354,7 +354,7 @@ where } /// Create chain-specific set of configuration objects: connection parameters, -/// signing parameters and bridge initialisation parameters. +/// signing parameters and bridge initialization parameters. #[macro_export] macro_rules! declare_chain_options { ($chain:ident, $chain_prefix:ident) => { @@ -385,7 +385,7 @@ macro_rules! declare_chain_options { } impl [<$chain SigningParams>] { - /// Parse signing params into chain-specific KeyPair. + /// Parse signing params into chain-specific `KeyPair`. pub fn to_keypair(&self) -> anyhow::Result { use sp_core::crypto::Pair; diff --git a/bridges/relays/bin-substrate/src/messages_lane.rs b/bridges/relays/bin-substrate/src/messages_lane.rs index 7efea545f9a6..458b08f6014f 100644 --- a/bridges/relays/bin-substrate/src/messages_lane.rs +++ b/bridges/relays/bin-substrate/src/messages_lane.rs @@ -59,7 +59,7 @@ pub trait SubstrateMessageLane: MessageLane { const INBOUND_LANE_LATEST_RECEIVED_NONCE_METHOD: &'static str; /// Name of the runtime method that returns latest confirmed (reward-paid) nonce at the target chain. const INBOUND_LANE_LATEST_CONFIRMED_NONCE_METHOD: &'static str; - /// Numebr of the runtime method that returns state of "unrewarded relayers" set at the target chain. + /// Number of the runtime method that returns state of "unrewarded relayers" set at the target chain. const INBOUND_LANE_UNREWARDED_RELAYERS_STATE: &'static str; /// Name of the runtime method that returns id of best finalized source header at target chain. diff --git a/bridges/relays/bin-substrate/src/on_demand_headers.rs b/bridges/relays/bin-substrate/src/on_demand_headers.rs index 58ef268a29f7..4a2b04328b86 100644 --- a/bridges/relays/bin-substrate/src/on_demand_headers.rs +++ b/bridges/relays/bin-substrate/src/on_demand_headers.rs @@ -248,7 +248,7 @@ async fn background_task( } } -/// Returns `Some()` with inclusive range of headers which must be scanned for manadatory headers +/// Returns `Some()` with inclusive range of headers which must be scanned for mandatory headers /// and the first of such headers must be submitted to the target node. async fn mandatory_headers_scan_range( best_finalized_source_header_at_source: Option, diff --git a/bridges/relays/client-substrate/src/chain.rs b/bridges/relays/client-substrate/src/chain.rs index 4cc8a0394d9a..886b1bde1ce6 100644 --- a/bridges/relays/client-substrate/src/chain.rs +++ b/bridges/relays/client-substrate/src/chain.rs @@ -56,7 +56,7 @@ pub trait Chain: ChainBase + Clone { type Call: Dispatchable + Debug; /// Balance of an account in native tokens. /// - /// The chain may suport multiple tokens, but this particular type is for token that is used + /// The chain may support multiple tokens, but this particular type is for token that is used /// to pay for transaction dispatch, to reward different relayers (headers, messages), etc. type Balance: Parameter + Member + DeserializeOwned + Clone + Copy + CheckedSub + PartialOrd + SaturatingAdd + Zero; } diff --git a/bridges/relays/client-substrate/src/client.rs b/bridges/relays/client-substrate/src/client.rs index f0b7158ecbe3..e4f503b91752 100644 --- a/bridges/relays/client-substrate/src/client.rs +++ b/bridges/relays/client-substrate/src/client.rs @@ -79,7 +79,7 @@ impl std::fmt::Debug for Client { impl Client { /// Returns client that is able to call RPCs on Substrate node over websocket connection. /// - /// This function will keep connecting to given Sustrate node until connection is established + /// This function will keep connecting to given Substrate node until connection is established /// and is functional. If attempt fail, it will wait for `RECONNECT_DELAY` and retry again. pub async fn new(params: ConnectionParams) -> Self { loop { @@ -224,7 +224,7 @@ impl Client { /// Get the nonce of the given Substrate account. /// - /// Note: It's the caller's responsibility to make sure `account` is a valid ss58 address. + /// Note: It's the caller's responsibility to make sure `account` is a valid SS58 address. pub async fn next_account_index(&self, account: C::AccountId) -> Result { Ok(Substrate::::system_account_next_index(&*self.client, account).await?) } diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 27dc1a000206..d52b547a9b3f 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-cli" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] description = "Polkadot Relay-chain Client Node" edition = "2018" @@ -36,7 +36,7 @@ sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } [features] -default = [ "wasmtime", "db", "cli", "full-node", "trie-memory-tracker" ] +default = [ "wasmtime", "db", "cli", "full-node", "trie-memory-tracker", "polkadot-native" ] wasmtime = [ "sc-cli/wasmtime" ] db = [ "service/db" ] cli = [ @@ -46,22 +46,16 @@ cli = [ "frame-benchmarking-cli", "try-runtime-cli", "polkadot-node-core-pvf", -# memory stats require jemalloc, which we know is enabled for Linux -# but not present on wasm or windows -# https://github.com/paritytech/parity-common/blob/master/parity-util-mem/src/allocators.rs#L9-L34 -# Once -# https://github.com/rust-lang/cargo/issues/1197 -# is resolved. - "service/memory-stats", ] runtime-benchmarks = [ "service/runtime-benchmarks" ] trie-memory-tracker = [ "sp-trie/memory-tracker" ] full-node = [ "service/full-node" ] try-runtime = [ "service/try-runtime" ] -# Configure the native runtimes to use. Polkadot is always enabled by default. +# Configure the native runtimes to use. Polkadot is enabled by default. # # Validators require the native runtime currently +polkadot-native = [ "service/polkadot-native" ] kusama-native = [ "service/kusama-native" ] westend-native = [ "service/westend-native" ] rococo-native = [ "service/rococo-native" ] diff --git a/cli/src/command.rs b/cli/src/command.rs index 64a10c9a1fd9..c9ba571e828c 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -102,8 +102,11 @@ impl SubstrateCli for Cli { name if name.starts_with("kusama-") && !name.ends_with(".json") => Err(format!("`{}` only supported with `kusama-native` feature enabled.", name))?, "polkadot" => Box::new(service::chain_spec::polkadot_config()?), + #[cfg(feature = "polkadot-native")] "polkadot-dev" | "dev" => Box::new(service::chain_spec::polkadot_development_config()?), + #[cfg(feature = "polkadot-native")] "polkadot-local" => Box::new(service::chain_spec::polkadot_local_testnet_config()?), + #[cfg(feature = "polkadot-native")] "polkadot-staging" => Box::new(service::chain_spec::polkadot_staging_testnet_config()?), "rococo" => Box::new(service::chain_spec::rococo_config()?), #[cfg(feature = "rococo-native")] @@ -177,7 +180,13 @@ impl SubstrateCli for Cli { )))] let _ = spec; - &service::polkadot_runtime::VERSION + #[cfg(feature = "polkadot-native")] + { + return &service::polkadot_runtime::VERSION + } + + #[cfg(not(feature = "polkadot-native"))] + panic!("No runtime feature (polkadot, kusama, westend, rococo) is enabled") } } @@ -394,12 +403,17 @@ pub fn run() -> Result<()> { } // else we assume it is polkadot. - Ok(runner.sync_run(|config| { - cmd.run::( - config, - ) - .map_err(|e| Error::SubstrateCli(e)) - })?) + #[cfg(feature = "polkadot-native")] + { + return Ok(runner.sync_run(|config| { + cmd.run::( + config, + ) + .map_err(|e| Error::SubstrateCli(e)) + })?) + } + #[cfg(not(feature = "polkadot-native"))] + panic!("No runtime feature (polkadot, kusama, westend, rococo) is enabled") }, Some(Subcommand::Key(cmd)) => Ok(cmd.run(&cli)?), #[cfg(feature = "try-runtime")] @@ -410,9 +424,8 @@ pub fn run() -> Result<()> { use sc_service::TaskManager; let registry = &runner.config().prometheus_config.as_ref().map(|cfg| &cfg.registry); - let task_manager = - TaskManager::new(runner.config().task_executor.clone(), *registry) - .map_err(|e| Error::SubstrateService(sc_service::Error::Prometheus(e)))?; + let task_manager = TaskManager::new(runner.config().tokio_handle.clone(), *registry) + .map_err(|e| Error::SubstrateService(sc_service::Error::Prometheus(e)))?; ensure_dev(chain_spec).map_err(Error::Other)?; @@ -442,15 +455,20 @@ pub fn run() -> Result<()> { }) } // else we assume it is polkadot. - runner.async_run(|config| { - Ok(( - cmd.run::( - config, - ) - .map_err(Error::SubstrateCli), - task_manager, - )) - }) + #[cfg(feature = "polkadot-native")] + { + return runner.async_run(|config| { + Ok(( + cmd.run::( + config, + ) + .map_err(Error::SubstrateCli), + task_manager, + )) + }) + } + #[cfg(not(feature = "polkadot-native"))] + panic!("No runtime feature (polkadot, kusama, westend, rococo) is enabled") }, #[cfg(not(feature = "try-runtime"))] Some(Subcommand::TryRuntime) => Err(Error::Other( diff --git a/cli/src/lib.rs b/cli/src/lib.rs index bdd230fa2b5a..c07722d97540 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -23,12 +23,13 @@ mod cli; #[cfg(feature = "cli")] mod command; -pub use service::{ - self, Block, CoreApi, IdentifyVariant, ProvideRuntimeApi, RuntimeApiCollection, TFullClient, -}; +#[cfg(feature = "full-node")] +pub use service::RuntimeApiCollection; +#[cfg(feature = "service")] +pub use service::{self, Block, CoreApi, IdentifyVariant, ProvideRuntimeApi, TFullClient}; #[cfg(feature = "malus")] -pub use service::create_default_subsystems; +pub use service::overseer::prepared_overseer_builder; #[cfg(feature = "cli")] pub use cli::*; diff --git a/core-primitives/Cargo.toml b/core-primitives/Cargo.toml index e40196ec559f..e3c1a5e8d478 100644 --- a/core-primitives/Cargo.toml +++ b/core-primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-core-primitives" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" @@ -8,15 +8,18 @@ edition = "2018" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -parity-scale-codec = { version = "2.0.0", default-features = false, features = [ "derive" ] } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = [ "derive" ] } parity-util-mem = { version = "0.10.0", default-features = false, optional = true } [features] default = [ "std" ] std = [ + "scale-info/std", "sp-core/std", "sp-runtime/std", "sp-std/std", + "scale-info/std", "parity-scale-codec/std", "parity-util-mem", ] diff --git a/core-primitives/src/lib.rs b/core-primitives/src/lib.rs index f0313b95d0d1..c00548e57c3c 100644 --- a/core-primitives/src/lib.rs +++ b/core-primitives/src/lib.rs @@ -23,6 +23,7 @@ use parity_scale_codec::{Decode, Encode}; #[cfg(feature = "std")] use parity_util_mem::MallocSizeOf; +use scale_info::TypeInfo; use sp_runtime::{ generic, traits::{IdentifyAccount, Verify}, @@ -64,7 +65,7 @@ pub type Hash = sp_core::H256; /// This type is produced by [`CandidateReceipt::hash`]. /// /// This type makes it easy to enforce that a hash is a candidate hash on the type level. -#[derive(Clone, Copy, Encode, Decode, Hash, Eq, PartialEq, Default, PartialOrd, Ord)] +#[derive(Clone, Copy, Encode, Decode, Hash, Eq, PartialEq, Default, PartialOrd, Ord, TypeInfo)] #[cfg_attr(feature = "std", derive(MallocSizeOf))] pub struct CandidateHash(pub Hash); @@ -117,7 +118,7 @@ pub type DownwardMessage = sp_std::vec::Vec; /// A wrapped version of `DownwardMessage`. The difference is that it has attached the block number when /// the message was sent. -#[derive(Encode, Decode, Clone, sp_runtime::RuntimeDebug, PartialEq)] +#[derive(Encode, Decode, Clone, sp_runtime::RuntimeDebug, PartialEq, TypeInfo)] #[cfg_attr(feature = "std", derive(MallocSizeOf))] pub struct InboundDownwardMessage { /// The block number at which these messages were put into the downward message queue. @@ -127,7 +128,7 @@ pub struct InboundDownwardMessage { } /// An HRMP message seen from the perspective of a recipient. -#[derive(Encode, Decode, Clone, sp_runtime::RuntimeDebug, PartialEq)] +#[derive(Encode, Decode, Clone, sp_runtime::RuntimeDebug, PartialEq, TypeInfo)] #[cfg_attr(feature = "std", derive(MallocSizeOf))] pub struct InboundHrmpMessage { /// The block number at which this message was sent. @@ -139,7 +140,7 @@ pub struct InboundHrmpMessage { } /// An HRMP message seen from the perspective of a sender. -#[derive(Encode, Decode, Clone, sp_runtime::RuntimeDebug, PartialEq, Eq, Hash)] +#[derive(Encode, Decode, Clone, sp_runtime::RuntimeDebug, PartialEq, Eq, Hash, TypeInfo)] #[cfg_attr(feature = "std", derive(MallocSizeOf))] pub struct OutboundHrmpMessage { /// The para that will get this message in its downward message queue. diff --git a/doc/docker.md b/doc/docker.md index b5cafd7ef420..0ffe6ef09aea 100644 --- a/doc/docker.md +++ b/doc/docker.md @@ -4,9 +4,9 @@ The easiest/faster option to run Polkadot in Docker is to use the latest release images. These are small images that use the latest official release of the Polkadot binary, pulled from our package repository. -**_Following examples are running on westend chain and without SSL. They can be used to quick start and learn how Polkadot needs to be configured. Please find out how to secure your node, if you want to operate it on the internet. Do not expose rpc and ws ports, if they are not correctly configured._** +**_Following examples are running on westend chain and without SSL. They can be used to quick start and learn how Polkadot needs to be configured. Please find out how to secure your node, if you want to operate it on the internet. Do not expose RPC and WS ports, if they are not correctly configured._** -Let´s first check the version we have. The first time you run this command, the Polkadot docker image will be downloaded. This takes a bit of time and bandwidth, be patient: +Let's first check the version we have. The first time you run this command, the Polkadot docker image will be downloaded. This takes a bit of time and bandwidth, be patient: ```bash docker run --rm -it parity/polkadot:latest --version @@ -65,7 +65,7 @@ services: ] ``` -With following docker-compose.yml you can set up a node and use polkadot-js-apps as the front end on port 80. After starting the node use a browser and enter your Docker host ip in the url field: __ +With following docker-compose.yml you can set up a node and use polkadot-js-apps as the front end on port 80. After starting the node use a browser and enter your Docker host IP in the URL field: __ ```bash version: '2' @@ -118,7 +118,7 @@ To get up and running with the smallest footprint on your system, you may use th You can build it yourself (it takes a while...) in the shell session of the daemon: ```bash -cd docker +cd scripts/docker/polkadot ./build.sh ``` diff --git a/doc/testing.md b/doc/testing.md index 8230ea352c0f..6709d1b9bdeb 100644 --- a/doc/testing.md +++ b/doc/testing.md @@ -185,6 +185,7 @@ struct BehaveMaleficient; impl OverseerGen for BehaveMaleficient { fn generate<'a, Spawner, RuntimeClient>( &self, + connector: OverseerConnector, args: OverseerGenArgs<'a, Spawner, RuntimeClient>, ) -> Result<(Overseer>, OverseerHandler), Error> where @@ -213,7 +214,7 @@ impl OverseerGen for BehaveMaleficient { ), ); - Overseer::new(leaves, all_subsystems, registry, runtime_client, spawner) + Overseer::new(leaves, all_subsystems, registry, runtime_client, spawner, connector) .map_err(|e| e.into()) // A builder pattern will simplify this further diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index ce094338781f..000000000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM paritytech/ci-linux:production as builder -LABEL description="This is the build stage for Polkadot. Here we create the binary." - -ARG PROFILE=release -WORKDIR /polkadot - -COPY . /polkadot - -RUN cargo build --$PROFILE - -# ===== SECOND STAGE ====== - -FROM debian:buster-slim -LABEL description="This is the 2nd stage: a very small image where we copy the Polkadot binary." -ARG PROFILE=release -COPY --from=builder /polkadot/target/$PROFILE/polkadot /usr/local/bin - -RUN useradd -m -u 1000 -U -s /bin/sh -d /polkadot polkadot && \ - mkdir -p /polkadot/.local/share && \ - mkdir /data && \ - chown -R polkadot:polkadot /data && \ - ln -s /data /polkadot/.local/share/polkadot && \ - rm -rf /usr/bin /usr/sbin - -USER polkadot -EXPOSE 30333 9933 9944 -VOLUME ["/data"] - -CMD ["/usr/local/bin/polkadot"] diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml deleted file mode 100644 index b76d41da1d03..000000000000 --- a/docker/docker-compose.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: '3' -services: - polkadot: - build: - context: . - ports: - - "127.0.0.1:30333:30333/tcp" - - "127.0.0.1:9933:9933/tcp" - image: chevdor/polkadot:latest - volumes: - - "polkadot-data:/data" - command: polkadot - -volumes: - polkadot-data: diff --git a/erasure-coding/Cargo.toml b/erasure-coding/Cargo.toml index f2d9475cc5d1..2cf311f022eb 100644 --- a/erasure-coding/Cargo.toml +++ b/erasure-coding/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-erasure-coding" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" @@ -8,7 +8,7 @@ edition = "2018" polkadot-primitives = { path = "../primitives" } polkadot-node-primitives = { package = "polkadot-node-primitives", path = "../node/primitives" } novelpoly = { package = "reed-solomon-novelpoly", version = "1.0.0" } -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["std", "derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["std", "derive"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } trie = { package = "sp-trie", git = "https://github.com/paritytech/substrate", branch = "master" } thiserror = "1.0.26" diff --git a/erasure-coding/fuzzer/Cargo.toml b/erasure-coding/fuzzer/Cargo.toml index f1bc4fb047ab..cf2e512e861e 100644 --- a/erasure-coding/fuzzer/Cargo.toml +++ b/erasure-coding/fuzzer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "erasure_coding_fuzzer" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" diff --git a/node/client/src/lib.rs b/node/client/src/lib.rs index 4c4ff100820d..d9166bb50c60 100644 --- a/node/client/src/lib.rs +++ b/node/client/src/lib.rs @@ -40,9 +40,19 @@ pub type FullBackend = sc_service::TFullBackend; pub type FullClient = sc_service::TFullClient>; +#[cfg(not(any( + feature = "rococo", + feature = "kusama", + feature = "westend", + feature = "polkadot" +)))] +compile_error!("at least one runtime feature must be enabled"); + /// The native executor instance for Polkadot. +#[cfg(feature = "polkadot")] pub struct PolkadotExecutorDispatch; +#[cfg(feature = "polkadot")] impl sc_executor::NativeExecutionDispatch for PolkadotExecutorDispatch { type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; @@ -233,6 +243,7 @@ macro_rules! with_client { } } => { match $self { + #[cfg(feature = "polkadot")] Self::Polkadot($client) => { $( $code )* }, #[cfg(feature = "westend")] Self::Westend($client) => { $( $code )* }, @@ -249,6 +260,7 @@ macro_rules! with_client { /// See [`ExecuteWithClient`] for more information. #[derive(Clone)] pub enum Client { + #[cfg(feature = "polkadot")] Polkadot(Arc>), #[cfg(feature = "westend")] Westend(Arc>), diff --git a/node/collation-generation/Cargo.toml b/node/collation-generation/Cargo.toml index ac7281a97117..9ff9621fcbf8 100644 --- a/node/collation-generation/Cargo.toml +++ b/node/collation-generation/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "polkadot-node-collation-generation" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.3.17" -tracing = "0.1.26" +tracing = "0.1.28" polkadot-erasure-coding = { path = "../../erasure-coding" } polkadot-node-primitives = { path = "../primitives" } polkadot-node-subsystem = { path = "../subsystem" } @@ -15,7 +15,7 @@ polkadot-primitives = { path = "../../primitives" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-maybe-compressed-blob = { git = "https://github.com/paritytech/substrate", branch = "master" } thiserror = "1.0.26" -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["bit-vec", "derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["bit-vec", "derive"] } [dev-dependencies] polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } diff --git a/node/core/approval-voting/Cargo.toml b/node/core/approval-voting/Cargo.toml index afbf184a0603..2b12c4279210 100644 --- a/node/core/approval-voting/Cargo.toml +++ b/node/core/approval-voting/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "polkadot-node-core-approval-voting" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.3.17" futures-timer = "3.0.2" -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["bit-vec", "derive"] } -tracing = "0.1.26" +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["bit-vec", "derive"] } +tracing = "0.1.28" bitvec = { version = "0.20.1", default-features = false, features = ["alloc"] } lru = "0.6" merlin = "2.0" diff --git a/node/core/approval-voting/src/approval_checking.rs b/node/core/approval-voting/src/approval_checking.rs index 17a5cda64c87..d681e67eb853 100644 --- a/node/core/approval-voting/src/approval_checking.rs +++ b/node/core/approval-voting/src/approval_checking.rs @@ -58,6 +58,8 @@ pub enum RequiredTranches { /// event that there are some assignments that don't have corresponding approval votes. If this /// is `None`, all assignments have approvals. next_no_show: Option, + /// The last tick at which a needed assignment was received. + last_assignment_tick: Option, }, } @@ -66,18 +68,22 @@ pub enum RequiredTranches { pub enum Check { /// The candidate is unapproved. Unapproved, - /// The candidate is approved, with the given amount of no-shows. - Approved(usize), + /// The candidate is approved, with the given amount of no-shows, + /// with the last counted assignment being received at the given + /// tick. + Approved(usize, Option), /// The candidate is approved by one third of all validators. ApprovedOneThird, } impl Check { - /// Whether the candidate is approved. - pub fn is_approved(&self) -> bool { + /// Whether the candidate is approved and all relevant assignments + /// have at most the given assignment tick. + pub fn is_approved(&self, max_assignment_tick: Tick) -> bool { match *self { Check::Unapproved => false, - Check::Approved(_) => true, + Check::Approved(_, last_assignment_tick) => + last_assignment_tick.map_or(true, |t| t <= max_assignment_tick), Check::ApprovedOneThird => true, } } @@ -85,7 +91,7 @@ impl Check { /// The number of known no-shows in this computation. pub fn known_no_shows(&self) -> usize { match *self { - Check::Approved(n) => n, + Check::Approved(n, _) => n, _ => 0, } } @@ -107,7 +113,7 @@ pub fn check_approval( match required { RequiredTranches::Pending { .. } => Check::Unapproved, RequiredTranches::All => Check::Unapproved, - RequiredTranches::Exact { needed, tolerated_missing, .. } => { + RequiredTranches::Exact { needed, tolerated_missing, last_assignment_tick, .. } => { // whether all assigned validators up to `needed` less no_shows have approved. // e.g. if we had 5 tranches and 1 no-show, we would accept all validators in // tranches 0..=5 except for 1 approving. In that example, we also accept all @@ -130,7 +136,7 @@ pub fn check_approval( // that will surpass a minimum amount of checks. // shouldn't typically go above, since all no-shows are supposed to be covered. if n_approved + tolerated_missing >= n_assigned { - Check::Approved(tolerated_missing) + Check::Approved(tolerated_missing, last_assignment_tick) } else { Check::Unapproved } @@ -170,6 +176,8 @@ struct State { uncovered: usize, /// The next tick at which a no-show would occur, if any. next_no_show: Option, + /// The last tick at which a considered assignment was received. + last_assignment_tick: Option, } impl State { @@ -192,6 +200,7 @@ impl State { needed: tranche, tolerated_missing: self.covered, next_no_show: self.next_no_show, + last_assignment_tick: self.last_assignment_tick, } } @@ -226,6 +235,7 @@ impl State { new_assignments: usize, new_no_shows: usize, next_no_show: Option, + last_assignment_tick: Option, ) -> State { let new_covered = if self.depth == 0 { new_assignments @@ -246,6 +256,7 @@ impl State { }; let uncovered = self.uncovered + new_no_shows; let next_no_show = super::min_prefer_some(self.next_no_show, next_no_show); + let last_assignment_tick = std::cmp::max(self.last_assignment_tick, last_assignment_tick); let (depth, covering, uncovered) = if covering == 0 { if uncovered == 0 { @@ -257,7 +268,15 @@ impl State { (self.depth, covering, uncovered) }; - State { assignments, depth, covered, covering, uncovered, next_no_show } + State { + assignments, + depth, + covered, + covering, + uncovered, + next_no_show, + last_assignment_tick, + } } } @@ -296,6 +315,11 @@ fn filled_tranche_iterator<'a>( /// and tick parameters. This method also returns the next tick at which a `no_show` will occur /// amongst the set of validators that have not submitted an approval. /// +/// This also bounds the earliest tick of all assignments to be equal to the +/// block tick for the purposes of the calculation, so no assignment can be treated +/// as being received before the block itself. This is unlikely if not impossible +/// in practice, but can occur during test code. +/// /// If the returned `next_no_show` is not None, there are two possible cases for the value of /// based on the earliest assignment `tick` of a non-approving, yet-to-be-no-show validator: /// - if `tick` <= `clock_drift`: the value will always be `clock_drift` + `no_show_duration`. @@ -304,13 +328,16 @@ fn count_no_shows( assignments: &[(ValidatorIndex, Tick)], approvals: &BitSlice, clock_drift: Tick, + block_tick: Tick, no_show_duration: Tick, drifted_tick_now: Tick, ) -> (usize, Option) { let mut next_no_show = None; let no_shows = assignments .iter() - .map(|(v_index, tick)| (v_index, tick.saturating_sub(clock_drift) + no_show_duration)) + .map(|(v_index, tick)| { + (v_index, tick.max(&block_tick).saturating_sub(clock_drift) + no_show_duration) + }) .filter(|&(v_index, no_show_at)| { let has_approved = if let Some(approved) = approvals.get(v_index.0 as usize) { *approved @@ -356,6 +383,7 @@ pub fn tranches_to_approve( covering: needed_approvals, uncovered: 0, next_no_show: None, + last_assignment_tick: None, }; // The `ApprovalEntry` doesn't have any data for empty tranches. We still want to iterate over @@ -384,6 +412,11 @@ pub fn tranches_to_approve( .filter(|(v_index, _)| v_index.0 < n_validators as u32) .count(); + // Get the latest tick of valid validator assignments. + let last_assignment_tick = assignments.iter() + .map(|(_, t)| *t) + .max(); + // count no-shows. An assignment is a no-show if there is no corresponding approval vote // after a fixed duration. // @@ -393,11 +426,12 @@ pub fn tranches_to_approve( assignments, approvals, clock_drift, + block_tick, no_show_duration, drifted_tick_now, ); - let s = s.advance(n_assignments, no_shows, next_no_show); + let s = s.advance(n_assignments, no_shows, next_no_show, last_assignment_tick); let output = s.output(tranche, needed_approvals, n_validators, no_show_duration); *state = match output { @@ -459,7 +493,7 @@ mod tests { clock_drift: 0, }, ) - .is_approved()); + .is_approved(Tick::max_value())); } #[test] @@ -502,21 +536,36 @@ mod tests { assert!(check_approval( &candidate, &approval_entry, - RequiredTranches::Exact { needed: 0, tolerated_missing: 0, next_no_show: None }, + RequiredTranches::Exact { + needed: 0, + tolerated_missing: 0, + next_no_show: None, + last_assignment_tick: None + }, ) - .is_approved()); + .is_approved(Tick::max_value())); assert!(!check_approval( &candidate, &approval_entry, - RequiredTranches::Exact { needed: 1, tolerated_missing: 0, next_no_show: None }, + RequiredTranches::Exact { + needed: 1, + tolerated_missing: 0, + next_no_show: None, + last_assignment_tick: None + }, ) - .is_approved()); + .is_approved(Tick::max_value())); assert!(check_approval( &candidate, &approval_entry, - RequiredTranches::Exact { needed: 1, tolerated_missing: 2, next_no_show: None }, + RequiredTranches::Exact { + needed: 1, + tolerated_missing: 2, + next_no_show: None, + last_assignment_tick: None + }, ) - .is_approved()); + .is_approved(Tick::max_value())); } #[test] @@ -556,8 +605,12 @@ mod tests { } .into(); - let exact_all = - RequiredTranches::Exact { needed: 10, tolerated_missing: 0, next_no_show: None }; + let exact_all = RequiredTranches::Exact { + needed: 10, + tolerated_missing: 0, + next_no_show: None, + last_assignment_tick: None, + }; let pending_all = RequiredTranches::Pending { considered: 5, @@ -566,25 +619,32 @@ mod tests { clock_drift: 12, }; - assert!(!check_approval(&candidate, &approval_entry, RequiredTranches::All,).is_approved()); + assert!(!check_approval(&candidate, &approval_entry, RequiredTranches::All,) + .is_approved(Tick::max_value())); - assert!(!check_approval(&candidate, &approval_entry, exact_all.clone(),).is_approved()); + assert!(!check_approval(&candidate, &approval_entry, exact_all.clone(),) + .is_approved(Tick::max_value())); - assert!(!check_approval(&candidate, &approval_entry, pending_all.clone(),).is_approved()); + assert!(!check_approval(&candidate, &approval_entry, pending_all.clone(),) + .is_approved(Tick::max_value())); // This creates a set of 4/10 approvals, which is always an approval. candidate.mark_approval(ValidatorIndex(3)); - assert!(check_approval(&candidate, &approval_entry, RequiredTranches::All,).is_approved()); + assert!(check_approval(&candidate, &approval_entry, RequiredTranches::All,) + .is_approved(Tick::max_value())); - assert!(check_approval(&candidate, &approval_entry, exact_all,).is_approved()); + assert!( + check_approval(&candidate, &approval_entry, exact_all,).is_approved(Tick::max_value()) + ); - assert!(check_approval(&candidate, &approval_entry, pending_all,).is_approved()); + assert!(check_approval(&candidate, &approval_entry, pending_all,) + .is_approved(Tick::max_value())); } #[test] fn tranches_to_approve_everyone_present() { - let block_tick = 0; + let block_tick = 20; let no_show_duration = 10; let needed_approvals = 4; @@ -617,7 +677,12 @@ mod tests { no_show_duration, needed_approvals, ), - RequiredTranches::Exact { needed: 1, tolerated_missing: 0, next_no_show: None }, + RequiredTranches::Exact { + needed: 1, + tolerated_missing: 0, + next_no_show: None, + last_assignment_tick: Some(21) + }, ); } @@ -820,6 +885,7 @@ mod tests { needed: 1, tolerated_missing: 0, next_no_show: Some(block_tick + no_show_duration + 1), + last_assignment_tick: Some(block_tick + 1), }, ); @@ -838,6 +904,7 @@ mod tests { needed: 2, tolerated_missing: 1, next_no_show: Some(block_tick + 2 * no_show_duration + 2), + last_assignment_tick: Some(block_tick + no_show_duration + 2), }, ); @@ -905,7 +972,12 @@ mod tests { no_show_duration, needed_approvals, ), - RequiredTranches::Exact { needed: 2, tolerated_missing: 1, next_no_show: None }, + RequiredTranches::Exact { + needed: 2, + tolerated_missing: 1, + next_no_show: None, + last_assignment_tick: Some(block_tick + no_show_duration + 2) + }, ); // Even though tranche 2 has 2 validators, it only covers 1 no-show. @@ -943,7 +1015,12 @@ mod tests { no_show_duration, needed_approvals, ), - RequiredTranches::Exact { needed: 3, tolerated_missing: 2, next_no_show: None }, + RequiredTranches::Exact { + needed: 3, + tolerated_missing: 2, + next_no_show: None, + last_assignment_tick: Some(block_tick + no_show_duration + 2), + }, ); } @@ -1059,6 +1136,7 @@ mod tests { fn test_count_no_shows(test: NoShowTest) { let n_validators = 4; + let block_tick = 20; let mut approvals = bitvec![BitOrderLsb0, u8; 0; n_validators]; for &v_index in &test.approvals { @@ -1069,6 +1147,7 @@ mod tests { &test.assignments, &approvals, test.clock_drift, + block_tick, test.no_show_duration, test.drifted_tick_now, ); @@ -1092,13 +1171,13 @@ mod tests { #[test] fn count_no_shows_single_validator_is_next_no_show() { test_count_no_shows(NoShowTest { - assignments: vec![(ValidatorIndex(1), 21)], + assignments: vec![(ValidatorIndex(1), 31)], approvals: vec![], clock_drift: 10, no_show_duration: 10, drifted_tick_now: 20, exp_no_shows: 0, - exp_next_no_show: Some(31), + exp_next_no_show: Some(41), }) } @@ -1131,26 +1210,26 @@ mod tests { #[test] fn count_no_shows_two_validators_next_no_show_ordered_first() { test_count_no_shows(NoShowTest { - assignments: vec![(ValidatorIndex(1), 21), (ValidatorIndex(2), 22)], + assignments: vec![(ValidatorIndex(1), 31), (ValidatorIndex(2), 32)], approvals: vec![], clock_drift: 10, no_show_duration: 10, drifted_tick_now: 20, exp_no_shows: 0, - exp_next_no_show: Some(31), + exp_next_no_show: Some(41), }) } #[test] fn count_no_shows_two_validators_next_no_show_ordered_last() { test_count_no_shows(NoShowTest { - assignments: vec![(ValidatorIndex(1), 22), (ValidatorIndex(2), 21)], + assignments: vec![(ValidatorIndex(1), 32), (ValidatorIndex(2), 31)], approvals: vec![], clock_drift: 10, no_show_duration: 10, drifted_tick_now: 20, exp_no_shows: 0, - exp_next_no_show: Some(31), + exp_next_no_show: Some(41), }) } @@ -1158,16 +1237,16 @@ mod tests { fn count_no_shows_three_validators_one_almost_late_one_no_show_one_approving() { test_count_no_shows(NoShowTest { assignments: vec![ - (ValidatorIndex(1), 21), - (ValidatorIndex(2), 20), - (ValidatorIndex(3), 20), + (ValidatorIndex(1), 31), + (ValidatorIndex(2), 19), + (ValidatorIndex(3), 19), ], approvals: vec![3], clock_drift: 10, no_show_duration: 10, drifted_tick_now: 20, exp_no_shows: 1, - exp_next_no_show: Some(31), + exp_next_no_show: Some(41), }) } @@ -1214,7 +1293,7 @@ mod tests { no_show_duration: 20, drifted_tick_now: 0, exp_no_shows: 0, - exp_next_no_show: Some(30), + exp_next_no_show: Some(40), }) } @@ -1227,7 +1306,7 @@ mod tests { no_show_duration: 20, drifted_tick_now: 0, exp_no_shows: 0, - exp_next_no_show: Some(30), + exp_next_no_show: Some(40), }) } @@ -1256,43 +1335,50 @@ mod tests { exp_next_no_show: None, }) } -} - -#[test] -fn depth_0_covering_not_treated_as_such() { - let state = State { - assignments: 0, - depth: 0, - covered: 0, - covering: 10, - uncovered: 0, - next_no_show: None, - }; - assert_eq!( - state.output(0, 10, 10, 20), - RequiredTranches::Pending { - considered: 0, + #[test] + fn depth_0_covering_not_treated_as_such() { + let state = State { + assignments: 0, + depth: 0, + covered: 0, + covering: 10, + uncovered: 0, next_no_show: None, - maximum_broadcast: DelayTranche::max_value(), - clock_drift: 0, - }, - ); -} + last_assignment_tick: None, + }; -#[test] -fn depth_0_issued_as_exact_even_when_all() { - let state = State { - assignments: 10, - depth: 0, - covered: 0, - covering: 0, - uncovered: 0, - next_no_show: None, - }; + assert_eq!( + state.output(0, 10, 10, 20), + RequiredTranches::Pending { + considered: 0, + next_no_show: None, + maximum_broadcast: DelayTranche::max_value(), + clock_drift: 0, + }, + ); + } - assert_eq!( - state.output(0, 10, 10, 20), - RequiredTranches::Exact { needed: 0, tolerated_missing: 0, next_no_show: None }, - ); + #[test] + fn depth_0_issued_as_exact_even_when_all() { + let state = State { + assignments: 10, + depth: 0, + covered: 0, + covering: 0, + uncovered: 0, + next_no_show: None, + last_assignment_tick: None, + }; + + assert_eq!( + state.output(0, 10, 10, 20), + RequiredTranches::Exact { + needed: 0, + tolerated_missing: 0, + next_no_show: None, + last_assignment_tick: None + }, + ); + } } diff --git a/node/core/approval-voting/src/criteria.rs b/node/core/approval-voting/src/criteria.rs index ea88c30e3bc3..21c4bd9f9d0c 100644 --- a/node/core/approval-voting/src/criteria.rs +++ b/node/core/approval-voting/src/criteria.rs @@ -236,6 +236,14 @@ pub(crate) fn compute_assignments( config.assignment_keys.is_empty() || config.validator_groups.is_empty() { + tracing::trace!( + target: LOG_TARGET, + n_cores = config.n_cores, + has_assignment_keys = !config.assignment_keys.is_empty(), + has_validator_groups = !config.validator_groups.is_empty(), + "Not producing assignments because config is degenerate", + ); + return HashMap::new() } @@ -254,7 +262,10 @@ pub(crate) fn compute_assignments( }); match key { - None => return Default::default(), + None => { + tracing::trace!(target: LOG_TARGET, "No assignment key"); + return Default::default() + }, Some(k) => k, } }; @@ -266,6 +277,12 @@ pub(crate) fn compute_assignments( .map(|(c_hash, core, _)| (c_hash, core)) .collect::>(); + tracing::trace!( + target: LOG_TARGET, + assignable_cores = leaving_cores.len(), + "Assigning to candidates from different backing groups" + ); + let assignments_key: &sp_application_crypto::sr25519::Pair = assignments_key.as_ref(); let assignments_key: &schnorrkel::Keypair = assignments_key.as_ref(); diff --git a/node/core/approval-voting/src/import.rs b/node/core/approval-voting/src/import.rs index 52b0211a86ac..710c1ab55cfd 100644 --- a/node/core/approval-voting/src/import.rs +++ b/node/core/approval-voting/src/import.rs @@ -324,7 +324,7 @@ pub(crate) async fn handle_new_head( } }; - match state.session_window.cache_session_info_for_head(ctx, head, &header).await { + match state.session_window.cache_session_info_for_head(ctx, head).await { Err(e) => { tracing::debug!( target: LOG_TARGET, @@ -1236,7 +1236,7 @@ pub(crate) mod tests { h, RuntimeApiRequest::SessionIndexForChild(c_tx), )) => { - assert_eq!(h, parent_hash.clone()); + assert_eq!(h, hash); let _ = c_tx.send(Ok(session)); } ); diff --git a/node/core/approval-voting/src/lib.rs b/node/core/approval-voting/src/lib.rs index 529523b5b8f9..af46ad55fa04 100644 --- a/node/core/approval-voting/src/lib.rs +++ b/node/core/approval-voting/src/lib.rs @@ -27,7 +27,7 @@ use polkadot_node_primitives::{ approval::{ BlockApprovalMeta, DelayTranche, IndirectAssignmentCert, IndirectSignedApprovalVote, }, - SignedDisputeStatement, ValidationResult, + SignedDisputeStatement, ValidationResult, APPROVAL_EXECUTION_TIMEOUT, }; use polkadot_node_subsystem::{ errors::RecoveryError, @@ -96,6 +96,7 @@ const APPROVAL_SESSIONS: SessionIndex = 6; const APPROVAL_CHECKING_TIMEOUT: Duration = Duration::from_secs(120); const APPROVAL_CACHE_SIZE: usize = 1024; const TICK_TOO_FAR_IN_FUTURE: Tick = 20; // 10 seconds. +const APPROVAL_DELAY: Tick = 2; const LOG_TARGET: &str = "parachain::approval-voting"; /// Configuration for the approval voting subsystem @@ -694,6 +695,7 @@ where woken_block, woken_candidate, tick, + &subsystem.metrics, )? } next_msg = ctx.recv().fuse() => { @@ -1063,7 +1065,7 @@ async fn handle_from_overseer( Ok(block_imported_candidates) => { // Schedule wakeups for all imported candidates. for block_batch in block_imported_candidates { - tracing::debug!( + tracing::trace!( target: LOG_TARGET, block_hash = ?block_batch.block_hash, num_candidates = block_batch.imported_candidates.len(), @@ -1286,10 +1288,21 @@ async fn handle_approved_ancestor( ); }, Some(a_entry) => { - let n_assignments = a_entry.n_assignments(); - let n_approvals = c_entry.approvals().count_ones(); - let status = || { + let n_assignments = a_entry.n_assignments(); + + // Take the approvals, filtered by the assignments + // for this block. + let n_approvals = c_entry + .approvals() + .iter() + .by_val() + .enumerate() + .filter(|(i, approved)| { + *approved && a_entry.is_assigned(ValidatorIndex(*i as _)) + }) + .count(); + format!( "{}/{}/{}", n_assignments, @@ -1398,13 +1411,21 @@ fn schedule_wakeup_action( block_number: BlockNumber, candidate_hash: CandidateHash, block_tick: Tick, + tick_now: Tick, required_tranches: RequiredTranches, ) -> Option { let maybe_action = match required_tranches { _ if approval_entry.is_approved() => None, RequiredTranches::All => None, - RequiredTranches::Exact { next_no_show, .. } => next_no_show - .map(|tick| Action::ScheduleWakeup { block_hash, block_number, candidate_hash, tick }), + RequiredTranches::Exact { next_no_show, last_assignment_tick, .. } => { + // Take the earlier of the next no show or the last assignment tick + required delay, + // only considering the latter if it is after the current moment. + min_prefer_some( + last_assignment_tick.map(|l| l + APPROVAL_DELAY).filter(|t| t > &tick_now), + next_no_show, + ) + .map(|tick| Action::ScheduleWakeup { block_hash, block_number, candidate_hash, tick }) + }, RequiredTranches::Pending { considered, next_no_show, clock_drift, .. } => { // select the minimum of `next_no_show`, or the tick of the next non-empty tranche // after `considered`, including any tranche that might contain our own untriggered @@ -1585,6 +1606,7 @@ fn check_and_import_assignment( block_entry.block_number(), assigned_candidate_hash, status.block_tick, + tick_now, status.required_tranches, )); } @@ -1710,14 +1732,14 @@ fn check_and_import_approval( None }; - let mut actions = import_checked_approval( + let mut actions = advance_approval_state( state, db, &metrics, block_entry, approved_candidate_hash, candidate_entry, - ApprovalSource::Remote(approval.validator), + ApprovalStateTransition::RemoteApproval(approval.validator), ); actions.extend(inform_disputes_action); @@ -1725,41 +1747,46 @@ fn check_and_import_approval( Ok((actions, t)) } -enum ApprovalSource { - Remote(ValidatorIndex), - Local(ValidatorIndex, ValidatorSignature), +#[derive(Debug)] +enum ApprovalStateTransition { + RemoteApproval(ValidatorIndex), + LocalApproval(ValidatorIndex, ValidatorSignature), + WakeupProcessed, } -impl ApprovalSource { - fn validator_index(&self) -> ValidatorIndex { +impl ApprovalStateTransition { + fn validator_index(&self) -> Option { match *self { - ApprovalSource::Remote(v) | ApprovalSource::Local(v, _) => v, + ApprovalStateTransition::RemoteApproval(v) | + ApprovalStateTransition::LocalApproval(v, _) => Some(v), + ApprovalStateTransition::WakeupProcessed => None, } } - fn is_remote(&self) -> bool { + fn is_local_approval(&self) -> bool { match *self { - ApprovalSource::Remote(_) => true, - ApprovalSource::Local(_, _) => false, + ApprovalStateTransition::RemoteApproval(_) => false, + ApprovalStateTransition::LocalApproval(_, _) => true, + ApprovalStateTransition::WakeupProcessed => false, } } } -// Import an approval vote which is already checked to be valid and corresponding to an assigned -// validator on the candidate and block. This updates the block entry and candidate entry as +// Advance the approval state, either by importing an approval vote which is already checked to be valid and corresponding to an assigned +// validator on the candidate and block, or by noting that there are no further wakeups or tranches needed. This updates the block entry and candidate entry as // necessary and schedules any further wakeups. -fn import_checked_approval( +fn advance_approval_state( state: &State, db: &mut OverlayedBackend<'_, impl Backend>, metrics: &Metrics, mut block_entry: BlockEntry, candidate_hash: CandidateHash, mut candidate_entry: CandidateEntry, - source: ApprovalSource, + transition: ApprovalStateTransition, ) -> Vec { - let validator_index = source.validator_index(); + let validator_index = transition.validator_index(); - let already_approved_by = candidate_entry.mark_approval(validator_index); + let already_approved_by = validator_index.as_ref().map(|v| candidate_entry.mark_approval(*v)); let candidate_approved_in_block = block_entry.is_candidate_approved(&candidate_hash); // Check for early exits. @@ -1771,23 +1798,21 @@ fn import_checked_approval( // If the block was approved, but the validator hadn't approved it yet, we should still hold // onto the approval vote on-disk in case we restart and rebroadcast votes. Otherwise, our // assignment might manifest as a no-show. - match source { - ApprovalSource::Remote(_) => { - // We don't store remote votes, so we can early exit as long at the candidate is - // already concluded under the block i.e. we don't need more approvals. - if candidate_approved_in_block { - return Vec::new() - } - }, - ApprovalSource::Local(_, _) => { - // We never early return on the local validator. - }, + if !transition.is_local_approval() { + // We don't store remote votes and there's nothing to store for processed wakeups, + // so we can early exit as long at the candidate is already concluded under the + // block i.e. we don't need more approvals. + if candidate_approved_in_block { + return Vec::new() + } } let mut actions = Vec::new(); let block_hash = block_entry.block_hash(); let block_number = block_entry.block_number(); + let tick_now = state.clock.tick_now(); + let (is_approved, status) = if let Some((approval_entry, status)) = state.approval_status(&block_entry, &candidate_entry) { @@ -1797,7 +1822,10 @@ fn import_checked_approval( status.required_tranches.clone(), ); - let is_approved = check.is_approved(); + // Check whether this is approved, while allowing a maximum + // assignment tick of `now - APPROVAL_DELAY` - that is, that + // all counted assignments are at least `APPROVAL_DELAY` ticks old. + let is_approved = check.is_approved(tick_now.saturating_sub(APPROVAL_DELAY)); if is_approved { tracing::trace!( @@ -1852,7 +1880,7 @@ fn import_checked_approval( approval_entry.mark_approved(); } - if let ApprovalSource::Local(_, ref sig) = source { + if let ApprovalStateTransition::LocalApproval(_, ref sig) = transition { approval_entry.import_approval_sig(sig.clone()); } @@ -1862,16 +1890,19 @@ fn import_checked_approval( block_number, candidate_hash, status.block_tick, + tick_now, status.required_tranches, )); - // We have no need to write the candidate entry if + // We have no need to write the candidate entry if all of the following + // is true: // - // 1. The source is remote, as we don't store anything new in the approval entry. + // 1. This is not a local approval, as we don't store anything new in the approval entry. // 2. The candidate is not newly approved, as we haven't altered the approval entry's // approved flag with `mark_approved` above. - // 3. The source had already approved the candidate, as we haven't altered the bitfield. - if !source.is_remote() || newly_approved || !already_approved_by { + // 3. The approver, if any, had already approved the candidate, as we haven't altered the bitfield. + if transition.is_local_approval() || newly_approved || !already_approved_by.unwrap_or(true) + { // In all other cases, we need to write the candidate entry. db.write_candidate_entry(candidate_entry); } @@ -1889,6 +1920,7 @@ fn should_trigger_assignment( match approval_entry.our_assignment() { None => false, Some(ref assignment) if assignment.triggered() => false, + Some(ref assignment) if assignment.tranche() == 0 => true, Some(ref assignment) => { match required_tranches { RequiredTranches::All => !approval_checking::check_approval( @@ -1896,7 +1928,7 @@ fn should_trigger_assignment( &approval_entry, RequiredTranches::All, ) - .is_approved(), + .is_approved(Tick::max_value()), // when all are required, we are just waiting for the first 1/3+ RequiredTranches::Pending { maximum_broadcast, clock_drift, .. } => { let drifted_tranche_now = tranche_now.saturating_sub(clock_drift as DelayTranche); @@ -1918,6 +1950,7 @@ fn process_wakeup( relay_block: Hash, candidate_hash: CandidateHash, expected_tick: Tick, + metrics: &Metrics, ) -> SubsystemResult> { let _span = jaeger::Span::from_encodable( (relay_block, candidate_hash, expected_tick), @@ -2040,28 +2073,20 @@ fn process_wakeup( } } - let approval_entry = candidate_entry - .approval_entry(&relay_block) - .expect("this function returned earlier if not available; qed"); - - // Although we ran this earlier in the function, we need to run again because we might have - // imported our own assignment, which could change things. - let tranches_to_approve = approval_checking::tranches_to_approve( - &approval_entry, - candidate_entry.approvals(), - tranche_now, - block_tick, - no_show_duration, - session_info.needed_approvals as _, - ); - - actions.extend(schedule_wakeup_action( - &approval_entry, - relay_block, - block_entry.block_number(), + // Although we checked approval earlier in this function, + // this wakeup might have advanced the state to approved via + // a no-show that was immediately covered and therefore + // we need to check for that and advance the state on-disk. + // + // Note that this function also schedules a wakeup as necessary. + actions.extend(advance_approval_state( + state, + db, + metrics, + block_entry, candidate_hash, - block_tick, - tranches_to_approve, + candidate_entry, + ApprovalStateTransition::WakeupProcessed, )); Ok(actions) @@ -2210,6 +2235,7 @@ async fn launch_approval( validation_code, candidate.descriptor.clone(), available_data.pov, + APPROVAL_EXECUTION_TIMEOUT, val_tx, ) .into(), @@ -2410,7 +2436,7 @@ async fn issue_approval( ) .expect("Statement just signed; should pass checks; qed"); - tracing::debug!( + tracing::trace!( target: LOG_TARGET, ?candidate_hash, ?block_hash, @@ -2436,14 +2462,14 @@ async fn issue_approval( None }; - let mut actions = import_checked_approval( + let mut actions = advance_approval_state( state, db, metrics, block_entry, candidate_hash, candidate_entry, - ApprovalSource::Local(validator_index as _, sig.clone()), + ApprovalStateTransition::LocalApproval(validator_index as _, sig.clone()), ); metrics.on_approval_produced(); diff --git a/node/core/approval-voting/src/tests.rs b/node/core/approval-voting/src/tests.rs index 9819991641c5..af821039324f 100644 --- a/node/core/approval-voting/src/tests.rs +++ b/node/core/approval-voting/src/tests.rs @@ -172,7 +172,13 @@ impl MockClockInner { self.wakeups.iter().map(|w| w.0).next() } - fn has_wakeup(&self, tick: Tick) -> bool { + fn current_wakeup_is(&mut self, tick: Tick) -> bool { + // first, prune away all wakeups which aren't actually being awaited + // on. + self.wakeups.retain(|(_, tx)| !tx.is_canceled()); + + // Then see if any remaining wakeups match the tick. + // This should be the only wakeup. self.wakeups.binary_search_by_key(&tick, |w| w.0).is_ok() } @@ -786,8 +792,8 @@ async fn import_block( RuntimeApiRequest::SessionIndexForChild(s_tx) ) ) => { - let hash = &hashes[number.saturating_sub(1) as usize]; - assert_eq!(req_block_hash, hash.0.clone()); + let hash = &hashes[number as usize]; + assert_eq!(req_block_hash, hash.0); s_tx.send(Ok(number.into())).unwrap(); } ); @@ -1412,6 +1418,8 @@ fn subsystem_second_approval_import_only_schedules_wakeups() { .. } = test_harness; + clock.inner.lock().set_tick(APPROVAL_DELAY); + let block_hash = Hash::repeat_byte(0x01); let candidate_hash = { @@ -1425,13 +1433,41 @@ fn subsystem_second_approval_import_only_schedules_wakeups() { let validator = ValidatorIndex(0); let session_index = 1; + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Eve, + ]; + let session_info = SessionInfo { + validators: validators.iter().map(|v| v.public().into()).collect(), + validator_groups: vec![ + vec![ValidatorIndex(0), ValidatorIndex(1)], + vec![ValidatorIndex(2)], + vec![ValidatorIndex(3), ValidatorIndex(4)], + ], + needed_approvals: 1, + discovery_keys: validators.iter().map(|v| v.public().into()).collect(), + assignment_keys: validators.iter().map(|v| v.public().into()).collect(), + n_cores: validators.len() as _, + zeroth_delay_tranche_width: 5, + relay_vrf_modulo_samples: 3, + n_delay_tranches: 50, + no_show_slots: 2, + }; + // Add block hash 0x01... ChainBuilder::new() .add_block( block_hash, ChainBuilder::GENESIS_HASH, 1, - BlockConfig { slot: Slot::from(0), candidates: None, session_info: None }, + BlockConfig { + slot: Slot::from(0), + candidates: None, + session_info: Some(session_info), + }, ) .build(&mut virtual_overseer) .await; @@ -1446,6 +1482,8 @@ fn subsystem_second_approval_import_only_schedules_wakeups() { assert_eq!(rx.await, Ok(AssignmentCheckResult::Accepted)); + assert!(clock.inner.lock().current_wakeup_is(APPROVAL_DELAY + 2)); + let rx = check_and_import_approval( &mut virtual_overseer, block_hash, @@ -1453,7 +1491,7 @@ fn subsystem_second_approval_import_only_schedules_wakeups() { validator, candidate_hash, session_index, - true, + false, true, None, ) @@ -1461,11 +1499,8 @@ fn subsystem_second_approval_import_only_schedules_wakeups() { assert_eq!(rx.await, Ok(ApprovalCheckResult::Accepted)); - // The clock should already have wakeups from the prior operations. Clear them to assert - // that the second approval adds more wakeups. - assert!(clock.inner.lock().has_wakeup(20)); - clock.inner.lock().wakeup_all(20); - assert!(!clock.inner.lock().has_wakeup(20)); + futures_timer::Delay::new(Duration::from_millis(100)).await; + assert!(clock.inner.lock().current_wakeup_is(APPROVAL_DELAY + 2)); let rx = check_and_import_approval( &mut virtual_overseer, @@ -1482,7 +1517,8 @@ fn subsystem_second_approval_import_only_schedules_wakeups() { assert_eq!(rx.await, Ok(ApprovalCheckResult::Accepted)); - assert!(clock.inner.lock().has_wakeup(20)); + futures_timer::Delay::new(Duration::from_millis(100)).await; + assert!(clock.inner.lock().current_wakeup_is(APPROVAL_DELAY + 2)); virtual_overseer }); @@ -1524,7 +1560,7 @@ fn subsystem_assignment_import_updates_candidate_entry_and_schedules_wakeup() { assert_eq!(rx.await, Ok(AssignmentCheckResult::Accepted)); - assert!(clock.inner.lock().has_wakeup(20)); + assert!(clock.inner.lock().current_wakeup_is(2)); virtual_overseer }); @@ -1566,14 +1602,14 @@ fn subsystem_process_wakeup_schedules_wakeup() { assert_eq!(rx.await, Ok(AssignmentCheckResult::Accepted)); - assert!(clock.inner.lock().has_wakeup(20)); + assert!(clock.inner.lock().current_wakeup_is(2)); // Activate the wakeup present above, and sleep to allow process_wakeups to execute.. - clock.inner.lock().wakeup_all(20); + clock.inner.lock().set_tick(2); futures_timer::Delay::new(Duration::from_millis(100)).await; // The wakeup should have been rescheduled. - assert!(clock.inner.lock().has_wakeup(20)); + assert!(clock.inner.lock().current_wakeup_is(30)); virtual_overseer }); @@ -1772,10 +1808,6 @@ fn import_checked_approval_updates_entries_and_schedules() { assert_eq!(rx.await, Ok(AssignmentCheckResult::Accepted),); - // Clear any wake ups from the assignment imports. - assert!(clock.inner.lock().has_wakeup(20)); - clock.inner.lock().wakeup_all(20); - let session_index = 1; let sig_a = sign_approval(Sr25519Keyring::Alice, candidate_hash, session_index); @@ -1801,10 +1833,10 @@ fn import_checked_approval_updates_entries_and_schedules() { // approval. let candidate_entry = store.load_candidate_entry(&candidate_hash).unwrap().unwrap(); assert!(!candidate_entry.approval_entry(&block_hash).unwrap().is_approved()); - assert!(clock.inner.lock().has_wakeup(20)); + assert!(clock.inner.lock().current_wakeup_is(2)); // Clear the wake ups to assert that later approval also schedule wakeups. - clock.inner.lock().wakeup_all(20); + clock.inner.lock().wakeup_all(2); let sig_b = sign_approval(Sr25519Keyring::Bob, candidate_hash, session_index); let rx = check_and_import_approval( @@ -1838,7 +1870,6 @@ fn import_checked_approval_updates_entries_and_schedules() { // The candidate should now be approved. let candidate_entry = store.load_candidate_entry(&candidate_hash).unwrap().unwrap(); assert!(candidate_entry.approval_entry(&block_hash).unwrap().is_approved()); - assert!(clock.inner.lock().has_wakeup(20)); virtual_overseer }); @@ -2195,16 +2226,16 @@ fn subsystem_process_wakeup_trigger_assignment_launch_approval() { .build(&mut virtual_overseer) .await; - assert!(!clock.inner.lock().has_wakeup(1)); + assert!(!clock.inner.lock().current_wakeup_is(1)); clock.inner.lock().wakeup_all(1); - assert!(clock.inner.lock().has_wakeup(slot_to_tick(slot))); + assert!(clock.inner.lock().current_wakeup_is(slot_to_tick(slot))); clock.inner.lock().wakeup_all(slot_to_tick(slot)); futures_timer::Delay::new(Duration::from_millis(200)).await; - assert!(clock.inner.lock().has_wakeup(slot_to_tick(slot + 1))); - clock.inner.lock().wakeup_all(slot_to_tick(slot + 1)); + assert!(clock.inner.lock().current_wakeup_is(slot_to_tick(slot + 2))); + clock.inner.lock().wakeup_all(slot_to_tick(slot + 2)); assert_matches!( overseer_recv(&mut virtual_overseer).await, @@ -2435,9 +2466,10 @@ fn subsystem_assignment_triggered_by_all_with_less_than_threshold() { assignments_to_import: vec![1, 2, 3, 4, 5], approvals_to_import: vec![2, 4], ticks: vec![ - 20, // Check for no shows + 2, // APPROVAL_DELAY + 21, // Check for no shows ], - should_be_triggered: |_| true, + should_be_triggered: |t| t == 20, }); } @@ -2450,7 +2482,8 @@ fn subsystem_assignment_not_triggered_by_all_with_threshold() { assignments_to_import: vec![1, 2, 3, 4, 5], approvals_to_import: vec![1, 3, 5], ticks: vec![ - 20, // Check no shows + 2, // APPROVAL_DELAY + 21, // Check no shows ], should_be_triggered: |_| false, }); @@ -2465,8 +2498,8 @@ fn subsystem_assignment_triggered_if_below_maximum_and_clock_is_equal() { assignments_to_import: vec![1], approvals_to_import: vec![], ticks: vec![ - 20, // Check no shows - 21, // Alice wakeup, assignment triggered + 21, // Check no shows + 23, // Alice wakeup, assignment triggered ], should_be_triggered: |tick| tick >= 21, }); @@ -2481,8 +2514,9 @@ fn subsystem_assignment_not_triggered_more_than_maximum() { assignments_to_import: vec![2, 3], approvals_to_import: vec![], ticks: vec![ + 2, // APPROVAL_DELAY 13, // Alice wakeup - 20, // Check no shows + 30, // Check no shows ], should_be_triggered: |_| false, }); @@ -2490,16 +2524,15 @@ fn subsystem_assignment_not_triggered_more_than_maximum() { #[test] fn subsystem_assignment_triggered_if_at_maximum() { - // TODO(ladi): is this possible? triggers_assignment_test(TriggersAssignmentConfig { - our_assigned_tranche: 11, + our_assigned_tranche: 21, assign_validator_tranche: |_| Ok(2), no_show_slots: 2, assignments_to_import: vec![1], approvals_to_import: vec![], ticks: vec![ 12, // Bob wakeup - 20, // Check no shows + 30, // Check no shows ], should_be_triggered: |_| false, }); @@ -2549,9 +2582,364 @@ fn subsystem_assignment_not_triggered_if_at_maximum_but_clock_is_before_with_dri 12, // Charlie wakeup 13, // Dave wakeup 15, // Alice wakeup, noop - 20, // Check no shows + 30, // Check no shows 34, // Eve wakeup ], should_be_triggered: |_| false, }); } + +#[test] +fn pre_covers_dont_stall_approval() { + // A, B are tranche 0. + // C is tranche 1. + // + // All assignments imported at once, and B, C approvals imported immediately. + // A no-shows, leading to being covered by C. + // Technically, this is an approved block, but it will be approved + // when the no-show timer hits, not as a response to an approval vote. + // + // Note that we have 6 validators, otherwise the 2nd approval triggers + // the >1/3 insta-approval condition. + + let assignment_criteria = Box::new(MockAssignmentCriteria::check_only( + move |validator_index| match validator_index { + ValidatorIndex(0 | 1) => Ok(0), + ValidatorIndex(2) => Ok(1), + ValidatorIndex(_) => Err(criteria::InvalidAssignment), + }, + )); + + let config = HarnessConfigBuilder::default().assignment_criteria(assignment_criteria).build(); + let store = config.backend(); + test_harness(config, |test_harness| async move { + let TestHarness { + mut virtual_overseer, + clock, + sync_oracle_handle: _sync_oracle_handle, + .. + } = test_harness; + + let block_hash = Hash::repeat_byte(0x01); + let validator_index_a = ValidatorIndex(0); + let validator_index_b = ValidatorIndex(1); + let validator_index_c = ValidatorIndex(2); + + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Eve, + Sr25519Keyring::One, + ]; + let session_info = SessionInfo { + validators: validators.iter().map(|v| v.public().into()).collect(), + validator_groups: vec![ + vec![ValidatorIndex(0), ValidatorIndex(1)], + vec![ValidatorIndex(2), ValidatorIndex(5)], + vec![ValidatorIndex(3), ValidatorIndex(4)], + ], + needed_approvals: 2, + discovery_keys: validators.iter().map(|v| v.public().into()).collect(), + assignment_keys: validators.iter().map(|v| v.public().into()).collect(), + n_cores: validators.len() as _, + zeroth_delay_tranche_width: 5, + relay_vrf_modulo_samples: 3, + n_delay_tranches: 50, + no_show_slots: 2, + }; + + let candidate_descriptor = make_candidate(1.into(), &block_hash); + let candidate_hash = candidate_descriptor.hash(); + + let head: Hash = ChainBuilder::GENESIS_HASH; + let mut builder = ChainBuilder::new(); + let slot = Slot::from(1 as u64); + builder.add_block( + block_hash, + head, + 1, + BlockConfig { + slot, + candidates: Some(vec![(candidate_descriptor, CoreIndex(0), GroupIndex(0))]), + session_info: Some(session_info), + }, + ); + builder.build(&mut virtual_overseer).await; + + let candidate_index = 0; + + let rx = check_and_import_assignment( + &mut virtual_overseer, + block_hash, + candidate_index, + validator_index_a, + ) + .await; + + assert_eq!(rx.await, Ok(AssignmentCheckResult::Accepted),); + + let rx = check_and_import_assignment( + &mut virtual_overseer, + block_hash, + candidate_index, + validator_index_b, + ) + .await; + + assert_eq!(rx.await, Ok(AssignmentCheckResult::Accepted),); + + let rx = check_and_import_assignment( + &mut virtual_overseer, + block_hash, + candidate_index, + validator_index_c, + ) + .await; + + assert_eq!(rx.await, Ok(AssignmentCheckResult::Accepted),); + + let session_index = 1; + let sig_b = sign_approval(Sr25519Keyring::Bob, candidate_hash, session_index); + + let rx = check_and_import_approval( + &mut virtual_overseer, + block_hash, + candidate_index, + validator_index_b, + candidate_hash, + session_index, + false, + true, + Some(sig_b), + ) + .await; + + assert_eq!(rx.await, Ok(ApprovalCheckResult::Accepted),); + + let sig_c = sign_approval(Sr25519Keyring::Charlie, candidate_hash, session_index); + let rx = check_and_import_approval( + &mut virtual_overseer, + block_hash, + candidate_index, + validator_index_c, + candidate_hash, + session_index, + false, + true, + Some(sig_c), + ) + .await; + + assert_eq!(rx.await, Ok(ApprovalCheckResult::Accepted),); + + // Sleep to ensure we get a consistent read on the database. + // + // NOTE: Since the response above occurs before writing to the database, we are somewhat + // breaking the external consistency of the API by reaching into the database directly. + // Under normal operation, this wouldn't be necessary, since all requests are serialized by + // the event loop and we write at the end of each pass. However, if the database write were + // to fail, a downstream subsystem may expect for this candidate to be approved, and + // possibly take further actions on the assumption that the candidate is approved, when + // that may not be the reality from the database's perspective. This could be avoided + // entirely by having replies processed after database writes, but that would constitute a + // larger refactor and incur a performance penalty. + futures_timer::Delay::new(Duration::from_millis(100)).await; + + // The candidate should not be approved. + let candidate_entry = store.load_candidate_entry(&candidate_hash).unwrap().unwrap(); + assert!(!candidate_entry.approval_entry(&block_hash).unwrap().is_approved()); + assert!(clock.inner.lock().current_wakeup_is(2)); + + // Wait for the no-show timer to observe the approval from + // tranche 0 and set a wakeup for tranche 1. + clock.inner.lock().set_tick(30); + + // Sleep to ensure we get a consistent read on the database. + futures_timer::Delay::new(Duration::from_millis(100)).await; + + // The next wakeup should observe the assignment & approval from + // tranche 1, and the no-show from tranche 0 should be immediately covered. + assert_eq!(clock.inner.lock().next_wakeup(), Some(31)); + clock.inner.lock().set_tick(31); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ChainSelection(ChainSelectionMessage::Approved(b_hash)) => { + assert_eq!(b_hash, block_hash); + } + ); + + // The candidate and block should now be approved. + let candidate_entry = store.load_candidate_entry(&candidate_hash).unwrap().unwrap(); + assert!(candidate_entry.approval_entry(&block_hash).unwrap().is_approved()); + assert!(clock.inner.lock().next_wakeup().is_none()); + + let block_entry = store.load_block_entry(&block_hash).unwrap().unwrap(); + assert!(block_entry.is_fully_approved()); + + virtual_overseer + }); +} + +#[test] +fn waits_until_approving_assignments_are_old_enough() { + // A, B are tranche 0. + + let assignment_criteria = Box::new(MockAssignmentCriteria::check_only(|_| Ok(0))); + + let config = HarnessConfigBuilder::default().assignment_criteria(assignment_criteria).build(); + let store = config.backend(); + test_harness(config, |test_harness| async move { + let TestHarness { + mut virtual_overseer, + clock, + sync_oracle_handle: _sync_oracle_handle, + .. + } = test_harness; + + clock.inner.lock().set_tick(APPROVAL_DELAY); + + let block_hash = Hash::repeat_byte(0x01); + let validator_index_a = ValidatorIndex(0); + let validator_index_b = ValidatorIndex(1); + + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Eve, + Sr25519Keyring::One, + ]; + let session_info = SessionInfo { + validators: validators.iter().map(|v| v.public().into()).collect(), + validator_groups: vec![ + vec![ValidatorIndex(0), ValidatorIndex(1)], + vec![ValidatorIndex(2), ValidatorIndex(5)], + vec![ValidatorIndex(3), ValidatorIndex(4)], + ], + needed_approvals: 2, + discovery_keys: validators.iter().map(|v| v.public().into()).collect(), + assignment_keys: validators.iter().map(|v| v.public().into()).collect(), + n_cores: validators.len() as _, + zeroth_delay_tranche_width: 5, + relay_vrf_modulo_samples: 3, + n_delay_tranches: 50, + no_show_slots: 2, + }; + + let candidate_descriptor = make_candidate(1.into(), &block_hash); + let candidate_hash = candidate_descriptor.hash(); + + let head: Hash = ChainBuilder::GENESIS_HASH; + let mut builder = ChainBuilder::new(); + let slot = Slot::from(1 as u64); + builder.add_block( + block_hash, + head, + 1, + BlockConfig { + slot, + candidates: Some(vec![(candidate_descriptor, CoreIndex(0), GroupIndex(0))]), + session_info: Some(session_info), + }, + ); + builder.build(&mut virtual_overseer).await; + + let candidate_index = 0; + + let rx = check_and_import_assignment( + &mut virtual_overseer, + block_hash, + candidate_index, + validator_index_a, + ) + .await; + + assert_eq!(rx.await, Ok(AssignmentCheckResult::Accepted),); + + let rx = check_and_import_assignment( + &mut virtual_overseer, + block_hash, + candidate_index, + validator_index_b, + ) + .await; + + assert_eq!(rx.await, Ok(AssignmentCheckResult::Accepted),); + + assert!(clock.inner.lock().current_wakeup_is(APPROVAL_DELAY + APPROVAL_DELAY)); + + let session_index = 1; + + let sig_a = sign_approval(Sr25519Keyring::Alice, candidate_hash, session_index); + let rx = check_and_import_approval( + &mut virtual_overseer, + block_hash, + candidate_index, + validator_index_a, + candidate_hash, + session_index, + false, + true, + Some(sig_a), + ) + .await; + + assert_eq!(rx.await, Ok(ApprovalCheckResult::Accepted),); + + let sig_b = sign_approval(Sr25519Keyring::Bob, candidate_hash, session_index); + + let rx = check_and_import_approval( + &mut virtual_overseer, + block_hash, + candidate_index, + validator_index_b, + candidate_hash, + session_index, + false, + true, + Some(sig_b), + ) + .await; + + assert_eq!(rx.await, Ok(ApprovalCheckResult::Accepted),); + + // Sleep to ensure we get a consistent read on the database. + futures_timer::Delay::new(Duration::from_millis(100)).await; + + // The candidate should not be approved, even though at this + // point in time we have 2 assignments and 2 approvals. + // + // This is because the assignments were imported at tick `APPROVAL_DELAY` + // and won't be considered until `APPROVAL_DELAY` more ticks have passed. + let candidate_entry = store.load_candidate_entry(&candidate_hash).unwrap().unwrap(); + assert!(!candidate_entry.approval_entry(&block_hash).unwrap().is_approved()); + assert!(clock.inner.lock().current_wakeup_is(APPROVAL_DELAY + APPROVAL_DELAY)); + + // Trigger the wakeup. + clock.inner.lock().set_tick(APPROVAL_DELAY + APPROVAL_DELAY); + + // Sleep to ensure we get a consistent read on the database. + futures_timer::Delay::new(Duration::from_millis(100)).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ChainSelection(ChainSelectionMessage::Approved(b_hash)) => { + assert_eq!(b_hash, block_hash); + } + ); + + // The candidate and block should now be approved. + let candidate_entry = store.load_candidate_entry(&candidate_hash).unwrap().unwrap(); + assert!(candidate_entry.approval_entry(&block_hash).unwrap().is_approved()); + assert!(clock.inner.lock().next_wakeup().is_none()); + + let block_entry = store.load_block_entry(&block_hash).unwrap().unwrap(); + assert!(block_entry.is_fully_approved()); + + virtual_overseer + }); +} diff --git a/node/core/av-store/Cargo.toml b/node/core/av-store/Cargo.toml index d6f238d00670..ebd6529d85c5 100644 --- a/node/core/av-store/Cargo.toml +++ b/node/core/av-store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-node-core-av-store" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" @@ -9,10 +9,10 @@ futures = "0.3.17" futures-timer = "3.0.2" kvdb = "0.10.0" thiserror = "1.0.26" -tracing = "0.1.26" +tracing = "0.1.28" bitvec = "0.20.1" -parity-scale-codec = { version = "2.0.0", features = ["derive"] } +parity-scale-codec = { version = "2.3.1", features = ["derive"] } erasure = { package = "polkadot-erasure-coding", path = "../../../erasure-coding" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } diff --git a/node/core/av-store/src/lib.rs b/node/core/av-store/src/lib.rs index 34b26df3c958..96c0266a4fa6 100644 --- a/node/core/av-store/src/lib.rs +++ b/node/core/av-store/src/lib.rs @@ -1074,19 +1074,18 @@ fn process_message( }, } }, - AvailabilityStoreMessage::StoreAvailableData( - candidate, - _our_index, + AvailabilityStoreMessage::StoreAvailableData { + candidate_hash, n_validators, available_data, tx, - ) => { + } => { subsystem.metrics.on_chunks_received(n_validators as _); let _timer = subsystem.metrics.time_store_available_data(); let res = - store_available_data(&subsystem, candidate, n_validators as _, available_data); + store_available_data(&subsystem, candidate_hash, n_validators as _, available_data); match res { Ok(()) => { diff --git a/node/core/av-store/src/tests.rs b/node/core/av-store/src/tests.rs index 1101edde928f..428ed51aecde 100644 --- a/node/core/av-store/src/tests.rs +++ b/node/core/av-store/src/tests.rs @@ -420,13 +420,12 @@ fn store_block_works() { }; let (tx, rx) = oneshot::channel(); - let block_msg = AvailabilityStoreMessage::StoreAvailableData( + let block_msg = AvailabilityStoreMessage::StoreAvailableData { candidate_hash, - Some(validator_index), n_validators, - available_data.clone(), + available_data: available_data.clone(), tx, - ); + }; virtual_overseer.send(FromOverseer::Communication { msg: block_msg }).await; assert_eq!(rx.await.unwrap(), Ok(())); @@ -474,13 +473,12 @@ fn store_pov_and_query_chunk_works() { erasure::obtain_chunks_v1(n_validators as _, &available_data).unwrap(); let (tx, rx) = oneshot::channel(); - let block_msg = AvailabilityStoreMessage::StoreAvailableData( + let block_msg = AvailabilityStoreMessage::StoreAvailableData { candidate_hash, - None, n_validators, available_data, tx, - ); + }; virtual_overseer.send(FromOverseer::Communication { msg: block_msg }).await; @@ -521,13 +519,12 @@ fn query_all_chunks_works() { { let (tx, rx) = oneshot::channel(); - let block_msg = AvailabilityStoreMessage::StoreAvailableData( - candidate_hash_1, - None, + let block_msg = AvailabilityStoreMessage::StoreAvailableData { + candidate_hash: candidate_hash_1, n_validators, available_data, tx, - ); + }; virtual_overseer.send(FromOverseer::Communication { msg: block_msg }).await; assert_eq!(rx.await.unwrap(), Ok(())); @@ -610,13 +607,12 @@ fn stored_but_not_included_data_is_pruned() { }; let (tx, rx) = oneshot::channel(); - let block_msg = AvailabilityStoreMessage::StoreAvailableData( + let block_msg = AvailabilityStoreMessage::StoreAvailableData { candidate_hash, - None, n_validators, - available_data.clone(), + available_data: available_data.clone(), tx, - ); + }; virtual_overseer.send(FromOverseer::Communication { msg: block_msg }).await; @@ -663,13 +659,12 @@ fn stored_data_kept_until_finalized() { let block_number = 10; let (tx, rx) = oneshot::channel(); - let block_msg = AvailabilityStoreMessage::StoreAvailableData( + let block_msg = AvailabilityStoreMessage::StoreAvailableData { candidate_hash, - None, n_validators, - available_data.clone(), + available_data: available_data.clone(), tx, - ); + }; virtual_overseer.send(FromOverseer::Communication { msg: block_msg }).await; @@ -899,26 +894,24 @@ fn forkfullness_works() { }; let (tx, rx) = oneshot::channel(); - let msg = AvailabilityStoreMessage::StoreAvailableData( - candidate_1_hash, - None, + let msg = AvailabilityStoreMessage::StoreAvailableData { + candidate_hash: candidate_1_hash, n_validators, - available_data_1.clone(), + available_data: available_data_1.clone(), tx, - ); + }; virtual_overseer.send(FromOverseer::Communication { msg }).await; rx.await.unwrap().unwrap(); let (tx, rx) = oneshot::channel(); - let msg = AvailabilityStoreMessage::StoreAvailableData( - candidate_2_hash, - None, + let msg = AvailabilityStoreMessage::StoreAvailableData { + candidate_hash: candidate_2_hash, n_validators, - available_data_2.clone(), + available_data: available_data_2.clone(), tx, - ); + }; virtual_overseer.send(FromOverseer::Communication { msg }).await; diff --git a/node/core/backing/Cargo.toml b/node/core/backing/Cargo.toml index 1d4bcbc01bab..83a665da943f 100644 --- a/node/core/backing/Cargo.toml +++ b/node/core/backing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-node-core-backing" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" @@ -14,7 +14,7 @@ polkadot-node-subsystem-util = { path = "../../subsystem-util" } erasure-coding = { package = "polkadot-erasure-coding", path = "../../../erasure-coding" } statement-table = { package = "polkadot-statement-table", path = "../../../statement-table" } bitvec = { version = "0.20.1", default-features = false, features = ["alloc"] } -tracing = "0.1.26" +tracing = "0.1.28" thiserror = "1.0.26" [dev-dependencies] diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 338f333efbfa..38fab2d791c2 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -32,6 +32,7 @@ use futures::{ use polkadot_node_primitives::{ AvailableData, PoV, SignedDisputeStatement, SignedFullStatement, Statement, ValidationResult, + BACKING_EXECUTION_TIMEOUT, }; use polkadot_node_subsystem_util::{ self as util, @@ -294,20 +295,18 @@ fn table_attested_to_backed( async fn store_available_data( sender: &mut JobSender, - id: Option, n_validators: u32, candidate_hash: CandidateHash, available_data: AvailableData, ) -> Result<(), Error> { let (tx, rx) = oneshot::channel(); sender - .send_message(AvailabilityStoreMessage::StoreAvailableData( + .send_message(AvailabilityStoreMessage::StoreAvailableData { candidate_hash, - id, n_validators, available_data, tx, - )) + }) .await; let _ = rx.await.map_err(Error::StoreAvailableData)?; @@ -321,7 +320,6 @@ async fn store_available_data( // This returns `Err()` iff there is an internal error. Otherwise, it returns either `Ok(Ok(()))` or `Ok(Err(_))`. async fn make_pov_available( sender: &mut JobSender, - validator_index: Option, n_validators: usize, pov: Arc, candidate_hash: CandidateHash, @@ -347,14 +345,7 @@ async fn make_pov_available( { let _span = span.as_ref().map(|s| s.child("store-data").with_candidate(candidate_hash)); - store_available_data( - sender, - validator_index, - n_validators as u32, - candidate_hash, - available_data, - ) - .await?; + store_available_data(sender, n_validators as u32, candidate_hash, available_data).await?; } Ok(Ok(())) @@ -390,7 +381,12 @@ async fn request_candidate_validation( let (tx, rx) = oneshot::channel(); sender - .send_message(CandidateValidationMessage::ValidateFromChainState(candidate, pov, tx)) + .send_message(CandidateValidationMessage::ValidateFromChainState( + candidate, + pov, + BACKING_EXECUTION_TIMEOUT, + tx, + )) .await; match rx.await { @@ -409,7 +405,6 @@ struct BackgroundValidationParams, F> candidate: CandidateReceipt, relay_parent: Hash, pov: PoVData, - validator_index: Option, n_validators: usize, span: Option, make_command: F, @@ -427,7 +422,6 @@ async fn validate_and_make_available( candidate, relay_parent, pov, - validator_index, n_validators, span, make_command, @@ -484,7 +478,6 @@ async fn validate_and_make_available( } else { let erasure_valid = make_pov_available( &mut sender, - validator_index, n_validators, pov.clone(), candidate.hash(), @@ -719,7 +712,6 @@ impl CandidateBackingJob { candidate: candidate.clone(), relay_parent: self.parent, pov: PoVData::Ready(pov), - validator_index: self.table_context.validator.as_ref().map(|v| v.index()), n_validators: self.table_context.validators.len(), span, make_command: ValidatedCandidateCommand::Second, @@ -1033,7 +1025,6 @@ impl CandidateBackingJob { candidate: attesting.candidate, relay_parent: self.parent, pov, - validator_index: self.table_context.validator.as_ref().map(|v| v.index()), n_validators: self.table_context.validators.len(), span, make_command: ValidatedCandidateCommand::Attest, diff --git a/node/core/backing/src/tests.rs b/node/core/backing/src/tests.rs index 86282c38f91c..a262dd45d470 100644 --- a/node/core/backing/src/tests.rs +++ b/node/core/backing/src/tests.rs @@ -317,9 +317,10 @@ fn backing_second_works() { CandidateValidationMessage::ValidateFromChainState( c, pov, + timeout, tx, ) - ) if pov == pov && &c == candidate.descriptor() => { + ) if pov == pov && &c == candidate.descriptor() && timeout == BACKING_EXECUTION_TIMEOUT => { tx.send(Ok( ValidationResult::Valid(CandidateCommitments { head_data: expected_head_data.clone(), @@ -336,7 +337,7 @@ fn backing_second_works() { assert_matches!( virtual_overseer.recv().await, AllMessages::AvailabilityStore( - AvailabilityStoreMessage::StoreAvailableData(candidate_hash, _, _, _, tx) + AvailabilityStoreMessage::StoreAvailableData { candidate_hash, tx, .. } ) if candidate_hash == candidate.hash() => { tx.send(Ok(())).unwrap(); } @@ -476,9 +477,10 @@ fn backing_works() { CandidateValidationMessage::ValidateFromChainState( c, pov, + timeout, tx, ) - ) if pov == pov && &c == candidate_a.descriptor() => { + ) if pov == pov && &c == candidate_a.descriptor() && timeout == BACKING_EXECUTION_TIMEOUT => { tx.send(Ok( ValidationResult::Valid(CandidateCommitments { head_data: expected_head_data.clone(), @@ -495,7 +497,7 @@ fn backing_works() { assert_matches!( virtual_overseer.recv().await, AllMessages::AvailabilityStore( - AvailabilityStoreMessage::StoreAvailableData(candidate_hash, _, _, _, tx) + AvailabilityStoreMessage::StoreAvailableData { candidate_hash, tx, .. } ) if candidate_hash == candidate_a.hash() => { tx.send(Ok(())).unwrap(); } @@ -669,9 +671,10 @@ fn backing_works_while_validation_ongoing() { CandidateValidationMessage::ValidateFromChainState( c, pov, + timeout, tx, ) - ) if pov == pov && &c == candidate_a.descriptor() => { + ) if pov == pov && &c == candidate_a.descriptor() && timeout == BACKING_EXECUTION_TIMEOUT => { // we never validate the candidate. our local node // shouldn't issue any statements. std::mem::forget(tx); @@ -834,9 +837,10 @@ fn backing_misbehavior_works() { CandidateValidationMessage::ValidateFromChainState( c, pov, + timeout, tx, ) - ) if pov == pov && &c == candidate_a.descriptor() => { + ) if pov == pov && &c == candidate_a.descriptor() && timeout == BACKING_EXECUTION_TIMEOUT => { tx.send(Ok( ValidationResult::Valid(CandidateCommitments { head_data: expected_head_data.clone(), @@ -853,7 +857,7 @@ fn backing_misbehavior_works() { assert_matches!( virtual_overseer.recv().await, AllMessages::AvailabilityStore( - AvailabilityStoreMessage::StoreAvailableData(candidate_hash, _, _, _, tx) + AvailabilityStoreMessage::StoreAvailableData { candidate_hash, tx, .. } ) if candidate_hash == candidate_a.hash() => { tx.send(Ok(())).unwrap(); } @@ -980,9 +984,10 @@ fn backing_dont_second_invalid() { CandidateValidationMessage::ValidateFromChainState( c, pov, + timeout, tx, ) - ) if pov == pov && &c == candidate_a.descriptor() => { + ) if pov == pov && &c == candidate_a.descriptor() && timeout == BACKING_EXECUTION_TIMEOUT => { tx.send(Ok(ValidationResult::Invalid(InvalidCandidate::BadReturn))).unwrap(); } ); @@ -1008,9 +1013,10 @@ fn backing_dont_second_invalid() { CandidateValidationMessage::ValidateFromChainState( c, pov, + timeout, tx, ) - ) if pov == pov && &c == candidate_b.descriptor() => { + ) if pov == pov && &c == candidate_b.descriptor() && timeout == BACKING_EXECUTION_TIMEOUT => { tx.send(Ok( ValidationResult::Valid(CandidateCommitments { head_data: expected_head_data.clone(), @@ -1027,7 +1033,7 @@ fn backing_dont_second_invalid() { assert_matches!( virtual_overseer.recv().await, AllMessages::AvailabilityStore( - AvailabilityStoreMessage::StoreAvailableData(candidate_hash, _, _, _, tx) + AvailabilityStoreMessage::StoreAvailableData { candidate_hash, tx, .. } ) if candidate_hash == candidate_b.hash() => { tx.send(Ok(())).unwrap(); } @@ -1138,9 +1144,10 @@ fn backing_second_after_first_fails_works() { CandidateValidationMessage::ValidateFromChainState( c, pov, + timeout, tx, ) - ) if pov == pov && &c == candidate.descriptor() => { + ) if pov == pov && &c == candidate.descriptor() && timeout == BACKING_EXECUTION_TIMEOUT => { tx.send(Ok(ValidationResult::Invalid(InvalidCandidate::BadReturn))).unwrap(); } ); @@ -1186,6 +1193,7 @@ fn backing_second_after_first_fails_works() { _, pov, _, + _, ) ) => { assert_eq!(&*pov, &pov_to_second); @@ -1270,9 +1278,10 @@ fn backing_works_after_failed_validation() { CandidateValidationMessage::ValidateFromChainState( c, pov, + timeout, tx, ) - ) if pov == pov && &c == candidate.descriptor() => { + ) if pov == pov && &c == candidate.descriptor() && timeout == BACKING_EXECUTION_TIMEOUT => { tx.send(Err(ValidationFailed("Internal test error".into()))).unwrap(); } ); @@ -1646,9 +1655,10 @@ fn retry_works() { CandidateValidationMessage::ValidateFromChainState( c, pov, + timeout, _tx, ) - ) if pov == pov && &c == candidate.descriptor() + ) if pov == pov && &c == candidate.descriptor() && timeout == BACKING_EXECUTION_TIMEOUT ); virtual_overseer }); diff --git a/node/core/bitfield-signing/Cargo.toml b/node/core/bitfield-signing/Cargo.toml index b77d1e2b2b8f..eae0881d2da3 100644 --- a/node/core/bitfield-signing/Cargo.toml +++ b/node/core/bitfield-signing/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "polkadot-node-core-bitfield-signing" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.3.17" -tracing = "0.1.26" +tracing = "0.1.28" polkadot-primitives = { path = "../../../primitives" } polkadot-node-subsystem = { path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } diff --git a/node/core/candidate-validation/Cargo.toml b/node/core/candidate-validation/Cargo.toml index 0b40202ff167..334166bbfb2a 100644 --- a/node/core/candidate-validation/Cargo.toml +++ b/node/core/candidate-validation/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "polkadot-node-core-candidate-validation" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] async-trait = "0.1.51" futures = "0.3.17" -tracing = "0.1.26" +tracing = "0.1.28" sp-maybe-compressed-blob = { package = "sp-maybe-compressed-blob", git = "https://github.com/paritytech/substrate", branch = "master" } -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["bit-vec", "derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["bit-vec", "derive"] } polkadot-primitives = { path = "../../../primitives" } polkadot-parachain = { path = "../../../parachain" } diff --git a/node/core/candidate-validation/src/lib.rs b/node/core/candidate-validation/src/lib.rs index 2862d4c3f30e..c9e78db77c47 100644 --- a/node/core/candidate-validation/src/lib.rs +++ b/node/core/candidate-validation/src/lib.rs @@ -35,7 +35,7 @@ use polkadot_node_subsystem::{ CandidateValidationMessage, RuntimeApiMessage, RuntimeApiRequest, ValidationFailed, }, overseer, FromOverseer, OverseerSignal, SpawnedSubsystem, SubsystemContext, SubsystemError, - SubsystemResult, + SubsystemResult, SubsystemSender, }; use polkadot_node_subsystem_util::metrics::{self, prometheus}; use polkadot_parachain::primitives::{ValidationParams, ValidationResult as WasmValidationResult}; @@ -48,7 +48,7 @@ use parity_scale_codec::Encode; use futures::{channel::oneshot, prelude::*}; -use std::{path::PathBuf, sync::Arc}; +use std::{path::PathBuf, sync::Arc, time::Duration}; use async_trait::async_trait; @@ -120,7 +120,7 @@ where Context: SubsystemContext, Context: overseer::SubsystemContext, { - let (mut validation_host, task) = polkadot_node_core_pvf::start( + let (validation_host, task) = polkadot_node_core_pvf::start( polkadot_node_core_pvf::Config::new(cache_path, program_path), pvf_metrics, ); @@ -135,78 +135,104 @@ where CandidateValidationMessage::ValidateFromChainState( descriptor, pov, + timeout, response_sender, ) => { - let _timer = metrics.time_validate_from_chain_state(); - - let res = spawn_validate_from_chain_state( - &mut ctx, - &mut validation_host, - descriptor, - pov, - &metrics, - ) - .await; - - match res { - Ok(x) => { - metrics.on_validation_event(&x); - let _ = response_sender.send(x); - }, - Err(e) => return Err(e), - } + let bg = { + let mut sender = ctx.sender().clone(); + let metrics = metrics.clone(); + let validation_host = validation_host.clone(); + + async move { + let _timer = metrics.time_validate_from_chain_state(); + let res = validate_from_chain_state( + &mut sender, + validation_host, + descriptor, + pov, + timeout, + &metrics, + ) + .await; + + metrics.on_validation_event(&res); + let _ = response_sender.send(res); + } + }; + + ctx.spawn("validate-from-chain-state", bg.boxed())?; }, CandidateValidationMessage::ValidateFromExhaustive( persisted_validation_data, validation_code, descriptor, pov, + timeout, response_sender, ) => { - let _timer = metrics.time_validate_from_exhaustive(); - - let res = validate_candidate_exhaustive( - &mut validation_host, - persisted_validation_data, - validation_code, - descriptor, - pov, - &metrics, - ) - .await; - - match res { - Ok(x) => { - metrics.on_validation_event(&x); - - if let Err(_e) = response_sender.send(x) { - tracing::warn!( - target: LOG_TARGET, - "Requester of candidate validation dropped", - ) - } - }, - Err(e) => return Err(e), - } + let bg = { + let metrics = metrics.clone(); + let validation_host = validation_host.clone(); + + async move { + let _timer = metrics.time_validate_from_exhaustive(); + let res = validate_candidate_exhaustive( + validation_host, + persisted_validation_data, + validation_code, + descriptor, + pov, + timeout, + &metrics, + ) + .await; + + metrics.on_validation_event(&res); + let _ = response_sender.send(res); + } + }; + + ctx.spawn("validate-from-exhaustive", bg.boxed())?; }, }, } } } -async fn runtime_api_request( - ctx: &mut Context, +struct RuntimeRequestFailed; + +async fn runtime_api_request( + sender: &mut Sender, relay_parent: Hash, request: RuntimeApiRequest, receiver: oneshot::Receiver>, -) -> SubsystemResult> +) -> Result where - Context: SubsystemContext, - Context: overseer::SubsystemContext, + Sender: SubsystemSender, { - ctx.send_message(RuntimeApiMessage::Request(relay_parent, request)).await; + sender + .send_message(RuntimeApiMessage::Request(relay_parent, request).into()) + .await; - receiver.await.map_err(Into::into) + receiver + .await + .map_err(|_| { + tracing::debug!(target: LOG_TARGET, ?relay_parent, "Runtime API request dropped"); + + RuntimeRequestFailed + }) + .and_then(|res| { + res.map_err(|e| { + tracing::debug!( + target: LOG_TARGET, + ?relay_parent, + err = ?e, + "Runtime API request internal error" + ); + + RuntimeRequestFailed + }) + }) } #[derive(Debug)] @@ -216,61 +242,57 @@ enum AssumptionCheckOutcome { BadRequest, } -async fn check_assumption_validation_data( - ctx: &mut Context, +async fn check_assumption_validation_data( + sender: &mut Sender, descriptor: &CandidateDescriptor, assumption: OccupiedCoreAssumption, -) -> SubsystemResult +) -> AssumptionCheckOutcome where - Context: SubsystemContext, - Context: overseer::SubsystemContext, + Sender: SubsystemSender, { let validation_data = { let (tx, rx) = oneshot::channel(); let d = runtime_api_request( - ctx, + sender, descriptor.relay_parent, RuntimeApiRequest::PersistedValidationData(descriptor.para_id, assumption, tx), rx, ) - .await?; + .await; match d { - Ok(None) | Err(_) => return Ok(AssumptionCheckOutcome::BadRequest), + Ok(None) | Err(RuntimeRequestFailed) => return AssumptionCheckOutcome::BadRequest, Ok(Some(d)) => d, } }; let persisted_validation_data_hash = validation_data.hash(); - SubsystemResult::Ok( - if descriptor.persisted_validation_data_hash == persisted_validation_data_hash { - let (code_tx, code_rx) = oneshot::channel(); - let validation_code = runtime_api_request( - ctx, - descriptor.relay_parent, - RuntimeApiRequest::ValidationCode(descriptor.para_id, assumption, code_tx), - code_rx, - ) - .await?; + if descriptor.persisted_validation_data_hash == persisted_validation_data_hash { + let (code_tx, code_rx) = oneshot::channel(); + let validation_code = runtime_api_request( + sender, + descriptor.relay_parent, + RuntimeApiRequest::ValidationCode(descriptor.para_id, assumption, code_tx), + code_rx, + ) + .await; - match validation_code { - Ok(None) | Err(_) => AssumptionCheckOutcome::BadRequest, - Ok(Some(v)) => AssumptionCheckOutcome::Matches(validation_data, v), - } - } else { - AssumptionCheckOutcome::DoesNotMatch - }, - ) + match validation_code { + Ok(None) | Err(RuntimeRequestFailed) => AssumptionCheckOutcome::BadRequest, + Ok(Some(v)) => AssumptionCheckOutcome::Matches(validation_data, v), + } + } else { + AssumptionCheckOutcome::DoesNotMatch + } } -async fn find_assumed_validation_data( - ctx: &mut Context, +async fn find_assumed_validation_data( + sender: &mut Sender, descriptor: &CandidateDescriptor, -) -> SubsystemResult +) -> AssumptionCheckOutcome where - Context: SubsystemContext, - Context: overseer::SubsystemContext, + Sender: SubsystemSender, { // The candidate descriptor has a `persisted_validation_data_hash` which corresponds to // one of up to two possible values that we can derive from the state of the @@ -287,41 +309,41 @@ where // Consider running these checks in parallel to reduce validation latency. for assumption in ASSUMPTIONS { - let outcome = check_assumption_validation_data(ctx, descriptor, *assumption).await?; + let outcome = check_assumption_validation_data(sender, descriptor, *assumption).await; match outcome { - AssumptionCheckOutcome::Matches(_, _) => return Ok(outcome), - AssumptionCheckOutcome::BadRequest => return Ok(outcome), + AssumptionCheckOutcome::Matches(_, _) => return outcome, + AssumptionCheckOutcome::BadRequest => return outcome, AssumptionCheckOutcome::DoesNotMatch => continue, } } - Ok(AssumptionCheckOutcome::DoesNotMatch) + AssumptionCheckOutcome::DoesNotMatch } -async fn spawn_validate_from_chain_state( - ctx: &mut Context, - validation_host: &mut ValidationHost, +async fn validate_from_chain_state( + sender: &mut Sender, + validation_host: ValidationHost, descriptor: CandidateDescriptor, pov: Arc, + timeout: Duration, metrics: &Metrics, -) -> SubsystemResult> +) -> Result where - Context: SubsystemContext, - Context: overseer::SubsystemContext, + Sender: SubsystemSender, { let (validation_data, validation_code) = - match find_assumed_validation_data(ctx, &descriptor).await? { + match find_assumed_validation_data(sender, &descriptor).await { AssumptionCheckOutcome::Matches(validation_data, validation_code) => (validation_data, validation_code), AssumptionCheckOutcome::DoesNotMatch => { // If neither the assumption of the occupied core having the para included or the assumption // of the occupied core timing out are valid, then the persisted_validation_data_hash in the descriptor // is not based on the relay parent and is thus invalid. - return Ok(Ok(ValidationResult::Invalid(InvalidCandidate::BadParent))) + return Ok(ValidationResult::Invalid(InvalidCandidate::BadParent)) }, AssumptionCheckOutcome::BadRequest => - return Ok(Err(ValidationFailed("Assumption Check: Bad request".into()))), + return Err(ValidationFailed("Assumption Check: Bad request".into())), }; let validation_result = validate_candidate_exhaustive( @@ -330,24 +352,25 @@ where validation_code, descriptor.clone(), pov, + timeout, metrics, ) .await; - if let Ok(Ok(ValidationResult::Valid(ref outputs, _))) = validation_result { + if let Ok(ValidationResult::Valid(ref outputs, _)) = validation_result { let (tx, rx) = oneshot::channel(); match runtime_api_request( - ctx, + sender, descriptor.relay_parent, RuntimeApiRequest::CheckValidationOutputs(descriptor.para_id, outputs.clone(), tx), rx, ) - .await? + .await { Ok(true) => {}, - Ok(false) => return Ok(Ok(ValidationResult::Invalid(InvalidCandidate::InvalidOutputs))), - Err(_) => - return Ok(Err(ValidationFailed("Check Validation Outputs: Bad request".into()))), + Ok(false) => return Ok(ValidationResult::Invalid(InvalidCandidate::InvalidOutputs)), + Err(RuntimeRequestFailed) => + return Err(ValidationFailed("Check Validation Outputs: Bad request".into())), } } @@ -360,8 +383,9 @@ async fn validate_candidate_exhaustive( validation_code: ValidationCode, descriptor: CandidateDescriptor, pov: Arc, + timeout: Duration, metrics: &Metrics, -) -> SubsystemResult> { +) -> Result { let _timer = metrics.time_validate_candidate_exhaustive(); let validation_code_hash = validation_code.hash(); @@ -378,7 +402,7 @@ async fn validate_candidate_exhaustive( &*pov, &validation_code_hash, ) { - return Ok(Ok(ValidationResult::Invalid(e))) + return Ok(ValidationResult::Invalid(e)) } let raw_validation_code = match sp_maybe_compressed_blob::decompress( @@ -390,7 +414,7 @@ async fn validate_candidate_exhaustive( tracing::debug!(target: LOG_TARGET, err=?e, "Invalid validation code"); // If the validation code is invalid, the candidate certainly is. - return Ok(Ok(ValidationResult::Invalid(InvalidCandidate::CodeDecompressionFailure))) + return Ok(ValidationResult::Invalid(InvalidCandidate::CodeDecompressionFailure)) }, }; @@ -401,7 +425,7 @@ async fn validate_candidate_exhaustive( tracing::debug!(target: LOG_TARGET, err=?e, "Invalid PoV code"); // If the PoV is invalid, the candidate certainly is. - return Ok(Ok(ValidationResult::Invalid(InvalidCandidate::PoVDecompressionFailure))) + return Ok(ValidationResult::Invalid(InvalidCandidate::PoVDecompressionFailure)) }, }; @@ -413,7 +437,7 @@ async fn validate_candidate_exhaustive( }; let result = validation_backend - .validate_candidate(raw_validation_code.to_vec(), params) + .validate_candidate(raw_validation_code.to_vec(), timeout, params) .await; if let Err(ref e) = result { @@ -424,7 +448,7 @@ async fn validate_candidate_exhaustive( ); } - let result = match result { + match result { Err(ValidationError::InternalError(e)) => Err(ValidationFailed(e)), Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::HardTimeout)) => @@ -450,9 +474,7 @@ async fn validate_candidate_exhaustive( }; Ok(ValidationResult::Valid(outputs, persisted_validation_data)) }, - }; - - Ok(result) + } } #[async_trait] @@ -460,21 +482,24 @@ trait ValidationBackend { async fn validate_candidate( &mut self, raw_validation_code: Vec, + timeout: Duration, params: ValidationParams, ) -> Result; } #[async_trait] -impl ValidationBackend for &'_ mut ValidationHost { +impl ValidationBackend for ValidationHost { async fn validate_candidate( &mut self, raw_validation_code: Vec, + timeout: Duration, params: ValidationParams, ) -> Result { let (tx, rx) = oneshot::channel(); if let Err(err) = self .execute_pvf( Pvf::from_code(raw_validation_code), + timeout, params.encode(), polkadot_node_core_pvf::Priority::Normal, tx, diff --git a/node/core/candidate-validation/src/tests.rs b/node/core/candidate-validation/src/tests.rs index 15314c35ed2f..30fa96ccc398 100644 --- a/node/core/candidate-validation/src/tests.rs +++ b/node/core/candidate-validation/src/tests.rs @@ -19,6 +19,7 @@ use assert_matches::assert_matches; use futures::executor; use polkadot_node_subsystem::messages::AllMessages; use polkadot_node_subsystem_test_helpers as test_helpers; +use polkadot_node_subsystem_util::reexports::SubsystemContext; use polkadot_primitives::v1::{HeadData, UpwardMessage}; use sp_core::testing::TaskExecutor; use sp_keyring::Sr25519Keyring; @@ -52,11 +53,15 @@ fn correctly_checks_included_assumption() { candidate.para_id = para_id; let pool = TaskExecutor::new(); - let (mut ctx, mut ctx_handle) = test_helpers::make_subsystem_context(pool.clone()); + let (mut ctx, mut ctx_handle) = + test_helpers::make_subsystem_context::(pool.clone()); - let (check_fut, check_result) = - check_assumption_validation_data(&mut ctx, &candidate, OccupiedCoreAssumption::Included) - .remote_handle(); + let (check_fut, check_result) = check_assumption_validation_data( + ctx.sender(), + &candidate, + OccupiedCoreAssumption::Included, + ) + .remote_handle(); let test_fut = async move { assert_matches!( @@ -89,7 +94,7 @@ fn correctly_checks_included_assumption() { } ); - assert_matches!(check_result.await.unwrap(), AssumptionCheckOutcome::Matches(o, v) => { + assert_matches!(check_result.await, AssumptionCheckOutcome::Matches(o, v) => { assert_eq!(o, validation_data); assert_eq!(v, validation_code); }); @@ -114,11 +119,15 @@ fn correctly_checks_timed_out_assumption() { candidate.para_id = para_id; let pool = TaskExecutor::new(); - let (mut ctx, mut ctx_handle) = test_helpers::make_subsystem_context(pool.clone()); + let (mut ctx, mut ctx_handle) = + test_helpers::make_subsystem_context::(pool.clone()); - let (check_fut, check_result) = - check_assumption_validation_data(&mut ctx, &candidate, OccupiedCoreAssumption::TimedOut) - .remote_handle(); + let (check_fut, check_result) = check_assumption_validation_data( + ctx.sender(), + &candidate, + OccupiedCoreAssumption::TimedOut, + ) + .remote_handle(); let test_fut = async move { assert_matches!( @@ -151,7 +160,7 @@ fn correctly_checks_timed_out_assumption() { } ); - assert_matches!(check_result.await.unwrap(), AssumptionCheckOutcome::Matches(o, v) => { + assert_matches!(check_result.await, AssumptionCheckOutcome::Matches(o, v) => { assert_eq!(o, validation_data); assert_eq!(v, validation_code); }); @@ -174,11 +183,15 @@ fn check_is_bad_request_if_no_validation_data() { candidate.para_id = para_id; let pool = TaskExecutor::new(); - let (mut ctx, mut ctx_handle) = test_helpers::make_subsystem_context(pool.clone()); + let (mut ctx, mut ctx_handle) = + test_helpers::make_subsystem_context::(pool.clone()); - let (check_fut, check_result) = - check_assumption_validation_data(&mut ctx, &candidate, OccupiedCoreAssumption::Included) - .remote_handle(); + let (check_fut, check_result) = check_assumption_validation_data( + ctx.sender(), + &candidate, + OccupiedCoreAssumption::Included, + ) + .remote_handle(); let test_fut = async move { assert_matches!( @@ -198,7 +211,7 @@ fn check_is_bad_request_if_no_validation_data() { } ); - assert_matches!(check_result.await.unwrap(), AssumptionCheckOutcome::BadRequest); + assert_matches!(check_result.await, AssumptionCheckOutcome::BadRequest); }; let test_fut = future::join(test_fut, check_fut); @@ -218,11 +231,15 @@ fn check_is_bad_request_if_no_validation_code() { candidate.para_id = para_id; let pool = TaskExecutor::new(); - let (mut ctx, mut ctx_handle) = test_helpers::make_subsystem_context(pool.clone()); + let (mut ctx, mut ctx_handle) = + test_helpers::make_subsystem_context::(pool.clone()); - let (check_fut, check_result) = - check_assumption_validation_data(&mut ctx, &candidate, OccupiedCoreAssumption::TimedOut) - .remote_handle(); + let (check_fut, check_result) = check_assumption_validation_data( + ctx.sender(), + &candidate, + OccupiedCoreAssumption::TimedOut, + ) + .remote_handle(); let test_fut = async move { assert_matches!( @@ -255,7 +272,7 @@ fn check_is_bad_request_if_no_validation_code() { } ); - assert_matches!(check_result.await.unwrap(), AssumptionCheckOutcome::BadRequest); + assert_matches!(check_result.await, AssumptionCheckOutcome::BadRequest); }; let test_fut = future::join(test_fut, check_fut); @@ -274,11 +291,15 @@ fn check_does_not_match() { candidate.para_id = para_id; let pool = TaskExecutor::new(); - let (mut ctx, mut ctx_handle) = test_helpers::make_subsystem_context(pool.clone()); + let (mut ctx, mut ctx_handle) = + test_helpers::make_subsystem_context::(pool.clone()); - let (check_fut, check_result) = - check_assumption_validation_data(&mut ctx, &candidate, OccupiedCoreAssumption::Included) - .remote_handle(); + let (check_fut, check_result) = check_assumption_validation_data( + ctx.sender(), + &candidate, + OccupiedCoreAssumption::Included, + ) + .remote_handle(); let test_fut = async move { assert_matches!( @@ -298,7 +319,7 @@ fn check_does_not_match() { } ); - assert_matches!(check_result.await.unwrap(), AssumptionCheckOutcome::DoesNotMatch); + assert_matches!(check_result.await, AssumptionCheckOutcome::DoesNotMatch); }; let test_fut = future::join(test_fut, check_fut); @@ -320,6 +341,7 @@ impl ValidationBackend for MockValidatorBackend { async fn validate_candidate( &mut self, _raw_validation_code: Vec, + _timeout: Duration, _params: ValidationParams, ) -> Result { self.result.clone() @@ -363,9 +385,9 @@ fn candidate_validation_ok_is_ok() { validation_code, descriptor, Arc::new(pov), + Duration::from_secs(0), &Default::default(), )) - .unwrap() .unwrap(); assert_matches!(v, ValidationResult::Valid(outputs, used_validation_data) => { @@ -406,9 +428,9 @@ fn candidate_validation_bad_return_is_invalid() { validation_code, descriptor, Arc::new(pov), + Duration::from_secs(0), &Default::default(), )) - .unwrap() .unwrap(); assert_matches!(v, ValidationResult::Invalid(InvalidCandidate::ExecutionError(_))); @@ -442,9 +464,9 @@ fn candidate_validation_timeout_is_internal_error() { validation_code, descriptor, Arc::new(pov), + Duration::from_secs(0), &Default::default(), - )) - .unwrap(); + )); assert_matches!(v, Ok(ValidationResult::Invalid(InvalidCandidate::Timeout))); } @@ -477,9 +499,9 @@ fn candidate_validation_code_mismatch_is_invalid() { validation_code, descriptor, Arc::new(pov), + Duration::from_secs(0), &Default::default(), )) - .unwrap() .unwrap(); assert_matches!(v, ValidationResult::Invalid(InvalidCandidate::CodeHashMismatch)); @@ -517,9 +539,9 @@ fn compressed_code_works() { validation_code, descriptor, Arc::new(pov), + Duration::from_secs(0), &Default::default(), - )) - .unwrap(); + )); assert_matches!(v, Ok(ValidationResult::Valid(_, _))); } @@ -557,9 +579,9 @@ fn code_decompression_failure_is_invalid() { validation_code, descriptor, Arc::new(pov), + Duration::from_secs(0), &Default::default(), - )) - .unwrap(); + )); assert_matches!(v, Ok(ValidationResult::Invalid(InvalidCandidate::CodeDecompressionFailure))); } @@ -598,9 +620,9 @@ fn pov_decompression_failure_is_invalid() { validation_code, descriptor, Arc::new(pov), + Duration::from_secs(0), &Default::default(), - )) - .unwrap(); + )); assert_matches!(v, Ok(ValidationResult::Invalid(InvalidCandidate::PoVDecompressionFailure))); } diff --git a/node/core/chain-api/Cargo.toml b/node/core/chain-api/Cargo.toml index cd06b137bb79..ffea3a4e559a 100644 --- a/node/core/chain-api/Cargo.toml +++ b/node/core/chain-api/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "polkadot-node-core-chain-api" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.3.17" -tracing = "0.1.26" +tracing = "0.1.28" sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-primitives = { path = "../../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } @@ -17,7 +17,7 @@ sc-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = [dev-dependencies] futures = { version = "0.3.17", features = ["thread-pool"] } maplit = "1.0.2" -parity-scale-codec = "2.0.0" +parity-scale-codec = "2.3.1" polkadot-node-primitives = { path = "../../primitives" } polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/core/chain-selection/Cargo.toml b/node/core/chain-selection/Cargo.toml index 90e35bf7f30c..64a84cdf29be 100644 --- a/node/core/chain-selection/Cargo.toml +++ b/node/core/chain-selection/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "polkadot-node-core-chain-selection" description = "Chain Selection Subsystem" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.3.17" futures-timer = "3" -tracing = "0.1.26" +tracing = "0.1.28" polkadot-primitives = { path = "../../../primitives" } polkadot-node-primitives = { path = "../../primitives" } polkadot-node-subsystem = { path = "../../subsystem" } diff --git a/node/core/chain-selection/src/tests.rs b/node/core/chain-selection/src/tests.rs index c7d204df83b4..396e11520733 100644 --- a/node/core/chain-selection/src/tests.rs +++ b/node/core/chain-selection/src/tests.rs @@ -164,6 +164,13 @@ impl Backend for TestBackend { where I: IntoIterator, { + let ops: Vec<_> = ops.into_iter().collect(); + + // Early return if empty because empty writes shouldn't + // trigger wakeups (they happen on an interval) + if ops.is_empty() { + return Ok(()) + } let mut inner = self.inner.lock(); for op in ops { @@ -521,13 +528,13 @@ async fn finalize_block( block_number: BlockNumber, block_hash: Hash, ) { - let (_, write_tx) = backend.await_next_write(); + let (_, write_rx) = backend.await_next_write(); virtual_overseer .send(OverseerSignal::BlockFinalized(block_hash, block_number).into()) .await; - write_tx.await.unwrap(); + write_rx.await.unwrap(); } fn extract_info_from_chain( @@ -1701,9 +1708,11 @@ fn approve_nonexistent_has_no_effect() { .await; let nonexistent = Hash::repeat_byte(1); - approve_block(&mut virtual_overseer, &backend, nonexistent).await; + virtual_overseer + .send(FromOverseer::Communication { msg: ChainSelectionMessage::Approved(nonexistent) }) + .await; - // a3 is approved, but not a1 or a2. + // None are approved. assert_matches!( backend.load_block_entry(&a3_hash).unwrap().unwrap().viability.approval, Approval::Unapproved diff --git a/node/core/dispute-coordinator/Cargo.toml b/node/core/dispute-coordinator/Cargo.toml index 5c1284a5f1da..0cb6bcc2bf3f 100644 --- a/node/core/dispute-coordinator/Cargo.toml +++ b/node/core/dispute-coordinator/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "polkadot-node-core-dispute-coordinator" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] bitvec = { version = "0.20.1", default-features = false, features = ["alloc"] } futures = "0.3.17" -tracing = "0.1.26" +tracing = "0.1.28" parity-scale-codec = "2" kvdb = "0.10.0" derive_more = "0.99.14" diff --git a/node/core/dispute-coordinator/src/dummy.rs b/node/core/dispute-coordinator/src/dummy.rs index fe3f50f81e8e..d151af60e93d 100644 --- a/node/core/dispute-coordinator/src/dummy.rs +++ b/node/core/dispute-coordinator/src/dummy.rs @@ -30,6 +30,8 @@ use kvdb::KeyValueDB; use parity_scale_codec::{Decode, Encode, Error as CodecError}; use sc_keystore::LocalKeystore; +use crate::metrics::Metrics; + const LOG_TARGET: &str = "parachain::dispute-coordinator"; /// Timestamp based on the 1 Jan 1970 UNIX base, which is persistent across node restarts and OS reboots. @@ -52,7 +54,7 @@ pub struct DisputeCoordinatorSubsystem {} impl DisputeCoordinatorSubsystem { /// Create a new instance of the subsystem. - pub fn new(_: Arc, _: Config, _: Arc) -> Self { + pub fn new(_: Arc, _: Config, _: Arc, _: Metrics) -> Self { DisputeCoordinatorSubsystem {} } } diff --git a/node/core/dispute-coordinator/src/lib.rs b/node/core/dispute-coordinator/src/lib.rs index a99be737de28..38e4f5d66d47 100644 --- a/node/core/dispute-coordinator/src/lib.rs +++ b/node/core/dispute-coordinator/src/lib.rs @@ -25,6 +25,8 @@ //! another node, this will trigger the dispute participation subsystem to recover and validate the block and call //! back to this subsystem. +mod metrics; + #[cfg(feature = "disputes")] mod real; #[cfg(feature = "disputes")] diff --git a/node/core/dispute-coordinator/src/metrics.rs b/node/core/dispute-coordinator/src/metrics.rs new file mode 100644 index 000000000000..b70ec09db976 --- /dev/null +++ b/node/core/dispute-coordinator/src/metrics.rs @@ -0,0 +1,99 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use polkadot_node_subsystem_util::metrics::{self, prometheus}; + +#[derive(Clone)] +struct MetricsInner { + /// Number of opened disputes. + open: prometheus::Counter, + /// Votes of all disputes. + votes: prometheus::CounterVec, + /// Conclusion across all disputes. + concluded: prometheus::CounterVec, +} + +/// Candidate validation metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +#[cfg(feature = "disputes")] +impl Metrics { + pub(crate) fn on_open(&self) { + if let Some(metrics) = &self.0 { + metrics.open.inc(); + } + } + + pub(crate) fn on_valid_vote(&self) { + if let Some(metrics) = &self.0 { + metrics.votes.with_label_values(&["valid"]).inc(); + } + } + + pub(crate) fn on_invalid_vote(&self) { + if let Some(metrics) = &self.0 { + metrics.votes.with_label_values(&["invalid"]).inc(); + } + } + + pub(crate) fn on_concluded_valid(&self) { + if let Some(metrics) = &self.0 { + metrics.concluded.with_label_values(&["valid"]).inc(); + } + } + + pub(crate) fn on_concluded_invalid(&self) { + if let Some(metrics) = &self.0 { + metrics.concluded.with_label_values(&["invalid"]).inc(); + } + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> Result { + let metrics = MetricsInner { + open: prometheus::register( + prometheus::Counter::with_opts(prometheus::Opts::new( + "parachain_candidate_disputes_total", + "Total number of raised disputes.", + ))?, + registry, + )?, + concluded: prometheus::register( + prometheus::CounterVec::new( + prometheus::Opts::new( + "parachain_candidate_dispute_concluded", + "Concluded dispute votes, sorted by candidate is `valid` and `invalid`.", + ), + &["validity"], + )?, + registry, + )?, + votes: prometheus::register( + prometheus::CounterVec::new( + prometheus::Opts::new( + "parachain_candidate_dispute_votes", + "Accumulated dispute votes, sorted by candidate is `valid` and `invalid`.", + ), + &["validity"], + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } +} diff --git a/node/core/dispute-coordinator/src/real/mod.rs b/node/core/dispute-coordinator/src/real/mod.rs index 53f71697798c..b4a1437d7d55 100644 --- a/node/core/dispute-coordinator/src/real/mod.rs +++ b/node/core/dispute-coordinator/src/real/mod.rs @@ -38,7 +38,7 @@ use polkadot_node_primitives::{ use polkadot_node_subsystem::{ errors::{ChainApiError, RuntimeApiError}, messages::{ - BlockDescription, ChainApiMessage, DisputeCoordinatorMessage, DisputeDistributionMessage, + BlockDescription, DisputeCoordinatorMessage, DisputeDistributionMessage, DisputeParticipationMessage, ImportStatementsResult, }, overseer, FromOverseer, OverseerSignal, SpawnedSubsystem, SubsystemContext, SubsystemError, @@ -48,7 +48,7 @@ use polkadot_node_subsystem_util::rolling_session_window::{ }; use polkadot_primitives::v1::{ BlockNumber, CandidateHash, CandidateReceipt, DisputeStatement, Hash, SessionIndex, - SessionInfo, ValidatorIndex, ValidatorPair, ValidatorSignature, + SessionInfo, ValidatorId, ValidatorIndex, ValidatorPair, ValidatorSignature, }; use futures::{channel::oneshot, prelude::*}; @@ -56,6 +56,7 @@ use kvdb::KeyValueDB; use parity_scale_codec::{Decode, Encode, Error as CodecError}; use sc_keystore::LocalKeystore; +use crate::metrics::Metrics; use backend::{Backend, OverlayedBackend}; use db::v1::{DbBackend, RecentDisputes}; @@ -116,12 +117,18 @@ pub struct DisputeCoordinatorSubsystem { config: Config, store: Arc, keystore: Arc, + metrics: Metrics, } impl DisputeCoordinatorSubsystem { /// Create a new instance of the subsystem. - pub fn new(store: Arc, config: Config, keystore: Arc) -> Self { - DisputeCoordinatorSubsystem { store, config, keystore } + pub fn new( + store: Arc, + config: Config, + keystore: Arc, + metrics: Metrics, + ) -> Self { + DisputeCoordinatorSubsystem { store, config, keystore, metrics } } } @@ -329,6 +336,7 @@ where rolling_session_window: RollingSessionWindow::new(DISPUTE_WINDOW), recovery_state: Participation::Pending, }; + let metrics = &subsystem.metrics; loop { let mut overlay_db = OverlayedBackend::new(backend); @@ -348,7 +356,8 @@ where }, FromOverseer::Signal(OverseerSignal::BlockFinalized(_, _)) => {}, FromOverseer::Communication { msg } => - handle_incoming(ctx, &mut overlay_db, &mut state, msg, clock.now()).await?, + handle_incoming(ctx, &mut overlay_db, &mut state, msg, clock.now(), &metrics) + .await?, } if !overlay_db.is_empty() { @@ -469,22 +478,7 @@ async fn handle_new_activations( new_activations: impl IntoIterator, ) -> Result<(), Error> { for new_leaf in new_activations { - let block_header = { - let (tx, rx) = oneshot::channel(); - - ctx.send_message(ChainApiMessage::BlockHeader(new_leaf, tx)).await; - - match rx.await?? { - None => continue, - Some(header) => header, - } - }; - - match state - .rolling_session_window - .cache_session_info_for_head(ctx, new_leaf, &block_header) - .await - { + match state.rolling_session_window.cache_session_info_for_head(ctx, new_leaf).await { Err(e) => { tracing::warn!( target: LOG_TARGET, @@ -518,6 +512,7 @@ async fn handle_incoming( state: &mut State, message: DisputeCoordinatorMessage, now: Timestamp, + metrics: &Metrics, ) -> Result<(), Error> { match message { DisputeCoordinatorMessage::ImportStatements { @@ -527,7 +522,7 @@ async fn handle_incoming( statements, pending_confirmation, } => { - handle_import_statements( + let outcome = handle_import_statements( ctx, overlay_db, state, @@ -536,9 +531,10 @@ async fn handle_incoming( session, statements, now, - pending_confirmation, + metrics, ) .await?; + pending_confirmation.send(outcome).map_err(|_| Error::OneshotSend)?; }, DisputeCoordinatorMessage::RecentDisputes(rx) => { let recent_disputes = overlay_db.load_recent_disputes()?.unwrap_or_default(); @@ -578,6 +574,7 @@ async fn handle_incoming( session, valid, now, + metrics, ) .await?; }, @@ -634,15 +631,11 @@ async fn handle_import_statements( session: SessionIndex, statements: Vec<(SignedDisputeStatement, ValidatorIndex)>, now: Timestamp, - pending_confirmation: oneshot::Sender, -) -> Result<(), Error> { + metrics: &Metrics, +) -> Result { if state.highest_session.map_or(true, |h| session + DISPUTE_WINDOW < h) { // It is not valid to participate in an ancient dispute (spam?). - pending_confirmation - .send(ImportStatementsResult::InvalidImport) - .map_err(|_| Error::OneshotSend)?; - - return Ok(()) + return Ok(ImportStatementsResult::InvalidImport) } let validators = match state.rolling_session_window.session_info(session) { @@ -653,11 +646,7 @@ async fn handle_import_statements( "Missing info for session which has an active dispute", ); - pending_confirmation - .send(ImportStatementsResult::InvalidImport) - .map_err(|_| Error::OneshotSend)?; - - return Ok(()) + return Ok(ImportStatementsResult::InvalidImport) }, Some(info) => info.validators.clone(), }; @@ -694,6 +683,7 @@ async fn handle_import_statements( match statement.statement().clone() { DisputeStatement::Valid(valid_kind) => { + metrics.on_valid_vote(); insert_into_statement_vec( &mut votes.valid, valid_kind, @@ -702,6 +692,7 @@ async fn handle_import_statements( ); }, DisputeStatement::Invalid(invalid_kind) => { + metrics.on_invalid_vote(); insert_into_statement_vec( &mut votes.invalid, invalid_kind, @@ -722,9 +713,15 @@ async fn handle_import_statements( let prev_status = recent_disputes.get(&(session, candidate_hash)).map(|x| x.clone()); let status = if is_disputed { - let status = recent_disputes - .entry((session, candidate_hash)) - .or_insert(DisputeStatus::active()); + let status = recent_disputes.entry((session, candidate_hash)).or_insert_with(|| { + tracing::info!( + target: LOG_TARGET, + ?candidate_hash, + session, + "New dispute initiated for candidate.", + ); + DisputeStatus::active() + }); // Note: concluded-invalid overwrites concluded-valid, // so we do this check first. Dispute state machine is @@ -745,8 +742,15 @@ async fn handle_import_statements( if status != prev_status { // This branch is only hit when the candidate is freshly disputed - // status was previously `None`, and now is not. - if prev_status.is_none() { - // No matter what, if the dispute is new, we participate. + if prev_status.is_none() && { + let controlled_indices = + find_controlled_validator_indices(&state.keystore, &validators); + let voted_indices = votes.voted_indices(); + + !controlled_indices.iter().all(|val_index| voted_indices.contains(&val_index)) + } { + // If the dispute is new, we participate UNLESS all our controlled + // keys have already participated. // // We also block the coordinator while awaiting our determination // of whether the vote is available. @@ -767,15 +771,20 @@ async fn handle_import_statements( // // We expect that if the candidate is truly disputed that the higher-level network // code will retry. - pending_confirmation - .send(ImportStatementsResult::InvalidImport) - .map_err(|_| Error::OneshotSend)?; tracing::debug!( target: LOG_TARGET, "Recovering availability failed - invalid import." ); - return Ok(()) + return Ok(ImportStatementsResult::InvalidImport) + } + metrics.on_open(); + + if concluded_valid { + metrics.on_concluded_valid(); + } + if concluded_invalid { + metrics.on_concluded_invalid(); } } @@ -785,11 +794,23 @@ async fn handle_import_statements( overlay_db.write_candidate_votes(session, candidate_hash, votes.into()); - pending_confirmation - .send(ImportStatementsResult::ValidImport) - .map_err(|_| Error::OneshotSend)?; + Ok(ImportStatementsResult::ValidImport) +} - Ok(()) +fn find_controlled_validator_indices( + keystore: &LocalKeystore, + validators: &[ValidatorId], +) -> HashSet { + let mut controlled = HashSet::new(); + for (index, validator) in validators.iter().enumerate() { + if keystore.key_pair::(validator).ok().flatten().is_none() { + continue + } + + controlled.insert(ValidatorIndex(index as _)); + } + + controlled } async fn issue_local_statement( @@ -801,6 +822,7 @@ async fn issue_local_statement( session: SessionIndex, valid: bool, now: Timestamp, + metrics: &Metrics, ) -> Result<(), Error> { // Load session info. let info = match state.rolling_session_window.session_info(session) { @@ -833,14 +855,11 @@ async fn issue_local_statement( let mut statements = Vec::new(); let voted_indices: HashSet<_> = voted_indices.into_iter().collect(); - for (index, validator) in validators.iter().enumerate() { - let index = ValidatorIndex(index as _); + let controlled_indices = find_controlled_validator_indices(&state.keystore, &validators[..]); + for index in controlled_indices { if voted_indices.contains(&index) { continue } - if state.keystore.key_pair::(validator).ok().flatten().is_none() { - continue - } let keystore = state.keystore.clone() as Arc<_>; let res = SignedDisputeStatement::sign_explicit( @@ -848,7 +867,7 @@ async fn issue_local_statement( valid, candidate_hash, session, - validator.clone(), + validators[index.0 as usize].clone(), ) .await; @@ -882,8 +901,7 @@ async fn issue_local_statement( // Do import if !statements.is_empty() { - let (pending_confirmation, rx) = oneshot::channel(); - handle_import_statements( + match handle_import_statements( ctx, overlay_db, state, @@ -892,10 +910,10 @@ async fn issue_local_statement( session, statements, now, - pending_confirmation, + metrics, ) - .await?; - match rx.await { + .await + { Err(_) => { tracing::error!( target: LOG_TARGET, diff --git a/node/core/dispute-coordinator/src/real/tests.rs b/node/core/dispute-coordinator/src/real/tests.rs index 60d7ade2fd79..c8709da92916 100644 --- a/node/core/dispute-coordinator/src/real/tests.rs +++ b/node/core/dispute-coordinator/src/real/tests.rs @@ -26,9 +26,7 @@ use overseer::TimeoutExt; use parity_scale_codec::Encode; use polkadot_node_subsystem::{ jaeger, - messages::{ - AllMessages, BlockDescription, ChainApiMessage, RuntimeApiMessage, RuntimeApiRequest, - }, + messages::{AllMessages, BlockDescription, RuntimeApiMessage, RuntimeApiRequest}, ActivatedLeaf, ActiveLeavesUpdate, LeafStatus, }; use polkadot_node_subsystem_test_helpers::{make_subsystem_context, TestSubsystemContextHandle}; @@ -107,6 +105,7 @@ impl Default for TestState { Sr25519Keyring::Dave, Sr25519Keyring::Eve, Sr25519Keyring::One, + Sr25519Keyring::Ferdie, ]; let validator_public = validators.iter().map(|k| ValidatorId::from(k.public())).collect(); @@ -114,7 +113,7 @@ impl Default for TestState { let validator_groups = vec![ vec![ValidatorIndex(0), ValidatorIndex(1)], vec![ValidatorIndex(2), ValidatorIndex(3)], - vec![ValidatorIndex(4), ValidatorIndex(5)], + vec![ValidatorIndex(4), ValidatorIndex(5), ValidatorIndex(6)], ]; let master_keystore = make_keystore(&validators).into(); @@ -169,33 +168,22 @@ impl TestState { ))) .await; - self.handle_sync_queries(virtual_overseer, block_hash, block_header, session) - .await; + self.handle_sync_queries(virtual_overseer, block_hash, session).await; } async fn handle_sync_queries( &self, virtual_overseer: &mut VirtualOverseer, block_hash: Hash, - block_header: Header, session: SessionIndex, ) { - assert_matches!( - virtual_overseer.recv().await, - AllMessages::ChainApi(ChainApiMessage::BlockHeader(h, tx)) => { - assert_eq!(h, block_hash); - let _ = tx.send(Ok(Some(block_header))); - } - ); - assert_matches!( virtual_overseer.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( h, RuntimeApiRequest::SessionIndexForChild(tx), )) => { - let parent_hash = session_to_hash(session, b"parent"); - assert_eq!(h, parent_hash); + assert_eq!(h, block_hash); let _ = tx.send(Ok(session)); } ); @@ -235,8 +223,7 @@ impl TestState { ))) .await; - let header = self.headers.get(leaf).unwrap().clone(); - self.handle_sync_queries(virtual_overseer, *leaf, header, session).await; + self.handle_sync_queries(virtual_overseer, *leaf, session).await; } } @@ -285,6 +272,7 @@ impl TestState { self.db.clone(), self.config.clone(), self.subsystem_keystore.clone(), + Metrics::default(), ); let backend = DbBackend::new(self.db.clone(), self.config.column_config()); let subsystem_task = run(subsystem, ctx, backend, Box::new(self.clock.clone())); @@ -316,7 +304,7 @@ fn conflicting_votes_lead_to_dispute_participation() { test_state.activate_leaf_at_session(&mut virtual_overseer, session, 1).await; let valid_vote = - test_state.issue_statement_with_index(0, candidate_hash, session, true).await; + test_state.issue_statement_with_index(3, candidate_hash, session, true).await; let invalid_vote = test_state.issue_statement_with_index(1, candidate_hash, session, false).await; @@ -332,7 +320,7 @@ fn conflicting_votes_lead_to_dispute_participation() { candidate_receipt: candidate_receipt.clone(), session, statements: vec![ - (valid_vote, ValidatorIndex(0)), + (valid_vote, ValidatorIndex(3)), (invalid_vote, ValidatorIndex(1)), ], pending_confirmation, @@ -434,7 +422,7 @@ fn positive_votes_dont_trigger_participation() { test_state.activate_leaf_at_session(&mut virtual_overseer, session, 1).await; let valid_vote = - test_state.issue_statement_with_index(0, candidate_hash, session, true).await; + test_state.issue_statement_with_index(2, candidate_hash, session, true).await; let valid_vote_2 = test_state.issue_statement_with_index(1, candidate_hash, session, true).await; @@ -446,7 +434,7 @@ fn positive_votes_dont_trigger_participation() { candidate_hash, candidate_receipt: candidate_receipt.clone(), session, - statements: vec![(valid_vote, ValidatorIndex(0))], + statements: vec![(valid_vote, ValidatorIndex(2))], pending_confirmation, }, }) @@ -539,7 +527,7 @@ fn wrong_validator_index_is_ignored() { test_state.activate_leaf_at_session(&mut virtual_overseer, session, 1).await; let valid_vote = - test_state.issue_statement_with_index(0, candidate_hash, session, true).await; + test_state.issue_statement_with_index(2, candidate_hash, session, true).await; let invalid_vote = test_state.issue_statement_with_index(1, candidate_hash, session, false).await; @@ -553,7 +541,7 @@ fn wrong_validator_index_is_ignored() { session, statements: vec![ (valid_vote, ValidatorIndex(1)), - (invalid_vote, ValidatorIndex(0)), + (invalid_vote, ValidatorIndex(2)), ], pending_confirmation, }, @@ -609,7 +597,7 @@ fn finality_votes_ignore_disputed_candidates() { test_state.activate_leaf_at_session(&mut virtual_overseer, session, 1).await; let valid_vote = - test_state.issue_statement_with_index(0, candidate_hash, session, true).await; + test_state.issue_statement_with_index(2, candidate_hash, session, true).await; let invalid_vote = test_state.issue_statement_with_index(1, candidate_hash, session, false).await; @@ -622,7 +610,7 @@ fn finality_votes_ignore_disputed_candidates() { candidate_receipt: candidate_receipt.clone(), session, statements: vec![ - (valid_vote, ValidatorIndex(0)), + (valid_vote, ValidatorIndex(2)), (invalid_vote, ValidatorIndex(1)), ], pending_confirmation, @@ -715,7 +703,7 @@ fn supermajority_valid_dispute_may_be_finalized() { polkadot_primitives::v1::supermajority_threshold(test_state.validators.len()); let valid_vote = - test_state.issue_statement_with_index(0, candidate_hash, session, true).await; + test_state.issue_statement_with_index(2, candidate_hash, session, true).await; let invalid_vote = test_state.issue_statement_with_index(1, candidate_hash, session, false).await; @@ -728,7 +716,7 @@ fn supermajority_valid_dispute_may_be_finalized() { candidate_receipt: candidate_receipt.clone(), session, statements: vec![ - (valid_vote, ValidatorIndex(0)), + (valid_vote, ValidatorIndex(2)), (invalid_vote, ValidatorIndex(1)), ], pending_confirmation, @@ -755,7 +743,7 @@ fn supermajority_valid_dispute_may_be_finalized() { ); let mut statements = Vec::new(); - for i in (0..supermajority_threshold - 1).map(|i| i + 2) { + for i in (0..supermajority_threshold - 1).map(|i| i + 3) { let vote = test_state.issue_statement_with_index(i, candidate_hash, session, true).await; @@ -848,7 +836,7 @@ fn concluded_supermajority_for_non_active_after_time() { polkadot_primitives::v1::supermajority_threshold(test_state.validators.len()); let valid_vote = - test_state.issue_statement_with_index(0, candidate_hash, session, true).await; + test_state.issue_statement_with_index(2, candidate_hash, session, true).await; let invalid_vote = test_state.issue_statement_with_index(1, candidate_hash, session, false).await; @@ -861,7 +849,7 @@ fn concluded_supermajority_for_non_active_after_time() { candidate_receipt: candidate_receipt.clone(), session, statements: vec![ - (valid_vote, ValidatorIndex(0)), + (valid_vote, ValidatorIndex(2)), (invalid_vote, ValidatorIndex(1)), ], pending_confirmation, @@ -882,7 +870,7 @@ fn concluded_supermajority_for_non_active_after_time() { ); let mut statements = Vec::new(); - for i in (0..supermajority_threshold - 1).map(|i| i + 2) { + for i in (0..supermajority_threshold - 1).map(|i| i + 3) { let vote = test_state.issue_statement_with_index(i, candidate_hash, session, true).await; @@ -951,7 +939,7 @@ fn concluded_supermajority_against_non_active_after_time() { polkadot_primitives::v1::supermajority_threshold(test_state.validators.len()); let valid_vote = - test_state.issue_statement_with_index(0, candidate_hash, session, true).await; + test_state.issue_statement_with_index(2, candidate_hash, session, true).await; let invalid_vote = test_state.issue_statement_with_index(1, candidate_hash, session, false).await; @@ -964,7 +952,7 @@ fn concluded_supermajority_against_non_active_after_time() { candidate_receipt: candidate_receipt.clone(), session, statements: vec![ - (valid_vote, ValidatorIndex(0)), + (valid_vote, ValidatorIndex(2)), (invalid_vote, ValidatorIndex(1)), ], pending_confirmation, @@ -985,7 +973,7 @@ fn concluded_supermajority_against_non_active_after_time() { ); let mut statements = Vec::new(); - for i in (0..supermajority_threshold - 1).map(|i| i + 2) { + for i in (0..supermajority_threshold - 1).map(|i| i + 3) { let vote = test_state.issue_statement_with_index(i, candidate_hash, session, false).await; @@ -1051,7 +1039,7 @@ fn fresh_dispute_ignored_if_unavailable() { test_state.activate_leaf_at_session(&mut virtual_overseer, session, 1).await; let valid_vote = - test_state.issue_statement_with_index(0, candidate_hash, session, true).await; + test_state.issue_statement_with_index(2, candidate_hash, session, true).await; let invalid_vote = test_state.issue_statement_with_index(1, candidate_hash, session, false).await; @@ -1064,7 +1052,7 @@ fn fresh_dispute_ignored_if_unavailable() { candidate_receipt: candidate_receipt.clone(), session, statements: vec![ - (valid_vote, ValidatorIndex(0)), + (valid_vote, ValidatorIndex(2)), (invalid_vote, ValidatorIndex(1)), ], pending_confirmation, @@ -1298,18 +1286,6 @@ fn resume_dispute_with_local_statement() { }) .await; - assert_matches!( - virtual_overseer.recv().await, - AllMessages::DisputeParticipation( - DisputeParticipationMessage::Participate { - report_availability, - .. - } - ) => { - report_availability.send(true).unwrap(); - } - ); - assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); { @@ -1330,7 +1306,7 @@ fn resume_dispute_with_local_statement() { test_state }) }) - // Alice should send a DisputeParticiationMessage::Participate on restart since she has no + // Alice should not send a DisputeParticiationMessage::Participate on restart since she has a // local statement for the active dispute. .resume(|test_state, mut virtual_overseer| { Box::pin(async move { @@ -1384,18 +1360,6 @@ fn resume_dispute_without_local_statement_or_local_key() { }) .await; - assert_matches!( - virtual_overseer.recv().await, - AllMessages::DisputeParticipation( - DisputeParticipationMessage::Participate { - report_availability, - .. - } - ) => { - report_availability.send(true).unwrap(); - } - ); - assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); { @@ -1416,8 +1380,8 @@ fn resume_dispute_without_local_statement_or_local_key() { test_state }) }) - // Alice should send a DisputeParticiationMessage::Participate on restart since she has no - // local statement for the active dispute. + // Two should not send a DisputeParticiationMessage::Participate on restart since she is no + // validator in that dispute. .resume(|test_state, mut virtual_overseer| { Box::pin(async move { test_state.handle_resume_sync(&mut virtual_overseer, session).await; @@ -1437,89 +1401,197 @@ fn resume_dispute_without_local_statement_or_local_key() { fn resume_dispute_with_local_statement_without_local_key() { let session = 1; - let mut test_state = TestState::default(); - test_state.subsystem_keystore = make_keystore(&[Sr25519Keyring::Two]).into(); - test_state - .resume(|mut test_state, mut virtual_overseer| { - Box::pin(async move { - test_state.handle_resume_sync(&mut virtual_overseer, session).await; + let test_state = TestState::default(); + let mut test_state = test_state.resume(|mut test_state, mut virtual_overseer| { + Box::pin(async move { + test_state.handle_resume_sync(&mut virtual_overseer, session).await; - let candidate_receipt = CandidateReceipt::default(); - let candidate_hash = candidate_receipt.hash(); + let candidate_receipt = CandidateReceipt::default(); + let candidate_hash = candidate_receipt.hash(); - test_state.activate_leaf_at_session(&mut virtual_overseer, session, 1).await; + test_state.activate_leaf_at_session(&mut virtual_overseer, session, 1).await; - let local_valid_vote = - test_state.issue_statement_with_index(0, candidate_hash, session, true).await; + let local_valid_vote = + test_state.issue_statement_with_index(0, candidate_hash, session, true).await; - let valid_vote = - test_state.issue_statement_with_index(1, candidate_hash, session, true).await; + let valid_vote = + test_state.issue_statement_with_index(1, candidate_hash, session, true).await; - let invalid_vote = - test_state.issue_statement_with_index(2, candidate_hash, session, false).await; + let invalid_vote = + test_state.issue_statement_with_index(2, candidate_hash, session, false).await; + + let (pending_confirmation, confirmation_rx) = oneshot::channel(); + virtual_overseer + .send(FromOverseer::Communication { + msg: DisputeCoordinatorMessage::ImportStatements { + candidate_hash, + candidate_receipt: candidate_receipt.clone(), + session, + statements: vec![ + (local_valid_vote, ValidatorIndex(0)), + (valid_vote, ValidatorIndex(1)), + (invalid_vote, ValidatorIndex(2)), + ], + pending_confirmation, + }, + }) + .await; + + assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); + + { + let (tx, rx) = oneshot::channel(); - let (pending_confirmation, confirmation_rx) = oneshot::channel(); virtual_overseer .send(FromOverseer::Communication { - msg: DisputeCoordinatorMessage::ImportStatements { - candidate_hash, - candidate_receipt: candidate_receipt.clone(), - session, - statements: vec![ - (local_valid_vote, ValidatorIndex(0)), - (valid_vote, ValidatorIndex(1)), - (invalid_vote, ValidatorIndex(2)), - ], - pending_confirmation, - }, + msg: DisputeCoordinatorMessage::ActiveDisputes(tx), }) .await; - assert_matches!( - virtual_overseer.recv().await, - AllMessages::DisputeParticipation( - DisputeParticipationMessage::Participate { - report_availability, - .. - } - ) => { - report_availability.send(true).unwrap(); - } - ); + assert_eq!(rx.await.unwrap().len(), 1); + } - assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); + virtual_overseer.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + assert!(virtual_overseer.try_recv().await.is_none()); - { - let (tx, rx) = oneshot::channel(); + test_state + }) + }); + // No keys: + test_state.subsystem_keystore = make_keystore(&[Sr25519Keyring::Two]).into(); + // Two should not send a DisputeParticiationMessage::Participate on restart since we gave + // her a non existing key. + test_state.resume(|test_state, mut virtual_overseer| { + Box::pin(async move { + test_state.handle_resume_sync(&mut virtual_overseer, session).await; - virtual_overseer - .send(FromOverseer::Communication { - msg: DisputeCoordinatorMessage::ActiveDisputes(tx), - }) - .await; + // Assert that subsystem is not sending Participation messages because we don't + // have a key. + assert!(virtual_overseer.recv().timeout(TEST_TIMEOUT).await.is_none()); - assert_eq!(rx.await.unwrap().len(), 1); + virtual_overseer.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + assert!(virtual_overseer.try_recv().await.is_none()); + + test_state + }) + }); +} + +#[test] +fn issue_valid_local_statement_does_cause_distribution_but_not_duplicate_participation() { + issue_local_statement_does_cause_distribution_but_not_duplicate_participation(true); +} + +#[test] +fn issue_invalid_local_statement_does_cause_distribution_but_not_duplicate_participation() { + issue_local_statement_does_cause_distribution_but_not_duplicate_participation(false); +} + +fn issue_local_statement_does_cause_distribution_but_not_duplicate_participation(validity: bool) { + test_harness(|mut test_state, mut virtual_overseer| { + Box::pin(async move { + let session = 1; + + test_state.handle_resume_sync(&mut virtual_overseer, session).await; + + let candidate_receipt = CandidateReceipt::default(); + let candidate_hash = candidate_receipt.hash(); + + test_state.activate_leaf_at_session(&mut virtual_overseer, session, 1).await; + + let other_vote = test_state + .issue_statement_with_index(1, candidate_hash, session, !validity) + .await; + + let (pending_confirmation, confirmation_rx) = oneshot::channel(); + virtual_overseer + .send(FromOverseer::Communication { + msg: DisputeCoordinatorMessage::ImportStatements { + candidate_hash, + candidate_receipt: candidate_receipt.clone(), + session, + statements: vec![(other_vote, ValidatorIndex(1))], + pending_confirmation, + }, + }) + .await; + + assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); + + // Initiate dispute locally: + virtual_overseer + .send(FromOverseer::Communication { + msg: DisputeCoordinatorMessage::IssueLocalStatement( + session, + candidate_hash, + candidate_receipt.clone(), + validity, + ), + }) + .await; + + // Dispute distribution should get notified now: + assert_matches!( + virtual_overseer.recv().await, + AllMessages::DisputeDistribution( + DisputeDistributionMessage::SendDispute(msg) + ) => { + assert_eq!(msg.session_index(), session); + assert_eq!(msg.candidate_receipt(), &candidate_receipt); } + ); - virtual_overseer.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - assert!(virtual_overseer.try_recv().await.is_none()); + // Make sure we don't get a `DisputeParticiationMessage`. + assert!(virtual_overseer.recv().timeout(TEST_TIMEOUT).await.is_none()); - test_state - }) + virtual_overseer.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + assert!(virtual_overseer.try_recv().await.is_none()); + + test_state }) - // Alice should send a DisputeParticiationMessage::Participate on restart since she has no - // local statement for the active dispute. - .resume(|test_state, mut virtual_overseer| { - Box::pin(async move { - test_state.handle_resume_sync(&mut virtual_overseer, session).await; + }); +} - // Assert that subsystem is not sending Participation messages because we issued a local statement - assert!(virtual_overseer.recv().timeout(TEST_TIMEOUT).await.is_none()); +#[test] +fn negative_issue_local_statement_only_triggers_import() { + test_harness(|mut test_state, mut virtual_overseer| { + Box::pin(async move { + let session = 1; - virtual_overseer.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - assert!(virtual_overseer.try_recv().await.is_none()); + test_state.handle_resume_sync(&mut virtual_overseer, session).await; - test_state - }) - }); + let candidate_receipt = CandidateReceipt::default(); + let candidate_hash = candidate_receipt.hash(); + + test_state.activate_leaf_at_session(&mut virtual_overseer, session, 1).await; + + virtual_overseer + .send(FromOverseer::Communication { + msg: DisputeCoordinatorMessage::IssueLocalStatement( + session, + candidate_hash, + candidate_receipt.clone(), + false, + ), + }) + .await; + + let backend = DbBackend::new(test_state.db.clone(), test_state.config.column_config()); + + let votes = backend.load_candidate_votes(session, &candidate_hash).unwrap().unwrap(); + assert_eq!(votes.invalid.len(), 1); + assert_eq!(votes.valid.len(), 0); + + let disputes = backend.load_recent_disputes().unwrap(); + assert_eq!(disputes, None); + + // Assert that subsystem is not sending Participation messages: + assert!(virtual_overseer.recv().timeout(TEST_TIMEOUT).await.is_none()); + + virtual_overseer.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + assert!(virtual_overseer.try_recv().await.is_none()); + + test_state + }) + }); } diff --git a/node/core/dispute-participation/Cargo.toml b/node/core/dispute-participation/Cargo.toml index dbbb729ec569..5b1843d02b9c 100644 --- a/node/core/dispute-participation/Cargo.toml +++ b/node/core/dispute-participation/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "polkadot-node-core-dispute-participation" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.3.17" thiserror = "1.0.26" -tracing = "0.1.26" +tracing = "0.1.28" polkadot-node-primitives = { path = "../../primitives" } polkadot-node-subsystem = { path = "../../subsystem" } @@ -15,6 +15,6 @@ polkadot-primitives = { path = "../../../primitives" } [dev-dependencies] assert_matches = "1.5.0" -parity-scale-codec = "2.0.0" +parity-scale-codec = "2.3.1" polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers"} sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/core/dispute-participation/src/lib.rs b/node/core/dispute-participation/src/lib.rs index c79d10462e06..21258ad5be11 100644 --- a/node/core/dispute-participation/src/lib.rs +++ b/node/core/dispute-participation/src/lib.rs @@ -22,7 +22,7 @@ use futures::{channel::oneshot, prelude::*}; -use polkadot_node_primitives::ValidationResult; +use polkadot_node_primitives::{ValidationResult, APPROVAL_EXECUTION_TIMEOUT}; use polkadot_node_subsystem::{ errors::{RecoveryError, RuntimeApiError}, messages::{ @@ -248,13 +248,12 @@ async fn participate( // we dispatch a request to store the available data for the candidate. we // want to maximize data availability for other potential checkers involved // in the dispute - ctx.send_message(AvailabilityStoreMessage::StoreAvailableData( + ctx.send_message(AvailabilityStoreMessage::StoreAvailableData { candidate_hash, - None, n_validators, - available_data.clone(), - store_available_data_tx, - )) + available_data: available_data.clone(), + tx: store_available_data_tx, + }) .await; match store_available_data_rx.await? { @@ -270,11 +269,16 @@ async fn participate( // we issue a request to validate the candidate with the provided exhaustive // parameters + // + // We use the approval execution timeout because this is intended to + // be run outside of backing and therefore should be subject to the + // same level of leeway. ctx.send_message(CandidateValidationMessage::ValidateFromExhaustive( available_data.validation_data, validation_code, candidate_receipt.descriptor.clone(), available_data.pov, + APPROVAL_EXECUTION_TIMEOUT, validation_tx, )) .await; diff --git a/node/core/dispute-participation/src/tests.rs b/node/core/dispute-participation/src/tests.rs index 40bfdd3f7b61..513f673f81a2 100644 --- a/node/core/dispute-participation/src/tests.rs +++ b/node/core/dispute-participation/src/tests.rs @@ -150,13 +150,7 @@ async fn fetch_validation_code(virtual_overseer: &mut VirtualOverseer) { async fn store_available_data(virtual_overseer: &mut VirtualOverseer, success: bool) { assert_matches!( virtual_overseer.recv().await, - AllMessages::AvailabilityStore(AvailabilityStoreMessage::StoreAvailableData( - _, - _, - _, - _, - tx, - )) => { + AllMessages::AvailabilityStore(AvailabilityStoreMessage::StoreAvailableData { tx, .. }) => { if success { tx.send(Ok(())).unwrap(); } else { @@ -301,8 +295,8 @@ fn cast_invalid_vote_if_validation_fails_or_is_invalid() { assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateValidation( - CandidateValidationMessage::ValidateFromExhaustive(_, _, _, _, tx) - ) => { + CandidateValidationMessage::ValidateFromExhaustive(_, _, _, _, timeout, tx) + ) if timeout == APPROVAL_EXECUTION_TIMEOUT => { tx.send(Ok(ValidationResult::Invalid(InvalidCandidate::Timeout))).unwrap(); }, "overseer did not receive candidate validation message", @@ -337,8 +331,8 @@ fn cast_invalid_vote_if_validation_passes_but_commitments_dont_match() { assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateValidation( - CandidateValidationMessage::ValidateFromExhaustive(_, _, _, _, tx) - ) => { + CandidateValidationMessage::ValidateFromExhaustive(_, _, _, _, timeout, tx) + ) if timeout == APPROVAL_EXECUTION_TIMEOUT => { let mut commitments = CandidateCommitments::default(); // this should lead to a commitments hash mismatch commitments.processed_downward_messages = 42; @@ -377,8 +371,8 @@ fn cast_valid_vote_if_validation_passes() { assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateValidation( - CandidateValidationMessage::ValidateFromExhaustive(_, _, _, _, tx) - ) => { + CandidateValidationMessage::ValidateFromExhaustive(_, _, _, _, timeout, tx) + ) if timeout == APPROVAL_EXECUTION_TIMEOUT => { tx.send(Ok(ValidationResult::Valid(Default::default(), Default::default()))).unwrap(); }, "overseer did not receive candidate validation message", @@ -414,8 +408,8 @@ fn failure_to_store_available_data_does_not_preclude_participation() { assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateValidation( - CandidateValidationMessage::ValidateFromExhaustive(_, _, _, _, tx) - ) => { + CandidateValidationMessage::ValidateFromExhaustive(_, _, _, _, timeout, tx) + ) if timeout == APPROVAL_EXECUTION_TIMEOUT => { tx.send(Err(ValidationFailed("fail".to_string()))).unwrap(); }, "overseer did not receive candidate validation message", diff --git a/node/core/parachains-inherent/Cargo.toml b/node/core/parachains-inherent/Cargo.toml index 0cbb861bf1d1..4a40d3f1e383 100644 --- a/node/core/parachains-inherent/Cargo.toml +++ b/node/core/parachains-inherent/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "polkadot-node-core-parachains-inherent" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.3.17" futures-timer = "3.0.2" -tracing = "0.1.26" +tracing = "0.1.28" thiserror = "1.0.26" async-trait = "0.1.51" polkadot-node-subsystem = { path = "../../subsystem" } diff --git a/node/core/provisioner/Cargo.toml b/node/core/provisioner/Cargo.toml index 81541f0a0287..a5313e348226 100644 --- a/node/core/provisioner/Cargo.toml +++ b/node/core/provisioner/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "polkadot-node-core-provisioner" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] bitvec = { version = "0.20.1", default-features = false, features = ["alloc"] } futures = "0.3.17" -tracing = "0.1.26" +tracing = "0.1.28" thiserror = "1.0.26" polkadot-primitives = { path = "../../../primitives" } polkadot-node-subsystem = { path = "../../subsystem" } diff --git a/node/core/pvf/Cargo.toml b/node/core/pvf/Cargo.toml index c994835d4924..51f4c8a7b173 100644 --- a/node/core/pvf/Cargo.toml +++ b/node/core/pvf/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-node-core-pvf" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" @@ -10,17 +10,17 @@ path = "bin/puppet_worker.rs" [dependencies] always-assert = "0.1" -async-std = { version = "1.8.0", features = ["attributes"] } +async-std = { version = "1.10.0", features = ["attributes"] } async-process = "1.1.0" assert_matches = "1.4.0" futures = "0.3.17" futures-timer = "3.0.2" -libc = "0.2.101" +libc = "0.2.103" slotmap = "1.0" -tracing = "0.1.26" +tracing = "0.1.28" pin-project = "1.0.8" rand = "0.8.3" -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } polkadot-parachain = { path = "../../../parachain" } polkadot-core-primitives = { path = "../../../core-primitives" } polkadot-node-subsystem-util = { path = "../../subsystem-util"} diff --git a/node/core/pvf/src/artifacts.rs b/node/core/pvf/src/artifacts.rs index 1a3429f7ab11..dfe08afe1a70 100644 --- a/node/core/pvf/src/artifacts.rs +++ b/node/core/pvf/src/artifacts.rs @@ -150,7 +150,7 @@ impl Artifacts { /// Inform the table about the artifact with the given ID. The state will be set to "preparing". /// - /// This function must be used only for brand new artifacts and should never be used for + /// This function must be used only for brand-new artifacts and should never be used for /// replacing existing ones. pub fn insert_preparing(&mut self, artifact_id: ArtifactId) { // See the precondition. @@ -159,7 +159,7 @@ impl Artifacts { /// Insert an artifact with the given ID as "prepared". /// - /// This function must be used only for brand new artifacts and should never be used for + /// This function must be used only for brand-new artifacts and should never be used for /// replacing existing ones. #[cfg(test)] pub fn insert_prepared(&mut self, artifact_id: ArtifactId, last_time_needed: SystemTime) { diff --git a/node/core/pvf/src/execute/queue.rs b/node/core/pvf/src/execute/queue.rs index 09e848196820..9376d7d76f78 100644 --- a/node/core/pvf/src/execute/queue.rs +++ b/node/core/pvf/src/execute/queue.rs @@ -38,11 +38,17 @@ slotmap::new_key_type! { struct Worker; } #[derive(Debug)] pub enum ToQueue { - Enqueue { artifact: ArtifactPathId, params: Vec, result_tx: ResultSender }, + Enqueue { + artifact: ArtifactPathId, + execution_timeout: Duration, + params: Vec, + result_tx: ResultSender, + }, } struct ExecuteJob { artifact: ArtifactPathId, + execution_timeout: Duration, params: Vec, result_tx: ResultSender, } @@ -167,14 +173,14 @@ async fn purge_dead(metrics: &Metrics, workers: &mut Workers) { } fn handle_to_queue(queue: &mut Queue, to_queue: ToQueue) { - let ToQueue::Enqueue { artifact, params, result_tx } = to_queue; + let ToQueue::Enqueue { artifact, execution_timeout, params, result_tx } = to_queue; tracing::debug!( target: LOG_TARGET, validation_code_hash = ?artifact.id.code_hash, "enqueueing an artifact for execution", ); queue.metrics.execute_enqueued(); - let job = ExecuteJob { artifact, params, result_tx }; + let job = ExecuteJob { artifact, execution_timeout, params, result_tx }; if let Some(available) = queue.workers.find_available() { assign(queue, available, job); @@ -326,7 +332,13 @@ fn assign(queue: &mut Queue, worker: Worker, job: ExecuteJob) { queue.mux.push( async move { let _timer = execution_timer; - let outcome = super::worker::start_work(idle, job.artifact.clone(), job.params).await; + let outcome = super::worker::start_work( + idle, + job.artifact.clone(), + job.execution_timeout, + job.params, + ) + .await; QueueEvent::StartWork(worker, outcome, job.artifact.id, job.result_tx) } .boxed(), diff --git a/node/core/pvf/src/execute/worker.rs b/node/core/pvf/src/execute/worker.rs index 97fe5aec3dbf..86e892672d9e 100644 --- a/node/core/pvf/src/execute/worker.rs +++ b/node/core/pvf/src/execute/worker.rs @@ -34,8 +34,6 @@ use parity_scale_codec::{Decode, Encode}; use polkadot_parachain::primitives::ValidationResult; use std::time::{Duration, Instant}; -const EXECUTION_TIMEOUT: Duration = Duration::from_secs(3); - /// Spawns a new worker with the given program path that acts as the worker and the spawn timeout. /// /// The program should be able to handle ` execute-worker ` invocation. @@ -69,6 +67,7 @@ pub enum Outcome { pub async fn start_work( worker: IdleWorker, artifact: ArtifactPathId, + execution_timeout: Duration, validation_params: Vec, ) -> Outcome { let IdleWorker { mut stream, pid } = worker; @@ -108,7 +107,7 @@ pub async fn start_work( Ok(response) => response, } }, - _ = Delay::new(EXECUTION_TIMEOUT).fuse() => { + _ = Delay::new(execution_timeout).fuse() => { tracing::warn!( target: LOG_TARGET, worker_pid = %pid, diff --git a/node/core/pvf/src/host.rs b/node/core/pvf/src/host.rs index 89b230bc90d7..40c30ca65c21 100644 --- a/node/core/pvf/src/host.rs +++ b/node/core/pvf/src/host.rs @@ -48,8 +48,8 @@ pub struct ValidationHost { } impl ValidationHost { - /// Execute PVF with the given code, parameters and priority. The result of execution will be sent - /// to the provided result sender. + /// Execute PVF with the given code, execution timeout, parameters and priority. + /// The result of execution will be sent to the provided result sender. /// /// This is async to accommodate the fact a possibility of back-pressure. In the vast majority of /// situations this function should return immediately. @@ -58,12 +58,13 @@ impl ValidationHost { pub async fn execute_pvf( &mut self, pvf: Pvf, + execution_timeout: Duration, params: Vec, priority: Priority, result_tx: ResultSender, ) -> Result<(), String> { self.to_host_tx - .send(ToHost::ExecutePvf { pvf, params, priority, result_tx }) + .send(ToHost::ExecutePvf { pvf, execution_timeout, params, priority, result_tx }) .await .map_err(|_| "the inner loop hung up".to_string()) } @@ -83,8 +84,16 @@ impl ValidationHost { } enum ToHost { - ExecutePvf { pvf: Pvf, params: Vec, priority: Priority, result_tx: ResultSender }, - HeadsUp { active_pvfs: Vec }, + ExecutePvf { + pvf: Pvf, + execution_timeout: Duration, + params: Vec, + priority: Priority, + result_tx: ResultSender, + }, + HeadsUp { + active_pvfs: Vec, + }, } /// Configuration for the validation host. @@ -200,6 +209,7 @@ pub fn start(config: Config, metrics: Metrics) -> (ValidationHost, impl Future, result_tx: ResultSender, } @@ -210,11 +220,18 @@ struct PendingExecutionRequest { struct AwaitingPrepare(HashMap>); impl AwaitingPrepare { - fn add(&mut self, artifact_id: ArtifactId, params: Vec, result_tx: ResultSender) { - self.0 - .entry(artifact_id) - .or_default() - .push(PendingExecutionRequest { params, result_tx }); + fn add( + &mut self, + artifact_id: ArtifactId, + execution_timeout: Duration, + params: Vec, + result_tx: ResultSender, + ) { + self.0.entry(artifact_id).or_default().push(PendingExecutionRequest { + execution_timeout, + params, + result_tx, + }); } fn take(&mut self, artifact_id: &ArtifactId) -> Vec { @@ -360,7 +377,7 @@ async fn handle_to_host( to_host: ToHost, ) -> Result<(), Fatal> { match to_host { - ToHost::ExecutePvf { pvf, params, priority, result_tx } => { + ToHost::ExecutePvf { pvf, execution_timeout, params, priority, result_tx } => { handle_execute_pvf( cache_path, artifacts, @@ -368,6 +385,7 @@ async fn handle_to_host( execute_queue, awaiting_prepare, pvf, + execution_timeout, params, priority, result_tx, @@ -389,6 +407,7 @@ async fn handle_execute_pvf( execute_queue: &mut mpsc::Sender, awaiting_prepare: &mut AwaitingPrepare, pvf: Pvf, + execution_timeout: Duration, params: Vec, priority: Priority, result_tx: ResultSender, @@ -404,6 +423,7 @@ async fn handle_execute_pvf( execute_queue, execute::ToQueue::Enqueue { artifact: ArtifactPathId::new(artifact_id, cache_path), + execution_timeout, params, result_tx, }, @@ -417,7 +437,7 @@ async fn handle_execute_pvf( ) .await?; - awaiting_prepare.add(artifact_id, params, result_tx); + awaiting_prepare.add(artifact_id, execution_timeout, params, result_tx); }, } } else { @@ -426,7 +446,7 @@ async fn handle_execute_pvf( artifacts.insert_preparing(artifact_id.clone()); send_prepare(prepare_queue, prepare::ToQueue::Enqueue { priority, pvf }).await?; - awaiting_prepare.add(artifact_id, params, result_tx); + awaiting_prepare.add(artifact_id, execution_timeout, params, result_tx); } return Ok(()) @@ -499,7 +519,7 @@ async fn handle_prepare_done( // It's finally time to dispatch all the execution requests that were waiting for this artifact // to be prepared. let pending_requests = awaiting_prepare.take(&artifact_id); - for PendingExecutionRequest { params, result_tx } in pending_requests { + for PendingExecutionRequest { execution_timeout, params, result_tx } in pending_requests { if result_tx.is_canceled() { // Preparation could've taken quite a bit of time and the requester may be not interested // in execution anymore, in which case we just skip the request. @@ -510,6 +530,7 @@ async fn handle_prepare_done( execute_queue, execute::ToQueue::Enqueue { artifact: ArtifactPathId::new(artifact_id.clone(), cache_path), + execution_timeout, params, result_tx, }, @@ -597,6 +618,8 @@ mod tests { use assert_matches::assert_matches; use futures::future::BoxFuture; + const TEST_EXECUTION_TIMEOUT: Duration = Duration::from_secs(3); + #[async_std::test] async fn pulse_test() { let pulse = pulse_every(Duration::from_millis(100)); @@ -840,9 +863,15 @@ mod tests { .await; let (result_tx, _result_rx) = oneshot::channel(); - host.execute_pvf(Pvf::from_discriminator(1), vec![], Priority::Critical, result_tx) - .await - .unwrap(); + host.execute_pvf( + Pvf::from_discriminator(1), + TEST_EXECUTION_TIMEOUT, + vec![], + Priority::Critical, + result_tx, + ) + .await + .unwrap(); run_until( &mut test.run, @@ -862,13 +891,20 @@ mod tests { let mut host = test.host_handle(); let (result_tx, result_rx_pvf_1_1) = oneshot::channel(); - host.execute_pvf(Pvf::from_discriminator(1), b"pvf1".to_vec(), Priority::Normal, result_tx) - .await - .unwrap(); + host.execute_pvf( + Pvf::from_discriminator(1), + TEST_EXECUTION_TIMEOUT, + b"pvf1".to_vec(), + Priority::Normal, + result_tx, + ) + .await + .unwrap(); let (result_tx, result_rx_pvf_1_2) = oneshot::channel(); host.execute_pvf( Pvf::from_discriminator(1), + TEST_EXECUTION_TIMEOUT, b"pvf1".to_vec(), Priority::Critical, result_tx, @@ -877,9 +913,15 @@ mod tests { .unwrap(); let (result_tx, result_rx_pvf_2) = oneshot::channel(); - host.execute_pvf(Pvf::from_discriminator(2), b"pvf2".to_vec(), Priority::Normal, result_tx) - .await - .unwrap(); + host.execute_pvf( + Pvf::from_discriminator(2), + TEST_EXECUTION_TIMEOUT, + b"pvf2".to_vec(), + Priority::Normal, + result_tx, + ) + .await + .unwrap(); assert_matches!( test.poll_and_recv_to_prepare_queue().await, @@ -947,9 +989,15 @@ mod tests { let mut host = test.host_handle(); let (result_tx, result_rx) = oneshot::channel(); - host.execute_pvf(Pvf::from_discriminator(1), b"pvf1".to_vec(), Priority::Normal, result_tx) - .await - .unwrap(); + host.execute_pvf( + Pvf::from_discriminator(1), + TEST_EXECUTION_TIMEOUT, + b"pvf1".to_vec(), + Priority::Normal, + result_tx, + ) + .await + .unwrap(); assert_matches!( test.poll_and_recv_to_prepare_queue().await, diff --git a/node/core/pvf/src/worker_common.rs b/node/core/pvf/src/worker_common.rs index 34bfc7cf28ed..9c68eaeeb0fb 100644 --- a/node/core/pvf/src/worker_common.rs +++ b/node/core/pvf/src/worker_common.rs @@ -47,14 +47,38 @@ pub async fn spawn_with_program_path( with_transient_socket_path(debug_id, |socket_path| { let socket_path = socket_path.to_owned(); async move { - let listener = UnixListener::bind(&socket_path).await.map_err(|_| SpawnErr::Bind)?; - - let handle = WorkerHandle::spawn(program_path, extra_args, socket_path) - .map_err(|_| SpawnErr::ProcessSpawn)?; + let listener = UnixListener::bind(&socket_path).await.map_err(|err| { + tracing::warn!( + target: LOG_TARGET, + %debug_id, + "cannot bind unix socket: {:?}", + err, + ); + SpawnErr::Bind + })?; + + let handle = + WorkerHandle::spawn(program_path, extra_args, socket_path).map_err(|err| { + tracing::warn!( + target: LOG_TARGET, + %debug_id, + "cannot spawn a worker: {:?}", + err, + ); + SpawnErr::ProcessSpawn + })?; futures::select! { accept_result = listener.accept().fuse() => { - let (stream, _) = accept_result.map_err(|_| SpawnErr::Accept)?; + let (stream, _) = accept_result.map_err(|err| { + tracing::warn!( + target: LOG_TARGET, + %debug_id, + "cannot accept a worker: {:?}", + err, + ); + SpawnErr::Accept + })?; Ok((IdleWorker { stream, pid: handle.id() }, handle)) } _ = Delay::new(spawn_timeout).fuse() => { diff --git a/node/core/pvf/tests/it/main.rs b/node/core/pvf/tests/it/main.rs index 3689217880ef..e8fd7b665aa3 100644 --- a/node/core/pvf/tests/it/main.rs +++ b/node/core/pvf/tests/it/main.rs @@ -20,11 +20,13 @@ use polkadot_node_core_pvf::{ start, Config, InvalidCandidate, Metrics, Pvf, ValidationError, ValidationHost, }; use polkadot_parachain::primitives::{BlockData, ValidationParams, ValidationResult}; +use std::time::Duration; mod adder; mod worker_common; const PUPPET_EXE: &str = env!("CARGO_BIN_EXE_puppet_worker"); +const TEST_EXECUTION_TIMEOUT: Duration = Duration::from_secs(3); struct TestHost { _cache_dir: tempfile::TempDir, @@ -64,6 +66,7 @@ impl TestHost { .await .execute_pvf( Pvf::from_code(code.into()), + TEST_EXECUTION_TIMEOUT, params.encode(), polkadot_node_core_pvf::Priority::Normal, result_tx, diff --git a/node/core/runtime-api/Cargo.toml b/node/core/runtime-api/Cargo.toml index 32a1f4382f00..ed730f70d492 100644 --- a/node/core/runtime-api/Cargo.toml +++ b/node/core/runtime-api/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "polkadot-node-core-runtime-api" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.3.17" -tracing = "0.1.26" +tracing = "0.1.28" memory-lru = "0.1.0" parity-util-mem = { version = "0.10.0", default-features = false } diff --git a/node/jaeger/Cargo.toml b/node/jaeger/Cargo.toml index 6e95dc170080..308a76d494f8 100644 --- a/node/jaeger/Cargo.toml +++ b/node/jaeger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-node-jaeger" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" description = "Polkadot Jaeger primitives" @@ -16,4 +16,4 @@ sc-network = { git = "https://github.com/paritytech/substrate", branch = "master sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } thiserror = "1.0.26" log = "0.4.13" -parity-scale-codec = { version = "2.0.0", default-features = false } +parity-scale-codec = { version = "2.3.1", default-features = false } diff --git a/node/malus/Cargo.toml b/node/malus/Cargo.toml index 7583095c2c33..94ab2d33ac5b 100644 --- a/node/malus/Cargo.toml +++ b/node/malus/Cargo.toml @@ -10,7 +10,7 @@ path = "src/variant-a.rs" name = "polkadot-test-malus" description = "Misbehaving nodes for local testnets, system and Simnet tests." license = "GPL-3.0-only" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" readme = "README.md" @@ -27,3 +27,8 @@ color-eyre = { version = "0.5.11", default-features = false } assert_matches = "1.5" structopt = "0.3.23" async-trait = "0.1.51" + +[dev-dependencies] +polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +futures = { version = "0.3.17", features = ["thread-pool"] } diff --git a/node/malus/src/lib.rs b/node/malus/src/lib.rs index 87c853e00382..abd4c6cfe76d 100644 --- a/node/malus/src/lib.rs +++ b/node/malus/src/lib.rs @@ -24,38 +24,52 @@ use polkadot_node_subsystem::*; pub use polkadot_node_subsystem::{messages::AllMessages, overseer, FromOverseer}; use std::{future::Future, pin::Pin}; +#[cfg(test)] +mod tests; + /// Filter incoming and outgoing messages. -pub trait MsgFilter: Send + Sync + Clone + 'static { +pub trait MessageInterceptor: Send + Sync + Clone + 'static +where + Sender: overseer::SubsystemSender + Clone + 'static, +{ /// The message type the original subsystem handles incoming. type Message: Send + 'static; /// Filter messages that are to be received by /// the subsystem. - fn filter_in(&self, msg: FromOverseer) -> Option> { + /// + /// For non-trivial cases, the `sender` can be used to send + /// multiple messages after doing some additional processing. + fn intercept_incoming( + &self, + _sender: &mut Sender, + msg: FromOverseer, + ) -> Option> { Some(msg) } /// Modify outgoing messages. - fn filter_out(&self, msg: AllMessages) -> Option { + fn intercept_outgoing(&self, msg: AllMessages) -> Option { Some(msg) } } /// A sender with the outgoing messages filtered. #[derive(Clone)] -pub struct FilteredSender { +pub struct InterceptedSender { inner: Sender, message_filter: Fil, } #[async_trait::async_trait] -impl overseer::SubsystemSender for FilteredSender +impl overseer::SubsystemSender for InterceptedSender where - Sender: overseer::SubsystemSender, - Fil: MsgFilter, + Sender: overseer::SubsystemSender + + overseer::SubsystemSender<>::Message>, + Fil: MessageInterceptor, { async fn send_message(&mut self, msg: AllMessages) { - if let Some(msg) = self.message_filter.filter_out(msg) { + if let Some(msg) = self.message_filter.intercept_outgoing(msg) { self.inner.send_message(msg).await; } } @@ -71,26 +85,39 @@ where } fn send_unbounded_message(&mut self, msg: AllMessages) { - if let Some(msg) = self.message_filter.filter_out(msg) { + if let Some(msg) = self.message_filter.intercept_outgoing(msg) { self.inner.send_unbounded_message(msg); } } } /// A subsystem context, that filters the outgoing messages. -pub struct FilteredContext { +pub struct InterceptedContext +where + Context: overseer::SubsystemContext + SubsystemContext, + Fil: MessageInterceptor<::Sender>, + ::Sender: overseer::SubsystemSender< + ::Sender>>::Message, + >, +{ inner: Context, message_filter: Fil, - sender: FilteredSender<::Sender, Fil>, + sender: InterceptedSender<::Sender, Fil>, } -impl FilteredContext +impl InterceptedContext where Context: overseer::SubsystemContext + SubsystemContext, - Fil: MsgFilter::Message>, + Fil: MessageInterceptor< + ::Sender, + Message = ::Message, + >, + ::Sender: overseer::SubsystemSender< + ::Sender>>::Message, + >, { pub fn new(mut inner: Context, message_filter: Fil) -> Self { - let sender = FilteredSender::<::Sender, Fil> { + let sender = InterceptedSender::<::Sender, Fil> { inner: inner.sender().clone(), message_filter: message_filter.clone(), }; @@ -99,15 +126,21 @@ where } #[async_trait::async_trait] -impl overseer::SubsystemContext for FilteredContext +impl overseer::SubsystemContext for InterceptedContext where Context: overseer::SubsystemContext + SubsystemContext, - Fil: MsgFilter::Message>, + Fil: MessageInterceptor< + ::Sender, + Message = ::Message, + >, ::AllMessages: From<::Message>, + ::Sender: overseer::SubsystemSender< + ::Sender>>::Message, + >, { type Message = ::Message; - type Sender = FilteredSender<::Sender, Fil>; + type Sender = InterceptedSender<::Sender, Fil>; type Error = ::Error; type AllMessages = ::AllMessages; type Signal = ::Signal; @@ -117,7 +150,9 @@ where match self.inner.try_recv().await? { None => return Ok(None), Some(msg) => - if let Some(msg) = self.message_filter.filter_in(msg) { + if let Some(msg) = + self.message_filter.intercept_incoming(self.inner.sender(), msg) + { return Ok(Some(msg)) }, } @@ -127,7 +162,7 @@ where async fn recv(&mut self) -> SubsystemResult> { loop { let msg = self.inner.recv().await?; - if let Some(msg) = self.message_filter.filter_in(msg) { + if let Some(msg) = self.message_filter.intercept_incoming(self.inner.sender(), msg) { return Ok(msg) } } @@ -155,27 +190,33 @@ where } /// A subsystem to which incoming and outgoing filters are applied. -pub struct FilteredSubsystem { - subsystem: Sub, - message_filter: Fil, +pub struct InterceptedSubsystem { + pub subsystem: Sub, + pub message_interceptor: Interceptor, } -impl FilteredSubsystem { - pub fn new(subsystem: Sub, message_filter: Fil) -> Self { - Self { subsystem, message_filter } +impl InterceptedSubsystem { + pub fn new(subsystem: Sub, message_interceptor: Interceptor) -> Self { + Self { subsystem, message_interceptor } } } -impl overseer::Subsystem for FilteredSubsystem +impl overseer::Subsystem for InterceptedSubsystem where Context: overseer::SubsystemContext + SubsystemContext + Sync + Send, - Sub: overseer::Subsystem, SubsystemError>, - FilteredContext: overseer::SubsystemContext + SubsystemContext, - Fil: MsgFilter::Message>, + Sub: overseer::Subsystem, SubsystemError>, + InterceptedContext: overseer::SubsystemContext + SubsystemContext, + Interceptor: MessageInterceptor< + ::Sender, + Message = ::Message, + >, + ::Sender: overseer::SubsystemSender< + ::Sender>>::Message, + >, { fn start(self, ctx: Context) -> SpawnedSubsystem { - let ctx = FilteredContext::new(ctx, self.message_filter); - overseer::Subsystem::, SubsystemError>::start( + let ctx = InterceptedContext::new(ctx, self.message_interceptor); + overseer::Subsystem::, SubsystemError>::start( self.subsystem, ctx, ) diff --git a/node/malus/src/tests.rs b/node/malus/src/tests.rs new file mode 100644 index 000000000000..57072336852b --- /dev/null +++ b/node/malus/src/tests.rs @@ -0,0 +1,140 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use super::*; + +use polkadot_node_subsystem_test_helpers::*; + +use polkadot_node_subsystem::{ + messages::{AllMessages, AvailabilityStoreMessage}, + overseer::{dummy::DummySubsystem, gen::TimeoutExt, Subsystem}, + SubsystemError, +}; + +#[derive(Clone, Debug)] +struct BlackHoleInterceptor; + +impl MessageInterceptor for BlackHoleInterceptor +where + Sender: overseer::SubsystemSender + + overseer::SubsystemSender + + Clone + + 'static, +{ + type Message = AvailabilityStoreMessage; + fn intercept_incoming( + &self, + _sender: &mut Sender, + msg: FromOverseer, + ) -> Option> { + match msg { + FromOverseer::Communication { msg: _msg } => None, + // to conclude the test cleanly + sig => Some(sig), + } + } +} + +#[derive(Clone, Debug)] +struct PassInterceptor; + +impl MessageInterceptor for PassInterceptor +where + Sender: overseer::SubsystemSender + + overseer::SubsystemSender + + Clone + + 'static, +{ + type Message = AvailabilityStoreMessage; +} + +async fn overseer_send>(overseer: &mut TestSubsystemContextHandle, msg: T) { + overseer.send(FromOverseer::Communication { msg }).await; +} + +fn launch_harness(test_gen: G) +where + F: Future> + Send, + M: Into + std::fmt::Debug + Send + 'static, + AllMessages: From, + Sub: Subsystem, SubsystemError>, + G: Fn(TestSubsystemContextHandle) -> (F, Sub), +{ + let pool = sp_core::testing::TaskExecutor::new(); + let (context, overseer) = make_subsystem_context(pool); + + let (test_fut, subsystem) = test_gen(overseer); + let subsystem = async move { + subsystem.start(context).future.await.unwrap(); + }; + futures::pin_mut!(test_fut); + futures::pin_mut!(subsystem); + + futures::executor::block_on(futures::future::join( + async move { + let mut overseer = test_fut.await; + overseer.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }, + subsystem, + )) + .1; +} + +#[test] +fn integrity_test_intercept() { + launch_harness(|mut overseer| { + let sub = DummySubsystem; + + let sub_intercepted = InterceptedSubsystem::new(sub, BlackHoleInterceptor); + + ( + async move { + let (tx, rx) = futures::channel::oneshot::channel(); + overseer_send( + &mut overseer, + AvailabilityStoreMessage::QueryChunk(Default::default(), 0.into(), tx), + ) + .await; + let _ = rx.timeout(std::time::Duration::from_millis(100)).await.unwrap(); + overseer + }, + sub_intercepted, + ) + }) +} + +#[test] +fn integrity_test_pass() { + launch_harness(|mut overseer| { + let sub = DummySubsystem; + + let sub_intercepted = InterceptedSubsystem::new(sub, PassInterceptor); + + ( + async move { + let (tx, rx) = futures::channel::oneshot::channel(); + overseer_send( + &mut overseer, + AvailabilityStoreMessage::QueryChunk(Default::default(), 0.into(), tx), + ) + .await; + let _ = rx.timeout(std::time::Duration::from_millis(100)).await.unwrap(); + overseer + }, + sub_intercepted, + ) + }) +} diff --git a/node/malus/src/variant-a.rs b/node/malus/src/variant-a.rs index 4b4b05d54933..ed395a9d884e 100644 --- a/node/malus/src/variant-a.rs +++ b/node/malus/src/variant-a.rs @@ -24,10 +24,10 @@ use color_eyre::eyre; use polkadot_cli::{ - create_default_subsystems, + prepared_overseer_builder, service::{ - AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, HeaderBackend, Overseer, - OverseerGen, OverseerGenArgs, OverseerHandle, ParachainHost, ProvideRuntimeApi, SpawnNamed, + AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, HeaderBackend, OverseerGen, + OverseerGenArgs, ParachainHost, ProvideRuntimeApi, SpawnNamed, }, Cli, }; @@ -35,11 +35,15 @@ use polkadot_cli::{ // Import extra types relevant to the particular // subsystem. use polkadot_node_core_candidate_validation::CandidateValidationSubsystem; -use polkadot_node_subsystem::messages::CandidateValidationMessage; +use polkadot_node_subsystem::{ + messages::{AllMessages, CandidateValidationMessage}, + overseer::{self, Overseer, OverseerConnector, OverseerHandle}, + FromOverseer, +}; -// Filter wrapping related types. use malus::*; +// Filter wrapping related types. use std::sync::{ atomic::{AtomicUsize, Ordering}, Arc, @@ -51,17 +55,27 @@ use structopt::StructOpt; #[derive(Clone, Default, Debug)] struct Skippy(Arc); -impl MsgFilter for Skippy { +impl MessageInterceptor for Skippy +where + Sender: overseer::SubsystemSender + + overseer::SubsystemSender + + Clone + + 'static, +{ type Message = CandidateValidationMessage; - fn filter_in(&self, msg: FromOverseer) -> Option> { + fn intercept_incoming( + &self, + _sender: &mut Sender, + msg: FromOverseer, + ) -> Option> { if self.0.fetch_add(1, Ordering::Relaxed) % 2 == 0 { Some(msg) } else { None } } - fn filter_out(&self, msg: AllMessages) -> Option { + fn intercept_outgoing(&self, msg: AllMessages) -> Option { Some(msg) } } @@ -72,6 +86,7 @@ struct BehaveMaleficient; impl OverseerGen for BehaveMaleficient { fn generate<'a, Spawner, RuntimeClient>( &self, + connector: OverseerConnector, args: OverseerGenArgs<'a, Spawner, RuntimeClient>, ) -> Result<(Overseer>, OverseerHandle), Error> where @@ -79,16 +94,11 @@ impl OverseerGen for BehaveMaleficient { RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, Spawner: 'static + SpawnNamed + Clone + Unpin, { - let spawner = args.spawner.clone(); - let leaves = args.leaves.clone(); - let runtime_client = args.runtime_client.clone(); - let registry = args.registry.clone(); let candidate_validation_config = args.candidate_validation_config.clone(); - // modify the subsystem(s) as needed: - let all_subsystems = create_default_subsystems(args)?.replace_candidate_validation( - // create the filtered subsystem - |orig: CandidateValidationSubsystem| { - FilteredSubsystem::new( + + prepared_overseer_builder(args)? + .replace_candidate_validation(|orig: CandidateValidationSubsystem| { + InterceptedSubsystem::new( CandidateValidationSubsystem::with_config( candidate_validation_config, orig.metrics, @@ -96,10 +106,8 @@ impl OverseerGen for BehaveMaleficient { ), Skippy::default(), ) - }, - ); - - Overseer::new(leaves, all_subsystems, registry, runtime_client, spawner) + }) + .build_with_connector(connector) .map_err(|e| e.into()) } } diff --git a/node/metered-channel/Cargo.toml b/node/metered-channel/Cargo.toml index 2741d95b9a68..dfbea6ba9586 100644 --- a/node/metered-channel/Cargo.toml +++ b/node/metered-channel/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "metered-channel" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" description = "Channels with attached Meters" @@ -9,6 +9,12 @@ description = "Channels with attached Meters" futures = "0.3.17" futures-timer = "3.0.2" derive_more = "0.99" +tracing = "0.1.28" +thiserror = "1.0.29" [dev-dependencies] futures = { version = "0.3.17", features = ["thread-pool"] } +assert_matches = "1.5" +env_logger = "0.9" +log = "0.4" +tracing = { version = "0.1.28", features = ["log"] } diff --git a/node/metered-channel/src/lib.rs b/node/metered-channel/src/lib.rs index 4fe1bcd22526..9646cbaee901 100644 --- a/node/metered-channel/src/lib.rs +++ b/node/metered-channel/src/lib.rs @@ -24,6 +24,7 @@ use std::sync::{ use derive_more::{Add, Display}; mod bounded; +pub mod oneshot; mod unbounded; pub use self::{bounded::*, unbounded::*}; diff --git a/node/metered-channel/src/oneshot.rs b/node/metered-channel/src/oneshot.rs new file mode 100644 index 000000000000..bf1a52682462 --- /dev/null +++ b/node/metered-channel/src/oneshot.rs @@ -0,0 +1,418 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Metered variant of oneshot channels to be able to extract delays caused by delayed responses. + +use std::{ + ops::Deref, + pin::Pin, + task::{Context, Poll}, + time::{Duration, Instant}, +}; + +use futures::{ + channel::oneshot::{self, Canceled, Cancellation}, + future::{Fuse, FusedFuture}, + prelude::*, +}; +use futures_timer::Delay; + +/// Provides the reason for termination. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[repr(u8)] +pub enum Reason { + Completion = 1, + Cancellation = 2, + HardTimeout = 3, +} + +/// Obtained measurements by the `Receiver` side of the `MeteredOneshot`. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Measurements { + /// Duration between first poll and polling termination. + first_poll_till_end: Duration, + /// Duration starting with creation until polling termination. + creation_till_end: Duration, + /// Reason for resolving the future. + reason: Reason, +} + +impl Measurements { + /// Obtain the duration of a finished or canceled + /// `oneshot` channel. + pub fn duration_since_first_poll(&self) -> &Duration { + &self.first_poll_till_end + } + + /// Obtain the duration of a finished or canceled + /// `oneshot` channel. + pub fn duration_since_creation(&self) -> &Duration { + &self.creation_till_end + } + + /// Obtain the reason to the channel termination. + pub fn reason(&self) -> &Reason { + &self.reason + } +} + +/// Create a new pair of `OneshotMetered{Sender,Receiver}`. +pub fn channel( + name: &'static str, + soft_timeout: Duration, + hard_timeout: Duration, +) -> (MeteredSender, MeteredReceiver) { + let (tx, rx) = oneshot::channel(); + + ( + MeteredSender { name, inner: tx }, + MeteredReceiver { + name, + inner: rx, + soft_timeout, + hard_timeout, + soft_timeout_fut: None, + hard_timeout_fut: None, + first_poll_timestamp: None, + creation_timestamp: Instant::now(), + }, + ) +} + +#[allow(missing_docs)] +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error("Oneshot was cancelled.")] + Canceled(#[source] Canceled, Measurements), + #[error("Oneshot did not receive a response within {}", Duration::as_secs_f64(.0))] + HardTimeout(Duration, Measurements), +} + +impl Measurable for Error { + fn measurements(&self) -> Measurements { + match self { + Self::Canceled(_, measurements) => measurements.clone(), + Self::HardTimeout(_, measurements) => measurements.clone(), + } + } +} + +/// Oneshot sender, created by [`channel`]. +#[derive(Debug)] +pub struct MeteredSender { + name: &'static str, + inner: oneshot::Sender<(Instant, T)>, +} + +impl MeteredSender { + /// Send a value. + pub fn send(self, t: T) -> Result<(), T> { + let Self { inner, name: _ } = self; + inner.send((Instant::now(), t)).map_err(|(_, t)| t) + } + + /// Poll if the thing is already cancelled. + pub fn poll_canceled(&mut self, ctx: &mut Context<'_>) -> Poll<()> { + self.inner.poll_canceled(ctx) + } + + /// Access the cancellation object. + pub fn cancellation(&mut self) -> Cancellation<'_, (Instant, T)> { + self.inner.cancellation() + } + + /// Check the cancellation state. + pub fn is_canceled(&self) -> bool { + self.inner.is_canceled() + } + + /// Verify if the `receiver` is connected to the `sender` [`Self`]. + pub fn is_connected_to(&self, receiver: &MeteredReceiver) -> bool { + self.inner.is_connected_to(&receiver.inner) + } +} + +/// Oneshot receiver, created by [`channel`]. +#[derive(Debug)] +pub struct MeteredReceiver { + name: &'static str, + inner: oneshot::Receiver<(Instant, T)>, + /// Soft timeout, on expire a warning is printed. + soft_timeout_fut: Option>, + soft_timeout: Duration, + /// Hard timeout, terminating the sender. + hard_timeout_fut: Option, + hard_timeout: Duration, + /// The first time the receiver was polled. + first_poll_timestamp: Option, + creation_timestamp: Instant, +} + +impl MeteredReceiver { + pub fn close(&mut self) { + self.inner.close() + } + + /// Attempts to receive a message outside of the context of a task. + /// + /// A return value of `None` must be considered immediately stale (out of + /// date) unless [`close`](MeteredReceiver::close) has been called first. + /// + /// Returns an error if the sender was dropped. + pub fn try_recv(&mut self) -> Result>, Error> { + match self.inner.try_recv() { + Ok(Some((when, value))) => { + let measurements = self.create_measurement(when, Reason::Completion); + Ok(Some(OutputWithMeasurements { value, measurements })) + }, + Err(e) => { + let measurements = self.create_measurement( + self.first_poll_timestamp.unwrap_or_else(|| Instant::now()), + Reason::Cancellation, + ); + Err(Error::Canceled(e, measurements)) + }, + Ok(None) => Ok(None), + } + } + + /// Helper to create a measurement. + /// + /// `start` determines the first possible time where poll can resolve with `Ready`. + fn create_measurement(&self, start: Instant, reason: Reason) -> Measurements { + let end = Instant::now(); + Measurements { + // negative values are ok, if `send` was called before we poll for the first time. + first_poll_till_end: end - start, + creation_till_end: end - self.creation_timestamp, + reason, + } + } +} + +impl FusedFuture for MeteredReceiver { + fn is_terminated(&self) -> bool { + self.inner.is_terminated() + } +} + +impl Future for MeteredReceiver { + type Output = Result, Error>; + + fn poll( + mut self: Pin<&mut Self>, + ctx: &mut Context<'_>, + ) -> Poll, Error>> { + let first_poll_timestamp = + self.first_poll_timestamp.get_or_insert_with(|| Instant::now()).clone(); + + let soft_timeout = self.soft_timeout.clone(); + let soft_timeout = self + .soft_timeout_fut + .get_or_insert_with(move || Delay::new(soft_timeout).fuse()); + + if Pin::new(soft_timeout).poll(ctx).is_ready() { + tracing::warn!("Oneshot `{name}` exceeded the soft threshold", name = &self.name); + } + + let hard_timeout = self.hard_timeout.clone(); + let hard_timeout = + self.hard_timeout_fut.get_or_insert_with(move || Delay::new(hard_timeout)); + + if Pin::new(hard_timeout).poll(ctx).is_ready() { + let measurements = self.create_measurement(first_poll_timestamp, Reason::HardTimeout); + return Poll::Ready(Err(Error::HardTimeout(self.hard_timeout.clone(), measurements))) + } + + match Pin::new(&mut self.inner).poll(ctx) { + Poll::Pending => Poll::Pending, + Poll::Ready(Err(e)) => { + let measurements = + self.create_measurement(first_poll_timestamp, Reason::Cancellation); + Poll::Ready(Err(Error::Canceled(e, measurements))) + }, + Poll::Ready(Ok((ref sent_at_timestamp, value))) => { + let measurements = + self.create_measurement(sent_at_timestamp.clone(), Reason::Completion); + Poll::Ready(Ok(OutputWithMeasurements:: { value, measurements })) + }, + } + } +} + +/// A dummy trait that allows implementing `measurements` for `Result<_,_>`. +pub trait Measurable { + /// Obtain a set of measurements represented by the `Measurements` type. + fn measurements(&self) -> Measurements; +} + +impl Measurable for Result, Error> { + fn measurements(&self) -> Measurements { + match self { + Err(err) => err.measurements(), + Ok(val) => val.measurements(), + } + } +} + +/// A wrapping type for the actual type `T` that is sent with the +/// oneshot yet allow to attach `Measurements` to it. +/// +/// Implements `AsRef` besides others for easier access to the inner, +/// wrapped type. +#[derive(Clone, Debug)] +pub struct OutputWithMeasurements { + value: T, + measurements: Measurements, +} + +impl Measurable for OutputWithMeasurements { + fn measurements(&self) -> Measurements { + self.measurements.clone() + } +} + +impl OutputWithMeasurements { + /// Converts the wrapper type into it's inner value. + /// + /// `trait Into` cannot be implemented due to conflicts. + pub fn into(self) -> T { + self.value + } +} + +impl AsRef for OutputWithMeasurements { + fn as_ref(&self) -> &T { + &self.value + } +} + +impl Deref for OutputWithMeasurements { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.value + } +} + +#[cfg(test)] +mod tests { + use assert_matches::assert_matches; + use futures::{executor::ThreadPool, task::SpawnExt}; + + use super::*; + + #[derive(Clone, PartialEq, Eq, Debug)] + struct DummyItem { + vals: [u8; 256], + } + + impl Default for DummyItem { + fn default() -> Self { + Self { vals: [0u8; 256] } + } + } + + fn test_launch(name: &'static str, gen_sender_test: S, gen_receiver_test: R) + where + S: Fn(MeteredSender) -> FS, + R: Fn(MeteredReceiver) -> FR, + FS: Future + Send + 'static, + FR: Future + Send + 'static, + { + let _ = env_logger::builder().is_test(true).filter_level(LevelFilter::Trace).try_init(); + + let pool = ThreadPool::new().unwrap(); + let (tx, rx) = channel(name, Duration::from_secs(1), Duration::from_secs(3)); + futures::executor::block_on(async move { + let handle_receiver = pool.spawn_with_handle(gen_receiver_test(rx)).unwrap(); + let handle_sender = pool.spawn_with_handle(gen_sender_test(tx)).unwrap(); + futures::future::select( + futures::future::join(handle_sender, handle_receiver), + Delay::new(Duration::from_secs(5)), + ) + .await; + }); + } + + use log::LevelFilter; + + #[test] + fn easy() { + test_launch( + "easy", + |tx| async move { + tx.send(DummyItem::default()).unwrap(); + }, + |rx| async move { + let x = rx.await.unwrap(); + let measurements = x.measurements(); + assert_eq!(x.as_ref(), &DummyItem::default()); + dbg!(measurements); + }, + ); + } + + #[test] + fn cancel_by_drop() { + test_launch( + "cancel_by_drop", + |tx| async move { + Delay::new(Duration::from_secs(2)).await; + drop(tx); + }, + |rx| async move { + let result = rx.await; + assert_matches!(result, Err(Error::Canceled(_, _))); + dbg!(result.measurements()); + }, + ); + } + + #[test] + fn starve_till_hard_timeout() { + test_launch( + "starve_till_timeout", + |tx| async move { + Delay::new(Duration::from_secs(4)).await; + let _ = tx.send(DummyItem::default()); + }, + |rx| async move { + let result = rx.await; + assert_matches!(&result, e @ &Err(Error::HardTimeout(_, _)) => { + println!("{:?}", e); + }); + dbg!(result.measurements()); + }, + ); + } + + #[test] + fn starve_till_soft_timeout_then_food() { + test_launch( + "starve_till_soft_timeout_then_food", + |tx| async move { + Delay::new(Duration::from_secs(2)).await; + let _ = tx.send(DummyItem::default()); + }, + |rx| async move { + let result = rx.await; + assert_matches!(result, Ok(_)); + dbg!(result.measurements()); + }, + ); + } +} diff --git a/node/metrics/Cargo.toml b/node/metrics/Cargo.toml index 72cf2f2f7491..d12a290c17a1 100644 --- a/node/metrics/Cargo.toml +++ b/node/metrics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-node-metrics" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" description = "Subsystem traits and message definitions" @@ -13,8 +13,5 @@ metered-channel = { path = "../metered-channel" } substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" } -jemalloc-ctl = { version = "0.3.3", optional = true } - [features] default = [] -memory-stats = ["jemalloc-ctl"] diff --git a/node/metrics/src/lib.rs b/node/metrics/src/lib.rs index 50ee6827bf4b..af635f621d73 100644 --- a/node/metrics/src/lib.rs +++ b/node/metrics/src/lib.rs @@ -26,13 +26,6 @@ pub use metered_channel as metered; -/// Memory allocation stats tracking. -#[cfg(feature = "memory-stats")] -pub mod memory_stats; - -#[cfg(feature = "memory-stats")] -pub use self::memory_stats::{MemoryAllocationSnapshot, MemoryAllocationTracker}; - /// Cyclic metric collection support. pub mod metronome; pub use self::metronome::Metronome; diff --git a/node/metrics/src/memory_stats.rs b/node/metrics/src/memory_stats.rs deleted file mode 100644 index cc1a7213c787..000000000000 --- a/node/metrics/src/memory_stats.rs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Memory tracking statistics. -//! -//! Many subsystems have common interests such as canceling a bunch of spawned jobs, -//! or determining what their validator ID is. These common interests are factored into -//! this module. -//! -//! This crate also reexports Prometheus metric types which are expected to be implemented by subsystems. - -// #[cfg(not(feature = "memory-stats"))] -// use std::convert::Infallible; - -use jemalloc_ctl::{epoch, stats, Result}; - -/// Accessor to the allocator internals. -#[derive(Clone)] -pub struct MemoryAllocationTracker { - epoch: jemalloc_ctl::epoch_mib, - allocated: stats::allocated_mib, - resident: stats::resident_mib, -} - -impl MemoryAllocationTracker { - /// Create an instance of an allocation tracker. - pub fn new() -> Result { - Ok(Self { - epoch: epoch::mib()?, - allocated: stats::allocated::mib()?, - resident: stats::resident::mib()?, - }) - } - - /// Create an allocation snapshot. - pub fn snapshot(&self) -> Result { - // update stats by advancing the allocation epoch - self.epoch.advance()?; - - let allocated: u64 = self.allocated.read()? as _; - let resident: u64 = self.resident.read()? as _; - Ok(MemoryAllocationSnapshot { allocated, resident }) - } -} - -/// Snapshot of collected memory metrics. -#[derive(Debug, Clone)] -pub struct MemoryAllocationSnapshot { - /// Total resident memory, in bytes. - pub resident: u64, - /// Total allocated memory, in bytes. - pub allocated: u64, -} diff --git a/node/network/approval-distribution/Cargo.toml b/node/network/approval-distribution/Cargo.toml index 139bddc3d883..cf3c71faf2cf 100644 --- a/node/network/approval-distribution/Cargo.toml +++ b/node/network/approval-distribution/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-approval-distribution" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" @@ -12,7 +12,7 @@ polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-primitives = { path = "../../../primitives" } futures = "0.3.17" -tracing = "0.1.26" +tracing = "0.1.28" [dev-dependencies] sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["std"] } diff --git a/node/network/availability-distribution/Cargo.toml b/node/network/availability-distribution/Cargo.toml index 3aecfd8d70e6..1f7d89c5ddb3 100644 --- a/node/network/availability-distribution/Cargo.toml +++ b/node/network/availability-distribution/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "polkadot-availability-distribution" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.3.17" -tracing = "0.1.26" -parity-scale-codec = { version = "2.0.0", features = ["std"] } +tracing = "0.1.28" +parity-scale-codec = { version = "2.3.1", features = ["std"] } polkadot-primitives = { path = "../../../primitives" } polkadot-erasure-coding = { path = "../../../erasure-coding" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } diff --git a/node/network/availability-distribution/src/requester/session_cache.rs b/node/network/availability-distribution/src/requester/session_cache.rs index 25b53d25aaa7..5b87d1dcf9ce 100644 --- a/node/network/availability-distribution/src/requester/session_cache.rs +++ b/node/network/availability-distribution/src/requester/session_cache.rs @@ -56,7 +56,7 @@ pub struct SessionInfo { /// validators. pub validator_groups: Vec>, - /// Information about ourself: + /// Information about ourselves: pub our_index: ValidatorIndex, /// Remember to which group we belong, so we won't start fetching chunks for candidates with diff --git a/node/network/availability-recovery/Cargo.toml b/node/network/availability-recovery/Cargo.toml index 76acc04b7b26..d23d29a8dd29 100644 --- a/node/network/availability-recovery/Cargo.toml +++ b/node/network/availability-recovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-availability-recovery" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" @@ -9,7 +9,7 @@ futures = "0.3.17" lru = "0.6.6" rand = "0.8.3" thiserror = "1.0.26" -tracing = "0.1.26" +tracing = "0.1.28" polkadot-erasure-coding = { path = "../../../erasure-coding" } polkadot-primitives = { path = "../../../primitives" } @@ -17,7 +17,7 @@ polkadot-node-primitives = { path = "../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-node-network-protocol = { path = "../../network/protocol" } -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } [dev-dependencies] diff --git a/node/network/availability-recovery/src/futures_undead.rs b/node/network/availability-recovery/src/futures_undead.rs index 9715916590a6..550f41a9b3cf 100644 --- a/node/network/availability-recovery/src/futures_undead.rs +++ b/node/network/availability-recovery/src/futures_undead.rs @@ -18,7 +18,7 @@ //! futures will still get polled, but will not count towards length. So length will only count //! futures, which are still considered live. //! -//! Usecase: If futures take longer than we would like them too, we maybe able to request the data +//! Usecase: If futures take longer than we would like them too, we may be able to request the data //! from somewhere else as well. We don't really want to cancel the old future, because maybe it //! was almost done, thus we would have wasted time with our impatience. By simply making them //! not count towards length, we can make sure to have enough "live" requests ongoing, while at the diff --git a/node/network/availability-recovery/src/lib.rs b/node/network/availability-recovery/src/lib.rs index bd747c463fe1..0b973e03bd72 100644 --- a/node/network/availability-recovery/src/lib.rs +++ b/node/network/availability-recovery/src/lib.rs @@ -93,7 +93,7 @@ const COST_INVALID_REQUEST: Rep = Rep::CostMajor("Peer sent unparsable request") #[cfg(not(test))] const TIMEOUT_START_NEW_REQUESTS: Duration = CHUNK_REQUEST_TIMEOUT; #[cfg(test)] -const TIMEOUT_START_NEW_REQUESTS: Duration = Duration::from_millis(10); +const TIMEOUT_START_NEW_REQUESTS: Duration = Duration::from_millis(100); /// The Availability Recovery Subsystem. pub struct AvailabilityRecoverySubsystem { diff --git a/node/network/availability-recovery/src/tests.rs b/node/network/availability-recovery/src/tests.rs index e31a4f436043..a918b8c615d8 100644 --- a/node/network/availability-recovery/src/tests.rs +++ b/node/network/availability-recovery/src/tests.rs @@ -109,7 +109,7 @@ fn test_harness_chunks_only { diff --git a/node/network/bitfield-distribution/Cargo.toml b/node/network/bitfield-distribution/Cargo.toml index 930301c84fb5..5b951bd8e030 100644 --- a/node/network/bitfield-distribution/Cargo.toml +++ b/node/network/bitfield-distribution/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "polkadot-availability-bitfield-distribution" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.3.17" -tracing = "0.1.26" +tracing = "0.1.28" polkadot-primitives = { path = "../../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } diff --git a/node/network/bridge/Cargo.toml b/node/network/bridge/Cargo.toml index b4c1807b1072..7758fd7148c7 100644 --- a/node/network/bridge/Cargo.toml +++ b/node/network/bridge/Cargo.toml @@ -1,15 +1,15 @@ [package] name = "polkadot-network-bridge" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] async-trait = "0.1.51" futures = "0.3.17" -tracing = "0.1.26" +tracing = "0.1.28" polkadot-primitives = { path = "../../../primitives" } -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs index 608a790d2931..0ca63f027fa2 100644 --- a/node/network/bridge/src/lib.rs +++ b/node/network/bridge/src/lib.rs @@ -198,7 +198,7 @@ impl metrics::Metrics for Metrics { prometheus::GaugeVec::new( prometheus::Opts::new( "parachain_desired_peer_count", - "The number of peers that the local node is expected to connect to on a parachain-related peer-set", + "The number of peers that the local node is expected to connect to on a parachain-related peer-set (either including or not including unresolvable authorities, depending on whether `ConnectToValidators` or `ConnectToValidatorsResolved` was used.)", ), &["protocol"] )?, @@ -552,6 +552,27 @@ where network_service = ns; authority_discovery_service = ads; } + NetworkBridgeMessage::ConnectToResolvedValidators { + validator_addrs, + peer_set, + } => { + tracing::trace!( + target: LOG_TARGET, + action = "ConnectToPeers", + peer_set = ?peer_set, + ?validator_addrs, + "Received a resolved validator connection request", + ); + + metrics.note_desired_peer_count(peer_set, validator_addrs.len()); + + let all_addrs = validator_addrs.into_iter().flatten().collect(); + network_service = validator_discovery.on_resolved_request( + all_addrs, + peer_set, + network_service, + ).await; + } NetworkBridgeMessage::NewGossipTopology { our_neighbors, } => { diff --git a/node/network/bridge/src/tests.rs b/node/network/bridge/src/tests.rs index 89551de89c25..40ade08df2b0 100644 --- a/node/network/bridge/src/tests.rs +++ b/node/network/bridge/src/tests.rs @@ -37,7 +37,8 @@ use polkadot_primitives::v1::AuthorityDiscoveryId; use polkadot_subsystem::{ jaeger, messages::{ - ApprovalDistributionMessage, BitfieldDistributionMessage, StatementDistributionMessage, + ApprovalDistributionMessage, BitfieldDistributionMessage, GossipSupportMessage, + StatementDistributionMessage, }, ActiveLeavesUpdate, FromOverseer, LeafStatus, OverseerSignal, }; @@ -337,6 +338,13 @@ async fn assert_sends_validation_event_to_all( ApprovalDistributionMessage::NetworkBridgeUpdateV1(e) ) if e == event.focus().expect("could not focus message") ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::GossipSupport( + GossipSupportMessage::NetworkBridgeUpdateV1(e) + ) if e == event.focus().expect("could not focus message") + ); } async fn assert_sends_collation_event_to_all( @@ -1189,7 +1197,7 @@ fn send_messages_to_peers() { fn spread_event_to_subsystems_is_up_to_date() { // Number of subsystems expected to be interested in a network event, // and hence the network event broadcasted to. - const EXPECTED_COUNT: usize = 3; + const EXPECTED_COUNT: usize = 4; let mut cnt = 0_usize; for msg in AllMessages::dispatch_iter(NetworkBridgeEvent::PeerDisconnected(PeerId::random())) { @@ -1219,7 +1227,9 @@ fn spread_event_to_subsystems_is_up_to_date() { AllMessages::ApprovalDistribution(_) => { cnt += 1; }, - AllMessages::GossipSupport(_) => unreachable!("Not interested in network events"), + AllMessages::GossipSupport(_) => { + cnt += 1; + }, AllMessages::DisputeCoordinator(_) => unreachable!("Not interested in network events"), AllMessages::DisputeParticipation(_) => unreachable!("Not interested in network events"), diff --git a/node/network/bridge/src/validator_discovery.rs b/node/network/bridge/src/validator_discovery.rs index 2d6d21668983..7f768044ad50 100644 --- a/node/network/bridge/src/validator_discovery.rs +++ b/node/network/bridge/src/validator_discovery.rs @@ -47,6 +47,44 @@ impl Service { Self { state: Default::default(), _phantom: PhantomData } } + /// Connect to already resolved addresses: + pub async fn on_resolved_request( + &mut self, + newly_requested: HashSet, + peer_set: PeerSet, + mut network_service: N, + ) -> N { + let state = &mut self.state[peer_set]; + // clean up revoked requests + let multiaddr_to_remove: HashSet<_> = + state.previously_requested.difference(&newly_requested).cloned().collect(); + let multiaddr_to_add: HashSet<_> = + newly_requested.difference(&state.previously_requested).cloned().collect(); + state.previously_requested = newly_requested; + + tracing::debug!( + target: LOG_TARGET, + ?peer_set, + added = multiaddr_to_add.len(), + removed = multiaddr_to_remove.len(), + "New ConnectToValidators resolved request", + ); + // ask the network to connect to these nodes and not disconnect + // from them until removed from the set + if let Err(e) = network_service + .add_to_peers_set(peer_set.into_protocol_name(), multiaddr_to_add) + .await + { + tracing::warn!(target: LOG_TARGET, err = ?e, "AuthorityDiscoveryService returned an invalid multiaddress"); + } + // the addresses are known to be valid + let _ = network_service + .remove_from_peers_set(peer_set.into_protocol_name(), multiaddr_to_remove) + .await; + + network_service + } + /// On a new connection request, a peer set update will be issued. /// It will ask the network to connect to the validators and not disconnect /// from them at least until the next request is issued for the same peer set. @@ -59,7 +97,7 @@ impl Service { validator_ids: Vec, peer_set: PeerSet, failed: oneshot::Sender, - mut network_service: N, + network_service: N, mut authority_discovery_service: AD, ) -> (N, AD) { // collect multiaddress of validators @@ -82,39 +120,19 @@ impl Service { } } - let state = &mut self.state[peer_set]; - // clean up revoked requests - let multiaddr_to_remove: HashSet<_> = - state.previously_requested.difference(&newly_requested).cloned().collect(); - let multiaddr_to_add: HashSet<_> = - newly_requested.difference(&state.previously_requested).cloned().collect(); - state.previously_requested = newly_requested; - tracing::debug!( target: LOG_TARGET, ?peer_set, ?requested, - added = multiaddr_to_add.len(), - removed = multiaddr_to_remove.len(), ?failed_to_resolve, "New ConnectToValidators request", ); - // ask the network to connect to these nodes and not disconnect - // from them until removed from the set - if let Err(e) = network_service - .add_to_peers_set(peer_set.into_protocol_name(), multiaddr_to_add) - .await - { - tracing::warn!(target: LOG_TARGET, err = ?e, "AuthorityDiscoveryService returned an invalid multiaddress"); - } - // the addresses are known to be valid - let _ = network_service - .remove_from_peers_set(peer_set.into_protocol_name(), multiaddr_to_remove) - .await; + + let r = self.on_resolved_request(newly_requested, peer_set, network_service).await; let _ = failed.send(failed_to_resolve); - (network_service, authority_discovery_service) + (r, authority_discovery_service) } } diff --git a/node/network/collator-protocol/Cargo.toml b/node/network/collator-protocol/Cargo.toml index ab2fe0ac5291..295a296911db 100644 --- a/node/network/collator-protocol/Cargo.toml +++ b/node/network/collator-protocol/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-collator-protocol" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" @@ -10,7 +10,7 @@ derive_more = "0.99.14" futures = "0.3.17" futures-timer = "3" thiserror = "1.0.26" -tracing = "0.1.26" +tracing = "0.1.28" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -30,6 +30,6 @@ assert_matches = "1.4.0" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["std"] } sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -parity-scale-codec = { version = "2.0.0", features = ["std"] } +parity-scale-codec = { version = "2.3.1", features = ["std"] } polkadot-subsystem-testhelpers = { package = "polkadot-node-subsystem-test-helpers", path = "../../subsystem-test-helpers" } diff --git a/node/network/dispute-distribution/Cargo.toml b/node/network/dispute-distribution/Cargo.toml index bd478720b12a..11443b069a71 100644 --- a/node/network/dispute-distribution/Cargo.toml +++ b/node/network/dispute-distribution/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "polkadot-dispute-distribution" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.3.17" -tracing = "0.1.26" +tracing = "0.1.28" derive_more = "0.99.14" -parity-scale-codec = { version = "2.0.0", features = ["std"] } +parity-scale-codec = { version = "2.3.1", features = ["std"] } polkadot-primitives = { path = "../../../primitives" } polkadot-erasure-coding = { path = "../../../erasure-coding" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } diff --git a/node/network/dispute-distribution/src/error.rs b/node/network/dispute-distribution/src/error.rs index 7b7d7a64238f..00ac06310e8d 100644 --- a/node/network/dispute-distribution/src/error.rs +++ b/node/network/dispute-distribution/src/error.rs @@ -29,7 +29,7 @@ use crate::{sender, LOG_TARGET}; pub enum Error { /// Fatal errors of dispute distribution. Fatal(Fatal), - /// Non fatal errors of dispute distribution. + /// Non-fatal errors of dispute distribution. NonFatal(NonFatal), } diff --git a/node/network/dispute-distribution/src/metrics.rs b/node/network/dispute-distribution/src/metrics.rs index 9b891b47b79c..54a1bb9e6085 100644 --- a/node/network/dispute-distribution/src/metrics.rs +++ b/node/network/dispute-distribution/src/metrics.rs @@ -46,6 +46,9 @@ struct MetricsInner { /// /// We both have successful imports and failed imports here. imported_requests: CounterVec, + + /// The duration of issued dispute request to response. + time_dispute_request: prometheus::Histogram, } impl Metrics { @@ -61,7 +64,7 @@ impl Metrics { } } - /// Increment counter on served chunks. + /// Increment counter on served disputes. pub fn on_received_request(&self) { if let Some(metrics) = &self.0 { metrics.received_requests.inc() @@ -74,6 +77,11 @@ impl Metrics { metrics.imported_requests.with_label_values(&[label]).inc() } } + + /// Get a timer to time request/response duration. + pub fn time_dispute_request(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.time_dispute_request.start_timer()) + } } impl metrics::Metrics for Metrics { @@ -106,6 +114,13 @@ impl metrics::Metrics for Metrics { )?, registry, )?, + time_dispute_request: prometheus::register( + prometheus::Histogram::with_opts(prometheus::HistogramOpts::new( + "parachain_dispute_distribution_time_dispute_request", + "Time needed for dispute votes to get confirmed/fail getting transmitted.", + ))?, + registry, + )?, }; Ok(Metrics(Some(metrics))) } diff --git a/node/network/dispute-distribution/src/sender/mod.rs b/node/network/dispute-distribution/src/sender/mod.rs index c640d5374245..b1243ec0ef32 100644 --- a/node/network/dispute-distribution/src/sender/mod.rs +++ b/node/network/dispute-distribution/src/sender/mod.rs @@ -97,9 +97,15 @@ impl DisputeSender { return Ok(()) }, Entry::Vacant(vacant) => { - let send_task = - SendTask::new(ctx, runtime, &self.active_sessions, self.tx.clone(), req) - .await?; + let send_task = SendTask::new( + ctx, + runtime, + &self.active_sessions, + self.tx.clone(), + req, + &self.metrics, + ) + .await?; vacant.insert(send_task); }, } @@ -140,7 +146,9 @@ impl DisputeSender { for dispute in self.disputes.values_mut() { if have_new_sessions || dispute.has_failed_sends() { - dispute.refresh_sends(ctx, runtime, &self.active_sessions).await?; + dispute + .refresh_sends(ctx, runtime, &self.active_sessions, &self.metrics) + .await?; } } diff --git a/node/network/dispute-distribution/src/sender/send_task.rs b/node/network/dispute-distribution/src/sender/send_task.rs index 0c3681a30a99..6b7958b06281 100644 --- a/node/network/dispute-distribution/src/sender/send_task.rs +++ b/node/network/dispute-distribution/src/sender/send_task.rs @@ -20,12 +20,13 @@ use futures::{channel::mpsc, future::RemoteHandle, Future, FutureExt, SinkExt}; use polkadot_node_network_protocol::{ request_response::{ + outgoing::RequestError, v1::{DisputeRequest, DisputeResponse}, OutgoingRequest, OutgoingResult, Recipient, Requests, }, IfDisconnected, }; -use polkadot_node_subsystem_util::runtime::RuntimeInfo; +use polkadot_node_subsystem_util::{metrics, runtime::RuntimeInfo}; use polkadot_primitives::v1::{ AuthorityDiscoveryId, CandidateHash, Hash, SessionIndex, ValidatorIndex, }; @@ -38,7 +39,7 @@ use super::error::{Fatal, Result}; use crate::{ metrics::{FAILED, SUCCEEDED}, - LOG_TARGET, + Metrics, LOG_TARGET, }; /// Delivery status for a particular dispute. @@ -57,6 +58,16 @@ pub struct SendTask { /// Whether we have any tasks failed since the last refresh. has_failed_sends: bool, + /// Total count of failed transmissions. + /// + /// Used for issuing a warning, if that number gets above a certain threshold. + failed_count: usize, + + /// Total number of initiated requests. + /// + /// Used together with `failed_count` for issuing a warning on too many failed attempts. + send_count: usize, + /// Sender to be cloned for tasks. tx: mpsc::Sender, } @@ -87,14 +98,14 @@ pub enum TaskResult { /// Task was not able to get the request out to its peer. /// /// It should be retried in that case. - Failed, + Failed(RequestError), } impl TaskResult { pub fn as_metrics_label(&self) -> &'static str { match self { Self::Succeeded => SUCCEEDED, - Self::Failed => FAILED, + Self::Failed(_) => FAILED, } } } @@ -107,10 +118,17 @@ impl SendTask { active_sessions: &HashMap, tx: mpsc::Sender, request: DisputeRequest, + metrics: &Metrics, ) -> Result { - let mut send_task = - Self { request, deliveries: HashMap::new(), has_failed_sends: false, tx }; - send_task.refresh_sends(ctx, runtime, active_sessions).await?; + let mut send_task = Self { + request, + deliveries: HashMap::new(), + has_failed_sends: false, + tx, + failed_count: 0, + send_count: 0, + }; + send_task.refresh_sends(ctx, runtime, active_sessions, metrics).await?; Ok(send_task) } @@ -123,6 +141,7 @@ impl SendTask { ctx: &mut Context, runtime: &mut RuntimeInfo, active_sessions: &HashMap, + metrics: &Metrics, ) -> Result<()> { let new_authorities = self.get_relevant_validators(ctx, runtime, active_sessions).await?; @@ -137,10 +156,12 @@ impl SendTask { // Start any new tasks that are needed: let new_statuses = - send_requests(ctx, self.tx.clone(), add_authorities, self.request.clone()).await?; + send_requests(ctx, self.tx.clone(), add_authorities, self.request.clone(), metrics) + .await?; - self.deliveries.extend(new_statuses.into_iter()); self.has_failed_sends = false; + self.send_count += new_statuses.len(); + self.deliveries.extend(new_statuses.into_iter()); Ok(()) } @@ -150,15 +171,38 @@ impl SendTask { } /// Handle a finished response waiting task. + /// + /// Called by `DisputeSender` upon reception of the corresponding message from our spawned `wait_response_task`. pub fn on_finished_send(&mut self, authority: &AuthorityDiscoveryId, result: TaskResult) { match result { - TaskResult::Failed => { - tracing::warn!( + TaskResult::Failed(err) => { + tracing::debug!( target: LOG_TARGET, - candidate = ?self.request.0.candidate_receipt.hash(), ?authority, - "Could not get our message out! If this keeps happening, then check chain whether the dispute made it there." + candidate_hash = %self.request.0.candidate_receipt.hash(), + %err, + "Error sending dispute statements to node." ); + + self.failed_count += 1; + let error_rate = (100 * self.failed_count).checked_div(self.send_count).expect( + "We cannot receive a failed request, without having sent one first. qed.", + ); + // 10% seems to be a sensible threshold to become alert - note that + // self.send_count gets increased in batches of the full validator set, so we don't + // need to account for a low send_count. + if error_rate > 10 { + tracing::warn!( + target: LOG_TARGET, + candidate_hash = %self.request.0.candidate_receipt.hash(), + last_authority = ?authority, + last_error = %err, + failed_count = ?self.failed_count, + total_attempts = ?self.send_count, + "Sending our dispute vote failed for more than 10% of total attempts!" + ); + } + self.has_failed_sends = true; // Remove state, so we know what to try again: self.deliveries.remove(authority); @@ -236,6 +280,7 @@ async fn send_requests( tx: mpsc::Sender, receivers: Vec, req: DisputeRequest, + metrics: &Metrics, ) -> Result> { let mut statuses = HashMap::with_capacity(receivers.len()); let mut reqs = Vec::with_capacity(receivers.len()); @@ -251,6 +296,7 @@ async fn send_requests( req.0.candidate_receipt.hash(), receiver.clone(), tx.clone(), + metrics.time_dispute_request(), ); let (remote, remote_handle) = fut.remote_handle(); @@ -273,28 +319,13 @@ async fn wait_response_task( candidate_hash: CandidateHash, receiver: AuthorityDiscoveryId, mut tx: mpsc::Sender, + _timer: Option, ) { let result = pending_response.await; let msg = match result { - Err(err) => { - tracing::warn!( - target: LOG_TARGET, - %candidate_hash, - %receiver, - %err, - "Error sending dispute statements to node." - ); - TaskFinish { candidate_hash, receiver, result: TaskResult::Failed } - }, - Ok(DisputeResponse::Confirmed) => { - tracing::trace!( - target: LOG_TARGET, - %candidate_hash, - %receiver, - "Sending dispute message succeeded" - ); - TaskFinish { candidate_hash, receiver, result: TaskResult::Succeeded } - }, + Err(err) => TaskFinish { candidate_hash, receiver, result: TaskResult::Failed(err) }, + Ok(DisputeResponse::Confirmed) => + TaskFinish { candidate_hash, receiver, result: TaskResult::Succeeded }, }; if let Err(err) = tx.feed(msg).await { tracing::debug!( diff --git a/node/network/gossip-support/Cargo.toml b/node/network/gossip-support/Cargo.toml index d02e36a16c0b..71df67b3fa9f 100644 --- a/node/network/gossip-support/Cargo.toml +++ b/node/network/gossip-support/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-gossip-support" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" @@ -8,6 +8,7 @@ edition = "2018" sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-node-network-protocol = { path = "../protocol" } polkadot-node-subsystem = { path = "../../subsystem" } @@ -15,14 +16,18 @@ polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-primitives = { path = "../../../primitives" } futures = "0.3.17" +futures-timer = "3.0.2" rand = { version = "0.8.3", default-features = false } rand_chacha = { version = "0.3.1", default-features = false } -tracing = "0.1.26" +tracing = "0.1.28" [dev-dependencies] sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } assert_matches = "1.4.0" +async-trait = "0.1.51" +lazy_static = "1.4.0" diff --git a/node/network/gossip-support/src/lib.rs b/node/network/gossip-support/src/lib.rs index 1cdfaf4f5d9e..0679c3ffe2de 100644 --- a/node/network/gossip-support/src/lib.rs +++ b/node/network/gossip-support/src/lib.rs @@ -24,20 +24,35 @@ //! in this graph will be forwarded to the network bridge with //! the `NetworkBridgeMessage::NewGossipTopology` message. -use futures::{channel::oneshot, FutureExt as _}; -use polkadot_node_network_protocol::peer_set::PeerSet; +use std::{ + collections::HashMap, + fmt, + time::{Duration, Instant}, +}; + +use futures::{channel::oneshot, select, FutureExt as _}; +use futures_timer::Delay; +use rand::{seq::SliceRandom as _, SeedableRng}; +use rand_chacha::ChaCha20Rng; + +use sc_network::Multiaddr; +use sp_application_crypto::{AppKey, Public}; +use sp_keystore::{CryptoStore, SyncCryptoStorePtr}; + +use polkadot_node_network_protocol::{ + authority_discovery::AuthorityDiscovery, peer_set::PeerSet, v1::GossipSuppportNetworkMessage, + PeerId, +}; use polkadot_node_subsystem::{ - messages::{GossipSupportMessage, NetworkBridgeMessage, RuntimeApiMessage, RuntimeApiRequest}, + messages::{ + GossipSupportMessage, NetworkBridgeEvent, NetworkBridgeMessage, RuntimeApiMessage, + RuntimeApiRequest, + }, overseer, ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, SubsystemContext, SubsystemError, }; use polkadot_node_subsystem_util as util; use polkadot_primitives::v1::{AuthorityDiscoveryId, Hash, SessionIndex}; -use rand::{seq::SliceRandom as _, SeedableRng}; -use rand_chacha::ChaCha20Rng; -use sp_application_crypto::{AppKey, Public}; -use sp_keystore::{CryptoStore, SyncCryptoStorePtr}; -use std::time::{Duration, Instant}; #[cfg(test)] mod tests; @@ -54,16 +69,15 @@ const BACKOFF_DURATION: Duration = Duration::from_secs(5); /// should be fine: /// /// https://github.com/paritytech/substrate/blob/fc49802f263529160635471c8a17888846035f5d/client/authority-discovery/src/lib.rs#L88 -/// const LOW_CONNECTIVITY_WARN_DELAY: Duration = Duration::from_secs(600); +/// If connectivity is lower than this in percent, issue warning in logs. +const LOW_CONNECTIVITY_WARN_THRESHOLD: usize = 90; + /// The Gossip Support subsystem. -pub struct GossipSupport { +pub struct GossipSupport { keystore: SyncCryptoStorePtr, -} -#[derive(Default)] -struct State { last_session_index: Option, // Some(timestamp) if we failed to resolve // at least a third of authorities the last time. @@ -76,43 +90,73 @@ struct State { /// potential sequence of failed attempts. It will be cleared once we reached >2/3 /// connectivity. failure_start: Option, + + /// Successfully resolved connections + /// + /// waiting for actual connection. + resolved_authorities: HashMap>, + + /// Actually connected authorities. + connected_authorities: HashMap, + /// By `PeerId`. + /// + /// Needed for efficient handling of disconnect events. + connected_authorities_by_peer_id: HashMap, + /// Authority discovery service. + authority_discovery: AD, } -impl GossipSupport { +impl GossipSupport +where + AD: AuthorityDiscovery, +{ /// Create a new instance of the [`GossipSupport`] subsystem. - pub fn new(keystore: SyncCryptoStorePtr) -> Self { - Self { keystore } - } - - async fn run(self, ctx: Context) - where - Context: SubsystemContext, - Context: overseer::SubsystemContext, - { - let mut state = State::default(); - self.run_inner(ctx, &mut state).await; + pub fn new(keystore: SyncCryptoStorePtr, authority_discovery: AD) -> Self { + Self { + keystore, + last_session_index: None, + last_failure: None, + failure_start: None, + resolved_authorities: HashMap::new(), + connected_authorities: HashMap::new(), + connected_authorities_by_peer_id: HashMap::new(), + authority_discovery, + } } - async fn run_inner(self, mut ctx: Context, state: &mut State) + async fn run(mut self, mut ctx: Context) -> Self where Context: SubsystemContext, Context: overseer::SubsystemContext, { - let Self { keystore } = self; + fn get_connectivity_check_delay() -> Delay { + Delay::new(LOW_CONNECTIVITY_WARN_DELAY) + } + let mut next_connectivity_check = get_connectivity_check_delay().fuse(); loop { - let message = match ctx.recv().await { - Ok(message) => message, - Err(e) => { - tracing::debug!( - target: LOG_TARGET, - err = ?e, - "Failed to receive a message from Overseer, exiting", - ); - return - }, - }; + let message = select!( + _ = next_connectivity_check => { + self.check_connectivity(); + next_connectivity_check = get_connectivity_check_delay().fuse(); + continue + } + result = ctx.recv().fuse() => + match result { + Ok(message) => message, + Err(e) => { + tracing::debug!( + target: LOG_TARGET, + err = ?e, + "Failed to receive a message from Overseer, exiting", + ); + return self + }, + } + ); match message { - FromOverseer::Communication { .. } => {}, + FromOverseer::Communication { + msg: GossipSupportMessage::NetworkBridgeUpdateV1(ev), + } => self.handle_connect_disconnect(ev), FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { activated, .. @@ -120,15 +164,189 @@ impl GossipSupport { tracing::trace!(target: LOG_TARGET, "active leaves signal"); let leaves = activated.into_iter().map(|a| a.hash); - if let Err(e) = state.handle_active_leaves(&mut ctx, &keystore, leaves).await { + if let Err(e) = self.handle_active_leaves(&mut ctx, leaves).await { tracing::debug!(target: LOG_TARGET, error = ?e); } }, FromOverseer::Signal(OverseerSignal::BlockFinalized(_hash, _number)) => {}, - FromOverseer::Signal(OverseerSignal::Conclude) => return, + FromOverseer::Signal(OverseerSignal::Conclude) => return self, } } } + + /// 1. Determine if the current session index has changed. + /// 2. If it has, determine relevant validators + /// and issue a connection request. + async fn handle_active_leaves( + &mut self, + ctx: &mut Context, + leaves: impl Iterator, + ) -> Result<(), util::Error> + where + Context: SubsystemContext, + Context: overseer::SubsystemContext, + { + for leaf in leaves { + let current_index = + util::request_session_index_for_child(leaf, ctx.sender()).await.await??; + let since_failure = self.last_failure.map(|i| i.elapsed()).unwrap_or_default(); + let force_request = since_failure >= BACKOFF_DURATION; + let leaf_session = Some((current_index, leaf)); + let maybe_new_session = match self.last_session_index { + Some(i) if current_index <= i => None, + _ => leaf_session, + }; + + let maybe_issue_connection = + if force_request { leaf_session } else { maybe_new_session }; + + if let Some((session_index, relay_parent)) = maybe_issue_connection { + let is_new_session = maybe_new_session.is_some(); + if is_new_session { + tracing::debug!( + target: LOG_TARGET, + %session_index, + "New session detected", + ); + self.last_session_index = Some(session_index); + } + + let all_authorities = determine_relevant_authorities(ctx, relay_parent).await?; + let our_index = ensure_i_am_an_authority(&self.keystore, &all_authorities).await?; + let other_authorities = { + let mut authorities = all_authorities.clone(); + authorities.swap_remove(our_index); + authorities + }; + + self.issue_connection_request(ctx, other_authorities).await; + + if is_new_session { + update_gossip_topology(ctx, our_index, all_authorities, relay_parent).await?; + } + } + } + + Ok(()) + } + + async fn issue_connection_request( + &mut self, + ctx: &mut Context, + authorities: Vec, + ) where + Context: SubsystemContext, + Context: overseer::SubsystemContext, + { + let num = authorities.len(); + let mut validator_addrs = Vec::with_capacity(authorities.len()); + let mut failures = 0; + let mut resolved = HashMap::with_capacity(authorities.len()); + for authority in authorities { + if let Some(addrs) = + self.authority_discovery.get_addresses_by_authority_id(authority.clone()).await + { + validator_addrs.push(addrs.clone()); + resolved.insert(authority, addrs); + } else { + failures += 1; + tracing::debug!( + target: LOG_TARGET, + "Couldn't resolve addresses of authority: {:?}", + authority + ); + } + } + self.resolved_authorities = resolved; + tracing::debug!(target: LOG_TARGET, %num, "Issuing a connection request"); + + ctx.send_message(NetworkBridgeMessage::ConnectToResolvedValidators { + validator_addrs, + peer_set: PeerSet::Validation, + }) + .await; + + // issue another request for the same session + // if at least a third of the authorities were not resolved. + if 3 * failures >= num { + let timestamp = Instant::now(); + match self.failure_start { + None => self.failure_start = Some(timestamp), + Some(first) if first.elapsed() >= LOW_CONNECTIVITY_WARN_DELAY => { + tracing::warn!( + target: LOG_TARGET, + connected = ?(num - failures), + target = ?num, + "Low connectivity - authority lookup failed for too many validators." + ); + }, + Some(_) => { + tracing::debug!( + target: LOG_TARGET, + connected = ?(num - failures), + target = ?num, + "Low connectivity (due to authority lookup failures) - expected on startup." + ); + }, + } + self.last_failure = Some(timestamp); + } else { + self.last_failure = None; + self.failure_start = None; + }; + } + + fn handle_connect_disconnect(&mut self, ev: NetworkBridgeEvent) { + match ev { + NetworkBridgeEvent::PeerConnected(peer_id, _, o_authority) => { + if let Some(authority) = o_authority { + self.connected_authorities.insert(authority.clone(), peer_id); + self.connected_authorities_by_peer_id.insert(peer_id, authority); + } + }, + NetworkBridgeEvent::PeerDisconnected(peer_id) => { + if let Some(authority) = self.connected_authorities_by_peer_id.remove(&peer_id) { + self.connected_authorities.remove(&authority); + } + }, + NetworkBridgeEvent::OurViewChange(_) => {}, + NetworkBridgeEvent::PeerViewChange(_, _) => {}, + NetworkBridgeEvent::NewGossipTopology(_) => {}, + NetworkBridgeEvent::PeerMessage(_, v) => { + match v {}; + }, + } + } + + /// Check connectivity and report on it in logs. + fn check_connectivity(&mut self) { + let absolute_connected = self.connected_authorities.len(); + let absolute_resolved = self.resolved_authorities.len(); + let connected_ratio = + (100 * absolute_connected).checked_div(absolute_resolved).unwrap_or(100); + let unconnected_authorities = self + .resolved_authorities + .iter() + .filter(|(a, _)| !self.connected_authorities.contains_key(a)); + // TODO: Make that warning once connectivity issues are fixed (no point in warning, if + // we already know it is broken. + // https://github.com/paritytech/polkadot/issues/3921 + if connected_ratio <= LOW_CONNECTIVITY_WARN_THRESHOLD { + tracing::debug!( + target: LOG_TARGET, + "Connectivity seems low, we are only connected to {}% of available validators (see debug logs for details)", connected_ratio + ); + } + let pretty = PrettyAuthorities(unconnected_authorities); + tracing::debug!( + target: LOG_TARGET, + ?connected_ratio, + ?absolute_connected, + ?absolute_resolved, + unconnected_authorities = %pretty, + "Connectivity Report" + ); + } } async fn determine_relevant_authorities( @@ -162,22 +380,6 @@ async fn ensure_i_am_an_authority( Err(util::Error::NotAValidator) } -/// A helper function for making a `ConnectToValidators` request. -async fn connect_to_authorities( - ctx: &mut Context, - validator_ids: Vec, - peer_set: PeerSet, -) -> oneshot::Receiver -where - Context: SubsystemContext, - Context: overseer::SubsystemContext, -{ - let (failed, failed_rx) = oneshot::channel(); - ctx.send_message(NetworkBridgeMessage::ConnectToValidators { validator_ids, peer_set, failed }) - .await; - failed_rx -} - /// We partition the list of all sorted `authorities` into `sqrt(len)` groups of `sqrt(len)` size /// and form a matrix where each validator is connected to all validators in its row and column. /// This is similar to `[web3]` research proposed topology, except for the groups are not parachain @@ -254,114 +456,11 @@ fn matrix_neighbors(our_index: usize, len: usize) -> impl Iterator row_neighbors.chain(column_neighbors).filter(move |i| *i != our_index) } -impl State { - /// 1. Determine if the current session index has changed. - /// 2. If it has, determine relevant validators - /// and issue a connection request. - async fn handle_active_leaves( - &mut self, - ctx: &mut Context, - keystore: &SyncCryptoStorePtr, - leaves: impl Iterator, - ) -> Result<(), util::Error> - where - Context: SubsystemContext, - Context: overseer::SubsystemContext, - { - for leaf in leaves { - let current_index = - util::request_session_index_for_child(leaf, ctx.sender()).await.await??; - let since_failure = self.last_failure.map(|i| i.elapsed()).unwrap_or_default(); - let force_request = since_failure >= BACKOFF_DURATION; - let leaf_session = Some((current_index, leaf)); - let maybe_new_session = match self.last_session_index { - Some(i) if current_index <= i => None, - _ => leaf_session, - }; - - let maybe_issue_connection = - if force_request { leaf_session } else { maybe_new_session }; - - if let Some((session_index, relay_parent)) = maybe_issue_connection { - let is_new_session = maybe_new_session.is_some(); - if is_new_session { - tracing::debug!( - target: LOG_TARGET, - %session_index, - "New session detected", - ); - } - - let authorities = determine_relevant_authorities(ctx, relay_parent).await?; - let our_index = ensure_i_am_an_authority(keystore, &authorities).await?; - - self.issue_connection_request(ctx, authorities.clone()).await?; - - if is_new_session { - self.last_session_index = Some(session_index); - update_gossip_topology(ctx, our_index, authorities, relay_parent).await?; - } - } - } - - Ok(()) - } - - async fn issue_connection_request( - &mut self, - ctx: &mut Context, - authorities: Vec, - ) -> Result<(), util::Error> - where - Context: SubsystemContext, - Context: overseer::SubsystemContext, - { - let num = authorities.len(); - tracing::debug!(target: LOG_TARGET, %num, "Issuing a connection request"); - - let failures = connect_to_authorities(ctx, authorities, PeerSet::Validation).await; - - // we await for the request to be processed - // this is fine, it should take much less time than one session - let failures = failures.await.unwrap_or(num); - - // issue another request for the same session - // if at least a third of the authorities were not resolved - if failures >= num / 3 { - let timestamp = Instant::now(); - match self.failure_start { - None => self.failure_start = Some(timestamp), - Some(first) if first.elapsed() >= LOW_CONNECTIVITY_WARN_DELAY => { - tracing::warn!( - target: LOG_TARGET, - connected = ?(num - failures), - target = ?num, - "Low connectivity - authority lookup failed for too many validators." - ); - }, - Some(_) => { - tracing::debug!( - target: LOG_TARGET, - connected = ?(num - failures), - target = ?num, - "Low connectivity (due to authority lookup failures) - expected on startup." - ); - }, - } - self.last_failure = Some(timestamp); - } else { - self.last_failure = None; - self.failure_start = None; - }; - - Ok(()) - } -} - -impl overseer::Subsystem for GossipSupport +impl overseer::Subsystem for GossipSupport where Context: SubsystemContext, Context: overseer::SubsystemContext, + AD: AuthorityDiscovery + Clone, { fn start(self, ctx: Context) -> SpawnedSubsystem { let future = self.run(ctx).map(|_| Ok(())).boxed(); @@ -369,3 +468,28 @@ where SpawnedSubsystem { name: "gossip-support-subsystem", future } } } + +/// Helper struct to get a nice rendering of unreachable authorities. +struct PrettyAuthorities(I); + +impl<'a, I> fmt::Display for PrettyAuthorities +where + I: Iterator)> + Clone, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut authorities = self.0.clone().peekable(); + if authorities.peek().is_none() { + write!(f, "None")?; + } else { + write!(f, "\n")?; + } + for (authority, addrs) in authorities { + write!(f, "{}:\n", authority)?; + for addr in addrs { + write!(f, " {}\n", addr)?; + } + write!(f, "\n")?; + } + Ok(()) + } +} diff --git a/node/network/gossip-support/src/tests.rs b/node/network/gossip-support/src/tests.rs index f858ae1bc9cf..1220f1a5461f 100644 --- a/node/network/gossip-support/src/tests.rs +++ b/node/network/gossip-support/src/tests.rs @@ -16,7 +16,17 @@ //! Unit tests for Gossip Support Subsystem. -use super::*; +use std::{sync::Arc, time::Duration}; + +use assert_matches::assert_matches; +use async_trait::async_trait; +use futures::{executor, future, Future}; +use lazy_static::lazy_static; + +use sc_network::multiaddr::Protocol; +use sp_consensus_babe::{AllowedSlots, BabeEpochConfiguration, Epoch as BabeEpoch}; +use sp_keyring::Sr25519Keyring; + use polkadot_node_subsystem::{ jaeger, messages::{AllMessages, RuntimeApiMessage, RuntimeApiRequest}, @@ -24,47 +34,124 @@ use polkadot_node_subsystem::{ }; use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_node_subsystem_util::TimeoutExt as _; -use sp_consensus_babe::{AllowedSlots, BabeEpochConfiguration, Epoch as BabeEpoch}; -use sp_keyring::Sr25519Keyring; use test_helpers::mock::make_ferdie_keystore; -use assert_matches::assert_matches; -use futures::{executor, future, Future}; -use std::{sync::Arc, time::Duration}; +use super::*; + +lazy_static! { + static ref MOCK_AUTHORITY_DISCOVERY: MockAuthorityDiscovery = MockAuthorityDiscovery::new(); + static ref AUTHORITIES: Vec = { + let mut authorities = OTHER_AUTHORITIES.clone(); + authorities.push(Sr25519Keyring::Ferdie.public().into()); + authorities + }; + static ref OTHER_AUTHORITIES: Vec = vec![ + Sr25519Keyring::Alice.public().into(), + Sr25519Keyring::Bob.public().into(), + Sr25519Keyring::Charlie.public().into(), + Sr25519Keyring::Eve.public().into(), + Sr25519Keyring::One.public().into(), + Sr25519Keyring::Two.public().into(), + ]; + static ref NEIGHBORS: Vec = vec![ + Sr25519Keyring::Two.public().into(), + Sr25519Keyring::Charlie.public().into(), + Sr25519Keyring::Eve.public().into(), + ]; +} type VirtualOverseer = test_helpers::TestSubsystemContextHandle; -fn test_harness>( - mut state: State, +#[derive(Debug, Clone)] +struct MockAuthorityDiscovery { + addrs: HashMap>, + authorities: HashMap, +} + +impl MockAuthorityDiscovery { + fn new() -> Self { + let authorities: HashMap<_, _> = + AUTHORITIES.clone().into_iter().map(|a| (PeerId::random(), a)).collect(); + let addrs = authorities + .clone() + .into_iter() + .map(|(p, a)| { + let multiaddr = Multiaddr::empty().with(Protocol::P2p(p.into())); + (a, vec![multiaddr]) + }) + .collect(); + Self { addrs, authorities } + } +} + +#[async_trait] +impl AuthorityDiscovery for MockAuthorityDiscovery { + async fn get_addresses_by_authority_id( + &mut self, + authority: polkadot_primitives::v1::AuthorityDiscoveryId, + ) -> Option> { + self.addrs.get(&authority).cloned() + } + async fn get_authority_id_by_peer_id( + &mut self, + peer_id: polkadot_node_network_protocol::PeerId, + ) -> Option { + self.authorities.get(&peer_id).cloned() + } +} + +async fn get_other_authorities_addrs() -> Vec> { + let mut addrs = Vec::with_capacity(OTHER_AUTHORITIES.len()); + let mut discovery = MOCK_AUTHORITY_DISCOVERY.clone(); + for authority in OTHER_AUTHORITIES.iter().cloned() { + if let Some(addr) = discovery.get_addresses_by_authority_id(authority).await { + addrs.push(addr); + } + } + addrs +} + +async fn get_other_authorities_addrs_map() -> HashMap> { + let mut addrs = HashMap::with_capacity(OTHER_AUTHORITIES.len()); + let mut discovery = MOCK_AUTHORITY_DISCOVERY.clone(); + for authority in OTHER_AUTHORITIES.iter().cloned() { + if let Some(addr) = discovery.get_addresses_by_authority_id(authority.clone()).await { + addrs.insert(authority, addr); + } + } + addrs +} + +fn make_subsystem() -> GossipSupport { + GossipSupport::new(make_ferdie_keystore(), MOCK_AUTHORITY_DISCOVERY.clone()) +} + +fn test_harness, AD: AuthorityDiscovery>( + subsystem: GossipSupport, test_fn: impl FnOnce(VirtualOverseer) -> T, -) -> State { +) -> GossipSupport { let pool = sp_core::testing::TaskExecutor::new(); let (context, virtual_overseer) = test_helpers::make_subsystem_context(pool.clone()); - let keystore = make_ferdie_keystore(); - let subsystem = GossipSupport::new(keystore); - { - let subsystem = subsystem.run_inner(context, &mut state); - - let test_fut = test_fn(virtual_overseer); - - futures::pin_mut!(test_fut); - futures::pin_mut!(subsystem); - - executor::block_on(future::join( - async move { - let mut overseer = test_fut.await; - overseer - .send(FromOverseer::Signal(OverseerSignal::Conclude)) - .timeout(TIMEOUT) - .await - .expect("Conclude send timeout"); - }, - subsystem, - )); - } - - state + let subsystem = subsystem.run(context); + + let test_fut = test_fn(virtual_overseer); + + futures::pin_mut!(test_fut); + futures::pin_mut!(subsystem); + + let (_, subsystem) = executor::block_on(future::join( + async move { + let mut overseer = test_fut.await; + overseer + .send(FromOverseer::Signal(OverseerSignal::Conclude)) + .timeout(TIMEOUT) + .await + .expect("Conclude send timeout"); + }, + subsystem, + )); + subsystem } const TIMEOUT: Duration = Duration::from_millis(100); @@ -91,25 +178,6 @@ async fn overseer_recv(overseer: &mut VirtualOverseer) -> AllMessages { msg } -fn authorities() -> Vec { - vec![ - Sr25519Keyring::Alice.public().into(), - Sr25519Keyring::Bob.public().into(), - Sr25519Keyring::Charlie.public().into(), - Sr25519Keyring::Ferdie.public().into(), - Sr25519Keyring::Eve.public().into(), - Sr25519Keyring::One.public().into(), - ] -} - -fn neighbors() -> Vec { - vec![ - Sr25519Keyring::One.public().into(), - Sr25519Keyring::Alice.public().into(), - Sr25519Keyring::Eve.public().into(), - ] -} - async fn test_neighbors(overseer: &mut VirtualOverseer) { assert_matches!( overseer_recv(overseer).await, @@ -138,7 +206,7 @@ async fn test_neighbors(overseer: &mut VirtualOverseer) { }) => { let mut got: Vec<_> = our_neighbors.into_iter().collect(); got.sort(); - assert_eq!(got, neighbors()); + assert_eq!(got, NEIGHBORS.clone()); } ); } @@ -146,7 +214,7 @@ async fn test_neighbors(overseer: &mut VirtualOverseer) { #[test] fn issues_a_connection_request_on_new_session() { let hash = Hash::repeat_byte(0xAA); - let state = test_harness(State::default(), |mut virtual_overseer| async move { + let state = test_harness(make_subsystem(), |mut virtual_overseer| async move { let overseer = &mut virtual_overseer; overseer_signal_active_leaves(overseer, hash).await; assert_matches!( @@ -166,20 +234,18 @@ fn issues_a_connection_request_on_new_session() { RuntimeApiRequest::Authorities(tx), )) => { assert_eq!(relay_parent, hash); - tx.send(Ok(authorities())).unwrap(); + tx.send(Ok(AUTHORITIES.clone())).unwrap(); } ); assert_matches!( overseer_recv(overseer).await, - AllMessages::NetworkBridge(NetworkBridgeMessage::ConnectToValidators { - validator_ids, + AllMessages::NetworkBridge(NetworkBridgeMessage::ConnectToResolvedValidators { + validator_addrs, peer_set, - failed, }) => { - assert_eq!(validator_ids, authorities()); + assert_eq!(validator_addrs, get_other_authorities_addrs().await); assert_eq!(peer_set, PeerSet::Validation); - failed.send(0).unwrap(); } ); @@ -234,20 +300,18 @@ fn issues_a_connection_request_on_new_session() { RuntimeApiRequest::Authorities(tx), )) => { assert_eq!(relay_parent, hash); - tx.send(Ok(authorities())).unwrap(); + tx.send(Ok(AUTHORITIES.clone())).unwrap(); } ); assert_matches!( overseer_recv(overseer).await, - AllMessages::NetworkBridge(NetworkBridgeMessage::ConnectToValidators { - validator_ids, + AllMessages::NetworkBridge(NetworkBridgeMessage::ConnectToResolvedValidators { + validator_addrs, peer_set, - failed, }) => { - assert_eq!(validator_ids, authorities()); + assert_eq!(validator_addrs, get_other_authorities_addrs().await); assert_eq!(peer_set, PeerSet::Validation); - failed.send(0).unwrap(); } ); @@ -259,54 +323,97 @@ fn issues_a_connection_request_on_new_session() { assert!(state.last_failure.is_none()); } +#[test] +fn test_log_output() { + sp_tracing::try_init_simple(); + let alice: AuthorityDiscoveryId = Sr25519Keyring::Alice.public().into(); + let bob = Sr25519Keyring::Bob.public().into(); + let unconnected_authorities = { + let mut m = HashMap::new(); + let peer_id = PeerId::random(); + let addr = Multiaddr::empty().with(Protocol::P2p(peer_id.into())); + let addrs = vec![addr.clone(), addr]; + m.insert(alice, addrs); + let peer_id = PeerId::random(); + let addr = Multiaddr::empty().with(Protocol::P2p(peer_id.into())); + let addrs = vec![addr.clone(), addr]; + m.insert(bob, addrs); + m + }; + let pretty = PrettyAuthorities(unconnected_authorities.iter()); + tracing::debug!( + target: LOG_TARGET, + unconnected_authorities = %pretty, + "Connectivity Report" + ); +} + #[test] fn issues_a_connection_request_when_last_request_was_mostly_unresolved() { let hash = Hash::repeat_byte(0xAA); - let mut state = test_harness(State::default(), |mut virtual_overseer| async move { - let overseer = &mut virtual_overseer; - overseer_signal_active_leaves(overseer, hash).await; - assert_matches!( - overseer_recv(overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::SessionIndexForChild(tx), - )) => { - assert_eq!(relay_parent, hash); - tx.send(Ok(1)).unwrap(); - } - ); - assert_matches!( - overseer_recv(overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::Authorities(tx), - )) => { - assert_eq!(relay_parent, hash); - tx.send(Ok(authorities())).unwrap(); - } - ); - - assert_matches!( - overseer_recv(overseer).await, - AllMessages::NetworkBridge(NetworkBridgeMessage::ConnectToValidators { - validator_ids, - peer_set, - failed, - }) => { - assert_eq!(validator_ids, authorities()); - assert_eq!(peer_set, PeerSet::Validation); - failed.send(2).unwrap(); - } - ); - - test_neighbors(overseer).await; - - virtual_overseer - }); + let mut state = make_subsystem(); + // There will be two lookup failures: + let alice = Sr25519Keyring::Alice.public().into(); + let bob = Sr25519Keyring::Bob.public().into(); + let alice_addr = state.authority_discovery.addrs.remove(&alice); + state.authority_discovery.addrs.remove(&bob); + + let mut state = { + let alice = alice.clone(); + let bob = bob.clone(); + + test_harness(state, |mut virtual_overseer| async move { + let overseer = &mut virtual_overseer; + overseer_signal_active_leaves(overseer, hash).await; + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(1)).unwrap(); + } + ); + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Authorities(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(AUTHORITIES.clone())).unwrap(); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridge(NetworkBridgeMessage::ConnectToResolvedValidators { + mut validator_addrs, + peer_set, + }) => { + let mut expected = get_other_authorities_addrs_map().await; + expected.remove(&alice); + expected.remove(&bob); + let mut expected: Vec> = expected.into_iter().map(|(_,v)| v).collect(); + validator_addrs.sort(); + expected.sort(); + assert_eq!(validator_addrs, expected); + assert_eq!(peer_set, PeerSet::Validation); + } + ); + + test_neighbors(overseer).await; + + virtual_overseer + }) + }; assert_eq!(state.last_session_index, Some(1)); assert!(state.last_failure.is_some()); state.last_failure = state.last_failure.and_then(|i| i.checked_sub(BACKOFF_DURATION)); + // One error less: + state.authority_discovery.addrs.insert(alice, alice_addr.unwrap()); let hash = Hash::repeat_byte(0xBB); let state = test_harness(state, |mut virtual_overseer| async move { @@ -329,20 +436,23 @@ fn issues_a_connection_request_when_last_request_was_mostly_unresolved() { RuntimeApiRequest::Authorities(tx), )) => { assert_eq!(relay_parent, hash); - tx.send(Ok(authorities())).unwrap(); + tx.send(Ok(AUTHORITIES.clone())).unwrap(); } ); assert_matches!( overseer_recv(overseer).await, - AllMessages::NetworkBridge(NetworkBridgeMessage::ConnectToValidators { - validator_ids, + AllMessages::NetworkBridge(NetworkBridgeMessage::ConnectToResolvedValidators { + mut validator_addrs, peer_set, - failed, }) => { - assert_eq!(validator_ids, authorities()); + let mut expected = get_other_authorities_addrs_map().await; + expected.remove(&bob); + let mut expected: Vec> = expected.into_iter().map(|(_,v)| v).collect(); + expected.sort(); + validator_addrs.sort(); + assert_eq!(validator_addrs, expected); assert_eq!(peer_set, PeerSet::Validation); - failed.send(1).unwrap(); } ); diff --git a/node/network/protocol/Cargo.toml b/node/network/protocol/Cargo.toml index f3c82abd7f11..9046c232fca4 100644 --- a/node/network/protocol/Cargo.toml +++ b/node/network/protocol/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-node-network-protocol" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" description = "Primitives types for the Node-side" @@ -10,7 +10,7 @@ async-trait = "0.1.51" polkadot-primitives = { path = "../../../primitives" } polkadot-node-primitives = { path = "../../primitives" } polkadot-node-jaeger = { path = "../../jaeger" } -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } strum = { version = "0.21", features = ["derive"] } diff --git a/node/network/protocol/src/lib.rs b/node/network/protocol/src/lib.rs index 1ed915f1879d..e0fb2d2849d1 100644 --- a/node/network/protocol/src/lib.rs +++ b/node/network/protocol/src/lib.rs @@ -294,6 +294,8 @@ pub mod v1 { UncheckedSignedFullStatement, }; + use crate::WrongVariant; + /// Network messages used by the bitfield distribution subsystem. #[derive(Debug, Clone, Encode, Decode, PartialEq, Eq)] pub enum BitfieldDistributionMessage { @@ -386,6 +388,10 @@ pub mod v1 { Approvals(Vec), } + /// Dummy network message type, so we will receive connect/disconnect events. + #[derive(Debug, Clone, PartialEq, Eq)] + pub enum GossipSuppportNetworkMessage {} + /// Network messages used by the collator protocol subsystem #[derive(Debug, Clone, Encode, Decode, PartialEq, Eq)] pub enum CollatorProtocolMessage { @@ -420,6 +426,20 @@ pub mod v1 { impl_try_from!(ValidationProtocol, StatementDistribution, StatementDistributionMessage); impl_try_from!(ValidationProtocol, ApprovalDistribution, ApprovalDistributionMessage); + impl TryFrom for GossipSuppportNetworkMessage { + type Error = WrongVariant; + fn try_from(_: ValidationProtocol) -> Result { + Err(WrongVariant) + } + } + + impl<'a> TryFrom<&'a ValidationProtocol> for &'a GossipSuppportNetworkMessage { + type Error = WrongVariant; + fn try_from(_: &'a ValidationProtocol) -> Result { + Err(WrongVariant) + } + } + /// All network messages on the collation peer-set. #[derive(Debug, Clone, Encode, Decode, PartialEq, Eq)] pub enum CollationProtocol { diff --git a/node/network/protocol/src/request_response/outgoing.rs b/node/network/protocol/src/request_response/outgoing.rs index 38e3c44c7dae..e76b7b0eaac2 100644 --- a/node/network/protocol/src/request_response/outgoing.rs +++ b/node/network/protocol/src/request_response/outgoing.rs @@ -82,11 +82,11 @@ pub type ResponseSender = oneshot::Sender, network::RequestFailur #[derive(Debug, Error)] pub enum RequestError { /// Response could not be decoded. - #[error("Response could not be decoded")] + #[error("Response could not be decoded: {0}")] InvalidResponse(#[source] DecodingError), /// Some error in substrate/libp2p happened. - #[error("Some network error occurred")] + #[error("{0}")] NetworkError(#[source] network::RequestFailure), /// Response got canceled by networking. diff --git a/node/network/statement-distribution/Cargo.toml b/node/network/statement-distribution/Cargo.toml index 1597f99dd6ba..5573363956f7 100644 --- a/node/network/statement-distribution/Cargo.toml +++ b/node/network/statement-distribution/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "polkadot-statement-distribution" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] description = "Statement Distribution Subsystem" edition = "2018" [dependencies] futures = "0.3.17" -tracing = "0.1.26" +tracing = "0.1.28" polkadot-primitives = { path = "../../../primitives" } sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -17,7 +17,7 @@ polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-node-network-protocol = { path = "../../network/protocol" } arrayvec = "0.5.2" indexmap = "1.7.0" -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } derive_more = "0.99.11" thiserror = "1.0.26" diff --git a/node/network/statement-distribution/src/error.rs b/node/network/statement-distribution/src/error.rs index 4eb28eedc0ed..819440e6f29c 100644 --- a/node/network/statement-distribution/src/error.rs +++ b/node/network/statement-distribution/src/error.rs @@ -39,7 +39,7 @@ pub type FatalResult = std::result::Result; pub enum Error { /// Fatal errors of dispute distribution. Fatal(Fatal), - /// Non fatal errors of dispute distribution. + /// Non-fatal errors of dispute distribution. NonFatal(NonFatal), } diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs index ffe54342a13b..e2c08c8216bc 100644 --- a/node/network/statement-distribution/src/lib.rs +++ b/node/network/statement-distribution/src/lib.rs @@ -105,7 +105,7 @@ const MAX_LARGE_STATEMENTS_PER_SENDER: usize = 20; /// The statement distribution subsystem. pub struct StatementDistribution { - /// Pointer to a keystore, which is required for determining this nodes validator index. + /// Pointer to a keystore, which is required for determining this node's validator index. keystore: SyncCryptoStorePtr, /// Receiver for incoming large statement requests. req_receiver: Option>, diff --git a/node/overseer/Cargo.toml b/node/overseer/Cargo.toml index 5ac5df6bba96..5345fb031811 100644 --- a/node/overseer/Cargo.toml +++ b/node/overseer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-overseer" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" @@ -16,9 +16,9 @@ polkadot-node-subsystem-types = { path = "../subsystem-types" } polkadot-node-metrics = { path = "../metrics" } polkadot-primitives = { path = "../../primitives" } polkadot-overseer-gen = { path = "./overseer-gen" } -polkadot-overseer-all-subsystems-gen = { path = "./all-subsystems-gen" } -tracing = "0.1.26" +tracing = "0.1.28" lru = "0.6" +parity-util-mem = { version = ">= 0.10.1", default-features = false } [dev-dependencies] metered-channel = { path = "../metered-channel" } @@ -29,4 +29,3 @@ assert_matches = "1.4.0" [features] default = [] -memory-stats = ["polkadot-node-metrics/memory-stats"] diff --git a/node/overseer/all-subsystems-gen/Cargo.toml b/node/overseer/all-subsystems-gen/Cargo.toml deleted file mode 100644 index 44efb36a56c1..000000000000 --- a/node/overseer/all-subsystems-gen/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "polkadot-overseer-all-subsystems-gen" -version = "0.9.9" -authors = ["Parity Technologies "] -edition = "2018" -description = "Small proc macro to create mocking level iface type helpers" - -[lib] -proc-macro = true - -[dependencies] -syn = { version = "1.0.75", features = ["full", "extra-traits"] } -quote = "1.0.9" -proc-macro2 = "1.0.24" - -[dev-dependencies] -trybuild = "1.0.45" diff --git a/node/overseer/all-subsystems-gen/src/lib.rs b/node/overseer/all-subsystems-gen/src/lib.rs deleted file mode 100644 index e524985f4543..000000000000 --- a/node/overseer/all-subsystems-gen/src/lib.rs +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -use std::collections::HashSet; - -use proc_macro2::TokenStream; -use quote::quote; - -use syn::{parse2, Error, GenericParam, Ident, Result, Type}; - -#[proc_macro_derive(AllSubsystemsGen)] -pub fn subsystems_gen(item: proc_macro::TokenStream) -> proc_macro::TokenStream { - let item: TokenStream = item.into(); - impl_subsystems_gen(item).unwrap_or_else(|err| err.to_compile_error()).into() -} - -fn impl_subsystems_gen(item: TokenStream) -> Result { - let span = proc_macro2::Span::call_site(); - let ds = parse2::(item.clone())?; - - match ds.fields { - syn::Fields::Named(named) => { - #[derive(Clone)] - struct NameTyTup { - field: Ident, - ty: Type, - } - let mut orig_generics = ds.generics; - // remove default types - orig_generics.params = orig_generics - .params - .into_iter() - .map(|mut generic| { - match generic { - GenericParam::Type(ref mut param) => { - param.eq_token = None; - param.default = None; - }, - _ => {}, - } - generic - }) - .collect(); - - // prepare a hashmap of generic type to member that uses it - let generic_types = orig_generics - .params - .iter() - .filter_map(|generic| { - if let GenericParam::Type(param) = generic { - Some(param.ident.clone()) - } else { - None - } - }) - .collect::>(); - - let strukt_ty = ds.ident; - - if generic_types.is_empty() { - return Err(Error::new( - strukt_ty.span(), - "struct must have at least one generic parameter.", - )) - } - - // collect all fields that exist, and all fields that are replaceable - let mut replacable_items = Vec::::with_capacity(64); - let mut all_fields = replacable_items.clone(); - - let mut duplicate_generic_detection = HashSet::::with_capacity(64); - - for field in named.named { - let field_ident = field - .ident - .clone() - .ok_or_else(|| Error::new(span, "Member field must have a name."))?; - let ty = field.ty.clone(); - let ntt = NameTyTup { field: field_ident, ty }; - - replacable_items.push(ntt.clone()); - - // assure every generic is used exactly once - let ty_ident = match field.ty { - Type::Path(path) => path.path.get_ident().cloned().ok_or_else(|| { - Error::new( - proc_macro2::Span::call_site(), - "Expected an identifier, but got a path.", - ) - }), - _ => return Err(Error::new(proc_macro2::Span::call_site(), "Must be path.")), - }?; - - if generic_types.contains(&ty_ident) { - if let Some(previous) = duplicate_generic_detection.replace(ty_ident) { - return Err(Error::new(previous.span(), "Generic type parameters may only be used for exactly one field, but is used more than once.")); - } - } - - all_fields.push(ntt); - } - - let msg = "Generated by #[derive(AllSubsystemsGen)] derive proc-macro."; - let mut additive = TokenStream::new(); - - // generate an impl of `fn replace_#name` - for NameTyTup { field: replacable_item, ty: replacable_item_ty } in replacable_items { - let keeper = &all_fields - .iter() - .filter(|ntt| ntt.field != replacable_item) - .map(|ntt| ntt.field.clone()) - .collect::>(); - let strukt_ty = strukt_ty.clone(); - let fname = Ident::new(&format!("replace_{}", replacable_item), span); - // adjust the generics such that the appropriate member type is replaced - let mut modified_generics = orig_generics.clone(); - modified_generics.params = modified_generics - .params - .into_iter() - .map(|mut generic| { - match generic { - GenericParam::Type(ref mut param) => { - param.eq_token = None; - param.default = None; - if match &replacable_item_ty { - Type::Path(path) => path - .path - .get_ident() - .filter(|&ident| ident == ¶m.ident) - .is_some(), - _ => false, - } { - param.ident = Ident::new("NEW", span); - } - }, - _ => {}, - } - generic - }) - .collect(); - - additive.extend(quote! { - impl #orig_generics #strukt_ty #orig_generics { - #[doc = #msg] - pub fn #fname < NEW, F > (self, gen_replacement_fn: F) -> #strukt_ty #modified_generics - where - F: FnOnce(#replacable_item_ty) -> NEW, - { - let Self { - // To be replaced field: - #replacable_item, - // Fields to keep: - #( - #keeper, - )* - } = self; - - // Some cases require that parts of the original are copied - // over, since they include a one time initialization. - let replacement = gen_replacement_fn(#replacable_item); - - #strukt_ty :: #modified_generics { - #replacable_item: replacement, - #( - #keeper, - )* - } - } - } - }); - } - - Ok(additive) - }, - syn::Fields::Unit => - Err(Error::new(span, "Must be a struct with named fields. Not an unit struct.")), - syn::Fields::Unnamed(_) => Err(Error::new( - span, - "Must be a struct with named fields. Not an unnamed fields struct.", - )), - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn basic() { - let item = quote! { - pub struct AllSubsystems { - pub a: A, - pub beee: B, - pub dj: CD, - } - }; - - let output = impl_subsystems_gen(item).expect("Simple example always works. qed"); - println!("//generated:"); - println!("{}", output); - } - - #[test] - fn ui() { - let t = trybuild::TestCases::new(); - t.compile_fail("tests/ui/err-*.rs"); - t.pass("tests/ui/ok-*.rs"); - } -} diff --git a/node/overseer/all-subsystems-gen/tests/ui/err-01-enum.rs b/node/overseer/all-subsystems-gen/tests/ui/err-01-enum.rs deleted file mode 100644 index ffcbecd0b3f4..000000000000 --- a/node/overseer/all-subsystems-gen/tests/ui/err-01-enum.rs +++ /dev/null @@ -1,13 +0,0 @@ -#![allow(dead_code)] - -use polkadot_overseer_all_subsystems_gen::AllSubsystemsGen; - -#[derive(Clone, AllSubsystemsGen)] -enum AllSubsystems { - A(A), - B(B), -} - -fn main() { - let all = AllSubsystems::::A(0u8); -} diff --git a/node/overseer/all-subsystems-gen/tests/ui/err-01-enum.stderr b/node/overseer/all-subsystems-gen/tests/ui/err-01-enum.stderr deleted file mode 100644 index 5f61df1057cb..000000000000 --- a/node/overseer/all-subsystems-gen/tests/ui/err-01-enum.stderr +++ /dev/null @@ -1,5 +0,0 @@ -error: expected `struct` - --> $DIR/err-01-enum.rs:6:1 - | -6 | enum AllSubsystems { - | ^^^^ diff --git a/node/overseer/all-subsystems-gen/tests/ui/err-01-generic-used-twice.rs b/node/overseer/all-subsystems-gen/tests/ui/err-01-generic-used-twice.rs deleted file mode 100644 index 7c26eedf875f..000000000000 --- a/node/overseer/all-subsystems-gen/tests/ui/err-01-generic-used-twice.rs +++ /dev/null @@ -1,16 +0,0 @@ -#![allow(dead_code)] - -use polkadot_overseer_all_subsystems_gen::AllSubsystemsGen; -#[derive(Clone, AllSubsystemsGen)] -struct AllSubsystems { - a: X, - b: X, -} - -fn main() { - let all = AllSubsystems:: { - a: 0_u16, - b: 1_u16, - }; - let _all = all.replace_a(|_| 77u8); -} diff --git a/node/overseer/all-subsystems-gen/tests/ui/err-01-generic-used-twice.stderr b/node/overseer/all-subsystems-gen/tests/ui/err-01-generic-used-twice.stderr deleted file mode 100644 index b089e8efdb42..000000000000 --- a/node/overseer/all-subsystems-gen/tests/ui/err-01-generic-used-twice.stderr +++ /dev/null @@ -1,14 +0,0 @@ -error: Generic type parameters may only be used for exactly one field, but is used more than once. - --> $DIR/err-01-generic-used-twice.rs:6:5 - | -6 | a: X, - | ^ - -error[E0599]: no method named `replace_a` found for struct `AllSubsystems` in the current scope - --> $DIR/err-01-generic-used-twice.rs:15:17 - | -5 | struct AllSubsystems { - | ----------------------- method `replace_a` not found for this -... -15 | let _all = all.replace_a(|_| 77u8); - | ^^^^^^^^^ method not found in `AllSubsystems` diff --git a/node/overseer/all-subsystems-gen/tests/ui/err-01-no-generic.rs b/node/overseer/all-subsystems-gen/tests/ui/err-01-no-generic.rs deleted file mode 100644 index d95e0ad3182d..000000000000 --- a/node/overseer/all-subsystems-gen/tests/ui/err-01-no-generic.rs +++ /dev/null @@ -1,17 +0,0 @@ -#![allow(dead_code)] - -use polkadot_overseer_all_subsystems_gen::AllSubsystemsGen; - -#[derive(Clone, AllSubsystemsGen)] -struct AllSubsystems { - a: f32, - b: u16, -} - -fn main() { - let all = AllSubsystems { - a: 0_f32, - b: 1_u16, - }; - let _all = all.replace_a(|_| 77u8); -} diff --git a/node/overseer/all-subsystems-gen/tests/ui/err-01-no-generic.stderr b/node/overseer/all-subsystems-gen/tests/ui/err-01-no-generic.stderr deleted file mode 100644 index 1bbb7a5d51ba..000000000000 --- a/node/overseer/all-subsystems-gen/tests/ui/err-01-no-generic.stderr +++ /dev/null @@ -1,14 +0,0 @@ -error: struct must have at least one generic parameter. - --> $DIR/err-01-no-generic.rs:6:8 - | -6 | struct AllSubsystems { - | ^^^^^^^^^^^^^ - -error[E0599]: no method named `replace_a` found for struct `AllSubsystems` in the current scope - --> $DIR/err-01-no-generic.rs:16:17 - | -6 | struct AllSubsystems { - | -------------------- method `replace_a` not found for this -... -16 | let _all = all.replace_a(|_| 77u8); - | ^^^^^^^^^ method not found in `AllSubsystems` diff --git a/node/overseer/all-subsystems-gen/tests/ui/err-01-no-generics.stderr b/node/overseer/all-subsystems-gen/tests/ui/err-01-no-generics.stderr deleted file mode 100644 index 5ca7ec6c2385..000000000000 --- a/node/overseer/all-subsystems-gen/tests/ui/err-01-no-generics.stderr +++ /dev/null @@ -1,14 +0,0 @@ -error: Generic type parameters may only be used once have at least one generic parameter. - --> $DIR/err-01-no-generics.rs:7:5 - | -7 | a: X, - | ^ - -error[E0599]: no method named `replace_a` found for struct `AllSubsystems` in the current scope - --> $DIR/err-01-no-generics.rs:16:17 - | -6 | struct AllSubsystems { - | ----------------------- method `replace_a` not found for this -... -16 | let _all = all.replace_a(|_| 77u8); - | ^^^^^^^^^ method not found in `AllSubsystems` diff --git a/node/overseer/all-subsystems-gen/tests/ui/ok-01-w-generics.rs b/node/overseer/all-subsystems-gen/tests/ui/ok-01-w-generics.rs deleted file mode 100644 index 879cb6770fa8..000000000000 --- a/node/overseer/all-subsystems-gen/tests/ui/ok-01-w-generics.rs +++ /dev/null @@ -1,17 +0,0 @@ -#![allow(dead_code)] - -use polkadot_overseer_all_subsystems_gen::AllSubsystemsGen; - -#[derive(Clone, AllSubsystemsGen)] -struct AllSubsystems { - a: A, - b: B, -} - -fn main() { - let all = AllSubsystems:: { - a: 0u8, - b: 1u16, - }; - let _all: AllSubsystems<_,_> = all.replace_a::(|_| 777_777u32); -} diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index 6970054a3013..41ec66642976 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -28,8 +28,9 @@ use polkadot_node_subsystem_types::messages::{ }; use polkadot_overseer::{ self as overseer, + dummy::dummy_overseer_builder, gen::{FromOverseer, SpawnedSubsystem}, - AllMessages, AllSubsystems, HeadSupportsParachains, Overseer, OverseerSignal, SubsystemError, + AllMessages, HeadSupportsParachains, OverseerSignal, SubsystemError, }; use polkadot_primitives::v1::Hash; @@ -74,6 +75,7 @@ impl Subsystem1 { let msg = CandidateValidationMessage::ValidateFromChainState( Default::default(), PoV { block_data: BlockData(Vec::new()) }.into(), + Default::default(), tx, ); ctx.send_message(::AllMessages::from(msg)) @@ -169,12 +171,13 @@ fn main() { Delay::new(Duration::from_secs(1)).await; }); - let all_subsystems = AllSubsystems::<()>::dummy() + let (overseer, _handle) = dummy_overseer_builder(spawner, AlwaysSupportsParachains, None) + .unwrap() .replace_candidate_validation(|_| Subsystem2) - .replace_candidate_backing(|orig| orig); + .replace_candidate_backing(|orig| orig) + .build() + .unwrap(); - let (overseer, _handle) = - Overseer::new(vec![], all_subsystems, None, AlwaysSupportsParachains, spawner).unwrap(); let overseer_fut = overseer.run().fuse(); let timer_stream = timer_stream; diff --git a/node/overseer/overseer-gen/Cargo.toml b/node/overseer/overseer-gen/Cargo.toml index 90c96672b1b3..dfa1d8a508f4 100644 --- a/node/overseer/overseer-gen/Cargo.toml +++ b/node/overseer/overseer-gen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-overseer-gen" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" description = "Generate an overseer including builder pattern and message wrapper from a single struct." diff --git a/node/overseer/overseer-gen/proc-macro/Cargo.toml b/node/overseer/overseer-gen/proc-macro/Cargo.toml index 89a876ce11a0..e51f63010f7d 100644 --- a/node/overseer/overseer-gen/proc-macro/Cargo.toml +++ b/node/overseer/overseer-gen/proc-macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-overseer-gen-proc-macro" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" description = "Generate an overseer including builder pattern and message wrapper from a single annotated struct definition." @@ -12,10 +12,16 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -syn = { version = "1.0.75", features = ["full", "extra-traits"] } -quote = "1.0.9" +syn = { version = "1.0.78", features = ["full", "extra-traits"] } +quote = "1.0.10" proc-macro2 = "1.0.26" -proc-macro-crate = "1.0.0" +proc-macro-crate = "1.1.0" [dev-dependencies] assert_matches = "1.5.0" + +[features] +default = [] +# write the expanded version to a `overlord-expansion.rs` +# in the `cwd` +expansion = [] diff --git a/node/overseer/overseer-gen/proc-macro/src/impl_builder.rs b/node/overseer/overseer-gen/proc-macro/src/impl_builder.rs index 832e193fd4d1..94074ceb93f8 100644 --- a/node/overseer/overseer-gen/proc-macro/src/impl_builder.rs +++ b/node/overseer/overseer-gen/proc-macro/src/impl_builder.rs @@ -19,6 +19,39 @@ use syn::Ident; use super::*; +/// Returns all combinations for a single replacement: +/// 1. generic args with `NEW` in place +/// 2. subsystem type to be replaced +/// 3. the subsystem name to be replaced by a new type and value +/// 4. all other subsystems that are supposed to be kept +fn derive_replacable_generic_lists( + info: &OverseerInfo, +) -> Vec<(TokenStream, Ident, Ident, Vec)> { + // subsystem generic types + let builder_generic_ty = info.builder_generic_types(); + + let to_be_replaced_name = info.subsystem_names_without_wip(); + let baggage_generic_ty = &info.baggage_generic_types(); + + builder_generic_ty + .iter() + .enumerate() + .map(|(idx, to_be_replaced_ty)| { + let mut to_keep_name = to_be_replaced_name.clone(); + let to_be_replaced_name: Ident = to_keep_name.remove(idx); + + let mut builder_generic_ty = builder_generic_ty.clone(); + builder_generic_ty[idx] = format_ident!("NEW"); + + let generics_ts = quote! { + + }; + + (generics_ts, to_be_replaced_ty.clone(), to_be_replaced_name, to_keep_name) + }) + .collect::>() +} + /// Implement a builder pattern for the `Overseer`-type, /// which acts as the gateway to constructing the overseer. /// @@ -35,6 +68,12 @@ pub(crate) fn impl_builder(info: &OverseerInfo) -> proc_macro2::TokenStream { .iter() .map(|subsystem_name| format_ident!("{}_with", subsystem_name)) .collect::>(); + let subsystem_name_replace_with = &info + .subsystem_names_without_wip() + .iter() + .map(|subsystem_name| format_ident!("replace_{}", subsystem_name)) + .collect::>(); + let builder_generic_ty = &info.builder_generic_types(); let channel_name = &info.channel_names_without_wip(""); @@ -50,6 +89,8 @@ pub(crate) fn impl_builder(info: &OverseerInfo) -> proc_macro2::TokenStream { let baggage_name = &info.baggage_names(); let baggage_ty = &info.baggage_types(); + let subsystem_ctx_name = format_ident!("{}SubsystemContext", overseer_name); + let error_ty = &info.extern_error_ty; let support_crate = info.support_crate_name(); @@ -130,9 +171,13 @@ pub(crate) fn impl_builder(info: &OverseerInfo) -> proc_macro2::TokenStream { &mut self.handle } /// Obtain access to the overseer handle. - pub fn as_handle(&mut self) -> &#handle { + pub fn as_handle(&self) -> &#handle { &self.handle } + /// Obtain a clone of the handle. + pub fn handle(&self) -> #handle { + self.handle.clone() + } } impl ::std::default::Default for #connector { @@ -151,7 +196,7 @@ pub(crate) fn impl_builder(info: &OverseerInfo) -> proc_macro2::TokenStream { /// Convenience alias. type SubsystemInitFn = Box ::std::result::Result >; - /// Init kind of a field of the overseer. + /// Initialization type to be used for a field of the overseer. enum FieldInitMethod { /// Defer initialization to a point where the `handle` is available. Fn(SubsystemInitFn), @@ -238,13 +283,13 @@ pub(crate) fn impl_builder(info: &OverseerInfo) -> proc_macro2::TokenStream { )* /// Complete the construction and create the overseer type. - pub fn build(mut self) -> ::std::result::Result<(#overseer_name #generics, #handle), #error_ty> { + pub fn build(self) -> ::std::result::Result<(#overseer_name #generics, #handle), #error_ty> { let connector = #connector ::default(); self.build_with_connector(connector) } /// Complete the construction and create the overseer type based on an existing `connector`. - pub fn build_with_connector(mut self, connector: #connector) -> ::std::result::Result<(#overseer_name #generics, #handle), #error_ty> + pub fn build_with_connector(self, connector: #connector) -> ::std::result::Result<(#overseer_name #generics, #handle), #error_ty> { let #connector { handle: events_tx, @@ -317,7 +362,6 @@ pub(crate) fn impl_builder(info: &OverseerInfo) -> proc_macro2::TokenStream { #channel_name_tx, signal_tx, unbounded_meter, - channels_out.clone(), ctx, #subsystem_name, &mut running_subsystems, @@ -326,9 +370,9 @@ pub(crate) fn impl_builder(info: &OverseerInfo) -> proc_macro2::TokenStream { #( let #baggage_name = self. #baggage_name .expect( - &format!("Baggage variable `{1}` of `{0}` ", - stringify!(#overseer_name), - stringify!( #baggage_name ) + &format!("Baggage variable `{0}` of `{1}` must be set by the user!", + stringify!(#baggage_name), + stringify!(#overseer_name) ) ); )* @@ -355,6 +399,83 @@ pub(crate) fn impl_builder(info: &OverseerInfo) -> proc_macro2::TokenStream { } } }; + + let mut acc = TokenStream::new(); + + for ( + ( + ( + ref modified_generics, + ref to_be_replaced_ty, + ref to_be_replaced_name, + ref to_keep_name, + ), + subsystem_name_replace_with, + ), + consumes, + ) in derive_replacable_generic_lists(info) + .into_iter() + .zip(subsystem_name_replace_with.iter()) + .zip(consumes.iter()) + { + let replace1 = quote! { + /// Replace a subsystem by another implementation for the + /// consumable message type. + pub fn #subsystem_name_replace_with < NEW, F > + (self, gen_replacement_fn: F) -> #builder #modified_generics + where + #to_be_replaced_ty: 'static, + F: 'static + FnOnce(#to_be_replaced_ty) -> NEW, + NEW: #support_crate ::Subsystem<#subsystem_ctx_name< #consumes >, #error_ty>, + { + + let Self { + #to_be_replaced_name, + #( + #to_keep_name, + )* + #( + #baggage_name, + )* + spawner, + } = self; + + // Some cases require that parts of the original are copied + // over, since they include a one time initialization. + let replacement: FieldInitMethod = match #to_be_replaced_name { + FieldInitMethod::Fn(fx) => FieldInitMethod::Fn( + Box::new(move |handle: #handle| { + let orig = fx(handle)?; + Ok(gen_replacement_fn(orig)) + }) + ), + FieldInitMethod::Value(val) => FieldInitMethod::Value(gen_replacement_fn(val)), + FieldInitMethod::Uninitialized => panic!("Must have a value before it can be replaced. qed"), + }; + + #builder :: #modified_generics { + #to_be_replaced_name: replacement, + #( + #to_keep_name, + )* + #( + #baggage_name, + )* + spawner, + } + } + }; + acc.extend(replace1); + } + + ts.extend(quote! { + impl #builder_generics #builder #builder_generics + #builder_where_clause + { + #acc + } + }); + ts.extend(impl_task_kind(info)); ts } @@ -365,9 +486,6 @@ pub(crate) fn impl_task_kind(info: &OverseerInfo) -> proc_macro2::TokenStream { let support_crate = info.support_crate_name(); let ts = quote! { - - use #support_crate ::FutureExt as _; - /// Task kind to launch. pub trait TaskKind { /// Spawn a task, it depends on the implementer if this is blocking or not. @@ -397,8 +515,6 @@ pub(crate) fn impl_task_kind(info: &OverseerInfo) -> proc_macro2::TokenStream { signal_tx: #support_crate ::metered::MeteredSender< #signal >, // meter for the unbounded channel unbounded_meter: #support_crate ::metered::Meter, - // connection to the subsystems - channels_out: ChannelsOut, ctx: Ctx, s: SubSys, futures: &mut #support_crate ::FuturesUnordered >>, diff --git a/node/overseer/overseer-gen/proc-macro/src/impl_channels_out.rs b/node/overseer/overseer-gen/proc-macro/src/impl_channels_out.rs index f2d6e88b360b..08744e6c520d 100644 --- a/node/overseer/overseer-gen/proc-macro/src/impl_channels_out.rs +++ b/node/overseer/overseer-gen/proc-macro/src/impl_channels_out.rs @@ -94,8 +94,6 @@ pub(crate) fn impl_channels_out_struct(info: &OverseerInfo) -> Result = match message { #( #message_wrapper :: #consumes_variant (inner) => { diff --git a/node/overseer/overseer-gen/proc-macro/src/impl_overseer.rs b/node/overseer/overseer-gen/proc-macro/src/impl_overseer.rs index cddd0534c6ea..54b207eb1960 100644 --- a/node/overseer/overseer-gen/proc-macro/src/impl_overseer.rs +++ b/node/overseer/overseer-gen/proc-macro/src/impl_overseer.rs @@ -56,8 +56,6 @@ pub(crate) fn impl_overseer_struct(info: &OverseerInfo) -> proc_macro2::TokenStr syn::LitStr::new(overseer_name.to_string().to_lowercase().as_str(), overseer_name.span()); let ts = quote! { - const STOP_DELAY: ::std::time::Duration = ::std::time::Duration::from_secs(1); - /// Capacity of a bounded message channel between overseer and subsystem /// but also for bounded channels between two subsystems. const CHANNEL_CAPACITY: usize = #message_channel_capacity; @@ -116,10 +114,9 @@ pub(crate) fn impl_overseer_struct(info: &OverseerInfo) -> proc_macro2::TokenStr loop { select! { - _ = self.running_subsystems.next() => { - if self.running_subsystems.is_empty() { - break; - } + _ = self.running_subsystems.next() => + if self.running_subsystems.is_empty() { + break; }, _ = timeout_fut => break, complete => break, @@ -187,9 +184,6 @@ pub(crate) fn impl_overseen_subsystem(info: &OverseerInfo) -> proc_macro2::Token let support_crate = info.support_crate_name(); let ts = quote::quote! { - - use #support_crate ::futures::SinkExt as _; - /// A subsystem that the overseer oversees. /// /// Ties together the [`Subsystem`] itself and it's running instance diff --git a/node/overseer/overseer-gen/proc-macro/src/lib.rs b/node/overseer/overseer-gen/proc-macro/src/lib.rs index b967acfe8b65..1a0634b29720 100644 --- a/node/overseer/overseer-gen/proc-macro/src/lib.rs +++ b/node/overseer/overseer-gen/proc-macro/src/lib.rs @@ -98,5 +98,28 @@ pub(crate) fn impl_overseer_gen( additive.extend(impl_message_wrapper_enum(&info)?); additive.extend(impl_dispatch(&info)); + #[cfg(feature = "expansion")] + { + use std::io::Write; + + let cwd = std::env::current_dir().unwrap(); + let path: std::path::PathBuf = cwd.join("overlord-expansion.rs"); + let mut f = std::fs::OpenOptions::new() + .write(true) + .create(true) + .truncate(true) + .open(&path) + .expect("File exists. qed"); + f.write_all( + &mut format!("// {:?} \n{}", std::time::SystemTime::now(), additive).as_bytes(), + ) + .expect("Got permissions to write to file. qed"); + std::process::Command::new("rustfmt") + .arg("--edition=2018") + .arg(&path) + .current_dir(cwd) + .spawn() + .expect("Running rustfmt works. qed"); + } Ok(additive) } diff --git a/node/overseer/overseer-gen/tests/ui/err-01-duplicate-consumer.stderr b/node/overseer/overseer-gen/tests/ui/err-01-duplicate-consumer.stderr index edb0ef436951..a66f2fa3e77b 100644 --- a/node/overseer/overseer-gen/tests/ui/err-01-duplicate-consumer.stderr +++ b/node/overseer/overseer-gen/tests/ui/err-01-duplicate-consumer.stderr @@ -7,7 +7,7 @@ error[E0119]: conflicting implementations of trait `std::convert::From` for type `OverseerSubsystemSender` --> $DIR/err-01-duplicate-consumer.rs:19:1 @@ -18,4 +18,4 @@ error[E0119]: conflicting implementations of trait `polkadot_overseer_gen::Subsy | first implementation here | conflicting implementation for `OverseerSubsystemSender` | - = note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this error originates in the attribute macro `overlord` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/node/overseer/overseer-gen/tests/ui/err-04-missing-error.stderr b/node/overseer/overseer-gen/tests/ui/err-04-missing-error.stderr index 39e6a4a8fdc0..7fa4d832253e 100644 --- a/node/overseer/overseer-gen/tests/ui/err-04-missing-error.stderr +++ b/node/overseer/overseer-gen/tests/ui/err-04-missing-error.stderr @@ -4,7 +4,7 @@ error: Must declare the overseer error type via `error=..`. 16 | #[overlord(signal=SigSigSig, event=Event, gen=AllMessages)] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this error originates in the attribute macro `overlord` (in Nightly builds, run with -Z macro-backtrace for more info) error[E0433]: failed to resolve: use of undeclared type `Overseer` --> $DIR/err-04-missing-error.rs:30:10 diff --git a/node/overseer/src/dummy.rs b/node/overseer/src/dummy.rs new file mode 100644 index 000000000000..09b594867fc0 --- /dev/null +++ b/node/overseer/src/dummy.rs @@ -0,0 +1,196 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::{ + prometheus::Registry, AllMessages, HeadSupportsParachains, MetricsTrait, Overseer, + OverseerBuilder, OverseerMetrics, OverseerSignal, OverseerSubsystemContext, SpawnNamed, + KNOWN_LEAVES_CACHE_SIZE, +}; +use lru::LruCache; +use polkadot_node_subsystem_types::{errors::SubsystemError, messages::*}; +use polkadot_overseer_gen::{FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext}; + +/// A dummy subsystem that implements [`Subsystem`] for all +/// types of messages. Used for tests or as a placeholder. +#[derive(Clone, Copy, Debug)] +pub struct DummySubsystem; + +impl Subsystem for DummySubsystem +where + Context: SubsystemContext< + Signal = OverseerSignal, + Error = SubsystemError, + AllMessages = AllMessages, + >, +{ + fn start(self, mut ctx: Context) -> SpawnedSubsystem { + let future = Box::pin(async move { + loop { + match ctx.recv().await { + Err(_) => return Ok(()), + Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => return Ok(()), + Ok(overseer_msg) => { + tracing::debug!( + target: "dummy-subsystem", + "Discarding a message sent from overseer {:?}", + overseer_msg + ); + continue + }, + } + } + }); + + SpawnedSubsystem { name: "dummy-subsystem", future } + } +} + +/// Create an overseer with all subsystem being `Sub`. +/// +/// Preferred way of initializing a dummy overseer for subsystem tests. +pub fn dummy_overseer_builder<'a, Spawner, SupportsParachains>( + spawner: Spawner, + supports_parachains: SupportsParachains, + registry: Option<&'a Registry>, +) -> Result< + OverseerBuilder< + Spawner, + SupportsParachains, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + >, + SubsystemError, +> +where + Spawner: SpawnNamed + Send + Sync + 'static, + SupportsParachains: HeadSupportsParachains, +{ + one_for_all_overseer_builder(spawner, supports_parachains, DummySubsystem, registry) +} + +/// Create an overseer with all subsystem being `Sub`. +pub fn one_for_all_overseer_builder<'a, Spawner, SupportsParachains, Sub>( + spawner: Spawner, + supports_parachains: SupportsParachains, + subsystem: Sub, + registry: Option<&'a Registry>, +) -> Result< + OverseerBuilder< + Spawner, + SupportsParachains, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + Sub, + >, + SubsystemError, +> +where + Spawner: SpawnNamed + Send + Sync + 'static, + SupportsParachains: HeadSupportsParachains, + Sub: Clone + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError> + + Subsystem, SubsystemError>, +{ + let metrics = ::register(registry)?; + + let builder = Overseer::builder() + .availability_distribution(subsystem.clone()) + .availability_recovery(subsystem.clone()) + .availability_store(subsystem.clone()) + .bitfield_distribution(subsystem.clone()) + .bitfield_signing(subsystem.clone()) + .candidate_backing(subsystem.clone()) + .candidate_validation(subsystem.clone()) + .chain_api(subsystem.clone()) + .collation_generation(subsystem.clone()) + .collator_protocol(subsystem.clone()) + .network_bridge(subsystem.clone()) + .provisioner(subsystem.clone()) + .runtime_api(subsystem.clone()) + .statement_distribution(subsystem.clone()) + .approval_distribution(subsystem.clone()) + .approval_voting(subsystem.clone()) + .gossip_support(subsystem.clone()) + .dispute_coordinator(subsystem.clone()) + .dispute_participation(subsystem.clone()) + .dispute_distribution(subsystem.clone()) + .chain_selection(subsystem) + .activation_external_listeners(Default::default()) + .span_per_active_leaf(Default::default()) + .active_leaves(Default::default()) + .known_leaves(LruCache::new(KNOWN_LEAVES_CACHE_SIZE)) + .leaves(Default::default()) + .spawner(spawner) + .metrics(metrics) + .supports_parachains(supports_parachains); + Ok(builder) +} diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 57effe57681f..3a1e5a31458d 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -62,7 +62,6 @@ use std::{ collections::{hash_map, HashMap}, fmt::{self, Debug}, - iter::FromIterator, pin::Pin, sync::Arc, time::Duration, @@ -70,7 +69,6 @@ use std::{ use futures::{channel::oneshot, future::BoxFuture, select, Future, FutureExt, StreamExt}; use lru::LruCache; -use parking_lot::RwLock; use client::{BlockImportNotification, BlockchainEvents, FinalityNotification}; use polkadot_primitives::v1::{Block, BlockId, BlockNumber, Hash, ParachainHost}; @@ -91,21 +89,19 @@ pub use polkadot_node_subsystem_types::{ jaeger, ActivatedLeaf, ActiveLeavesUpdate, LeafStatus, OverseerSignal, }; -// TODO legacy, to be deleted, left for easier integration -// TODO https://github.com/paritytech/polkadot/issues/3427 -mod subsystems; -pub use self::subsystems::AllSubsystems; +pub mod metrics; +pub use self::metrics::Metrics as OverseerMetrics; -mod metrics; -use self::metrics::Metrics; +/// A dummy subsystem, mostly useful for placeholders and tests. +pub mod dummy; +pub use self::dummy::DummySubsystem; -use polkadot_node_metrics::{ +pub use polkadot_node_metrics::{ metrics::{prometheus, Metrics as MetricsTrait}, Metronome, }; -#[cfg(feature = "memory-stats")] -use polkadot_node_metrics::memory_stats::MemoryAllocationTracker; +use parity_util_mem::MemoryAllocationTracker; pub use polkadot_overseer_gen as gen; pub use polkadot_overseer_gen::{ @@ -116,7 +112,7 @@ pub use polkadot_overseer_gen::{ /// Store 2 days worth of blocks, not accounting for forks, /// in the LRU cache. Assumes a 6-second block time. -const KNOWN_LEAVES_CACHE_SIZE: usize = 2 * 24 * 3600 / 6; +pub const KNOWN_LEAVES_CACHE_SIZE: usize = 2 * 24 * 3600 / 6; #[cfg(test)] mod tests; @@ -142,18 +138,12 @@ where /// /// [`Overseer`]: struct.Overseer.html #[derive(Clone)] -pub enum Handle { - /// Used only at initialization to break the cyclic dependency. - // TODO: refactor in https://github.com/paritytech/polkadot/issues/3427 - Disconnected(Arc>>), - /// A handle to the overseer. - Connected(OverseerHandle), -} +pub struct Handle(OverseerHandle); impl Handle { - /// Create a new disconnected [`Handle`]. - pub fn new_disconnected() -> Self { - Self::Disconnected(Arc::new(RwLock::new(None))) + /// Create a new [`Handle`]. + pub fn new(raw: OverseerHandle) -> Self { + Self(raw) } /// Inform the `Overseer` that that some block was imported. @@ -202,58 +192,8 @@ impl Handle { /// Most basic operation, to stop a server. async fn send_and_log_error(&mut self, event: Event) { - self.try_connect(); - if let Self::Connected(ref mut handle) = self { - if handle.send(event).await.is_err() { - tracing::info!(target: LOG_TARGET, "Failed to send an event to Overseer"); - } - } else { - tracing::warn!(target: LOG_TARGET, "Using a disconnected Handle to send to Overseer"); - } - } - - /// Whether the handle is disconnected. - pub fn is_disconnected(&self) -> bool { - match self { - Self::Disconnected(ref x) => x.read().is_none(), - _ => false, - } - } - - /// Connect this handle and all disconnected clones of it to the overseer. - pub fn connect_to_overseer(&mut self, handle: OverseerHandle) { - match self { - Self::Disconnected(ref mut x) => { - let mut maybe_handle = x.write(); - if maybe_handle.is_none() { - tracing::info!(target: LOG_TARGET, "🖇️ Connecting all Handles to Overseer"); - *maybe_handle = Some(handle); - } else { - tracing::warn!( - target: LOG_TARGET, - "Attempting to connect a clone of a connected Handle", - ); - } - }, - _ => { - tracing::warn!( - target: LOG_TARGET, - "Attempting to connect an already connected Handle", - ); - }, - } - } - - /// Try upgrading from `Self::Disconnected` to `Self::Connected` state - /// after calling `connect_to_overseer` on `self` or a clone of `self`. - fn try_connect(&mut self) { - if let Self::Disconnected(ref mut x) = self { - let guard = x.write(); - if let Some(ref h) = *guard { - let handle = h.clone(); - drop(guard); - *self = Self::Connected(handle); - } + if self.0.send(event).await.is_err() { + tracing::info!(target: LOG_TARGET, "Failed to send an event to Overseer"); } } } @@ -347,7 +287,119 @@ pub async fn forward_events>(client: Arc

, mut hand } } -/// The `Overseer` itself. +/// Create a new instance of the [`Overseer`] with a fixed set of [`Subsystem`]s. +/// +/// This returns the overseer along with an [`OverseerHandle`] which can +/// be used to send messages from external parts of the codebase. +/// +/// The [`OverseerHandle`] returned from this function is connected to +/// the returned [`Overseer`]. +/// +/// ```text +/// +------------------------------------+ +/// | Overseer | +/// +------------------------------------+ +/// / | | \ +/// ................. subsystems................................... +/// . +-----------+ +-----------+ +----------+ +---------+ . +/// . | | | | | | | | . +/// . +-----------+ +-----------+ +----------+ +---------+ . +/// ............................................................... +/// | +/// probably `spawn` +/// a `job` +/// | +/// V +/// +-----------+ +/// | | +/// +-----------+ +/// +/// ``` +/// +/// [`Subsystem`]: trait.Subsystem.html +/// +/// # Example +/// +/// The [`Subsystems`] may be any type as long as they implement an expected interface. +/// Here, we create a mock validation subsystem and a few dummy ones and start the `Overseer` with them. +/// For the sake of simplicity the termination of the example is done with a timeout. +/// ``` +/// # use std::time::Duration; +/// # use futures::{executor, pin_mut, select, FutureExt}; +/// # use futures_timer::Delay; +/// # use polkadot_primitives::v1::Hash; +/// # use polkadot_overseer::{ +/// # self as overseer, +/// # OverseerSignal, +/// # SubsystemSender as _, +/// # AllMessages, +/// # HeadSupportsParachains, +/// # Overseer, +/// # SubsystemError, +/// # gen::{ +/// # SubsystemContext, +/// # FromOverseer, +/// # SpawnedSubsystem, +/// # }, +/// # }; +/// # use polkadot_node_subsystem_types::messages::{ +/// # CandidateValidationMessage, CandidateBackingMessage, +/// # NetworkBridgeMessage, +/// # }; +/// +/// struct ValidationSubsystem; +/// +/// impl overseer::Subsystem for ValidationSubsystem +/// where +/// Ctx: overseer::SubsystemContext< +/// Message=CandidateValidationMessage, +/// AllMessages=AllMessages, +/// Signal=OverseerSignal, +/// Error=SubsystemError, +/// >, +/// { +/// fn start( +/// self, +/// mut ctx: Ctx, +/// ) -> SpawnedSubsystem { +/// SpawnedSubsystem { +/// name: "validation-subsystem", +/// future: Box::pin(async move { +/// loop { +/// Delay::new(Duration::from_secs(1)).await; +/// } +/// }), +/// } +/// } +/// } +/// +/// # fn main() { executor::block_on(async move { +/// +/// struct AlwaysSupportsParachains; +/// impl HeadSupportsParachains for AlwaysSupportsParachains { +/// fn head_supports_parachains(&self, _head: &Hash) -> bool { true } +/// } +/// let spawner = sp_core::testing::TaskExecutor::new(); +/// let (overseer, _handle) = dummy_overseer_builder(spawner, AlwaysSupportsParachains, None) +/// .unwrap() +/// .replace_candidate_validation(|_| ValidationSubsystem) +/// .build() +/// .unwrap(); +/// +/// let timer = Delay::new(Duration::from_millis(50)).fuse(); +/// +/// let overseer_fut = overseer.run().fuse(); +/// pin_mut!(timer); +/// pin_mut!(overseer_fut); +/// +/// select! { +/// _ = overseer_fut => (), +/// _ = timer => (), +/// } +/// # +/// # }); +/// # } +/// ``` #[overlord( gen=AllMessages, event=Event, @@ -404,7 +456,7 @@ pub struct Overseer { #[subsystem(no_dispatch, ApprovalVotingMessage)] approval_voting: ApprovalVoting, - #[subsystem(no_dispatch, GossipSupportMessage)] + #[subsystem(GossipSupportMessage)] gossip_support: GossipSupport, #[subsystem(no_dispatch, DisputeCoordinatorMessage)] @@ -440,307 +492,85 @@ pub struct Overseer { pub known_leaves: LruCache, /// Various Prometheus metrics. - pub metrics: Metrics, + pub metrics: OverseerMetrics, } -impl Overseer +/// Spawn the metrics metronome task. +pub fn spawn_metronome_metrics( + overseer: &mut Overseer, + metronome_metrics: OverseerMetrics, +) -> Result<(), SubsystemError> where - SupportsParachains: HeadSupportsParachains, S: SpawnNamed, + SupportsParachains: HeadSupportsParachains, { - /// Create a new instance of the [`Overseer`] with a fixed set of [`Subsystem`]s. - /// - /// This returns the overseer along with an [`OverseerHandle`] which can - /// be used to send messages from external parts of the codebase. - /// - /// The [`OverseerHandle`] returned from this function is connected to - /// the returned [`Overseer`]. - /// - /// ```text - /// +------------------------------------+ - /// | Overseer | - /// +------------------------------------+ - /// / | | \ - /// ................. subsystems................................... - /// . +-----------+ +-----------+ +----------+ +---------+ . - /// . | | | | | | | | . - /// . +-----------+ +-----------+ +----------+ +---------+ . - /// ............................................................... - /// | - /// probably `spawn` - /// a `job` - /// | - /// V - /// +-----------+ - /// | | - /// +-----------+ - /// - /// ``` - /// - /// [`Subsystem`]: trait.Subsystem.html - /// - /// # Example - /// - /// The [`Subsystems`] may be any type as long as they implement an expected interface. - /// Here, we create a mock validation subsystem and a few dummy ones and start the `Overseer` with them. - /// For the sake of simplicity the termination of the example is done with a timeout. - /// ``` - /// # use std::time::Duration; - /// # use futures::{executor, pin_mut, select, FutureExt}; - /// # use futures_timer::Delay; - /// # use polkadot_primitives::v1::Hash; - /// # use polkadot_overseer::{ - /// # self as overseer, - /// # OverseerSignal, - /// # SubsystemSender as _, - /// # AllMessages, - /// # AllSubsystems, - /// # HeadSupportsParachains, - /// # Overseer, - /// # SubsystemError, - /// # gen::{ - /// # SubsystemContext, - /// # FromOverseer, - /// # SpawnedSubsystem, - /// # }, - /// # }; - /// # use polkadot_node_subsystem_types::messages::{ - /// # CandidateValidationMessage, CandidateBackingMessage, - /// # NetworkBridgeMessage, - /// # }; - /// - /// struct ValidationSubsystem; - /// - /// impl overseer::Subsystem for ValidationSubsystem - /// where - /// Ctx: overseer::SubsystemContext< - /// Message=CandidateValidationMessage, - /// AllMessages=AllMessages, - /// Signal=OverseerSignal, - /// Error=SubsystemError, - /// >, - /// { - /// fn start( - /// self, - /// mut ctx: Ctx, - /// ) -> SpawnedSubsystem { - /// SpawnedSubsystem { - /// name: "validation-subsystem", - /// future: Box::pin(async move { - /// loop { - /// Delay::new(Duration::from_secs(1)).await; - /// } - /// }), - /// } - /// } - /// } - /// - /// # fn main() { executor::block_on(async move { - /// - /// struct AlwaysSupportsParachains; - /// impl HeadSupportsParachains for AlwaysSupportsParachains { - /// fn head_supports_parachains(&self, _head: &Hash) -> bool { true } - /// } - /// let spawner = sp_core::testing::TaskExecutor::new(); - /// let all_subsystems = AllSubsystems::<()>::dummy() - /// .replace_candidate_validation(|_| ValidationSubsystem); - /// let (overseer, _handle) = Overseer::new( - /// vec![], - /// all_subsystems, - /// None, - /// AlwaysSupportsParachains, - /// spawner, - /// ).unwrap(); - /// - /// let timer = Delay::new(Duration::from_millis(50)).fuse(); - /// - /// let overseer_fut = overseer.run().fuse(); - /// pin_mut!(timer); - /// pin_mut!(overseer_fut); - /// - /// select! { - /// _ = overseer_fut => (), - /// _ = timer => (), - /// } - /// # - /// # }); - /// # } - /// ``` - pub fn new< - CV, - CB, - SD, - AD, - AR, - BS, - BD, - P, - RA, - AS, - NB, - CA, - CG, - CP, - ApD, - ApV, - GS, - DC, - DP, - DD, - CS, - >( - leaves: impl IntoIterator, - all_subsystems: AllSubsystems< - CV, - CB, - SD, - AD, - AR, - BS, - BD, - P, - RA, - AS, - NB, - CA, - CG, - CP, - ApD, - ApV, - GS, - DC, - DP, - DD, - CS, - >, - prometheus_registry: Option<&prometheus::Registry>, - supports_parachains: SupportsParachains, - s: S, - ) -> SubsystemResult<(Self, OverseerHandle)> - where - CV: Subsystem, SubsystemError> + Send, - CB: Subsystem, SubsystemError> + Send, - SD: Subsystem, SubsystemError> - + Send, - AD: Subsystem, SubsystemError> - + Send, - AR: Subsystem, SubsystemError> + Send, - BS: Subsystem, SubsystemError> + Send, - BD: Subsystem, SubsystemError> + Send, - P: Subsystem, SubsystemError> + Send, - RA: Subsystem, SubsystemError> + Send, - AS: Subsystem, SubsystemError> + Send, - NB: Subsystem, SubsystemError> + Send, - CA: Subsystem, SubsystemError> + Send, - CG: Subsystem, SubsystemError> + Send, - CP: Subsystem, SubsystemError> + Send, - ApD: - Subsystem, SubsystemError> + Send, - ApV: Subsystem, SubsystemError> + Send, - GS: Subsystem, SubsystemError> + Send, - DC: Subsystem, SubsystemError> + Send, - DP: Subsystem, SubsystemError> + Send, - DD: Subsystem, SubsystemError> + Send, - CS: Subsystem, SubsystemError> + Send, - S: SpawnNamed, - { - let metrics: Metrics = ::register(prometheus_registry)?; - - let (mut overseer, handle) = Self::builder() - .candidate_validation(all_subsystems.candidate_validation) - .candidate_backing(all_subsystems.candidate_backing) - .statement_distribution(all_subsystems.statement_distribution) - .availability_distribution(all_subsystems.availability_distribution) - .availability_recovery(all_subsystems.availability_recovery) - .bitfield_signing(all_subsystems.bitfield_signing) - .bitfield_distribution(all_subsystems.bitfield_distribution) - .provisioner(all_subsystems.provisioner) - .runtime_api(all_subsystems.runtime_api) - .availability_store(all_subsystems.availability_store) - .network_bridge(all_subsystems.network_bridge) - .chain_api(all_subsystems.chain_api) - .collation_generation(all_subsystems.collation_generation) - .collator_protocol(all_subsystems.collator_protocol) - .approval_distribution(all_subsystems.approval_distribution) - .approval_voting(all_subsystems.approval_voting) - .gossip_support(all_subsystems.gossip_support) - .dispute_coordinator(all_subsystems.dispute_coordinator) - .dispute_participation(all_subsystems.dispute_participation) - .dispute_distribution(all_subsystems.dispute_distribution) - .chain_selection(all_subsystems.chain_selection) - .leaves(Vec::from_iter( - leaves - .into_iter() - .map(|BlockInfo { hash, parent_hash: _, number }| (hash, number)), - )) - .known_leaves(LruCache::new(KNOWN_LEAVES_CACHE_SIZE)) - .active_leaves(Default::default()) - .span_per_active_leaf(Default::default()) - .activation_external_listeners(Default::default()) - .supports_parachains(supports_parachains) - .metrics(metrics.clone()) - .spawner(s) - .build()?; - - // spawn the metrics metronome task - { - struct ExtractNameAndMeters; - - impl<'a, T: 'a> MapSubsystem<&'a OverseenSubsystem> for ExtractNameAndMeters { - type Output = Option<(&'static str, SubsystemMeters)>; - - fn map_subsystem(&self, subsystem: &'a OverseenSubsystem) -> Self::Output { - subsystem - .instance - .as_ref() - .map(|instance| (instance.name, instance.meters.clone())) - } - } - let subsystem_meters = overseer.map_subsystems(ExtractNameAndMeters); - - #[cfg(feature = "memory-stats")] - let memory_stats = MemoryAllocationTracker::new().expect("Jemalloc is the default allocator. qed"); - - let metronome_metrics = metrics.clone(); - let metronome = - Metronome::new(std::time::Duration::from_millis(950)).for_each(move |_| { - #[cfg(feature = "memory-stats")] - match memory_stats.snapshot() { - Ok(memory_stats_snapshot) => { - tracing::trace!( - target: LOG_TARGET, - "memory_stats: {:?}", - &memory_stats_snapshot - ); - metronome_metrics.memory_stats_snapshot(memory_stats_snapshot); - }, - - Err(e) => tracing::debug!( - target: LOG_TARGET, - "Failed to obtain memory stats: {:?}", - e - ), - } + struct ExtractNameAndMeters; - // We combine the amount of messages from subsystems to the overseer - // as well as the amount of messages from external sources to the overseer - // into one `to_overseer` value. - metronome_metrics.channel_fill_level_snapshot( - subsystem_meters - .iter() - .cloned() - .filter_map(|x| x) - .map(|(name, ref meters)| (name, meters.read())), - ); + impl<'a, T: 'a> MapSubsystem<&'a OverseenSubsystem> for ExtractNameAndMeters { + type Output = Option<(&'static str, SubsystemMeters)>; - async move { () } - }); - overseer.spawner().spawn("metrics_metronome", Box::pin(metronome)); + fn map_subsystem(&self, subsystem: &'a OverseenSubsystem) -> Self::Output { + subsystem + .instance + .as_ref() + .map(|instance| (instance.name, instance.meters.clone())) } - - Ok((overseer, handle)) } + let subsystem_meters = overseer.map_subsystems(ExtractNameAndMeters); + + let collect_memory_stats: Box = + match MemoryAllocationTracker::new() { + Ok(memory_stats) => + Box::new(move |metrics: &OverseerMetrics| match memory_stats.snapshot() { + Ok(memory_stats_snapshot) => { + tracing::trace!( + target: LOG_TARGET, + "memory_stats: {:?}", + &memory_stats_snapshot + ); + metrics.memory_stats_snapshot(memory_stats_snapshot); + }, + Err(e) => tracing::debug!( + target: LOG_TARGET, + "Failed to obtain memory stats: {:?}", + e + ), + }), + Err(_) => { + tracing::debug!( + target: LOG_TARGET, + "Memory allocation tracking is not supported by the allocator.", + ); + + Box::new(|_| {}) + }, + }; + + let metronome = Metronome::new(std::time::Duration::from_millis(950)).for_each(move |_| { + collect_memory_stats(&metronome_metrics); + + // We combine the amount of messages from subsystems to the overseer + // as well as the amount of messages from external sources to the overseer + // into one `to_overseer` value. + metronome_metrics.channel_fill_level_snapshot( + subsystem_meters + .iter() + .cloned() + .filter_map(|x| x) + .map(|(name, ref meters)| (name, meters.read())), + ); + + futures::future::ready(()) + }); + overseer.spawner().spawn("metrics_metronome", Box::pin(metronome)); + Ok(()) +} +impl Overseer +where + SupportsParachains: HeadSupportsParachains, + S: SpawnNamed, +{ /// Stop the overseer. async fn stop(mut self) { let _ = self.wait_terminate(OverseerSignal::Conclude, Duration::from_secs(1_u64)).await; @@ -748,6 +578,9 @@ where /// Run the `Overseer`. pub async fn run(mut self) -> SubsystemResult<()> { + let metrics = self.metrics.clone(); + spawn_metronome_metrics(&mut self, metrics)?; + // Notify about active leaves on startup before starting the loop for (hash, number) in std::mem::take(&mut self.leaves) { let _ = self.active_leaves.insert(hash, number); @@ -841,7 +674,9 @@ where let mut update = ActiveLeavesUpdate::default(); self.active_leaves.retain(|h, n| { - if *n <= block.number { + // prune all orphaned leaves, but don't prune + // the finalized block if it is itself a leaf. + if *n <= block.number && *h != block.hash { update.deactivated.push(*h); false } else { diff --git a/node/overseer/src/metrics.rs b/node/overseer/src/metrics.rs index e6a1ec4f4086..fa883857e9be 100644 --- a/node/overseer/src/metrics.rs +++ b/node/overseer/src/metrics.rs @@ -17,10 +17,9 @@ //! Prometheus metrics related to the overseer and its channels. use super::*; -use polkadot_node_metrics::metrics::{self, prometheus}; +pub use polkadot_node_metrics::metrics::{self, prometheus, Metrics as MetricsTrait}; -#[cfg(feature = "memory-stats")] -use polkadot_node_metrics::MemoryAllocationSnapshot; +use parity_util_mem::MemoryAllocationSnapshot; /// Overseer Prometheus metrics. #[derive(Clone)] @@ -35,10 +34,7 @@ struct MetricsInner { signals_sent: prometheus::GaugeVec, signals_received: prometheus::GaugeVec, - #[cfg(feature = "memory-stats")] memory_stats_resident: prometheus::Gauge, - - #[cfg(feature = "memory-stats")] memory_stats_allocated: prometheus::Gauge, } @@ -65,13 +61,10 @@ impl Metrics { } } - #[cfg(feature = "memory-stats")] pub(crate) fn memory_stats_snapshot(&self, memory_stats: MemoryAllocationSnapshot) { if let Some(metrics) = &self.0 { - let MemoryAllocationSnapshot { resident, allocated } = memory_stats; - - metrics.memory_stats_allocated.set(allocated); - metrics.memory_stats_resident.set(resident); + metrics.memory_stats_allocated.set(memory_stats.allocated); + metrics.memory_stats_resident.set(memory_stats.resident); } } @@ -117,7 +110,7 @@ impl Metrics { } } -impl metrics::Metrics for Metrics { +impl MetricsTrait for Metrics { fn try_register(registry: &prometheus::Registry) -> Result { let metrics = MetricsInner { activated_heads_total: prometheus::register( @@ -202,7 +195,6 @@ impl metrics::Metrics for Metrics { registry, )?, - #[cfg(feature = "memory-stats")] memory_stats_allocated: prometheus::register( prometheus::Gauge::::new( "memory_allocated", @@ -210,8 +202,6 @@ impl metrics::Metrics for Metrics { )?, registry, )?, - - #[cfg(feature = "memory-stats")] memory_stats_resident: prometheus::register( prometheus::Gauge::::new( "memory_resident", diff --git a/node/overseer/src/subsystems.rs b/node/overseer/src/subsystems.rs deleted file mode 100644 index 648528730d67..000000000000 --- a/node/overseer/src/subsystems.rs +++ /dev/null @@ -1,382 +0,0 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Legacy way of defining subsystems. -//! -//! In the future, everything should be set up using the generated -//! overseer builder pattern instead. - -use crate::{AllMessages, OverseerSignal}; -use polkadot_node_subsystem_types::errors::SubsystemError; -use polkadot_overseer_all_subsystems_gen::AllSubsystemsGen; -use polkadot_overseer_gen::{ - FromOverseer, MapSubsystem, SpawnedSubsystem, Subsystem, SubsystemContext, -}; - -/// A dummy subsystem that implements [`Subsystem`] for all -/// types of messages. Used for tests or as a placeholder. -#[derive(Clone, Copy, Debug)] -pub struct DummySubsystem; - -impl Subsystem for DummySubsystem -where - Context: SubsystemContext< - Signal = OverseerSignal, - Error = SubsystemError, - AllMessages = AllMessages, - >, -{ - fn start(self, mut ctx: Context) -> SpawnedSubsystem { - let future = Box::pin(async move { - loop { - match ctx.recv().await { - Err(_) => return Ok(()), - Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => return Ok(()), - Ok(overseer_msg) => { - tracing::debug!( - target: "dummy-subsystem", - "Discarding a message sent from overseer {:?}", - overseer_msg - ); - continue - }, - } - } - }); - - SpawnedSubsystem { name: "dummy-subsystem", future } - } -} - -/// This struct is passed as an argument to create a new instance of an [`Overseer`]. -/// -/// As any entity that satisfies the interface may act as a [`Subsystem`] this allows -/// mocking in the test code: -/// -/// Each [`Subsystem`] is supposed to implement some interface that is generic over -/// message type that is specific to this [`Subsystem`]. At the moment not all -/// subsystems are implemented and the rest can be mocked with the [`DummySubsystem`]. -#[derive(Debug, Clone, AllSubsystemsGen)] -pub struct AllSubsystems< - CV = (), - CB = (), - SD = (), - AD = (), - AR = (), - BS = (), - BD = (), - P = (), - RA = (), - AS = (), - NB = (), - CA = (), - CG = (), - CP = (), - ApD = (), - ApV = (), - GS = (), - DC = (), - DP = (), - DD = (), - CS = (), -> { - /// A candidate validation subsystem. - pub candidate_validation: CV, - /// A candidate backing subsystem. - pub candidate_backing: CB, - /// A statement distribution subsystem. - pub statement_distribution: SD, - /// An availability distribution subsystem. - pub availability_distribution: AD, - /// An availability recovery subsystem. - pub availability_recovery: AR, - /// A bitfield signing subsystem. - pub bitfield_signing: BS, - /// A bitfield distribution subsystem. - pub bitfield_distribution: BD, - /// A provisioner subsystem. - pub provisioner: P, - /// A runtime API subsystem. - pub runtime_api: RA, - /// An availability store subsystem. - pub availability_store: AS, - /// A network bridge subsystem. - pub network_bridge: NB, - /// A Chain API subsystem. - pub chain_api: CA, - /// A Collation Generation subsystem. - pub collation_generation: CG, - /// A Collator Protocol subsystem. - pub collator_protocol: CP, - /// An Approval Distribution subsystem. - pub approval_distribution: ApD, - /// An Approval Voting subsystem. - pub approval_voting: ApV, - /// A Connection Request Issuer subsystem. - pub gossip_support: GS, - /// A Dispute Coordinator subsystem. - pub dispute_coordinator: DC, - /// A Dispute Participation subsystem. - pub dispute_participation: DP, - /// A Dispute Distribution subsystem. - pub dispute_distribution: DD, - /// A Chain Selection subsystem. - pub chain_selection: CS, -} - -impl - AllSubsystems -{ - /// Create a new instance of [`AllSubsystems`]. - /// - /// Each subsystem is set to [`DummySystem`]. - /// - ///# Note - /// - /// Because of a bug in rustc it is required that when calling this function, - /// you provide a "random" type for the first generic parameter: - /// - /// ``` - /// polkadot_overseer::AllSubsystems::<()>::dummy(); - /// ``` - pub fn dummy() -> AllSubsystems< - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - DummySubsystem, - > { - AllSubsystems { - candidate_validation: DummySubsystem, - candidate_backing: DummySubsystem, - statement_distribution: DummySubsystem, - availability_distribution: DummySubsystem, - availability_recovery: DummySubsystem, - bitfield_signing: DummySubsystem, - bitfield_distribution: DummySubsystem, - provisioner: DummySubsystem, - runtime_api: DummySubsystem, - availability_store: DummySubsystem, - network_bridge: DummySubsystem, - chain_api: DummySubsystem, - collation_generation: DummySubsystem, - collator_protocol: DummySubsystem, - approval_distribution: DummySubsystem, - approval_voting: DummySubsystem, - gossip_support: DummySubsystem, - dispute_coordinator: DummySubsystem, - dispute_participation: DummySubsystem, - dispute_distribution: DummySubsystem, - chain_selection: DummySubsystem, - } - } - - /// Reference every individual subsystem. - pub fn as_ref( - &self, - ) -> AllSubsystems< - &'_ CV, - &'_ CB, - &'_ SD, - &'_ AD, - &'_ AR, - &'_ BS, - &'_ BD, - &'_ P, - &'_ RA, - &'_ AS, - &'_ NB, - &'_ CA, - &'_ CG, - &'_ CP, - &'_ ApD, - &'_ ApV, - &'_ GS, - &'_ DC, - &'_ DP, - &'_ DD, - &'_ CS, - > { - AllSubsystems { - candidate_validation: &self.candidate_validation, - candidate_backing: &self.candidate_backing, - statement_distribution: &self.statement_distribution, - availability_distribution: &self.availability_distribution, - availability_recovery: &self.availability_recovery, - bitfield_signing: &self.bitfield_signing, - bitfield_distribution: &self.bitfield_distribution, - provisioner: &self.provisioner, - runtime_api: &self.runtime_api, - availability_store: &self.availability_store, - network_bridge: &self.network_bridge, - chain_api: &self.chain_api, - collation_generation: &self.collation_generation, - collator_protocol: &self.collator_protocol, - approval_distribution: &self.approval_distribution, - approval_voting: &self.approval_voting, - gossip_support: &self.gossip_support, - dispute_coordinator: &self.dispute_coordinator, - dispute_participation: &self.dispute_participation, - dispute_distribution: &self.dispute_distribution, - chain_selection: &self.chain_selection, - } - } - - /// Map each subsystem. - pub fn map_subsystems( - self, - mapper: Mapper, - ) -> AllSubsystems< - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - >::Output, - > - where - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem

, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem, - Mapper: MapSubsystem

, - Mapper: MapSubsystem, - { - AllSubsystems { - candidate_validation: >::map_subsystem( - &mapper, - self.candidate_validation, - ), - candidate_backing: >::map_subsystem( - &mapper, - self.candidate_backing, - ), - statement_distribution: >::map_subsystem( - &mapper, - self.statement_distribution, - ), - availability_distribution: >::map_subsystem( - &mapper, - self.availability_distribution, - ), - availability_recovery: >::map_subsystem( - &mapper, - self.availability_recovery, - ), - bitfield_signing: >::map_subsystem( - &mapper, - self.bitfield_signing, - ), - bitfield_distribution: >::map_subsystem( - &mapper, - self.bitfield_distribution, - ), - provisioner: >::map_subsystem(&mapper, self.provisioner), - runtime_api: >::map_subsystem(&mapper, self.runtime_api), - availability_store: >::map_subsystem( - &mapper, - self.availability_store, - ), - network_bridge: >::map_subsystem( - &mapper, - self.network_bridge, - ), - chain_api: >::map_subsystem(&mapper, self.chain_api), - collation_generation: >::map_subsystem( - &mapper, - self.collation_generation, - ), - collator_protocol: >::map_subsystem( - &mapper, - self.collator_protocol, - ), - approval_distribution: >::map_subsystem( - &mapper, - self.approval_distribution, - ), - approval_voting: >::map_subsystem( - &mapper, - self.approval_voting, - ), - gossip_support: >::map_subsystem( - &mapper, - self.gossip_support, - ), - dispute_coordinator: >::map_subsystem( - &mapper, - self.dispute_coordinator, - ), - dispute_participation: >::map_subsystem( - &mapper, - self.dispute_participation, - ), - dispute_distribution: >::map_subsystem( - &mapper, - self.dispute_distribution, - ), - chain_selection: >::map_subsystem( - &mapper, - self.chain_selection, - ), - } - } -} diff --git a/node/overseer/src/tests.rs b/node/overseer/src/tests.rs index 7564116e7141..7fe1ed701a83 100644 --- a/node/overseer/src/tests.rs +++ b/node/overseer/src/tests.rs @@ -32,7 +32,12 @@ use polkadot_primitives::v1::{ ValidatorIndex, }; -use crate::{self as overseer, gen::Delay, HeadSupportsParachains, Overseer}; +use crate::{ + self as overseer, + dummy::{dummy_overseer_builder, one_for_all_overseer_builder}, + gen::Delay, + HeadSupportsParachains, +}; use metered_channel as metered; use assert_matches::assert_matches; @@ -40,6 +45,15 @@ use sp_core::crypto::Pair as _; use super::*; +fn block_info_to_pair(blocks: impl IntoIterator) -> Vec<(Hash, BlockNumber)> { + use std::iter::FromIterator; + Vec::from_iter( + blocks + .into_iter() + .map(|BlockInfo { hash, parent_hash: _, number }| (hash, number)), + ) +} + type SpawnedSubsystem = crate::gen::SpawnedSubsystem; struct TestSubsystem1(metered::MeteredSender); @@ -98,6 +112,7 @@ where ctx.send_message(CandidateValidationMessage::ValidateFromChainState( Default::default(), PoV { block_data: BlockData(Vec::new()) }.into(), + Default::default(), tx, )) .await; @@ -159,14 +174,13 @@ fn overseer_works() { let mut s1_rx = s1_rx.fuse(); let mut s2_rx = s2_rx.fuse(); - - let all_subsystems = AllSubsystems::<()>::dummy() + let (overseer, handle) = dummy_overseer_builder(spawner, MockSupportsParachains, None) + .unwrap() .replace_candidate_validation(move |_| TestSubsystem1(s1_tx)) - .replace_candidate_backing(move |_| TestSubsystem2(s2_tx)); - - let (overseer, handle) = - Overseer::new(vec![], all_subsystems, None, MockSupportsParachains, spawner).unwrap(); - let mut handle = Handle::Connected(handle); + .replace_candidate_backing(move |_| TestSubsystem2(s2_tx)) + .build() + .unwrap(); + let mut handle = Handle::new(handle); let overseer_fut = overseer.run().fuse(); pin_mut!(overseer_fut); @@ -219,17 +233,15 @@ fn overseer_metrics_work() { let third_block = BlockInfo { hash: third_block_hash, parent_hash: second_block_hash, number: 3 }; - let all_subsystems = AllSubsystems::<()>::dummy(); let registry = prometheus::Registry::new(); - let (overseer, handle) = Overseer::new( - vec![first_block], - all_subsystems, - Some(®istry), - MockSupportsParachains, - spawner, - ) - .unwrap(); - let mut handle = Handle::Connected(handle); + let (overseer, handle) = + dummy_overseer_builder(spawner, MockSupportsParachains, Some(®istry)) + .unwrap() + .leaves(block_info_to_pair(vec![first_block])) + .build() + .unwrap(); + + let mut handle = Handle::new(handle); let overseer_fut = overseer.run().fuse(); pin_mut!(overseer_fut); @@ -256,13 +268,20 @@ fn overseer_metrics_work() { fn extract_metrics(registry: &prometheus::Registry) -> HashMap<&'static str, u64> { let gather = registry.gather(); - let gather = &gather[2..]; - assert_eq!(gather[0].get_name(), "parachain_activated_heads_total"); - assert_eq!(gather[1].get_name(), "parachain_deactivated_heads_total"); - assert_eq!(gather[2].get_name(), "parachain_messages_relayed_total"); - let activated = gather[0].get_metric()[0].get_counter().get_value() as u64; - let deactivated = gather[1].get_metric()[0].get_counter().get_value() as u64; - let relayed = gather[2].get_metric()[0].get_counter().get_value() as u64; + assert!(!gather.is_empty(), "Gathered metrics are not empty. qed"); + let extract = |name: &str| -> u64 { + gather + .iter() + .find(|&mf| dbg!(mf.get_name()) == dbg!(name)) + .expect(&format!("Must contain `{}` metric", name)) + .get_metric()[0] + .get_counter() + .get_value() as u64 + }; + + let activated = extract("parachain_activated_heads_total"); + let deactivated = extract("parachain_deactivated_heads_total"); + let relayed = extract("parachain_messages_relayed_total"); let mut result = HashMap::new(); result.insert("activated", activated); result.insert("deactivated", deactivated); @@ -278,10 +297,11 @@ fn overseer_ends_on_subsystem_exit() { let spawner = sp_core::testing::TaskExecutor::new(); executor::block_on(async move { - let all_subsystems = - AllSubsystems::<()>::dummy().replace_candidate_backing(|_| ReturnOnStart); - let (overseer, _handle) = - Overseer::new(vec![], all_subsystems, None, MockSupportsParachains, spawner).unwrap(); + let (overseer, _handle) = dummy_overseer_builder(spawner, MockSupportsParachains, None) + .unwrap() + .replace_candidate_backing(|_| ReturnOnStart) + .build() + .unwrap(); overseer.run().await.unwrap(); }) @@ -379,13 +399,15 @@ fn overseer_start_stop_works() { let (tx_5, mut rx_5) = metered::channel(64); let (tx_6, mut rx_6) = metered::channel(64); - let all_subsystems = AllSubsystems::<()>::dummy() + + let (overseer, handle) = dummy_overseer_builder(spawner, MockSupportsParachains, None) + .unwrap() .replace_candidate_validation(move |_| TestSubsystem5(tx_5)) - .replace_candidate_backing(move |_| TestSubsystem6(tx_6)); - let (overseer, handle) = - Overseer::new(vec![first_block], all_subsystems, None, MockSupportsParachains, spawner) - .unwrap(); - let mut handle = Handle::Connected(handle); + .replace_candidate_backing(move |_| TestSubsystem6(tx_6)) + .leaves(block_info_to_pair(vec![first_block])) + .build() + .unwrap(); + let mut handle = Handle::new(handle); let overseer_fut = overseer.run().fuse(); pin_mut!(overseer_fut); @@ -475,20 +497,16 @@ fn overseer_finalize_works() { let (tx_5, mut rx_5) = metered::channel(64); let (tx_6, mut rx_6) = metered::channel(64); - let all_subsystems = AllSubsystems::<()>::dummy() - .replace_candidate_validation(move |_| TestSubsystem5(tx_5)) - .replace_candidate_backing(move |_| TestSubsystem6(tx_6)); - // start with two forks of different height. - let (overseer, handle) = Overseer::new( - vec![first_block, second_block], - all_subsystems, - None, - MockSupportsParachains, - spawner, - ) - .unwrap(); - let mut handle = Handle::Connected(handle); + + let (overseer, handle) = dummy_overseer_builder(spawner, MockSupportsParachains, None) + .unwrap() + .replace_candidate_validation(move |_| TestSubsystem5(tx_5)) + .replace_candidate_backing(move |_| TestSubsystem6(tx_6)) + .leaves(block_info_to_pair(vec![first_block, second_block])) + .build() + .unwrap(); + let mut handle = Handle::new(handle); let overseer_fut = overseer.run().fuse(); pin_mut!(overseer_fut); @@ -557,6 +575,103 @@ fn overseer_finalize_works() { }); } +// Tests that finalization of an active leaf doesn't remove it from +// the leaves set. +#[test] +fn overseer_finalize_leaf_preserves_it() { + let spawner = sp_core::testing::TaskExecutor::new(); + + executor::block_on(async move { + let first_block_hash = [1; 32].into(); + let second_block_hash = [2; 32].into(); + + let first_block = + BlockInfo { hash: first_block_hash, parent_hash: [0; 32].into(), number: 1 }; + let second_block = + BlockInfo { hash: second_block_hash, parent_hash: [42; 32].into(), number: 1 }; + + let (tx_5, mut rx_5) = metered::channel(64); + let (tx_6, mut rx_6) = metered::channel(64); + + // start with two forks at height 1. + + let (overseer, handle) = dummy_overseer_builder(spawner, MockSupportsParachains, None) + .unwrap() + .replace_candidate_validation(move |_| TestSubsystem5(tx_5)) + .replace_candidate_backing(move |_| TestSubsystem6(tx_6)) + .leaves(block_info_to_pair(vec![first_block.clone(), second_block])) + .build() + .unwrap(); + let mut handle = Handle::new(handle); + + let overseer_fut = overseer.run().fuse(); + pin_mut!(overseer_fut); + + let mut ss5_results = Vec::new(); + let mut ss6_results = Vec::new(); + + // This should stop work on the second block, but only the + // second block. + handle.block_finalized(first_block).await; + + let expected_heartbeats = vec![ + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(ActivatedLeaf { + hash: first_block_hash, + number: 1, + span: Arc::new(jaeger::Span::Disabled), + status: LeafStatus::Fresh, + })), + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(ActivatedLeaf { + hash: second_block_hash, + number: 1, + span: Arc::new(jaeger::Span::Disabled), + status: LeafStatus::Fresh, + })), + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + deactivated: [second_block_hash].as_ref().into(), + ..Default::default() + }), + OverseerSignal::BlockFinalized(first_block_hash, 1), + ]; + + loop { + select! { + res = overseer_fut => { + assert!(res.is_ok()); + break; + }, + res = rx_5.next() => { + if let Some(res) = res { + ss5_results.push(res); + } + } + res = rx_6.next() => { + if let Some(res) = res { + ss6_results.push(res); + } + } + complete => break, + } + + if ss5_results.len() == expected_heartbeats.len() && + ss6_results.len() == expected_heartbeats.len() + { + handle.stop().await; + } + } + + assert_eq!(ss5_results.len(), expected_heartbeats.len()); + assert_eq!(ss6_results.len(), expected_heartbeats.len()); + + // Notifications on finality for multiple blocks at once + // may be received in different orders. + for expected in expected_heartbeats { + assert!(ss5_results.contains(&expected)); + assert!(ss6_results.contains(&expected)); + } + }); +} + #[test] fn do_not_send_empty_leaves_update_on_block_finalization() { let spawner = sp_core::testing::TaskExecutor::new(); @@ -570,13 +685,13 @@ fn do_not_send_empty_leaves_update_on_block_finalization() { let (tx_5, mut rx_5) = metered::channel(64); - let all_subsystems = - AllSubsystems::<()>::dummy().replace_candidate_backing(move |_| TestSubsystem6(tx_5)); + let (overseer, handle) = dummy_overseer_builder(spawner, MockSupportsParachains, None) + .unwrap() + .replace_candidate_backing(move |_| TestSubsystem6(tx_5)) + .build() + .unwrap(); - let (overseer, handle) = - Overseer::new(Vec::new(), all_subsystems, None, MockSupportsParachains, spawner) - .unwrap(); - let mut handle = Handle::Connected(handle); + let mut handle = Handle::new(handle); let overseer_fut = overseer.run().fuse(); pin_mut!(overseer_fut); @@ -677,7 +792,12 @@ where fn test_candidate_validation_msg() -> CandidateValidationMessage { let (sender, _) = oneshot::channel(); let pov = Arc::new(PoV { block_data: BlockData(Vec::new()) }); - CandidateValidationMessage::ValidateFromChainState(Default::default(), pov, sender) + CandidateValidationMessage::ValidateFromChainState( + Default::default(), + pov, + Default::default(), + sender, + ) } fn test_candidate_backing_msg() -> CandidateBackingMessage { @@ -826,32 +946,13 @@ fn overseer_all_subsystems_receive_signals_and_messages() { msgs_received.clone(), ); - let all_subsystems = AllSubsystems { - candidate_validation: subsystem.clone(), - candidate_backing: subsystem.clone(), - collation_generation: subsystem.clone(), - collator_protocol: subsystem.clone(), - statement_distribution: subsystem.clone(), - availability_distribution: subsystem.clone(), - availability_recovery: subsystem.clone(), - bitfield_signing: subsystem.clone(), - bitfield_distribution: subsystem.clone(), - provisioner: subsystem.clone(), - runtime_api: subsystem.clone(), - availability_store: subsystem.clone(), - network_bridge: subsystem.clone(), - chain_api: subsystem.clone(), - approval_distribution: subsystem.clone(), - approval_voting: subsystem.clone(), - gossip_support: subsystem.clone(), - dispute_coordinator: subsystem.clone(), - dispute_participation: subsystem.clone(), - dispute_distribution: subsystem.clone(), - chain_selection: subsystem.clone(), - }; let (overseer, handle) = - Overseer::new(vec![], all_subsystems, None, MockSupportsParachains, spawner).unwrap(); - let mut handle = Handle::Connected(handle); + one_for_all_overseer_builder(spawner, MockSupportsParachains, subsystem, None) + .unwrap() + .build() + .unwrap(); + + let mut handle = Handle::new(handle); let overseer_fut = overseer.run().fuse(); pin_mut!(overseer_fut); diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index d8b15b808005..4a6d9abb6880 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-node-primitives" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" description = "Primitives types for the Node-side" @@ -9,7 +9,7 @@ description = "Primitives types for the Node-side" bounded-vec = "0.4" futures = "0.3.17" polkadot-primitives = { path = "../../primitives" } -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-consensus-vrf = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -22,7 +22,7 @@ thiserror = "1.0.26" serde = { version = "1.0.130", features = ["derive"] } [target.'cfg(not(target_os = "unknown"))'.dependencies] -zstd = "0.6.0" +zstd = "0.9.0" [dev-dependencies] polkadot-erasure-coding = { path = "../../erasure-coding" } diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index c2c300fca74b..adc8846f4298 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -22,7 +22,7 @@ #![deny(missing_docs)] -use std::{convert::TryFrom, pin::Pin}; +use std::{convert::TryFrom, pin::Pin, time::Duration}; use bounded_vec::BoundedVec; use futures::Future; @@ -71,6 +71,17 @@ pub const POV_BOMB_LIMIT: usize = (MAX_POV_SIZE * 4u32) as usize; /// Number of sessions we want to consider in disputes. pub const DISPUTE_WINDOW: SessionIndex = 6; +/// The amount of time to spend on execution during backing. +pub const BACKING_EXECUTION_TIMEOUT: Duration = Duration::from_secs(2); + +/// The amount of time to spend on execution during approval or disputes. +/// +/// This is deliberately much longer than the backing execution timeout to +/// ensure that in the absence of extremely large disparities between hardware, +/// blocks that pass backing are considerd executable by approval checkers or +/// dispute participants. +pub const APPROVAL_EXECUTION_TIMEOUT: Duration = Duration::from_secs(6); + /// The cumulative weight of a block in a fork-choice rule. pub type BlockWeight = u32; @@ -223,7 +234,7 @@ pub struct Collation { pub hrmp_watermark: BlockNumber, } -/// Signal that is being returned back when a collation was seconded by a validator. +/// Signal that is being returned when a collation was seconded by a validator. #[derive(Debug)] pub struct CollationSecondedSignal { /// The hash of the relay chain block that was used as context to sign [`Self::statement`]. diff --git a/node/service/res/rococo.json b/node/service/res/rococo.json index 1589828bfd0d..b12bed1b3fee 100644 --- a/node/service/res/rococo.json +++ b/node/service/res/rococo.json @@ -1,6 +1,6 @@ { "name": "Rococo", - "id": "rococo_v1_7", + "id": "rococo_v1_12", "chainType": "Live", "bootNodes": [ "/ip4/34.90.151.124/tcp/30333/p2p/12D3KooWF7BUbG5ErMZ47ZdarRwtpZamgcZqxwpnFzkhjc1spHnP", @@ -32,161 +32,163 @@ "genesis": { "raw": { "top": { - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195097e3e605d1b3579b6173676e804c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", - "0x08c41974a97dbf15cfbec28365bea2da8f05bccc2f70ec66a32999c5761156be": "0x0000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a068f246c1094c1462656566840307d29bbf6a5c4061c2157b44fda33b7bb4ec52a5a0305668c74688cedf288d58": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f8df002813b43b80696d6f6e80560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", - "0x1cb6f36e027abb2091cfb5110ab5087faacf00b9b41fda7a9268821c2a2b3e4c": "0x20a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35010000000000000038757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f0100000000000000d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a0100000000000000764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe2101000000000000007c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd808130100000000000000bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b0100000000000000720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed783720100000000000000da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa83490100000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x2062475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfaa076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed3586975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef7430e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477bf49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d62276520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022afcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee81668bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80df6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f34903a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6fe1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2aee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037244f3421b310c68646e99cdbf4963e02067601f57756b072a4b19431448c186e2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a5338f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a040436be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe218e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b821271c99c958b9220f1771d9f5e29af969edfa865631dba31e1ab7bc0582b752496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c0307d29bbf6a5c4061c2157b44fda33b7bb4ec52a5a0305668c74688cedf288d5802a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b166c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c817c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac0116c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb53102fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a602ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5bc4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff351efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c4c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a004bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11ffab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df036858062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab474ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dccda6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa834992156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986", - "0x2b06af9719ac64d755623cda8ddd9b944e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950438ac98f6d864839696d6f6e80d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", - "0xf9922c78cfa3c316d27a3eb48145ab1b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x1cb6f36e027abb2091cfb5110ab5087fdc6b171b77304263c292cc3ea5ed31ef": "0x0100000000000000040000000000000002", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195012fefbc5e5cee2846173676e80fab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502e5e3ed1cdc323ab626565668402fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a6": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0x196e027349017067f9eb56e2c4d9ded54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a31727416d0095b96772616e80e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950417ebe2c60c84ed5626565668403a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195068dec3fce5ade0966261626580da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa8349": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99677d775b618280f5c76d192b43ea38c38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404": "0x0000000001000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509df5f4072c4244956261626580764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe21": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", - "0x06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385": "0x000030000080000008000000000010000000100005000000050000000100000001000000000050000004000000286bee0000000004000000040000000500000000000000000000000000000000000000000000000000000000000000000000000800000000200000040000000400000000001000b00400000000000000000000140000000400000004000000000000000000060000006400000002000000c80000000200000019000000000000000200000002000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501e69501baac264d4696d6f6e80ee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", - "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x20f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3cf6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f3492c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503c0791148c7780b8626162658038757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503d7dc9205a149f6a6175646980306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0x6a0da05ca59913bc38a8630590f2627c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xda7d4185f8093e80caceb64da45219e34e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x2062475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a040402a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b1602ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a008062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0x94eadf0156a8ad5156507773d0471e4a64fb6e378f53d72f7859ad0e6b6d8810": "0x0000000000", + "0x08c41974a97dbf15cfbec28365bea2da5e0621c4869aa60c02be9adcc98a0d1d": "0x20034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d6227603a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a530307d29bbf6a5c4061c2157b44fda33b7bb4ec52a5a0305668c74688cedf288d5802fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a6020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df03685025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d46d2cb2a4d496b46265656684025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0x2ce461329fdf4be12bce01afc0af09bcba7fb8745735dc3be2a2c61a72c39e78": "0x00", + "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507d9c46786caf74af6261626580d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xa8c65209d47ee80f56b0011e8fd91f504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502d2937d2d9650f057061726180a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x2062475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfaa076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed3586975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef7430e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477bf49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d62276520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022afcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee81668bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80df6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f34903a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6fe1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2aee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037244f3421b310c68646e99cdbf4963e02067601f57756b072a4b19431448c186e2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a5338f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a040436be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe218e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b821271c99c958b9220f1771d9f5e29af969edfa865631dba31e1ab7bc0582b752496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c0307d29bbf6a5c4061c2157b44fda33b7bb4ec52a5a0305668c74688cedf288d5802a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b166c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c817c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac0116c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb53102fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a602ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5bc4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff351efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c4c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a004bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11ffab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df036858062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab474ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dccda6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa834992156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986", + "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xb341e3a63e58a188839b242d17f8c9f8b5cab3380174032968897a4c3ce57c0a": "0x00000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90d10cc4959af6a68eba3bc06d5c7bc28520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a": "0x0000000001000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xca32a41f4b3ed515863dc0a38697f84e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x084e7f70a295a190e2e33fd3f8cdfcc24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a606acaa4558183a2102457959a213a192ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f": "0x0000000001000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195009ab51029a10e53570617261800e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00585412054e70c6df1452107855451d2c1faef2e43d4ad62a64112859ab007fbc8b2398f2e43d4a4ea7483e81d699ff7d9ee5b72500cd4c52417c97f038051c0041c5752de7772731a22897e7c507033592ae257befbdf7de52ca2453ca1471151f15b614fb46693f466e2570a103f965563e8ca8dd96d769912f8ddf9cde837f7f057edf8326cd327ef3619ecfbfa7cbf4c5eff3a739da7dbfd8f42b05bf3f93a7a76b32882330fed43cfd07f04f4a4d10cbf8cd75dc19f44cffc606f810b22deb59e4fb02f09b73254403fce64ce57b73768d007ee3f9be4d2cdfb7e138b5d557d8ae65543e6db2cafbfa6ec726757cefa6f79ff9833ff896fc81667fcf3c7fb20174dc41f3a499be933fd0f7775287ff7b01fce9531e95878779d0f716bff1febee8999d537e73bf44dd9cf29ba6c136d0dfdf1745f03df37bd03cbdefbcffccf3277fa6f7edafdc9942e8776e72873391e9e7375e735f4ddcd17d57bff3dedffbef6fadd7abdf775dfdbcf73aebf887857c7f5fac6310178f2f36e9795febe7ffe9b02f5253559f7e7d3755f5fdbd172929001dfa940cc2dffbfa83dfef7b3af0453a5ef079ea77ff99b9ae7bb003cdfb5df7bd58cd9e2ed7fbf5a4b97eb89ba6fe70bf76f8fcc9dd7be6595fc8f7de8b95677c9e9e2e8be0f78c397c71ace33882f5eb7d91e232f862f87d354fcfdfdf0fef57d0fc2607f09341dc4df39d347fefe40ff73f5c5fa77a5dffe94f5f24f953ef32a4df0a3450b32fda94af7293deb4547e8ae6a64fe91062f822e98adfdf1fb8e3be8fa179bf4920c2bf3a1e821e05ff7befa967413134c124349f3409cde08bded4ebe848cdaa1f6afefec3345f13c4a1d95924d12c36a9a369a9f4d5f736197c277584f8fc01cd9429c4fbeffd3b07cda2f95dd36ffdc626f7df231f0fefbf91942211d07d7f68d2fcf9aabb8f91c50fc4e74f063f343ff30482bef2114afb5ea786267dd0f4cfec7c5fc7ed77f808cd17ff78d4a641fc59c283d70cd220451c3cc0855693a5afe8eb509e4fc74c7164faf473fce666faef37ad84191599be8ce3d016b5f1f45b8662214dab5fcd039442eacfe433d3176f778ed326df9f0180f95efb67c5a74fae7f8204682ee48b9dd8ff36ed5f730132a6308427adfe6a9eae5ccfee87fc3c91bd3f7df2fdee1dba659c4d038a43eea1d9c3443a8b7ca43e79923becc4d5eff373835ccbe2d7e9ca179ff54f30fbebd46acee46ff201cd8458ab67b2577f8228f6f85359ba96697db19a98561745d00c5f34cff185802fbe28f678df7bfba29b358ba5b9a469a768aa76d8d72b936f73cd4dbe9b9ec9d771f74cd2bbd959b470b063692e5162a47c2524d7cf589a4bca26fdf45eb523cc1e3e42ca498eb4e41ecf8e9d944ffa9e42b6c962e786f746cfec34641b253e3ef0e4c99327adf2c5db35f57abbd111fa243b817dab7cef4bdd8e464fb367361623d35fa78aad80b269b25b16df7b12cdf4be10efc5b72f8ae237a94324c08f107237cde90541df7bef75bcc91dde8b24937c51a4a39b3597e692b6bd5eaf572b0a245e4ee2b9081e4a3ea024bf490794e4ebb848c91f1a8b4cbe68c990c53b92cc3e4316dddaae957630a3d302997c92d95b64373d8ba139be58474a02d154bc5e99c43cfe3c473af77ae51e53ae2f86e688dd431f4733fc31371a3de9455277cdf8a179d23c86e6f7249e9e2ed71f7d9341505c767c843ea9e61198ec2f8ecc233e64da35e18fe6e9397c918ea3f9fd0888efc7d771d23c429f08a0b3e36e9a70344f9ac3d7a93a2e9a9d43b3df333b8366ff679ef49b3ed9b4d4e1d257385b9cf215cd3ef487f4ef0722014afa9fafba51c4fe96399b96ebdbce71bf5fbc367c5557b045b6a15f71beafbfaa38e0d76fe9be3e8ecef15dd37d7dd02c9dd5fd677eceeabef49b5325d794b33aef2b6d0558e4d346aeafd23968aed76c5a1a9fbe932afb347b56d96f9a4c04b9692b98c23569ee7c4d9a29a9a37bcf4d93399153beeade496bb387db571da6d99ad657dd353efe73ddc92002d1b965809ea0b9abf88013b093fd34374d46829cf21579c4e6ee9ac647e8930c760dcdb59f9a34b779843ec9f429a9a3626b7e5de3cf3280b269404de473cc23d8393afbfb7f9d23cc4d037ae594afbc54863ad242fbea6cc9f453b9694b929053bea22fd2b6d5e91db5d30a1345b1c97abf7bf19a9fafba4920ee2fc01f9f3fb9be4fabd6261b60dfb1eba7e5aaefadea99d674fdb4eaeb78571cffb3a766ef3bdcbebaf8a4d9fb1fca7e516c7208fa16bb7c5a4ca238e243ee9eb6ae79bf33cf9aefbb695fa75e6f3539446dd1d7f1f61b1e590cf9aa737f353bb7e374cbcd6efd541ffa437da8f52768ad5f4d9a292992da6f3a9f5fee7e3be228edada48e7ac76afa8b96bc5507fd262d6e5f5552009de9ebf88f538a047f914493d4ecbea23fd00c4479969952fa28bfa11fa5dfa4f7d49e9a7fa87f843e79f2e489cdf56dae58c5a3befdfa16f7d0ecefe40eff8a4f0a84534b69164b5eb0a40925444a6c4a9c784307512ae10856647f3b45f6ffc6d2866880927efb8dfe16c56e954dcbc00bde6ffcfd577ee3ee1968227b6db9bb1711e953f381889dfdc5f61b4bffac7f454aeae85eacddedba7bbbeebfdc756fbfbb4fc53a5e6b9ef42b7d21f5623b76e7a07fd6b7fff9cd49731da9e9999693746425ef45f9cacbeb7f53da3fcbec2fbebf8cdfd4f71fbf5afb5fb658c5c3fe7dfb17f7d05cdf923bea5b7cd25c5ff48a3fb18ed4b499cce524269268476ad64c26e9465c4e328e3a070f7de5233e64fafe4d06615f94dc51be32fdd16f3afb37b983be32fd6e9beb44ecdc32e777fef469944deaf05ef4b1fdc6fbd3666cbfc91f686e5fd5d771cf6c5fdd946799eb7b5f5f2cfda67dd5f6f3f9e5b32cfda6ad67aa787cd9fb2f7b58c5a37befbbf7700fcdf69bdc71bfc3d6ecccd3ff7e933bfc855c6c316e5ff5a59e01b15ba57d1bbf393f1c7e73962bbf396df2fdfb36fcc6e6ab04212df2fd16c7f1d6fdf69b9acf9c7cfdefa3fca6fefdfba3dfd0bfdf32170b699a8fd8adf2fde6b42bbfa97f7eae5f5fc66f3c571a1014b9fee838dea2f17cb6e4fa4de910f17ecb9c36b9be784d9a453a5eb3b34849ebab7bed77ff6401ec7bafe3a2e8abf3cb7dcdf3cbf7db3cef68cdef9b747cfe646f5aeac6e77dfb3ad5cdefafd9995ab3fcee5f9428d6b1491d32beaa4fff7d55bf4dfa6e9e36f75ff3fc7c5faca335c16ff2c3e74ffe5ec72bd9b4747e2bc7674fcdedabfbe1a7fcc67efd164b293ee9874fc732df2f517ee35f5fa426cd62fb4a7c4a0241b3f595884ff1c3a76667d1eca9d95fa4deb48e6efbea4ce5fb5fc569f2ad76d669f3fdee9ab325dfafaf533f13fcd02ccdf3cbdd3bd95d1a7d45dffaaafb7e4aea00b18a87f7df7fb87d758ed9dfebcc26755cfcf9cabf4cf94de7fad6ecfc5fc5b1afd7ebf56ad55f758e4aff94b1c91df303d26b85d83965d39808ca4d6302562337ed7545169b4629b68d52ec1dcaa6bda0c89d3b8ba496393ffb573247497b4d914f9bfd3ffadfd715a79d759699fe59e6f3cbfdfed66feef7b7dfd8effffca673bf58491d16e394de5fd37b918edeebb89304f8c9de8b94dcd1bd87cfeebb179dd4d1be6a92072977afe3d6a4f99a9d9dd4615fa4a36776df64fbea4465516cf2e233897cdf33cf2f7bdf9967f7ed2bef756a6776f6ccd3e6fa221d3bb3739317f7d4ec2bfa2de31d759ca8922afbbb13db6fea9f5fee6f6a76b67ee3df2f56b3b39b348b5e4d9aaddfd0ef177dac267d1147599f45fc4169bfbe3f2575f84849c738257dd1923ae853d262eb2b7ff18e94a4df64c5ed2b7f1dd771918ed4a4b9490374a6afe33a5ecdce3f4ea90cc46e95fef5db6fce54ae5f3fe537fdf55bfc867e7deb38b455bff49b56c211acc8f5db6f3a9fa85cbf652a16f2b9637e280542ec1b65d35eaf5ccaad8429a6c85d12bbc3349438b71264e0247bb995200359a6b955c4b629fb8a5da3ec2bf68cb2af18a31ca0228a50d481288568029103a290e8449481081355200689291033206e406c42fc80d801d1091105e209c427c41188313106a2121106e1139109d103e22b8c43f886d00d612e3c03057e744c742f6f03601a3e138050884dbe2ac257c8c40dc357024f76b5e836003201bd6041604f005201ac82250108857b0310e6357171106e20ec42b824f4025883ef045e0642251e0b401b7c24006100c60074020a8132f009d0089e16bc5bd781cf0ddf1bc01918857da26be2e6c0e3829559187c4af88ef021c1a2c06ec07ac0db428802cb81cf03df076c13b604de1abc220b036bdf0e3c1c801af8bc6083bc257846f08ef07d21e4806562a3b01ae838e075c0cbc2e3804d8175d29da043819d810d819703900a700b1009370ef70db70d570d370dd70d170d170e3777c910c2c1426173609db038b02eb036b846b847b8b59b845bc55582ed8055816d623f6065605b606fe075e14ae14961814233dc147c4bae0a3c24804fc038804dc02378540099f8b8f065f175c15bd299a0234157822e08fc02f8041a043a217441788230283441d824cc00f806100e1e13af89a701f00a70045e16c00c7cb9cf0cdf193c367c4cbc1b78567849f0aaf09460a5b84f5c13dc135c14801b005f00b2006c01e8029009e00d8c022805700a5707d70a170bcf091fd1a7866f0d5f11b5c1adc28dc217fb40005a4167a015402cee152c12ee0aae0c5c028805300b5e90e7018f045e09c0208028008340138027f080a813dd135d0abc29d0127845f0a8a024f03ee0097923f044e039f175e06be293c167848f085f113e2a3e279f92eff531f165c083812b005300aae08b81a7066f0b2f0df7c9a5e20ee112e116c16b6e04a7c28be044f02138cd85e041a02e08db403b409ba01c10720631a2881d21781cf1a1071ec417845b10f1b5e16343a8812f09f70c9e14680c280ebc1ed025540620083e327c5a7c612862cf4047b0c3b6c1167559e8b0e8843a18742da02db863a035b862e864dd0aee0ec02c6e0f2ccd6e419d7851d826582a742ef8b2e04f680ee80c8cf868000342342ca0472e40d5804873d3fb06d0eb0e921f14e861e4c78e113d7a88b4124164a7478fb0e9ce100afce8218244057af400d9e109420491203d7aac8459349221417ef4ec10d16367a702332117ba48058804e9a104cf0e12477a0431927b88ec1ca1c40f213edc42ef00215284488f1f40881431400f11248a0001925d425c2341b233c425bcc229b4c211054009abd03d3b482ab0b3d34a09a9404411203b44c0845168244aec0841a2c40e8f0498e115418c64259004098012d90ca170237c824ce8844e62878829b47513da0820458ceca84226340f124504a9009122407a0431927728f0a385122ea12b50a4088f911e4682188184678788058af4506247c84c684513b143a48820488820d1f303489124419038b2d3a387a788911d1e1ca1129a88203d7a7690f020016425aca291ec04e909c253c4881e247ef428a2471023f987112288fce001e2254c422b41811e3524437688183982c7881e441041a20805880441420f9122407a1c3982882374910ab0844668243d447692ec50d14510094204911d233d767a7e10118408223f80d08445e81d228a00710989d03c452a806407898b70088da40709233d48147911d2fa47cf0f227a10291284889d1e244190f0ec18990985d04876788a00e9a1444f90214128f06348901f497e7c188446620489223c45f4780981d048788af4202922801f3c3f8448853d680b043192797684f01461401066c883ded941620789030c41c44e1145fc182246b883462204c88e1140a468243d447678768c2012e4c31c100952015588830612040991203c3d49ecf450628811233f7af0ec10312408122d21408a0c69b584b33ea2c78f9e1f44fce8d9294029b4c105820cf911a42708912028e10c5a0890224328d063a70709203b49ec9842a1e6290280318791094f09595c91fb476cdaeb95e94f5de92aacc2a811ead919dddd3ae8a0830e3368add4bdf3dc3b8f564a9d7a5edb592cf5501ea5ee9ee795bc8e25afe4a5928f272f8d25af73efc5bed0cec569575f3aaff7d6977af2ea286b3ac5713a9ddcbd5a6b773a51b715456dc5e9dcebbdf7a25e6aadd4ba75fbd57b6bf53a4a29f53cf76ee7eeb5faf739b594d2eec66fb0d8a8ee7eefbd9756ff2af55c5cbcda70cfbd737aaa416974d6de7babbb53cfeb3c4ba9d73ac3ab679d76363228a5d4f31c3ccf63a85baf35c6aba99485568f3aa5a928cf732f8677efbdb576dd55afde9ee75e676947bdea5edd6b45a1ded17a6fe71e0caf7ae7ee275b3daf3d67f19ce59685c5adbbbb789ed78fba7bde7dd5ddabd77aaf5747adbaea790d67dcbda23cefaa5751aa57ab577f513d86ba7b5ec97361ddca789e27d618cfb1676bbb8742a150d473aff3dcbd76ee1ecaf3bc0ee555cf2ba594564a6badeed5511585aafe79ee9ee755cf6bad9e57afba7bd5abbbbbe7b57aeed53d4abd5a29ca734a9d52774abdd64aab35ade775d5a97bb5764e3dcff33cf73cf7dcddf350d429a50fd39436a52d4d3d4a297df13c8a42514a6d7b2e2d5f55d1a64d59baeaee4e9dd2b65e7b4579dee9743a9dc49818827a9a0957522c2721407e5060c890223c30567eecf0b0a4bca4ac80487a90044962e7744491158d2015d8e1318251542948768a20f2c3082098c88e11233f5a7a80fc4042e4074f4f8f9e2047500009243b487a1c518408223f7870aa07490f213c452cd0b343444644b2ba2b152288fce8b1c3f3c3c8114586fc005264888d918820437e24e98124a5671c11a48708123c18a5023d48b8a024b163448f1e2241788cf4008224c811a8235eea0e4f057af014e9f901a4c890213f5a6cdcb82451c4023d2f427e0001b223e4e6068d0771d098510491204620f961c49f7a787ef42099a111632252441024e6d7339028b123a40790204328808491150f9252d320620709921d1e23471401d28367274911203b3c3384dcdca06104c80e129cd108203d3f28d0c30824418804a9c0aaac40109e9d24313accb8718306112e483b3d3f787688ec14d1e307122280ecf428d26344091e2031a319257684f4e8496287080d59c44cc8f3636708901e3b45fce029d283a4071143821801a447cf10247e54608708d6386427c9ce901e49fc3802462ca2c8901e4510095244114586ac843b487a24b1430491203d8804f96104900a54a0488f9e24763e09919d0af68c1e448a0441c2b393a4474f91223c3d88d8e1d92182a7488f9b1b347ad0d811f26308057aec04e1e9e9d193c40e8c244476eaa95d099e2247ec1cd12521b253679070ded747ff883e7e68fbfc783edaf3d13e3f3fb5fef8f8b88ff5d13f3e3e3f3e3e3e3f3fa08ff6f1f9f97cb48f8f8fcfcf4fe7a37dfae7c7a7faf8e99fcec70ffda1eea37d7edc870ffd691f3fd4c7c787fa681feae387fe501fdd3fd5878fcf4ff5f1e3e3e3537df8d0f6d13e3e3fd547fbf8b88f1fea437df8d01f5aad0f1feaf3e33efae7e7e7e7e7fae81feaa3ddc70ffdf9f9a93e725412d0eea64720f9d10129a6cd9972b93e8a69659e596ddfc996eba3ccee65be727d9279672c7796eb8fa6c595b85c1f346dccac341bcbf55366a5d11a3079014d044529c0d95eb3984c0b38a882144c9840053587a3d9666e100318bab04510ee7573b23bb3b84abb214516b298e206296875cbfe69635d18d6a00322b4410b27ad6e8d467f763124f8a0083ac0820459f041ab5ba5d212e0a529e106af2ac456200559ab5b2176c16ab44a78892ea78630a0600b373871d2ea968797b8d5569964b185cd074398b5ba65b16b849728f99c5a232bcb55a8e2b8dee7d4b2e17f6853a9b02ce1606b2dd195e543ae757e32cc9eb2a6c63c5293c377ce0123f11a9366e7296933d1da151209976b8ee67db84f669fb4e5eabd3c1beacb7db227615787cbd13e5ccc863fd272fd3096eb7bb85c2df8fa66247675decbf6e53e52e7c9bc1c0bf8d1bc59ae9feac8ef2582b2cfe6cd3a99eb03659fadb26ae7c9bc1c18fbba10bbbc9887035f9fed721e2d8c911faec4952fcfe6c9c22f47dac85889b3dfcc035f1dcd93915eaefc6816ec66de4cfc5ea9cf5682b24e46bbe9e02a8eeb56714631b481b3317c158d221e5746d98a480bc53006d2c65968036763ec951b4fa16c9c89b6d196ebe7721d455a18c6401a51c53961588d960ac485b394919622be449c0a8b313017d2c4dc6813639555c15c28e6461b880b67234d1471a16c9c89a02d0467e16b2586321b5970202d8ca1c8469a2dcc91405b281b67a328be405ca8f2a93f43da49258eb63fc51ccacc770b85ff146324ac5243462326ca48b65c1f97eb47234743b6328a36703570323466234ea5c6ecb391ab91bbf11a73355e32365e355c6cc468d0c8174d8d1a311b311a34f2558306d788dd788db91a365e356834465c0d1bb91a391a391ae3cb460d5c0d198d9828b3d1c055569d498d66248eb4915e245b8a141bd1c81c0947d248a411392265e58b341bc546b8918c8c95b1518e441bc9c858191be548345256be48b3516c84239146e46c448a8dc81c0947d246331247925e241b98234733d28b64236d646e4423c5483892367a8d4832528e9c8d6223d2ac7c917924cba34ca2e53246c65c4514c53fc94c36d32b55e24a33511463b99a68a5dca9b495642aec3a996ca612373b9966259c4c492bc5feb1eb14a3954a5b4966ca9964259baa9c955e2a269ca9442b65a509672ad14a596932c92aab96cad2ebf432cd4ab892568a95b893cc6433bd4ab392acb49d62265a2957c2956225edf432cd4cb292adf42a67a65c9e997079c814cbb4122dd7ca5c29eb21bc322cbf5036d4eb344391a1e4b20c6586c2a16229af130d6543bd4e3314194a2e07a5c45068a8dcc98692a1cc5038542ce575a2e5d809972243b1a166282f14ed944b99a1c4507028da2997324389a1e04eb814198a0d354379a5c45068a8dcc986929d6628391419ca867aa162275aca0b6586c2a17228d9c9961243a1a1d8505ea8d9099722d3c1a5cc748850703a3994984e118aa6733be53a8b7c366d76cbf5758674662a3895580a2d355b79e9d85234959c8a2cc5b61253c1a9c45268a9d9ca4ba7b6224bd952af149cca2c4553c9a9c8526c2b311d5a4a6e6596c2a9d05231159bca6b859692a5722a3695d70a2d254be552722bb3144e85968aadc852b6d42b05a7324ba1adbc5233159c4a4c4596625b89a5682ab9d44b6596825b91a56c295c2aa6424bc9adcc74622b349da0544e479692e908a9d874602a2f1af9f4014783e5fa3e10f9806b89a9682cb9151b8b4ce7d5a2b2a95e2b2cb396988ac6925bb1b1c87c286a99a970aad80a0bad456553bd5658663ee45a68aa9c4ac6f262b1b5d85a5eaa194b8c05d7626b79a9662c31165c0b4d9553c9585e2c2d33956a25c7f2c2d6125ba1a55872a28c65a6c2adc85236f1c5123bd1565672a9990ac7a23aa9642d2cb614cb2b8b2d349a0dfb506b69f1c1a69aadbe5b26ecc30d973fecc3104bcc8758ae7ffa3094ebfb1054716215e7fb5e5e2e339516dccc8b0d46e6c3ace2e0727d89b9d06260662d3913bb5e5e2eb3169c0d462654714c189aca4bee45f6b9bc5c6ce6bf60d70beec585366bc9f920ab38a68b0b97188ced65bae05e662e2e3917190cee85061373c9b9c860702f3498984b0cc606f3727999d15e722f3297970bcc9f2d3817303299175bcc6be64273f9b325e7026626f3828b89c5bcc84c17dbbbbc5cc0d0645e72dfad973f615e39e6bb85ff7c99cdfce9828bc1d85ce01e722fd8e7d482f9130627837b28c22e7fc2c462b00faf99179a0f30d39f2e4495555d64a87cf64023caf57ba8551cd3cbd7ef8156713ed367c69e6682c9994c1c9ed5ef01577160be6fc6ccc198b2b761dabf3e06bbccd8d36072383cabac7aab382e5f0cb6e19739637dec637e06bbcc9c69a3fdcb567154f0cbcb700c8ea9bc497b315f3fc33918a60dcbccd7cf70ceb461d9cb300e7fcea45556c536fc323ff62ffe84c9cd4c33f6b4b7fdcbc4343367caccc77dccc436fcc2311593d6f2e7e7be97991867e21e5efc89733d60590fb316d3d6c3d00a9b3d04fd2ccc270fb91e828a54723232a798578cadc545cc85ad8758c57921ba907d4c4c26f6b9c0c5e064b04bc616f38ab1b988b9b0f500ab382a173132199c4c4c4e46e64216139371818bc1f5f052918999b998b99099c9e454646831b4172f172f1734195a0cedc5cbc5cb054d2666e64266269373112393c1c5e464626c3617b1938c4df552c5625ce03ed9297692c1c9c858625ce462649f8bd94926975532b357cc8c07db639f53cbfcf3c58b875b6555953f5dd078c0fde9e2a5c23c10fd2943e3a15659358676f3c9832cd73f79a8e5fa3c08559c1476f120ab383ea796f8b65c69b894ec559f075ac531b128becc0a67ae5eb1efc56c26b7b2d166702f665e3c0c551c95558e65159b998933b2173419ec5aad5e33b117b3991c0fb38ab382ffb5929d66682b36dc6ac69ab1a9bc88bd58cd58b119db8bd88bdc6b35437b617b815bad623333b217e28a368333fd39f36291a96caad7ff3933135b793163c1b1c454b319d90bdaca2aa7f2e74ac6324353bdc0bdb09dfe64bd5464300f41abd9631e6233b6181e60b90ff3f07a112b8ad98a72fd9c5bc571b9b0559c93cbe973b9b264345f2e963bbd78e5ca9ac58899389ad7e91fbb582c198d2c4713233ac57265d1be18b2530c1b0cdcff0bec82c19ac588e1685e39b88af3b25c593633c6ec61c0c8b998e5cac2e5fa31682e60d862c060e162d060d862c090b16c31663068307230622c5a0c590c1b0cd59f34b28fa9e44cacdc27fb62279ad7e3545ea69949f6e14e316c1f53f96e997fc698c5fc092347933dcbf63807669e31682a38271683cf182f13ce099291f913862d475659d5e58431cb7989f87d4ead57ae35321adacc8bb89c6a962b8d4dc66bf5aa1c6239c85470b9ca88e53063bd4a0dcd26e3f2e25b64b97e0e341c8c97a1c9d5bc5c700e3035b9979a588c779131a3c1d89583cd559373d5c45c3262609a994bc60becca815683a3c955567d18b8e645232396c3ac86856b6cae9a198dadb2aa8c570e2b9c832c87578d8c8696c30cce21c7c299702f190d2d97834c9543ac66466393f1ca61665ba9a1d1e06239d07035af144d4e868c05fb9c5a269c53abac9a83ed847d4e2d15cea15556ad59c1394395556b62299c33abac4a3313718e908c590f414828e73504a15bae7fe6bc72fd1d70152705bbbefe0eb78a8392f2a54ca20c9a0d190a0ddb8c5caaa8e2a052281b994a866dc68cc6cbc60cf526ecb289c9a0d990d1b0e5721587849ae52a03378346b2417b8936326c3366345e3666441567146d683272e20c9b8a0d6e468cc5c666f3c2e5ca62939bf161978dcde6350367939b21b3a1c9c8cdb0d9e066c46c663270336ccc28d9908133729dcd262683366326fe696306d27875b26bbbb4d10bf5a70d9acd4c06ae9b614bfd3923b6f2a74dc98606ca404949f973062e25b2fc3943b6824d7fdae4624e1b1be9058e182dd75ccb8fb61b59ca2bd74fe1cc449ccba7d0622cdf9bfecbe5aafa932cd7b7bd3ccbece665323fe6dfc4c13d4e4c8506f326592ec6c5bfc0b1c9bc0b9c57cccbdcccf0c7dc88dd78815d382eb00be725835d37b318ecba81f10d9c895d38b8c72e9c98ebc6750306dff8b00b2787a3c2ae1bdb8d177cf3c2f1c299b96e70375cf04d0c470c877693bbd1826f64362f963f6dd8623470b7866c248e6ae05238140d59eebe663572a53f6de4401ab3118752e395528336fad3c6ab74e3358e3914ec736ab17c346829d8e7d44a9531d477ebe2b346cbe7d422fd692346bef20d5b8c7693bbb989dda0e178cd6e7037b69bd78d594e86f2274eec867623774396f2270e2e05c78682f310cecdec06eebc113b7798e5bac350c52161d7caace28cf8aa64b9e6c0c93a9c0eb68ac372ff14cbf5596cb9c6506cb93e2ed72761d70eb21cb81c321c3859ade2a430e9c71dba07dff5cab58be57a6936d29fb06b87984d87180e1b6e075ac54161d20acaa7e4727d5aae8f7ae5fa241c331d682b2cafcaad3c4b8e59ea57de95cbf55d510ca1f2291c321d662aeccac1825d3956b04b871476e150c13ab870e42aab3e0a76e5a0b972bc5c38663ad05c3bbc74e8b02b470c074d871247ca429c27b3b2128eb48531cfa643ac141bd9429ab783d5e155fa6e8d7fe6a08d72bc441d68f74f1c33d29f384a257e12ceb3dc88c4a911e7a11c3331c42588332d877d4e2d0f7f95e5dfad0ee75a65d53f7598659c852aab7eb72ceecaf23f71c8727d244a9afdcf1e82500fc1963be6e7fab07e68a551b881d83227cde17cdfff551ceffbcb8ad37d7faae2541cfbfd6217fe35df9a9ee942f9cf74a9bccfa9e58defbdab13bf7b57ccded15bda47fe27bbe087e5834dfa6b0b4f8ff2ae288630fd0917963e7c57e750b06b0913b2e58a6288945779d712980f2d9467425bae2886403dcabb54b08bce2aab7e0a66425b28284c5f9555ff845d145759f54d98096d85d8655359f54bd84865d507b1cb4765d52f3113dabad8456d95559f845d945659f54798096d7dd85556567d12535965d5f7b0ab2babfe8899d056875d42601aabac6bb3b1ae2baf0cfc93d2acadfbc67db7ba3f6dbcceddef56f827c575dfad10fb9c5af7cfa681d8e7d4b2df2def4ffafabe5bdf9f74963db333cbcaa27fcd5465d1b7e65716cde58ef141fd50f76c22a96be8933a473f4511694fd99f296ef3487f4f99c4cb47e82b23f9c93c1523e9ae39bbe6a47f7e679e923e4fd9ef4d3b22ae74ce12988c963f130bd339309a563dd168dd67425bced23930abea1cd8d8d23930944be7c05a5e3a0726d3aad8e53dacc6d8394b60352dfb4cbad645750ecc43e91c1829a573602a2a9d038349750e6ca6e5d8d53dac46d7394b94782d984dcb9f496d594c760ecc479d030b499d0333959d036329750e0cb7eaf79b3a0706a355b1eb3eac86d739b0dbca819160e7c050c2ce81b9b46c0ecc45cb62577d580dda39b0cf3b0756d6ce81a56ce7c0bee539b055cbbfbf3bc7b1cbbecfa9e579de751e4edddbe1b26217ac46abfec55f65d187d568b94e2d8b5d4aea93274f2aeecaa2ef736ac16ab41c7f65d1eff7e9a8addddc3429b2d0cd022599562672c5277de5262b3ed24f72129a7f727f1fa1b9f6bbd95dd34f35d033fa5b940de596dc349909b248f221d93feb530cda9b45b6f8487df2e4b32026f2e1f3fb213f37c8e58b89b8b27dfadf57d37e9341341362f9c34e3a9f7cd23f2f48848725b47c89341362f9fe7981fc81170b211404195320c29744ae9dd96fcdfa4d3e40c79f6879af142cdc4009185ef6a993974b0760e0848cc785cc06b5578f91ce223b79c99802115e497858424be202f9be930c74162d0fbf3a8b566357bf0f1115b0800a4cbce1f56a75f845bf9e46f210252d6021067158f27ab59a24c029ffb88fffd4da1541f458aeefe6014a21ddcfe4b3c3b4095f35b1d339786cb293fe9ff6c2104fbfe937b67809939a967dd8a945bf3e6dc26f50b93e8b0884f21c926913beaa6fd30521965822e5499bc8f5cfee42aeefea2f2beba7d5697882072be0c10cf77ab5ec2f61e2adfbb01e5af4ad09eba1e58a6208fa2e212aab3eb5b9a218e2bec52e9dcaaa7fb12b8a21ec53ecfacaaa6fb14d659d5f3e9b46a37fb6add5a081243819431566a08527883e28bbf533022b80a002150ce1860334b4bad5dfa2e6cbd2c0032ec8400b80d05ac2a4a6451f766af537b90098274f5af49bf09b191af3f11f5aad0aaab5e67dfa229d820eea7df77efdefbe776f2776e62dc17d6bbb6b6db5ee5300d20671a7747205453e44fa2d73963ba4b17354a768b86f3b47f7fdb77374e6f7f55b7cf5a9bcafd9b3cac34d5bc115f4dea7e4d7dc4a107a433ebf9d2ffc2bfefdfe7e1f7ef7eff717fc7b5fa573d02c8266fbeafbef6b6eda0aa8f07d479f64ef751cc4edabef764d7f93b66b686e995b71b045f65fc10b32c9b190eebb27c0774fa97d156491bbefece4001a375980eebd7bef1cfdf7c5cef4ef2683e8dedf3385d4b181f0ef6f7c824f75bccdce9f799edd834fdf3385801ec9c37bb000e183f8fc32f8943c92c4920c30f1ca3cfd487e8e9c1670031c9e64246d13726203597c243f593cc1ffc03389ecf108f19944f61e7c117cabe2e17d7fbf87857c7fc495cf9abfb7f8a4b9df7b277f08739b9d2ba9c3fb267978d933cfeee9ebd4dcb9692ab8828eee9a7bcdaffe80d4c6411ca2b42865aebf5ad1f88dcdf54b1cda92c9f5bf1102a31188b9692ad8404eb588dd26ed6efa448816f5b3cfbefdce7e67bf55dec7f19546f84df7397e6373f70d88e5ee23e038b6d5d55bee9a8adce1c8f6753c054de4ee5bfcc673d7759d4c47a96b3182a026567404caa6359922d3177d990628e947d15f713ed7efce277dd5a0088232911b9ff495eb8b4d364e62737f770ed58e30db3f7b0ad93e8f4db6f80829f79ffd249ff58f9499d2973b118ff008f38904089490fb7998f94402072dc8fd40843915e423fde4491c723f0f329f3d5bc042eee79152413e7b845690fb79885ac8670f07b690fb79c4b08214f94442051de4fe1d3894e472531bf48db2691fa02227c05b90bb175b0265d3368045eefebe283a71060a3a710610342126b33159f607c920e82c77ff7de08aec913cbc274f720381840aa0736321fedde93c3d5f3ed24fb27d8ffca1691f2842eede622452b927959d76c003b94dd1691bb042b64f4dfb6e76ef248ffa4d0271843e31ef3ba9e3be4ea5e6d9b40d6891fd3d32087741eebe2377f853dc5d43cf8b69d7d0f7b7e6e9997e922ff7376d034d72933cea9327b9a35d8d04b50c93e913f9de20d77fa2890c7384e6fbe249b3f3a06ff1d95d73368d04b74afee0e74fb65f4d158f7b0321f74f9a1d2741a96f5fc7c56b1ee9274f9ed0af641030993ebd661214db0f2fd9ef0d72357b3cbf647fd1c72679b810ff7a2fee1173fbea6cda08acc83d9e2b3efd93e854985c4d98ec66676af688b9ffe752d742741dfd95466a5ab23f93ebdf3ab6d970c85dd775dd8b77eccc256593e6d94db193eeef75c377639b9d86dc759d47b33716d933e9eb54b166b11f50b61d2fcce8b480e76bf616b971e9ab995cf10ff5a13fb65a1288348b240894f4ebdb2633daf24f59b39a1028e977a52e718832cffa17bf620201c17c4bd3605094591e45d37a81799727994030b8498c1610f930affa50859b8c5aff2d1868e549ef829ba0b480bc577daae5511ffec9046a41bdcb8f5c7ef428dca4b680549ef4a009e4829bd4b4804aef32faf0ad0934c24d786801890f13e2262d2da0f055df829ba05a402d6fdf6402c5c801375969017daffa1adce46b01b5bc7fa5c14d680b08f52e1f0337e95a40a3877914dcc4d4024279d2a79840307013550ba8e52f0b37916901a59ef4ab1f4da0156e12b6804c33b809a905343eccbfc04d70b480ba577d69022901fa69b9c04d665a402d5fdfc44d582da09427816f3e7e6a02c9e026de022adfe59500fdb46270931e5a40a487c14020aaf4e537a12d98c7b8094e0b087c1506527d13da32af09d482819ad056cbc3840ffe47ffc5043abd0b066a59f9d4ab7ccaa37c13da526120202020d28f9efcf1c5d7a92ca60f2daf985d59fd29735559fd2aa61095d59f62265159fd28269555563fcafc2aabff64da5456bfc96c4065f5974cfaaaacfed2a44295d54f32cbcaea1f99382aab9f347d5456ff68525865f58b269d55567f68a62aab1f34752aabff338da8ac7ecfa4b1caeaef4c3a5459fdd7fccaeab7a6002aabbf9a462aabdf4d1a5459fdd4a4b4caeaf741fd509f95fac940745adfbebf2575b8d39a48be97453b92e629c43ef9f5abf8d4be257f2075dc26cd5348f7e45f1ddd931fbe489a3637a52a1e5fa6ff658a553cc42647ff99ed2bf049f3fcc9a4e78977b464477f44fd46c427edce317a71fc9894b97b0fdf69f68ff4dd93700fcddf7be40ef13b7c764174f8279fe47f2f76a66a47f7a427e1b3fb9f4c491df63b5308157f64ea54d1ec4c9a9d47f3b427cdf63bd33e353b77e40ff69bfca1fb1b84f8149fe237690ae9467a491ddf83f8438c537edf39fc2a49809ffcbdf89942ec7b668879ccb2f8407cdafce15388906ef4300e6df5d30e5bf3a323eabd8194db086458e2dd7beff5eebdf77a5ee7791dcda5b509a2497f48d7f4d7176dfbb840e9dffd35c257fdd7f4e1ab8e80affaec5cee177fc64f88efa70142104009aad42995084027a725554b36a95c5f387cd5fd34dd37a9e362af6d5758416b2a7264569fdb575d7377cd39668acfeb99431a9729c6b104c5383ad3c6868daf687c25e3ab5a6be9fc2564f212b75becee0782feff03e199e251ec1cd802fa8d5165ed6a0e495921f32b5f596b69b27d11954bca447969c2604363836685e35b5a52a892a27c752f8eb252a1a3d76dadd66f4712bdeedaeab4bdd111fa24f71f416c193b84105ef7b7bbf73640085f5d02f8ea362edf177194f49bd4617d55df6c2f8dbe0ac0ea7e15804e0e0e1b386cf42a5f9fd25fa752524747f3beba2f23767bdf79ddd975b8a7e6ae0555569fd27fd435d786c68666e5239997f91691fa944ee6fb55b463ca44f9ea96bebaafe3d569dbd14849b976ae11e89a2bbacaaebbb7ebeebdd63c8734ae0ccf200251d24ce120ba4a9b793c7b3ec390eec043738fe7eef1dcaed266ea2a693e6bed1cd5be5e94dc415fafdcdfe48ea6e5a681288afda2d8a8ee29b6f4ed69df5a9c2ac7966c5f7495f7e9fb63a0f4bff8f3957d6a5a5fd96f12088bbb9ae790964c9fbe8eff58ea2b105be6ec629d837ec3c058f63f4b385d59e70dcafee74aeea78d73694fe9bd8ed3919a9fd95d43c91f60327dcf3ce27ddff9fb9e66ca43fd3fd349f757d6391d0bba16742ee85ed0c1a08b41f94c6cabe4a4736056a87360a30c3a07869a41e7c05a68d0393019283a074673a3e89c1a740eecb341e7c0ca59e7c05237e81cd8e3a073fc6f0e3a6709cca6657a26b67592a2736056079d031b77d03930140f3a07d632d43930991e740e8ce6faa0737ed039b06f8ace819540e81c582a089d037b2184ef25764f890d95784f9e3c392fee8495785889e77d7b4a1a0a4060c3a7247c17cc468835e043abc42ed70bc42e0df8d01ab1eb070a2268e0f44a3c25de2f6132b646b07b9745b5c2112c8d60e93f62d38f2419ab5f02bfc4ae8aa331a16985af04900f6037a8428a272d97067c6875d8e5f38527aa10247413414b8967c25d894db1e55d2c2afeb2ae8c799995977754abf3d2bb64b0abfc186ce37a97102ee2b76097c5d9575759891a6db14adf16bee092e551232b23dfe5ee825de5b760233e688c094dab7b1276d95cacce3ca663838b81250b3ea594feb315ec023f85e9acb25c56596eb3329acb5e5436a660f05d301bad11e9ef1405bbc247619ac3b9cde6334a9be1a0000436d8c410bb1cb784c9d81a61d11f66a3256217883de7af5cd70623ac81093a500213381ac405187c610a4e7c1c0952dc20044e78030a5a22aeaf5c9d591aceda72318b7bc960652e36a3c5c09616f84c6464f5251b57adf199a46c94e63d7912072a4ca10a14cc9478301b2df1998c64904215b8b0825a155a4ef39e500229f440034b188312efd22acb3d5c81a7022f05de131e0abc137826f0bcf74af091e01bc1e7c427822f041f083efb5d59df7fdf1ff040079ae0c0069af40c7ffadd3de3e2685d0dd8b42e9355eb027deb2ee99e49aa7595f40c5ac5e9f092254ae89356f74cbed665a267f833295b37033dc3fffb681e3e53fe77059de3483fc977055de3ef7f5f15a7c3dd2cfa179f5f99cb669da94cbfe23395cffbeadc304d43bf8be58ef169f9711ffa63ed43416c999306970415ea1b2df222531339111d72186dc0478bbca8bffde6415d446b46a49c880e398cc6bce642f4467d8812d10aeb9a0f51225a6102f09a0bd11b0e0a5bf9cd8392a0350aa34554a86f9f17398c0e3551ca893c88d6ba68e53717a2370ac3e1b56e813e44899a06dd184341316815d62f841daa4435e8c23a582daa42b7c8d66e901daa4435e8c23a58ae0e5da22b6461f6568baad02db2b51b44746f77c812d59a0dba355b648582eaedd66c91150aaab77bbb4396a8d66c501dba4457c8c2ecadb2bc532ecc0e65af44d9c91a94bd83956e90a996bd1665af425dd1153ad99bad9728fb1db236a8766fa56ed9fc79bbc5fad3168d5688ecca92f167bde118445d50ee5f75a8ee89b28b4320914704debace240a8145a078cbfe44d93fc4ae90481c22ea88c05b2d8730f02bea6ad97f283b0876b78fa8b2bcbf41211016d654ba2111860283c25b50f65250f60783c29bd8098541a010080b6bdd90080b61e057d48543b95f88568850e25008129dc01bf811addc50a2505874026b5f5138d4d542d8690884d5b28bb06e4828fbcb8341d8e714deb297c218b4caf24e28fb7f15c7e7d41251455ead2b0251b7efd6ff2d1eecaba5a05050455ead43ddbe5b657941df10ca8de411a104b5609777f3601f118a506952a53ea19414580a4acd13f28a4628301794a20fa6fa825c28b0caf2a20ff605795f0a0ca5e67945de3784e211a104b9dcb2a78abc5a57f4b508a550aa5b760f566bb98d508254445e50ca37d4021bd53ca14f28c3b2a7508a482adc1f4cc51bca8e69621f51c53961ff18b28a638a1154714a1897654a65a8a88432943da596dd3fc650c519c714518b8a10514a0a85a8c4ae94ca904a11ca506d5671407cba6557094a09025342d9536ed95344422a44a9211422a18a2362554a8ad0e996fdc554504acad04805a65253a5602929432a30955a0a9692aaa5a8dc5241294495e53795a094a09450ca2d06ade2f89c5a8ea20ac71a194412894262910d3efbf612b68c371552882c328545e397b06bac91414495e54262910c7c766e6524228746b017b136067d0b768d3752880c8b72c06713a1f05844d6464125f1360aa590b015f236124a1189c62112468a44e3d05844d64641e26d141ac9a1114cac8d2c7c366e09120e4eb8f8b4f93e8b4f1c9e57f1d9b40e87ddd7e0b36b2ed8e5a2305cb405234713ab38b405039ff445f1496134f8a4b17cc6088a814f1a944333062c46cc3363bc60149930729545aff0841b64a18a9c1442b5202211e623a0b1010d6c484250587413228b826a1a889ee8800d5a0cd58886c8da286814c28d21770516b2f08496781b8b1e0d29b8419007a680050963053da109140091a1d6ea5617764fdeaa084215696082034d08b5baf57d7f8e844633275854013301094a3f0ec1e18a254ad0020b14b4bae589de87245850f62f87c8d15076d22dbbc9f4a4a092d058d6c6518d44122a0d95b7d18d54441a2ad54aa211510923d54ab7b268545406916aa55b59342a2a834843a55a4934222a6124a1d250791bdd484595e541a5b236aa918848b0525039341a22dd44134aa9e81bea8a526a2714a2d2d047d47944a79420d4ed13ea6e2a412942b7942e1594aa65ef94a1d2abc0546a2929988b660874894f5de1875fe3229f8c81cf17293e53610dcd1059f1d00923c7b299acdb67b270268bc864e52acb093900021096408421d8d08da86b4e78010d31b0810c6a41b51ba988a2c0890fda20833308dd844a44b02ed0a630811556e8a03522220d7160034f888580e605d549aa652b70c0051ea082120eb4ba45e2d28dc918704ea0c00d45ad6e7d6551f61bb0da1abc60031a94414919248528bcc0890e4e206b754b3c0d99884c412858297432159984504125d8e9768299504225a213d129c8542b159d8a4ea61bca043b159d4c37940976223a05996aa852d1e9768299504225a293a9c824840a2ac14e43262253100a560a8d8a50434441258c0caa998a4c42ded089c82434de4458f653d0c9542b15651f5143d94f441e4ae53c159dc893ca77eb3b096537994edfadd269bab98094740f64826557d2552d5add2fb1baa1b06b893f5135fa3064a707310cd908e36194627c0cd0f420eecaa2791a14ebbb05043e0ad73ccbec2929663d0c5ce9848194880fe4736a9dfef440269309687c25e203b94aef430e2f318e40e02b11e9770be88461d42acb970041243f99a73c61d460dc2a8e09fbc3c0559c923f0c7f18b68a0362128c9acfa9c52204aedc6a2a98eab63294ddc432b442a4225a115a299a51b1d4568258602daa2295104b100b11892588854835b40283c12db095201618cb4d55b4c22a21d58ad04a912a88a5a682a96e2b432c432b442c422c45aa5a65f96da565e5c69252945d55cbbe525b214ab10ca5c054b7d390ca4a5176969a2a28bb8a684508c672cbae12caae2a3aadb4b004ade0140b91aaac2cfaaaa1eca8165876bc02cbfe306415c7542a6bf0f98d291a7c96208e81cf9488bbb2ce18b4ec0f039fefcf326304758d7f92f264d9b2ffc97a65ff3346d0cd0673fba02782097aa9e560885ee8650846e8e50673fba02782097aa911c114bd7c11ccd00b110cd10bbd0cc108bddc702f413f64c2605e8a1ef63533e80506037bd8d7cca017180cec25e8874c18cc4b114cd1cb17c10cbd84412ab7ec1f944204d6c41b2994224a11ca0e8a5fa442f40da5c014657f11ca2e0e6587657f29caee82a9657f09caeeb2a1420646200526c8600ca8957f58765753f1041e90c049089468e1948297f85a0abb7034c182273001c4840326159219e42261210b4770028b9c065a30bf44cb09031bf112add5fb9c5a2942d95dc086b2ffe862e86f7098a2e5736a2d2153846ba6507615174132422da4d12dfb9b433243d95b6488b2c71465c72e172c660d45a656c2b23f0913658fb9655fddb2cfc804658f21ca6ede70d10abb646e33d82513f402bb625c609729837191cbacb9646a2e19980bc7e0989b0bdf5ce690cc900cc6313245b8660ab90832b18c900b2117b021178fff568432747fbec05c0c09c186fe26e422a8a82634145324731b92a9c9c0626e44b50e0390925b14ae008456b7c4f04f991b1bb688c14b032f19b4ba8522ff9409aa4c18f2420a5e6cf841ebfb3386a8c6448b356c600c4f5add82c13e275c04851eb0e0045d30830bcc5bf667c12a8eeb557144f185b2d7b20b812e45d95b82b2cbc44f05658f19ca8e7209ca4e2494dd845d5828a6e652141404cb1e23e402136fd97f287b0abb7050cc908b4b8b102b56718ab2c704b5146537b9d45a6a2a44d9636044d95fc5248a81b510b9bce0969b591413d452e4526ba9e118211798cbad25949de10a28a4108422a19a90100b1bac78c214ae9005a2a0a12017d850e7cac006a05a0796dc304c2826a8a5a8e5083a9842071a286a824bcd2ca244304306886013c3095add3261d70af7a749645f4c662ec8401a3ae0ea18588963821bc040853558d1ead6689fc4670b5117a1076b70438e0468b842ab5be0fd109f2db7ec9e812113b4e04906d4d0ea96885dab9bcfa915929fd705951e14c317452f844a296f2aa95a5edc5cb06ba605bb668a2acb59f0aa5659fe2bd8e5e256595e53c1ae99a014ec5aa1e0191476ad842acb894cd8f562a8845d33b7caf22ff10c6cc4ae991a885dab2011bb5c84d8f5a2a8b2fc49f8855065f993d8f582a8b2fc3fec9a19aa2c7f0fbb56b0caf2efb0eb455065f98ff00b98cb50f61741d95f10651fcabe82657f01cb2e94fd4551f65af65550f6a2ec43d961d9676ed95742d989b2937fbea8659f09ca3e43947d3594ddc52d3b39e218432f6ed963cc84b2833886d04c51f618b2552d7b8c2017b5ecf4cf1841d97f75ab2b5cc5e9d6c5e75b7ca65a159f653e57b7ec34b8dc313f9f4fcc8fadf4892c8865977aaff67add8fbeffc7d61226385adf83a13892a847f9feaf8e4865e9647a550b46512829bf8449aaa5f24b98942d965fc2e46bad7c6a09139b960a77abd6ed19f49730f996ed19f4bb6fd0ef6731517a06fd1513d533e8a7cc53cfa0af62a6f40cfa29a64acfa08f62a67a067d94b9d233e89fccaf67d037995ecfa05f32c19e41bf34c39e419f648a3d83fec81c7b067dd264e919f44753d533e88b664bcfa01f9a2e3d833e68bef40cfa9f09d333e87be6a867d0ef4cb267d0bf26a967d0b766d933e857b3d433e8bb69ea19f47d5868b5892d73f6106c59a73c53e7e75ef5943c32dee61bc8f3dee7d4aaf7becbf3307cd71d7d4de995d8072a8df0122108347a25b6a73c42b30eac6bea770b6804e2254a4b8ce8f39467d36e1e0652e23dd0dbb75f2f06bad705abd1eab0cbe7d4729acf6ee9230c341a8d44b7d11c69e4349f515b6904a784814aafc47ba0d28fb85cfd4545ec729b8be62aabd2cfe1bbe28418287c251e5e42097dd28a62c6770be8c777ad9c1e5623e55d9f99f261ea51b06b7c0fe541ec1a7d09fc1a1e9b9ff1a0e938d35f9525a3311bd365a62cd7577dd1d0f461f6e7b9caf29cc73c463d53085367c5f419b5758e467314475fefb6978cc66c1ce7313a6b5b7bae04527cbecbee28077ca628adebcaaac16789f3f0f9659d5b7de5fa33cc9eb266e659214b5edb7dd959586badb37f71b15cdfd2c05a2f765d9bebbe5c7656713546ebb0cde57adf25cbf547b65c4bef7ae5fab35cef8d595acd55d950c5f150c077ad7ceacb6779d5c36ab43c148cf2aeef4f6f7a95ff87d56891d82562570a76a16017ca7b9ff2e2938fc22e12768dd8056217f8f6c7273dea3becbad835c2ae1276953efcd1dfefbebe8dd953d67c67de9c7965a62d99f665d699d9c5debc34155aae1f2db87d453fc5ac43295a5661d2499dcdaa15b5566b24b39441cba041affc6d0e7e90fd4971349bca08512b6612b27fa9f25708f50854fc603388e3e06ff0a2a2bae4f5aa4dc06035a8b2aacc498d5528aa5015fa46ddbf0996a8dca95fe57e11f45a65b9cd89d31c8b9bdf3c0b1cceb52022dac273a04b319bf9143e3454dd1cbb73b48c678932fdd9b2f2270dcb9f363670a8fecca1d56ce09f2fe00ee19f2ec23f67ca1d48df6f768ed2f7e3ce71fafe98de01d562deacb2624b8b8f2d66cd2e2f2f776c313da7984b5252ba4ef520f92d1f821fbea87a17a40e956ae52fb8329709f1feb2b0bc0ca9838565e6050a1712cafea8212b66d9abfb2a6637ebe51ac9a4d114cdf695a97442a1b49021f842ee28737d217fa0190c3030dd583243ec04f6b5468f329dc052ad3f994e602568f22429b3f73d65beb5e27ed3bf2075984c26cd2d26cd2c77a2f398affc3dd6799d0b528728ae60c81d15fb1330a40775230cf9e277b6c5ec32b98263c0b094fbbb2c52cfc71ad6ae566b473cb98661925cbbeebb0e7be38b9dbdd56977a3eef38863645c8c72bfedaea648d1336f366760606fc2c3a4c3308e32fc18528767d6fc99de83f629f84deeb0ed3d68b1102f34c51f94de83decaf362781f43eef0b02fb931a4bf3c7b2c5247ad326f902169910c684118352eb6b02e489aeb5cbc8099598ded3763c7328f2d85e0b062398c1876045a73e533f58575614d99ce8cf1bad19af8f3466b9a20b9c382a3353f84c923b39b7586f9be8908b9a30c476bbe8ce2684d17721cadd99247e40eab22913bbed1684d9692345a73a5548ed64c994aa335554ea6d19a29a8d3684d1414d4684d540aca68cd934aca684d534a65b4666925355ab3645919ad4952a9466b8e5c5e5ac83c32bbf59951d8173b93664f895c2bf8224c531f795d417c2e916bd7dc776919ad39beb88cd614615e466b860f335a13347fb4e697b1395ad38bc1a3d9659998d19ad785ccd859d366d1c568cd3af362b4a6af66466bd2dcb160ccbc70211383cd8779716951b1aca446310457a3ee5f8833a48e99eeab7f36aeb3c8fd12e81d2c152f7f761672bf037a01bd83adb920a083e81dac1554867fcb9fed84dccfa36fc01dac8dca70d59f5d450eff6c2a727fee1dec152c7f7611723f0f9da37758f93327f7dff48de9cf1bb9bf46df94fe9491fbab420edf8dcaf03f69f2f8e589f25a4e3728144bc58d2c64ff975a0e5634c1f6570c21fb20fbdfb2bf4bcd09d9bfc58a2ab2bf0a9fce82512bb8649636e895bf6907d95f0442f60f9590e9ea2c9f907b759654c8c1e51ce42a748eb2065d73a33b94505019ae83ec4fad05ffac5f7a12342d3eeb8b4fc91fea9b90e46a762e993c368f267cf6a0985fafc41757232557b55673c89849a49247fd924099b657a21876afc4d0ecfc82d4418698f4d73cc77c4f9b41109ff7c917bd27cdb1669c41ea186ba69134994ebe0779806f7af04d3660f83a6e024db85f648d384af259a48e2163f69e45eaf0be27dfa726f94dea08c5a76410f5c11741f173207588e20c8a05486f9d2fe9757c64913a48928666248d9984a90b92e2705d579ae20fcaee76dff93e8bd471314ed9dd8ea6fb17e48e0e532dea0b9212b9bf784176fe8226879156765ed775ee5e471ae6b15fed707dc3f59a1cea9f540b2d5cdbd5af2175d4f64ab30d49809f1d17d32b7c45529b6b21f3d04c7d0ada3eea3eb7e37c3906cd88a3f49e86d441f3b6dec7de77267d2f879106a9037c51b42325bbeeb31ee899760b9bb345e08f7fda5ce772f5ea08760e7c9b41acda313ef8e08f37c81df5c15a9b28877f8eb452a884c20d3a1e9a9da32175789e0c199deb3a9731b5c257fe30485a8341760f43068eb2bb4f2979dfe94df767496fee9fa8b6fd49cafd64ef407e8f60e7a05fff1c3d300a1bfe89a3692a7f762de5cfbea5ec15740712db1b4e57d6f922be5d81f38de6ad4d7d04be8e536a29a9c31b6df6fe1d4d4b87bed98cceee25ef77e011fa64346b96a568100da241a5905942618666fbcabb7196b5ae2c951fae87ed19b27f9792329a9e47a61195263222c5a430fa7242e9cb638347deff48203c8f4ebef740d3dee80e364765f883d6fb5bf61f990d2885a8ac3694e548ab383647772865d032fca9c8fe20b6b8739434e81a7f0f9f9e4f9bfbe1e68ad900dacc208de19fa9cef4e78aee70ff64b97fb6ec50ff34732489c9fd6d3b479983dc41cc01e6b03b78dfefa27350b1346fade36deba3d397a6bd183899b66b4a7f518f72fff496d4511fa39828f3645a5b9af57a2e954fdf6476af4aa459caa06bfc45b39c019501c52cfb7fa6144d658043c8fe960845c8fe9d59cbfe97ca38cb20f0f4942512b27fb78cb334c20e9bcb4ea86bfc2b186826795f3743a43176c5f95c004d3ad171828b344699dc1fcee8cff2fe77ab38233cd2bedbcd9c22fbcf207fa8b91caab916d1187194f7c56eafe1a294bef27dba24dfd1575726531a0199fe2875a7a375daf68eba6b86c85c3bd22a4e2934d2749450f86a0d36481d17573594f4c51b95761d75ef3635c6f61b7a8ef9cff2a919d6b8b1916383c421de106f481d17bc365b57f6be57f6db0ab941eae83a1c3736ea0d6963637e38a48e347859d42167c441862f8a75a49fe92abd73c459327a26df1ae128ee9f65f6de7b0f9fdd8b9fb9240a22a91cfef79d3952e12b1f69e658f3950b65fff0c93f475af6174b28fc66482a7bef5f0af94df7fee5cc6fac90df784e461f8eb04f2a7c9b43acda417ef8e193b88766ef7d2077781f7e934038f9debb1fdef79efe6886e38b396347e67c2f9e46e4fad43c53998e65f7d51c92fab0be88a31cbf9241dcf75ef4ee771ebf0752c78871ca3bde7c2f6ef152a9ec6678c3306c99a75794a40e300a22a95c5fc4b1392a76f27d8e0ffba45a51a878805fbf6222a90c621a5ff9e320572bb3cb9f5942e12c7f1dc81f3c77b814aa5b089957879c1ca81c64599a36070f3b8c3b905fcd6192cff466ddcf21777cd9333d7fe692ef997cebc351d4fa9e10af7b9145044259bf73f739b5fa4012e027d7e781dc51b1c53c907d45499f9a34f7400651b11083134ce4eebbf302deabfb3d903b6cf65ef421fcc251f7ee43e3c5e5a545f5c2b2f2927a7979514941419d4c2f2fa59234225f4631045f5e3eaf7b79b92f448cbac7e74f6776d75cdca7cdd46f5e72a3649d4ffdf17ce8cff5a13fdd47a95085d832ee7d775f491d436851f6be923abc109f3eb01cbe354fba83b26b4bfe207a510e1f344fcfa0fdd366f2db6fc627f1197ef722f99d79b3f0157971a479897c651f88f2ac44d93ef99e7db112f94df7f6ab167e13befd9af39b2f8befe43e69f6d4ac837c9b49ace2413ef824f8e2ebb8355ff2b845fefea45b54221d94f433c863eb8b38a5fd7293f6275bece47e934e60dfbad88716b5a250594c841665ebab9ba33f5e6d079c923465562091f6104d8b14486c1b65ed89ac436e1a1270596c1a2525757cb65cff4c757f9679e537f63f7c0ea1c9f4db574468f267e3c3f13da81300bf1952d3a14ec2ffcc1ecf3a9cc0be15621f9a56142a1e367f6ff387553c3e10f7d01d14085a3d5c3b7c96a9543b3e3f9fdf8d11ff93666bf3bcd6884074a7a0e2fa8d91485fa4a6679154495f16495e16495d1649378b249b4552cd624a0a4a0a0a25e5644249299524949411398a282921f8791d4a0a4a8acce8880fb99f521a04118797b971be96e333752a9744419fc9b7a2f0ff71ca23b6cc595228ca0fb70d1b1a199a2a47efb1d514457c8eb9beb5e79031dbafafe31828fded079a9640bc7fcdce302f45323465cabfe56fa5df9c63f6307b8ef24cd15c9b65ff9695c5d4523b0291ba6d202eaa2ceffd2fdfea6990e20a2a2b532d2b1a9b25b6e2d86ff37e67eee8bff8a4b0af65bf9a4b98e068d94fa58ce4fb4dfe507e65c5a9a9d4bd5f23954aa552293438d15fc8173b5121a05bf65d4d6b29515f09fbaebadf5975b11016676ce3950762531694e7f7d9b2ffe8294aea1002a7923a7634ec6bd59cfa9e44b6dfe40f5fb615f70be9f16c71929aed9facdff0b87f5ffd3e27b50a33d0f24dee2acc00cb952cc04cb6d88912f59d1cc2527208fa7ab59ad6ee437f68f52c1c51d2b74b2c86d9254c725af661b675ef35dbbd7ac0e2f48b16c36ccb7ef714727d1e9b5cf111527662fffcc9677ff7eb387d65eb437fdc5d0a66c0e5f3a3c20cb709945d051a86f2f9354d0a29a853af020d4259e6b4afec385f7916bef2fba7c5d6565cb7f0957fce9a45f9ab7fd6dc37fae7b5fe976baddfe18a2b91affc85d4b7b8e2ce8ac35522bfe96e524716a7a00dd5aca06209ec1573a209a27b6f585cf18dba6bba2975f75aabb596bee1e544504cf68227be219278434f37a5eefe322d3a54e4c49c68a289d80b846431279a984901c53744126fe8e93acffbbe0f04c1b0e7fb3ccffb3e10045fa645878a9c6f4429ad2ff02a54a7a8b4ec5feb9090ad50647f5b5f70a9e86ad739edaeabb2ecdf4da9bbd75aadb5dd94ba7badd55aebee5a782ed725b6c2b2bfadaf9bbb5b64ffab45adb509af7a9ed3f63ca2ec5f545d0a1fcafe6e85db6a4353b814bebab95ff1d5ef73dadfe7336b2d8e92bee1ba131ee4317f79be24fb7b6f70d9e72fc8fe9f3f01561074da205894fd6b565041450d0bdcad660515445a6441bbf752d151d1d53c2c3c5cf6f76e5fedb322fb7f548044a016d91fcc22ac61e8b4c39096fdbb2975f75aabb5b6eb3aaf092f96e90b2895651aa34ed01995824221565174daa2088e60d9bf9b5277afd5f33c1ce510df2d0fc9657fb0891ad0580ce1ab24fa0d3dbe1a47a73d8ee0c896fdbb2975f75aabb5f6d67b9df6bddff7e1285b7ce50f923a3e1c719436421cd93f2481a0d9461c71944feaf0175bc61147a9e32bffd17fac24e9b449121ca5bac6bf512511d0adafb2ca14949dabb9f2b3af4b8f10c313257d6a82cfb3307057896a4975d5f38f9e001ce90b4afaf553aef2ab9fa0a4d5bba6ff7a410525edff68bfe7fd5dedbfb6dfdefe4a5550aae0f346aa82ef033faf03ef072c454149dfabbd232bd45a6badb87320b68cabecaf4fa910280ae809caf6151566b76a8317145ad0193851737f9f643045d73d35bb6b3c1488244b1a91a3185e0a7e27d3bd5eea1a7b5b25dbb7dfd6be8d7d1bd65a6bad4db6f7965d63af8abdf75e7cde7b5fa7deaf8e705d772daed556ef68e7b46b6effeafefd7cffbeccfdeffe78cb7cfddecfb7bb95d648204cd9eb1ca67cbbaeebbaee756af791608a4c6b425064d22b532736bb4cf6baa6be48295de927baa605593e3f21277068eb5ce54a93eb0e5acbf4c5ea14bba7baa63ec5a7a73a87fdfa2b9d23099da38aaf73383ef265faf54f2fd76feff39bc627ad22a75a3e45f3e52abac6eb1cf42f14626045a6b56c5f2489a2db6a4d5aeb9af6dca451d7d427bba6fed835f5efc562530f944d135a92ef5322bf396916727d8af39bfbf569167e03e6faa51439579a132af299f2327bfb0d98cf319f14974db969163a8729d71773d73c6915190d356328431635fffaa24d0e33d4f06400831667e04191d08520682ddf17e9483550f653279d03095d92a993aee9cf818426a16bfa690cbaa63f06f9e25ae740d24bc8dd35f62d3eed3712b2c5b44663656753eea735ba43e77e5a05167f50d25a3ecbac813285e2e8c42008cdea5cbff41b9d180cf5aa737d14dd41270653b48ccef59bdee8c4e008bdea7cbe64ba83dcf934e5b3ccf5a7d29510883d81b2fef99d36db6f5a0c84b2fdcffffbced2f65bfb2d632be062e7b6240b59a6c8528524cbb27c97121812c3585ae4f7ff2db11218ecf221515e2cdf07fcd3f7b7984c5e143d34939e448d3f3abd0f983279b534a9dee503d6fbe2f7a356549e4755269477f9a0bebe0ff8a31593479edea77c158ec2bdf701bfb2d8fba36712b654b08b6584a3f8dee7beb7625285ef43fe882505bb7c507e34a2eefb94288f82a3288d46f07dca479950ddfb94380a8a5b4c258c2a711424fcbea23fc225896570143ee28b388a10bb7cc00f5b1c45877d2e8ea287665b71148e475f519fd1d2911706d1d61e5c4a60585ad5be8b49d7aa7f0446098ce78456c52e26a3567d584acb1ea1f6da772981a918c6d2aadfffd7622530f7612c2d96da7de1382a51a6ef6ff16eedbe701c99caef4f5dd0abdd178ee5fba0a0ae2782b5fbc2d1f8fda5cbf540f27d502fb6d4ee1bdf07e543272eaa95f7b15f3f95c24a60baaa5ac14a60eaf73e28dd8658ab85e57aa0487a1fd493ef6212b6545809cc93274f5a2c2b29ec82b1b454b0cbe77ae07feff2113f7c970ff9e3bb7c483f2a4d29ef83f2a877f9747f3d5024492594f741fde95d3edf5f0f1449d2e97d505f7a974ff8f75d3e3ea307dfe553bef82e1fd393eff249f9d2fba09ef42e9fd2d777f99cbe7b978ffdf07d50fe4b3165fc863f8a69fd067d94f97ec3ff647e7e83bec96cf11bfe2573f41bf44b33e537fc4966e937e88f4c94dff0274d94dfa03f9aa5dff017cd94dfa01f9aa3dff007cd16bf416ff87be6fb0dfa9d69fd86ff3565fcc60dfad56cbfe1efa3a2201844eb377e037e3fca6fc4ef4fb5f88ddf94df2fb3a2e91c341f3969598e46f78a22087a9ebb357d358f9430cf91233ffc7084f447c83f72c73f12fe91ef8fdcef9e07cc932742c8267c5afb495872099f9e1372c5f5cf4c3f094b26bd8e97247c3ef923129f2d233e53e18b213e51df8365f75e87cff1be9b47609e3c79922f3e93b0648bcf242cb9e2b37dd53fc47342f63fadaffa7bbaec38494aa658c644ad4cfc8ae3f2fd02305271eaf7d3a08a03f3fd94567168f8fd3a1507fc7e232ace8befa7b18aa3fa7e3a54715a48df8fa3e28cbedf47c531bf9fc22acef8fd7456716450df6f53714edfdf808a63fa7efaaa3833df4f852a4ef9fdfdab8a93fa7e212a4eccf727517152be9fca2a0efe7eb149167c7e99e555cc180c4413e37378141363a018fc2ebe64ceac7ee6594f9a66cda37c0e2f9a3218c885f932ff992f30500dcad3bc67aa30d0cc8b87f19dd922f3316ffe355d3090ea5dde4d180c23a756a80488549946a392734c191a919911208000a316003038201a0e66a12688b17b14000d67a07e6c581d4a931c4e521619630c00000200000000080640008067028526d87d3003aa8b4b259815b58911c276db056876be850021e5ac74ec6834d00478405a8cfbae29ca03c701a2c5a6d634caf5e2d22fea0b798f4bbac737bc0d2e703f152f2e8cb0282143c90f4e66f6959bd80e9b9322eba20fca4549b3d31b38813b156e59137b4a138fb65824365f8261fad24a84beaa6049a55c429ead482a7349b281601c00f2f8e7c6582fc91ecdcdb4d92144c63cdeccf99f4e9af6d99d8f097f1878c560d6cbcbc2c8d6bd8e8107b85bf1b4bbfc3a7c83146d8bf3e572620d98aa63cad7db069d6b8c7f3934d48b6e5664c78b397e62e498450d9fb8dd236aab768a9f6c9debc23a6199a0f2af42981c9be07d79549646b0b570a98f68b61b32d616c46bcd21ad6b672fc2419b128816299cac24777590a1fce7789fe961720238005cc9506c1475386ef59726884994ac72ef8316b3e3ea466bbe2ea67d93ab7c810a59baf8f31fa87e1b23c8357614500109cc08f5ea50b8d05336f21760416168edc5d31b32232123cd96c3665dee4af06cb60f14f94551e89079910fbafb366f4a28802c46b9d68fe43b3f3c9a7e72b620a94fc2065ec124922f76898fc9b198887014dbb4a647ad7b044244a4b335a5634c79e516cfd99c7d0d1afbe6cf3df253a651a1a5918e5a6a34c948cd7aadf5c0da9ec4587f2bed70e5991331e9684c931a541250a183ff2b2c7f2a3f8312d12fedfc959415277bf7d58b0e772ae8a1340ff4f9604646f090249e7d6668abe5a2a0a90f103da0683d0615e0f0265ecb9b458cb114ff10968353cfadf705e754154e51b62cbf628c7831a219f02002c6c2cd1659dccdfbcb98533c73e9a0c1757c16ae3fcb1f9dc8d8f375759501630968ce0f811b78f5e3b80d0c3ce4f5f46a4ff6ab105213c6321537ed346a1967af631915b9e81ec219789de30d72b1e284d054efe5768e51baf0a54aadc74849f45afdfeb1304b2b8dafae876ed682fac2746b92e9105e4249fc0ecb6b69a620d68e1628bc3795d79fa588710a016c1160f63f1fea52a92bda523b25374f650d51ce536cf5a3c37d0a46c0f4f52cdc9ca9ed32bde295ca65b0b131feab7f8e233f9bac7ec48cb97c8306ab67b2150358a5b27240d283214c6250c33d45729bf56c7da8b8f9b114e3f067218337eed27cfcbde3669cf5187803e37a4ddf88677d536f0066a7fa46de98adfed36e24f7bc7a8ac04088d0b16356fa79621af90b1e923bd59de17f2f2d71463207a347e85547fd67def8eeabd123482f9bce53e52e50a5543b3d8fbe1b399d5301c896eabf91ec453014606756c683e100a3ba01d39fc64a1c0eaf7f1f966c687351030afcbdf741a3879646d041a932d747e6b042c267cc83b3caad0e383bd4cf67125c21d59f3f5c39a58edcf1a564102094d2fe3ce526c7b30414892d289d56bc4a8110674682be9a27aceff6ae7c6281cee439818ca4bcbc7596136a871c3cbf24f2912f0e7b9c810c768aace08a3f117970dc488f02fb34b523c6e3eada53cc5952a844b50e720b7e89aa46e173aaaa3c8d2fd615e0d2d26155e0268f449c4feadbb56705fe0c2a5dc179410cc6ad2f80e51262ebdb9443d4b24da38f4c6b0c1229a35aebdc115549bdef1c081ea9102b46168043674fc3bc765b501fc4adfb68395e2b85df11b25f5c9b5e699f79451397589d5a677578feb074fcfd438dc81185f21c5039831a60d35bbb12b0cb11f563852ff3ea0902971d1f660668877a27ea76f614bae00c73633a26fb9c6dc8c26051cc64e1025dcd412a67a5b61f14cd670fa747e9b066a30f95e64a463a7473096b57a4adbc1c617b40a380dee49740c6dbca71db6c6c0bafdd090f6863971becd97217028c06bf7c68de6ca639053d74a8aee4c0e6e3dd2b5723c2f1b7705538359b2cc17745b57a9451498b395a4d2c318f3932f9d6886c818b9aaefdf4e01a6ac28c19f96e115decca5fc545c36840ecdc00c3e075599aa3672819260f6a6ee4052881e24f1d1be270f2014474adfb60956995a1f0b1fdfca06673a83db2e6c3ff9b94a2b082dceba42337cf2ae151fd51ec3dd525e51cfd3fd4b563c54660f18e57c3d6213f5a1f93590f0cd4a75cf92981f3bcf51c59f45ce4a44e42320e4f553aa145369a50d9e54cc2077fc4d5afa67425685edc80baba3ff60f8a7ae84c22e7fdca009f487e0de74188f681518fa599ac5423f15548a21eef4741122bacd122b06b9f60c308c7233236f75a400663be7a15616288e608e4cfaaeb75f85bb8288c8dc2af0842065e37ad28a9df184990ac2856cc2e0ae4556478a42292d2b4e45bfb5391027b4e13fe9dde0dca7ccfb3c196e54f958157b6700a5864cdd68695dd1569135656248e9fce601d322858b9c28601a88cd4e4592c57082f086cfc1bb59fc08ce4970e0d9304b9200338f6125e6b3d2ba48321e22527267e055f69338d3f481cf1c3a2cc3d366f7707c39fbd9659df11e784c3d37b3b97f1aef8c48e90f22c0b26e6bf721ea8493047fb87fd9396d753ee5251ff039ed18a55a4c20c51fba36cf901f82f1f48155d968faf3850e222c2d6118e28d97d4581701b4872f48768f13297299c79869ff47d49be348ce58403817b0b1404a7b37d6b151272e220ecb237547d9e7213469818d17a1fecae3708ef4969ae9da8df85865f459c3d0814190b6bbdb3e55956ecb735276d99b3ac9d4b01ce34137fad7fc29eb12056e19858db5773803a5dc916c46409d8226415cbb2e071f16c1834659932470e7bd3ecf74abdeaaafa2ae14c62a5265825e34f651e51c92ea9a2a5704b315f3d21bb4c116120e632b40f9fa46196c3113b2d35f706a9c5b5e7bc50f8dafd38f240a449e751010eedb74c0b553b985fdf3a6ec86b33f391e551a066516b9f2db165100b258d3a0b736311c70ca29db342a13af839e44bc89b273ae2adbd47db61af804a3d77987aa7f58d1ebae35ba42ba10aadd56eeb5e5589c6e081678ad50f49eb104114334e8dab81f71312ffbe57cc969f1900e2b704d61d08ee0a29c209fcf170f4405af48c4d30b45fde68fc6ac240f19cd619db0ebefd4f2293be3cc55b10a2ec85f46cc89e06bd4476ca4cfb5232331df2ab5f759ce58a5c74e1e5578bae4b78a5e5c4d2bb1894d46a0aed9b587d1aea4c9b9055d6bb6584890babb9c452bc28b4b78d6a7426f2c8e57ad0828f72039baae1cc21b6ca3456ca62b3fb4ea11d09aad6f1d0fa8dce872818e477e5275540295a22f21f2446197ae46dd9518ecfb387565e82e2edbb312742fece3665dd10e7ab5373466922cf141baa9eb495b7b64c196fe4c2cf208ad04ef4b3a8011810377827811eb197755cd0b54ae21875bd1799a14e1c36f7ffde87855f3359fbb761240d64c5002cd7b407076a90196e3731fcfcd184deba0558ffa94f7d3443e50370aa6f57a8dceb8f6120d808eafedb49af35eb180631e189c780df316e624688069fdf4fb56093deaad1f6a54e8160da1afeba56b386addd8edeb705f0d141fed7a11fbfdd5c23b9480b35afc212497a4d45c0370dc131f4c86e3945ef184cada7d1cdbefef60dcbc282985288801fa35e1e37cb489108256161d3ece5f3b3514da70595516bc95dc2ec9ba4a671b4f27f5c2809cae1c6f7736dab9d4e44cfae9fccef3517c63bb6d107a314bb1fb637dc8e9e7c67b1c45c0c1a6686b18778f1455ad0f71a4f6c6ef06b01e1da9e1a87765ba8cfda79510b380c18dc73884af7f73aba45e54a0c80f0085b08278d9b6c2b9c0ff8f929375e6d490f7165157adc622dfa2fee8abbf2616990741a021e6818e83b0661e891ac0978f14360e65ee16b332db38f760671933fbc3752f2024121d5f66308a21a849996be5070a872648417bb8bc5817e907e28235f53b06c2517f9d0e253d4675d415ea0837bdfc70f5f10accc067683c402c0d3edca7e7ef4ebe78cd600a22c1da97ab6b906d420d241aa6c9313cc0252c093dffa61452fc12f0681ce0f898260f1bf14761d2825a09da24a19bdb6c3a275300965ad745ca8c8f627d11809f868cb5ba0ab8436b0bfce80e3acef153f74e0899def26ff200fd3a8ef35e8c8c8432c900efa0be6c00097b688e438155d380c482f12caa726b302fa401ea0e66133cbf264f00e45b12e6ed90099d34d120ff43555c2610f839c404ddce8e8818165410f1d967a79db61db6754702c053345f363e9113af3f1095faf6debfb05cc13061a34e2fa8687c3c8ad1c0a9c3736d7f01adda9118af5fb09de9d8047c44e1be9c105a014b4bf57be3ed4cbfad0395abd671733c3728087849b59188e166dd930326807d4dde9d7481a62549da44ffc1db042ed551e078507590929db65d1a311e49fb3adaccfee30b97daa7b2081d3010824e478fe4967b9d1f27513686842e035b1cd5da17c1e3b4b0852b0627ff2b9e210b189fd66e0fdf7e5e9671430187a716fdd98e54c4c368f46130bad68b4b709f40872a70b83923d08e65a509ce2a9d1fc8cd967b81808d88e27ca4fc2a9b8b996b04f8dfee29c99534ded9e3144f385ebcfb547fc6344c1eb3d49b90cfffe286a99150e7c947fd0c1d328567364d44b3d0747dc217ce91972eeb9671d7228c176c20215e51c48712120b67456c28d6f5e475e9062737631614e461f9e411720e7f6408141d496030b8e36413150f03ce1f15897fe66e827a98cae06ed41ef9d85ccd27485b9856c8d95301018974b4c760c29054f2220aef4c1ff579161085984b9b334fb2dd6e7a01413fe207380ae6d72b4de180150e1bcc97a9ce6b1c5fa183bf07f0a259905bb821ef01850626a6157a67797062ee5bec4f3ee645a92f4e8fde81f4fa7e4c5a0a0328600476711814de63a750b29826be89e7b6fa2befe40798671b4b64f472d69192a1fc65149d93277701db1f0dc9381dcbaf8cf378ce2ed293b1e68cf79eea7bc2b329f15fc52f68cd32a2fc98f44dac66256ab6cc0fd3665c7f17b1feb2df13f6e968c7f1d6c90347cba5a9e56e9ffd061395b25f55fd062984d096064eeb98dbb2151acd47bab6429075672516b6fb9f4ea966d1818ca0ecf96e636ca4efcac255a91dae09f168f25ac8b891d28fe4c4b35c99489fcb4870cd823102333386aba9fa09457e5728c69ccdc41b87eec90c32c035ac828fc46d6c8926700adabca06f0104ed1e9a4144ddc364426a838ead61396f43de98dbf8f519d335edb055e95d4e86f98f16bb50db2eb3f11fe0c2a7fb34d4cc744355ea94d40f26525dcfa3f12b31b4b98d3bf5cf77e4b4b1cca8d012516dd88584e04393b2bdfd47bfab611e040f8b3392e75ff5c0a24fe2d5b811baeb598311f65cb59956251a5ecb3ad94a7872b33087a41f0fae76ceb5b6afd0b5467a3bb4caa9fce86186bdf73f7ec6c54a29270b8a4a92a1f1b9d08ce0a9dbb6757b369384212df6c4837d23aadfb85b78508e6c01ef8b2ba1df30bbc3155095d35cf51b76f1d96a946a416979a3e8759d24913b1a0947c084a4b5b0635d2ee232b69a5ef932f1cdf8f2e4ef68ebe71a17cb93f11b0f0bc97378ee0ed5f7d3550ce2b159fd8e12051fd48ebd400ffe56661b07e561496efdf7b678b4c4e7fd53c3602a3366b1f52457e800d1d2921de43f90fa5d3027f5fedfe54afe5b2f7277ffc7aa1ea532956bc8ec7914f548eeeb431e1b5b065a8d54607f30ed55022464c241af518ff8f4be73adf4d5b959e8662d55c5b1a33f8c40f8d1e94258918a8cad2fdfbfe677f7c83c7c29ddfed3b7ce79ddcedef794ccf2c07061d1a8ed69fc77df95ceff09c773c3f87fcc3ecbf8a2cffc346a37599e57432f9554b1109e4b08c5aabf6f097cf9aafb547c742f9281cdd12b147bca3bdeef540f889fba2a37751f63676931276009168797669d04eccbee846121a09b5b6c520ce50014a20b8fbf5407cc3d3b5bebdff5feefbefefb77bfcf7f371bde372fa7995b2eb6e81b516a8661bef39593228912d7691486047b7a03cfea5dd1e96d2a02f19b790f80e138f30cb1428cceb7d3f8b7ca95884923e88141106f04f7b451a9c54970142b0c737e1c000505262fbf6f390547a4ef54801e991b703f15bce49818098d68108d2729daa7657ea66aa5d5b0151d5484450a213a3c7308452fea5a597a7a18bbdf7e9d5e1a6634541d55eb8370fac1ecf673ee5aacb98ea60eab98cf540273e2d5917670fc543c9b1b16c6bf9adb7ad2697d53ac3b0f7bdddf37a663ca893c824a3493e9c2a6b902799d60f09fb754cf243897b1c2b345a6f0270dbfab704d8fe1b9efcb6ddef9b2092d7a5b330cd1e6d1e000d0eb224582013953427e2ffbb502786a7e22a2b250626ab6a5990bf44118e96cffb99a470d2f2942888c2fef8db677cad4fd3b39f31ff3ce76f720df93f1efb943db2e3f66bda10bb13c85a749aa9f629742b2494dd76d4ba4f5c29158862850ac13a612eb2dab37081ecdc9ffffd9bcf754c3ccc3ffdb6e7f4ce67dcdf9e4f20fcb6d3a0efd1b6ef9508716ce05745aa520e75bc6cab69d7fbe39eaeae8a458083d923d29e882c6db664813e41fe77f421241c00d2f8fc014daa90c7ab2277d0215ccdc1378203b647571d59620b98503ff22283963c2680816626b991d8302a3c87a0b20b41551d539361f142830198a203fad0b033360d557d41e32df491d30fc282c95cf5423a609861e5fed3ea1226d0146faa9d3aa2cb6e90573994b960d7c803aac1379997e900f4116cc2f9c2b732cfe5165b3defdf5eb71b050ec92425c155a9c5e9b745435da44fe5284f01a5e2274552a459340e0c738437862fad3059ec5603cfacf07c6d932d6d90204353b5a889a1a5e49dbe1b4b8f1b17f14c22d5825ea32498053b6d136f221e409a59d4902c463fab695951e8392d1b6766d6896e6e7888f533afbacdca2ebebbaebc2f4bd1e7c6d497d1e07bf8743a702ffeb22ef19e6167449d33d14c7b062c1edbdc4b84fb54a44afcded3efe7755f198f99f48b397acfe88da4512b3f99fdaaacc16922d4d107a9fd8736ddac315a763c0130903da190ad59119d028569c3795de4ca2ff129c0323f8a92ec3ecbeb37e6207d2144f407f285543f9ad8be406730e7d417949e7b61a470b87b643a79e1ddd9fb5db6db8dd97df0ee3b696285779bfef1b0c25669fad05be30c0bf0116d12444a30d8b3a072ab48aa4e7515c3f03f4c80e9f21fdbfad5ea7ada76e8d1b62b65533a038da3812b69357fb0e4561abc98b3aa10cdfe282c9546fe023e0aed61d0130a98c215502afc7fbffb079400449d8591dc2f6b98692f50267a04484115cc203a7cdbd0a3ed420f5dd245afd192d09415ea474714af34facab5614727e7f9317e3d5fd23eb5d1cdc4643a89909c911fc9a896ad7ca0eeba00f9afe0645350553c11fc390cddeae021ae985a73aee991b46ffbba0a68797829211b6217d0ca8717f4b15ee1bdc27ac5f55eeec5c3b9cf01add0474313c187fecb582aea49edd5a15b9f98e9c9b5f45a3397203242b03aa3dea45458dbbfbf6d4af508331c57e6baac8af71ce1320870cfbc0f7784c0a6eda9323b8bb6054bf00204f4506f839da7b6c8b665377a0c91c0c1611c0219419cf7dbbc9b075ddc7606b4cfb25416566f44f137e8028f37882bf9913848cc75afccf411ac58cd72d9f319e5e652e1d3fefdb78a4d00e2dac6298c5ba6a0ae62107029e526da3f271c5cb885156e03bb102c3a5e0316b82032eaf3895d12e6661da2c5067e830eb0463f647b25712bbde29cf184616d0dddf7e0dc92ab86344fef4684ec54827913dca313be5c7d61e1f3a0feb1bd7a4074a31f3ea7987384a867da6c7b72e47ff9ebb861b375b294cb2453dce955595f9ad31802629e18393c92eb992e39758efb48990eed635a73a90cf4cc411f1fa6e887c19d6044ae016c86395f3397a52a55d45f88685e14b2ed41c743a91e3a52b0c36c3c9cfb46f608a28f4904bfda09eb8da3bfca34e7503ace9ed10133c1afecdd512b3435aec04345b0038c54662755093b9f0661800a45693ed99b8474ee21a061b508e182b5cce428bcf39fd7dfbf51865e540360ed48e86687d8656dfefac52007029b041ccff46e810f4b98bb37b15286fff53e267ef0b859f04da0f9f16488acf5d486ee16f9f5f9b07cdbc447110787935b8cf7e32a0629bfcd52d96e3ec3247441cd30f8d0ec6ca031546222e223eeec28c005e136961264f9498bdefb475f17d0a29679af2cf6eeb5f27b6de995d5abd5353f76ad37aa7276e9c227aff4bf80c7d1d72e55e5b3d7d50e7bf5464b7daceffecaeb85bd17bb5776afec5edf0a6f5e8f75ea96a51a1b0dbe9a76360bc6f622068f078a009d8e0250710c53d2584b7798304b2b0c94e546069a7b24dddf7b548aa3933fc9cfb795c7bd7c14ba1a4dd606cd728d47f838ac398ce3bdfc15d0a5e15fe9fa53290f7206190378b4deeb6675b660e4958eaab434021194d9bc0fe4624103bc980ae402233bb3fba7104f74bad534a13986946da856d9206ce0752b084b55ccaa680b5e78e202630e359f14c533903e6af64c27f23f669b129b99e1eca6e8571e9022f2b9c118f6ba35bfdf95098987c92f7036a215a3c8c0e2b9cb0e7b233be79d0d891f1270467ac135a4f52bd09d8b3683430b86a71a4d5af93200f145c908c3cbb61ea63192c7944f08e007c8ba9a27e0886a32c0c9128041e423b41322fbd78f3de81e8adeb8633c1b9260a119e5d5802056bf35cb0e66811b344c14598606ec2450f53939b15cf5ce064d33d39db164764d4ba3a1fcd827fc18d8ca1144e75b25134bc5673edcd6b7681c4d9aefc0ebb47665ac5eb1f40618ceb6d9585bb5330dbb8801220ad8b6da82f3ac932fa878b6650671b00724f1cecbb04bd424f1b83ae215a4916428994db5d52eb3545eb7bb15e123fb02e9d1a1aa4fdb047c3289c0a08a9311b85cd4d44e3a205d57af4f5220cc64102f965d4afcd66298e60208175f6a3fc38ebe1e1d87e41fa444f12c0e8ddd62e9ffd30671cc82520b7b292bbe4d4998b40234334ff50162ef849232bb44ae2d1c3aeb4da65ab8b02066156306a4886ada215bcfae5860f9886be19ece471ba7cd3c5ad3c2430ce19bca18d020f4018107e87f8a707203400bde987d27f4ffeb39d77f06cfb65e406684f0451d80399d9ce3fe22ab840e300e49ca20fb78a062a8de4dd37ce004b8a6563cd7d1694142e8dfe7d04ad4f96afffea287fd87e84905e80ff0ea75a3f6df780d7124215181bbb76edc0940de4a9cb08f21072345e8666b9537060511fe83cec5a787563db992ffd5409cbf431b6b8076529d144d78e2f27eaa710ea681de0c0df0e46fcc00680a7def2d68c4a31ae53f3b701e1d0de7213bd0f5b96702b380070d064be39e1d58d92cfd8d12f3e76b7cfe11e6790d2c9ca321e98892dc73fea08d8e027f4697db500bd6926433eb2d626ef98e0123207d117f3d64d58c98a916975de53b491a48b7fdc1509ed08da50b1dcadf8cde53babf6569c7407fda08cd86456806396af5be8fb158bc23a3779d11071e16d752213e1d968fc2da058e71b5319eef9492a36ba1e6c3416411179084551294290911f2e17eeaf0a3778424a6a4f98adf59a61ea855e408a63f882e86a3cd860b0a9d7c70fbaf0e50cee3fcb5ceedd93a3c005d6571b9f755b520090046c8b38071602c7259ed00f466d93c6a24f7bd1fa3d6164e054f59c4aa08c4c2b48b8eaa085c9d5b5cab47ebe303770a0010ae1c0b0d3113c47488c5ddcf33083ad783d074a80318782b43ed26d1a516e95dd4fa8a5f4f866807cdc6a21b690e6ae0ecd6683756ca67fa027cdfb0d70651b02d959f3e5cf7df7aab386cc30e366e9f6e68b0bb313e65563697391adad89d1a6747c535f683bbf55c91be1c997ffd95c6c99930ec77dad9f6e741008adae5fc67f60185f4b76702e262b6f5855aecace3fa35ec56a50617563a89f0c2ee2cb5cdb6263292afdfbd34a5558719093667576e9f1ee74492275ff6c1127d470fb7b3a3789a03f76515d751dccad187407b77fd2c1894ad0982e947167ecc19386636b7f106e6dcdfc07c26e7b9dfb61919fb00d686c67602f08b4e75b25ec18f6247b9a97ea3e4898761da35d466201ed8c6351409ef81912d8e3955f1b7d3b5c2e62af92c5250017f4866f89ba5a1be716150a5366cab2065509e4a7d07e003e53644e059c116620988f62a63837cb5d40fb8e445e49bc94259187f633d21cd9fa955515c24eea04f3ba899490f2bbeef47ee9399e7216b026e5708f97cb684337799c10fc76c8109aefcafbc9febf5a43dd27b8f08994addc4e24e79e8aeee5e8394662a8417d7700822287c84f3c7e432c867be717157833d9619e00518e0c04f383c874b74dbd65bbe4670c97dab1b59203a50c0f15761043e15bd9158b61a5fa004c4afd73c5ad44bfb5aef29f6b538161e0e5c1cfe9abd410804df118ca6e0218ed73a5717c4c18325e531c7e247d41371f1d5acc3d88ad7ce4579dec480c3c72c6e5e97bd569a4627e2f6a00af88c2b5480026f3520c6da5255b08b54ebc15e4fd562c3105346ae313db00bf2e04ad16bc7805375915a86b34b574af8fcac0e94a874f1573a5d46a58cd5d55d41360a60fc1335f806e6f1c2fc93800415d090fd62bbf68b19a8f49c7d4ef54e76d73b59e13b842e7a222c95117e186fda6e9c2da462817981c7bbe09cb053c491a0bb405bfc5d28635f010e82209c34a700fcf05a16c172cf5fe57c6d568ad2b5bd6f80e24b3ee8f0b1db82000ad02ee0fea92116dc556f2de48e9ecbc618532180cf3384558088c1af2bf641e7cc07d7667bb80206406ef720315486aed330b64147f54c2428cf15b7c3c23f0d744495e91cd04860cb923d9e90c830eab3065128b013443b5037f400bd12739aff66786d99da39a940a9e2b5dc869d43d88ee5d3779ef646eda67afa6e2bbd3c56f29d114f536547a47ab4c93b4cd93fb4459fcf64379b057b0b20e6ac4cc56912529ade71c4e748037a5f3deda7124f7877527704ea780919b243f4254cf43be7feee74a77ad96e71f133abc1a928fa0ec10e895f0b29ad853abcbced3caaf8dfe7d394495ee750c1ad5cc7efe46456ae525f074bed0ab3ce4f0e91b01f9d4e9b4b62269852b80d032ac601130f359366a527c7aa0317a263d9612196da6e8048739f90566853e5cc2fb56544b12df2766227edb7298edf3adaf54b59ab68d2ff75010986f9132d8593374e4ba444fdb042072207c9d131958113d5a1ae35dc00fba40b569d2d7729231852613f118c2cc03732c20a4b57c5f41e03b685e26034e811e6ee8f06b3526285c6429bcb78914e398b64984e8903302adaf6df59fad6da926c063c3fcc6ef97852c38192c64a55517209d682623e4139a24d824e519cec4d2b6577b1eae844b3912fb98f51dcb209df9ea9972979c4ce82856d38ef916555067e58b438490a64e346b44ec9f8a49e140c7449cdce6568e0e12783d104ac2d003ac3404a3c2ddfa293fbde930795f84786714bd2b7b22441281233061d2493d84c586a30ee9c4ec4b2ea1ac9b4ae5a6397232c654852e330dd0d9acfec39b937da8f6cafb69d70fa4740d6665b0bdaf294e4427ce80b4c28dc0798a81eb1df976fe98ea5611e8f6984053a19ea48fed810f659266194d07198592fb6751fddef5d5c00eac47db1b9498d4cc34cd64e51474f9c48dbb1b44d946db87085443a267a24b1af660c01b400b7b45df22acba80017aa1b8693516541660e629b5feaa458e2d62d285e6f1f6747b5c58ca8f64e2535b24de4976b5f05e7b91dff6006e006e0189d51101aa5b4381d822f9de6798a1a578ec90df25faa79c1507d02f5d2679e68e0a95c937451513c75a508bb359c3ceb5cffe0066af0901b7901131cd3de677b04ec675ec32254c6081a9c9cf0071aa2094aab9fe55d0c9533078649ae1c1660703ec20f30e460226694dcd640736c0a00e25c5375d699656124536420bb9197cc5cb7f5e3154491a7b01cbcefd2cc0d2fe927c6013c06ffaee98d2b93c34b580f13261b363fa9278a6c25e58716dde2ad36d25052a7a454fda71cd442d5f10c586539cdb6972569acf6fae2b8d7c8480cb2d70fa0acdee250aa3b9480686511ee7a327e4e5e46488f438e46c7de6a7125ccabd54e131a0c4833b09b865fe6b7aaad3816d4a3eebadb771d2933972170d50224f6b952a42bdda5a0d472fe6a794c0ae2713e588bff422284bfb01212f29b0c22b1fc255af0efc96315c70fb21c9d175cb6906ced58684e7eac2723b412eb3a3060eb42849a5d58c5a4959ba9b808d60c58638a735fa7c9ea3dc9b82b2dfbd3b4bec98f563899565f6973bfd5621d9ac8ce34fdd3c4fd3f66c27cd413bd72557461d33bab96f7085f59cda3ff2f8fc5f3d9536290d4ca87986d52eaeb3439bd5a3dd5f500a7c45d1be7660a59c8e8579fe62d5a09990bd61e9d068dad5102782cb57ec11d1ec1f92fa1a8c7425c8e2ed0ca6d1d51d1f787853cbe982ade4f2f588b966b5a84188a5f70f893a9f37d0df6179ae1d9bf5293a5d6fa3e8efaa9c2ae661faaccb3409953e389487600fe45b8ee85ddaae8654ae74c0037160a1fc8785047b5658510948e4d89f54e64636ae2035142ba7cb7761bdec776e4dfa6522ff15c0fb636be741fb42bd1d8eb4618d08dee4929a2feefb8a5be614c63032be988eb72af8a4641150bf7e94a4d1506220d4fc3cb91c56ae47253215cc6166c14382b66c1dfbec8caaf58aaecd1f9bfc7ab93b19d9452161a14c39eef6095f424c1bab921e1bb3791aa6b260da5366d93784c61582698b9df9c9d487e593acec6e875b91c5db798a76cf5e4b4afb2694e3398704e776557eade2db3e5ef9b1dd346476639d7d34588c8d36def837017e3055ab76312c9befa51ad0a68fc3bf0f35a59423a3793d0b7f64589dd4b5093648e389bc6a05638421665ddda90aff9f3f4d89f2e4f025d72f4c5404e7844ed4a7bcab3474741afb09efcacba8373b95dfd34f0894ba24be90259cd777187e9874c7e53e3f5d7a7361303ddcfee503f201dc2e55de9a60b594f3534ecf612e4863678bb1cf55ed1b517569f47c289fffddd90109c2e89ca69f7950f97a8164628197f6b0e8b1448c764a587e0d82c9d070c44005aaa1b8ba300140830f0a62d3d23a2b642800133ac870fdcf3f944757329778dd69b67692cefb466b2eb07010c267a32fda2f94f7ee30b50dd94762a0ca6ef987296a39ca9e54d84d00038d2fb87b2338d2df13e445278397e67a5074e4b81af4fccd7c0a29d6b548fbb5d139ea2ff0b1ee1b3d7e5e07809a313b806386081cdf8ca7e44594315205cda807ecdd8fb99fa3b968c5d72085436b678ce7684ff07e1be40fa463de89ba8a8c668ac289c9a5117607a104682c3a1c194246a3fa935177a61a29773c82d1d808cdbbe775e2cd78eb233a66c096cb53b6b6ce6bae797fad473f392f33b5c140eaccbc968363d8d9b88ac083ac00849e0b00c2b40a41b796103cf8e3956c661ccfb71d2644ff729e489548db91d012fcf822b22126c9d4568c2d13238b912a2f74e3e1a818dcd1d1745f9b8e75c91ebc8ac994603b84f26635c97f64e6784c37c782adbe2094d1030a331a9c391ec2c8e02438426dd2daf2df0e58d1f43b6bd146f48d96765777de313cd62e739e36c47eec1175084cc71183e98201a5aee07883f19a852ec3fc5c8fa8c06d499361017058c252324924040a5114d4ebef17d1f0aaac941876330e89406ea6cde7948509226d48f9675934d861af06138f83b933b1a5eb84d06e6319257ce04c7d149b354934d514f9a6659fc7055dc8144c8d98466f313da202b58b84f98a8ee06f6538d291a32a4a09870959a473023b7c5f1f95633fbb9c7b2f33515c828932bb0ee0a878627373e89272759bc84a8342d2e09eef851e81c24030dcbac31729f105cd3a1a25a86b0bd3c0cb0fad0e1a070addda18b5d30175c1e2fe65f33d07e490e4f1406a5828877c0434c67064d01e6e42f2ee9b62c14d9b361538b13d057d805f2ec1af6fbc80e1f35eff2cc317c177c897063e40a7fd8624c88d95122f9ce8a00eda153c89f750831f0fa227889e3af1d4de64eff453088812223b5e96c67c48c95e3934f46666eab9cd1493957ef5ff947ba2ce6186e5fdc9089c11712fab7cef2120dcd5b608d90e797a5b201358118c4e4dfe9f52d1352e7cbe15ac3001d0dd3d6d5765a58422097896d1ad8a2a59f96183db782cc5d1b3466aea855bc6b4a6c084b4d01059b35855abd00e657595e8f6fc23dddd102736be2e6cf8492c397ac397975fdcc3a9ed4c932394a1df56cb22cfa55ed26f1b727b3932683219d0499eb928a75327ab4ccf949deb49335905bd0b09b22b1ac3488893e183dc3a6b8a5c4a41396b658ac7005324c3dfbcdde92e13cf5cd2e1da20193507f3d40dbe9e7353063c7f7b6ab934aee3517d3f44897e35fd6abe91962c651eb1edfea486b3df67a540217e8c2ed26e72e5c2302268489d8106fb954e6c62f3035bfa14accc11ef42d1e4ca925e9f27d6a849010d6fdeb69cc95ae01c35ba34b3fad0059f5c19e16d30fdba4b0721041dc0f29ce715989e10e482483bd4d5d25f4471108cb7e28d9ab25b549f0b068f15b019bfade8f9002121088144a5b73d0ce54543a2b8b862f69a444db5ee8f8f09992bc163f3893c5021dcd99631f53a364583a75b7c12b1f243f21edcb2c38b6db33230789a7e4d71ffcb0e386a47d00a56aafecf05220bd3d06a59ff9e12f83c9347ceb35f4765be9f31b309fbc2b8fef7a48f3a74ed8c291b3d9e9a28c24a6bd01a1964042b7fc27bb019ca0d77a4fd860b4712d2123703f49742a8a81e9a226ee74be57025ed3853ed9f1fb59eea17d2d1726d34305804670d576556c9e81fa983f21d44b5a9cc3e2a3c583f5e86aa66280723029a4d3d65e19b40b10ed508274af52bd76bb483c72b68eed3193d22c7a80cecba3521cedd1f7137bf98a33817f2ac240974d96d80c9aa80bf870d384067be7f5cadf0029cf82beb0188156f6ca5066414fdc798eb00f8b51b3fdc571509b64940be35e0034c7c0b58a07b7ec9c7b45733a26666e7a6ba6346f51d0716c918594f47a87aaa426549ecdeb45c3e840b403dfa714bbf6a129ae135524e93b554658d42e570856292bba6fddfb699b1c5d3b695609755f70552697c108d3017a1573c74f8f827eebc4a16933f734e8f3ad5059113287ef03834edd3fc4e0c6259d3697da4d4de3b952fa3ec52c6ef2da87fc1d5e13c61faf077c6245397b86b2af22c6921f300dc8dc83371db87121ea953dd243c20f32d101b10467e4dfde313d54ae23fd85a3ae3bd6eb113ff270371c4328215aa32e91e37dc5e2463dd89e8183a22555f4a143adec0f3c39bd29ddd5c901ccfdfa0c75cbf80a62fea478821febb7bde3faf6f58abc8454e3a2707c5823bee5fb3615cd340a89c2da01164ed926fc049beec5764d369ed2339f4a3fc9a67e8648fe77808c7c227244341c5c753e42138d623f0a57e9192b3f8c93a094863b30a1f69e5d1f948e187c24a22b0e78f6540cb0a4fbee7aad2ed5a7c7499c9423f05308480916928ab80af37b6f3f556928ad82d61a03bcfa12b300398623b45d846376d2804172a5b1989d83cde1679be9e0ba4cdb603f6c32816725560c5678883c5e1da10cad137874e47330d2b6d52b8185fe3e297578601ec8df975382117ee9da4259172c57426db7704444dafce1686038713dacf3e01d586d7ac34cd69b4eacd2e517c6dd39cbc5848a38ef748525bc5ed5a4db8e2297f4fd8d09f7d408d8682bf7ee2e263c7674b5647617b976ae60ee81b92a57374d1876c4b604ee4a850974616de9bcd435c68c08275dd0e627b5073cb43a8f8f0f2c789fd022d43f6b6b505580b1a5779d14d164853bdd690465242ae603d463d29a7870c1c60c8424e8ffd12bad855fbaaa8a93387a5c34620b2e48719e2bf8a29e7075b062980c9f76b5fd1c06afba18a4ae006eb38bf302c8985d5d9bd04371a1614b4aaf83554e0a17171d0b2aabdc78f6351fdf7bab2656868723947014f81023692064ebd08105181ea2b260fe6365631405a49407161ba98e6289dca5bc3964c236e6888cf3d8ccc6d1875172331ef35612f861c5d8adc75e0221e36469e391254924cf61938ccc961c8d4d4744d33b542382f6648cb109f04613a0802f60c8262f9b54de9ecc4c3af90af905addd54de5e64a96c09e9a22221e7a9539829e4d3469522059be54436cb607b350d6ff989497db013da7e1e138bf96664287b7d11050ed3afa9df125d7031a12fcb0389790430884f46fdbd5c034d6e744a196acaf6e2110d91392d3a0b29b2d945d56e5889e1756eb38c7cb72d2bd2ed457409034bdd9c964c4d187bf3c8b4c9c884810adab28bba00b69782845d4b5049b5cb2a39aab711439f3cdc5311d446eaa704c966f2b1126ab55cedcfc0c6dfe17fb66565dc9fe681baafd3f3ff88d3beaf693fedf9f66df36bd925f177cbcf17bd27f87a9ee360317d8306a171de15773525366ad8b0b04ad73c9916d9cccbf733a2bd8f53ef2389dc8749c61b275c20ad9a1495f4f2008411ade559235569e0507dce924399f84f734254f423c154b5e403fb48ca865a614e1783d4eac896561ffc6307d941d2d04ab3a9233937c6a18b9a4e718853ffc452d4536b19eaf88c24b24d80c7387bfa8dd81042886c2870648ca0d1a213643b2cd1f3e83796b19910bf20c306d8883c330a17077ae8d873117241a4563568e5294d2e51bcc08d504a349308ec5b84fc8a134a561c3bccb10b5302107d1f75a4e9d7a7f412c203e51f0b52e4549e09df3ee1485a99716a09b48a7418627cd4607d533d85b243098b93ded49b9705b59397f7f8e9cd37f8729b1cdf090117e81ea3f1168eba628cb41768ffa73ea762171e952a93a460bf38df6355250c0fd276fd18879608276ba8e7177af2442baaec2493ae6c64eaa1cf7025990e2b4ad8fbec10cc1c18ee4753d7f44c8d73eab14a0c148d83d54325033597479721c8d6f86b75de3205b53e8c298f06ab2a1273ae650e92dc05568b1596725012854c0eaf6923385e1fb0e9c7821b0b4350ffdd02956fad4691157f5dd1499942f5d6e524c0728f5dedc28431f9bd120397f4f272ecbd9691172af766555e21bf97a89deef081f8947186a7bc90e2e6cff6e34c56c58bda906e21167033e899da5e5b3a11677bc80936ebc441c2431cb7a4c13a1b2b3cb5db50f1124bb274969230f4517242380dc81abc04b3dda6caf9c40137cccd904ca4d77b81a0813ed469e050dac91b08b6ee47a45a1e1a5bd6e5a161adf83f98f347f1185afa4872f529f77c7623944d1cad5acd616b0610e9e2236d92f0ce3c93fd247d1e2b78aa3f0ec68c298a8f1aededa57cd22cd1125f2b06e36be649936f6579e3bb383adc09457988070e80a2594557b002642081880a0e57e940fe9b9bb83ec434694e9d2768a4b6a68a456c5184f45cab03383a26c1eee1c63575468f15b1de4b0e4c622320cd61b031cae6944aa78264a8a4f4576b445cf9e9fa8451dc5cf49d8ed34ad2543d733804af101cb4bf0304c0b09fc6adfeb04380d15163ccd40cb96f6265f4ff9017601b9a363a32d38917e4798e6c970edb6d48088f9fcc8d0858c3b8e077220dbfa0f24102d9907321ae811c439ce5b79b1653dbbde01cd5906317e822a8ef1d9125012e8ea4f70492148611948d4bcc425fc1687d7dc893374798673f2a09006912c9341b2f745d1478d5803b25c488ac31e1c990e2c1dc6ddcf8418b140e38388e80ca64f9b0f05b81e04ca5744706a576e13cd792c5325d95ab452cae4555751882c7be7fa1d88a7f3842f9ce9b0e9b720ba9a6a300e2502e4c13c2ac363945b9613918085c2b365fb2f223b56bf94a12d6ff0b6e1ecc2807deb740f4b73dcacf6ab8da8834cfd2b06b81247beb87d9ed8cc043229a125c6a4200ec9d726fcf0d783e40c0f5b37f57b56100b4ac23c1df1d0c5fa40b930d138c6168e4827fa659020b3298d16ed712c493b79d8961c8d56d72a654bb462aa6bb9036bcadda793e5d352d4f892b83d96b30b8b1c20804d3439a14ca145feae2968b2982a7f58e29a2c69797ec4f041129944dde5b93bb2ae3128cd88f6507f94ca62cc5f913091eb4c5e5bf0d76bb9fa816d8a8f8202981779724c88bc5534fae0847253bbfaccafeca4ac0359af7cd1e246185ead435c6da18a559ecdc4a4c6e30bd0bbd3bc93ec8d8762c3dbade3a80e1670098dd70b7ec0402f366ea33ee62c2d7b4cd04c729022c1d5790d490ff06379d020d47f6b9b726cf43c36c76ed0fffad2899b8d6d47a20e1033b52f64990168f0e9e120e09f469e2bea610cbca4b4b1595e1458391f90aa1865796f0baa8d8cc7c38d57fa590c6049e16f1d27e5bc3299807ea9be7ebd012850717b5ac2c7883665f627f821933ab391b3cda4244dd8eadb1249155a8493d7f0410bb0334577f46eaed76ec48b1353cd2991b3f9ed17ccc7d9c481902bf405d5a53e11dada99a900a53b4603eb3db0e761f5e62115af4b41321a8f6f99851440473b71745631464caa335319e3b255248d9fab28500af20651c16604a8b35c98737bd4a964e124c81a82db00371a3c3893d7afb4ff201c4d24d3bd3f6461ce338644b6ed84c62ad32a0907c3ca19856d0dc1109d6071e0056c130549088c7a58d4e651c80fd841879092642ef067b6af571ee713b9a97923dc3e4109cc4a880f4d5d29438756a6c5e02c95fd819fafe72f862a5af01f23fb8b9fc74778601ac91c1faddf4af2c2e18eeaab24c9a09a2228a8d2a94977c0639ceecb92b2687007155c71cc5f99abbee49f277e7e9333aaa0e7b5f3d74fa421b1ad2876c560d35cfae3b91f395a785fa5ebab7afcc4c20ce7811f601a4f5690c1dcd11aeee5e7c53c3ed043f214e8cb2e14766c08b713b3dc0edeb6bff24a1c7c05195d1e9965c3aa96eb269976fb4f28a51f1877d8496f9593cf313fc07b9c04f04880afc27a550e52c8ac5e5fc8ac7c1e734a9e0793f94f5c219d960fd8f9fa07a3efdbcbc32f76a5a5636f0b122386c587de027769cad2b49fa034fd7aad1c599fc4da9cb44041ad5afc433ae0986ef6454e8f2274856f983ee374de776f2cf84baf9351f761536d03bb39f748799ac8ddeaf63cee09b6a702ab47e89d3978ad91f5df760a7bd94f4849d7542670681f4695d195aaf8f1b1df7d514f19f90f00f64c5fe9221fa8bac90dfe404ff412e403a014e857d4ffc64fc9928df9a65157c926f55f2615f4c8df57d12d3247fa7d7a4f1e7eb03df21505efb7d7347dd5f1bf60f81f2eee7993a4c777812f583c92577b7625d98b796f1c2ef79404405ff9324fa9fb0b09f64c5ff222bfa9b2ce1dff437e1f2cec41492ff26aef77f4fa7de2eae0ab07fbebeec0f45312e9874fa4acffc2dcaea688b6ca4ed3735f67f314b0753b2107d9f69f9fe1c9ba05ff96917157fe1981eccfa46aaf8a987fd9108cfd58da732e68dfdc8e78ac83f4811b29fff695244c2ff83c0fe17e3ca7f82a26dd41786fd98680fd0feb9a6d2dae42c10e1ec179650d5c7bd134584fcff7a647f28c16801a41bea7dbebdf09b8d5b0540f47da633b5b7ba3c79ea2669f34c97ffaf78897ae71ad7f8d0170fa504ebaff93c6baca099d9f70578e2346a32a8cf605daf0c09c36a24f8d9450b789202594511bda842d838ef665224e5d2616279ba58c3ac0749790ca09ab1bc2a6e8c2baa53553e1c49e54c9466d6daf50644ce7175fa4170aaafddd52546cc18762af12cab94342bf1739eeeb1f605a6a2705595bf2850543ffbddaad7a6ed8da9c6947d656ab2da010654a9f035d74aaa024a0a6d008a4b3db81510421481aa9b8e2f85683abc86e33d1a54f9289315bc7efba07fbae3fb957e7f5ecea9f7742ccfcc32f120f524ab9971ddfbdb9e558ffca43094d5e49668f3a9b7a9530f72dc0d0c452279981fb7554fa621ec98afa2b28f516227ce25e9a7d620a693d083e3b19360b80cd908d849c01003085f6f159959e81da9522f29c851b1929c07c55e484a62dc6ad2d7eaad6a0215119caade729acb21bd16fb35b941820e5eafed812e988c4d81bd145886996bcbfd1473c2614360730605471b805ed87bf4b71f18575e4017e8a28b2b8544b85277ac5f48fae26689fdd0d8c893cbe20d6771ab8bac09f111c812a736e49724ad537af61b99e88f8acbc372a8986f932feecd26027f695a7d0c2428456ae3791a49740596dabe3cdd5164db9c0a4b4986ddb1b6a2382f2205df7af8cdb23cddd912de7bffe642ac7f60fc8021a216875f13c5891651aedbdb0f65dbeadbda41f3b222f3a09dc7d540d39850ce8a31dad9918ac448ceadc72f6498342b10e5ecae1356584ff9ac26374fc56cd8b4db9ebb9ad571544babcde665e3bd97771f3fccb9079b9503104b7bf7be8e466f6fc669268e9ea466fc66d68c8594a7594dfd11867edb5da70c59ed6bc9e2ce8ba7e933a14d467f4bc9ed9d63c276ee4c5b11d46a5085d3c762e637576a3f373c0f90761685060cc34db57a6c1c1ca3055020a3c441ba5ef92e69fa24601bf2564911f3ca7a75bf9893f52eaa7ea40bd47dff4659ea83d641c4952aefef4e519a4116150b42801c940eeb969829b04f41d0f4375536eed2954e93a8d96f1be659b54f12661820ccb3a33319a0865512ceeba836a1782091257cb1ee4206765254cbffa61cb8b71ae6944341614a4c918cb524df0441b6b8ac174331fec031d140cb5312e2187f43b94f0cb34e2afbee36425978c204618cbd8816c61e61139297b0fcb3b1e4d8741f735889653a1b361a0ae1dcc80d8d60f0481eb3dece8c5608fed5d20b710362022723a1ee432c5d39d296ebf3afc028cc74e8c97f7d124f181c1c4953a60cd6d383fc080ccfe978feb74dd0c608f86e6b0de3e455b50a00df1112580a2516fac9cdbbe95d7fe71ae91b049f948fb55e3771ae0f925c3302c05b4401bd050aaeea122c225243043a17f5e68bb238996ef2d76a2efea42e83e12bdcb0825d4d32290701256d092a08217bdced365ceb58c00a5cd885c135feee6ba61e71d0125acf4a8fa7e54baf3f3711362cd228c8e97912b8bf8d85d8f0975e02b3810ea9388e65cfbb6fecbe40078b0ec4ca15f77cedc87da02329b5f2c77ef8090e223a896e2bdfdc42aa2292547a61612102f05d2157d57a82cefc9fd0b16f1629fd0a8b8bba4b191ded30473d807944a0e8902a1d37aab28dcb83e38d767acbda4c761d4180f65f03675fda72af51cf2be31f38934a099d261df7948aff2dde2f998095b4594e97b8e6140ee9d00f57bd6741b65de150deb6eb948469126e61b81c93154c60d4a2af092592a6b0e3be5987cbe5b3503d4f2d383db6a37f0e27dce5bd4228150e52b3a0e0a2ec96344d2f4e51b299436727f929e784fbf1c32f384161652d970e842d4ddb3c327a5aea79288c54d647db1f1023c5653dc7cf19a091305c61f8fc3e624255947d20ecd5a94c55c1ed059d6ed947956c7331d4a538b8a9e39d46d22b3bd35612fdc582d60ac1916cc83b55722aec22a2510353f6bf77dc502c714c6927629a790c6609e11779921c14d437af4c16837ec37236884fe4882373b504121c8baa28962e854f9eb110c9490300de20bedf01aee5128e2cefe48a0ec55bba41ddb093992288980b7798a3aa70100f6a1e9e6edaacdc154e9c16cc0ffbe0c464be1bcc7358180e1d3da9201820776106cc99bff112a8dbfc7c0ba7f20cc35d54fc0e84dab7f9bfb29174d49c6f4ed95eb5b12d58f93620411d841b8a02304526519f393af94f635c20b9887f6a59a9a21280ee5412dbf6789303fb3d356ea7a1cd6b8e118717cd81caf4699b49ea0b95c4670ebbd5bba87a208204549f456fbf8085438682600b01df6404377e2a5f8f777b3056268afefd780a4dc2636356f33855bb48ac427f46868493245734e58a3f9b4655034ff00a1b27370fa0245e7a856900074772674dabe2532cb9c2f3c926f88a302e42fde20d54dcb9e923f8f96b5e5af7c04e058833d2471e5bc86301393fbd5f6cb41f9b446f71c5f0e3703b965317018aa97d96889ed77c5bb7cddd4cca9db1771999310ee7ec9d7b341805100c161cca49c72ce5fd8a14cc64942dcefaa6ada49d986ed29e768ecf13f62c16c8a79ac6789fe7d38dc909a49564e98b51633721a623c024b0f861f0929f278ce3527e6cbc8cc17fca8fc6f625ffe9184c69e3e231699471376d199d438387e19ded0ebf09ed95ffdc61aa169e3ab975266df4d91360969a0446d304d97d4aad9234cf9a60fc2095e042cfb3a454b61c137c0810e70c10669641e102b44dd2624b2675d118e3aadec0039c8c2601b9ab7f697d153b9ba012041dbefb98af13326d18b829c860c0ff48fc70edc3540a793a714b0d6892c3a238a4903c6c4ba5625985a07986dec2a2fa463d7c706b49f8a4354c0eb2e48fb9373b8e3babba2260d2222a0abece2e2e28c40c5b81b4419249b5f7fb17a609f7be542338b98a260aa3a487d3bb9412a43f5cb377cc05ef3c695f6cb4a5c5641f161fb7701070fc884e58f8e8b00766c080a4560b9109ee1185d11c26620e9b8ae90bdaffc0a431d2519bd42a5447ad1ad4d36bf1065c48f155121a7c5ce79bb14bf0150d00b380077e58f86cdd197e7e92d0cb48318ada33fd8f6dd65e8099f5f29fa65e43c598ffb4dd87482262643b79d6e274c34175223219f9cdae6d36c2aab28768bc830502ed5b52603c9198a0ecd47b0a6550b442b30fa6122448f7e76bb0e6c7bdd4cf6f80eaa7914e662d29836fa5b86273a889d7ded0c507c16973a8291c5caa8753e35fc8341d1e01070561627499d1a704d6c45e0b402016ad95b14d0520cf86f4e5329516ada5a8ae83293669e26af8fbe2f9ba03ccd06c7aa33a5c5a9e47ad0171ff12b892919fff4b620c05efdc2cc90b05374a6bd45f043c35f212be0c9a1a1993cf744defb0cee0d5ab1e8b1f87dadca5747a503cc21668ed23153dfced8ecf66310e79b65e2f64d524ca1aeb7511972d5bde6bb59eebfbd2359957d3abf1f9f3a4a40241e3fbb871166e7eabdd262e3b68c8b3a9245548034c8383c4d95e81330f34f7df3989566b6b0c2e597feda0ec96809c6b691c725ad30178da7adb2556f3f8b201516348b08acb86c23426fcf2d8c924eed28b67c560e98bfcfb180b4bc15e6e1c707fd1ab9f3e58cecee1239615bae8597e85a0b69326d4c9bec850ae75b5c6ff9775ab9f7bd7a4b03d01baa208904df28e98b064223727e3fae5242a9ee80dae69ea529b313a931ce2f2967ffc1d12dc13e5577f8cd9fa41a22010caa0ee9384f1e1968753d9a6a060f80adc1a746e35faefd2bc968322b13271ff717327ec8b973b16b3f902f435b3a65b730c0821f94691e9db73235cdd5088a02aae74566a9ee248ed6d1809b17d20db48696fee3e81c04629120c2ad397bd6966840e6807aaff15e871ebb82e9ed81c04c235c2637623893079a05e362c3d6b1b8b0dd7ff962682f102553708c6bca8d88ee1244d970aedc672c657d2dfce30bc872571e3ec594d63bd085d37ee489cb350a3663fb36f561d1fee1db2d2dd2159548599bdac40e12124c16745a1a31795f5d2082b65942e4aa7479c7f78cc4c4f66a14d027d6a38ce65141b2a81b606c4142763b62fc408fc8e1cb2237c8ee2e4fe5c31fe567f0f7deed7c4780d4918b27f31f8cfa41e827c7b23be8cf10e1669171a5e5cee3c6beb65f88ebdd7f62ba66e81147a244265622fa44e5c5fae6154ba597da9e3218fbfbf812d5fe00357dcdb7e51c68ae2f0df02636f4cb8a46f61aadf5cc7658bec95865cb33d8ce0bc9e15cfb40527db0859193221930cdda2902de2cd67319bbe916878f62fdc7a57745bbff695a6fb50918b2b74dd98ed87e687a8985579c8549ec8ee28df1d8a4ca0840eeb79d2fe8ea7811c3d158588e9232a0761c031012cd5f6dd4817ddf28a3dce1948a4a7b454d0f7e5d4b5a0a51c89ed7698f8523c421daa6f620e5474af3736d7eb198446a3dc995ec4eef40e3062ffef9a760106a7365940a87578b00ca4ced226cbb393fedadb375ccf34ae5564a6661e5d34382a3d900686e4f0e58717a9e5a641696000166fb8a8950198e9881d192d4050a05419c2a361eb98f7cae17a253098e4a491fe6fc058bfac369a1be59121ea48a7732d9dcce3373c7a138bffcbfbb3c9a1fa39a0531d964851b037a101a4ff719f9fb222a80b7882d61bd8d6f940e1afbf5e28f05a3481305544d4aa8fa6839805a2a3ce9f108a5d4df60ff7c0b5dfd7e2640d23a50d02a9704af347f495d21a493ac4176bd004b83c01b8c5a891a5bbca5db4d5e134763757823241c98fc66bb58882f4eb11d74e734f6c59ee54d3ca966960977bb325f5f6580b1ed4c5fe1d9be5399657c3ed9075ce18ad5a381f7fd6cfbb2b160157c4d22d6b0731218fd15a9b86253a42e66d0492a1ce685904cf9bb453c5848efa12557c79a426e5890bb40611ea445eee2b1c7b9a35918c5e00e87d18e6b8a7755116ce5abfb618bd2046b889e200cdf759137f9467152c86284da689d2de12b95088bbcafc32f05b11f7f1e3e1cad432481934c1b88bebb0f1346087a90b932b6e7ea4da63bd8b44c09a68f9a11bbf044867e0f1815e50c2c66c409108b518e6f9dd1ec1a788935223a0ba392a73b8eb72058a2901c8f707acb0a8fb6e6d3fa2441144b73421d2c70f27478e72ded0b6438ff8fae56b24c861b7870f61cfb7807a1ddd8e1944657c4483b60e11cf75d7392a72ceb2d9993654b1bc35add0bf70a22b453014cdf6d53895c2392b393c0a0d9cb47c94e2823266ad2c2afcbb4a0152a6edd91430fdb8695412bedd72505dfa54a9714166e4b9bd7e323231952f4413691d9dbe7afe280bd9cf41b92b50a329fe03f8944c03d4ce57470b286b1f9c99046d42f56247960d980f5fcb73e7066c3b16c4dc158b58b2e7b3e1e2d6f10a69d6282b64b1b055f6aecbc54c67b01d50f03244cbe34488dd6e4ecfc52a8529524e45afeb967c28d2fbb700fe16c1985a1de93b3975d1d24a2b5c7374df6ae5924a4f4dcb30283be7cd39584fd635fc8ea86334c66a8a563a548698ff8b56a5d909c76c1d4a399353af601099b39b86a6291895b15fa17700e1514e03dc826045940d12189b001e6963cf8aa4aa013ece5e1c2dbee34e6b39c1d084a4191a40ab0cf2b835d7a57f614c0e676a5f29e4948c6cef3b09f749830585b74b12b3d9da75b08ea40732a8aa116ff2ce01591a37d9e91e2963dc09048f2ba0633a293619664a05393b6441a98adb67cf6604be3ce95d4d34ccac490562b7171d4ee2ba1778ca4e65ffe5566ca267efda1a4f17bbd644f36c37e94bb4d16cdeeedf70e7699be422986f13e5841074549ec0ffb8e62ad72ee5ca12fbfbc7956a23201c83f1a83193da22534dd229780547de9bcf6dace56aba470b3d8f3973a7488ebd448d20e6c051048362c0bbce2d40d47dd550dd36cca67081f740cf7703efe3461677d909fb66855d54b550a4cefb1c56f101dd31b32d58bee07a0673f5802a55e6e558186faeede1d7146ed8f6f16700a2b414d95d0b15a0ae928d19d0c0fa78cf825380ba034049ee3a4fce814dc0a69936ff92a8833e31b229d31c0b062b747756b6a0310723647cecd403324093187fdc605bcfcc33e4d57aa0d52ea33fcae7b3d7666e30ee110bd3ff65441e266f5b946c70ab964d9459fa6c89f89b4fac04b067517fcfe1623d64ae5632f4a311978abe37cf65fc252ab804803922da610c379c8d5aa139e81190b81173fc211e5fd5802064cffdb0ba42828067c57c7c10eda80895b1581db4e2e57cbc29bad5ff342a1fbf5f1088c0e179c47a2d530b40c465a41bf6fc7c49c7388be3d3fecfe8ff3dc070bd58e71fa211457cf9b26f8345bdb1edd00e784df201812947c50a332001308ccf81d03d211f47ec48d8d0532baa70ac4b91cf4768eba621061272f7317fd99d71efd91a10b3175740b8ec73938cc508180fa7b47bd737735806095f44822e39fa83a9d4520936b88b2bbea60a42ad122b7672d7427e0bceb74396dbfcf120f9a4b12e905d3d17ad22799d3b1abbe4ac0cd1d99b2e33ee0206421682d7760ca7224fe71c0c9bc3f77e6f8d17589337ad9dba50d3ecbc4adce8bf4ecc99d3f7ebca7df020ddbcf3466c49f7bb13c15620789149759c4884e96cb32ce2b90756000f122b7a69f82751300406d98585286beae2cb1d853252300d10c12aea508748b269440e0a24c0c0df74811ee60af76aade5a4feee84940a3a2a3f297486b265898befc15cff9bdd225864ccdc30f477997903209d832085875c31945d8fd48576da368038487b4ab6e4e2b4d37a1cdb2e84ab6cb9b3bed9e0b8bf75dbf5796b05f5a6c2c71aa07b9b845fa17e5779f47b7e0c86409f49fa839fe8f5b4f89cf86e58c91c20fd87e843f0c1867b0d87854fff3bb811974e340164aeedceffc38ea85779ef474ec87555cbe6028ea852be829fa0f109a498edd1560c109cca57c8d4a688e14fd5efdc81afb55e030298da6792a28aabeda26a8984324642b7c6e3389e66a3163a6fd486c7c25135756ea33927b740fd9c81f1668728bfcfec0c3837b955d8924d61c497f60035f11c8ad88a99739e498d2f551f4228a4c7c7a66163f3e6bd2065b7480c2af508349265fec3df9b04d9c5644fa6a08e72214a883c21942b74bf125486754f3f09a394e945b01ac422680a3395037f841ea8ae04a176d7d57a08e874404bbeafc24f9ad8877848602a13b9d3bd2ae454831639627e5d1e5e6b93d1aa47c6dcaaacc591559c3493cd666ec5a639d830c55a1cbcda5c306aa1f5f3eada8c445063ab0d3713f761577828c362b20006502f858c3d80625b5ab810d061c9285225afe437410c500039ce987a8381f4159774da6ffb6d2d574a5bab65003b74ff0dbb7bf4811d3d26c733806c5305822cd3163794a8972ce0bde26de8dffb3faf83785f98ed6cff1d8e7f50b637faef558966d50e5eaa4ef5c7700ebd16939a19e95735bb5f6dec9c1b0163d19f328cb3148223d7fb9e4ea6f83ba7977f747bd64cace458cad0c07f9489b510c5fd6f7346de7943593b7a0d17eeef826fcfbf2d35a17865785cc05689ea3ba2fcbbc22e422a7e891ff902af9a8f224a181779427f665e90eb47a9f452c8536c31a28619cb802b922574cdc9b82837ada3b79feb2f29d48a4a892988fcc44dccbcf1d9e75849af708fd00f6c078827ce2d8e04ce59f5b2ea3e8b04745a7424dbcacd3a353778052a5814b75d7a55c1f15f2fbd3e269299c1684e7206ae9336e6c38c1fce1760b89dc0db1b2a06a0cf1657c5eb4073163e254201e1ff027fa00b8295016e794d1c507b378ec46a562506dbedd36e9d9d79e6ea2d088a2dc9f834692ba14050ed595e6799a1065f05485566df5b8147a8719373ef6fc85b17b8a8f288bb90bcce43babd386bf9361f7f3031f548987766f1fb0348e5a1e987aec53876015506667092f7f7c44e81d7e8176557d2f0056e122c1f815d321df16539b3d516bc68edf4a8fe6a307cb9b64e57e6881df48d2f2ace7ca15bbffca470e2058994950a2dc5d7e2e089291c733adbedd6947dda79f3bc81f414f11d655b5d90882d82e522481185d14dcfa7461be3da10c58ee3f2eca1239e3bf7d0da54bd68c1df3ec4d4f5ff6fc07c8bc9efc0e2f5187b266324a9d8684e80abbee9538ce0e04216a0f412311afd561bf21caa531448fe1b23147047c13892ad615d5480fd301777b5a2746cb0b0d6596cf08c1480909a11639dbeb8efcb39b9ce5c0725d118e75cb4d76a6dd36e45885358000941588a0679712f2c1bbca4ff17c5c5372058c5f75670227082c6a58e5dda507fd1d3381f1472cc61fe9b8629bc601e45bd5b13169645d8db26c2734d52d025fcd78442a8dc9cec93399856d0dc5599a40413487756363f8d64e0f883dbe124f71cb780af253544e679de90de43bfd58bcf8c111de315260d592a4bcdc49c007cac8881de3feb374a8c27a79b2f888c10c06aea3d9bd7878540a83a8917bdf8679f6976c0e124c2981648a3a49c366136e9a9fc2e7f18f98e2431e153daa331ef023830780358549b1621d735bbe174be392f18a6ff5c7619c56cecbf8a648414b0e12baf089d46877d4648fff39480ca01bcfdb3263e14b38b692401ed1837107d3352b76f04e4c3028abce68a5c505a11a903f9284cb970da435652c83472565469065c85fb4c294a3c64664c3a9ee2069ea20d0d66f8ccd4327038bd6bc0106311f61fa32ef8588090ca378682c601f7843d902df8116d09adb4181b4fb6ae257237d972ef2d53923252089f08b308b5d654ada957d54f8da91b4d7a0a47939e9a3559845862996b32a303317c9319a73b44fa25b5e9f2ef5fb1f858c661f83df4e5899cec3f4d664c66a6c70b49bcfa13fccf61fca91fd9f32c9c32c1a999b7ca8f2dfb87741c66e2219d1c7a990c7e09c63818df603c3313be7b187ee8e9d5e17bc123a63abefa40da5033786574c6324dfa532244fa25162bd779e0ea53aaaf9ffafa2b3ca74b154b8db5c9995178e6132e7f27fb8fe0d27be45274a3c436d9bf844b5c2b4b96c8fe21b8c43865c910b2bf0853a086b0bf88cb9acb905bf6ffe012df64ff8bcb12244a319758a6c439650a4729faecfe7903609ba4d9a379b45c9b9ca4cd6d780dcec6a906b5d11e5905100796086269c11691d2b74410dd6be53891469d8935076e7526f7d328d419eb7973baac07c059528632b91f9c7507b4e2549cced3d6f440cd2db8b0c044d1cfd55a2bd7799f070cef07148aa2088a46e19c2e9e0a92fafa0813fd96fdca0033a500cd37b686964c1d7e0c4040ed010eb0d180c0bc55cb430eb4911abe6869b2bf8586d18d81734393fda25bc3cc092785c5789e75f9be7a5c676f8ce348f7866b838f2b6abd40ab7a67b0c190a6d3eb87fb183d73d7a0d3553f0486d4269eb81547a5e29015674787efa5e2541e35a7e2549c542aa5aafeaa3327d7782b0bb646158673ba38fdb2da2f451b44b7dac3efadd0cd615aad5629922882fe7f15da100e5b447f5c1fcff99452ff095e5ba323d61a6b93fb47b606fc2cf8e1be761c18724e820248f35badeff13cc581e8f918eef1d01c866359bf7b30fc0e833c9af410c4093198d3a4ff0c317cef4b1027fb835ead5fddfb7b3ffa65eb97cd354f187ecde1780a40f8df875fe9c96006a78085ec0f62af365dfef446a45f7ab5ec5f692ebd9adffce63790e691002471c29a129008dd96b5bb9b7637eda65fdbc1eef6182d8a22c51129117a0c6df56c2e6be41edd6d9ef6c66870356674c70674c7364531bfde1935d7e962b1dd8df52083bdb11e6468a28926acb5c15886799636b2addd60f7d32062d320e0402c6dae1f2a143dd4e3f14cee53dac862ecbb33bc3ca76be2b0acf890ce06c3fbb931904a93f3c31ba35112eb714eba02c5f239b0e4ee5bac1b9736631a2cb9bb44ec20b9bb03376ac4fe0e4263d2728f36b97ee316d1368d49bbd77e3e22084432cdd246ae20d07cd09d41739d2ef1c6684c9d588f5d29edfa947e77777777378d125c9bacfd5e9b0c8544a21579fe68fe88452491c458c89dd1794e579d2e9188341a994212cab3840892e8ec1129a43fa40261ee0f456e8c8629f78bdc588f1000c536954ca016f104d871d5479a8ecc91ef53dac820c943fa482412c97a24128944a233f529f9019c2b44124dee07e95421825ec1ce6359d112ee20f79729170cbd2f4993d67411e24c14fd212091e7fb3c9ecefb5294768ca6186ce72a4e88054150e8c1b6e4c15e368545a83edc0f9ded75a0a701f0c1d014f527fc18dd75190cc550f7e028f4602e73ee3923b42c0aef0e223003361eade6d1f2bc141cc540fc1e24c140fc4052e8c1357b9f7b37cb9d766e1cee9110c4aaa3c9fed1ad3721ce8d74655cba630ba139224da7bba8e344420ff6140a0412431fd4e703126d227d7b77982fd35b9ef7cd3aabb34c3f7719c8a196dd871f70c4d2079a4c7d2c7d98c9d46f99469d65eebd36f93dbd311abe936793e0bc742c7d9895be93fd291344ff184e310ddfc9314f0edbd99db3f9fbbe57ddd837c24431831e8bed8f6ed91a0fc432c471d8539ac7478a85efe9f7bde779dea76bd0cf8d7d2091cefe78ff79f7c65221fd02913e580a3d98d2b70db3ef81256a1373a0b8b439539d2668d3c5fbee3b552d571d1ae2dc22703e5ddcdf1bfbe0f982934bd1e6eaf0bdd851acc902c83bd0a188a7640a67bf5079ce9c5c8a35a0074c27c2d9af539e36358b351405cc899170f66b24cf8f4d1f9860882caccb7b8933047d5932829a98a48a3e0f7869d72c8e2e98ad7e19e0a00b3d27fa429ca8a31beb9541f312a22ff45c10e77979e414da5eb0ac2055bec484ea164cace9567f9e2f06d12b544a324a2465980d7329d688984ca57f3297210e994bcbc2e2e51067ba64223da1c2d92f539ea26d6a8138aa8710fd415558b290a552c7d59ac34a63fd582b8255c761a258337dd48d51ee5de5d99abdb5fb2806a1c3c9b28e1d195cee700efb1cee3290b9a73673aaca7134af6e6c277357862a535a83aeeb5438fb2592a75542ee2f4ff2fc8e84a226d385ad4d14fd9f0fa976248f447d766f1d66bf7bd44e0eb9323cdf7229de60b1c69bf0423c11f74aed993cf83b9d6eecfb39dbfb733fa4b9ce1b0bc7d23ff4af61c98d71dc490da2d69a5af37defdf731ffebaafe4fb13d7866fac43f8895b6d46b83aa2d8efa4b82f2541208449932485fc8910898648fa12e93fa46f27f9e8e9834437f47cd53b111212f3282fb1fa70362ce603a026c42f678e575d3c5f922aa12f5956b4bca0d5546f42fa2e18fefcd67421fd7c94e9e204c5d6f3baaed61f6fac56930a44bd958626f77b1de7406eb7203a3a4cf8ce4e9d55992a93d51fea4c9de1b2875d09b7b9ad660ffb0fafd53c77d87d34d92ebebfbd4efb44e7015745170c3d39342f4171e712fe8007d6d57bf0054c17b099f4e087bb84634020becc99a20c9d90fbc324e64b0ab95ffc97234b30e1f19c294a310a23b9146b8c086f871f9e7984c31f4cb2bfc3e11193f4c124fb3f3844c26cf587e050081eb6b5b6b66ead466c88d32fd2f7873c4225d028e434ecf3fd21ad6176ba78bedf2661c256df6f9d305fdef75b295017f5fb278551fad264a3f0bae5fe329557588cc16cf57bb008830fcfe982a114a190fbab77839c44eeff1421f77742c8fd248e9a56a97c8ff0beebbcefbd53f6c6d21ff59f2bc39ffb18dee10ee40f7ffc9b1bcb1a8ee974a1de7363aa07c149fb937a946a2c6de4d3d34fe1395d01e494cdb73e509a26271079fed0e4dc9934d06ea7a1761d0d399901b6564393f33f1a9a8480e70175ceb0dbbd56eb79b6a4c949e6f99e1bf3b04c3b5d7345ce4d0bde7bd349fad31780e74abfc3365499ccb33f9d28fc690fde0413b9655f019bb9f7066b58c3ee029deb83d37b199ebdb107cf95760f709694d396c1cff781a652e8f3899c20b98fa0ba6e44050a51dd1d89b592b030266141d162e195142a1ca76285b52a5e27252bac490a2912b988a1450b1735ccc831b49061030d9e07801bfe013000195edcf03066888182d2799eb5dff7793c200886b592b030265941d1626196142a1ca76285b52a5e27252bac490a29127940300cefbd9f0f0804124517c5a653ac95848531c90a8a160bb3a450e1b8fbf98040a228864222916834f2d1a8e91c51daedeeb5721cd7896228241289462312891412e221214d6788871f514412b9a0d0e8040a8d56a1d1382a09c107c91bfb3cf97debc6409152e8c194d0efe7534caf7263275e85f4a0cbe52e57d3e9723f018edc18ea474ea71b1b513d0a950afda23ed53da852a9562b5fad9ace55ad2d22c983a91b637d0abfeac648567e7563287e7567d0dc7af043bfacff3b8366ccf2f8c6523c5679701c7d1c9bce91e31ec437b6e2f118b688f6c71b53f17a129292d0ef8a2fb10f9a9898b058ce62359d2c91c8246c115d3cc8bab1189e7512b6882dfee4c65c3c48862da28c276f6cc6937706cdf9c156e837866fb57810256c116b78941bb3e15168783025c553529ace941611d6f22a2ed78dc11e5c095bc402fcca8d1de0571e4411fa6d79142f0fb2842da2029ee5c616f02c087830450a4f91a2e94cb15abdfc807dd9b6962f5b891dbeec1b0f5fb64e01beec2007f8b27710f06533a1802f5db6802f3da6019d041cbeec24f2df3080d5975dab41c6122613cb0a49144d226198c3973ea3c3974e43802fbdc6005fba4d02bef41b067ce9382ef3d200062c40010940c0010c50001e08b0830e2db01c70187ff503b86125a306556a85057512318523ee5eeb8d01e086e73800ac1ef43ccfa2a0ac08a7c3bc970602005f764d0711802fdbe6e6862f5b070e8f9c1e02e815740b720b173164193368a8c106942f9b660914ca64229144b16d7dd3d97159d75602c0333c8c8ff132fc0dffe203f0ff0028699416b1161b6035bcd00063c60c3264c8315c5ec4f02e56a7911326b1d4759de7ddd80ac6db1b93e1edea515ede736333c47810f43c16e17458f70264f525d5f92f6910972fe9ce8b2f5b06e3cb8e91e1cb9ec5f8b26fbc7cd932337cd938625ff6cc12b02f6915b25df1a2b77f94c94422b57cd9352dbe6c1b175ff64d0c5f364efeb27368f8b2694d8312a36186971c43861860bc70e1d2e2572d30ceb3af152591101229f793beefc6ec7f7706f5dc988a07c1b0455cf120a8c27bf0defbf9f8e7d3747e44a257381dc6bd0ca1e24b7aa303862f294ece8a2f690f9a8fda0f16f3a90c280d322661b55650a8b0a4103d0a6532e9ecb4ac672dd333378f054e59bd09ca93267f92f22b4ebe847c184adeda57e15911767d8a150b8a8a098a949593163996b02c89471a99446118de7b632da2c97f6eece43f7706cd259e15a1bc7863292f920f86421e0a359d218e8385d361f5653261bfa431e3977456f2259531f992e238f992ce905fd21f50bea434295f52205cab2f6717f27c0dfc7728d5977307f55fd21bfc25c521f992e6b0bea4345a2ba94de45249416991272c931292115bef4b5623c8752a940885028140a27863230f86c21611f5a1d0c88b6eac7bd183a3d188447212a9e924d5da124e87f94b9e3c66ceec71fa72d2660df5e5fc316d5389799b40f2fcc04f48a444329d98382f136726999f216968cd0e97c2a3fbe2831ef5e19f708747bee4533f3b9e18cbe923f79bf06c52349693d6e41dcbd9a3c9d158ce9cd924682c278f26c5b19c38e158b6942b723fc8fdb7b4dc58f72d77468b1637c63de8e27263a077b933680e1f74e1e2c6ba77218afec58d8dfec5833060380c184d270cfbe90194fd2d80ca1540b508a7c3faa592f2fcd2145e90280a015d945014ed5fce9ccfbc65d297538724557a7a8b34966493a1b12473499664939ff1921924bdf571630975d19a292c195ff6b1057d114593e99f24593299c92f939e0c7409e783f6ebde61dfcbb4e549526b501bd45383dab028092401ce925224d35deb2cc52bc37d640ad4ec409a749d268b10edcf5b9dbe3fe7e160be3c2326d9eff1c8ddde0df75dbfed58ba7d6ec48ed3bfab37566b73dcb53b68f9a1e5f6c64f8eb7baf32a37697fbaef3c7b74ab3f399f9cdc2ff6cb610ea45bfddd75ac22993c4938f75400ce9292b4657fd0fe7cd0c3b549da7db55f6fcca2501ead0732faeb7bb8a2503fe7cbc524fd4b4f47aeefe160be5adec399b0d6d7f772260ce5eb7b37d3e5e46bfd3a3361245fbfd24c58c9abeaeacb2a9b30a779cb278cfbfabe3361e3d72f49b9fe9c2ea9af4fa78bcad7aff3457e7d3b61265f5f9c2fd6d7b1a4e1d13a5c5332f52dc6d12f1a1e2d7bef8f65f04cbf2c96c981f158c3a3d5afb9d6b7b6a55f5e8e8bf9f27ee0348779ec6a2cad6a749a870920b77e0adb0cd24929a5245679e64c7e3099e18118720b01d2301e93d2f6eef672faf5a935e9efeffd60be3e494cd2df63735848c75bfe368f2dfb8b6e3091fdc14a496293fe6277e5b8ceebba2e24b1ea5398cb2d5c52a38d46a41b2c536b0d01d22dd5187243f99b5626332133e4c6152196a999094ef914ee720f9d9b8848899633621a93c9247e69f3899f0dc3323f29114f9b2eabf71f19f9d44cfc2e059337e6b939fe08d11f48ec759af4f7ae0ddddfa6cbdfbb39bccd5b4588233f6f6af6852a58f5245e3d09c65f8253bccce1bfbd4e48e7743a89661847b7562396d981b8a2497f961d2255619ac19eb43f2b159e7995623380f19c2d5b67ded5a15f4a6e46907895c28d824b5ab8e40497e44c97ff2789f99a932c3ddff7ffd4fa352779fff3e5c76653c3e1b7fdcd5b5826acb50c7a13ccc22634dfe7013d1e8fe7c652334d7a11e237fd9392016f8c864c93aad4d75a6b4d05e30d99152188948926fde90e35852d225622866f266c33dd1c704d15a39a81fe0573a39c31d6c1b71312e9e465064c753c07bdf9a3cc9769ba3af48b890d09dfe7999fc7e3398966606cc3358c47d58dca4635a39251cd54b2d4ce89c53a91a06a5041a0862819a18de83019b1f1969bd4807372bed4ce7441f9111b87719f3f6133dd1cb436045a3b85401e1407270c4756c43c039bd072a6ebdf534333ce6c355ace47c7e7d29b1b100ae8740375632a99d414f947356bd25b44554c2aa59aa1b85c2ed7a3b846558ceac60aaeefc2a01cc3d856a3e54c572af5aa1d263e6645331a890411d96952446744c466648889527d720d33689031c680e05fb897f1fe6208c499e94b518666262603c6b41c9ce9f21fd59c3831b25aad4eb26631130302553c7233ba319471c4860631bab4a606454407f5a4119b111b94144c8720912eb5b1495d199d8f700a5730cac730f734e09477e19b65c0d8866b98365d2452c8cb3ee66f88a86a543854312c58252b814aa0518dc344746672e86778c97894f156154941c11408914b69fccae83cce8ef06166c13958bc0b36a14d973f0a1622d1bb2ce686a706878d01d399a3ac5058603aa3ba39a80c980a5d18bcc962c9ace446098e900a3cfe30dea07deee7c72fa3c0347c023a3e34e9ff3703fee02a74619b57f003f0754049e86514f806f767c13ce4b08219d0a4ff7811d0a4bf3f48325e1ceabb1e74e1da24ad3fb38b6fdd980b1798b69ee4da50471789c720b9395a5a62c438713d9eb9ba309d2e950759e10a4ee1b20cd824066ce2824d70a66b4404f8fea31bf03d748149745e60922030300913f7cb10d938a38ae9968fb33aaa644610559af437a14d17183e3fce1cc6bd83fe553295cc555d7f6315c5c42445e54f6e4cc5855139a57e4a5dc1299f02b37816acf228707d18f8f52f30ec5de096578151de05c3f02e5c73882cbb884e8b9957b418737038f96bc125b226fd61b824a65bfe2f5c72a349a765cfb3c0e30a119dc98de3ac0828aea70f038a4ba5b26e2c85a5f227297f7263298fe2fa5a6badae5aabab5695474179958fd127ad5005467161cf2c3807f728f08bd01ca69279cbdf5fc426a244bf54de5fe4d6af9477119ae82db7de72153ca6e011058f2a99c3dcbe6b94513311dc2474e13e3961852e4c49f22474e19959f0c8104dfaa3c023374dae8c23362a992aa661e38d6ef9d7719c35e923ca09d30989faa4bc0b7bb20acad34f4169e199493cf3092ef14ef667e1d2913019b12949125cf66cc4a50a27fb635ce22464ffc7a51bb1c225a9c265cf52b8742450f884cbcfa54af63223bea492b184a864431045b874247239b2e4729cb54c2ec7992997e3ac4466620439b3e3acb2aa0d5ac3bd06b5915283da68910717d0208c65a5b47f745a2bc78ddd8dd16e8f766b4ca36977f7e881a11744d9092ae77486ce8432284b13cad46aad72ddf5aebd1ef07e2e48144530cc21a167c05b13f0d6107428e8e6a0322aabb52b526b96a67475b25f1937530ad050060823f7441a9d2e0a7553a451eaaaeeca0b11115d4b734fb7d6a650abdda68be7e90c8dc3bcefb0d66a2dbcb11faa8b6ecc57abd563afd1589a50e67bcf376748cb6528434d90fbcb9096c0f3ac1dfda15bdc48676aad5f3f1a6681a0a3a5b134dc8f30c62b92288642e338e270342221b931129f739634aa5f921bca4c41aca1ccfc61cbfd2196a65a1a0b44c3421c21a1cc74b92111f47cf7c3bd286b95086c3a323a41d0f141abd96836256e369d2bf4bd820d08369b8e8e8ead725e39af9c57ce45d1bdd65add7f1000eb4bd8b163c78e1d3b76d49f5fe997f6bf08d0e74022449aba3870f4a321f7061b99aee09cc53db0d6dafdcca126ec5842e551715229f7caf91238af3f2ce747ac56ffee4dd8c179fd5139cebdbebb376107e7f547f79c87f880769bb9e1e0e6b9f1c0c9a9e1d47ed86ab72978c029d47e50abdd6e371a12d406a22acf26fb469ea2124a2891829cee1ba5987bc6052e70210a48e44ceb838ceb28c17568903c75f2bc4d93870a62e938ddd5ddd6b0d6e9de1e2a88a5c8ddaacc9471440f1544d073dacd80608be83fbdaeeb3c5c7a83e8ac33d0ef0ef4c5a6037d719046b45fbfaf6166f071f0fefb79c111d48178fa461c3772fdbe336813f9418f26d7fa73ce39e7dcc1d25baef529a594d21dbc17cf77365dd3ddbd43e73bb9d67777df817bf1e0dcd4ba43e5b859aef539cede1dbca3e5f4409bc8deb843bf78c01688659dc9f54b7107fae279300cc18bc3f7de83a1fde4f08ce3c986efbd9ff18d73ba4aaf46cbf56de4183daf37e31bbdb17bff8e033bb9ce721d27b50ece20a4c9ed7536a304dff35c09b7d56a4befbb0771e979ceeb0c54abb7ba564f88a3c9960967429999bdd16f65dace5a14c71a7556fffb5a67e1585af1fe672c4da06ad32fdc08dabcd55f67de7ff6fe3396effd1d4b93f7e1588ab6b4d9ce6c723f3542a4efb65cda596ef73aab33afb35c9bac4d8634799278f58c004e8709d17d063d2cc4053aec30026642f4d092235001cff6c96ce3c57bb007da44ae634963bc0781103db4e4ef1d97d4463ffdcf46f6193672f7521b9735ca9aedf70dc028d7e781ca6432d9cb878196f3f0c2c2bf4eee63c70b7416a2de7971f02c04d7399dee9feebb1ab4562140d791c9f53defa91244ef63b8e7793ab9bea7ed7718f461694d3a586bd2b3855f82349b12379b175acf5bcf15fa5e217fb624d83c9bebb88eebd882004e1522c8d264935e7398e7fddd364eaf967be6e860faf26170e6e5d488208d97c1d974f5775e982f1f16735816d88fd19ded9c0bf355616a8c33e13ba48ad740dad559f2ef7866190acec019e5ea87563b1bcc8983fa8c07d16e93e7b7d7f88cfb0f79be3b8e1bd7e143b88c4d891f3f6c417674dc654dce18266a94fe685b10dfc9f35dc75695c8f3eb0f77266a3a706eba1b08ef1a1d1527cfaf375dc37510793ed740e434397be4c9a3c9d9343a418000d1d10902e4e60e04489393eae48e99e5f99c4ca70b92e777405ac66b1c79bed7376e73d2216e7ad072dc6b1d82bbe941cb33e746071da2d6e4fc91a78f2627b5f1c1071f6adde1381f64383ab3c9d18ba8ee4f98e3aaf544770412c38eab15c6e7e16e1eee46e303a12cb7efcc7698e03b62bf768234d93a4df68ece4ebf98e897ac777aa7ac31b9c320f9fbb2c6783b4ed8c9ededf88eeff8ce9c2dcb93c4bd62a18433f3f9d419253e9fafb3091b39d152bace0c4d71fe009d4821225f5f34cdd7a8ce646f06e4034403d5463920daa847bf68d49951ce8836ca1189c61a75c661d596c6d2865ab23896a65c7bcc1fb5c661d65a512c4dfe60a59c082e7d080e75d6118268140a6209a29db0f82358f427b0e94938e4656bad28865f9afc6f0d44f356681ce53c410cbd289aaa48aca0ba13662774242c8270c72383209a488f7240b4ef6594b30491478fe86e0f6532b5bb7f2451748fc713eae891fdc1518eb73acff36e2cf4a59f3756b2896538032f88d604100d4403f9286150cd03d1c4ff84fe73632110b62090ef30417c1087452f82eb87e0d093b0f8201df9fbd2ea18d19a148da31e239a388e727e8c72acd7714da7db4f082482be7e48047dca3097201a081ae584dd33333d53c2093d11122861f6a0073db833dd74f7d975471ce1a14c1242191d3b76ecd8b163c78e6afbc6ea5a1111910e768061c763bafbecba0ed4e1fea0e7eb78b873b43a0fe7fc88e9ee33073b784c779f39d8c163bafbccc10e1eddfb2a0420a5b4bbd640f27c770f45d1568eebf6bc1ba3d4da1ba3415aa43610e98754bc37080904ba313a8a62285445a21ba3e348340a89a3d168343a31d201e8b4884a824f3d4f2988e98be70bf3c593c3d6ce3efdceaaf48bf3b164c1319ef745c0bffbdc9da399bafba0b67657b90e81775f0eeb79fec33353fa1eae1b4bd7f13caf347394e6ae6d11aa4f57fdbeb1ce3bd0d355fbc37dcdb55f9e534a29ad3bef6ec0b2b997940411ab8909ae25252e2e5a50bc605f1f05a90286162c527ce5745c272c9ad60b149514131fb45a8df6c3a466ab99989898d8d0e08666830219dec4198dc3c413d678f2347c81eba3609457c1ac4fe97249a65f2b46ee59df8a00eb49900891f5ad95073dfc6cfa25d6d060bec417d8dc64ff90e6b0518eb76cfd1ad59a0ca1305fa32426390a6fd95f9c39ac2413671c561267302983b5d61b5ba9b5eb3ceb799ee7d9cf5aebf1802108823f6861483fb57bef0f5aed7392890f7ec2163e6550349255524a3221212d7c22aba488f48c4422894ce4a8566be1520645444e74cc8990ac82c71fb6911b4319c79a1146c62162e34d69b429dd1cc61a1fb5fbf3aa6827c217e64699051e71c69b31141a61ac16ab5562d9783c9e1f34910b1e6dc69a544ab59aad64aa9bcaa6aaa968aa9c12c6a5d589e64fb277f1a972a60beb4f328771e19b6ab516ab85c284a223219c303c216617cca29941a1fefb52b41977746a39498cd44658e349d662b5466ab5d38fd38da96ca81aca070a5563b55aadd6b35aa3cac70f1a0aaedfc2a0dc028f3634de9a2e1f1939a97444174b3c4a394dca94704eb2ec27d929a661e38fda29f5c92519e9495f2a01410244b7fc49de854b8bf802b126e44bd166d4b9b580018f34333239a351e9d630d36c988af62d7c9ac5d4f1246395704e7c59c239c94e321669831a5130eb5b60ee5b6e86018f3663cd48335da19048b5e32d950faca28deee824b3c971580927273b0c93bc6c259c5aad75d262a56aab30abe01c283e0566d14c97a30081dead55c1a2d15aac160ad5d8c2e08744569281a525c15f4e295129412969619b51f0031c60f3720a8b871c9af46700026a2b30053af7504396573cd822ae3cc9c581f5e4832466fdcc2b8f72632b234c64adb0583faf0dac71c5584b6aad2459594fbf0689e974b1bee4c648931005935c8601b3685829304b66ba5a302e094fcdf30e7e39b28d376ff9e8968f356f796b54d1682c9ae97272928db5fbafa2a968ad92929567ddd8ca9f609a5b189549144cbe0bb3bc0a5ef9145c3f053ef916aef9246395661c86a2c5729afc7da91a77bc6593b54eb25a8dd57afa27acd60a3ec59c66a409f9ac9367ddd809abd56a91cf6a3dc922c3133c730b7b564929c91ca62ac99470f48b7cffd24cbf4edebff443bf5aef2e128f3ff0681b9550d15823ab564369e14e496961aaa252abb5f0cc2af814739a3589329e64b4938ce6a361e30f57adb672f22decc92c723c6151133c73099e99a42433e638127f929d5632a30bb23f6aac9123aa5309089a1b1132d64a34156d5c8108fad4c21a6b04d9ffabd59c755283dae83b00233c6a432639cebbda711ce7de715cedba911661adf53cafebacb59ee7596badb5d65acff3baceeb2c0c0c4c07e3791d8cd7c158afb3305e6761bccec2c074309ed7c1781d8cf53a0be37516a6ebbccec274309ed7c1781d8cf53a0be37516c6eb3aafeb3c0bd3795e07e37530d6eb2c8cd75998ceeb3aaff32c8cd7c158afb3305e6761acb5305e672d8cd759186b6de7c158af8381e12a3d02483b91e4a149c6983bb78248bfdb008bfad43ed8dc682bccf330a95b4f61b53fdc575f82fb386ece14feb556e7f0ccb57e5cab561fe96451ab735cadd539ee2b60339dae5a9d1be774551b79ac5d7f70cf3e686df760f53ccfb3d65a8b04eb3e50c092899164ad555bb892e4cff96a22fa66460d347ce5587cfd2a33612f3fc3d7678139ae0afe23d7f724cc177773db84c5f0f5fd366132c4f2d7f7da7471f95abf67f3e5e2ebf78d097bf1f51bc77cc1f8eab5e4fa2c139622e527ec93a1e64bc54b9cb0cf1563e5c5f2f5c3f942d1f25432d56c9c795faa64e38dd6fb8fb351669cb5b8fa5eabf5ad8fd17dd3af8fa68998afaf05fe5ccd6ffd0a694d725598afb008935419c31aa7f3c91c06ba79eb93711868c75b2923ca78eb7761f702c7b07810fc0b8b5188fa22b67ea9b2d747795adff514c5c58335fc68fa25cebe16cc97188249fafb87380e1bd5788bd6afd14d936111e66b44c4244b5b86b5ec0fba394c84e6a01d8789d8bce5b49b0b9332c8715c4a8ae7d9cf5a6bede7f9becf0382e10dc3f0de4f484174fa4735fb7c3ea0119b22c4d1839fd0854f191c8dcccc647f0eb74de8e6e89a9ad0854f8c2d23ba397ad621212122534d21dd581d69a2d0854b192c8984744cc86d59cb42320b0e9b03a86489dd8a8a24548a6644000000c317002020100c078571146479ac77148014629e58665c9d8903310c822088a328c618630800c00060103108a1a1991c00e05d48522779c148d371e45c6039569266abd8adcb201d5411febfc45a7f162d6442b12ec4e170153eba55965f16302494bf64d81b84a815efd4dc0943ce180f08baf7ab629c9c8499e174f7541752246be8f3c8a13b5db631863aaf49ef98000d0d81555648c7847c14b947597f1d2df11021660048071c13a656548a6e583356ec96b384722b0c427526470d47408e09e4c2b14180cc5ad95fed04ea871f00b7a0f87beab9891a9a3a4171fdad612defa4a922c046bfa6d48ebb3ff51ea9743452931e64348332c4744836e80b14d5bd2c20589f14a0f0282d08dc29d21ba5ca4cd0c8474a0d45f278a8802daa15e0f29db69c55b9ab8b69e3512427371e3a43698c35ea0624a468177891e532898d7fa9f81dcb8ea478ed7156a83b0556bb4f5de5fbda7239f7b909933811a8199411242bdd08f7c7f9b07929471f62bdf433c45b441ddc3d1729395955559c408365b48f4b02fbc4a30f40615f4508f12e42debf28dbdd69a460a251e8c047e972429db657397a7e5aa3eb5c5334d1494931d258a44b8997a8e8612579c6ff7eab9470387075da3619791384bc952934912d163e3187d02943184edb20caec03b97a637be58986cd2c808b3a435ae1bd0cbf7c7970b71b0c0c2659e7d3dedae2cd174abec1675a279d750a9a8f32f68b0d2e7fa31eb5d336726f1de6a9c2114647e81689a8e96e5af9520a58e46f773bc258c76ef6c43e3be66d3353260e71b807cbdd7afda733da2b0d39f16482e2e14b528879bc00edaf1dfd0f3af295f4b948f3b874a5aa90183268f99422b6d16c7ee8376722c0ff467aced93b36ccfa08cb4602920ac742ef1c98a06e95785e9838030efe2a2e7380fa0fb2e6e2680aebcad266633ae9dbc8e8c635f2b59e71236d42454a510594214c7962bef925690da1fccf9afd9dc1e9a729ba6f55667279f7458f36d11e7d1bf46cd43b087acae8d41004048e7a930f329923a63f5a846fbe29f28e61fd85adbd794b749fb980b42c6582c65efb7d284f082776386fcec8166511e964e11e107acdcd4f0a0d006980fcd6f985538bcd1c4d20cbc1df7d2357b29bb6fe6e1b175481ef2e8409780218a8f5361cacb79b02f57503f3689ed249a78575c4f1abdc3052270e5b57eba6d742471ae913115521213622d6f19180be74db93ab3446c48b3f11ca8bc23fa9aa3220475820db5b0302b5fea6f7b9abe4a65644e2bef5febebb92dcd48a48dcf7dedd77f7cf8422ddfc3ad4bfed2d0e522b15ddf2818810d7ff8c2d8be249e8580f352fef68a6a5f85167ce690c858edc35c3fd76af0ac5ab7b1fd6eb746cc341279bf2f7c61d91f82324bda13e3a8da9ce1131c402190cc4d0b59cd8b769042475b99a3c955d1c7915b71ac17195543504464be34be8c164d9788c027e79c48edd241b422d251f278bc3e60db8148a395db585f55408decc342bb5dfb12de507639a92ca48994d6e8f0cff4194e979885fc8ade22d1e3fe856f85ebdeb3c18e779d94f90e2e1fd35f3be0601d4c5811e49f36acd6a524b2b0da3a16fbd468a11761a3510c2bc51cc8cad981073fd72401958cf86f422554a00d3bca6605aac5f99c5b80562001c5e172a3b547aaf42ebf2c5c2f436feba4d650f964d24a0b39d4849fc75f46256afab6d5f87de2f0aceedb00c7376034ab447ced86e35c26454ea0336bd184760f99c497afe6f3d1c05267c5860a7ea9a9a63d34bd59567984b52e5b96f801bc33ed81998c729d3b38c440128953d15758c013644a3f3dd818d018a5444fcfc53191e019f8cddb2c478fd4665043b8bdab5ed9cf3c4bd2bb8f200e23ed8fa9a33b2561ee00fa0e87f1c75bf9cf8ba12cd866071512eeb2687b315ede8f81e86ff099d427087627a7bd3044dcb952e1afda407a61caac44429ad820d12d2e7b8c5a58231cae8b9f62e8707fbec08f8862b18370f3e013ba87a9080f006b243df09431ad2369122f71685a7baeb8f53a04ad34a925c281045c3149e816c44042c61cf439ecf4698678a1a9bde0bd5db33199de0897254c11bff77dece2779052d87f3ea0cfe404b8d3fe9f69c86f5893d954f2ff54bfbd658bf3bf919304a5ec66ffcfeb09f0c604b0068a2ac03598bfaeddece3a4ba4a44dbdc8bd05fa1df85507f3f83fb3a0ff4dbcd2e0d123a2d19ee814181f4d57a8ffa51b4a17c96f5657c1432696599724751a2516fe913fa47ecf2d4bb36530a61c0330918e5d03d52ca77251626c03b6bc04647c8ff6092182c0496de1ff714dfd35838410e6ce2c030e28090974783edb95f03fbd95a72c81665171ff966f89eec2f6a127424e02cd1db34d0e4e8c4b9a27e72681068bebd87bd02b7360ea2a425f3732a4c0f2ef7f880ce50c5d55630d17224383dcb0b15124660068041ef581d14e86b6f3eca6459281aa79c574e9c850fb0d833cae20c6812a548ad892a20f9ea6d8e10cf9eeb0e1155aef39c32de8fc337cb62a0fab9a650883b56a4ea2ad25bd790bac2eb4b4f955b0ed77eacc4e01b72b7173a4a16a4d517e2490da00fea337db920d81b88b0a1c19e3389b050ba33849fac6f08106e06d73c230fb4c86f394dd0b06e07b88303a4fbe840d5a796826c6a3f2c2dbe30edb357c82413e62fa45ee0a41823a6700555c3e1a528895d49f71281e0d69820801ed18409137937c403f02d9c397880b27c9c352ebdb04ae7f8c625b4014688434891b4242e0d66ff1bfccce0149433466b8e52e7874ca9a1a7e18cd72d0b181c02c8cba643647626d7f3c5ee702869f9e5228df59fbf2b511a6813da5032caea69ce591cc0948ab4fadd65cd73a837df627b58e07f7d14c4f22baa9bd3840c2608262eeff213968e3f8d6c93873b8af19d4749494b0bfd10f97a584337a5b6500ed2784fdfe1df56720bd3c5019ea520b9e6d1f72a5a205ce6e623cd832a6ca8d693265c3d02216a3838bd3fd2c5f4a873f37421578b76882d7f5e9874b7ae8aca8f8d1886a55f1a94aa4c95b0af10cc81c3563c9379fa813bf8060a6974285c1bbfef1e639b00a4cf7619191ba89ab58c18fa2cf09f6e8a5d97fcade05d49291d36de67774e3cde338f876663050d46d0819cd014b3e83a16ab2f547f187494d1b45175fad43a6e89c0f2275812c2f351df7b25ee6e289758a5ac649f5a9e9dff5582259ee8546e5eeea9bb2ea6d15d74f7c8f54d233259773834ed6040a766a2390249e8b8a6f7de88a63a7a7f1b789cecab7bee6dca00463eed3b8a48269a0781db6ad8fd8515aed71e0f68b90bd9d9087aef0b2006445caa92c1dc2cf9c7a5727865c0150b87fbc72394635e92b9965fff9f6dd59a1520011f84755fc9dea05d58f68e8970f580c5be24e4fc9f38fa636623256f4a3118dbabef23e9b4a4fb752763651ebfb6af97d1510ff9b4e4d7aaa52656a1b330b1802702ce29a0313f415ad5e4c4c06757fb67a5ab853f6693ae8c75291ed306f3ee0baa3c6cd9f6f8ee93c15f2faae4569ace1e1c830edeea804ef0955cb8e9a084d87e433d609f18ea0a7e6bf5828d4b099cb8dea1d589508298f3e13262514323c8a583d3a6e5409ac5b8682dfa836056be2154ab2b7fdb34540a4237e1afefb02052962694bce1bd5faa753d02ff1b9f96847546f308d555bdf37dec94e62eaa1768c01a0fbbed42b6f4c6df82363a67e021fd055734c7a538f560102579cf06d39eaf131b529fe80226ad298ea038023cb51d572df54a82937899fa9fb2f0d11775091ea3ab909e240890a714b0819a51af330952f4ba54a35963c2d79d3b432d5d80d53f994db9708cb1e878a0fc78523d7d756259affef7d2126d207f02d3c97eb2bc74b4a01709bcbd8053d33db99f485b852c40c89a3d4243dc457c0364aba04817774bc3b05e1bc97ceb0047674bc3b044dfe4d7651b4023bce8d5a889dedfeea88e9ea0ae8d45f8bcdd127d601a3cf45aad8eb19faf29bc45f5eee85dfa97bc4c9466eb93d50ef7a6a91393ad57a72912a7e3d41bdfc26f09f97abf03aef1e713391592e0fcc8aaf9aba597fccdd24eee192521bc2913611ff79b90baf53f7883b13b9e5f24071db573fec50bdf9d4a35ae5b13d16b589f8cfcb5d789dba47dc99c82d97079c8bd3cce5fdd940a59bc4bdfc6f64864d1db63edc37d462b93c50dade21ae4cac37c9b087a7bfb4199bc90fc619172a3667f65f29a62ff69a390f3ee9d90f0db13a211087b9a55f1533696548997e1fb8a6cd0a86bb9b9b8626e97d21d8f374a29378dfc38ca024654b133718a717f35cff6e507fdda1b7be4d696a13080dea8cb62d8d9fd38262aa34ec64c9c64794cf6aaa68ee28a17f30d5e3bb142df7e78b814941ecfe197b38b407902ee7503ac494449dc7776679a17a9d85e861a06760a3c25607c000095c79f40b628926984f761585356f88e5b8b03539f74797eb8acc843c0e33875248e12486c7b3fa240f1f539a754e1edbc0e317d077bcc4eecce39ccfdfe05286434ee723362fe8b11580686df09f986c30ac13953dc6febbbd2cab41a6b815f71daad4081dd43d994ff7be7a49b42768d8cdefff2b29c004b00fc7834c4634ccd8fe3ac6ea32d42e133b45900bd57d78e07db75f841058b088cadffe757ae9ccc5d2a8a4c1ac5712765427ac73b22c85cd4df9023a8ff0619bb541dc542f775be879db284f64ae4fe80ccb8faf55ce93f748b05476781178279f8edaa09397da7e067ee6b7aa41afa870b3adfcecfec8f7a3c69c84f54523fcb786f1dd0d617c1fb3afc86ffbcba4bb39c3d95a2c75ca4595ddf5483cb921e157138aeff7ca55cac6b180df3e98801c3430825493e2055ea177e381ad13707e080129de48df7c8fe7c2ab31ad7d98ab078de822c5d785624074c5c50e9720125d8bf22706713d7c9e78e5c62d44044b303999c1db1cdafc28fc7050113167c72789daf398532e6ec47e8c0c854fdd6137b0e3b6543766dfe9206422e3bca2012edf2b37852670630012613274d07ed60371d2afd9eba53b447a775d1490a24bec01ea7919970c462c994c8391766126ec121c2e4e3134e27861ce15ebebbb2491c3526c8beac9386f6d3117b4842231e54203b77f954b7fa88617124fa7d4418e0e8870729241c55fcde99c9c336f81e09ee7660bc8ca546de01eb5c6a53c3e4fcb14057af61563ad54a39331a7b7d08455c4c17bf7b8424e6c51f6448d64f12bf0c00b7984857c809c74b67e7b1f1712f507c1f346d9c4c5eaedc274ec0e79219d329c9ab73440b57e26186aa4949147c022d4eab98d803362961af5dd8148bac32dce95e6a058b75613b72fa8278eb2e17fb44a1ed8d09caaf358c17bc984b9a1d1e622b559a2df796a14ea302db353ba70bae06ae9310ab0d9bbc393d93e7f6611e885316d7f699c77f31626d1e62bc36a25ebd9fa655332ee06ccf324687cecf9b23acd81d2be70949bf30523db7e5073d628d6cf07a901b2c20920ae2b2ef083d16079240275c2ff4f7e4f6a6f3165507d159add781d9ea61cae626a8fd3cfb22e4ea6c594bb35eee3631b3ff4ab6883775909dbe78185030e224111b63718acd7e43098d6c8c4c43f5c9778e89daa1c65b60342bc0ea1c84bdc8295763aaa85241a7e99398962d7191300d4e3bc373a3b56908312e232c2801fa288cab55879b3079480f4004479cf73e0c81995c590e76f401e26ab7eb373fd436b238fcba4fa935767ea33de994a9451cfa293d64e54ee5047f5045991447af22330856e9d6b15d064c72a9f16da2cc6f29e7db530b912cfe4a952ebc766cd13880d3b130ac0771b385c7b272df56de087b69c1700a021158b28a7787f74d7e4cadbe4fe745e5b6838d0e7cf5700ae2ce93254966d0b555ac1c99bd5cfa2fdca021986f0a4493ee4869d98d08ce61065d692f0c856fea8e08b29da372c0434b5ecae8636f308d0ccc2fe234418910722601896ce7900b1d3399f2eba9211f746cdc00a8d8caae3d6bd9b7862c60fc544794d5c341399b8f2b7014d5ac99e135e9db9c4b6cca25f1f8d36583ad7894f1dfa3dbfd49be0724f666278b564fc04029e84c4fed0b1784223eb49883ccb624d2b0cf148f1c3f96fd788245829eff1eec55513ada0ed4cff1bd0c4c7935e4f10aab799588ebac13136b1066aa564e3b664bffa07b0f08f80044e4114cc136ec06528216338bccd8dac2605dc7507ef06b9c99bd25c2e68c5416270d1b42475d642651d1485a0a548877d0bd3ab9fdec6ce27e20bd403efc3a8ed3facbb450a587e4dcb6af9dd56caf67d09654fbfec666e7e0ad8b0bd557063ea7a83c749a1871d60aeaa97b3b31a675e8a8f2159f319ed271f3485e9d162946e594ed05341e8112ad442cb13fd702c319058c82b90729ce5bc3a633c48c29005fdcda2a771e28b88ae36a0754a17d6e1db02e9a50deb5aa1bb15a426d6ba415078120e04e577a07a49d4279710dce577c8edea00532371a25263da7c28d405f8f76dfbbb402f605be1c0ffa0081335e6106d58ffa8a0fb14bbd2efed2c2778bb5a48214d3480cb035f754854180b9f2cf3339c98b3ffe8af7bc87020f672c9501947e662e21deb96749c3a4029750d84e97550bc2e3736f296fd632a281f274ac146340ee7a99b7077ed4a3826dc20f546cb0e8dee11d329ca5b164e70ab70fde8448dba96f4a660053d3812f39a4c0f7fdd3243ad6b73fd20cfd88e5b3baccea8e0799e7404294f7750d10ad140a3e9ad4e906efba053a66c45de1acefed67b9e6f3682a4dc2580b85f22771439fcbd66cd9d1f7d910dd37e6fef28f4a8c261513490ea30dd98e36e3c84de8dd371c7fcb831088b91caa6bb6dcc862d42f645696365e2fd29a268e3a5fe30a45a365e416cfc912e1bc7d5a3267f09e2283b6378af0774fc0c4271fbc6542e0d1c009f5bc6758808a29c39e0b0e58316b719706f5bc183955eb7f1657c0daca734501c8c8efe6b3312a3217d5b60443e2939146d7b8bd3c6953b771804ff509ba26d2cd10a5c0af8aef7ed6291f617241275e66d8bf469972b0c7a20d3577b98f34f9e833f6c5a2fcfec6147a8909f216ec7157e8281815b7f4a84d1f3a407b3b6bfd6f4b16ecc66de3889d41cf3e01d29d9af03991f2bb8623b411d0588168ea9e98143320fc6ec3fd4c8748549f9f82702184a087b8aed6bc3401e6c58a6e577c0aa1aa6f5cf53e8605542c28269221b660c44da589957f4c20f71ca2627ab041b1d4a84b9556213440bed81808d28948b23e53bb351b9985318a759c698ab3eeea9b2cc51ffc233a313031a9f12b3edb2b02606788399f7463b03206ee464c13a77992f18f34c6734db317f25e3d4a97f1c5aacca81186cf7e8f0e884f6f1a11dd9b262c3fd998c45c0006e30bbe1c6d8152f02ee03decdedd1dcef9158e1a9e824ca244ac637b4603725ea27b116fa2112e1b81f0b8f3d522cb0344a8a4e9c34f47a57f95fd70cc608decf5fbe8c8d2e60c4b851c09e84568772c82f776d3c62bf090f1a05670d6f3dd2049613d271efabdadb67decfd27b1186f47a665d0294b85227f0ddcb106e8dbc6e0ddc773d27ce4f628d1fbd8825799442afb4b7c80b431a6cc9308b3db327f050cb45b387f2c2944f732edeccb15f18587bc088129bc2490fb997e9a40395af0d2c6edbb6af82056752707eba16bcbaaa961d74ae042926972cf9581d153140046b467415dff0bc1794ff325e5fbfbf81dc19ad13315054c7dd2fbddf1db548423294f15cf2e3480b3f8e6c4b7cff50a3bd889cc2596934fb4b94d286b43da0e9a0ca5f4968207bc815ae7b76a56db5c97ee8badd5f9e48afb6595ddd122e07b7be4f0dcd87cedfbc773a7a2e8b26b83f9d6724ae1119dbfbd952e8dbfdeaf858f068f759e04128cd83d7fdfcf4f91b43722f4f859ff4f59fea52f300083f8953a909edf511234c146920fb42e9e026277b7d902680dbf6529f3bcaf8f972db632bcea7d532b0863ffb74a919e36f1dcdf3ddf252d3c83c89a4576ca5b0ded6128d21f14f8d85c3b4a4df694f2da076d5f9967ce353565df17519240399c1de58914504142a472b1af029db0302c458149aeb4bfdd78586c6f47045c0d940780ba4e409e2e254247d1e48f4dc7393ae5f7dbc25e188a6c69cc3b96762502db7ca0416bd2370fef3c4a27fa7d73c5a18217955361e31bec2bb50dec63f4a64fa97892e3ceef694a34a09a4f3effee19e4bbee6ecf0159d433640235e69317630cf7a880d9e0839812371986efccc734b65cf757165b8e2c2c90587001e52d6b721c99c7d91b72dc6ceacaf4e641d3762dafd19faec156aec13eb3bbcee97be64c7d2c7d425eff2e5df49ac6d165b9451b35eea3dd525573a7027e19e4ba56f54ca589f245609823282276224e61cd90a64c62e2b81c6db0622a17b25911eede36a2d4872f16dc0c69ae81f4405eec3d70356e347d55f76042854a929e8fccbff9939e9c928e9a13e9df3c1fe4222d79325981763fb41b3498c7c35df43472331d8323218eddaa0b9dc69c3c5e3a0984900afe70b1578ede9db4bc22805538dd4f578d0ca8e2fe9f56867819adcd1ca2202feb5da1a7be1c6648d39de0acba4778356b9a66c4135508dca353d9c2e795cd6a588f0da5eb2febd8f7baefb682983f5b35ca35c206b922acadc11305599cf87295bb46ad1aa35eb4fad8a72dabfa812a653bdb29169dd9a5a424202476dfd8482c58a7a3268eef39456ad549eb71d12966eddec2ce57a672353adc5375724cb536014952a61612c41732082e02d9672e46dbc2ed8ae853cc4c08a51205969dd2ae9f29fd6b9e55af42118cb627aa740d15d4d286c1c19601b2d000e94e567623ed02bfd2c8843e0320c35c5aa5453ff38757ada16f818167480f89603a01eeee6da32b371f7a92becf8b83620a27d53b6f7269bfa8536dd74154b5b7bce80ad6e88e9a1389e9969fe676e024816588465a8182200b1bcc26efa6752fc0c7549f6f737776e7f1356f6f0d0e426ad738e30577313a34303f557937e501dbdec92d048810b6ff513bfccc0109b221bc6faca17745aee4d5e7303f2a904d929dc86c87445e49d397dba46488cb43421abbc0d01f71a1de277cef03cf308a67eccf36f88e6f999c5b3b7b9abfc417cfb31ae39cc99243396c9d50d5611c80c22d0e48db8a1c039265cb50b6216edc220e5f43ce11980561a1ca4a20587aa00a195d79ee2c1d9c0f46dcaebd0b38a4e2a89e2abdad87dd1a4bb5be01a43a6c2d769530ff0717fd05a478d1361e780ff6870e35609d916c4922e940fb7794a3791660c8a5e8d9a232324cc9828a33fe4d67975bcf9a4bbf66894fb4af02290be58b4c8b295b7213456bf01a59b430e08ab8d802cd105eb1fa10525c294c39f79c7975c5f0387bd1c307e70c4fa81ce46ac9877407b1fb8b877d243a09fa908fe203dfa814c0a8b01feb4cba58b71b2460fed5ae1999bad4d0eb27bae155b5977b656702d4661582a3b5bbc740fa22670d1419dadbb3afb6bcaf908994d605c2cc648676b4d1abbb24206fa42118de262088e6d1bf39d134fba8c76b67e1d322ac53861e7f0c7dab816528b3faedbf0926f5b3d208a998872057d40a37e909c7946e740a48525d6d146de629a3159249279d6617506f234a4117538e2bf99816332263bcae825925dcc1d5ce374baf9a7300cda69573c3759a0b42ceaf87890dd2a31aa6aa666267eb5f9ec243e17b74da1f8fa00b3b01bcc4cfaa4058b676b78b374cb1b2380049364f713a90c8c6684c3b57857fe7d46402e3eed68edd7e47911268c6fca6be48d25191881ae33bf6b330e14a4b7dc6213819fc4a45603468892a930d3a10ab95456ad402ef499bf0032dbc28ef854b87044d2267dc7e99c37e3aa204a8cd5744e403957cf73624d4935cef405f4a5108c8661f53eb13e34013ca6e779c86752cf1a0c474a32c89f3e36d6c1a7384d303400f074d6c45b791e8249ad9a86ebacee30c254892965c3848c7e9a317d691f18bea7d06d5428a5618c92b7bca6c3cdf2ac9b33733fa098adf15c09f21998032f936ce4b7733441b41a03481a6b555fadc0015ab0220d355208676880bb7a81bd63d74d7b281f0a6f05641a8e09f8acc80dca2cfe9ec8f2e2aac0049a46399542811ab4d1bf208927cd20c6a1c30cab30a4eb42cec53cba4534a21c3d1c90055eab741de7bb35138e406abf79ec2f70595cf3ca1bb41bd12e70e286c09c0f3eb4b21462868b0556c08f0259701065da0981ee9bfc6e6ee2e38b6ea0c13212ab17a1a3fbc7855eff584cfc3abcef8e34cbd40cdab5465a1dc05ada3077379659fefa42c678c19154c5fc908ed731db3d302faca9d4c1c39aa866b3e1be292d78a7e163592d0365108a68ea9d6536236432cf408dd81efd59141fc00ca5104731c1537cd4852075f301431d5035ff50be1102e0f4a757d55162165dda445c6f4780994fd92b9765c4d7bc95fadbcfb426ce2b62a108ccab36d0b13188f6d7d697df502a188a4fb16f4469a05a9f3c1b26afadfff53602c9f0d9c324ac5d1a9d46f93a2d6c16e573d375379e7d142c1560ec8e9fc791d1d4c34ad7bf1a26a20d624bd0f0effe2e0463b045f36e3d1eb915bf9fe341b2f9672960cff0d90052339ed522000eae186954245d6904cef900b3d8f1c22b6b6e7021b765321d04d9f88a89166a07e90045ac443886d3886c5433b634a56c456129534300c0a93b53d0419ee432f65f4b94baa103279220090dd88545f2464f741f9da06e09436db5ea0fcb9ac4dd3c5cfd7ead8aab8d79d89342397f59ae76da1ddf3a2d8c2d8bbe39db4c4f9cbdc695bc7fc730c86898ee304ea82b89795386aa41b79987bd492ce797e55c8295ad2f357727b10c374e0ab3a95cff0f0d641b620d8505288d7479a2feb433bcbe3d1c5b14bdb4ab48fbf92bad516613b49c771dd86c3a645bce1bcb4a7a598e25ececed525375b1910cd74fd474e51c87483d2fae91232b67cfae09897b287ff8fb7c29c74f99ced9d336059cc60c3a56b514a738cd684ec1a95ef13ac1d8d0bcb8c9b8f01a6d9ff01cbea000b628bf5ae0fe6a78381d01d3a414e8d48713085412f8b95d0308ec46ebd168a7d47719d160abd4682c2ea88722336ca954ba07399f808bb1c971eedbd5b3e70f259ab9b4ea1909d21ca95eb3825d6730da3494a3da2c14aaeac0a0b1c0c458462709327a19da7de3bf5e9a2d749beea7882aa74a68aba163110222052804ff3b1f966afea38645c79e7b137b598cde8afb52c5784b8d635851c098eba578ce0c572c0f8051028e85b8a3a227530734574799c109113599e827a43a4e196f7e01ad04ca170281808ab447b19307bdffe9cec70333ad2c6359a147c8336f46f1be2fa3c35842185ff40914677acc212fdf7ccf729e0286fd198f2c8aa50dbcbbca2372238658d62ff7a25cdac07715da882197f5cfbd289626705dd59bb0cf2f8c110926e8f2fae9cbf5b4294404cc0aa2a4e8cb43a84d5d0889009b02d717261c85b06384a00287611582d740221a9b6da94f67a9101c92a1fd4258ebfc5fd90d1abdf3b383471c1f8f619bbddaf7825a813fbcaac0fd35ca2f058a968f050a7a61053fe2057200f7f29ce920edc4dd887eeb79b80d243130af847418ec79488d84151501bf30a05c713ca183e2f9af7039ce585c04f96e6b585e6299b7f965928788c3cc0280e0923792bf8c03ee02b0c45cd9cc881604d3eb0660059d87ed2b09ec663879ee6a3bd1d89119b78f36ee183d63655ad6d6b208a5be066e571146d7bb364c4cfb9f4a550586f828a16ba96b4eae5b278e78f5e99ac581febd50412f5c8ac18a651874d1d18a25c60481f67d850cf3128f4e1e6d9ef440f101607fbc91c25abce08a4421e690595810316fdb3619f4f9a880141b1c9115494c0683fd5e3bb37992a4f85b921806715e585349ddb1eed231386dbd403278fa1b57dd658a64580f1a4befca0eb4f9c42a3734bad2e1371b91c3d7c072503fb74818ab6bb01c56111db803b4d1f85d66de84ca0e6f97c94ecc812aed4756ab71bc959a0ce03276d8ff976fcfdb930fd1f7f79ea7252fe1365d3654103b664e0c628c9b1515049ad3386c1175242d01d3803fc419ed2e42016ea6d849c63423a6c5842b86c343ad1daa11dfcb004a47a32e8678a7ee8052132dde0143c27c2717d2a38e105bfb09416d7b03f99f0da0c328f0160bf4fb352f061a66d88e0366ce11fe544ab9fe3b7e72461c6efb1ae469800c63475632163614017912589e73a4121618ab8d9532e980a6023304ee1f29070c1808c3235fe8dde66c1593b09c94113b012b450d4dc284fdcb5433ff42659220bacb21b78b7245d9de3ac08d126fdb838ac4b62523ab5bbe7b05702bf0efe7ce8b7e08e1a301be31c6e75b27ece8e5b07793c0100006d61dcf6920d6afdd96096fd263609c36633b09a66188e5c1e024621cb5eb1d293aa5110039cc852de43e743a04273b19d96eddcacbd90fe6a8a045ad039dc6c833c7e219b452dfa7cdc53845c07ea2b510245108f12c9a1e7578fa0665f305496085a110ff077c9696799ea325c94a49bc11016257e19941b3fe25e5b8e312e1be0181d817584aaa76563606cd3c233f31e8d5af1b9e1f460f067b9987859c344798fad4f5952a11b6b05afd83775dd0d2fdc518050bacb3fe8419fb33bfd8dfa22e064c1e9683c7ed1816235b58751d579c7045b38a17f184dfe91b8e212cbd66f17a8a2ba894ef2151c810e424cec51c4e3b0f220a458959865ee5c9cd849b67483567dab2aa5d39c1fcb9e1d48c892a927e53c2e9350902cbaa5318caa849c7013ca9e53a7e40cc800697944273ef2c8cad16b3519da82ee0b38c4c69efc42e6381d5b5e6bdfff2d91dd04e41825c0831e333551a948a15fbaa948503d9dc42b9e6e6781ab9318d5be1bd8a5409a40748d1fa47179d35557b505e01a7e2238dc305d63cdfbdda318b92a726d0089456345ded45770b64e97b209b539a967dfa89fb173551956ccf9b255728ad76699a2b2d8f0d83fe08a39e962768d5ff1cf3797af26a6fd8a7e0a0d15e2c17d68319e86bac5ac2156106ecd93465b196bab14914352ba1af534db1662be9051694c0e399f39173cac0208f571c84a28b1c00066e75d3fbe1e607d75fa9b4c93feb017e129d4b9109c06c2d46a3cb16ad54f0eaaa11b4c27092c9217ae7155ccf2663595da0362648d1055a4a1ef5873ff121f5f0dfd1c84ab6e83a10d2001d94117799f3688ff1e83391b86d7a8e89609eb99cdf18eec6a37db44353e411621bf08dab381bc6b2bcdb7ecc3a1cf2324475c2c449bd9a29d4715727c898d896bb992b953b12f716bf65c9d5a8c401f34559171b48a1a1fd43485b23e5cc11521f021c7760b89e87e04f0801bc417a3641385c83fdd1b04a1c5d934e9a1042023a577fa82a02f4953bdc2569ff2e2dc0eadee74bce5337a72e426bb118b1ac2d817ba16d7e1a78421c72ddaa484d70d0914b398c4feda048aa14658e63b1550921ea43a46cf927ab3a198f639112a09c4b49ba96f574e61ee50260565d164a4faca61127f8a37dfe2a85305e5314d049fe16b64eadd94d8bc7dd372e1d302fdba67832dd87340e67c500aa7dce1e3c1542715534c8e1568d74f63d5e4021412df021cae1af12a07176ef716899639d26a87e2baca90750841c401ec678e9a71cc396d082a8b22b567fa8fbe6865077d25205f88c8db6be8ac8d175a30709504048a8c92230f96c5ef42760e7c4739d0f8472efa333b04217e25a8bd62c98cb31a8f56793cc996a41be59427d264c617675b024de21fb76cda7c2811b03bce465b5e5efcfe1d5010eb6e5dd5688e18dd1c311cd449a0f84a28b6cb97162e7e9d28f9b0720ed7af368d6d07e0bda580f57f1814636d3d2b659bc0ff79c57cf3aacfc72a3a5bfbcaeb200472151d0a2aa9c4f82a88779bcd953404a4bfd48fd298b1f25766f059d2d7534588834b22d457971f347df01e7c63e1dbec0be71b93e6a3028ae4e3125ea8fc828398fe5e35c5aa696189bdddd90165cea06fd3daab652913c0056882ce20bfcbc27bdcf7bb78dfc3815de22c17702381a9cc0cf33e1a758342ecce546ecefca6d3e04f0a08fd2785193a05ea4b0eeca0693ba2806d410b76fa08ba8ecc7d44990ee203a9ba597b43d9e5a01dc4c00c174313e44c12fd30064b2e14ed1568c257cec8a164083ba9c9447f23a545cd35256d1296dacda074f1861ee688a80480b22db6010309978649312e222e11ba45da00123c8babfb1c405e1fb5d822e5d8b33d02fc96eec4291483f143eee1d4d20f58ac1585d3165f357955b997382f5324dd7b744c014d5a129971cc7c4e502d64435106f7b7b72d691c3254e6f1a915c2894afeb631e049768957ef5db8f87811abcfe1be819c21041a13d2d7d8a8fda43365aceb9ff3012336164cb8291e77c3a077f01621de640d2867f232dde91bf3b12c57375e4331379ca53938bb0ec39284e3eb7389da56a4b26142e7d5e65138516dd76d592b91386f0c3bd636089a830c75410348b8d16d460a42922a0acc9e0ee7c83a69ec30f4d28ee1a5b8eafb288220471a5a56f0df922c4c8bb8d1658568c16a400f0881b8608c4ed4c563f76b7de046c20c1057b701fb4e07b205396f1b9ed4b7b2a746dcf3ea268ff03c2c44c8d2f1defa4b2a6ab2f67239da095ca7953372ac4d04839f8f5db27f86637ee5968eae146d6c09e40504f93c3240f6de00979de2be85ac4d582cf38147b519e7ff6efbb8b13c257c4bdc56032fb48045e9c67f7501b5b9ab153800b23a772acaa32eee3755b9ab96557b70f31e3dd3c38b651999080c010641a082067824d65c957189ccc14969859fa01fd45a501bb93cf29521e2fab145ea8a35808a12e6afb7f456b07b8d3f9a8bc56bd6e099210bbfe2d964328e95a607d6bf730a90fc8cc33ad98bcfa029c34c26ec6dcead58d112fa9eff56b8693aaf865f9a2ee4fb334ebecfd6ff208d1fccd414c947701e4f14366f1ce0e1c49df45eb6aa1daa812fde744480758ee11a77ec163417242cf34c1ceb5a44930ec498d7d5d7e53bec56c417a5f294e2092a7707ae6e8e9fd4514ed973fea76a4ef0e1a079ac89e3724f6a8c5aa8caffe87aa5f752cc1b1a53dbd8e1c1bca1af824ba69368a88a465bdf1a8aba51c91ec88317fae7afe05022a6a769ac715fe454961a1825cec0d4036c46b2b98c714dabadb300aa4fd373162d1fdc002aa545f47be46b3797163ea712068327fea8c621be43d5f3d84481af30dc036ed43e305c2ecbf54792e09063b0f7eba03b2a6505b0aaeb85b0fb8710f50ea28f3df3cce780281910b08029a8360a8bb4020feefd9b253c0192b70be404093a1abcd91e07dfab4164348ec4d89ed05551541016b3759a1961f486935d9f11104997f80a042bfabe0e5708e87efc1e781ac37fdb0fd00b16de8437aaa3dac770f0e62e08313569b3ec2f6035cd1e34c5abe807821b1cf602cef440c2d34b221de85546e76bf87ff8aee8d745450abdd6b3f022886cb105f4cbfbe1f244c4afe7b179fc466702f33063f554aaf833a89606283768a1ba45e2ad6ff176a2eb0c00c9836542e01d48eaf50f4a8a4715905c7be92cb7a903ef19335f9e306dbf2869540b131bc2f5a36b2472004bea107fba178e3f0bd5070369f4de2085f099f2cc5d6ab5363cbadc3f8ff7e12fced00d1914a6818bac166e0f9504d7ee64ca443bf1d5980c24b72a025aa49e63e164a550a48a58ebd92d1aba9fee14516a06327ae801af32eeba3110620f56c19800690b92a90f5b476bd7750111385d3e57546aa35157825392915f9796f5cdfccbcecd19906a6844925150e3678a1c6069a93a13640c52972052a3dd41cf0103c3f6f403d4fe46f1bf154d8550b88e207ea8de732263d7c0b767890ca6df457f001e2f17b3325e4cdce600704cd994aaacbb1abeba8b378710eca4d174516a8fbe91258528f8bb4da20791ba3c985eec7d1b1933c711f498c8c07aede45a4f1ca81aa554f1376168e0831840a5513585eeab53ee5add40156fe9bcb571bbe5ee24bd0202a4aa3a3949778edc83edf359ad6f5ff3dbe133eb7634cea3c359c266d168791dae33893263dadeba0fc8c7197664f3bfbf9a8343f981204164b2b176028b7c032a35e3d7d49cb0174da1e4e0a6715439e65cbbe36aa2e3ed2e5c29e80aa1d574ac175a4bd190d52146f6d87fe4b7148542a18f722b11e200dc715195d69591d2a91dcdc6340fc19645d91a4d2bf3e589b711b4e25b4d9af5cea1a6bcf3c5128731b76c56fb9d7305b45395032f21b9dc99c34f84ceac2470615cb3362669b8ea31832eefa7742a8cd10fc60d5193515f364ac2208485d8b95a89f86bc614e5f1dc7174f3084a55fc04815297aa337555501fd8b0a3c76a3e65949c2fbdc66809796063f80db47de685873fe3960a7cc8cdb3d445d5b858428053f75ca8e08d5ca2b81ee5e2d33ca605722f987f98852ff183efd5e041f8b0f95b597e5a963fee2928534ea0bfa0ce346346e5109da0d5b8c2b9648efe7417c10e90eaf545f459ee70afc5e2a57995f1e2f310f1246835faef79b8d1f6e45ec0479fab8c5cbba917611f4264ef55aefad773507bc89b766e9a6b2763f557a7b3db707646197b04a1dbfa2d599ba5245c662db139c9520eae1fafe040a1b170da5732918a8b90be93121de9abe65d5c24e18d55523b67719bd26bda33d0467fd2af503b953ccfc6837d34feb6a5c69ca362517738fba3a1e419911f6e760f5717c5310da7d980176ee6a36387bf346886f0804055dd26a8a37ef2a70c4a8d633683f302e1e40b27eddf0b8f98c6131861987c6a93205a375cee3320d026ea69843c670eaf3998ba8329f251ee9587a98a24023cd334836b9b9b02d98943de229f89d045731957c7bed18e3cf4d60a2ca82f3e9fac3ac79c86d1628ca8e81723d23d360f2e41cb2cfa44d19df008e53e1564b0a825e7e9a8e6871ef7ec4590642c29e32a399ea7c2dcfa4d04358ca4a29b4fbc87f7b67198348d252abdf877fb7cf85dbb5e1f6cdf19455612c588a544b62ef33d6cfa1a8d70e3fc5d6a42224c1d6247e9b72e85d2757584ca5a35ab0d2b2558fbcbf478ac9238286b9d7a68a3c0a74d8c3c040aae23a075f91523508a0b9d53a49080b8ac265670501f18dde5bb75360d5a21aaad6beaede492e994e0ec8fd5cbdb123a607c19f5d2c622f29f1e5eb9775372a0c48b36ec1e7404cced7982f591bed55522c83e0ab6f6b0333b87714c0e63d2076905f46d51e1ca1a837e2c461c341fbe046d2cb9669d2249f5ce983700e5e117917647d6f554c0feec6160864e0ca9eb41a5766cc36f664928dc751e211981f599a76b76b295853675b7a288e7ae8c716d2980e82790cea06d6949a1c911d1c5c6c01f0facac053799cb2a3632b156c152bf6a752fb1127d5aa5f9da712b07924a3606345e6290d2f682ebc0d98795e9807d83142dd584edc20c70a4aec821416606e580b98bec6bd9865a8b97cc8c45eac62817dc3ede533cbb7cb41ac60e07e19876c1bbcbb84f572f6b141833e43aac1c56ef69e204f8c25b1a9866a2084b6a50c2dd5aff6595b10d80f24714f6aee4d28293eda0983e55ad58139c3b6285f300aaaed90a4d0c5a2343eb14639788a3ae438e0d00388e071f6a807685ef5ae6d4f69708d09fb612cdbdbc6ef7690cb1a8bd93ee6acfd907636214bb14f1eeaa5cbcb3e0e47c299f971a5c36a15383be697d943224667fb8b20d88dfe461390a0c888419f071d949f6734be01e27c00649f02e5fb19845f61206ca422baa6191f25669f7a3cc2548200c12102ca9fc710971376e091bcf311b2bb68e7035744f76c791591e800a6f658d9490028e08318ae546acbdf50b464eb5e7065d62c7b99a2f0bc12e6153f85fc6ac817040de55e4699b25d0a8862ad4ece6e13f3d493698663ef84876a037c9a1afa6947320b4cbc210755d2282fc0842dc1033b50d97e32204c6bae8135a61f7f0a705820c8a48bc159c02502833113ba1ff97a8685e663a6cc98a10bd9cbcdf89de7fa66620398421c120d8af0f112e037dc6480c41a56934fd73de84c0c6e34885f59b5dedb85f0c3bb65e64221006df543f7be051986bc8a8fdea628e7b4acf37300088ed34ee04b639cfb22972dcf7769e6fc83f51e78d68aced838011ec4e8efc4d1300b0d2846532a41776ce2370a59eb60e564ccc2ad8d730afef400478e4f766fd16c789dd5496b953bdb40df0f414878d741f8ea93cca475a4388f861436cc067b402dd9532d0d8e16bb74c318dea996bbfa2528069e4461359019872f11bbbb57bcb1f78a2b11363b620be430ad744761212d12ed1ecef313042a772243c6259b5db01411a970aef4b9cfcdaccf64660ce5b57eb8d1deedb10ced76152c150a45b7e574d755f5f81786e7f0791b1e9a40c94b9be8569e54f11def341dffb51abdbc982ccd1554306541c373f7d277c2d1918ca7645e88558a3fd6507a4f197ba1de43492ebda56b365e37079d703466340bf1ca6628aaee41c49ef403c33434754594a116d436ecb273c5543274ef489dc059ec964a07a831232b3fa697cd618bb2536048a13b081e80544ac87e1b9d402c8d7d5d769395a282fe5c66e0d7a5b9169ef5bf75c78c87454a00d3941e432d441c19afc1933a9c8c84842a4eb5934a0f98d4e3f4c2433a686bae7985ef260ab81387815b6e54660b0d7e9aaacc4fdaf5bd364ed1a484410b7a93fb156d47733d6582fcd80c1a90438a8d62709d1670167f54474692ceff1a4d7f2568f37fbfb00e096d20e8af92b4e18ac2fc2e4cb4b1f19294d0a9fc5ddb4614679524609f2044fa0c19c8d96f345b01a52f9540e69379ee4a11d25cb6c47d142f8dd1023f4eeb5a86af6beffbcd8734e001bb3274be74457563641850085fc143245c5d12124cf446f9f6b6dbd792075a106d564e84b1e23223189013b238e3e2d11c7cbe20c6de4011aef43f921e44cd121de5cd0c35454cf4ec3614685f61cba7d74328b0c865d62b4b85de3db88f387f7a43bcd0efdfa9233d0360d11c7a8064272890718f25cfdde928975fd238b5544688dea2b0fba373f7e10062631242898d3ca0e6f6612ff306f8db96945f8d02c7958cf2c7bde4fd3624363290c5cdff4619125fd912124bf5247b62c24b463f18737d2e2acfad6edf2f0d961065017fff6611a957e5204efa4c3c2f074b6429e7661e4d408fc82f80433a7c1000f382351e400b15f4552b55cc68e97776c7ff0374c4025aba96905820142adb1c7960292f4fdcd265f2a76dc443f32206ccd657da482933825cdc629e87f4ea7dea69699dd1a603d7ad175cbc1ed53a9df29137c8941239af525b71c5d0da8ddd3e9a28782962e0105153371121a1255b4a9964fc08e408fd083eb39f56a6ba64d74f4045cb279fd97f2202cca7550865149fd920e4af55d4ec61f9f4c65e7d5a916c1e260f9fd9377d7c669f860f1f373fe68fcaa73bdbdc0977509fc2a43ed5402f29296a5720e5a72ae0a729d4fce133bb4356d4042a2b6a06f9cca226109fd95ff9fae08af63d6a1ee3f7f81ce3b9847bde38ae7ea75b502afa3471d40c12a4c9b65f3a396a0ef1997d27278e9a42424eb6fdf289a3e6501355f6048aa326112250b6fdf2c951d38891a76dbf8ce2a879a4c751b38887a3a6918fa3e6910f47cd236514b38a9ecde3c807c9c7b66ffe386a2601396a2a05396a2efd70d46402e2287632bba8b21f25a025a61fdb3ec1ee3cb7f2dc4eced3185f471c45d5f3e8819343c6f7a89123e5c119392b0fae70397f23d6727266ceb4e2661047c7a7a720431c1da34431851c55f5086dfbe690a32a1e3e6ba2d2543daa8c88a3a39313916ddf34e2e8e8c48991238e8e4f9e1cd9f6cd224747283eaba2d2c631aaccc8d17169c9e8c8d19189e968db37911c1d993041daf6cd2447c7263e33bba8b4110c53c9d1f1e84869db37971c1d917c86b4b4ed98e4b32754dab8a4ca46259fd9cf4224ddc0db414e62e807db0699714719292a7193c5706637b2e7b44c96721f93c560a7f7d29b0aaacbfed663773c1e9e8dabc5aaa199f19ed39ec7717f7a27f7f4e9978989a2ea51f550f188a2eaf13cef3fee4bb9ff4627a76d3fc3bcb8b43879320614274f38fc99dbdc99e2ffdec51876e44fa7df7b9f7fc625538565c5c4048c26419876114c38fdfda6f38fddf9ce94e3de7b1763e01e3f8ecb8d47496c258eb20daa2b07dba2841e291b91e468adb33413b197545a1e6254723403f9cc7e10a45dc4b69fc46dff9ddee77745db5d65741cc7757e370e47ac759de8e3614e6f3c7a7cc24fb71e4efc4fcc1175dc7bcffc635d403cc8ba2ea1437d8263628de364b26edb4e574a224a7add0de39d0d7724f779591c55292693a3e4899d9c4c26d1c7e97bcf1b82bda83362c408fe3c6e480a1007927fb2eef2d0b62f8e7948fea932eee4542a27519760ac4f40d0b98ffb745848f79c16227ed69fdeecf7e948816ea90119c806fdd8f685a833fbdf998ef9a441fed941e6b67b7374422ff468e5a734aed4c5e1d797a93b208ddcb6a7f238aca7ccf757d1b5ca54be1b53b018c3f7a90f1b9fe9b653e699c2295d06b2b794be9bdd9ff858f7e0edfb9de6e1532387b844aa7b1e3d6ae450991cf8deb779a2f4464475a5f845b0637fbf056d3f2c8f78fe5c9d819cd8f6c926b67d3033b1ed874b642125b2906d5f85c4b63f1eb1ed7739489a816cfbfdd55ff861dfdf99dee7be1363b8ef01b1ef0e78fbe650daab8bf3ee73dee5aa0e8d4ec800925c9046582b6dd315e5be3ebe3ce2a7ab7772943bb79ecd69db073dd4f17a2fd6f7aaaaecbe0cb1a6fa40de48b0b10c1975874c8658c333c05ab79e3d2327e7deffc17958d7bd382cc6efeeeeeeeede019ad0b4ae8bf34f0ed269ee7134ef20f320889d81ac0bc81614fa7c8ef5d93a62ed69a719c8a6b3e87379b21575a0732fce0eee7672747802c043c423debcb98d731e1db186318d1a366a8835b457cb014dacd50877c4efc1add33f8c97e3c4eff139c473890dc40f76dd63bdfdb05bd00624ff6cfbdfe74fb72020bbd38155fec9417607674e1473e61e15757042bae7cec761b9efb9cc8137ac38c3f6df831f6743ac85e10d9a8ffb0ffcf2bb20d672a6a13154ac2116c0ebf4123aacf6dd30e6e99ea7f33c9a88635df63b9d81ac8d7d548cc16e7c665bc4e89fe69f0dad21d63076419461870e3f5fb66b435cadb00d176837cc1bf66e5c021b0c005187d769eeb9b30240d4e1a863b7e1ff82a8c3cff005f1c3811fe3b83bd3185523598e66caa8328ee3ca8aa5c5e5651c6162645e8fe3e875dc386e63cc0d207c870d20ec8e1620f00e1910bec30508df7137d565410ab6275de74f45c0f4fb3acf7bb1133f2f3be9ae5357b130c293922704c1e5e2e2f4f2a2b18b8bcb8675ce68588ba6e6e5e5e5ffe5e5c56ba96a689296782d178b24cb9953ab6a689a466b97782d178b24cb9953ab6a689a9462526ffe1060626096d0e897aac6c54a49519939f5caca4a6ab55a12c3f2299818182e58605ae65b3ae64ffd3fa35fbaa5a54555431383a4241323a3eb567d601c41b0b1576d6062604af030f8c44568d9b8586128ce9c1aa4a9f1bc26a598d48f35413541b52e69699967e998dff4e71a9af19b3935088eef7fea9fcd075c6530ef622d06460666490c4c0c8cd7ddc2b25a5149314b5235a65062a86180607c5abad612184800594a92056c69015d4ad2057c39c2118e8005109c82ae1316d72909b5e2d0da7bad6f9b5be14c9c8933c1028ca16d1f5ced9cf56adc36dc360e7b5c073e59ea9e98f438f96ca7a4ce69f3be4f6fd287a31eed1ad608fb7d60f6426f35feca559368a081cbc2b66de0f6713a78c3b93521e388b9f082628de3bad8865dae50ec3820694dea9cae8ded9c50620ebd1428ce701f3f88515fc5750c4155f8652f44711f6e70c88a4ddbd675a319e2e8c42c8031083af9220ba55dbf269935eb61cf031d0aa89c419515152aaf58ccdbf2b26d2d3123f7b295a9d09b61693d7333b361691c19313c43872467ecb83a1d12d6a27914002eb880c620800d001706a0230022016478bd0870001c3232bc6078c1460daeeb3c2fe7fc7d20087a332cad676e66362c8d23238667e890e48c1d57a743c25a343f7a332cad676e66362c8d232386cb6d1bb94daca57ef352b06cdb462e262646069f24e9ea6a6a6a58189683e7c68d1c3c37b08c9abf9183e72583c3060c2fd4c430801a37241001083cc0010db081010be0c9f1ed9ad7016408b90d7b1db912cb94ca18721bbeaf9a1a1cbf11e005c3775d8daf79c9e0b001c30b35c8ce45036b89353cff020c3670c820f30578bd6a6af0e4b801c30b386cc8bc6a426ec35e478a656a0cb90ddf974c4dcdeb2553237ecd4b86ec5c34b096f835b500c09063e378010037645edf16c91d9d90dbb0d79162991a436ec3971445d783334851c4a87f91ec5c34b0d66fdc1896292cca7c0b46e3d2e93e8724c59779d5c05a2e9a8e14436ec35e478a656a0cb90d5fb2134592ec44acca22d96ddc189629ec89b218ec65e36ab16a3af2db788b09b90d7b1d2996a931e4367c378c476ec3e597a5e93ddeb8312c53de134e95a10e3c8cbb06d2a9074f03e924896f914f48282ea834728c2a239f86bc8b8c22e467287b90f892c7117f53fa04f959e983078f53fe185102f9ac0795560e516565d00e9ea6fc01e46bde24e268590689a2d24a24aaac1c520af9ac1cd2c1e7e059457c087e9444b2a8b4b24895d92f8df8cc7e79c4676591cfaca3a5519e41a5954a88781e70f022b8c1eff06279e4b312c9676592cfca25a552d083c006ff8121fe9fc505ef34f8d50bde816aa8341bbee64abc0dba5eb156430fdeb6e16df8fb2ea45de87eaa984f57e7a732369fb2887c2af3229feaecfbc4dfc775c79df8fb60ddf126fe3e5977fc077f9fa5eef8d0dfffbae33ef8fbadbae34cfcfd9bbae34bfc7d1a754788cf2a470e7fdf85ca03c4dff78a56d4fbfba98a867f5fa5a2317f1fa6a2e7dfa7a9a8cddf8755d489fcfd1915f522a7901c906c177a57e241572227a48164d7f0d695f01a8a6897e2af16e2529c4054245ee4ef7b919307df35bc8ea8a386afe1ab28801ade859ed07e9fd07503a14519549b1d7820f236da9ff8f37c2ff231daa1f8307c37f29ef70e84e7f40e3c8cdba3782e87b75f6b7c7a374f8de7f91c74b6a2dad8f728741ea2ca8080a03311467436020a9d9328a2f3d0133a434144e7299c68e207433ed0d90926748e62099d91d434ffc4b89cba56592d00307836df16fef636de99de8f792cc670ff0462e3fb31e799eed8e16f7fc3135f17b2e16b0d5a878a6493893557e2e419af12da6f72f89b1c4e202a121b90d8705a1fd6c7c9d172897bef819313474b264fc2c9b64f3e71b46472ed93501c2d9bf86c8c4a2bc1a8b227474b279ff7214fdb3e19c5d1d2890b21a36cfb658fa3e51347a267db2f79b81fc163db2f7ddc83943e1c2da3380f7c6cfbe58fbb11676aed97403e44a5993daa2cc851d3c7fa0eced4963f1c357d3890b204e2a8f9e33a38536bbf0ce2a809e433242acd1ca2ca86b8e740c851f387172134e4a809c47f0c1129526926125566c4517348f84ec469e488e3e0c8b65f16396afa0dce2223259566163972d434e2bd071d21396a1e711b206dfb65920f51039d8580744e5267f69d063a1f9981ce3fa833fb38b8103affc823d07988fdd179a8caecbb0c74266263a0b31118e84c850f9d95f8ccbebf40d72ab3f1ee025dabecc67b0b74adb21c5f2ea93453499529396a1af9ccbe90a311bcfb9c483cbc0d679208be86536987b7399740f0e7c9f481a7e1c44ead73ebe951695b1055363ed9f031a78f8f53d5e3fa19ce1fa02146a71afee61c9dd0f0b3737c62714e20419018878adc7c78ce9e4608e76bcea123a69292e63d2335cf3a591f82a2e7ced43a0b74b6410f5f81ce47f0d05948053a0f8151964cca261bd3be676a83f01478cf8e47010a700022871d3b80c8010714fce0c3094c500212f4a0b390ea328f6cbc8d1fc1792309004a2f2cb970e3794002c08be085df412904676ab70b0f820fe8e0810e7020dd80063240812d8877c2c00564bc052af037c8b88102397c8f1a3970a8c0db177d581e19670eba15d039e87c4495611f079d91a832ec5340e7205586fd1b74066269d89f80ce4e54997d09e8dc4495d98f80ce4cb8cb3e04745ea2caec3f4067a12ab3ef009d1ba0b390271b9ea2b44e558feb6480aac7021490000438d5e0e48406274f66380f30061403c85000022cdd2c31fd8c89c9e39c3ac068f2ae0108208619e391a35b8fa53942a2a576d3bee644cf33b51b7dd629bea0baec8f4bbeefefdb177decce6d9da9ddfb5d676a378efd38feea9c441db247c066eef51eefd8570655772d003acd404873519a9dc021faa49fb6d29b94460ad2744aee34ffa42c3bcd3f69de62079c536a1d2c14d3b450722c949cd302b588f6e747d72d23d63226bffc5097ff7df85352e65396fff4f5a7ad964f6fc24f69789fdad897bb3cdda7fe7e59776efe7e4bdd99fd7d5d7770febeabceea8eecefefd49dd7dfbf5103507766fefe00eae8283e572a2a53f3347f3fa6a2df7ad6dfafa9a8be1fab684bcc9f7f3fa7a2e1bfccdfa755d46b79fdf77745b973071ec6cdbdf7f74c3b509376f8f941d1874d08136b57f4d1e2cfa7a24f4dda6006676821e3df71c6df9f01fe4bd401fe05c19b99ce3970977d1c9d8fa82efb319d85b213d565ffa57314eeb20fd37946e723eb42b236f6697426a2ceecd76896ce46f8cc7e4bbb744ea2ceecdbe853e7219fd9d5cbe80c459d5919cb6b9da7f099fd164f672beacc9a3e1b02d46115bfef5da735693b7ebff91ff555548016470cd92ebb6a71c40bb61567f066a8451ee77f53ba5ed4997f2c125f2e0246a759893437916620a4b928cd5790af434dda17d788b59c59ac9a4426d918d106715f83c56437d73bf16a976d5dcdc2359ba6e166ba7b7a5d78b5ce378757ff27b3bbfbe205c1f52fbc3a26bc1a46bc6178f58b8ba3c2ab5bc6ab59546378f58a548557af946478b58a598657a7a498e1d5a64a4a7875b9a2125e4dae56c2ab552cabf0eab18525bc3aa5036f97f06a144ccc8bb8455d73747a09effa83329c7fe74b78751803135e0dcac484577f2f135e9db5f64e1d5eddcd9ce1d51ccd4c78f5564313fad5b7c50aafb6ae5678af0ebc6f706722bd99a43f53a9c55c324da61715271896ad6725ba40f4e152f7925e1982281329ff5cb1edffa994a130974ca65cb4ed6b3303c1e58439572c2a66fef9721419c9b6dfe523d105a28f8e17364ef34f2dda5f4de8126b2e5cb41d05b6421ab125d63cb22c5317fcc2af245d00e159e2ef231ff4bc27f5f66326d6b6a0707ba4d715e0fbfcdfe71b5187f71fea3f8d3aab757d0f3e08da84e4bbc45af818633cc3f8f426d8ba3e6742c4242c693cad43b8f1469e3c2326f10bbfc2322c4f77e2e494f21e6c557106ecbd8d58f3bc170b0a8b08ffe062cd4019a24f78b1c5185b2bbb37ffdcbfeffd4dcfc6620d3647f72407fd1c81ada85b043911442048d8551cf245cef8a93b91f9b46661efc47cea295841a5793d2a7afaf8e866683ef51fbbbe175169355fdf7350693aa83badafef3ca834d7573fa2d22eaaf33376687cea423ce2a73e74f3a91b99bd13551aced7f7292a2df6f59d8aba23fbfa9ea4d2b677a35dff04152d9b3489f29fd631767d1154b47472aa82feb486e1c467d689149c76fd0b54b47cf2a4c9e5d38a84964feb1276fd0754b48412f7a8d2b8bfdd0dbb33ff1ca93156f062dc255deb83510c2d13f7a242ac8574de6dbe05711aeffbb4433186bbb15d22bcdc36869cbe9d98f1e3cd3d8ee3b8f7b8d0ba368ee3de43ebdade6ece7beefde33cce0a81620da3eeb53d18fd71d89458bba74d62f407c7cbda82b6a04acb36c6aa451248bb66f1021f2630618b3e95e6bd0557e18ab8126b281a70b6fb2a8479954fe91467a75cfbc65a2593f353bdefd73466dfd2698565df32e6d3165a29852ac3d92cbf7a70c5e16cd40af538ac88f3dcc9836fd4bf441da8afa20050cff2386cc9c4d1f24909a57c2aa39452a8b4520b55664b26dfe99de51347b1d3d6533e95514a2d704fce270cdab0d3e2bbf4ec6df4cd9f1ae76374ec65b4ec5faf3c7652f5d0d0f9960563e18d58732f1eb4a105b45f71831e77de8fbca87f18cd9efa456daa5e5424dcb42ed52e7c8450b9e8a21ed52c86f06935daf7c7673589d2a73780684b9fdad809cad937a5b1e4d3d9beb19b22d4b4a6e585a3d1a72b99203cd1a71bea577cca25f9f4a58a4f61a8f83406c9a733459fd2f8164e5bd43cdc0bd187e8e3c5a7a28f13c66e042d24e5dd0bcd834d3981a8eec5e3ed5e9c2e3adc085ebc1b4186a8e3be7b21fe3d7158b3a79a434c2173c834b2749a4542781ad30888f99d66d269123199b0d3d6e3475708278dd1d1d7609194856be148583c0b298bff92b478ef74a4e7b62544501a82ce4ed42e748ec2b9d01949926ac6e556403bd16340bb92bf80762bfe063d7e03b41bbd03b427f90768afe221a09d8a8f80f6295e02da91fc04b417bd05b45f61c5186a91c7dadc99deafa1f1a1e6bdc77687e64c7fd8acf7de83a06b75d59c7ee408cb033d08ed4ade53a0dd8aff417bd1a3408f5f02ed55fc0eed44df8376a32781f6246f02ed54fc09b44ff13e6847227aef44ba02ef4a3406deadd017f851dff06ea41bf09e443be0bd0afd80772a3404dea7d0117847a225f05ea427f07e85b6c0fb161a6f6ebb1bb436fb16dab72bb142f5de43f4a36a4cb9418613a99ce8061929a317e9ec04129d9b98426726a8d079892a74164aa2b312469cc7f2b6677ddf8ecf7addb0de11440a8c740fef493409deabd02578a7429be07d0a7d827724da87f722fdc3fb15da7bdeb7d0756fdebd62cd8fec884edb4bac610c131f2656a71da79dd3a310ad6cf7d2783953bb5f5ec7e54ced76f91937676a7718b6768bfe96194e4cf685df8ed437cba9f22a5aa7302d4490483a65d142a79f854e5b58f8914e69ec8061505a079cd50a070607e6b43caccbfe8a08ccd175bb8835d3457c116be5a752effe76c8e8e68337ccf9fb288dfa944e2d949db2c2a7f6c7d3db207607ffb5433b9f5a28883eb5531cf9d45a51f4a94542f2a91dc2149f5a2350f1a95d42159f5aa77dad13fda925628bb47c6aa5b0442e9fda2a5c3eb5462a9f5a2c543eb55ab07c6a93583eb55dac3eb545587d6abd80f9d42601e653cbe4e553fbc5cba7b6c9e706fba69688313eb535f031837d530b54854f6d0c7eec0bf64d2d0ca07c6a59b0ef5b1e8eaa805443f448f9d499c2a0c2a7bed4a4d2dc48e753ffc28a4fbd49c9a70e852b3e752b1c7dea58c0e2538f92c5a79e052d3e752d207d6a83d8e253ab82209fddd48b30854f9d8b1f41d837f524313ef52c805cb16fea583cf9d49304f199fdd4ab08e3533f320408fba62e85143ef527849ad837752251f8d499187225f64d7d09279fba907ddf8338aa2252c491d8aa4f5d0647f8b446617ae751691e84a7f1a9af40089f3a0b923ef51770f1a9dba08b4f9d88217cea3f943ef52288f0a9e760c9a76e44113e751e18b9c2be69c582113ead553832857dd30ac58b4fab148aa0b06f5aa3b074df028eaa8c9480c1e4d3cab4844f2b93232ff63d82123ead4440ea625fa5245c559216fb6e8184fb017054b5a42af9e2531b1b8c4f6bd1920bfba668934f6930cdd837d569c2a7374c60fbca98f0696b83c1daf7691c5535f199fd277cfa0285d4c589c5099fa638aa7242cef8d444554fc07d53d19d3e45eddb841d555dd518dcbe492c948d7af3411316ca6616ca2ecd72a685c890710261a1ccfefeacfc98a8a31440f9a8c761553e8eaa9e70543edbbeca87a3aa28311f3f8e923db197fd00394af218a2d2c81e418e923eb27f05fd7094f4f17ad80f208e923fb09f0112c4511268e6695441b67dd51047c9a01a954ac8515225b4edab861c2581b488384a062952692412461c258718d9f655471c25858a1c25878c1c2589f84c49a59145aaecc851d20892a3e4119b23fb3c531b73a6560669db5725394a162da93452499529394a1af96cc951f288c951128989a364d29fa90dcfd47a4c9b6be228a9e433302a8d5c52654e8e924b4e1c25999e384a3281e228d9c46763541a0946956d676a6738d9374fb67dd593a36594992a8aa3660f8e2acab64ff658fb240f47cd1e9566baa0ca7c1c357dc87c7c386afebc7cfc386a02c17e801c35836680821c357fd004fd70d40452f363db2781386a06610541a2d2cc1e54d910474da1961039441229526966145566843ce212da3643a79122f2c8b64f16396a1a914a2acdcca2ca4823f2884422931c35658afe68db9344b2f6492547f38fcf96545a9e41952d396a2e31396a323171143b357154f401835bda4e92e932d17583354697410c1eac318ea0065fc5da08de85f82ad2a0822a0304e3bede76211e6b1eb08caf1c78efbd1d08f7bd3808c14189075dacb958abe1411cfa937615bc5b413b8ff731b4afe0bd0ada7bbc43d1ce824fd11478a782cec0fb14b406dec5d01b787fa2d3f7303407dea5a03bf01e05ed8177275a87772868d9fb1374ecdd09faf5eea461ef4d7ae61d0c3d80f72fb48ef7265a00ef4dd031bc3341cf785f8236c03b137d8077256819de93a00bf08e044d807726bd80f7236806bc1b412be0dd0b9d80f7258d80f722e809bc2fd1127827828ec0bb9286c0fb10f403debbd00e78e74237e055fa86f7247d817721680cbc074157e07d0bfdc33b92f6e15d0b7d82f72cb409deb1d025783fd22478bf42f7f0a346c1bb12ed2978b7427b10ef467ac77b122df32ffabe57a1b77724da61f05ea43d06bfa25d88ef340e4f435be075b4f7bcd64264bc53a1b7145497fd9d29f40eeee37970a9c1cfabe81ebced32f816bd83101ebc3d8277a2113c0fe3f61abc1fd13b84a0dbc216b6b05bf03e83e761b55d060fe34a7c5ec7791de7755ee7751ce7754d4d4d4d1cd7c435719ed735715e13e7754d4d4d1cd7c435719ed735715e13e7754d4d1cd7c435719ed735715e13c7795d13c735714d9ce7754d9cd7c4719cd735714d9ce7754d9cd7e4755ed7c4795ed7c4794d9ee7715dd3b7357d5b1307b4709f7c9e9210da27fbf47d1e153ea527568a44f10b94c5a28842a1502854ce5935822008862314aa51951a53636a5ca5c6d47892292a7c624c818b274a5310e389d214c410438c274a5310c39b8218632a35a650e0976f4a13ac9a1a285b4d0d6ac3051c9e1a8f1f2796a343db99e102c2ba61037bc55c2dccba61f330edfa97763d0d1aaec71f73fdcdc7dec6f538f63316c6ad568bc552b1542c15ab65c35e29292ccdb2612f15d334c9d5cdec26d63262a96cd8cb260ca2940d7bd9844184e2d15bb977683a393366487226262946a986ab226191a80b2f9c9818991a3c3b349d9c19abf35cbdd6369248e16a115f92788baac5621937ea020ccc57836787a69333c3c5e545a582bd5229295a2c168bf52d968dc6cfd2a94dd3c999e1e2f2a252c15e2eb187a5e0141a9ab781ba00822a357876683a39335656562c2cf8d50a83c825b6b888984452d0f4f62ee8d8b3b4b87572669064f98299281395aac1b313731149116e981682f3335e38e3f8e59c93c415d34ac2d2e086a55ea1188a47f27e11c1886c8858dadb3644dd7e11c1886c8868d078b0c638fb197106d7df3c78a3b175c55c5ff7ec61626d76f28cae99cbf555d4e13a754e6c5db1b3d2b45a2d57cbf5ad96eb046b5a2cfdb25ddbd6c9998141304c0ae3ce44d4c7247dcb88c56ab158ac56ab6523e3613af62fddfa197af62c1cfcc9c071a94b37b31b56ac65148bb5582c568bc562e9bb61af18ab9524c66a4921094bdb0d7bd918b1b46fd8cbc688a5eb86bd6c644b4b37ae67e9afc57afcae166be6d42f1303f3e2d2c2b25a5149314b5235a65062782eb184585a723bc31030e6c920a7f5fe2d83636036c871da65835dc8e9960d7a21a759f66aaf6c100c39adb2533628869c3637880a395d6e3015729adcaa0d9221a747fcd7ffdae02f451ddef61e2cc34ed71c9c4e6db00c398ddaa019725adc604ac8e970832a21a7c10dae849cfe36b80a399d37c802b6849ceeb80dbe803021a7f106634019f0c119d4f6953bc15665d7ff7ed68efd626b63698c30be5bb5b159aa756f63831383fdbc70c866373831d88bdbb31bd8bffe63ff8abd5edb067bbdcc97f9325f2d7b769324c94bb3ecd94d129b929242ae727472706031a397ca9eddc8a24094b26737b228108d2f574a8a4b656576b31a576392189217b96737e739f3d26abdd0d4b05849a488c1a4603889aa280ca59069d84b6b302646e64d73766324154b49017bbd5eaf87bd641aff2b2646e64d73766324854ce3fc4cc35e61c8d2d2e2f2328e37b03088622998188e7622269114321dc3f9574a8acacacd6c35ae4632679c189114e19edd94e507e69c24961a8fc0701270cf54e40d2a854a1dc9fb86684624237a696fcb88ba7d4334239211c11e8469d889adeb7556a22431580c36137b85a1880a83482735c6f43c0e2c566384f32db186f3d22f3b1683c9746ca671fe46c3729ea675fef5c21ff8cac147727472706031239c580cf67abd701e067b1c18eca5ef9edde0c45e497062b09cff25852476cf6e64462fed7b7623337ae9ba6737321b1f239f57ec5f30fc3118aebbc5aaa19939f5cbc4c0bcb8b4b0ac565452cc92548d299418823e3b3d7d4eaeb30b7802ac34a9c964db07b177be8ae13af2ab8b35f0415458ed4e9841d22c735628984f695c4fc4da156b60fd8abd8de392a4595a287bc898fa9b7f737256e7f677d5019c0df3382c166174dd56acad52542e16b7cdb163acb2b21db1468c6ce276b9cd390ebf732b620daf2c11ce0e0d71d6ae583aa1214338bc6177f72beae03616b186718b170408c69cca0ab7b2baced2c27dd9f3367bf3ddae15459075c67aab2ecc6d98c57cd9357d570c47a7868d5a745493c86d45826166d116860546e551e3afb6578d2ad04316ed3bccba87d5f61ed43d8c3d78dbf3fe7adebf4a832c7abbcea2f1466ddb7659f4ddf0c6990f7a62edaa7cc7f2208bcacb88351515abc4c225a93c877a151385e2cc87116ba619d331a1b84eb44b4ba8bf9fe238bc5197fbab63dcdc366e37a8ca1c82a4f7799c3883f7dbe79f0c6477bcb7eec9bc28c38eed9dd6a8a8c8cb1a858a116b28948c87c46d9e688fec91973d16cd7da3b9fad23ef508b14fae0f1f9f0bf4737fee8fa01b7483881708d105822dd1b5449fbefb05462c3fad478e51f6e55d311c9d1a3692cccb12e6cf43575f1f566930dd1e510f6ee10ca87f116b28148c28c30e3fb1d2c549f76ef84750100e020408161a32041b118b8630d211d111d61808ff10e11facb10fec43847d50ddb38c5d296e1af3c03db8e3bc2f8720299679c32ae8c02d05c5b66f4ab1edab50b1edbf24d956cc5c6cfbb5e6a45908dbde222e7f7d878bae55a6af538a336112e589e889456721ea8c06d90695081e081992440f98f0c1d03d9fb84243865c224343f7881123f72849c8b546dc8f2886a3e3827d53def8b9441fe772b8437efdd64db9c3a41530b5c759f34c59364b06b694cdf2e2b659be1337cbdb94cd72a6de73cf81adf2f753e34e7dd82a2707bcdf5c757a8a8c20345064983fecda0bbd2dddb677e613849b0fa0e5b82d4626cf006ff93dffd4997d8fdbeed73f8ff3b66dc51a77afa7f106eff56d7bd0cb35c65cf16651e1bbaedb77f879df7bdfe2d188b59c6b983e0f2f7d7f5bbcd72fd6384e73a28eedc44d381133e1386edb6436074fae13476fc3d8e9f28ce7d6e334f65c1ed1c7a7c773cf2b8087451f31e8de9b817a7e76109f18b66df786b1ccb6f97eb1763931861877275cc7bdde827c0b6a429ff927ffe41f3303599d184dfe0947710b127dba2d48f4d982aacc3ab1059d334b4b95c6849db69e0d7f2b98b4e585e3ea4545bc5c68a650e57317df0de3cd12949bc02613ccd00a3b6d8ff1e6feabefbeb7c3bb2bbcfdc78931ecc83b76deb0ed7c67bd1111721ca752a2522648deb0fd4c776cbf620c3bbe1dfbd35ee77db7bd199a1c947ff28fcf7e4053937f2a3804d670176f7e2ddec0ec71badb39bf87b55757fe0f153ea7b9ed3ddeb1bff73efcc4dae7717ae3729a7ca8e4289fa88aaa6386060000000000025318000c86c2280e04399866498d1f14001452906a58504813ca22291064208a62188801882104180510320619858a460700cb5363f9d2f3f7949b97dbc9d8a877ef37c06f6f3d3726cdefab5e08ed72f3759b7d65ddcd131bdcac9850121faac42d28ddcb90d0fde9f95527848e7323fbcaba992736b81971a9342eb4c41d489d9329a02fd1fb552f847671f77133577c713362a2343e74893990746ea6802a5c801b54fac234dc55db3fb60ef3291be8862871074af7640a68cbfb9db304cbc2f48b15bc183b44dbf270a909b4874b4ef61ed5359f5b374e699d10256741e99c0c015d79bfe7d6891bb8a589b1b6cfac26b34ea5ef17864b63dc0ea9ed3eebf0efd4afc151a2cbc3f894454e70c5c2b7fcfc1d10a3b786371cd5c77e40e738efbd7f5d34442c3f379cbb6836199a62e59f8358fffc9075dafdb3b743c75f17b78051a912a01d943576f8e9b00ca7153b038eda99c501f4965a6201e53cd2eae4be5621e17f8459a05794ab12ef3fc261515ecdfe0cfa00ba1253212fcbc3fcde28f1a341bd8f7cc1181591cebb0f605ed311aceb56c4b8bf0628285be62839e695c48d28bb55510505e5e703fe15850974cf68ec1847734d6317124253cfc79206a470876f9b5b81cefbec404469dbb85f9c14b452dd488ec15c41f7869a9eb87ab94abb7f7eb7f834063e00b795f7dc86c3e730fae9ec8772d9dfd6a2cb2f75596b64936c150fa06cd1256faed46582b78e8d9078f5f0355619e8ec5d60390c5c966e9b7dbff54480c813e7e8ecfb6c4ac1d5a6128fc66a1482003a14f9ad6d82f08b5dc582deee4cea464b5a8a8181d005ee6a28b61b0b57c1ff70a81c349d7dfe0aa7e43165610246ef67eb510aaa5022d6db3d7cd103cfae7e1743dd643a1cdb637b4759cb52c55653f69bfdf5f1229d0a87a5a95902deec15b41e90a23e096522d98d5c551153c8d283606b8a0f99d7791f297ee52e673c606f7b5e0bc22c5a52439334f66b40103cbe897ed6d62b48b86f699b7a93b957b3079079df90e40bbc703368d0612c4a9375e4858835da90c1d8678d33dfa1729349b7251fd570ccf49477ae1df06e5117f8ccc61423d8c48e9e0eba4039c91742268956048f16848953754592c002875606c127acc08b9da8199532ef672618d9a6b7657fdbea76b31f53a865ac8b11f769555c5e8b676b80e0c89ad994805583bde046fafe32cc3b4921083db9b9b407bb5bf6967deff725c45b8c8796e0abd0667aed486caa809f3592799cd4e69c2bfbb1d122b4b595bde60393c08f2810c5d7c4d6d25c03f7ef2e4c0fb15836710cedd14df73f47d97fa330b3e8c836c3f1d2debe93a6f514156b943d4a34b3d3644ab7be9fc0767df390f90b98457fa2a2e766d1be7cc82f22e51ed0ca649f146891acb87308f1ea38974f4d40c8dec254d27fcabc6d54629f1c8955c76e07348271e93c4fe24b5a890b2f052f89a46df6a981847665505ea50150b07557ecd533120126b8fd175405a5ba44e6eb51c8ca4753e421fcc8e5d08e773c0398b27e617d5946f2e394f0e20abde11e137b352a716ca8d7371695bf531f793ad2e873c1b8b1ae6cb6830b956ae85b9641ae99b4951e4f36a74cfb7a86d10b4313cb7098b2b9fbe15af154a1f543ecfbefb5dd66d4e957fb10f736bbad733460cfb23b0353c96bd8938dd7f2eeb5383372134151195b69f8ef45f0b04fceff0bab0d3a306c14d53c39e35f34b96249205f1f42165d60bf408082a07bb9130c5dd8fd0e278bcfc5eb41176ee71d62c9e04b7c56cdc171e3784f3da307d948c84a854b42480d25ca1af3d841a033cacc21c8570fbf39d793df88f235ee33c5b8b051e2d95f21d89cbd8f677892373137925e3522445cfb1c055e4136cb35d51ed7e62c17131b8591f68270b8642a3c3fef0a3e0ac5ebed2cf0d94ed944d4576b764a3b4ee54a264b346f165cf38f2215afdc91bc1201ca2b43759b6939174bfb6378dd447a7aabab769db52158f4abaafd9c198c78805246b7f32a230e6c01d6c7e43fd495ed0ad575f80165f48788dc36096aa87e9fee73e6b387fe5cc80d4119e6fb0277392bef966a55d1f3e9c62f5eebc8caa09d15ca3dc9ac249bd6c10bb608cac8538c32bac51675629e8d389d0b95a87e46c16341aaa1c80f8545b556d6542c0c859e46a983dfa118d8dbfd01728782cba5bd7192c7b2f9c00cd7731d0c09ca50a990601eb1a1461d7fc2b48830a96e9b5e196f9adf2615635e1fdb3d4a5a9e2ab6526ad36533349ca328559d45c7e0eac76c9f0cac331cbf7cb22fd7bb1c2b98662ee5b511b5c73c6ccb9c4ad1e19c4775c67b70af99a72800f4a49d0c1023309e0c1b1808eb2d5a07d9ab3c60cdc9e020f2773e2cc4b1f85e6401adc5319b69e6ebcdf4168d640bcb4d06c7a26dbce3fd5d2e2536e826e5487ca1e3120ead0d826f598413a3f9c478204575b6b33530f79a766506ad6c15d94cfa45f9b5a7224bf2fec31b5e9a0cf84372056c4a5caff4e6b7f07e63c013b22d5dd335260d932b3b38f64cc6dc19455356321935d0fce6bd3e1f44643d3f4c6bd79fed1db8c8387833467067fa0b7ec97081f40bae161c0e63c54d79e54e57b1169f4df926ad1cc8a6668662db82b0806ce26bead492115a81610356c9b001e84ddc50329a122d3fdcec830307296f7859adf180a289926f83237c826470b641364e0ad4c123e3984125e20869b0b2f65f1d3d1f92215fc6eb3e72a6b7e0a9295f36a4d42f9e47c6e97f1c37140bcb8cde1874fd16744b03b8634a202f4f3c03c97dd0c37ae6143df36c4ec9055fd86df9b7b2f2fd1dff737cd037328eae2918001e40361b30272053a1413c760eb51c198257c4d84e795ed82ad40523239d8e5288a4021052724c2b3b8607e821a0d59dff3c009746469d6d27e6905c1e561c2cb1a2f6dfa608ae3dc8585461098913e55804820c172df22106dea6f23e2f5fa28e5c1797173ac38642306a4c5d972cde58a3712ead15f41b2e6f443fedd1fed2131642be7b665945428fe7ba74a3758c1366ec6d893e4d7ce6dd0099a143c55f225c22590a4f6252bf0602833ee783e30b977985213dc95dcc6514878b46125455c3278c84f0ad1bf173201ee299549a527ff0cbf7053d28c386fcfd25c08171a5db87b7ff2eed8f11d6983e7632cac68aa441c4f10bd7bfb2d7493727adb275dadc49ebdca1eebc4e0c00eee82f4784eee04002da04a2214558448197553c05d5538ba73f601d9c35f482989199ee506ef031965dc19fa42d897fa24c76b8da4872703a2cc7461728c3b79c1012caaa2b918b066c8a4bb385ed872bd93ee48e2e3d8f44754b54b56513d5a196eadb9e9279d3cc476a28aba4f8cd0b9c3c1ac25caaf76ca664245d68b592199be8fc323ae2fde730d3faa84e46729fe3bcec3ff40cc014bf15ff39b620796ba1fa2d9cdedb2f6d3f629121fb59cb965746f521034836e98fbf2d04a667845c1b640eb9e9788b4c0fecee906f2e34ac52d6337a11adf43d98060975528b19cd35cf2cea48b282e6aa9945d0415bbf5a46117488a79886bd88b695cb4e04049579bdff24f89cb1c4d4c52d8513ad55fa4e0fb1528a83f79b6e112d2e48398c7565ce21ea192ca25dbbd5de3395a16a160830ca3bfaa686bb8c2a00becdb003eb4b7fc6608217ff8d2fc007c81fad3a0619f757cde96cc43db48cf8c2a2a85b0bc0a8dd3dce984ed2bb072fc21fe1f8bcc1d34540d34a8d06ff4981f87b81209889b13d260743822c453c7314926c0230060fd77726cd61b0d694645b6dc19b274d710b9ebb108d65e9050392e56843d58f155e03e61badbe8391235298101adcb501c2f0ae8df1b90b22aa9e63f54a4b77398124499442fe6a6111a3253c2eb61cf45366ec0a5c63407d582718f399fbe768af542734f0d8e8921fe828ab125aaf1c4dc152a7f80645800f70beec19adac78a039c2d0c71e62d6db28c9dc7186035da16e3838cc9cf27c35064fea33f220bc72ac10f60be6582d502751eb0e787b7a6a3555221dcecac1beeb13045f4841877dcb433ebe852cfbed2a1f15aa0e40f35f2c7476bba06242515d2a4fb6693ecb65ce7e061562337203897b07fa09aa8fb43e3b7df2e074c9e2d7541fc5f18d3cae0b1e42a093f2e696b7bfd66cbdfd439ec1acb774963ea906c75f57076c989cb2d43faabe0923a69580bd8b5d3430c76204254f24f3d9cc8918a1263848eef73f9e92652ec3aa65116678cacb6e97d152da22f622651fd47fa4d95cd7f72e1ae8a7022092cc86a9f5e77062ec88179177ba9d6a9cade2d67dfa58ef80fe61e6f9821c5b2ce30173935ee0f4e3f593d88e212e494fda2f88380fa517ff01c62cdd3ea51adaa2968fe2caafe99920db746a26566396b28cbabda9cce958fb9e77534a330295d6269fbb8dc27f62b0d4932a89ea180c7120d9118d37e534df2a3d467d0b5f4ecfb81ed4c1359d0480726e8b7ffe2130639881d3f9565109e695452c95946ec7db26a82f83ea1f8e1909f1b96954d5e9d10aa8fac9aae04b8b41cd250ecd5c8f1a144eb918d405d4f8586953ad3938ebd909df62e655c8267d66b326535f595661cdf411c3b4462c46cde4bec27295fb10207a7508d59f2b16b1fe0de7481719c4bdf4e495a26e01348ab6dcc8556a844c5e4fea4a38f8d3ce376f844ea9c65126ea1b71a7bb80f9bcb79a15c1ee05da4c309920774478134c755c133bf805ae915329cedb94c1201e4cf86b466d935e23caff237e038bed730cb914ec8163ea7fbf761f69ed040b647c0edf0f68a91b526acb96b2f4fe028a7e533357be0386677c6d25ccdfa484541dcaa5a5c16f5072dd9c5c2c3de5423638538da7c01b5643a3aebfb5bbaf58a7c4db96e6459f2bf6d0e2545dd6495d10eb4198ba40535be04bd7c31a2ba22ccd0941f2f2ab68e5e3fb9be598921a2c1a67d87a16107d051c0504b1806647005aa71cc8fd11804ea9549f1408b49a05104292cb73bd7a00725d459f6496ff64a5459c8a4e47c5ebe800d20b2c4801c167c68254ea6b44033cf1a193557e0219fb9e1d7a786b0b582b86938dc5990f9be3bf7d0f38531c75540c50011ed4a9164c19059649033aed0655507bdf728483336a95f6ee638a22b9081c85a89b4c32e0cd023d2364866d49233b33d940a153a9c0f2c9cdfde80a277c347a024fbec70ae53bf8085736f2198763fa06741ec5906bf0af1d41d009c322a39cee74be20c9714f26deee135db8cc7f0350660e5e12441abe1fa351999ae4994e455aedbf85199c618c914a17bdf9040a9c0634f87ddad9f2a09f36b4c814ad8b6247eb0e6f69c9101959fd22baa7007c7c65833e6d19fded624d3466a94c5a8d1dc807eacad199ad04cb7d159c8e32e1d49ef7ecbd18452a33678286064799d0aaecb17a5db1484c85176eceace74a002c65f09a68c1af33b670e9b011fdd0d5d56dd6bf0182f22502a9c5e4400288a505cdee5845b101e3b2dea3c5801ca8d74c633005dcedf68bfff8d4778a13e0407cf64097e0e8032130aa64bb9a36ec8b82e7b3065e420d5cc673ff3c8306b67fc82ed434e23f002209d52e82a3112e08641870f5344230e34cf97780ffef310513e9c98b1bcca01f4a002b91bf9c16b597c3c86447551dea4b83ed0293002ae8dad0c25ba255a38513a5fde3f5b2c119abe4fea0f22a1c7cc83e7ff575ce8932d70e3dbbe32ec6982f0899f9a4e45e72729d1a9eca51398c97f752246c51cb55d34aafd0b55333bdac5a55c4a88a54082491dfa447b769a59af1870f5489e4651fc7c7a38ae8001f8132e7004c3aa4d0872dc36faf4d2bf95550716d9f6db441efc717a656cae585713d52866825d14d2b15a579a0911349e39fbe5c0cfcb862a16fa35ce13b8e5e2efcad768040a65922a2023ca6b9f4207d1b8ab5eca2169973b1d441b2456c0f486d83a0008535bbcd79c32269b9cbb0c629d9b5da0d9478e01859d999f0f4487249386d2b75242598dea6f3520894a7636b7d1c906d279b4be3332a5e8f36b75a4eedb169bc7d4b3eaf2d8757632188f2731604cd1a748351365f83807c25d62880b1b1e6e1277d839afacd097afb65decf1772c5bab08dd67ddb6ee2a1dee95326929515abe5c76272aa7582af68aa75f7b6e619bde39a585e358a42c6c19ad3457ec34eaf9965c45a443f7b5ce8fe348b704ce87af35982c720edc59b85030c72de06a491827840858760abb8731accb0a742663891d200d310e2c629c025622c89a7d0cf33f3e4dc28dc72f9b115920d0ee0613c1ead7de905b4cb2b5e4c1198ae576bcdb946ab25a85cbe308d0c9476369676056860f4176c9a181561581f4b0d8b05e72513e22e48943bca04d0f10a2b3d759ff067bc6c85e172075beab7d211968c776aa109de827b3f100f771f6c7429f7fbdc07f30c3848b215ebf47a009ec8804d75ed34391097467fca5a4c3ad51c00866df7ae414f121fd0c26aeab755c51fc8121a37e3cf87325d9efd0768a14da7c054e9569394247dfcfb3058d64804b58058cdf95c835ec8f631fc725b7851af9e716d774c91434da7636f1dacba97135484913e24823f0a42d2075fb7d3abe0608117474c2c065b979733651f91ebbb011e055a54ad91e820f065a8e678a44fdaf9f2ba62d8c51482610c8f1e8cde8ed5607ac3504a6d0a083210151118c701ac016ec03753d91907dfb27c73765a1bcf9db18504b3efef74d8334feaff1f78af2b8f5070697f715f514abdc2bc0bbac0ce00ba0798a3b022c1d4ef1adff953a7439a716c1a1da0694b208306aafc4313d8855470f9802745e4121555f663c2f7b961f85b4565e759ae98851a6a5cdc467989cfa75125c23c976b85a1017b2bdd9479c1294ff24327870143382c975e2591406ca8e50088ca660ceb76b37afeb87065877fdaf6bc4fa7615878cd5cbba76345ebe88e653d3bc0ad32ef56cfb67636368147204db6a6fb96b745ac4990a93ac8d09ce146db72c899f7ff9b968a04303116c9390859fdbf0113becfd5638fa0eab7d45f23d8ee92d2bd230aead2ca9fd5b9221a7c1ab1329666386932f67b33f55bba3162cee91c14b8ef32e734eb745293f758b634aeaf0076d6c089ddc3ac8091c7de3d879e7aeb309f075574e9a1f0f5b97272980ffcda031597a86b84f17d6f25e96be3321b3a462f360b129fe1a9a4fe0120b703ccd05ed9d8c5a1b8efb135cbd98a25960d59e5a18a434f9f1ff6265f0f8326ab61da3af0b5c81c0496d78c9345254a7f27f8066ba0edf73ea63cde185ee24568b005c5b358076307708bd064f5c3972c8771cdcc85ca23000aa378545b63221c6942b008d6cd31f9311f3bc52d204c0ef7070efd804cb62e7054f3670d7e2b4d3f9546dd3c68cf9510b3af5681d8269947c5cdc2dd4e28036273d34bf12c9050e80765957b9ef93cd09b01b075fda588642b3976bca9d4ec52d0195afc76dff0be5d8eeedebf37ddf4c2d1cdb005ead275360dcb00616b1a05bdd8854f1eada56beb2889d632ca0ad1b349a8adb562343ae649e51a621e3d24cd7f326a01784559080bb54e7b754a1abb6ed5ffb0aeb05b19d0c40f438e59e2bb1141235f5fb97aba1e8d33bd07777025cc6403069a042a0a81c82db19a112d70734272126400a1e86c2bf6249497f5873aec703630717565031b816bf5dce8cc457f549bb696d6eb494e4bd39153c1aa4e6b23bba6dace81c43c8f00b516314dec1724506d0864d725bf398911082fd61c4529c774bb166bc69fb59b0fa59c2fac939838a4b27e6466f479e4291e5a6bf8efcb4c7af0c800474cb87da052ae8a73bde402f8323bed0ab67820173d2bada6e4d42e8a61cfd4ccd8d44f35a0d07ba5de6f8b6de4fd1fed62b5890c1098e82a893eb9caf24a304b5c959b13e5a262f15569283e6c8c44f5c7c82958f096e9e04afce3db1869e9cfe3966de1e5fc1cc8d518952ff0a375d0c5d4a39219b2321c1a7860fa8db246ef42e5f482dab1e85450b192872b7519199d63f834709701a226ed60f595cb39b875b8d4e8a6a6b98d26ce0fa0c54d2aaac2e54fb9f6541c584330ea25ccdd4b2064195c6e7d3255d9717a53c09b56ab24c30d56c2c48e5a920c648f58cec3c89b4092ce6898f746da3239de33d3df3cf56e6985bcc635099fc170e034b396f07acabbedfc8fc900dc31a8c77dd659c003463bc88ca48a9649d0f119a03d735e5eca52fad8f1f0f17022933cfb441e499c1581c9d911024e4a196d5c08424aa6a1b3f38ce22e5778e521dbb6df1c1043cc8113bf35f9a13b9d263f2263d12a2519a139dea075154ec9d54742f5a31a9a3e332e6a11db1fca0060459b634c3763bb9cb180df81c7485741328c5262ac3ad74bda09410b0b517e0e5cd01886cf74063cd01b32a729a8790ec011c477451931c9d4e2c7c90586e7cfb712ebdfd5d2c76b6072f009ba047665f31be9898ab61bd0c50230ef7e6c2f003e54aaff6972854fe065822a5ec5cddf19534fdad89224d1249db2311c32b184c450e336a41fa9e132692de713d0116cc2d5e5f42c2759a052a3aa9cc92da67406cca83c2679466aa5beb6c1fa8c9e86c260190fc39316cadd1b9671309ca89e6403a6769ea7107f238b47a2111222e530fbffef0329631519ca66f65c8a6315292c1e8ced660a25862a0324b13ec3b1c38e6eee65a7d957929071047ac336d30333730d3fcb7c2ded92362e204e9aa45330d222e9f8f14e54aa60cb2977acbb95f7caa4fb854c3e6c5d967786b0e9ee164f217451eab52839247a4b12ca2ff1184abc00ff7e8f86b79b76e998c47d6d68668b452b72a0d5140116b21cda884bc4ef37348f22e7bb21258f28860a0880b8a108a24c4cb1300b89de32b77ca424186ffd1ac299080e203e49e72239fe7971106b18f76fa61ff44a1d9ce988e0127dfab4b9279ed1c28a0fb0383b3ba1645a7e04135908925fa7382e488570d095836b7ac26dd023ab3f6229dea250a417dc61c849f467701c9aa3e2b0490e8ea40b87b20a9da61d6acf03e6fecf4430e430c9ce28e925b5be03fc5c39423f1b90b7ac3a14681154c35b114d155845bd4cd1c5844ede18ec449d261c0dcde0eec7a2edc245bdaa8dfea57fda7fa58d88dfc3ce654a72e8a809d0b96449c043170949ebfcd81d346fffc3b6a03ca7c9ce84a770988090003dfdd45f8fe2432354e1b0924e634f194c02d653e822300b7590dd3978170a78062053f770a748aa8226b4306d1694655b8623017b52fec7f6c7cbba3f4828e6021e3328fef04b9679131c4376a57af08360d602bff0f927215564bd04aa51bddf47a3c5dfdfb3e56d0b3c232c5b5346b710ae566bca16f2cc07ba8261784524486bd70ca5a55796b2f1e8b2374e22d08b4beaf5f3036b9d4b81f12326e053ba6262ccd559d3f7ddd6f920f9964fadcdec7294cde63e58cb981c45b93f0d8bdc65ad5ae9d79a36f0b898a7918a8ef1437e3e0459e36605e4c706fae123d6596cd3b0a0b5045ddf312af1d8556617c63520ee0ed2dd7c195df65b70958cf02ae1ac5552dcd7312160338ed4f11296a275b25e5f17549ee6abcca3b55fc8af630e425fe40d91aef41262a5f522e5574db05a2c88147b794c454e3f2261f0a9c6f0c6844405bb04f3578e0dbf3d25e196b981454b6ff4353782ef3cf6fbaad73814ea2884e3c3f26b6edca986a4002fcd6fca503152890aea10ef564f13b7dbcdf841aa18afee0faa0824eb727bd5372bf33803d1959f788ad465bcd6c12f175aba003f1e74d693179df98108c115700f910fc3091e61451940900a7469c310c02530bf54c43d79c5976545ca73e1c4d121260dcfc23668df148de7232cb4fe3585c453dfbcb3089cab8d136ae2fe5d21a47c866ffae3317232d2d7ffea3db188ea682e77eed8ad39b1380cf9a908d66799339bb51f949a265655d14af80acbea8e7f695b8020e665fc00448427ba7e246636ce36fc6e01aaa06af53a75fe5466192ec82f4597e4cbaeb621d9f15dcbe0c86de716a00794de4c21c603b289bf66ea49e77ebb056e56f8e4e7ccf0cc09f7d0151e78d42c1e6893720fdcdc0e5f40a691744983582940f5264eed4026fa9cae6c8d79c34452c2225858f45ba25a2c9e3ef3cec31273ce1b62a3d1ee6b38f545b7deb9df981d2bc2e84b323e501fded24dbc471aa1faa2e06a0e0ff10d9c6192653e34e16f6ee9472ac98fa30a6e61619811c6160bd71969ea2942d045df8f63aefd3bfe02bac15da42d1025814e7b726da22832fafec40d5c74ed9df55f78d32ec95f50cda12124d744e355010482f37ffd63dcb89287f7aef3ac7fe1160713167f3c3dc4ff0eed7e843e2c20f9686c0e797ad8dfcbfc5edd7233f2b4d6581878ea78910f9a6a3bb4a193522d68fddac1114c470167d402bc5762c15ffc58eddff809362fab7b8c2cf1591daa11f4c5662032f0f3b14540890550b62e458113932dd2287686d93a1a05ee75b6e846b17052f58a628b5b248aa04f15ebbb5663b0acb5519f40efe6648f9e08735edf3623034d7eff90db1b3ecc76e12402fe6ed12e6cef9e22846b154fb996260a6b260c9e1afa5e60a63bc263ddb09176b4f5b154ed506316bfae3f61b0b76e645c1ba637501d13060616e92304099dc6769af2be8b98c0bb7b6013d078319202d0a9b3ea9b1819e85649709c2876574b038f7c4f15017dd354147ca4975a4f5806a9d54282f5bbd9459ff07a730ab234d5c17a19b03aa8e68abe9cb84e9d01865512c6afd8005ee2fe6715dc8298611e1228e377f0e6dbec3794fa171bab961b7a29ada4e6012dd392a85e8125355737da596a009d9e1d2d19cba8ed2b80829d2d38263939bc7d7b4bf67faa1c117a788bc2a85282184a9a4048eacd9c5242032ea0f9d20fc811c4630b89580bbaa6c6e9df2dea76d671d08b543be78f8d6e932623663ed65e2ebfd099ce1a05541cf0fae64e9c11bb86cf141dc095147ffe5e1d7f2622c40220e93bbd54429063eb5de0aabf753712da2bc98761f6b366da7d7840cb3409e99ad1b948e07c995017f3d41a40801536a06a268a1f9c690f445c4cdb4b5150751487d3fe2061fa0efbe06cb4c0ca90592850ac341df82bf75784d1a101975105ad3d7620a1e00ce4113d702937d5139232f383bcf64f52cd280c02a0bbbd939925be5e7a0b3c73d3cf21ec341355465b5e029a11068ee99e4e939f8ec7d3b250391cbe5fdf34740f36755dd2a8eaf90b8a564f2e8eb1591ec353a716cfd79fa43551e289805e7e0c8cb598aaa36ab604cb8c01fae5dcd3071c809c405c2eef9bb78faf2dccea371ec69f8a29b6ef9a76a7af4c9b70120973a9b67e44ab2124bde736883f2956dc2b52af45de437d776b22992d876bd4f39f52f00f37627577172e07db8af9222b27be1e2df60545644a2362dc28c76ad50964e0bf8d66f5e583968da02fb13f4e70a76760e5fa0bfb4beeed36363fece90fab1180905871b2192ef47ad9888016b2d53b346aae09122f648bc25b7feb764fb36269d665f0b788e0a0dea1f5366fe397e70fa8b35864fe831ce06d42f88b2990c4a567b6ff6e63643689ab33b2c35c16dbce5995bd0de4f0a7845802f5a9b8c412cc992f2d0243e2250d9e3cc0e1e0a9dc048195f381fdd8d4dbf5e619bf500f30fcafc4fb2176ed2d39f721d485b3c3e230d26bb8b32b747593ac82c7b13203b478254d07cd8e7034b917174ace8eb9177c8836cc76131c2ec6a023789f0fdf0cb9246a47d81ca1f9e3f34ad0352888e9024355857f3a3e91bf887b161b650367dadfd37b852183c6ccb3491bf421146e968e77248f7ab0a916464f10b7e3031cb6f16d0e6f397c06a3ad057f22a48b1ac9639fc51df4a62fc227ebd40ff62ad05101f0af6c27f183a09185f43f17d772c1ceef59783a0b6fb373416c5b28967e9773d16559deec918507d9f95ab331194067647066dee6e0fe7bca0e27b6c1dae35042e4d8f0acca24be57846b7fe4a84e32e757d40827233e3e5073b279fd38a762c8caa7d9f841345462da4f73bc82cdb3f17216c0fb6a66fc1c536e55e8aa7f1841ab71a6013772dade21de676f7cdd32c7abf268160604c901804a2d68440b537ba232af5f29a5e52d00aabbf7eb8ba45896680f7536ce2e1e73c45c08e1e0926c7a3f64c600729d887a7b1190aeeaa7230ed1c91a2754bd3d85eb89c23e230f3841ce463e3471e63e72cf079d7b9bf13d2743d1de3949ef21e2d8de72797ea9de9e82280abef3ff90842f942252981f987f34adb7974f32ef453cba5a77d51b4462e31a0d73a071bd914f988eef48e7c3dc3b7b3c60c9dcab3d4e074cb9c9c952f19d81ba89adec1f89099c105e2cf9983459df3a48bec0c701913e7f825c81a3c9988e5ed8c4b39fe39032c48bf618d4876e0c73c6452a0f2ef077b22a44e3b8333f678fd7ec67929f8648c14b031ae10ed1ce595466c865cfd29f20f08fd7838fecf66e396f2580f66a77f39137d2fa5e57541066eb37b27b5b4b56ebc7406ef6a654040ef1c0d9e3b46188354d418d73cd1e0ea488ad66f6588595c9cf184c69289becc58fa2b75900e78bfc6af84a80884af6a626401b2d39fc9a9f5e3201140c2b3ad49b885fd51f0588542ff8427c48d3b8dc2b9b9f71b0c17655db6e3eeca91fed8f55d81b19b6eb004ead3654affb4405ee068ffc9131e03e300a1166f18c422ba19e16d54c8d5873b9eb15dece4baebc95f224b3ef9592299b402d506937537ad8fa4c17d20815920945717dafde303b91d6f3e77aad3f8c52af90e9f72390377813ccfe1d50c883015148d7bf4b9d2e61f64d9b640903506f6578c9185c18b3ef035c48c0054edda5cb75de55ccf4ab990eeb054345e222664a9e56c174cb6525d1941eb18eed24b690653e0e45791062a1a56e1b998c9dea77b0c6bdcd05f00b3cae81e380d7670c35f9123c173335168333e50bd3d279b8b9a0658b242cd6c737b72550d6e72672271f0f96186b540ecf065b1dfb9179973303ee6eabdd2192e44ac8ad86e947fd43064a7c1e5061c401428f717238c5ae647ee7386bc3d85fcb025986aec1ffda52c82ea1409f8eb72ad42d8719fb9e0e8e7695a16e1651c9281f263015a203ab1570ba3839db745152670217b2530e22d085399fdb4d513a882025335099cfb8bacb185f211f8db9ca2fe7b853a5da0998b17ac67aa9fbf08ae1378a44214e9bee695ca82bc3b94ad196e9ff844c9a5a1ab2b096bdb64b5b0fa6459b7e14a28fe6ab3b5db013af23fa2066ee5e96f2299b13731072cfb91d26e85bdab74c690c800a640fb7599e69d5aebcae75e08af6bfb5dd14757fd7566f4795fa58413384c84f82d6430cad89692c9eebf921a647d017348c13149cef941e063c33f13aa077d30e1a186472d85457af9924eb4f75abf0dc26f45888e481a7c5f799ef1e9942e1eff69f9def0ee3db2ce6f2f659db364675fc67f3dd6b9b178126ebd9a997f8777f75838e2209a50f36742182256ec6fb3b7285e4544ae340648eccec8cd50115c7220638da12ff2876d6f9be8d6397648b5075cd464fdd788b314e56969808267d8f0a05479ff4a053e62dc19fe8fbb9cc53d3c9dbe4a22bf8a07e0de9125954cb880901163726d68fc0e07b8628d46888d7fa155396a0a4cfbaa4e8b8e815c19de42af0d8718fb4bc7a1600b19d4ed10a0416682cd425764429f374f65541d4f66ba25046420421d6fcb2ae1d2101780cbe6e796b6aea33781ace29dc0dc06fb4874d26ba9c85d17d31eb37bd7c56d9f1cc2d0f8b07c2e50e282607ca43b17077febb1af2418a9a821ed893430341ff2890d99917722935d6851b96d1a70578f373cbdcdf0232bb3027fe1d90012c29b406cd163835f81b09e27f2f815368ff670630fffe0ff8c6ea37bb593a2552fb6987e1d5f8b81a85497c528963ec14f3cab8beceff197ce08b15015b66e934c304101ba72b37dc344fc756275db7d6b87e93ac6b9d8be5c406dde043575e09a171723bfa237c8dd9e4b88f083d056c29ce05249b5cafbbe21103b13e2c118fba81f52d78eab8824864b4fc0e857b026243e5b26add8c1947593b758b3fc8b95483c8d337e00279083cf1e4868feccce424971e4facb37f389393d796c7267bed3fc0995cf977139d72e8ad9e55ba66554addac43d4cedb0549ceaa7c3898cf8e6b50cf6d8b440cb70c9b4f314b8efd8e61a1d20c969c7b07c732960e6181dfb0e700cad7fd26a723df9789d240ccab59d249781ad1db846b7634d0e66a28396e148f029a8437cce54a6a83025289ba004bfb306f1639c9d154292238d3fa3ad148a0eb2610ec344e8cc6397ae52457862b23c2b88d868f1be5284db8dc34c66f1a295d445a2bdc556c5e19a24e249a82a9142ffc43709253ac195e568586c2c6d0730fa204040be9b7fafe2dd12101068f92bb6d95df170ce8c34cc086f7e301a96de72c7413ec28f5719213059660bb43c0ed521d55e0edfbff65c6e15764c12de9984cef974520e2e2128059bfbe0cf215348a71928b9a7e6062d2ef6f08fa6356dc98a16d594e43e93c02b9490d8ac9f3b6e7c1bd13285be2ccbeace54be36ef99e6edbe607ade557cb0673414d511e9f6ca3a4d821c61a7b0a3fb5a8784c82874f4d2781d3ebf5dc1f393e51abcd809ce414e0d26ae92c3a509025c87595dfc31c3b3aac47fe6e9df2a71295e01f5892344e63e0b6d943364be5834c50b1e41c07e0b56a5572d5e27242b5ea79aafe9a992a390a6e8356b44c3694c969d4e75362a9831a9638df3b8f7aa58b6dae6ffe4beb2e025d88d19c6abf7cab5c95eac47da35fcf6e3a68b929a17157a7c6b16f9b227bfc67705c7d6059026da2366cd618145e532ea53d727ebdf771920bead6e4389b00825029cc10a43e1e3c7b9adf5f781c57864ab23d32c7e6ced83e60b326353880a490e0acaa7f1f0336a40dcffa359e2dff4c7fef791acf9a3d976f41ba76d12ee531252092b956acba15a4e43896b95f87b7c4b4b4a55d959150dbe038363b7c6cc4b369695bc90b05c71de30311bd4aa15c7b8d1dc8634b17e0269392d8bf5a535b96405127d87ac2b6f23b728abb3b6c8d5ed7db6109521533d043fbc656e633898aa84fbbef3a11ffa32a7cd60cff02848f2ce6827fd370d3d4b60f4caa88a4270075662e5f10838faf5e1d414a9b0df3c76c9cba1006c5e880d251f5089bb7ac6d992d5bdd68a6dc0826146708b1a810ad2f8adbab520f649cb98692a6d24cd0060dc105aaa74a1a61a4ff8ca5fca08dee75f39da61407544711fee666637191f00e8d1780b6d4ee613674ce42d4a0c0a06e5fba7c8eced605328692face3fb2af400841b3fbbf6f4b948c704f74573f54161bdef6aec8d1c219763b771a9d234344e8978514a9cad98cf6e74047315f9d9947ce7883264592f5d9b4b4611e6ec67abc6c2f572abd0ea7a5326c96a1756c725382c4547cdb0397c7afbdb20ee7e3e07adb4208e7e42623848d9390f96a344883682176239238423c23a267d46740523ca86fc69d712091d8ee26a7464e11d8bd93f700cf81aeb00ee471e8b341b519e389468c26259223c7dc6f5db4842b1f4c63d2de99d5d46bbc0f0f7a2c0544183891e1788500c1f2fc083850e4b53078cb1b54f9194e6fafc38b0518e322c39d9c6d5149112236730be5db2193e1b8501857c1fce1e6d14426fe3e5ced2939ad9ee7b0029546460a89bde385a32701e1ac53385e336ab99e80ec9b80a0a9808737fade877f7d1791daf6fbda4eb09ea4ed815c8b1fcac2544224b5c85bb99e57df777438ffdb5eecaaf365c3db471786683d39f4059ab2a7e1c4f2944199cb6ab1772473dfb77194578aaa0b14271c12927953c4ac1b75fad41c211df7278cd12ad1f38b8f25d2cc9d9af4d38bd31a1735c146c0014d6cf7b147e924d9a8fa344657cea129187f6130465f545dadf2c635fac783e15a268cea769d046f9564395db8cd86f8a6938bbbe2561371124c42ce979a35ec98383367a785eba8269032c568162e4f6d9c98db7351b8bf275aa0c13272057be45d5f4eef14a275e5bf2c8afde0e86b7f14aecbc4f57d7bade307df726860076680c7ca76c98b08a047e1e4d47987ee8d92325e713e297e0957e8e308d5fb20e196fa66ccb8110e96688564fb29c881e943e6057cfde57d6ff63471132e74313374d6e94118098373e2be63375b803f1c7d6471e647049e7b82570f2601c0dd237f449885fe507ccf9450b292f311f6dfe9f5a003a0648d3804538ce419e4d8ce4b3fa902acff11718f5e96db0234db6510cb0e58373aa1a2c83be912a1b457bf3f05588844d03d9a625e173da454dea245db8ff54207c66db7aea51c2cbf300324899090a43676e86607ae3a1e9244b896b9823743a3273ea5e65f899c88a07512f1808951107c48e63b1238990788c32754fb715f33143511decf7ba6e44349837e29b8425761f182134aa2bd174262bcd15321e4cb95d8e9bbf7fb78d7264297067ecdb417172c62a56fe135d6c3f1a5d618fa4f845be096290cf1a90de00c154867f1888aef2842fc5b3b965f8f234ded9624a14811fd06057f011346c4354578973785c26f22b9702e85a59da58832ded4acca3a6451296a3835568445e0971fa462fa560bb3f20ea76917d444a33728136c2e46c9f7db9c4cbca9145652a23b1ea0377fca2d85ae3abe951255757040897bc36eb3ecd88fd670b2cd002e9b1faec14f27b06f1de00469da9bec526f61d69079b28455ed25616b3ce8e6c346155283def17dc2de34685c46834461316acfd0217065a04da8ea87e6028eddc83aa86d425db8eaebbe60a50b155a7db88f1f44bc07d8d77409d6d9962ac0f0480a84f1b2bfe6c20f1efd68a8107f95e882646cb5f43f91021eff424f3258b4dbf864b762569e063388c2ba5c7b2aca3f6e71a8b9a414e80306901904e88f3bf1ea4acae8c51918553d724b1fc78d46d20cd1343a817165f656fdd86d3d6cbeaa45396caa4a2da1c62b086341c15c6fd5b9de819c47bfe81e255f87e89bbb7054e31c727bbed90dd1840f489100579a9889a23e534090f00480e91057e0607937197e7781bc65f05c04ab2206ec4d635b19b3c8c4a71646e49bea33c3622b2f2ffd11290727da25c7f690505ea812393648d22bec9ac3b59249a38669fde71a7b9b052d6f4060baaf4a0bee549d0c670b1b133a4c0b2b73abc4432b92c905d058921021839549dfe979d01d6b4b727a7ba124b89cd4492d597cf25cb7c2526fc12855abb27256018801b37c778c4bf4e24e23f363c66a921ed83ac118ae5d77441ec285d1e1c2ec37327faf388b8e17fae9ab317a44b27cd930a4dbc7d4f0eb431cf1197e388fde9352b6bd5017ae2b433e6c4d1702743b30215da8db4e054c6cdfdf27743017369794a480890b16c4a2b55c885c69039572a156b1e436181fbf4fbc2a2e9c2be80bf36a1117ae5b79631b2ea4c385b69af2f5430487dfc2e10f62d0e469082e8357199e2ddf427a0f83f6de4267780ed275be3d41b8d22da40b03d8f056e516f63771b5e316a6e1db09700b771295d5c4b9be637709c29493167bee1fa16c0b87620e0cff706a0bef8efac66ada42505d427397d16c614a6c83a1a5836c216bf00e235de12af12f882dbcb9ee82c2b83cf4b020b3353ec70fb023ff9fe5236e125c33071ef78413eefa8d9e403d5db4f82a2fe6840cd6f9be618bfd090f2e4ee55eb7a808772397be54c84326f4cdfe65aedbb4dec82763ce73042d8293cdbb9ff89ab764b5c71cec12f0cefc1dcef2e1b0012ab2fd824e186f9615d14f1b58afe501ae921a71f3b741fecff51a2c439a911d1621bd2e0f99a42570db00acf47a904b5997cdd46bc8f1fb6c6c0fcfac02782bf6500e7ba4635b2f34ca0b71403516633e2ae5e992e55ed926fe48856f551fda420b2530fb018df2812adf64630009c2e5ccdd48693d99cf92619dfc66bf7f21131f6938535d5aa35037f2f5750f48ad5bc87de7f0b0ae02a94d4331a7da66d02bf336907b1c6de7d307d9403ab46180c686394b4290aabe0173a99806ad64e604b94719763f4db013a483686a3536dc59d282543d2bf965c542248581484dc90cd2c487e3435482b76ec4c4c0c4fc8510c69bd539db9fdfc08dc30fa0d7a33c733dc8412e9dbc200543ec806ac483f4729b0489f519a39fb4b6845bc51db7db25dda36234086d2a45103d628ee1cb351940712704cf1d8d82c25992095345d04102ac82ec977afb08ca99d1be4e1a6ce9611e94f1f2c46c6022a06abd2aa519431ab8ecbc06117e005d3de4b9a0ac1237873b2c20a446536d0e216f8d94718f83bef36ea534556bb25d07cfb61ddb61fc3c375a25dc4d11f259174210406120c7f0e504d2641f56537025eac34619863eea38feaf020899e8984b15e8b3892c4c1fdf0dfb048bd4f94e0c3ee869e07cde1e1821b949be200363ec606bd44f9a7adb05643dc7d226a15dc21d284a006e4368822b0fe41abc1cc10ae9c5a92a2e0478172cb500559f2324fdf51b57529cc33bfe041720d72970847442001fa0cec1646002a0e83d2a2563024c8c6f106a762c89a006747d41828526a4439b3c43219d1cc91ea628326f1a619b86ef67b04af670aa9a0b1340c5d05f137c2900e61aba1fc10ac98f55542e0576242f47c0850e835fc5e69a906b4acc12c7cec160998a5bb048bde7d4a06a1f0753486ed12748e11cbf3118064b5b6ebbb850cfb0101f5d7928772b7354d5a79b1e34dbf46c07f20ca4c947fad765a671a0422a0b9567d746855c12e24151c0d897180850f51e0095696821d12be15f53744b7553e974fd32e4d9026a488274582056aa9a0ef549db2e1d8f2614645ff8bd647e9615f81fc91bf681cabc676542f7f26d0e3f228cf68d2e3fa30f0263e5000f600ee250295ad2a1626fe0829d5281c574cbc6ba17f1f93985e7a35ed2f6eeb6e59652a69452f1061f073d07dc56e21c0d98ea39aa2b79f119391cd265b664a9ea4a82d823507f8045cba0d09512aaba13548abc8e3b75d1078aca547d092f23a24c74d57f3b71adc46bfe5ec2eb56c2f51274abfe1b8a2bad68d57f63e1280785d79f75115e7f54b23977bbf317e9c9b5135e3fd2cb5ec2ebcf8e96867fce3943afcee86b78fdadc4eb0fa9e77869981cdb8adb8ef9a5fcfe80d72f61ba1cfe1ec2e35d1a7e06f78bf8be37034ec9d6c412258f726a7266746694a3b45994524a69a494d24929a594523a6986f45276a494ee91f85397368b2af1add4dcc6dd5227b8cc8852ae6309da9a098f5b095a6228344ab3a8cab22c5be7a5d99f53c618e594bb2b23ddcca9b412d76897b46de3b6db7df7cf46508a4378eb356b9d8a079c4a9695349acd4dfb62be31df986fcc37e61bf38df9c67c63be21a7c829728a9c22a7c829728a9c22a7443784d8344be63beb2222d1f6fc9be43829e306e1358aad99ab11669647761748f5e71863e4586cc1b6da0b5291bd4fa75377b1ad360553ea2d0da594ae4c9740872a533d4a293c3f2253778d6cb6487b5cac772f952ca96e7119e736a5ac9570c819bd3522408ca6cc4ae5715bbf8a1726cbe8d44a4064a94360326a283cfe9376130239ad6873ff16f5e660486334e94413cd441737e79a654ede1cc79976701b77f13ddaf176c775d244f786e3b734f2fba3f4762f0545a378e546088b8c614f35925edc4147d6f8a82ec79ba5250bc33badf0f006504ca5d295e6f5207832d41c0d858a746545b2b0f8372743c15078fcf241aef1d832b966bf9fcaa5898ea359cd6af61e4bb3bf018f9fd5ac8ddfd2788f9210502b2c932525d7c1483d9fd9271a041de49cbbb4ea0254fa0331b6073ce61897db098fbf9be06602c66bd6d64b78fcb195f0f8e3fb832f948cfea13d41557e8feacfdbd6319a56769fa2c941eee37a95da547fbaf2c218b68648b2ea4f7fb55ecd065aa4b54fa72bf5a9de485f105e1dec34beb0db9801f36e51634b69966c31803c96cd8c024e22659fc854f9bc136b7fd6e578fc3e12ddb7f0bb03613cb246357e9146b1a4b84ec2e353cb0f171f387aa8645e78e40061bed5c7ec581d3b627ef5c1d01c3c5e64543d70f870f9d1c24acdb0a4b0a2020a8847735ac15463d3bfd9702c702c6c414a2d6842e890ac355df226bae038fd22c2bd10f65453eddf5cb81d6f8b645ec6ad552f2b5573c0e38fcdeadf54dc0bc7485b9480871883c130e6e06d2d07d703b4499ef45c6cd6d244185f1d75cc1621617384c72f234cece131adc33b7a736c251eb7111eb70ede56de4fff70bcceda8ea71ff719c83918aa52aefaba9cf83d8417c1947fb37970924794f11d6f7d705d84c7ff83e358614fddce74f2502ca91697181ddca6c3e44577801adbf2b684d9a76395c32d8a61b2914510a6b0218232c6a8cdefdfd7d9c530d9c88014338ccc2e9438630c36445046accef8855c14c3848113393082912985115c18a1f61138e0226900b30b25ce88d52e6ce0454f339bb12dd7c40f4fd5a56e4b69ab215d569b96860b616a7f778a60980309677a89c0d6a92450e270e8689bcb0468a925884c4b516052162164b652813851d50239b35ea0fb4fb1df8401daf1e2f07c6e71e4f7b7f6c496a4c9be0628ac493fffd6dfd6fdb86eed6f3b1b628d4282d467f863e53ff5b7c931d0551ee7bab0d8bd0277fefdfecddbfddbbd1d062653771d2f2f33af4ce8cddf6faa52dc17aeeaeeb0e3e9c81ec25be5c06603a2d5fd76e73821957f7d70eac16203c3afee17e9b8e3d166f9c787f9fbd71d8f777797668fec932aed531d0c77c7eba73735c67e6e0bc060e8bfd59b55e0388440ea7e96b9d358b32ccb2208c481d043d4fd1defab21c78a96b04f6c8bc2af7fa487609fe8ee04ce1d8b0e26c502d3ad565d4c8a25a6d3a185165a1821e506543a98140b4cb75a75312996984e47b763ca942940f408abd2f72e87bee94dafda16cbcb5f6d6be5e5bfbbe6cb6fd91787da56eae597b6d5f2f27d5b2e2fdfb42f8f6bfcb37da524ea43adcadfc5c9b134f2975f2aaef19760788455bb1f5838c81b9a9503cbfb708dba758455bbf767d9b0ba28542f55200f4b7eac1284a1c17bf91e1872edbaef76c67b8e5f2baef14ff14b866b1cc7004bc3af1bb8c61fc79fc0d347306c5475d4b356bd6714e803eae3af4a385635db62967fea7b6159fe2c1f0c2b9f017e7b7f19eefd6fd07efb13e8dc4b99eaa8971fea4f1fab5b28d0fb50bef6a78f46e447d953bb2fe22de0ec1611889555e5cb28e66f07f2b0604d7e60c550517867f3aba4df336b9667efaed3757ee9d3e96a643e12f9dacb18e6871d796b06ba3cd94d09ea749d200c0dfdf22548d947104b024a0223298ad151cc2826052996a446776ac49c108b252525c5da6883c613c89945618d8c6a34a3d91a9a5692519031cb5a6e94669e579bca0984d51bb706d77526c9695cbb6429463979a815f91ce7460dedc3359d846bfae7067e351206589c4e6269b8888bb8888bf849929ff5e2637e51b11013d5d0ca09152f422f30198ecfcde0ba212ae2152faa666e2126434ea88844424c4a4c8688a870d26df41a5d2735136a3fca8de66e065a777c0be32277358df9d00b55301f7ec87af9d046c5453efc6aa3ae1da57ff8d548f0abc5e09a2416a789b03440eea2d4f354aa7f16ab936c6ad82a30bca9610319f1cb87863a0abfdc4947a9fd7dc42f2702c5e097634184c5712d70e057c772e0574bd1815f8dd4483bf0abd360001376c24c78889dd47eb6a287295409b51f6991168955c3450a17e9a6868ba482a1303ec81c2f2b95ea6172bc642a1c1d17339965df7146b2cc87f8e5454ef8e54fb886885f5e34e4c4b5581c076369b0e0977bc135eef23176a67f0aaa861ef371377e86e82423829458124150fb438f2d4d3f85828351c42f377ac22f8f02855f7ee45ef0cbc5c87cd850350343ee3759e44f6a43a9fd0d814a411fb8a7ef46fc8a28e85e46e157cc408f52fbfd885f91898bc1af3834c5d2380a3a215f430a316172c5b2b22986221650a83112752baba2457533522ca1c7a24ffca464d9584254955ff843c8bddcda1de35764b2c5a4f02b0e49a9fd8dc4afe8a4d3e057248a563493ee09b57f6352fbe3107bac8da16663596678cc9750fb4d9e84da1f9d381ad58ac5f1329686885f2e856bd878a3933a3074376a7f23a1f6674e2af7d9c779ac5b1cd8d96fcfbdd3f7ef509503c3ecc3ec4bf1b308c4d2e7437c947cf719f99d39a55408195b78384e9c32b6f9bbe3a56a2fca3528eeb4423d1a55384e69e6cbe3af66cf5f9671c652e3d8c4b632612f59c5c4fc3e6dd7ea716c1a37acd102b6a5fafd04ec0b8728b1d6cbef23605f39f04007aee9042c4d2f94a22200d8170c5cd3efda970c5cd3bf2e1020480d36ad9516cbb7c00262f343c80d0b11ae01c08a0dd7748b7b09c9b1adeef771eceb26e663b7b6bb96dfb63302f33260c855e657df8eb7bbaaf353ebdac167faa7d7399ff7457f7edc56fcf9745bd9cfe7d6f5e327181e91a9f3637e5b7d499afc20535b561ff33512fdd3402dcffab07f9c74eb884c8df97e26e221d617858f6ff101f2c8b47cac2d20cc0cac6ff9966779cbea27b883bb80f8fce31701245ca5f6f8cd4b73ce30c114d53a8f3b1bb66d8b9cf6c5da839d309104796876d7e5b474a6d91ea79d381a4fa7d329d33eae547e51fcdcc07e44fa7166bfa1e8976525af9b61822b2f8a1f200ff94c15d9c74885c71d8f413b069a3e3b599ca1ec23d53e66ef75392dcf439be63f3ef3f1f1817017339067605decc4f21277625d9c82e5234fc1ba78087be42ea6d2334358d78faf99a0d2df3f8d44bb7cecf80dbdeef8e558ffc3c8e33f1eef839d20615d3cbe9f9178fcfca4741dad7d7c9760383ffb95cec8fc169e3abfcd5efb64edf105416bcbaf0fd9cf8fdff26d5778d96b36643f5f4a6ea59b2103e34ab71d9d8559b21630eca9dac79f598e0616f1a190bfa8fddf177613b5ffbf90d508390ab55f07cccfd5d7e407993ab318d0e5cd98b9138c62f5bb027964604d606880f9f913fc41a6c28032f1861c2f2a1c38e490001d9e44a9591c0d794b4ba0a7ce97594f6d29b2452c2b280f0619085003bff8c99385c24334c6a7527b0d48c7b2c141ede72e6caae8588bdacfd5c08b17c2c50d5f0180c5612a88f08b9d3c11c259dcf050e4a15ed239e427a149f6eeca605b739b73d9075300ee4b9f0307e6b03ed34f7fa3c2071dafda2f52ed81f5c07a7a9ea4f4eb33db36030fc95281711f7afc5c5cd8f685aada3c61acda7747430b352b81bb33d1df931a0566467948dcdc7d3b930606d132c6e8f333daf39b27a3f28bb48c3da73cda5626dca2c591dc33c9b6c538e7b7a3a5862a554be8438a6585d41196151a9607aca080acfc80f2544041c03ba5e0017132cd9c90983a9629021df7a39300b7f9e074b6528f6d02254da6148446796814a0194885c8e6e7712e8d5479943be20564d4e13bd1631a03be5a1cf64d76d96f996b349b2c993d0badb5add4ed9572599afed0772c6b86692ab35c1647c7d2f06bf55243954b0bb581d4fe1015aed45075eaa1aaad3d7f5a538f5c3530e462605574ad5143b13bead47dfeb898c98ce317a7dc38b99d3097beb9ef2e87fb39e79c73ce3967e9e3774486e3d65ddbafc77de9b7453f6c9f4e52ab40615febc6b6e4ef3313f615b9668d6d694f9550f7598d7d51aee96734ced089d5907de20784103ab5f4b334978da8fd7c0405360a9c81da4f916022789f503b088e5f3a9ca42e1468f601d12dea4fe36bb4a76e12c734cf9470ee5ccda4dc7e03c3ede7976a96775bab7e66dfa56dfb5837108686edb5df4a5bb77d9775391918ead4ece31772b3cb2975cfdc6fdcd67dec723ad0e5c52ec618b92dfb7693fe0317396edb469330d85c2ecb395ea0b69f4edbdccd5dec166dc4d7efac81279e68a01faa0508b89dd2499b68a2091104edff544a0212906007318e9dfcc867f64f4b9c4e553cfe46c28d942855d19068af9598d9160c0211a080a5e029643e6419d4e52c988aba4cc42ea8cb2f604109ea9ea088078a8260e8c0132564f8a9acc40b2ec28609365484a8214409374837671019830819bf47bb612c94cdc1d2a0e5a56a522a966ac543b56ed45e54182103a1eec76320d999fe90b7a80bc4d264317d803d408f9b346578801fb7490e862f35dca42230d4f03b74c4aca48d901b22446072bca870c497610101e2d2926259f11d562b94773275cdf1107b90477e989c142828b0aca7590f3f1cd9161241dd5a242022f7e0182caea8c28a2a644054c515565451451555545145155b04052c8e7f3f37378488896b5c60f9f0c5430f4780d01182777c9808130f88f03084e508103a2f42ac7054073b4c84cfdf36e6668fd7adf9a167c36e5127e835ab7d7add5a8e8bb351fb1f2b0c7161e543213c2c4d0f32757d1cd961fa50054488d22909b1c3b303dfa0f6af803cac8002c3eee18707867d2448ed3f8161f703c126306c1d6ea3f60bc15e8da1c21bd82270ec16382d00993a6a3fcfe2b8ecf02bc5351bd8f5c287c17088f6f3d3e68cd2e7f43cb23b03d19629fe25e6ab5bf23dd1f842dd2d6a906dd558f36d4dff0d0b29f0782fa5a22b1d3068293abf5fc7aa86176aff0096a63f0365e8d60c40ede9822fbf52ada214063692a2af204254342cebc70e59a1f6af5430b2383e9646860622140c5da8fd4df3ddca22ffe48e461b07b696c2ddbd5de0dd02f718dd638c31c618a37b8c31c6183dafa5f0b89db8bbb70cbc89dcdddd63f4e8eeee31956a69892b2b291616d5b7c33ece2ee339984294c8ed51ce2ca399366564f9f045f68c1fb9b0a14a0365d24c1bb396498de5439b9bac8bc2c606066ee3645e626a0e2e3a6c3b981ce0dcccc968dc4590479bc94d5c27fd4b795ed7e564d9aad390bcf8dc4a31657b24e568b353f6a10c659b1c2f32e060a9bb5283c76d3768f285036a052503bf72d06107aee1816bfab92de6801c9450fb9b8d2ec27648a8fda7326abf0e67ec4086037848e30847dd9260fb7773be496edc17f1f8f1543f5a6e93fff6939b5b2996a3cd9e4266468d6309dbca843c910460f3ef564e2e2ca9169497fd36bf20240ccd2ad2ac9661d52d1d594ddfaf7a1d69443e9200cc973fa5e98b346d9796d4e783694edf4db3fa5db87eaf519e7bdeab1ae53d4afee98b784f3d99401e610a210bb55f9312942eebae510bcf2fbcb9e36273dfadadb35ff3696c0f4a8306ea317ac62dbb9667c21e41b3ab8378a6bfeef713ec7a9fe9d636cb04b5d1f07ef91581a20fe292cda39c19d54a1b57da2daa0bf4a6c5424d0a3c6c82a8b09552294ea5ea56ab13f8a54d2b519417c48605844a1ab3d4a9e3b6926a05be6ad5719ac9d4d1d3894a1ab3ac94b150acd30ad77d681344468520a60f5d10f2c519761652f04fb650b724e5a7de8c93b58edb4a590bc120880d0b8877f226e8312c954d8905c4a6c54d6e96e494536ea54ca3286f43c90f3bd6e5a9914d35e9718bdb0a8ba758521db729592c0a04886653b2a1425aa5adc41ee3f6a5adc4d2e894406c5a4280d8b4a45a3e9917199715d6568170cd16448864e972e4764674d428248db871bced1e27f7d0e4c8f416b59f06b5bf5db0acfe5253513b8b27acb6a2720b05599c6e810dbf9a09d7f4631183da1fb69096699b4b0b2de1dc8544bba0a568295a8a6e01c7da09c73826458a94920836f66e8e2281b6b7c149491d10229746f4a949b57f93b88c2cc963ae019bf66af645de1a78fc5eaa5dfcfce4653aa7c117c3639b24b6e6d0cba4f40c6731353cae59fc340b6f3fa415a93b239d133a96c57c66ab59ac0b6f3fcc6271339add6ef8af4c6802aafcdbc677a621e5ec27fba9fc8c45f72eac6454f91b2c411982b7dcdd34d03701b9115b23752ba95bfc495f23356bc5d822e6c52f1643cdda2aed04086f482712350a9ab58d822683637e4aa93f7f47b85d2125508b21fda913a358c95c2b1fae3ce693a4dcd3975f5c56f75b3b1318ee54ae7b06437ed3531ff839ee7e8b1cd39caecb22c73df726ee3bee4ddb5cee6ce0befbada3dc6fd53e721a47390ee4ba2cd6dbd47d91d67a38b0cb9994fbce3b23dd6fb1d295d7c0c356c026f42918723f7f2b7d4144996665cfb2a91d7eb774e28d4db7e6dbe8c44adf441fc956a96202b76e86d2d3ee8b34eaa9e9e97b28d0e3c010886d29fdb82ea7fbedc6f39e3b1bb437fd66fa3c97a7799a06a6d6f4547b6ad2c0b0a7665a4703e548419d584b6010b1c62e752a9590f69a2b62db21deda8028566beada8068a86edb006fb9f0c151ada9cb850f84aa2b4913181afca38e57e777245ca54a95ce86ec65082303adf22750b32a4884a89139e36c37fbee6c90b2cbc93270ca193a635f625b993016d1de27d2aedd27ebc546593156ca4b6f1b755fc8b65c9e857dc1b02dd47d9a14f625c3f6a8fb3cf655838f6da5de003aeafeaa5b7efe8ed6ca1bdbf27e9f97b0cf4ad8d6e9f73909fbca816bfaf98c6d997e9fcdd8970e624c613276e018038c507bf0992554c81b52117d110b0a1b1d7108969dd8173361f28124f6c543431bd8173b3182ad20a2eeb312ac645b1d1751b708067e051f2bea8bb115cc517b8d6101391e84d195e34118953faea8efe3b78201a3501dcd1a837a7e965fa17e73e972584097876241a55062acb6c67c5b3726bc906ea9e7723ad317f1eed3f12fdfe754aac9d301fee054aac94db4a6d8c44e05d66485eb96f7e47c187d1c4900ef47ac0ea3a5c2b2fa438f523f7418bb50110ec0874e54d98b5ef8d0897012ce874dc505f61fd7870e2481845a1ff6d0900f9b48c8875dd4c2870d25c8876dc4c2877d54f997a9d470ffd07007a9c0bf2117f96036e2a31966190602998578884a1252ec88e5976f5a3eb471f99055f9ebca2fc7244dba8fef547ca63f070c6985c1ab0200595856e9fbe3127751181852af82a1a72a0286aa0f00183e0b0060c87a018c47eea244c0907a2f30f4543860a87a17c0f0593760c8728112c85d2c24a1b88b633ed34f5b6048bd2160e8a98480a1ea5b00c367050143160b20a59ea75a010c55ff40c0984d9d3eeeea209f2172571bf94cbf8d0d6b060c59ff2a95e7f5f0a13260483d4fa5fa0f0cdf6826b9cb7f4a3fee721b1b560c98e43f493f4933c93d950b18aa5a400743560d4b3f1ec69fbafda6fa16167fdc05e4ae7625d1c0c39ab87c93d4af7c7f44a25b2d8ffafe78447f34625f2fdfef54dc158f7ce667715854ff49548b9478d43e95e58bd5e55379d24a0a69c56beadba56901b7592bdfd6ae2ddf2ecdcb4746e5dfad097d0c0ef56d65f9b8baa8188c020788545dbed4b37cb3a2b62bbcd4f3b7fcca8784c7a7a67e3375392da0cb4bb5a4f85320ff367766a6d8d6956f2bca00db17e985ddb82bd2253771c94d5c721397dc2cb1894749f16893e2d126c5a34d8a479b24e42e090424042404240424042404147397e49884c231098563120ac724148e492841ee9a3e6de4ae49e433fd3e413e413e413e413e413e4193a88d26511b111911b5d18fbb669217b9ab6463c362fdab549e37937e282dfd947ebca8f4e3455e54faf1a22fabb3769facdd17abd7eeeb3ab9eee3da7db47ad092583c6a21a0240985c8877d887626d5fe1292177a3fab99ba6fab49030f6bd275cf7ffa8d763927d0e575bf5d4ef745faf47135cdae869eda81dc96c33d7746e84bedb76f7ee90b85d4fea932d3c01fe24f951fd228699d5f8cdf5de48e86a77b5678b8a7e50b656c2b1352f632368291079222501322a9c40786f0999c8233d4f8c9747002251cd12204bd008a06460998102a312104b1d501193d884561421b5058a5c81d2141b1020a51c7bf79cb7d81062d48a239fedb26bfece3e743f6a14e9c9fc90a1a04c176e6f378089e1cc19ac8ef817d0f4c2776ee373e83032f7ee90bc26b2844d591bf512e76390be32e86f00853f94dfb8260128586ea8d7f188588dc70acfedafacb773008af929f7562fd6a7731c847b255e4cca856c281c6183e53665788808a5116deec741121f82208c6d33a826d0fe9614a46144e70c4da4e83608d2390603c002882ddd050b105128c070791b71d0d5c27b803c3c4194b603c388860f3e9f7c0f8c6675a3c20411a4b603b3c53083a5802db1ec2a34d411252f9d95d93034be80b0c1f239bd2b62d1840fb7b83032fbcd14a1bd799b8b4714b39ee5e5f4c5174f2502bf3b41e6a8545ce6d1e78dbf60ebc0dc52b2ca91617966dc21347f081f14c0e2c517518deb66de46d2e38542f396056313a76fc07f290e9e1e3076b26051580d0ac5063c3429016840c69b96e5cc079117981832d0b071fc186108a603b3c291904c1b687f0d023f8b0dcc542123a2882bdac7278d1850d8a5e8c7447e941135460fd040d9640ca01238436ae80d203343a00e50923a2f0e3c5127610b483081960038a5c7d11831a24c5288181153a9ef82c610ec49c00822d184938498af1220b2d8e7a470f5dc1c60a7c603ca51f04c19ac0d0b0522aff4aa9bfe364b4ef4669f8d41c210836c1263033f0c78f604ffd56ca5802dbe1e1013b10049b20c8adbb786c8e38810fbb6b935006118cb807376d72d00422dee1916408c69321c1b68784a9caeeda29e2b4d3e4009c8418e4c00746c4c31ce0f5c5143398200f11af2fa69841151e1f17038d26be880e86ac464b3a74e8d0b41d5c4be1c5dff17d5dced7e53048a4591e6394ef92874c8f1fdcba0b0687f9f42908aef7f87855148a42ec75aaf96f6e7a644635eb0aa0c1e8cf2e4703a3984f3f197c6682d4c767da2762e1b951e58fd9663d6edc87fac828a5cbd8a3cb9191c5cd0f26fecefc1ed88d078617529f4a7dbab5528242d0aef7f1f12102d61ba8eba23e3b63b438a8ca9f4559feec685d0be3cf6219127f8e0d4ae5a745ec1ec1a0cb3b2da973a62b800693e1eb816d27c19b2f0a4161f94cdf7ce18537b5e387374206e0f8ed85c7fc75e149ff8eae1b30a49d03cfbfcb89df9602b7eeaaf901173eb05d1d260a5497474ff3b0749911eb56bf33337bb751ed0e4b75c31ceb53f77b9a7b88cd63dde2f77c7c7c868071110e902a3f17e9e5d7d617b86edcfa63e0feb8ee3208b8867fbb1860eaabdf48fccd97dd4dfeecddf9c7d53bff3c7a2fb171178356a30db1863fd4e6f62e76fb5bf418f2d4b8aabd2c467129d8b61b0f0c63a5cd5ad4368b366b175ce61d368e2e29f5c85276e6d99c5f4f3d82db6316b79518191582b8706af9709fec00082934d67063a1c049f8085e229b88a8146c5a298ad8313423000000000316002028180e08c562a12c0af348f10314001176884e565e3a9548c318c8521462c618428031008001223033232371026b7440b740257222edb3dc4d1a5ba17f17542eafc816825bf72a17eb655b4cf6c97bea478d52e98f84c573e4bfee41839b047d88625f888981577444693ed8e1cbbf960bf363a0623863774104ca43ecfe94f0b8ad3672eeaac681444db4bfb60c632eb085b549fafc0b3a4ae138998442d773ad3980e5ee234a30ba4d6f8d048edffa99b767b68f7ebc47edd8eb0279f2753bc373c0374df2c9d2abcd502d41989c642ca54a527d897c92da636820367df52b37203af653215587ce25a539201896368758c9e6cbc756bb6c857f111cca57580abc58d86fc48323a40bda56da0d0e2e2dbedc51f11b2a1bf241c197bf4209fedaf1245da1f1fe0d42f9a1df29e3300aa23124987c4370bbf4101069191568cf9cd71b52308c14d0c3ee03762eacbf548fb2787b5705a0b5128237fddb9b38250cb8f6bbee3e86ec505076e73a1ec5f2757547583bbb5ff4c1f5ed436dc3c407666cb52ab0862d2fec16a634ec602ea5320d1e880ea581e86041203a550644eff68640f4ce18d1aea2440893bfec9f3b9600d1bd45526bac345e351df49ac6540cbf3a73c84946341f4731979cd4267d534f2e5cf37fd8b562905d713be6f6a25d7cc8897b2098cfe6d83bf296d701e345d65f86ccfaa6f4debc8a45f052a2150be043d555a7aece7411370ff6d439fab7387cab8dcf0286d54f1b17bdf80bd048e3f6d0d42aa2bfe1a2ded26a143f5b680cba4c181f34d16b0a6e530d3d19deb5dc5c2e73c39f151edfa3d4279ea5778a0b37001ebf4a4fca773fcda0673a4ff18a0e631bba85af8d892563ae7d74ba0660ae733d6017707378912a1167444d982eee7506c82890cb5916d1d19b7bf5566327e939ab3bb1d5b945d31d7f08e81539e79c205d75aa93261f3fea3f29f21581d5c340ab298ba20e915f39dc5405800eb931b793522984bcaa88745887be997e626ecd8ef7ceb49498a9082aba3d1b969303dcc049270dd8626791ae36e4b46cc477846c54cbe7c51d639c0442060f00e84189e8108ff7db87f9a2b7761acf347dd38b795388485a29139baed9e48c9f0d77a0eb3a6197838d55fb231ac96c845a49cd3184fbfb211f2983194758dace6c62927755a67dd0367c0ede990254cc66292684a8b6bb659c52d1660536d066159fccd0b58bac9c4cbe007614f440bf5af1e5db8c0e95fc8b2f596a1aa7b21e0dd253dcbb4259ce703aec19b23e9b81a10ba1000e4abe45c984e43bb5ff85326027608c20b61a4d45870c5e6cde949eadf95d3a3164160cd6a6ebb0dcfc242c8e6eeeac61a96f7cff98faadfb9a89620fc4dc73e7f285bf9cec7d68b149a26982420f60973c268ac3466010f04f1fa309d3b9064189e29e6f9d958e453797fed14a7349d439f8bb492f837c76bce21cb0fd8dc4b069c32b9ae4981aeb665c7df466d3a1f2a77edb110d9317ae3f5d1d35d0739fe28ef54d5d0cad7c22dd00a8989ac3239e52c0313118246c06438395b0e5cd3866fd3acda360d7141b9dfdd529435b8c4d5fb3d3d31a9ec42fda791ae488788666059fcf31fd559d1906068fd823a59d532381f8bf310b90464954684a8a93d60b12dd62b33e48626d1b5a0b8b46c6aa904997cb8e8ce405a623613e96bc8cc6840600af8ee20f52bd0e7a69f29738e5840a5c5894201b7cca3a2efcfa784a0cbaa1f61f4eb86d44066105c9f08474b7e9f281bece901dd55e4fbe87fcd5855b5367e461e07143cf1462f7e72de466730e961164e7c8ba203dccc95e8df71892ef785ca3897f279d236a9ff6e93ce1f8df9c763a5869974d34e4e1c461058370ed09c271fd9407182bdb522f5d02098e4e82253803a388c99b251f23e1b34982808c4b6a71f4fc2e8106f24223036f7818b58f717524131be3546b55e0d6df46e96560471bc1cd191a92e14b1f112c337b54f07e35d3fc76f4575909a18cd427cdd2f4a9199a76d1358dbb56557311f606c4dc119087ec0a51aceace6fdbe62c1e8a8f44ae5a077a5cfc09d5a66ba03ca4e44129fd46a258c5517b35b0d9291ec7f6c64768b3f2a67e402b12ee57a42e6b9ee7d6d03395343018eeb1b45c2c0317d21498fc0a352f00a9082780038cf50ee4b4a08b2805409323d1cefdaab149b6ce54ff2bfb208a8549bcad8e71bc6fa57d408746126ead375fe47b0076f7dce1c97c01705a83cf91767dc67542f0f760f0ef141b484adc071871c34f8ccdaebfc37140741fb24e73e6922bf7970fb04702420e6fc22c1f3a046c181ecf76db8be5f65b3c7c16adbdebea4287b588b024d60493b137d713f32fff91a0ca95f707ef4b942779dee855cca0aabfd43dda66eae4e0a58bd135a1adc01449a80826d2b13ce49860eaae835d7d65f9c5f99ae684eb19f80997b5adbf932324978c92264a1b35acfd5a9696cd95029c9c8b6e8b0e94d9dcdeaea488141d7bbb33d4d449346e92611ad77fe2847c5312356af10ebfc32479481ae78f63142b46ec1d8cf9e85b2130e0be72343e0da209fd03e96d374c1923fca1920bef5ce28e927b67c23653fcbdb535707137eb4b4c973af87d89f5c40d30057e1fc299b16ad0928a4eec448619689106c52906fcfa1a650ac2a10d1290ad55a619e045aa8d4988273f5e1d01490a1cc6458c02e92ca0ae7a78928724448f1308de92127b2523f24c4ce2918cec7902c1a364628f24449e8949bc12917af6c4cbc8c837c6d66b16be2721411c8fc9b654ec46604dbfdc7392ce92e086f69b9364195a8e77f3e205e5dcde631873dc470e8684d9cc7f0688c23cfe9175e5a844c27dff694426b9dd845e0fd5133bb1ae58a23ea79f75f8a36657f9cb8dd555b1a25b1c3a38526cae4af958bac5f3f8e688609f66516cb43857513600e3a986efabdb5f46341d75ec4cedff9fc3371290ca7ce084e33e9290db912b3c45ed55ada1d2b269580a70cb7868cd5382cdbcb05c31bec03e5f329843cd8637178f14f3e555c819cff21e58d7abc536572dfb603d4a538de4271cbce075692fa4a86c02bfe6655b43da66f5c304e4d16fddd17b2df828655529a4a238d699ed280c0736811790f771de9c8421044436724fa3c5f01caa53126da835414a21cc3f074b6f9880c859bc239c55f741a4ecb0912290c4c3d38aa77f4202f88ba4a9d738c13155a088414a4d2ac061a915b8d4c3d3876407b1e0dc9930a50e00a0bcfc8c0a9e0ba6102314c5f8c1c282cb1360145f0641fb6ca4bc7415033208f7aeb5e53c366901ae17c9da733571682ef99b1d36c8074aae30a85efe1387efa3609489b9c20fda2d1c1acb2bd810e926295f767f788bad38b81322204592c1cb3076d8c9ab127ec309e9650416c16a2a4770c322f5a8ef0c15d3f0fce6b20e73bd5697ea1d1dd3e9ca78e2b847d5d542b7ac7b7b7571ff184a8ef7045a89abbf9c885fad1be711a63bc7e359d61d4f56294e28ba420607c8440ced2419ed0f3c13cc06bd6d95bfe1e9b4176b94b0124c7dba89fd9e44c86de6b84d7d6edc9c2dd315138a8c53a2fe7ceec3d108b312b64d896c50e8c5837dcdc043e9a4c26eaeaac1d750786042f5940cd2a1825ae57e161e7f90e9c4fd4b4d2825f0f13a659c044f1906afd3ff57bc4a23be406eef445569efa4a2380054eb68455dffc58c90993e8c52a1818efa597425f02d8881ed7d2c084202348210101237ff60743d3ea1ac1f5ca2a8d5576b67814f1abf47f71d190d62458b44941585be298347b8885e11f40485de00a04361c136da5f8c0f00f303697d09bb4b97b2445e7128eefa2958837262c710c47f00e847de404d40454aba5cad677e063a735d3f34381100d78069fe6ec13b35a0762018486ab64258338ac3d057d32e5fa1bd19fa046a5433da352eefb6150df53ce0f5f0379c1f28b00fdcbe4448468bc67d68d8c3bd06ca278cfc7021510089bb518423a24502441142f791ce976df7aeb9b90850540d5de6202c0e28059de281e76390b461d458fa66d046523d89c9e838f822a511619116ccd02be879e48bb08f4057ceff886d9b28d09958f38d9df1716ccb62ea69f1d62102d4089a9b37b145fe1d039031ac0db37cb5e23f0760c5b7d3ace3cc7ad6d8de23c6c4ad6ca1c01320b9b62b962d4d559088bee34559799c19e63c8caf5aab796d0ce5352564a1f645c3ebbd4d79fd682ad42bcaf11ac1c26b100eaffb6cb00624c773154dee86f758525aa9cc3c819711032ef34b16ce8f3d2ca8fb57c0ef2a1c9f871fa7eaaddafb0a15071d6e92b2c1fb017b5dbf2ae14abe2b97c6440f78a1c829e98a5036d54098f4b182a30f1355e5c3290bb5a08510531fedb020f1165cfedf6381e904d754494caa39f436b7075ae207ced3b98ffac3568b14daba67e612927500a3c2ac80061e0280a909e09d0300da1201337102be6af67fb6ae3c202aa2b002efa30cb7dab3dd3d2b4231cad78cd06adf2b7011b4c97f100ac4a0d7c86de3b0a3635e97c6666a5f4582d7a4844e71f36bf6ba4a8345bc3e3fbee09ff3ed55e51abd0755d5240faf03fc41ed66c9f494f6d7ca467d57947853ea84f64e5d3237fee12bd35b9e37a6510626197a69560b1a325684dbba7ff2772a1bf4ccdf2b3c64b12336a48fab1b58143d5d92b72c01c41473a2b8777352d121536d2894b12273bf2c52534b1bde8586a480e1d4f38e90eac49795788f2d37c58682e8580c65f87563737fe3ca8262ced1ca1d67051a1af17528f6c5bd2d614ef1d82914cf7b71099bc1a0521aab33e9f4e4e3d32321ea91d89730e2e404e2960eaf98b87a883ca58660f1037318212bdd76c2a5298903e3d672f6e23dcf58f8b0acd8f38a8519a27a5efff84e42ae8a993c2ca27b181eb3278457d55b97626b276ebc26c295817d58f40d86f8a10b3fe50741d3afd52f05102a4fc57f56ae174756779487c62bdf59fc1f5ecbebc6844254ed5651271feb87f909dca7a2e77880de85ee2f0b5ccee278ef2a74acfbda7531752b6a5ea948e419835c4766b4e71755c4b14458d733a65aee0fdbab1ec34e396dd29eb613238dc49c6a1241155d503895380af16a26e74e888080b415ec3fb76250e09938e92a9b763d430eaaca809fa907677e813d022d8b904a39cd3c761413f6999c49ce26730981a073c7661f49515e51cfb92579e1330e1019f54742652e2b49a5778dd25e3da1c6dffc9715a3e660151b6a6bffd49589d93e596d5a30d4d78439e72abd5863ac4034461b73ca52fc90325d73dacdb5d2148b9cb72a98bdf869823fbbf8451147694301a4e161375c60758cb598480eed1379c6d53b32b6afdea012fbe5e08fbde9e2725b69f4f1c6c7f0db8fd7c1998baa8d8cecfbabd3dee376d904970e038d190d9102e0b31407bf84de2a490484f2af0058fdc3952daa1111a2eff1a376d3390077ae374646b8d62e1069458f9bf0a5f78bc65d2da13cf2c673b18b1f6549ee8cf7d8838996d6d14c37fe63ae4e3f4ef7eb0ca3e19e4417b3337a45c18e9e0fc6b436ccc29be88383a9bb6664468c6885f44040d8ea2c249c5061409d9d09026a2a37daef603f9162a4283b6c68f6fef69c1954b9490026bd1ad15fb8fd0ccd1a7459034ee623d42c287c1dbfef74fc6dd4093dbb4f536de07f455b853741027010d9617a5b0996731abd16a5cbfd71070fea5b5ff384dc69f6a4c4546ea669cb152318af26f3a1319904b28c7c6127513de8a7a19fe3e4e4543793290930159a52bbf91be674ed398f2799de556e6e8d8c3b032aaa4e8b25a4e7d29a5aa49e0b7f8de869138896b6e92818d80ae4cc986b32fcf5928d1b3ac0625698137d4b0c411b52ec7034a1e2c3ef2488378622316fa774338260d56864c471f1d2dc9a21d26b340b77ba40b2b4bd68034c871996d272b316d085e95371c0c9e3cd095d93a63c0b038057816f43d421da0be409c8113658dec881033f6999518563083edf1ba8ebf17f3d19ae8bb98a9a43d1668ca9e094bfcc07a5ba788ba07c5428aaa20403ff26efe13caba7e14c63563ce9c4921302ec5eea067d79ccbfeeec83481bf4e581b0ad03e54349fa0a7d9c09a5fb546183575627cc9fddbebfc2b94bfd9e939d03883336e28c6d8e205aa9cf4f0bb0f8d625460ce1b5f2002c71e8f925536e5d570e9fd1a9f9ea8184a1651e2f58fd4e252a129006259c4cc091ad1d1318b18ce38649efaba24cfc463b2db293031baa0d30b7b21b8bcc840cfbc71aa7e8a29ce27b16f3d3c7b7008efe6bd8009d243689bd3b7257dfab1870ce4a797cfe4a9997e1ec97d1b7ee949346e752251bcbe2100235dd2bc11205ca7b4081c84e1eabdf4cd53c443e7878c9db748a78f0c098303decfda6bd835a220799c1c46c621d49b666ebe99cfa445faec46776a43827f8d890bdb3a24d2b455657b377164037c443264fb4bafa5ac9614153bf4c915cfda67aad4f5cfda2fdbf90d7b76a4823e3dec01aa0488fb783fbcd5fdf7156620b8197d5cc7c86d26b4c552ada9c823f76289f56df36739dce6a206c5d84bbff76a5131ddf1e02facd61081a28f541cf5c86c83921d543c55be0471b6f5b0366dcf6e2809fe1a03936f07975a0d0493151014f7c53b763689ed63177b042791c1c2b3acbb0a25d8ead88fdbe70c5d1cfe82d877560a1c19df602541131c94aeeb5a1c0522b45faab0bfab54f9965cb1d802f990087544b996bc912e7614982d42925584ce0f1380b55637139473852190cb60cc985b71dcdb5683c659c9019a352ee6a7818975cc50c20b40310df8c66e70184faaacc87b48f03da9cac2cf09cf7227c1ad30ce803695b89fd2d00a0089496589d9b55cabb54fb791976696a1a8c6c2c058cae2b3ad42d02fbb9b34337bf933f7a31a89783acfd8e9b4d40915bf6916a8205040f61b07dae5bc1f9e6e51487b3023c11815f838a70ca41932f3d767153070e5d79469c46943b0788f12882ef8a898ecc28b83aadf64001f492620429bee8e85f1db04ad6290ec9835069a32a36cca7997d525ce8d58338b1b8340e22b290161093dcbe21c9348a4838cedeb8f58f6acf7356b57765d5963615152a509fb9216f73b1ed77566c8d566d7eefce5c025b54938a5c3c05e03e5c0cddb0a67240a62c82fe7d89a897918bd1f0e75471f76834ec5689ebcd28c4c39f26b2cf5c923f9085a9ec10512b43bb58414652b2c54c74a63aa8de04e0717a62e9e04ce859a09299b895a014ed2dcdaeccd151e1557740a46096227314406fc0a7d4861da9ab8463fc0050ee16bb7b05010627bbf0774035f1244e20b417ec8135fb02d8a8acde59aa49b2cd2243072585626853af518d1ebe13660019b2a4f590cb7ded57680cb23f1a3722f751468003e06448142c9b3958e10851b9ad5a25d42cd127432f9b40e601c892d20c3731801946304cbf2fa5576ac161eae158290bd7e0dc99c03db2519af8a30c3dd0a949aef40990eaba1d6acb6fd3d82a0bb04cced514168a363c9aba08a86002f476a867bcdb2111bbb17812aeb569fc13ce571d8287dc53dd3a74018eb1ac506d584023bb5e5079c6b04237b73ce2d47173e8e8b8176add762ce350411e7e5be2e3305b054f79aca40137b4a608b7b087b12a8c9fed9353b4e9dab4581b7e9393459b12028c971b2c03e1280fdd92c51322b634c595ff6f7b984b3431cb64ada754bfe940924227342a2e2645edaf963d35e7ce8c66cd4f40a7f2149df869ca4b1dca3db9d069922a06332fdc642eb5c6a1d398ac8ec863432f26cac7fb8a5ca7e071dd66a9f98d04ab7379f59e0f9ce98d4bb8ef52b52f2963e30e0fb8509aae792d0306a5f7fe91716f2f8868bdaf3e266a1fe73f879bc6a5e30d831039f00371da108cf12430267fd576d1793c46d593a7ff15721cd88a39531924002fcfdbce40a847db65ef41bb91018a76a65c31cdbb35d0c50ef12ec9f5f1c4cc556ea8a251b4193b7d0f0be47f474793449fc6f13f7e94db7f1ac1a40d67f1b3338d82729daa357600d6d48c4cf190a93ba9593caccdde4a21db3672375bdc405c5be4fbe65335d15d405c4c5fc7013d090ef51c98cd7969a2854fca1a9d344a434ba9216d2490ae910ae81d1e6ea96a027671a8ec0403592989a19bae2ba33dd390a16eec8948c328b7323cc22cb872a7c7a50c4fdaa6b488ce4cf8c22347a2b260cd0850cbd093f4d192a30a1fc37e57418381dba8ae1dd5e958af947a9d20a44b191386d8ad59d8e3c705c3274655df395e192ac1bb5bc0d5505f73599eb54a610ee8a446a2d48b5c34b332ae9322c69209b857b024d1795c02fdb2454871f504f357a962b1c69b10a69f42c9cc5290881bc92069ddd7de05568e471201d9827ae9e2dc9d5f033863aecc51d1f4fa6ea0af090d2182786221e3429d203d51c48ecec9e86c09529eef09a20cf5e15c7e25bfa06f8908ad5a0a8653a59e85ea5a06ba6c34c4418f03091ef5461e94482665439c7fab12a1d3f6e68a9c047c8e9de88f16e0310cfb1ead9bea838c535dd0f77b2f570b331ef0f0e758ca2007e9bbd7c90253e412147346106265d6d2522464036492b04e86131fbe97670d75d8f7dbdfa6bef1514be9ca5c30c50c5240aab939d7e7a2f2de6ab2ff7fc2519f25852dc6bab201472ee828f8ac6f87c1eb7b643cac93487ebe2017583377126724df693e3ee2f2e3a72c5d5f3b2a1405689449d9b16073c3669d89a2a1f22e334cf520b22b0457dbf6c9715dd514fe995d7f8adf4b4b2e95d019a8ac083f9eb512cf9f4d79753181303d48806b147c4250e08d86abbc61d7267af81bb30ab174244e816c1bdf9befc0bd3a2b1aa10871c3e033bb638e5dd956e7a8b993db6ee9a08e1b03e46e44f0b4fbc910700ce29380386b7952783bf6fa83803a01b6a4d214199213227a82c8ae91ac1504081f759af40cb8997c7a71e4cd74da6a845e0a6d11847e0b3d432bb9bbcdd0cf2296835b387dfbddb6f12470b63064964d0ffbb705fc21c8cc20824cdae9e1c00d78f2f406e419590e964642c061123d1bcd828bd65af58b9344cad610868581dc16ede1899e9b41c808b9e7d4782166f0aba0506ba4ebb5d818d4da40668b9270b590ba1cdde8aeb5a7d70274e6def6c8c31bb761af5654edb2aacd8a1c6c9ca7c560d3db6d9275182b50dc677a5603689f236d8cf29578bc1421ef5b75a41941a8db2f6ce18d9326b535f488a4f756a9e9d63c0f3b5d6f72e004eaa1891d8b658775fb8ea166b3a900844f97daca7abb86082baf04ec9937f2c46b7172719d6a83df4ee68f7b74b66f9c2a9b78d32b92775d411146f122f9b48eaee075a024da5173e2c3db0523c86d85e39b7a8f4ee41f72797061de461993d43177a4b95e2e4f143a7440a95cb59a2373e3b1a4059031c60e8dae81574c437622c16ec67019b30d2082101de4e45623a7f62d891cd800a5e6f0da8c69d46805ff8c24d11a7b717773662f0a0789d914824c300aa0af10ae5540708d3ea8d313f54659def6ea29216e209b9be3a9c0fcd842f7b4248c5ccb23b1c8587a4976f36a410a6a54ba665b5f5356f835d17098d483d521c87a071b2876c40e36a2b087a0f4c2f2c09f66d329858d9f1924e68143253d99ae694480783024162d50a34315006ca5c5086c3aead0f818041a1bcf520a6c968de1c65d5f1125659a96e71b9aad674691148e9199cdd5049b046875298fa5b901aa6e72cfdb4bf153c08a780f091faa02739abc597ee2e027b149650d28c42eed0990db4dcdc7ce3fb98c2a2231b4b7e9f6ac2994d34897fdd6f28f70061ed8566ec7f2904ddabff4c51cec56d2d3ca73c76f8e0383e30434831628226b3863b8dd939a61ff0e73dafb74e6654219ebb184203dd1d813ca93c9cfcde47e24f84fa89775e9fa0e02ce114f64ceee37eb3f384bc936eaa98da09ce3622ed8ac04fb2d7e6c5ffd38f999202b33c4d4f62b93b23d11c5e786b2510e9d82f0526a10eb9bbbc1832eb880ae4b25064578fa7372fe12c54bf6026fb0ec478a5a71becfa0b3262876f206d195301fcdb5a004dba6f93e4418bad421776a54ad9a24bb18285b78d27ff05aace5080072eb0539f771b2598de341e1b6c5080c8c1d912b1940b03cceb1283dd098ff2723cc93b0c096955c3c65470e34ff42a612863afceb327bad2a8f1558af1daa645bbe3e5e73c5e46bc03ea516cd400892d2069930de40a7360695f49d522cb2d4ed617fcbe21cc5a310941ff5354c570bbf9b6e105482119d34c51ead879d5fa89659914b293b99e64c6539fd6c1474c593facb1b312ef6b9d73b23b5a8b5bad2089781494ed26ad0ef748d1159ecbb7e1120492dbde94e2086a453eef31e9db45ec3545940e70e2c62caf000553971f34662006423809fe12cf8f0c2a7d90b4b9a5a727f9a9d766639c1984cd17b41e7a69c83eb8ed29ec6fd8b072d4100edb510d6902082079445206a71848109a3b94aaca129213d8ab1d1320ede553b223cbf41f0bb7084b472d199ef127ad160d29620f0eabbbda6649c49a645bba335f9af47704fd5c563401a66ae824c3d43fed67a164bf8b568a8766d5b2cb6db596cad1dea59f473ca03388e0386b879e407092abceb1128a3e1a466dce8d43b13c2826d57a1c32365243cf0d22cb6947cc12341ccc33178ad4fb06a75708bbddbbebbe5d72359baf8d5a9bc446df926f1d498a71f024929d7fc85acf85304a251110677bf195dd146c078a4d7f808f6e678fcd47a1ce0bd06021ce426b32df2469290e494f9a4ff6d7272824bb118ea0c5ee96c3a1110dfabb7ce6c548bbc32fede65b8c5862f1ea4445e09c02d032f060b005d26f23752f78d00d47135238855e5f988316e5b02291dc0305340939db1a262b6d9f9908777108df3c5f76ae9993746e9817fa37c5846efbc11bf633c434aace813c70fa2c73dc80586ca50b196561d29838b3c55eb8c8e264b6eba2c28e022dfc779ad474e8f52604ae4dfb5c7c20a71d3de2848ce044c4d70baec46d5a21ecf4fd727501f7f95cd143f80a5d1d25017979684ed63c033c5ee2fcab8142d5e3b09392c45b815f5b0e2f79e1852e2d9d958e2e30dd547273c2f10a5f0a85d787494e75cd8cbae08174cd523d52191fd699eaf46e507364c4ae1e7acb5d4249cf9684ab1983c2f3ae2f4ac9190d8be8150aef1b4c734261c71e628223240f4181c23f0745f8b8ae61b3bb054c9d615a6d8645cd795387d589204b22d9a29f9257cc3759986e6a22ffbeac327275e32c74373d4eb89008e9d046fc12f36a289fdf55da9dd183dd2f5abb8dfc5f95b7b40347e943384cdf779c65f090906d0d65020a0e7534cb73a0999715620c1442f504261677ffa3d89818825fa300176dcfd82a7b12013142721689b5370a4c84d7fecf09e18fd9d41d07e10eac7e921488b745b0ac77bc5b8a6859c0e4f7c0d11330567a1d95207a66bbcfe67b94b4e6506623f55bd7086ebeebbd08e5f38b3915b7d08c1929a90c646f82e1db481999fccb8869722ceca8062e74b23e27d268dca160d221fc04bbdff47668f2619d9de5c01c188f880c3c171688a1774753feaa416c5436007319d0dd2c05c9b66a027dab940eebb3a3646a9778ee0874612af68297285abef3c783517ea3c0484db23be0899b82b48d47bc90170d647a84a6a04a3a7bfeb4ae4418b77a893c1ad4eb5a6ebe6faf4b686d4ddf95e8b31b7f67fc516e29a57846efb2a311e258ec6e1b58e414e272069d7bdfb690219c06073f6af584b133f9421869312d671ce0d1c85add6c14cf96671ec0d2ffb632ad0666249e950f113c71b90afe4908112ab3309ca457805bc6b6ddeff02cba7a413eaf0000d77ec9a460b0c987d003471847691783b356e5d431dcfbe6e14d3dafd957d65cdec921571167ea227ce26d1dc361fb256b468a55a22a40a495d2105112c370e14aa7e6e2b84e26de13d54bfd4c54cf4cfc9a9c34969a5886e136e4c5a869129c1fff01cd1a6bade6303087829a1da61e866e43f6ba2c171fcee461553fc8a7c575fd49a8dc1ca7286f78b79bdfa6115002a13b606c0fdd3b3fbde0bcad84fd47d39fe27b238fc891a8a45e89a8c0b0e11836b790bf24ed3b22d1a292f089f61d914e3e1269b860be839518b502ecb943b134cace736d1ccd713ddd74e24c419ab938a3061c92ef8f9bd72a121dec78cb3600b1c538de3ad9ba2baa40a54735fb586c114fdb7671a714ab0664da02514407d5a2b9282deb2927971ba60f285a38515e69ac0aecb1456a32644ec039cd484e44d2f81fb11109a402fff300ce4193b471d3161686a28b930852406bbbe5cefc7f839990ccbe9773119274a4b79b41364f222aa8c2c599fc37b588f133fadc95476ff0b2c0cc4db96146c7f01290b0a32204a59818863504029ecc0c31036de7ada9aa0e992f82fc9eebafbd4fd3a1371bae1d527a5475f92a1ea1ab916579eba8f6c0f1ffef9e9b26ae169ac72ba7a311599ce3e132897d47e3b4adaf799dc48ef0ff5a0e943f33388456c16ba00d3e9de6618329f66f5c5861e2484bf9f8dbf1bca51d6c297b52bfb5fad37830395b36d883674974930d8d376a6198bccffa5b921aee1464155da213b932b61599dd3f97e7bfa270d0726dee6e65b513ab5cff78bbcce9c9a46c912a12f5a124e8ec7ae8fb17f221507f5226033f183978aacbf58ca4dfc4212da407cb3b3ecc5ecdedcdc4a5991da8079163b1599cf27ba42ed1ef7f3b3db6cc7f2568de275d08c3aa5cd4dc34bbbe0737e065d6864f5f776ce4f7b8f4b9c6fbcb5748366c4fa9bbed9f1497f8f35825085bb9ac6fa2e8d854e0bcac72aeb997466bc516b2f7c6e0908e6a76fb2d64fdb747617538f3b48458639a4e5928519de66b0e1ed5a6acc6e9bbb2d87d9c1e2db83c64c36552adf965848a0112484bdbd2e8b8f94ed5a3ab21f03996430c839e843611dc997ae87de8b9df3029292e250a645936240b24929bfc8913d506f5d60c8d84776ac3c340451d01207524f7690b714ffa2a93f9fefdfa0fa75828288e51cf53b0335484da01590a901eaf1d97fd16538dd0b00c371fbca561e120b6038b41983f06f5cdcd16b8a5ea79d59462caa9f6485aeadf2e6ebcd4374b624d0c59c1a6610daec62d8b8de5b8236d9a8b2e4c961d4b4d5a62fe2cea6e8d10ae4c09b5df82e33e29e2eab185fb062b8125cee4c3b4cdf73c59d6f0ad7e03eec93d1e45517931b46710884a7e9cb42420a1581fca1656451efca92b1bd6889a2b8c641130df180ea8e6185a2d964e68920aeeb048058291f93c4482cf86834e15fd2d975c6abbaa3b10fde271798accfaa8b0eff181acf926ebc519342ad0333b1fc2f097d3dec60a9108088b74452a9d2a2da27ff397053fc4333f97c0b1682b740e7653cceba9736d7d158409b5e417ada8ca45d6505afad9932f8952ab094c1c0fb59d648bf95981f6978608a93391a38ce4734e061fc741b2c8e104261588c6f301820177179614594824fa9a90edd94bd0f32ed7a9ad4e2c3b52510d78c102e1cb8789cd5071801fbd20e4fc7bddfaa7cb8d429229b95208a1b812751a6ce645a3cedd5ae541c2d4b6c6986aecd1b4b2e5c2aabf0e56e05c8c5768a33e6fc4eb370579c06d93095d0f15b327b33b470ecbb9b587601911bb9d686c598ad8d70f2cb828204aa29fa218cac706b696f758e6eeb50785f98ffa999e8ef36534ba19a31632872b81c083b66a19043e0166960951dcfc30a3ad143b6ff10e08ccc465d2f38767eabbb0017c68d5b1a4b24b236f5ab5a80f911eb90b0d9fc0b2269510a88437771e8321ba828bb5376c4fca93a89d0697b1e7d66f3dbbfce4137562e2936dbb394e070e406b7d63710adccf62d356818bb80ade50d4c2bf33b4b091e472e506b790390caecce5607c7b11bd89a88b553c5708bb294f008c6c8a63801a694c3a279dbc45425bc1a9b28f22c3124f5b43c8ae6a3e64151889448fb41c874856c2b7fa0266612871101c2cec14ff7d23010772c5cc38be42e53afd6913388128771894239327393d21ef313e075421a194baeebaa1b688fc67c7ec47ffdf84343f20bb145e02f5348da1e1dc97814f7161ec357238b17f9eecabd63270db229c1a02dd2b00c697ee1aa66113b0c7cc18d924a93cf69d277868f2ba4fe0c34383a936275f30ae8540420c416802c2379a154ac9e8205e05d4559dbad04a786f72ab9064b0112d0ad45a866ebd48fdf36ad0f7eec69ec7e1370a7da5f484925cba3399b8e9c16ba2b00cbfabde33a28caf63a35bb581ad441c130a2255a1ea46c75ec2cc090e60185cb6e8acf97f37e8d8c4ac3e8968311e36828db7f97d85aeb0f0b1827143767494aebe637d00750d3afea2538a3ade31a46eea6818b4c6c5a227c4d86f4c94f7ba323592c3097b935a8de0c6a9963833c3e54ddbce8cb509cebe99d8d6281fd199f33bb2d26704cd6c751b99632ed28a8fc7acd0fade4f22992fe581437333dbf2ae360af541033c4e9930462a5737b9ed481bfe9844e473bec1912d1991e5a21c65fc7cb0f9bece9cbba68fd21dd467203658c87d9ecfa7e28abf65463acd3c7bb147557292f6b03bad81aa886b91a426b3173669b76d03183408c2e99bcfebdd83abeec2dda9813733b357aeb2498eb2a11ccab9bed7370fe2f3888fc48700554c1f70f0f39e77037d5e73d1635c1335591ea0c0da1c0db1b86c5d1e8c47fcc539dd760ce00d7e74854cc64a4202ffae208dc0e01d3cb0aaf712fa176c1a7769efa68130f2b97e0b907ab13c3579d22343e89094768fa2dfc93ca0bdf7bd6317958f13ddb27555b07de481828168c1b0d492f9336feecb16ee5a0a66f1b56bdccc1cda4d60b9ad4706a8398ac497551bf2ca4a7ba85fa25296226c24a6c4102ee78990dd6920eaea309414131894d2213afc08d27b9fa4dcc606f6f0f38f16a81a7e85d2b7c4d692f1a35683936bdab0b96f47020da0f4bc8a0b74fd484ab43db9a394a7c1831739f047a94180b09497b5839cb1e5d9d19a8d58c7fd0cdeb2c5b02c8231f32c257a6d1781706903f80157435e8f6e282502dacfe2555b8cead7b32f3dbec50b2b2b9f69673023b349a21cc221642b25aee17495cb8dfb689914bb31ce0596c090ddecd64698a714b88454541b1f8e829af6c37a67bdc18a18c78bb4dc283e561ee7e0f970201eaa12ad5e8bd64917df4a1ad844e2fe54b01802f3f51a947cb69cb0a757d8cf7a58424ca0b40545c47639fbd13624fbad94d7d2ceb2e93d30a41445ba9e6a6e7b8e9f2406f44ec08743b93cb41df02b01bcadfbfbb16e48e38f7b7cf4f0a78462483a98173aa5a1ecccb049d90db874d1bdf0683b6ae5c94e543d7c46b6b247d0d61be7c56e46ef7392642279bc24dc87bd4ab16178fbdfb5cf10d106294d804241b3403f76112668ff01da64724e3ba39ffa0276ff9a4098c0bbaa9e4304db081699adb6e138a39cc26f10441d62f81674ca67814fee34b27991666a5ee036f59e33be45de72958d53b5866f618d12b1520c81d9474fdcc2c0c764c26c1d8c066636ec0f8021eacd029d4e4a1f950a22b2947d1d83ec67b540774624803ff58930b4bf1348275363152b06491652367ef61bfe6d015d50f3bbfc0b87cecd05fba5bc8b867ee4347a28516b202a5044ed36c68194ae288194ce0f53c93a068d9d742a3d425454a20f10b838b1486b8244435b20fa3e22ca073c27ec40045c889ed698bcd8f859d95e6548a1212ac89f69d12beeb495b4ff89a2b2bfde4829e188724f49a1ccf7c477ceb67155a8073c63a66a901755d945d538c75e7bb71cf6b256b9f394ecc895514a241349381572918a7dc8499b7a5d78e7888ae657c414a243bef04f2fffad275f8aa63c225a4c7c37b1f614fc6a61e086883e1405adefd4fba0ce2c697176b826be02cbd65536cab5dea5251e6d41f285d2532f064e8d9d720d8c2badfa4e918fc72381ab39f0d366ef8baf6876793b83d057f98aef23a535e4c266d629d435580c71e21d2b2a375f84a9988a1940f0056c0caba1ea67ab76e53e5cf9b6965bd77b9795444e9f2767388add5b4b2aa43cb0be82713ac07da0a8988cb96964da937a2efbef54404082f7829f9528ca75109dfc57c1c0d16747d2752f35aa72f23fbc41469632d995b42fbff068ca501723b09d42f140489d5a3a2c2634e8b948758c9589323218703c93537304ca687625eb17cf8f6536b28f977ae815064949d5f4c157f21140609526d62bd2021522668bd9dde831ae7b93ad86f43e1a32036aa89569b3a001b9b28b14785b706ca26a59911ee57d21100df45c412ec764a0f9544a293304ef63427dbd1780712302c47de5333a69d0fc85b53eddc24b97ecb184cc0161f6ee57c8fc2194484b77cf19ffd1bc7f4890a90a117d628a5caf4145c4deae9a9ca08280832a123715a7c16632ca50d79bd80e6480adc180f849e05d7f3bef2fc6190a9bee7de1bf1bbc36491023fcbaec5866317fd341394d249b01bb5d33a4e1de886a6176f1f5920f7712f97d0e7ebf6a9db0ec665dbc19a2fdfcff46f2af1f12c40ae8be4298b48ead2575159991d8b10756442833219e72c3b91abc4d154e660d6a6c48dfeb2b02156617b33ad9d5598151537e087e5d6782464e86a669be118176b2a9b596b5352cd54285226e39c75a16294689aca0cf6d895b8555f26367455ec6fb6b583aab3b670b75c465c5f7faf22623c879c078aba918995efdfa4aa9bd8347510a049329a21ab1ac24c120e60e71c8927d9921082413425eb58f0337556a831e71fb27af6872a7c52b029a2d9b479ff03d6c19017ad41d2b836a58ffd110d8c9e96083471c4231e7e124035aaba2e49f43a93075d09ba66ffc8fff51c92a7fa9ee7d3e0580535532e60f215896e0e53c1012940c35889f9cc339832b4a096ca24349b72b60742f8c7db87b0cd4cd1965e7b3c3f9b197dc7e8eb5b09e0de50162c3e19e90233262ffaa1b2d59133457184471353aaf6fb25c8021807e66c777ff877f85a87e726b53242b26c86380a299ed0af4e56d4b737aa251d4a19391f44331fb034b6464ea1d5827f94658f06dd18980a18e9e328aab38db587c96f58a8e815408b1d8418040f9b6822dda3452075cc265435e1b694a562c4246ae51de2038dd64734fda8a3b93d96d141fd0dec2314b7500ce376c4001f13470a1441ab561fc00f7546be1c4248eef6c1db2a2abfa7da318aff6cb30bf7d250754402c307f53823ea980604b104998740cbfee6ccb3ebecae3ffd8893e28531edb87135cc4757ec21e212c5c9c8f02090b8f6df924b7e8cbcb9c901dbfc95422acf0a7da9f050d031140b43f767c4e01cb138eead7fb6ea4c129d2cb598b4147da6cc14d502353d508717c94be6116930232c25b475e4b502f9474764aad539e02796fb54a5788e4ad369916aa570b10152e38d058eaae0df2362c7f00f031201bd9a160f9896450b9870f4af751b640a5bd14cae22185da7b393c724aa497a4ee2d630e809f69e7d5f38c79687c2b566636063ff05c95bcb686731531081129ea45a21ef0d1a174262c9dd305703851af80d91d32f595ff50e6b2b4dba8916c299103c95c21e0ea370fc2eb8feffa59b4b1a9234645829d2bc01093bbcb457c716e43b5fba2167902d3e80c9b4b4cd431f5faa0fad2d25b9e489073e111093b68bda04aae9af3d142c046db86c0ba910557320e5c07e720458d57d5ae72180e8de2de38423a4476c84421c276014d1da1a5a2fa7adfaaa55a6ce5bafe707db98d9233d3fec738be1bfb37ce435afd72941563b25463f2a2543cbaae3983b81e23fda57d484f4a791d0b9c9ed54b5eaf8b54159e94bc538f56211c3e93324771502cc0c99ee20923e7e34f59614e5c75cc998176df187fd0ad2213ae208a53460c4cf891c7841c2349a9eaf98d6ecb215a3877ba697a71bbe64f848b4ed3c11847ea659e7f8a229bcbffabc31859b484b63c23833a9cc487edddfdc8469911b79855143a557e203c684fc011eb60781535602cc68e9d52b094f854ac16fbced0398dbe1e092de43660cb451067ce15740176d1e3270af4f5a5a390c71b4f54f6f9637c7cc010692e8334a08203fd8b59984dec6688075ed89de852955c394aa854b6f9dfe200c41011738efe4b83678bc58916288838d73f0dec29e769c1936dc2de7c99ab25554acd00c492e877a4e65dd2da4cecf0ef8a3c26bb94c4046f34c90047a2c8217966ef342cf12026b3698e29c1871fb9fce4d2683f5c55357d0ee158c712b2fb7a4a92dd74f0992a8d1c19ad94f004116c5a89e0b0d3f1bb6e1c9ebc6a3076bd08a7f63af25ff1c7d4b7d258d89f0230aa2569e6f630f38f932adf0f3799ccaec6c07f0fbb179144e14044c0a8f2aa16612d92e0a3af6c3c002600ce2605fff340974e09784f847613da77bc968a47a738a1e84f97fa1b061a90985f36c31b6e4d3a62dce3ef632c7ba8f663fe3f18d243794f12e4eeb4cdf16c2c1bd2004e09754a8eea86caa533594a12784c935eafbe307b82e4d5f968906c97bb81f6091636ca38fca195aeb33a509dbfb99506b0495f50d8416c215fe472426ea77ac2dcbbd8a529b1cbb2e24fbcc884f835c238e9229ae28815e6c92edb9466ead520841e18a5177ce79230090046070b31b945a40238fc0af9d4c7b7327c4fdbba33e6c1f4e52e8deac8a26448fbebc111480142feb3e47000508bc9bc38838eb697ca9790ab16f463a0c4e009470e8899fc5799c130d091f271a877c282da0cecb77566a8293f775119c62226b40be87c4d2d2d0698df8df887034c0fdab2866f91f24beb1477113941e4abd7c8069d642ca6fde57638e74d7c47e1e10ac2385a5939beaef629781eade175c447151757bf9e48170bb38a2bd6f455bfdbb0fd45ecb6b3a93003121a1f56cfb0dc0855b35a7b50e8d5c663843aa5b76b1c1531c667f4113e5488f57267cf983f1c32a4831649d1ebea5440bc0d7c76baa057140e828432f2c254328f76e0302ef8e1c203212f163c30572341c44e6501818204130faee73cfb732afa2ff66e0f513966d1785e59c4ea77d4e8585f8684ed2a8549e63d903cc06460dccd62a08a8ffff1b0a206b655db9bf7bb709f8f8132736cd7103c50bfc9ee110dc64d1702d9664aa1d5401f3f9422d426189fcfac3440ceb0f14589313a59e880acced838290e9a110e8f1ef1a6a3953e03d8176cd99827475c55d407aada0b49bd56fa6bf8dd2e0a7ffc6b4a9669a5217eaa72e53a0774feafd010066a8b4b59e68dda51e3d388529d034742d7c11c68a3be162076d75315ed59014f929478157d5fb30e663dcf3587c949b044bb57e85418ff133c937e4a280fd538259c6d306493dc2e64de04975be6687fbd5b931c4da011861a7a579d17eb47dab4ba4173fe98e811f231fc67c8c77307061dc8f8183513e61b84123fe444a8ce66b4ce47df558e4123b3c9de6761c187331e4608087a113060e8cbc18f230c6190c85f08c232aabd63febdd6ab888591eeb173dac2b440855bf6825542133f7593fcae034053c72d2b0b68485f48cd5625392f3bde18ab246d148a862e8d507ded2c6223a0eeca21aa170bb0f1f920230bbbd378d0d290300756d807751c0b7761176cb3138d10ef890aaeb1369588101bf02286ff8d2caab1c390529dc1437813346f7de6428c8a01035a2285b9e3edd9928c753006f5d91be400cc134e9fb08334441802ea31e0924ea6366a7dfda52cb9016860a85908ee1e94dd5bdb8dfe4b486ea75e94c2a05453e900210ffdb96d5efae73a1c3bb288fd925290e46b0a8da754982b922c1f18dd39619a01b47d0de332ebac66badea3aba8ac1ad6799e3249202061874d9405049c933e9ba29b1efecc077ca5983889936427f987d3ed0451fbd88c1b88c69f24b8194e698c7b532369d3d1131627da8ba67560d7606a654892a755d692a217a63e0d8c8611f02b1cb899e4cbda03046321cb18aa2990641e4cf02e8f38767feab82c41a8815eb652ac9bd0f7979d4facad96b3e1ce092ec919d98002182326763687449725e5b262febb7bcc316adf7d307013f0832ebc39af3ea683120daf3842110b1f0853a8eb1b30f30c5394a32f2698549b48ca08c93588a5bbf2d3269062974d9701674a0b52ba3cfb80ce5574a0a3064856151d5ac72a5cfe3c3a87a20f5009a7bb55611211542e98d86aa564099f3b3acbdcaf667f4a54b4c2012a257d12f60da33f4389312ab8b71c68660b97bf8dc977faf24a9594d2b3454ac087ca1ee13443f0b787bd9e55c334376df3c1af4c6de725889073e19e49ca3b9e2302d8591202a9f9a36ec8bfab8cbbb1107b3d27065fda7419c547bee887e078e6ab837ddcc2c0e0f914bd0870048f890ea4080e7c61fbbfe0c3592c508e196913c4f4cadda20c2dbeca89e53d45e7339b7dffcbdeb775cf7f11b9f7bfe85e7bafeccf1ce7ef2fbaedff8de7edf7ff90dd6fad47a4641627e09c93ba93bc260ae77147373f05b0400284b05a35f34cbe47f452909334371d9171a91e69ce84230221e1a002d8ac4c90df6366453e134cbaf24ae359d17b42795ee1e37cd24dcc1dddaa28f3cfeb39dfe54201d35f781e31b8de0d744e823b5e88b3c7aa19ba1aaa967268ce2550382862d6052ca116c843c537b196756d3b28e8122eab694cbe1594edafd069a4a993a51c2309f3a6b368171ae1150d6cb4ae2b0c6d98c77921ef8f4ee22838a4327807095df3770d26eda09963f5bd7295219a9da8323f4d4d927102c2c47e77de67e4916bdee9848c5d831ecee41f36a35a46039a295ca037c63cd4544dc1e7bd9a5f0bc578c6d09050c5488389d1099d16a08a82ad12fc8fbd005501ed42b977f228570cb2a1c44ae84f8c0fa5d9440946a37970061a1890c963b117381b024ae6fb85454bbf57f54c250434344dbc4643c3495b310596d77f038753345c7c8055b4bebbab43fed130d9679879e7ca6eaa42bce0f338b236f54aaaafa817ca7682c0b55325286135ba54232156553d83727b7a71b465b19112b2a44ef6226a318e901bca63b6fd7bf3549db2b0b1c06c88f341c22c50bfa9378d77b590544ff1019c251a7f61f52d8be084114d428c2c3c827b67232278714c9ead6066d7addced76f118bf27d882bcffa8ecc828fd9700cfd2244b6795813691248cf074977bbae0cda7f1098919ed0d5bee26ab3030b826370c19184c635df2243e518ef3149d0ef6b76436b23d7108caca15be2a47fa166a9bc071b6f732d7aac4e328d2991db3cca096965f7afca97c2e750b6ce99523a539d1080f76e4f89d24c774502085f241fa8f217825a6c8a83e7d3434f8feb5141d742af187ddaa7573f73d3f3731fbdc60c1f867d592995894604e05b97274429a6db024437d5199fd107b2cdd7a3de3da8e7840cdf88b5dd4ca6b1d1ea741ae0d0a835f8601a9ff70708f993cecb9b9b2073441e047b539c8d4b244d2a90b0f92f1e607f74a8d4a9f292f26626fc92a83fe2a5432f12abc90e8453f20409ea9b04fa60188170ad64a3bf5dba355a65dfc8ad320942a224a60fcaa79c6d8bfc0978668adfa55f092b85a9e5d1e1252fd8323b706a0dfcf6639b12224d519a23f9c1720f987efbf74145052302d77cb1c108c0818e388626dbd4af2c11971bdf4568876c21be53c0a9638dd67c0a9c941dcd89321aead2b75ab68413757278942164ee24bd7b9fcfa635adc7ad9462c2fb8bfc59709c13c23bb3ccbbd4019ec00f4105754e5a69dead636476aadbd4ae1027026a314474712a72d6b2581854cc3fb4af9a63806b02701ebb4451a7f77317d20d9acfb08f3c48e2bb903375de7db13969d52c72d0e7f9b5fb7357e9914e522eccd288b59a8bea7d4dbde9f3eefeddb0665e2ba935952ed65ee23cf047e853d4728cf62402fabee9d93d2478c6f8163353e19cb3402e2cf73405f13fd5bdcdc40100f8bffb25c51634c834a22af0fa8b4e72befb34ef476053c22ecc0b0da97db6c7bbf78135bccf5fe0556b9205abd5a87f2fe8693fd96d00ea75885e618939beff72088a79a1ce324c5c405c91e6d06c362a060b018e54c597aa700bd529496ea603508623948db0f60988c1bf10c5ff07323306f9df4553874da4b665491bc76f2addd649522c95d31015e03e8322a8baac1b494b7a697fa491a5c1c6c205d38a024178735a1f68a0c78bad24f212c1ad0e3475cbdaeeaefbd224755fba18777a224776844bc52d9123f7d0a69af7b59179797497ce9115110279182215fd32aa50d745f86c6a01e203a2d8044a352ee61ac456144a76444e6d394ce2512aade6b57d85e4865a4cc4b7030a6d37b75b205695750ee9cb1cce8493fa0678921eeab30d0b7d6c1fbc4e1ebcd44dcf954489eb5c4822235059f1d871fc847c5dfee24072ccd77332d176dffccb7cebd588aec06ef284c472c7fa7edb8a6b1d640e5dd7c6caf6dfffde524a19320b750b8d0be8f79794fabfcdfeffbe145dd02eb890f175813c7d2f937d8a88d1bebd442e1192919ba4c40bb57996154cfd977b8fae12faeff26e7fff85ebe27a9fadd66af152a769b55a5c771a9a16cf9d869726b3f523e64bd26c71b2d3701a9a2f512714ea4cdf05f729e27c1bff2ba2f738161fc7352f780b7de5fb764db1b262c4bcfc2d2ea7bd534c39eee568fab8a99725d3c74b26d3c747d2f471b19727d3c7b56c0b28d3c7b38dcd97a5e9e3641ff98fe0a3c12fd18be697c9b7b7f8edeb8dffae0a7e578f1780d320cab8adf6e2264fc157e415bf0bfe1a87579a18bf799da9fce6a08d3653d14c4b666a32d3cc7520bbef64a6a85ba24e19b2f778bf29f84ffec32af845fe02af21d3e415ff8ae790d7a29c55f2a6c8dc946fd7151a9d8bc7aebf6f5e97dedf4f715dce1779a9efc7cc4dbdcc66e6a5ee82dfdfd8c55e8e2e380dd9167277c15d7c692a4d66e6b797a813eaac29e9e973b2637eba29f85d1c8555f0f76af8c953dc1577c5dfc2e88b0bdc55c1efe3f85b9daae44dc14fd3fd929a8828486848889021a1202dd443fda3813490fed1432d444a3a9224c99124a4554b3c898a5a99486f511b4ee4a88828486848889021a11c84ae5a6216faf230ffb4de8667a0fc9387598891c624df9124498e242111151d11217254441424342444c890501016e221fec1401808ffe021168ee8aa8534a2abb7e1493afe1afc34491dbf0b17ef1bd1d525f2dda3f11241df865f221d7f0da7e12e50ad73f1a7d85af946f454db7ff12b708d5959a9ed4bf005555bd4064dd5a4d434555bf25df0d246caf7f87bbcc5dd778322fd227103a328f48b840d907aea5bb4e78c5423d59643a2e1dddd7cfe12c7dd61117cfe7207ccc33d3e7f9923bbe01d9fbf0cd23a9f2230103f7cfe5248eb7c48f036c81f1e01062ac11f0842a87533b868800390b4ee01641049449e4e4127a213124aa875317c7e5490d625e0f3a388b44e019f2df034dfa235dfae36dfae04bf7d89f9f616b5f7a8bd44da9bd4de23ed4dd2e2a1ccb7f847866f31100ddf62a11abec5433a7c8b85b4b8a8c5472d26d2e2a4161f697192360fdbfc9381da2cd466216d2e6af3519b8930e0db9c14816ff3110a7c9b9354e05b3d6cbfd53f387cab8172f8560b2de05b3da4852880eb04f01c03cf1ce05948064a82f1043806920004b88b0738a001fc6758400e38b415a040041880800318a0003010600002080000d8175cf8751d689041e6061836ccbc00c6046d6af8d5381aee82a337dcd43190f87807dea1ea52bd1dbdc7a5aedef0b1e31f381e8204fc072e01dec1c58e3f30247fb8048f83e0c17b536a78841d07f1250682e712701f176fe37f2ed4227abdbf793c041e42d5a57a7f37db7b998c87e0b8632038ee373d15087e3b9a57f18110838408fa12ef0812e2cbd366b1104141429882c41bae7b399a1808fec3c56312f00f827fe0f10f2a3a02ee5344ef8747f0a730bbe0107cfed327bb601064170c82cf8f45808138f9017e350ef7e05dfc1b9e7ba45028ec20f8dee3107c89da2c0e81aa4b6110840083e0571204ea4a5e7bfc76f17b1c150a85bd2c9937a5c9bce1a78e3fc08bc01e780cc47d8ac03cb007bec441701d04cf41701c04bfbd9557f183e062c740f09b57fcc30e3eeec03bb8eea536f10e9e3be6c1c9bc8ad803df7bcce3cb92cd621eaa2e853de08197c99807c71defe0b8f7f8f6809acaabb883df5ede12dec14bbdede9bd1b4ef6129b37fcf6b26496a6cde29f3791e64b2ac6939bc53abe3cf5f0a7cde20efcc9878d7f62601ebedc2cde01e7f85234cb331fc949b42e8737e1f8961c7e9bbaf12d6ae3dbaff1edda539f6f577a4a444335e35bb2af647c9beaabdb5fad3bc0af7fb50e018ffb9c85685d4dfbf971929e6f531d157e4b7694c8c5f32dd95db61aedafd6019fe5afd6bdf896bf5a37f3b999ca1fffa05a27f3e242eb6c76582c9d6f533de75bb2b75a38dfa6fa7873b50e00ffb2580ff6faab7536fceeafd6c178de5fadbbe1611e23a574f07258e6c86b0954f6288372e923afe50ebc0492579d7a8c436dc9540abda1b6e8db50db5f6b98887c4c4734d4929ca1b6249611d44bb5257bd4d644d23af387473583765433a5a3b6a91cb5254d9c53d86f54195e72e12207041ce04dd3007f1a7f22ff515383dafb84420d451a68f81287cf6401fe04c39704f81219ae6ba82102c136005f0ae04f437200323cd3d0b027002af02ffc699743b2fc72346538fe89fc878dcd974353799eeee9870e3a7c3904d23a0a7cff92bf2df9fbf2afd6b960ca70d34fe43f64f818327c79a4756689a475bb4c92bffcd13a0b7cfe7248eb2ef0f9cba1d631e0cdf2689748bb4cd273394cc09fbe7c33bf5914a4751b49e386b4ee14eeb3682705fd685c3687cea1c6e5a11f31a86e22691d063ebf99a4750bf8fce611ad93e1f39b49b48e019f7f0bb52e039f67f8fcfb47eb1af0f93790d6b9f8fc3b48eb6a3eff16d23ae0e7df435af7e2f36f215a37f3f93791d6053fff2ed23a1a3eff3ed23a077cfe4d44eb1ef0f93792d669e0f3ef24ad83c0e7df47b4ae86cfbf93685d043eff29d4ba0d7cfef3fcd1ba097cfe1348eb683ebf8948eb6c3ebfa948eb6cf8fca623ad83f1f94d44b4ee86cfaf91b42ee6f3eb24add3e1f3eb235ac781cfaf937080ebc07f033c8606381612e438490dcf19e0990806b8be00d716e03a079e71e0198863221a97bf021c5380dfc061701b380dbf1a37012e8108f01af8d53808f0077007701af8d5b819fe8203b90b7e35ae01fc6adccacfc019c065e057e316c01590001e0347003f0037002f00878113800f800b8007800380b3fc6a9cec5fe02ef0ab713db473197e7f3137c5c4a3a0ae13932f4b25793ad1bce64fffee9eeae3bd97d13d8e3b4c8bb6e82dea2d7a6f928eb75888056f719215bcc547722ddae6a1dea26d16ea2ddae6a3dea26d2e52d1a2ad1ea6e0ad16ea2ddaeaa1dea2ad16d25bb4cd49bd45db7ca4b7689b93f41645d13603f5166d71516fd1a3dea298486fd1616fd19fdea22d06ea2dbac2db97dea2adfee92dda662228bccd425a9cd45bb4c543bd6dd14be42669b1909e7fc5db4ca4d54048eddadb7218dc48c1efa85d0e83a9de6ea220d95b13513025f6b607ada9a1e37006a977d663c23d224fee799e163dbd530907c3f2d2b4ce9474248970f8231cfe0005090dad24598f7c128a9422727453e8af2b2f4740422fb82484a8e8880810101010101090909090909090500684f27804484824d1d4a3ebafbc00fd808080808080808048adcbbf9524eb914f424a11b929124d3dbafecafa728b5229fd83a22bfedd2f77fc4ad224b58efc01914142e8d00bd144486452ea08fac2758884848484848424242424242424242487a91f14e88356a1a19524eb914f42915244ee510afd170d847494858e200961e10e203da485648d4426a58ea039c90bd7e18bfec9c0cd4342888a8e88081d4922141212ba4848f7662020a07beff06ad1f42bfdc69ff8d3bffcfb955aa0454efe4a2d406a811046022ab540ff34d744bb1d9082a4da9797ec32ea4a5f624d3725ff10f7570e916a49563fff813b1e26c0c7d49a78111710875d8b44592c128992c82e3988c37e945dc627c5235d1287e4934faaffa3f432b9f46d4fd7c38e79ee772be05febc8967ce9e23001f9279637522df9d29a449736079da4932252ee1175a906b18f218144513ffde9f751cf667659fdede9fb49f2afd6e9a3d2119cc264e9c96e76fca92f4d8eea25a1d689e8a31c9f7a89c8c4a7254354fffafca518bce0f24cd4f0ee589f8b5eaa166a8852c23f3581a626d054c5592a16c7bd2435819ae025af92c7affab4e4cbbd5995aa4b95a84a76017a7a492ae5b7b34c933966b29784a44a442669964c6e2af5b13c9525bc7c938be59b65692a49d3e4b997a712659abcec251a77a743aa24e3f27e4ac2bb33f1f94b3ed985f5b0cf5f1a6a9d4ffa2f95f8a523a86146e528ca3a95e223107c90143e50cc8039ff44eb4b6cdedcf0a07ea8d8b869fd8acff73abef7bdee47c7f7fc65f2bad3e6cac36f76f7e2b8d9941f7194d9c428f38e2a364b7b152a9b55717e65b3a75fb9b16c96f62cb29b6fd96cee5b723a97cbf8e672acefefc538e7cdb63e6bbd59db6b51dc2cebc5d76f36c35a5a5c9fdbec49fb1567cf35d39dcef473b9d8afd8ece79ec566c567e1b259fe2e31dd66d7d7bde897978cefcbcbe974c1602ede591bc7cde27eecfdbfb859d89725d3b4f3e366cf1f371bfbd297a479da2cfe97948eaac5f5be979796966fb1dbb5c0c0a4bf42c3347e74743e6f16d32063ba2f459d52f96232e4e1fe88d03aee0eeff8fb7ac7e599f8fb9ac77561793d747590ab85a47cab8768220d04e35b1da48dd02c6809010a764861c3b18e58ac38097d863f355aa45e9c3b333acc590cdc830a981925b513dbe5c686903c24131d918b6430f93613c945325236d26f4e3a9291e4244b68a11ea29cf01842080f0481e049807b3c1601fee13110380822fa97a7b937fa6749492a952a53a64a55ae569b4df1abd7ff19df7739a1f2d8b8b9e141f5a8d8b831f9b0420411bcd461602288c04470dd61c0782230119cec3060c0e8adbb2f4d38eeb1d8972c73b5d167e156cbc4c4049b982727d8e572cdf46c96f19de173060c0c4e490dc50c189713aa8989898909d75d071d4c78ee3ae860c24df8ed98087e7bcf8f2f51d3b5d1477d2828264c983061a69b453f7d99afcda6f8d70d5f8d1d73a663a78718670fc73f5e56f3f125cc7c6df461ad584c2693b564e67f8b738ed3385cc617d7f2e5dc6e3eb716356a1cfb7855555faa09be544dbed15767e68c66d26827cdacd54e9bed4ca153a4c8f8a63859361b8e454bc8b2ad90e13bcff334c1cccccccce93ac1a36fc3b5fced040a7eddecead710fcc56d167d5c8a139b4df127ae8a5651c9f8aa9c00080402c553e84b14e6893b4c280428e0c1fb10fcf742016810e235d0884278e0c6cbc951a3452a0804b9198e4d8e8d922001c74fe801c3b112484a78f6c93978e4a09b9285f8e186671f40503c0ff9b1e203cf4408a2485e33523682a4c4b550fbe89f1d5ceb30c1f58eab79e81e3a48e334101d4477ae51f8a9859b298a8e5600b1cf095ee830410f3eb68a49075d4c0f3bfe55030975fccf77a841d96c8b163b1eafd75379862c164f0786ac1d7429344cc3e5feee6722b908b9c875c17d9225b4f0e75beda3871969e6db9c94ad90b1c0b2238815316a2d30313a28ae919b14c4b7ddcd0fe68181547000c59c2ac7460b7ee325a5f270b2d0876fb34f1ee61c3954641f59280f09e9c0b77948bf44f9881dbecd45f9a8071e4ca09c98902594e94bf6df2f5f3f6af85266c636fab27fce79c94d75b3e8abb3d96663fc4c8556a122e3abe28688c3e3e1f830d3c1c3397edcac8a93fa7af1529f79bd666666665e9cec3333332fdbfa25cdf525cd9c6df469b856b3d96cd866de6e785d577c735311e29c5cae05b791937bf971b3a91b220d34d04003ed558efbacc7973873dde8e37c274ea04081c287c24c91c2979292b242af5891f15de1f3ed6e6eb71dace7e6a622c4aaaaaa338e7bbcaaaa31958be04b1566ca465f858aa9b262aeacac982c9b459fa5c56c6969e9b44e97f1d5f15baba168e9d44ed4d8f189a2286211bc288a2fd80f5fb698b98d7e0b0b96cfb9e02076bce822bea456bccb6663bc8bb8d3bb5dc677d7ba5d8471fcc3638ccf1606e24b9dd9ba18889898981d41d4d4d4d4d4d4d8d8d4d49840a9f1170a400310bc069af3c484e3e8087d300f151c2fb294cb69c1b15112319489a723fba8f892cde2d90790bce621992885e723f26a944b9e8970538a7055f0e3782e9291b291bc22c94b68a1f6e9819f50d88cd1a273e2450ffe01a8b28145f08223837be4e0a12145dee1a8e39f49eaf865f86bd0c3153536b7dd6e5d9f0703e3f39d2a2c63b753ad60193b951f379be2c71b9c07c52f07ed747f3f0f71792e7f3ffbf83613f5e4221bdf66a3deb7f9280b01bfcd4334b0c15a63963b3566b81c111ddfde2217e91ab949d8d60293f3e3d289817d4e161e4e91113e4ac1c1bfc5494a24c9c2ec93873947fec9402c56f4c0430776781f727c8b97bf5fd27ec8f0658a9962a39fa242858a8a4aa962ae6c16fd15161696526ca15bb4c8f8b6c0799cf366792a66e0b0a4e0f891c649a3f15207d26834ae3b1008a3f1dc81401a273b10087ca9b52f798bc9b2d16fc1b9dc8a152bf00a93050bece2e202a3616032be3018c6666bf971e5c0d862f8e860ce39e75c771919ce739791e132ce6fa771dc9feb4c978dbecef7f2d2a2450b5f0b73b7f3f1783c5f8c8e89c9f8c6dc97142e379be174b472b393f0e63ccff3b9e9cff3c41c7757c99730266fa30fd3ebf9cc9754697eab25b3595ce3655a3e8efb893bc618973cc664c7a56f7f1963b6b629e8cb6f9636363636363636363636680fbcf3c07ff78502d050038d107780dfec606b81f9d109f289f99083054705c7463470c85abcec90e4350b73ce9179e4201dcf42b8f03c44f69181e42199281f918d58ac58b9b9c353d4c0b14e313925333c3cc394a29211553250c7af02873a7e1e8eff047e198e52362d3cde6cf630bdde2c264646cbc8647c65c83365a1d16c377a2c169a8d9e1b11b7bbdd70385a3bbbdbf0c7cde2193c2e558d6f63dfe2a41dfe795e0c25ae8b9a8730dfe61c3edfe69fcc2303e12336dfe22419c7ac466525058d1ca27bc42d323a92f1ed2d6244881343b3b1e09f1bdf621e1d03e11e367a665cdfe2a12058c8907e3111363a4a0213998191749c54a4a440f127527f61fcc70de8bfb468b1dbedca9dc9db2cfabc120606a6147ddae7cbf8fac8337d1b0b8d66bbd163b1bc68a3e7468cc578a9dbc46231aebb8d4d8ce76e6313e364b7b1b179d97fe982317d3dd3e79bf9624c5f8ce95bf952c6f4c9a8c898be3eeba68fdf5efe4c5fcecff4f15e5c39c73270cb8a9373b95c2e17d71d060c17cf1d068c2f49d3c5c91efb1e0bf4cfd9afac54dea737faaa19a6f1abcde6fccac76a96cdf8b2e499feed3e91c5c35c2b560483c1a08b5f0102814020b0a6c63455a4f0df7da1003256e470602950d0b88e9085639f1b1cf3b8e1b8878d9ed889d48de3204330110e8e8d92c82c927e387ec24dc11f8363285c15fc2ac74ae4154916e635fbe41c3cf3d0719af1726ac1162c8c61b198c1edb4f050c671928effe437af3700611ac01a1d0c0ce7dff3f962627260c4ae7bcff8f69a6d36abf5b476b6190f8b27b2ecfc7adfe2a11da6f1f7f10a2e0fcff8fb38c875f92474bec5448a20b9c0443e0002c7438c03970343e393a9b41b0e5e6f72e2ac667bb1eb69f17858a90c2cc437b08dc7351efbfcfdb2c7717ff11f367c892aaf69f22fb789cb73f532b93cf1f037fa65097f49e53ccccbe432857b99ec536932998a836f34d94d6ef5f57abcd46b7abd1ed7bda6a6c773afe13d4ef69a9a9a773d2cd6e2e5defb3c4bcc9714c6f1259b5d7dc910fd14cf79d566615e85577ab5caf8aec8337ddc4bbd14cb51f7172f727ff1e24bf2f5bdc76f2f712eb5c84feff399cad30975e61fe2a099999999999999999999f9b2a40475923ede6dc868389c861a6872885183dff8ccb84e8d63a14f0fc73c7a701cc4b18f211a1c1b3183e3155c15fccf7190bce28f713c0413691cfe1d8e8d5a384e0217c92b7e1b3846d238fc58063f09390e46bdddbcd8b58058e8e695a54887e7ccb4d86caf2793bd2f26464646d6fb4fff7e19df1f79a6ff3c16fb9c38e3b196b555e3dd24bb9bfffb3ad705f61703d9bec53d76dfe220dcb7d80716e221fe000e814c674765b9c59ec7cc7222ad654d55309f83f3f74bdf8b2f7d3e5f8cf992927d8c8cf992daf9b29b3ff325c572537d343e3e8aa70f853a7b2eb84f11aed797252ec5c4c4c47c7912c5d2bc26d4995f67270502b199a6bc348a669a02812533050281c02f572672e54b7370623c47c373887153f0dff09b9b829fc571ae0a7e18d7c92b7e17c7c2bce27f71ecc3310fdc23aff8771c07e5153f8e631f2a18997afb98594bf01ea9e13f5f602116a00dcc667d2ae9f3bd3e66b323cbcbe0c6ef9b0dbe966bd693add4d86984bef8283e499e50a8b234cd7c426dd614cdbdd99ccdb65aadd68c96cf27c3e71bcaf0dd40c173c2464f2e8d2ad58ab5d9fd2c56cbc4e4e474b6569b3d37bb4f72501d1a3364c840c173c2468f0913e9eb65c662e499573466dc18e256cb37a269cc4a98a34363868c1b6444711c4ba552c9244932a531e364927bfc1346a1cab2c4a5699a78efbd8385393a37dc70c30de39f2525a9546a7c55ba5aadd2137d7292f13d21cfbc4a57c2f159ad968989c9f8272b97cbb5736263a34b353636316ecacd0c97d381837c7460071bcccc8f8ecf8b980f3994c048843370c85abcec86101df1d2b9dcd41a0a615f774b4e490c1e0c538a0daa1b6ea8c800796032a46c6a58ad9689490badf72c56cbc424777292b3636d7685737372e242511c0aca6e3db9b56e2636fb6f22ddacecb5d9d6bf54d866ff61b1b596ff74bd5e674ee4ae570b2d732cca7e3499e466f1abbef4fad3ea67b3556e8773934734b7dae1dc9c67894aa55aad723b9c1bd56afc92c56ab54c5093f4e4c4e55aad723b94599ae6d67bfcb3a4a464b55aad5801028140201008040281c02123549c5112419c849fa00412a14f0e1e4142f800d24323f5335b42e873735370747a04016d3916326e332e375eb0c0e0c161830dcc794389feabac9611b7de5a3791e7cced6874d5a2831b57f1d61a4d26923c9d709c74582d2f9347dc7a8a24a9a236bb7a146a9a2da2288aa2288ae378c2313333336383daccac56e8d0f08612c21c301b357c088fc846994826422e424cc69313ce90a1b6b066313a7082b617bc1e600dcb69c36ac6e6f47ac160b1986cb3e3cb60bf59dbff4cf6b1986ca77e8c65ad7196ea45bb89393a339c2d267b7557635961783837e666c737f73e4b4a4a70b659cf95c37fb8789d311d4dd48933c4b76a2b4bf53a5d39a1f6e1c16636598ccac2c517e8f0c726b76b69c9e1a86072bb961b16effcdeeb45ebbdb8cce562c1b9d4879d6c76f7272daecde65430bb476931b159d69b48759a667cd3f4749e4f93f1d1856381a9bfde5eb65a66c10583c16030180c0683c1608bd08727122117e122e5d5089299ade6827d4e45136bd9b45a2627272e178aa26814948c2f0acae9445fc66130d90e37e3b0969566b259f54d4e36fb3c1bba59f55194cdb23c8a89d389be8cc360b21d6ec6612d2bed145babd2cbd53377c9365127d9d1986ae3d5584620389a91abc81242ed93916eb9598b6fe582b559d7b3d096c966676fc24f36ebfa13d7666fef12518da2195f143d9de9af7ae3b8cad960bd71adc94e9faf457d9d3e165acc94729c84954092857fcb3e800c213ac22817c9482d31a1f699e156b0f5a5ae56ac56cbc4e4e4c4753af3b3367b377b7fbb506cdce8e1f3f97c3edf389ec6d866711f936dd6f69b65f1bfe35cdd6cceabb3d3d9bb17e39c37ebf2f9f67ab32daf459cd8af2bcba9c5c35b7b64cf67b3af71c2f0d9b8591d15ecf96673cf67ea6cb3fb67b4cde69e56db2c9671d3facd9e5fce4cbccfdfecf93653dce7bfa4f0cf3e3fa7875978ab37cdc06159fd4b2ae5444325dced54c29d4caddd6eea899dda2dc58345f3c489daa3d86c4b8acd62203e854eca66613e45850a95d3b97a149bc5bb1b159bbdaf628a7be587d7372c6669df7f49a9084f51cc115b88e0468ef83832783c1cec438f930c5e2c4d872c56fae9ffcb64db8ac3d964af571c8b1f9f96afc5b1c9147db57779dd66672f2fb7162d769bddfd8ea779bc8c2f8fe7b2d9f4efc538af78b695d6730303fb988cf3d80e8b8ceba85a5294dd66c7dff136ebeb6d76fc9ecf97cf175ead7c239adeb091e2c9c8670da713ca446d167d14ca344dd3a55dae8caf8b3c739adeb0713acff33c57e7796ed3dce3ef92cda25f92daecf829954a65429b3091f135419e394d6fd85899aa3dfe2a65b15a666bb3e8b75293cd8e6f929e9c9ca4300d83657c61e499d3d4659eecf15da889a2a06c167d14139b1ddf449aa6394d53f3b5c74f632f196cb3e8c3625c26cb69fa699aa629d73d262626260d02ef1851741c7da36f1c63dcd4789ca8719e98dcbc30c2014c828212377c72a04c3c193e64a223be641719762065075daf3471eb8c0bd740f21aa406aef10b35c47011a3034470d7f3838a0ac68b0d3832a71c37d090c26593b148b2e16d767c9e6fb3e3fb507ccc66b18d9e2cbc211cee9ce049d5c8ad966f447b50d8486356374927e7c5497863984dccd61edfe4e4c4e5da2cfa2e97896e767c140505a514b9e63ce3cb65a43a39a7960913658f6f62f5952886c1702c16ebc132529d9cf165e93fe73c55d574369ba5377dbb657c6fe49957e98a959bc94861c08001e32c199f56abd94cdb66d1b7adc6bfadd67575429f3891f13d419e395dad6ee68ae37e9a4adb44b6be346d6c6c6cc66c63d3ea8187592e46c78d8c60af033bd8607e623ee421ae8a8fbc02c943f24a744426c20ec9089225b450ebb8d58027b806a283c87083a3d323c8870dc7421c6be368992989f1820723c506991be20dea0e2c5583d2682bbe1d168ec8c25b5796130f6fc541a3e705d34bfdcc54318d31cdb7b28265632755637633c69ca058bbb5ccdc0c710fe18bd7cac22beac14123860e151529291ec5891f37fc73f325b56266ce36bbf3b39aaed532be35f2cc7f6b79ac5d372d38bd5eafd7c3bddeedcfbf7ccdcc94766b29ed4b9b99da6e667a33d3959b99aeb497c9782d7166ba833353d6cb649c7fb4e154d53663dce1541939e9ebf57abd5e2f99cb97a6799e9bf5fd8a34955299aacdeebc2acd9f8aa228bafccccccc8c387216bd5fb1c27f008135680d0dbf99c5b85aa17ba34e3ca4a2022311faf0c86bd0102d43172319118a2019c94896a0f1f333e33635543a37c4c02bc0384812456258c808de866ebc80c1d3b2e1614e9f950d600d518781e96dd6774271f846958795cbbfc3a5eb8ab7d27a6e604e1f1a5c7489f85bec0320a8be11c709cdf1b0d29fd5727038bb93665b7f56303d3779868ce10d1b355ce4e9a2545f79fad2444d1ce6f8e55637cf9727ebcce57456fb9fe5b46a8fb3c3a558aca979c9be2c4bd37c49a96f6ed677f29d6a49c966595f92cbffe2c58b1727ac97ea48d334c53a3e4d5d8fe3e41b4533f351cfd864df98c712d4e91adef81c1d38988d1ab425b450fbbcb40ece350fdd4307692041f4104d34034301e7c82b8f2cd438fcb3985bf0056f058cb1883a3f30303d9f2f264646e65f26e3b5b86c87b39daf537dadb59cb51645711cc752a92493f15ab21dceb69291e99bedf9fd786afc0b2fb0a7b3f76a0ec7c45acb7a8e30df88d256325ecbb6c3e117e3582a6d16fd92c9b4d9f14d24b9d9db9318638c458c5df8c4abd56ab5a303040281402010380281413cc22cf4c96bcec123a708cf794b08b58feb86157be56aeb0b216eca1058c5074abbb9e8395223ffe4a456f054c51696221b18989ecf17132323935d3058aec54c71b3ea8b22c6f8f579b3be1694c5f7e266c7178dcbd28761ed763edf37bbf3fdf7dbe119ef820b2fe8175ec8f8bef0c2e9ecbd2a97a3d173a31a7970cedaaaf56ac937b2b4a0321ac7adb0bfd956dcd44b9d66b55ab5562773b5123fbbbe85a52c455d0a9a7ca38d6f44d12f4fbeb14495a833ed298144e893739c399e7d001942948f30c2ad5cef70d1701da481e8203a86eb5b11b04a11198d077946d238989d19bc1b1939d69aa1361706a6e7f3c5c4c8f499ed7fd6c3cbcd6c9f73d3b2e235998cf3b0d69a0c47c582aab4584cddd9dd68311d18dcd86b9da209f6729565d63a25cd34354b1375aede96eb69b941652c16d5582423194192d725b450fb681d376507d63c82e8219a68c6cbe12bce6de76bb9e8c95aad1e0fcbad276bddc0d87ea7d3f7676cb53a77786a6cc5dad552170c455d3a380e43737234711c459cf547d58f9b6df9918db1ef4d49bf1c4da2c9a43336994e27f6f116c74adc786c30e98ae70c8457db658eba6048f2125aa87df2ca43f7d040b80ea287b0dc9c2a8be75f553f3785c8bd29be243cf432998d85d073dcab9b65bd6a9bcd689a46cbf8d268a733ff73136fd86b73b659d8d34c71c3fe2585739cc0c7669636ecc57b1fe75426d8c9dd7f49e11e54c4709d38336060704a0225b525bb2a8aa2da92fd3c5b52458fc8a2d3e9f4e46896f69877908bc83f99a5daee6e9a6579ca62c94fa73f799bca40c8663e91a4367327cdd3984932cb2017699d4904c6e947f5d6142261d0f59b35b89d24499224c9278790779091c83dc840c84ec8496011838842c42172680a89436210120845a150a8d759378b49f224d41283b9ee7a7c1348d63dff64611666610f40b291143af6bb03243c8a90e6c98514f9f8cbfb428afcbc0d208aaa006e173fe35e5e5eeaee800a48fae9747ab1f464e9495114c56c9a473c1be522d3d1901c9a8eb24ba9f432393321557a726356c7b9e32fb3daa262d0af4be9323e46ade0a6a8e892a35870512ed806c85f7a996c3ad23a540cd0cd12518f7f5453942a80db512ffe09c74777a350a2587a132f45b1547ad32c4beacbe413ff81f24659878252e21f9e8bb211892a6d5634f1fb3be1f7479aa7dac5e14f61d1ebf85b5414731745511473d0f5972e19899e3dd0f5e725a490c4a1524914c2c520e2d0388e79cce4901c8a42b20b565b0df4f4fc24565b91fc61411e3f8ff9c717731ef329480c92752631880e1f2519d25b5ae797777dd06b625676fe72c743278777d55f1a2921258479acae3f23a5f067952ccaabf83909a9962ceafa92e3fd71f22895d714f597e8043f1d7f8a5201903bea2f123830ea6477b93b40f281aedf24925d8c645d4da8df0c925dee0ea850e488ae5b73a8ebd62cea3a4b410be64f11770753f0a1b76691ae5b5348d78fe2301839caebed2487c1081187c1c81179bdfdf4935db4cea71e2c0c468cf27afbdd03b84de847d905ab642aa5ea4c218dd39fdf443924b581b1e3809ffcfcedf7acb61b18474e1a65171dc69e5f7f36ca455c7f0052a51824bb6c6014874421e2d006c69e7fe400c82ff6fc62cf6a0a431e7926df14d23ad490c6e927492174c3800356d3f2f1ab69a90ae0f6f2c7cf9f37fb1b1875201f93248aff303d6994c9227c3b59945d441586212379bdb7934659777fda14ca6b46420af5734f4717a75fdfd34fd7e4c9d42f124080426f513f5d7f3e420ad5ef0ea8e083de9e8e7211d23ca16650be7ed4d00a7247b1e0a25c705df6eb47c5e0baa05ef7a045e5602c99c88caf89345714bf776d5363c75ff2b675e2ad9a8d209a42cc5c04b16315d864b3ae2f6d268a9fe78f93df2f6697fd647631f9adb6a9222e6076578aa38264174709c9abfe00a45c8f7e8b328164971cccbe53afdf1cca2e62d74228ff81f22e14d78bdda5a60340dff5ae47d13d80fdaebd47946ac2f15df79f701348c6e91a9d8e6a9958a5d5a81255a053908b0000ee2690bb33f9df6a2e423d39bcbbdbe2adc9027305a611b4cd9ee64eedadfe30bdc93e7fff562f60f65335719b2477bb8112b52d7f3f6e0380ece7e33600c47eaa353a1d855271281ff526dfaaf965792bcd526da9d92895eaedf8281cc62f73515e6fe2383e8a3d80517d956a3642db5cd4752eca46d945081783e4558b4344489dbea4bf543131cf7d451cba2690bc1249994379d58f5553a85f1a1c1184ae9322bbc9049275e44fff8dec78b3a05cd0f5b72bbf3ad4d0c5e9cf6a0a35857874f307dd07291a909fcb48bcfa7d94eb928bf2aa3f23c1825e945dc4a1bbead718053745976559962569c40b547208a9d6144a0db34bf9fa5339b20b4a065dfc56edad8902a1bbcbaf7580d220f582de9a4674fde55567b49aedc6351227f90f935a3245deaae58a9985903285ba7ed490d6a5488c1aba5a1c4b26f2842acd7d625c925261bc62b54c4e5eb0982cc74e1652bf339e929ecca37b461e7cf2e01e11355e210be5a5b523521052f9936417a472cef7aaf9739bba8f8a2faa1a29aff99130ae42111adcc048073cfcfc52d7064438a2df4f659747b3cbd5010fc37eff8584127ce01fedf6606c001f39fa251a620852bf442500d2b5f0ee70c76d49d8b58d8effce40bee963309d7e06d49f3e86d3dfcd066b6628bff43194de7c53dd29bf64ee2fc55052cb4f63109af848a9e2238d3b7df9a5ba83fad3c9fcd2fc29815043424e42a819d21976c837a9a97ed3f7fcee2f8d01f5a7bfbfbb6b14707f283586932a03f9690c3a3d3f9edfdd32a45a8de16adc75a143aa449d48c54562d191d695da914889e3dfc8d3194a3ffe58d4f1974a5f4a2a21894523d018f4d347218ca475e3e317933a36719188c6e11fd57486f14d6f5277c4241dfffddd5f89cd918de148c7ad88d4b10e8fb8842284d7c8afa4cee011975084f027148fb4aef4f89346245e2afda85e8d6bc7a18b34c3f82575450889b403c10e8488849808073fd8c18ff0d7de249de8a2004215903024fce99f22a0238c3152c7af7fb44e2cd242ad5b1d056144f8c3af8744a238ec58171d2125dd23bdd5422d4445b55d575a2da46ba28ebf4c118984f880bee297226fc5a24ed431ee445aa7852f1291621112915f8b8b4aa71e319f3e3186faf824d7213f95e1f4a80e04fd4edff32b4f9cd438fd3f6ee681be1a9731ce5775b638fdf2fb93d124bf3f7cf75832dd6d80f14d2a0e2575c43f1e2de22b9497a6ff5e9cb3d61fc3386b2d8ae388d76030180c0683c1603018bcd97af9e4d1e3bb8b2687bc1281b562787085e67b8aad154a53e31b35deecebb1b8599c2d672d8ab4715c6b5a8b23ececa9a2288ea592c94492b45ae974a2d5b04e4e5a93a6699adad8a43636698c1b98ec5b66412cd5cb658493d0b81ee336f5a489391cd0e5c2ad2e2e7bc166ab96fad935aee88bcb6eb65e8db65aad56abd66ab512cf55974e231ec246e015e020780826c24631249aebc565c10c1b513d64c40a82b4564835be91c685a8b5388e6ba96432e9db8de7ccb15a4a2693aafa53ae05b38863a964329124793aa154289697c926938924377b3aa1506559b2cccc68719cc963894c8c9b72f3331f5c900f1b356837a324f0133014722dac19325416d5aac3c65bf5c46ace1d1b74666cc4cdba5e2c956aa6cdbadef45a69bd1f37dbfbd1242337db7b92c750a7f3fc5289dc6ceb4914aadcd5722b793aa162360e83b5c06eb3da2eb7e61887b5cc6ea5d2667d3a27d3f6278c31c622c6f874ad56abd56ad56aad747280406089878c80bdd18ca57ab96a3bda4d8ce36c4099ca72d20065f44de4f82a37fb5fca682d31c6353ae25630f5d79bcb566bb55aad96d86ab5ce3ca2c16030580a064fc12089ee72af50e8c972f0b0d55eb0cf3431406ab085ae46b1778a173f41899a160f1a1763ea933eb959df93cf661e982dc5b2d41997e5e9cc48465edaec8a2fad6fe2e466719ecce26645961b2c582cafc59e9bdb0db7b3bbf986337862b2575599ea5598d1b4d9d79bc8cdba4e33d4665f8f8291e409852a4bd3246f707a786ca86aecb0cad2dc7b3dcf92cdeebe04972a5730bc9212d5665baf82e55ff53e267e6ab3fc53aad566c55fb136cb9fb5d676331d2bb1de841a69b415e80aaa037383d3c3a3b2c1aab183617c746e707a784a4a52a9d4ca5c6d56e7573037382b56ab6562727272e27295a80e0ae3a303b36205080402814020100804027b2a2a549fbcf2e811e423af4346d45a8c842f5040e16225843e34523f336ee308a3ae834693bbddb8dc6081d1c261c3dba86adc006c999c6c16fd93f15d3b2b0c8f9577542b0c6f47b58ee8b8a342d1d135bcf1b51cdc0e27e1276028dc843c82841842c673e68c6e6e0a4e0fd5cc6cd581637bb1ea01c66a58746cb03171b95014149e2d579bed30ad65d43e1baf964ba552b257ad569b5dfd8ac562b55a2d8c31c618e3564b145b3b3a699aa6a98d4d6a6393d6a4c0cc711214b88d57e371c382bd4e1c3642a6de3e26e79ab5bc6001ba5617ca66658f923e6c16535f5c712f2ebbd97a35daf92b2e180c0683c16030184ca544217a4086b462359aeb25cb3430b5e8880761b1d70b46e30f8bbd66aa6c7c58ecf582d1f8c362af992a1b5f5cb5d0d1d53b73d0f8c2487c72f0e8f9203ac208c6673f2bd405da4237fb72a12d1f97f5f28fab341dd598b84a1f769672500ea67aa8d408b32862d4229a11010000000113180000201408c2409627722674d00714001460b274423cae4aa2280d621cc5943186000040600640060406d30a1e19783a0a2947e69951e433692ffd012f48163574572df105e5c521ce4852f680041ff98a2345265e3fd2fa3882742f0fe28e9998892b0117630e6f49dbf731c4610e077d13d796a9ab86ae40a8b8eb8e359681a8af7ecd1ac5ce21eb1a8b516916e2d87443f69da46c5e49334b320f828c9e5d13f5b90d2cd943c899d96bbeeeb2e765923905b09167711f5612321063afaa5c6f304c3b0b3e660a7d29a44bcc28e98f51ac638f90983643e4d667d1414aa4d64fe1de280ab9a1dd086efede2b6ffd749485e9c0094503ef20d886114cc1b60b008be73cad43f5b802490b543a8f0c0c2dbbf3293006c968c8f4f2807b5de2240d16471f2572c946fcc1c7afeee6459ab6061062c55e98444f797463ce6f682dee737b8d35b8d00c0a2a8c0f0c6563f0fd9a3b1eafd9d997e852d68df5e10691db424b1d8677972eaf5267e2c6b4adf52d1d94349bdda3d54a831990f12071288e9fbddb43ef4f2cdb578ae28cc9cf3ee110b07e7ab1d1609fb495fa5a966133a99568b56e626fc2a56f770202e047d56cc9a259780ccaa15b4bdae7c55a196be140ef67c193741da0f8e14ddf66a1127c3bc9075802811f8e7911745dc6e44eea4b4927e5a62f1cee1ba81caf2616efcb2f7b70e1065c15979ad90a702b07319ea7e9ce404f73d09519bcc435f62a920a798c9b14eebc03c878b998cad07f9b77c8f310d06272b9b13d35380884d629010795ea9ad07ad9d99dbc7bcc9884a6fb5d2c17c349acc818ee1afe95c21fac9dbae73cef59088a358d8019a77b68e3f91bd14a98157a1e0b4018aefb7cf83e526af17a68c1b2eeb4f5c9d41669832d54e5fddb30237532e088c86eed3d21030180d43645f9d7e6268c5ac66083f7ba0c621f7008e821cf494fbbfd41791000b3e632f0fc228d32636b92fbadb556728eb14908773af3c0f63906955cea15f4d8f71f437cf3c418409143322904031711ca9d0836709afdf562d81a1cf959c6f85af0393581c5d9af0b946a0f4597dd00bc5b36d6efaabff2a71e841fdce359f35f7b05c6fb22cde1d2405d5e2d6900a8dab05a8f901a0f6b91ea6862f3702527ca17cdc803086e6099292d1f64d20511195f64807389399209ad24e61d2c0d2736bb12ce2b3d977308a6e04b5fe17c268e9645301021194a6a8c55e98b39b7addd5910ddd08ed14dc266e3ab5211e6e842a9234941464d60be2de2200bff3a7b0248e351983885f61ff430ca74079889a34217f3b856bc0ae8f129ffa4093c1b037157630173d09df3009f6beadf275fc232daa4a30b8a3ab3909fd3ee45ce826f78f7b14597ff2c610beeb3bb6f40b5cea01bf765f8b028ae268ed0e1df91e784d709436ac85305f13a6b83a6e8c2cfd40b543144bf7005c8086a7aec5498dc0303c5aa0a2ad08b50af25b2df288be8c407d0f64f37b730d2d6f4a2122f49a6b4fe03d3b9408e0c8070696c9e818e1c7b798cf5082734357f03f14233e11b5e80a2b900cc86c4261a70a13f220818ee494ebefe44832bff89b38ae958e86e34a0863c067d147f55ff890cdbcf75b6b67afa9921e3125ccdd2b086baebd3adec92b44a88c212befb69964d70adde395d0a290735a97309c10d529c5659e1ab307308665daccc7f72becedf9bc4795ea20f2a04873e497674c7adb3fb1146e4bf48c2724c72280f5da70b79feb9626099f2507bcbc1d02571e29cf063d2c75df1d819bf83167bb5e95ac59b038eb3d2abadeed8095d4da6faf6a2b05820d312ed03b7a91b715e66db7335b5eb4f87d401ac082b15b2a7463de79f636f059e8f139cff4ded58eb27ba1a679f582fb6c34f5ac8d4b8abc14a9399120edfda498ba0dbb44ddc47d907e39fa17bf51325cec352111d19f3250cc74b5e1e17303552059af063991ccd613515b9f299804e9e2ab343a16ee6ded16714fecc681d471a08df375f60253b9dd609010e797c5bc211071aa1fb3ae4762f94afa62b95a328666242e48f18fc8fa713c5d336a5b88e4c08034e84ac2ec91b44cea917a036bb959256286157137b690dea6c3dd84154ea72aeba448e178d4865ea68040d6d8c197d9a2e06acc76d7e13370bcaa10d6b94c70d3550f1ae45f88bafec84a1d598820cffa3878d0e3425fe1c3ff438d93eb32cbc96a74215187789f6da687947cfaa9df1e1c8b577c7b2fddf8df04da631dc8b421e288ce6a3d75ee4d1d06497e6b06e1dbd146215f57e45ff8970141a3f4d973bb723dbac5bf54f2979bfa9d3d49b668a5c2c7aaa8270ee29a42961e62585b9755add65d263cb2cfedc8b58a9dd0d60f31891f99bcd277961dc93001a8c96dc17a9489c3e376861b09c4a5c93e9e0b8bcd49137cde78256173777604d646e101c6660935b121a50ccc05ac128b4f70b759e214e3b87bdd520ae6033f7e42bd56f7e223530e4f555aa07981940764dbf98074f68bc73f0c80f18e522a428eea27a0beb88cbf88a9fa7c33347600cd5d7ae6ee1286c4f771216f2bf7ec94176f304b5d3503c5f689982201f588f72df0a6a4d6b36cd9ef831f0a34492bc0c34392f42b91ea0d7838832eea3d06b87fd4592e4939089a0f59b28a2a6b702bbcc3bf9fe270fe51ac7277ae6f93c8e04d57383a07d3e9a6978d49f10e212ba5fedc0e174d28684ed7f5b73a823e4f790c5fd38415fc19f2397673868ef9a06f619301fe917909871ab2359a6ad19a02b9437b6e94dbba00eb54971c8418e209a2a05adf03fbbe109379eee3f8640d59d5972b2ec98f5cac26cc2d5db0b11a2b9c585b8634a73599e542b834032a8dc182810969745910e049ead93259d03f35375e99f8b9d6e635b2e2a47091dfae731e2302cc4175ec36a089aa019bf3ec0858427d0616107229888d12182e8702baad1eb2390dc049bae1f4400978d2371fb11291ef8459da453ff14d5a8c24df70ffcb93e986f3d04789205dbaf7a91371f0ad0439889c759557490904b7074d5d4ae01c5c548600d93ca0bb1f95c8beada2479e003aca72a247ff05205394e3204f412e8f643192ac1983aae3bc49be85b288ecc7c1d7d55407805a3c3ed643be41fcfab1b582077558d77b8220b00cd2b8c6025d3d77255922244f4cf96fdc4269536a006c79f04a03ea9c8d45862ed3f12d31809bc2e311344bde9b52a929fde9103c49c34e21c33c22831c6a292b9dff7143db3043dc9ed8f4a673e100a629f8ccbdf457a1bc0b69ad602fcf064ace1c1306805e5ea5b878e5c015aac52bfeaba7caa6ea55fdbf45334efcd4ea602e48c30c9335289250904c608401e6d2feb78c0277181eb7024d211657cc51ee897b887db360cf4c1de9fb130f71fb0abe4631dcbf3db508964285626016b8f0e67f986072560fac0ca66d42a0e44f56ad5780df7d8bbf7ef82a68ee7c8d02cfd3aea81520a48459cc20ad0d22a6480ec71570947e8036c1d5d0646760caf897b3625702831a4c4e112f58674c7d8cf0ca44b735dd1a1e284ce8490bcc31ac00243104d8fe694b8ea33b3bc89d9b9558be1322ed5055e413a8d3f2e620f9b2e9a2f349d04123f66e9b6400f9fde4915b3880bf597b59f00bb1b5ec3dbc76b9f98d4d3a0737d330df47747784254e35313eb59918074030c59d9b9f6af06a3ef4785f75c9b2899ce744dc0f590931c04046c4226ec52fca5fc8b9e4961651618cf77b46b1627a60ae8c372d84e82419e259c0460d7dc7743407be060e8fcac491376e14809cb19d2b3511ddd32ff91e8c2700e48226c0e19669e4b698f0c3e3dfdd4adf26f3131b2a1102e43262ae18a52e862bc1133f4a0c93f62bd893b99867b14e2997feba1debe336620e06e19f20f1e25ee7878913112b75e56b3805219a847099b4a3ea79fc0eae9970f53477c54473048631c9e6f3dd579af0f60c51e180c7f84dc279bc5e69d9b958c7e5f0e1136cf05de40d2d91d30e114265521bed1f52a6f7f70fe0940704c32e21c82aa2d6a29b704ea069fab7a45b5eac4362b5e5c37635b9c5798d172ae1c06d19e1f0332909e16b082490257ec537af9ab854a59131887920d524e166f78fbdc078fb528fa548bdf00e0a28d04d1a51164f241593d3f1bedab5a3ce268ce98081747d03c9b0846c15894295bc35fe20a3f395481d08d2246b35614328a662e9f2e76f679f4d791b2c5d7eebd08adc374347431bc8c9dde490eb6055147bad402873190a171e0c07bac62b3640aa1c886202ada142db3128b49a4ecd6efc4d607d6199dc3841f4881badbc84d08096ad50110123e524d230ce908eb78a6a913352dee298ad2651738d4c4f0aec94d4acf7451c5e30a430cd80b72f1de88a16aa9805cc2b2b62747f22b87e0571c6555b4d02928576cbc75624d49464f9c6cd424b6c70baa0b6c41538a134044a9eefe1a90b38f7c9ed8933f00bd46bbc89b6746c2c110d9abd71bc70a6637838e6d51c136306b35b9e71d58c9e26010f4482fd42d5dcad32845aca09ae801e8b5a17550a166988421362b7ed75d5330f38f3882e5c8a76957aaf03b25eac94be171b09e1bf5bd21a7c4e52ffa5a4e76d3076d447b8477a4e2a083dfad612e3342759f446874c6a9774bd2f6590396ddad5d5703c271184ad4df91b427018027949490550d30ca17122d4493d810a6a3d58db070373e985817363a394b49f553d90a5299ed503d8896ea28d3d5774b1b3fd156b64309a2e317684c801dd96ba9de453199a1090e68401c54c063308072b4d3a7d23f3371a6f3a21b6f3b61e7589c1ef93a8a009afcf1e7c022fdcbde54d1a5d6f8c5b71c8d10475815dfca9b5a4e728045e4ac8152cf3b19c79096d0cd0ec7352c25affb84743df357bb3629b97a4ee43b0a8df57a4040f4e5c23c30c7318d50200111f7f1dab84ab3fd8a09284fc3c13a1bf4a9fef96c2d1122344e68b2e13261a5c4cabb37e2d248db5662c77624eac44ab93bb9431de178b6b5def2c02516cc60058d67394a4d14d4f5bfefc9a637e9595b97ff564cfd335a1af31463acc444b47cbf5bb6cdde7f7209ded122ecb8024cb300f2d35e8b2f9c8dc1cb635e6e07bb90382ba1550e6adc254af28284350503e29aacebc772156e451496b1ecbec13c91d87e80ab8767ccc77e3177ae361a23de3a30f39a0034b7ed9a618c4482ecdc418182d9c4b6451be34219bdd0dcd8dd870f1b8a39203b1099998fb548e0419d7f7191e7aa53e28c4b4bcb01e7b12a4aad010f562681222d2690c39e3bdd0a0aff8cec5561c2567063dae0060cf714bf356e28f10a113fc89a10315842b6e005161aaf77c8b41e340b0d0853c43a10511b9c8699be28d708c418b64b18dc581679c6200df044de520177cb26e09f24568d7e311f99128d520e90a49428b62c41ec07185153f32f2d97e0499d18ea7fcdf71279ef253c708986a9c6e1b57b15d1912101df65d79ebe70cb02870d6c730148b60caed9a46f703f7c67bef9262ac75cd6acee3c3e6d14fabf54060bd759a47b26e0926ae9cee395b525e2aecc90379a6204aa854020f91e9c72a98b7c9654cb15b077c346a91f34c96eba8fcb59ea19a03d456662bda07e597e06fb05699b83aa6f278e762ca71909b3040c03fe1a071aa3085ca106344bab30d587f6e5c53d95e0bf3fd0198a298090bcfbff3eb1f6046a8b2814f040c333277af6abc2372506b9e70c27446aec58284ec094eafe796769896e4288f8544f5c28e40ca2bcd9301f2f2dccfd92d94daa7eeeca6560122692ca96011ce69801130da5e0d6ddc42d71a8e731612141c2b7f0b33dc33044d9317f77049e95c721e7b0b6128284d7ebe365ad484d170536f9f678862dae82a4cd60ff5db7f781fa2359cb9cdfbab5c5b2ab5afbc37e0fa0dc14e99c563975bfccf1564ca2248cbe04b95561725777171081ee2e3970effe403b1dc684c11ff148e432f722b2486d5b0ecfc24aaff427f4eb8fdba66c470c131c911935f532318845a9c438ba8cec7972dc1f56839746e2467ac8af048e772dc6e9ed0df5175f3fb6778392237d5748bd899408db51041c4a2b05a10261b6c0b1df1fb27ad757cb6c317192a1142e431395c2c508a34b5de89821eff2a3025d922aa780a084d3320ff907046602625577093bcd675091f961ed3cad46648880b8600d229da077914030e53c9e24068e242971925c188aa4374ed479a837d7d808bb8f60b1290e0b08d58d7a5f89e8e31a45ee2f034c44ed997b1f678e59e0098a3ff755870c897bd460f980c551a8522469fb9b3c71db6a7bab6db347b5497d80c6ef62b533102dd45d0f117ba02393caac462b3aac58a5a8c4707c56048d42f73ee4d3445a6f4aa32bf5e17b167f822ee86a2e4f98f4c3a5815ff42a946618889e6e0297c4ca0eb9bf06472092eb54f9db6c6bf30b86eb841c98f72829b10920a6018c280eeb3acc2fa23a65fb2180c8d6c8cc2ec0ebd6076bc6bc5a34d705e223480655da3935a14a678952e1fef4df6c94ce37b0e0052db4003d1a0d15802e1303a01f8c3d7aaea407d9d561ea7e71a4255e8816c29eb06180fee278cad064657d6bd0e3f39165a195b5fa308ec9551ca7ecf641042f9e81ff3725725d9b9b9968cbbdd2e7237c06fad869427aac41f08ebcbfda739c52ba631e29da48204d0a4124f32cd12fc1b7a9d97972c683d6ff9815de0dfaf83476e2cf1203e9c73942d4c89db455e46c2d1375a66668c6da1edc00c7a3a7932ce64e46273c0f7545307202a4ee11f5e912c42b845ebc38e1fa7350c28478b2fb5a8e45f67817fbae601da673e8d4c11a7674ce77e6404afef4e7cd6db9c5fb31abf4e110abbb4e398f1db3640200f55298850666a30f1e61053251c3157e038551982df6d314ca4c58a9fa396403648e22a467e4916030a8c6f48039004bf6a70ffc22e61362de7f2fd5661af8cf73aa272c0e5cd41ea7d41cb86145bd007993185019332c282601a4ebf802fd1fa33818328509c666c5a21101058e3c277e7984d546d5fae00441fca9002713ee9f2980439b9a8c2620a64a75dc9293dccf2b380c39fe79eb4543b2222fa0315e481336cb4461fff0e3f359eafcb898d10d6513e17da3b38fc08e18e1c47c912f46216aa0b3a57c0b6c835fd7097df99d5b30f2d986d98fcca775e5fd834dcb2020b735fd77c1866313d09bf4701d2b69f1e3a64b098b716d58373903ab6e1a6e138d44bb79f225d904bb4174cadb4a442a10c90a6978d439b0ece9262b9810998337914dda88474c4916387b9b0d0cf788e2630db482082bf175c91337bb6d1eeba5408f9fb6efd4099114a3a1236805315010d066c7b783828a2d5ac9e823d09558da4b4f342d1d58b600ad649455891b5e49d3cb62fa62cf12d0b813147d55459eb60db1d6ff1deb8df56df4eb7fdedcb80b442837bf8f1fdac4c7e0f2bcb402f4303643a897384693085197bd88dea4979a7319b54382537a4943816360b794c0c90f3794043894952b96056e740ce68ff709a6973222181d79a394338fb1efec45580b5e3c91df2a5e8ed6da8126d1cd090471392e843bd2cd0193cd14d5cbe8b9e1a2cec098258c8054ee03c7e0158507d06a80416cbc405a2f7b6e0f30a2ba8fc1e33c165732605e7191dc02ac97fb427ef64d44d130ef1997e25060b8212aaba397db375497220192bd82a56adc9ff57667e63c3cea28c0542bd977154e92792ce18cf446ce5ab17f592f548ddc9681ce67ae86de48a1967578eeb2c347d504f2856a0c2fdb8dc66ca1f2195e5232dcd6086678666774f9c6317dd21d6761785905a9d06c7ec243ea176bee8740738c8948a583bc5a0a6fc11b58c0c1a5d90433198e6966249ab754bcbc0cd2b9baf9a65fae878eb5c851a1c3d41c11b13e25d8601ab0ff169a9077e1c524412fe91c04e37a3343c7a294fb24b33ff2537d0e881ca28f14236add7842ca941cf69f0f91d5e432fee50abd91dda3d435949cc1888738f6622737ea4920bbafccbf7e69db23201d67244c1af893990de682f766322ee267aea4eacfbc21bcff09294fce6526e24b73e9eff82dbefb0fa9131a7c83cf6157bf70460ae7774ea24a350311e9347b78149de04b43963b2668f4e817a1be4247262316290940df043cbf823d4b4f8468ecc1ef652fb5639f3cd32361d7d175189a465f5ff1b7bbfe4ee7f6d62f299849c7933b6555c6b57b712544b01a276ffb4f6c8514d41fae3a0087fb14768fab0341719a8a8ebbac674c40af6685908271f636001b7885c24584194fa8c69c0ef249af24807d2758bef49a9240fd5589fa1eed09177c021935929520c58edc86c4a6c40c4b7a839903e4468534ba5682d83b4a1ea16f27588f2b9dcd231a1f1613e342d5b1a8aa668107dd10555bc689b6c21583cc448144ce0d547ea2fc041540c1a5f6d264407263ba3ca0ee92a36a8a816407b6a16da03ff4a939972d9a0aadf232168d09c96f61d1e04344d2f23d3642cc436602a3521ffd933a1a22df9656e9acb0e387cc648e00c650a2d097c14e0c6e9cc1f8d0483e4a8257d03adc427e75e8c3c590fe0a3a4a45ec51db71fd74a740e212b0b8cee00f10da6edf48ae9bf70aa20be30ae4829e33e9d6383115b0c1ab6e00e9c07f801b66c7bd1a7c71b5e888e23905823d6446afa0b36dffebe52946563393c8255536ce1414f808ee5d080b4bb069edf7139cc2b355c82c3835be32c4416e94ddc1ad10dd3b9fbd2d845131f89a54e4f2ebcf67c85aaf054374ece0d6c7bbf409751f175bd9f2826772f408886cace09e1e642611594a12445d99a595cdbdf256873f3ca3012730801db01abc628bba51282d79ba58596de95df28d000072405ab6b2ee2ba5e01da68473221c696af64bc034040549a31934f989e4f873901a608e53fe025ebab4ce6b4511337b5620672081b11433220618e3876ea7fcefa913321c40e28f86c9a7b8b469534fe6d4424b9c20de907f3b8ada85378034c038da13758ee405d84b93808f5e16674cb3c79e3ae757d7bc80aea1327472842196eafe9e65266c56b163c890cee9cad956cd59b5377b27d02335853af31b8784e03c95003269cc869559d188b834f7e630cf9ffaf1c1a32e4baa82db17cd4f4745bb3ddc4811395cb877281187ae396f20cd8fbd4d224544abbf793c1da10d49795d354596928b9ac098b30ccc50b71b2046b9438bf546acd9701238510e81199a00a0240491fdd233dd3fc16caec7c9644d58814c54707130acccd15bbc393026f33e55e262d8ad43d5cc218fb94ec8405b665484b2c12cd51a2ef39d1d9d985461b5763e46587ecaf31d56f24c007c73482747d2593bae460b9d28d00531e1239460acd8fa8bf1a7523065bb745ea4a5141656c06ace0f46df1473a0d930b20e22e52efdfb1bbdac04cf58e46029a558285a15b24c35407ebfc74dbc93461812b69ad82615b30508c1304c0d234baaf2147e5e04a454326c20fa0adab6f1718cb131e3939371759c183f9312249a12095d9e1249054ea4c4859804f9a7f1dc72e1ffa067859a259995a338c9708833cca2e7ab68ea0e6c46f155d2587fc15992e0dda457357b2f4a1af463e7f3e45a6a0c9ad3e625781ab5c142bcbde60431164801810c2105020d2c4cc8146e1d49e69b576480ca3573271dd38028a8b498358a7f1a4f9d2ebffc56aee73b22f14c0a78b512ec20ade905d8f5538333dd4dba417e62730f03e2874c80585a6156f038634df68ed672d9899d1e1e981d73e1872556aba91df0766bf4d564cb95a4116ab56107b8051cdcbfc7c5948626ab51735e22965d6191eee1e6085bb9e80b6e193beabf96d953be0e488c4a0c599586304499a09e075476b0414f6ee8980a416e5996e747a9a1f0fd9f7320be3c4195c2a6221867827b9cf6ff492292f31ebe9524522eb578f79f42b5b676cc826e6b0fea3df87f65b989b51e7ca6fc783a7eca2fd5b78e4d812c6296a87db5aa126736348ee7e46b4c9907a7749284e5c6680e4ba4289cd9a9fc14c88f3441e95f8699aec980708a82a3d789ccab02e134ce4daeb1463afe48b69ecb31a1778c51df50e2e4029646516e0864db3d77e930ea9c36949cb4982a011b0a9b24a243a41d4f1c95a5eb92cf9e5dd9dc341e90a01b9ff9b4273be881aa768c5554eb72193e3232eb21c8bb9d769c84a808673eb9cb46fbdfdf03067361c50f8604253364dc593287932cd318ff6fc0ad6d9e9fefde80d31df24ff724861348db8e2f10e42f74dcf1363f4e913e433a73f31ccffbd478faa960a2c1fd7f0733b233ecc5193de8bb5a3b6102bccc3e39b31e0776bcac6d6424ed0805f0f44392bdef5bab9a81468f83938c8c5ecf7d5835d135adb143666e7ff7e5a400bfafb88f44017ee728fe464c8067551096f99c7bf8fc873debe7acf04a0903647fe5410b6521a34741d6cf913bb7c353a5b796033ef9f661eebd8677d60e6d09e6a93ee1539587954500657839062e8129cdb76f9b4cd28c242443cd8b127a5f9592616fbac0c72e3f29f23308d37d48bb374be48a1128208aaf3fc83fdd472e28127c2f6d2497243d4cd754b6726e98814f189309a8960a20f85b58bfa608ab75254a1876ea0881172d8bc6abdecd8dbe716ad8012108febbef473d8293ebfe0c8dacde09067ea7f24cb9ae3efdd71c2c6e94e47a4fe25f8d1d1a679f7b6aa59e14e3d40e408340cc6cebe00aa16ba163d143d001b96e48c689172bd775d650769267c581b23b3d62b118c8c15b5b12e2820a1b44b804a96ffc7be858f43074d142aedb6eb815bfbaadebbaa39aaf5141965ec105ff9e1b8c02af4fae3b48841d01968101a2e96277883e2307b2c4621ace55723da17da0b54aae2770848b7d70119ade74dd1b40a683be9d87864f25d7918f0a78b38fb5c68533c08006bb6da9ff346d571511ca33b91e2002bd1e9b3431310c94a3286fb4ef9546319a7095711de4923dc44d85c890743a1777846574a241bd7e605fbfd20e0b34f5b8f597847c19232a63460d162b8f7d55c19d9c4295fad3aaf977cc7aeaa5aae86b018c9334dc0bfa2b53e34eb23987de23331a8a040f5e9d688fbd4b2c541d48b6be95d29dc837b970870f4ba8fff0cf2d9efc4296b64c865744b2045115028b1c3329f0689d3172007ec754216c4aa6bb65257a83403b1126daaad769631124c39dc8a2a3ecd089ebff31cf584bd66f74c2f606a8f1d563d58a0303c43acab02eeb716852f83ef111c2b5c52dc63ee1d68e8d7cfd385ddb14d1ec5e675a059bc8593597e4bf50efe748216ffdb87f2ba9ff704221eb116242c30e0821dca6a073101f3e19ae2f4f3aded7056a61cecb876202a06de03ac562f0994aa96b22f2c1b4e17a6f71136047ade10bd7f5ceeadb84d634145c053aeae743be045da2a0b17d4027e0fad879dcb0295c6f883c3566e4577ab9d341b68ee4b0ecfca1bed47bf0c29aece5b95be2a0b17d877603aeef873c5c9df02b307a807688c89ea61d7a6d22963247701d3f2b9d5f1e12f33a7feb64c7e4386992cfaddc4d34aee0fb6aa4f8cce9563d55a27726e6fdc25923e4552d9dac20a07b17d9a8da29a91acfb21f630c01c02b3177e7b72e6dd885cbdf62d74c2995527944429fa03e160bdb5845c9b07ae362af0dd7571c0f66596205f1c3159f05d074c12a2a6347d04e498c775c4138f54a95a27e8e276c365f6744d440a8c4ec987bff71ca0add819233ce21cb719c5a80edc5be5201051898377c5ac224128d60a71ec97a25290cb682decd7a7c919cb40784d1bf663beb2faaaa47215a4c6f809f7a63dd2a065010d00f9c88773f6af662abe6df57479140f2d85635a18e076d76b81be59ba72df289d337dd915cf9fa33ee1acf9803afdef3d0adf964f90ec029a818f92cc44a1e5ae788b4b6d220204830db1b3cb2cd5597d6ee201e75b2bee3b9286b30bb271e9b968e9a0a71578998a2313a7b3f0a40044d58b0ac2736f8c78159c6981a462518de89eb368d4cd5704eea05ed2eebc155ea5121d5a426b6d024907aa86efb94df316643d5608366d8a12ab1ebe331a76e1a0ef5b24ef14cd28126199bdce2a4423bf943a6fb32d57839e49ff9537f61dd1633de5a4785617d0dbdc532ac76c8e046345cb13b10b9373475be7f35dff2f26ec4bd628ec86c3bc64fc4784eec9a1b8cb66f17eb3da7835d0f6c5dfd2bec1b7122ec7a4a59bf4082c58ff9d4682b207bde589263ba93474998db98b5ea5673f216f5d0c1e8d7d9e0df4baca5ac67ea43c97b9778efc4b0350bfb51a75b2b08ba292267a19f1a4b54837eaec3a46951c1a9a953d6b3759c6a2519f58e451c9c0415ea9dd6b64785e7702b8428eba3ae8bf2bfc494b09127d5b43b9ee19f5fa74e74589e7f79ee7bd92d142f5450b64808ce61844616f05bb0f9da054eb9f99c0a50796337546ca5f4dfee659db9e977389fe1d1ab5b823a102e4f0922df2f4e3584761c3f6390c321474ec00a7ea0d29d85fe38a07bdac6ae5454d02ae2f6ad891b430beff874395c3274b63be35a89a9400537f2a4f423eb81b9156a65f5b1bce00fe1da9a831ceff9588ea010b3c831c65804c735410882d315b574df3e575e7889eab42ce2a336ee93f1bb375c61ea6545089f3d365ac672cdd8e40e7e1d7e9e250e5bb66c781cfb1beb411c660a3c047c7b4463e40c41872675b5743975aca092438e8c44d41aaa2f70dfa15ad7f447fe2c8a4de52ad52fda11cd5044b0bffe510486d3ba94d0cb2a4902392030367188e0bd9ea4ba77fcb55e695b0cd2377ded98629f5fae4bb2a654d78d1ed8a444c1667c02c6a1940f0561cda078a6b04742714a85537112a96e9fa6fc1ddaf0f219d37e3a7d161eedd556ca98e6221118aab8faa5ea3b7ffa395f2fcdf8bbc3aebd74a9ce7fb818872c8e2d1206162a3833dbe02c7ada78f020a83b510f1530504f891560879b54d510770083bcc1f4b25aeb7ea65f847c2a7f23b30a9bf97e8df4489a8ebeb5c94af5fed80e834672fe52203c2ef0847185ab2fc40742529061e08314d1df4ad633162fe98a22dd47f104c2affa84940a8c62102605bdbf368950e852bbe893ea244480e128aa9f35802057098ad678c2a48d18d83e8cdb0ff335364e8d7b83a2a3f71fe5b8af7fd48d728b84e29714f7fcc5c502b3311b4a363c8ac4eff9e9aaebb86bf80872fe0ef5a006ad3289712901c3b9ed390df89e83814b06dc321e581c86fe12124356f8223d19ce466918c973003c2e018bcf980cbca29d48b4175108478a1a04ef1add92e8c1182069308dc4b2dd6737d3a274a58549544500ed1c2794d59f77284083bb71bf660abd2dc5c618016f1a66638e337b891385e8303b7643f00a204f9a669a1a9d25a643e4fc97a1d13ac55d98dcba24704d0ce03ac276730af895e0342085e256f868cf7eb679cbf38245140ebf0bec364c26fd7908ef284c50393cde922da98b2ea955cc5232f86487a708b7189397e0cef38a1fd8f725bea60c7ff3e0b4042790c505832d91e6270c0bc26983093999ff6ce4aae1165ba36e09bebd9fda0757abf371c2574089e5048e50646d0cbe0107755afdcc12ef12b122ac426e42efd04a489312a5401e8e58ef69a32482e31d93d3cc64d843ff04902cb4888f646b9317baed6f73fc9e190e50759829a6f3d38a24c17d71f3547c252301f15ed340b9365f366b18d93da489b7c07ebd74aebfa136cf0c948db9abef117cd205f63a77fa0d20e191add3b4be4ce8ef247165576b37b5c710c5c2590168aab5548d7ce8e4f921d6ce3449b21fc367ff21d47ad816036c2fbd804d47f45bbf4726956d2674a4918c162a48508e45521df1b689b6872bba720d12725f8a8d1703d926c374be018b56ee881faecd59d8ec5c4bb14310a8def4ed49499500ef668099740f0ca54937cd2c9402fa7e9a7145a93e0d3f51e682d548b4b1ba0e5677cbddafa605e32f8c54af6f5d78a2a46c0241bb622edcb48c28b7d02fe98484bfe33538265bf49b86dbd7fa69cce933cd744f2c2d4e346e11f3e55881f5621dbf5cb80602ab329a90abbc142934ff350c2a0e63323d820716a350f5fff03e3370f0ef325425e891781f1760c0a2019042204f0f9d961a6c4f434e3634fd41130164424bf1ac2b612e014bdc02d6c6088986a5c06a520dae413847731ceb0866ae72dc9f098690c3d52da43ef886b16bcbda90d1038d7d72c5f9eb3ddd5ac9ca1220802dc65fa6f28bd6fdd52daf2a002a238641d524485f502e8daa1aad234e1301cc1347ac69a71a6811c47444c0d63d80fd0423db7ec0d289167e19bf0341736b6b69bea0d9fea4670fc689089e62c285afe541990a4e393cf8dac0b4f094751a637ecf53ca5d130bb75c3041db4db540f9ca88f9ea3393ca50cb82b88c0193fa6852f3896e2ea43a1ef917c10b9398539d3a95dfbec1de0ec4c5c7d6a8c09c1cdc0801c1fd4224b23bd20443c256535b2200e48082860092f5804bb2f503bb582054c481b2d2990ec852f0fc2b01972e72176319dc840f163bb72ee2bdd7ea9fc1537613eb6c0c4aafb82c141e8c86c87f05cc24040aef1eee506e54debfa8c0a402f89909b049cdaa01433da2bab2ca4b20fcf4e3973e5c0f3c0756b10bae202634552e86c8e424e44c7ea4e19de942a49c443753f01e9a62f89b2208a0bf938cc2e6da5277f4e707a89ca5c20fb85c672958dc6fd9fd7537063050c664a7e85291a98ed1137a95b17495e210e5701b5b8ca95a2668f46e13ada8fc4045abdcfaa0f844f125740c0997c23a8e0f641f626dbbeb8ed506dadaa3c9884505b93dff08cedab980aa2e696621b1e3cb14c33336219eb67d1d269108d846b7d5cf0cebbe507dff4312db89473346c2741a15ab4f42ebe448a76f5805f9cb78cd8925f6c3935d7b0420782f7304b6efc8c6a54edc0f3abd1bccbc08e170846794f73dcec43fd1abbeeb8fac808235c9d459497bc6b9d1c842cdfb0b29427682756c63e6e6fd0a9803a89015293550604ffca452dd192d7cfba6a5a7b8f3ba7da5765cf6208f77e4b1507a5e5efeb578a8f83f89056e384a31fdaa48723d72865f4985857690cdb7b5768b501abeeb10144a0ebe341fdd2fec9d80525eed52bb5849de928d3c496555e6cde1e79f4f431663ee1b11b5c045a51faad0e1e8455f154107ac37bfafd6a9682abbf0297962ac430e1fe5da577bf2ac465d2a27ea3a525afd294d1869e68114930d7761416d79320b16889e68c9d86c912d21bec59b8cf92a01d253693eeb74c694503211aa1a42310388498402aa9454905dedbf4fe4c3e65a23e1ae0024a28160350b396c61136a1628a3d1a4cefbb9f8a9e49e917e7254442d4800ba4da52d89c44c51cb7a4fe7bd2530f5fabb9be79f494586df501a9d0158bf70739da0d4edb51925eece8e53b794be8d95305964d702b4ed051d99746c540a8ab32b7b69c74d5aabf6aabeda8ff17601b422b6abe5f5bcc092827201a0504afaa6b0a4e04c6b345a0fe79a25b9cf22bdc579074dd27744bb4c40762b29af04be4f19a52cafa4c98651674951ef9349e3984a57a64933a9bce086e3743445b1c0b923ad944189d74ccb690923e2fedaf76332eee226362a35ae77ff93be684f2b0ff0c489f8853a7e3417341b96dc67af13b392f5770dc7c0f2ce6125ef5a1e4e5a2d2c09129c4805d793c0053a3ded3475f6da422683dd4d8020e9e98bd4e14936f22d2c3cb3a6151c372fd3b2ee926113c499a3ae525bf0e1e6588b29f28a438f8ba87ccc0ef1d1386091f67aacc8f801f04c6adc01818fe9de09b341b7ab2d901bd1bda2ada8ca2c29bf98e8466ae0440a9a740ad449b34d8dfda2b1dc6bdad66a50cc930624cec0657d35975901c91a9bc84d0206306de9171aa89c14611011da3382b636e68560cbf3279f66f748f743ae68b1b99ae59df1e6d8ca149a0c553d4f521ca595e9bcf47faa279646992ab183632cb04c21471d6506f8bbdf4a7d8acf7f17027d011d186cff9814111ca005ea321194ccaa8213ca9920903fb18aba7ebb8c4ac5487f7207c211987a808182e49b5c76e9b33e63949c00916272a1e544782d22bf1429c8cde32ad0bf4430c90134523cb0c5135979c60207197699810c1334565933cd4bc5ab4165025ec6924d6794581b9dee46974a26442409a740c47eb8eaf2d6af133f462ad4f2593e9835d1c41f9bede9a792b03e4d3019e8d614d029df55c27ce2d618c621e4f490c6ac8f5b1adb67a618bf39806212701da88a1d2c9e9443fb5680b81ea2d8c0e17a29b212068202109a6fc57d206d6b0340b8200a779c38d68f8cc1d81fe52c4ab513f5397662ccad37b9720abc98f652d500729ef19feca60b10cee7a6a176b13c10c8217a7799c78b8dce371323f64821758a81758396da8a75b19ed4d4df8a5aea5d3dbe66e35f135acbd1467c15286d7a0fdf9b6bc12f1a98cc5d332f5399df2e8427c72df871d7bae6ee3adae05de5263604be326862db44492821b95af6b19bc5ae8b3a94713858f113a9254617c580edc40495af058ebd3a7ea67f1e83b5dbc0b236f96eafe67105d402162ca2f1aaf59bf0d4728407ea72f4fe2268a5f9e7e1bb20d813044fe1040c45b10e99d2a136a2a674f001167d16c8d0afa91975909a8087e7cbb39c19ae59758a37fb883e390842bc451a720e2e25505ebe503c50c237f5876f26c3895364cb2972774b1473078e7d6b49f7d30bf7322f843f4c78229969c2040b2ad31f3bbb30823585fa287c4e51f2b96caf53e0123bd6dd222862730ab0730134bf714e25be21fad88f44f14671924c5d8a20486fd628699d2ef28b74ac7707c7862aa052e11bb30dcaf7a88053a40a7f149b010e84ae09cd982d7d0cc114e1017d456f227a1ba4d36725e9eaba2a0ba933bdab429112e7e7fb8042e9b7e036270936a925e0b8545213b0315f0f33481d9d5129aa9c56a97be98568db085c4f58299560f9e942ed163c103d06475c3cc3847f0ed8a2ca1b8cd5166917c234ee630a6941f3cf1657750a678a6e4837ca911e87a795e7b00f8fa2a246e45903df5f676736f876e15594a684f5972bb319cc8c682e306870d2bbc3565e16fc2e84d42775f6ac134a26e7f5814f79c7544a8a215e547c523133398cc6ab7e08e074b739e6245c3312228c3c3614ec6ab7f4f499e707629cddc30b9e09eb911212004825db65f98d484db124d02568065bc26101a8a421078cf44cbdf143279f583e43923078e59b436b2cc09568240b25ea9aa83a1bfaba8792aa5e235efe53054e09ad739a51955de518ac7b51d6436a98c89923e9448d81f5160597cd59ce146ee0732032098e4232d508601a115d5e2bf493afad1254bc3d8caee53aad65aabff0ba66c917514a2ef92b1b7d259844cd2ca408d240c251f27bdeec99462a9cd799801cd74c18d6a70123f9064989ab8f10e82c53394e63b294054d96403f1110b06c5b8474bf275d3f7eb4aa2455dfe39f38251cb1277edf07102c0b534ec1adfd4f18f0e7d9c126a1afb084ce40e268ea674483c0a222345470827ff38e8bbc3fe7994ec178d400595318658bb82a24eeaf9d1864a9abd13846da185dfcfbc94cf54c0409276b8b4253881003a9ada6071285a4ce923d2a1b36e49018f2d6f94d3957a4ed94ce72e28fd98a0f159fb23eda9f82f8e0ae80131f84ccbb3634985ee4aded7e09ed438bbcb51dd77ca057db3fa899e5a37fad87b414f61e6701d158b0300a987bcdedd9286183eabcf4281707e6b96b33000b480120bcc3aef14638db042ab26c04550ab5f3d1c9d0030befec2a74da3d663c09050b03a4836287bf1aae8297f4595ee9960cec51b0f0e528ea05fb81b0484aef5bfa3cc95f6fe2beb9485601a271bacc1f4bd5174f5c3c7c07d45e79c3460339f95320530588154e6a728c6230d55855f86555c74af6002f0a856ad4699d0fd27941a75bf8a96b0af8a21f115e2ae8f7527c1322c58c59439c14247ce29b4df04519e7c939bca209b6a2b589ee24831459dc99d49755bad78046128984fd11ac94c09082b3755d44bf7bec35695774b925865d562ae3d80890e0834843c1beab1c6cc261876c584328f0e53c8b64dafce23dbfa5ba69a879c63964f19f2fffcf3be189b75f15111d01325af7f66ec64e87d457e0c94b68f033aa0dbedf65b3aaba88e6cc2ccd6962c284df70b884c7a157b980129e611a8927f288d0796aaa3b59b349619a730d2394ebc0850e5e21224676c764b33ffef00d3d360402be2bb1b6f16de2be0f73df9bf71547f877a9c7d376dcaeeb6c8e32a67023c20d3eb5b071685e909ae7e1d021430b7aa5430d754bfec178300583eddb67f944f8c6e1e657a0dccf5ac5d081e34b0bbcbda7cc9b195f22de0c5950d4decb9e912d18bc972b7af81edd9da83c029b205bc10c082a6e2c5e3367deb9a61777a5eae7dd016b0e4cbe50b3ba12a54f4027fc9b74836b4a9047e966ea92180bd120fa2098d24613ce98b6c1d36ed3b63b4b6b265045568e094e56396cdf2cb4e02aa4b8ac1b2a9a8cab9bae932228633bbba21247c70619cdedb1178ed424fbc1b2489a59a24709003bd0a853651332a69ccdfb2911fd9a74a4d22035f5a17d654cdd5d0f846dd4e0d44f1c5af5a3d55a3c93e2ee151378566d7ebd819933f81fab1d8a79f7de497c44c08427eb2aea270bbc723e41ee6e603512db42a5fe1eb5884c0f5208c8984d8926c7b91b819d01689f2c1a21a1b2a3a46aab240a24902daca0c562d6d0270a597e8b32bbe4bfc8277232fe57546d2eb7453aaafdc78714ed76ce0ac0226b0f83e420c7ef1c8fe958a923c9ec98d8a31ff1d1e1cea3f016d8096f33b2ab09c05b9dcbb1b399cdc01d9d12f39d34dc56d246c4543973575b99af2ef7b79691489e74a1ac1e4c2ebd6aef521e3211275b2742d3ab3e97653e7f4a78632ab72bd19312692a29e8d8bb60dd461df932b9b0c34d0ad24c12f124588da9f852415690281c1eb386426da92134e024fe96d3cf9ed26b974a6e1d256f07f7eed6c2561a356a60dd264508e06006874b3866834e1bf7b35b1a40b5c32c2e642cb52822b88ecd5c902ba6924f17ccc5163f7ad62c790b556389233e95b02cfea486e3544ee352ea292984dba0fd9e6e036100ed0e8aaa613cab9c6b1cc0f7c0d9c00ea203525911150eb8d3e1d9df6b6acc8eda88d9034ec208061cf5d42ca826290a944bd74b5a70f1249027fcae2730a8402c3cb8fcab29fa172504dad6dae1c9651090c63cd3fed0caff488d5cf30f97ce649ac60751ca5d894445f40045f622805802273400e7a21bb6a8d2b583c943c52a226c6c6d81e15aa892e4d044cbd4474428c046062428f439655bb628dcf1ffd6b39566ba1314148a5beb16dc0e4184745a4f3182090b56804690307267a0d0a456686303691df6d0c5f02f8771b4fc55906d94623c767c059eed31fc2725b89fba1a4663a47fe98748a89f5bbb27ef3f4cbff6dccfaea8e46238031880c67d8197fa4f6e062358c1a880658fdf9c9664cd6f259019141f58700f38b687a3b4be5757d5b155124313cc498eb57520667620a14f5fccb9b9ff2d56f71ef5d91f438a206700fc14bf123af04075d93f1dc655f1743de87fc6faa8c1ad246a9eb99eae4e136caf71f5b95bab89a7ebcfa1194051b924ec990664a50d7fd13d977a45264ed6a67f5469fbab40c348ac02d7fc4f0e302cb004b87f589abfb2e2dea7a302c29f01eb3ee565fdb5186acf54f20efa7157d7e196ce1800a3e9324fe4996791086bf0051eb8757553a1dd3f084d74a220151e0edd9e34decfa1aea982198b37bde7d4cf661b3c441cdf05b6082fe0590af9f40ecc9982768e102609909690078774b6712361d613eab1cbc381a9ee782ca06974846117b89a0136ac4301ff46f1127ccd98c105e69fb2250bf709c3c605b918d8546321be6253c28db605cfa4df2298853eaa015d722059b37013b7a5351819f2b95fb7fab4a892f372a0ec331ebea82174b068b36091ee6daf8b72b8c6834d6c140a83fbb2d135be94256c4505ae6ff7951186948c42e97805c40d40a69b139bc887a3cd1e9b2e3650a6b71326484216e4c443a80e438a04bf2d923b1eed13720a5fa0b5e4c88651fdb13869e2feaba064372d1454a9d37819c5fc35239d05e09673e2f09a0847a38242fdd27a33a440e2eabd76cbb462ac6f22b752d5d23964d166d757e7b69d54f8ab8862e716b40b99174e9f26f1fd21dde80026dd3bfb70a12be21c94855663f8a2f37dbf6d668ad6955a5509a36383000f9370d3b2ddf8637d1f83910fb045c541edfa7b56a2dc80549b244ede8037b851a6e01475fba6058650db485bf2f42c0b24830a1a552dc82d3201f4447fc9b1da2e36b5ad91a3c56cdd7a97108eb790ae5120adf12c201ed2effff56aa5bb988a2e3cac1542081763d16071ddbceb2993fbc127faf45731cac991196aed0818d35c28afc26778d1df18fe1ee56b0e15c893ac428e32298fbc8b41801b731f608ee002cffbb670c0b8b84faaaa90fcb079f6996049df6ef86d02e608832428fa85cea8e2e023610f72f64848a25bb32861b8ff5a6929c98bec02edb61461d857865ad5bbd6115c205d5a7eea61ac95a238203a7d3bf44f863049ca80d7aedbd2da8eeb0900bcb33da70dbf34d8cfe97175b12b2984b4aac06ba38dce384bc11fc048dbed831e5a345cc18a4a407e9f32004726c5bd4f80a2a8012e27e25173a78a7dd052174634c790648aa65997712a28531080f65c7222e7cb416b378926f2ea584212d8d524ee8481deaba3441d8beadb36725183dbe368a91a0e19a01b6f889a64df0e6917a6e6ee4ddd4346f727aa68253c5fcd548080c2553075d246fdc2b375446bbae0a5a7f9566cfaca97f95a42c4878a0559273638b2f6051a90e68c1376c28c0f1f1a23010f11aa513d7d2fe8a00afe9d3d334f7880d058e04497dbdd6257172f4f3c520d7a8944779c60ddd35f11bf2d5f0d3c81e5654a04dd94499c05438a8c131194c404a0dbc419677a56132bd26c66df6c5cd7969726231a5401b4953f3848624b53699adfbac5cae496fba8a9945ed093c318d94b2626136852750195025d2a15c97a11b51b2ed47f8de2155615cf3e721f9840e3db80d49f54b53edd878a9f27a7e0acaba313cb20756a152cbcfa4217efe0e3e52a38eb189d8f1eb08a1d075528746a340a7086627919cdcbd0c079ea42528f4bc660890ec5c39ba3e04ced7c7483afe03f0463ddeb0fbb489122d1edb91f20346056dab65ad3c86c4afc1e1f76e42705f84e5aaa9353c8afbc09787973159c7575750e3e9e1c85938e8e4e2d03d4a84db0f2e22b151c18a04f631796f9d260915ed4c9bf6eaad538526874a451f78d09d255d54512b0b4fbd6f602ef82e3db44759ed3473fdababf86a60c70e712ae9aa388685aec7b99dbc22f05e58d663a6dffe2165a0cb9db1304f7cdb2324d22a1be41f525b20ace1101db3c7a38b193f3e8478dfa186caab81db61a1225200284d8961067913b4aef08336afd5adbf4039cffefa8d8f8c167458348566f3b3c7c649e2c443f5c99411a2aaa2273e73bdb788fbe52e0faab1a0bc0b5eabb1907ccdcec82fb14d689653d4807a71d778fae828f04481d62bd46559aa7d9e44abb8717584ad92ba8ae9859e78cad53d7fcba659178dce4f28e0be002c845c0c872220d0cc78fe0dd5c77cb53fa9338f1374d93e2c3a43752b40357d40fa08124496932e7f8dae1e6ea02d1fc2366cc7bb577300f8905e8c8440430023121cb6a5bdb550d9f1a55d1ea38a989f8dd4ab56f5e9b79772abb66d5a9652cc290b56a528d13b298388cdbef21552e2e870f060127f86f38f4e37cd4e7402cc71a8e943ae07419c48b6ccca1e82844d35df941464274a2a1b309b5944e7a84d5858e5104dd06e8bc7e4eebb735c6fa393a9f73f674f4751853f6dc2ecfa977b6a42a58347521c50c3bd74c74ced7716e25ee3a8ca2f3e3a0e434d501a9bd2fe463a63b86444f93acf17dae839e3a7cbcf1652230cb3a71fca60683a9f534b28737175bdc9e2f9cf4e4c933adae2fe4af73a11279a9fff7c4aed4eb52ba57abfb81bea7667952a3a43676c86f433ece3c1445a86420b8130722753ddeaf8037050a47430f3b14da4bea148a50801b1490036aafde6c6207a3f1b6995fa2a9a55e5a679fc5fe7ec9eb621a6bdc14b142de0a1794931703842e0ac27ed3fc6b0aca1be761fa3316d2a114046d3fe243b4473f77cdf16bb117d96bc0a492bc93e791be78a5a2896552dbae5f92c2345730897543356647dec319c2ad9bf377146f53447f3f86ba9fb1cb7724b14ec0baad3241c2b6fbcbc0290dab29978d72dd2911c3e04be5dd8d90ff56cbdca5eaf61f1bc932bdd4794226947d760b66897e82feaabd744bf61550fe8288bba5a9540240a44de1d1911e8667f5c9e0d1cb3c3196929a7a810bd25c478c474c581f1d69f380de4f29b8a8352e65816c2ceeb287dc91e4180df77282d60d4a938fdd845f013d5628dc52b0b1b206004e9d8a4983c8000dc3258e3f007cbaa3950723c128cab0ffa973cc9e24fdf002d5e65d19bc1d80d0e040d108ac7880a0b1c8c1ceec8770cfc9840ed492942a8e7ae7e7ee5f8b95cd41ecef198ac38093adea5bc88cad13fd61422ee55cb67e51711ace62380a4180cf16e934670e642a29c86d2e6d017124d19d677090b87bbf3f56c87b44129b868c57252eab98e4cbfe2127a8163ffa0efce6c4f0a3e855c138751da49d8a63859b6e8f52620a37610414b30a40845dcb9870cc76c30d31684408e2b14f6fa61a6e8c94dda4af3a7d6bd8227bb9acee28bff6909e7c126d7cb747adf410f5054f3d5fe22496ae29beb01bfcf9e9b861c9c2edf65c4afc3c6a02f43c8c8b3951f6a3b924b14659e62125c2db2d36d16ba24edb7dcc40e6e4c40c07e87bc4d8cc33d6fabdd60ce87d5b2c05d436e21a792b9c30296ddc4916406bce953fe5eb84de924156a773a95e920efde383afc8286c132945f76c1ff583a0d72f8563d79d76d685dd89724ec9458b53a701aec1f89ddad36846461d80a3a13dedc960a44dc8607db477800e31a9486386ae9c309fd47bebf3b74727b165761da1c48bcc19dbd98b9f7f22b11fa0f09b0e34c265f6d4253ea1093b3de795e208625bc5c4368b4531b39558c2202db6f1f0041af167fa9e97eb4e9ed95afa27255206c64609ab8c0ce34e43ef318b910c31348bf57b2895fcf415e894132465ba34892217c38b12f05219446129f9292b1e0bbda4261f228fee151c5e0a88a5c428bd266c6abf6801641706982b13d07c51fdca0053aa4eda6d6bc0c76f12692230ef29d0f66120a98baf9829d0521848106f606875c2123782bba90986374a0946704f296f6c45055fa6fc4beb9b90e08630e004df8cc805477904e3310add54851b1a0b03c1859ee22fdc75cd309048fda7d699ff622887193e29fc10c93ae14797c8bbe55dd494b447f243d26f9bfdb6f3fd8654abf7183033136c3fd2b9449aa229ba1e8491a3aed619cab6b33214399d66f6cae9cc55a7216cb0d699802cc73e02fa68b0d1afad597a3712519e02ecdced2731caa4fbab2215fb58adc01ad62f01cd4a94bfd2790be6ac36cd3349da91066ba7143a6d75824eb8cc9f539dc6e7b42b794ef8757c42c968d76afe570407e0a9b29ae01be1bfe630879f4b187c0116e9fcf7744cc25ab646761b105d329c55f30cbcfc3b76bffe1e98560b81a1cb7f013fe793be41e2a200919dd37c279847f2213a16f05a67fd0f5b9ef0f5d72a2e0bfd7698f6f8e1c54abf068ea44a48032f934e149471fed963874953e33889870fdbf07614aa05177e5d2e8845e3f856a77259ae82a7e02a3825478549700e97d551f6959c12dd01a9b3d7b21ac7745d91664a9ca5e50488a58e6470c89b097194abc8554010ccbc326600312b8c271397b310572087cbb3999beebee76aaa40d6c8753f0c0f178c846edbcfbac043e50aafc0f28fedbca631d2608076a485b440ad10b6b4466b7eaf614cd73565c11534cc3def16b6ce76cf9c51fd2be66d35d180d438a6eb8a96072039a41480133c0300723b0026420470459200b2a815802669c02002644e00f090b8f219e68557230184dab116ac156b212d4847f80393d004368d4c909f90984c23a757af499c98d5cb822eb82d784418d5cff1ff4609b42a287ef142f9893f14692889d2eebb28fff846c1773b0ac377fe660de0710421aeb723feeff01621956bd3c8c7a6c01430c96806e3d0fbe52335296326f7be3759e5153a828ae22d844eb6e12f99872d4942b0cde4c344a40d6f90f908bfb54c46cd33f38f0fc9d5547e1334b8bac491eb0926815084cb40af45c51c2328b5e55f270fc2a2b0101284241030ce91a177fa636a77fa3331f6821e9bbc1a6d09254a9489694da2aaf1998fb7f497a4609b3511889345993e248e37e1fba541cc911bfa25d4a47489876e759f092bbaa7c89a8adc5aa470ccf6994678ec6c5d282e4739dd901ca87c940668505cae245737af2a93b6da39e3ede6c95ccf2231fa4342ebe45b123e840a101e89ba05de2ba35f0f441e3425f938196307eda86872165e338c14efbd72812930814d609c4c33134133084d633a2efca41bd3714d83ac3054e7d86b3825184e022871dc389d450a1b4bc430b200700e20a43d631292fdc7ab181908d58c684909989898f58c4b29205985da2b1a9004c762dc49192095c7ab47c6becb5b5273776b5b4cae7495300b73caaf2468e20624c62a2f8fed330c099213464b12cdbc77cb8d8496fac6b991d0b07f549b01079b12179d9f16c10133c1c22d7e90c300be131246896a7863d991b6af91774db75cc205d14ecf9655b1675a0285cee004de5a1e051012181558c60c63f0c282806941c8a46ed92d19356c39dd32d73f6a088e6ed932ad160a1d03ef46fb1dd05f1a758c0897d7b70ca0d6e232844f73133b356ea188a08807462f2d45a12596458043a8d2596f974e669fd5a841da656c01eb6ba4de5dc1775484ca30965d1ba550f84a886086af9b4e25a225cbac481259e089eb71796328546c8c767ba260fd12a9cf5af00d0db989dc17ee41221be86ff609806d31ef12c9310b6edd632412a59c2c7b641964331249f605077d3b730bb59751081a4ec81dce5269f6e020842e52df8ade86955fe3fa46e3a07b53a42feb3146610cc5feb95474ba950bc48b3ae4f61232b47f5489f6621f5af57c0bb31a39c8c3c51d0ea3fe08e920702aa8f76a5c9d4ac024ccac53d9976010d2a1ac7bf512aa680b9870ebf2acd6c25ec258664b52fdd075903c9fb2d23a79841dae6ab98e2f7b8d412071d110872fc5232b517c2cfa261495cd5ca47f95bcd326102f56e947e7f69b1e9cdb924821721f7bc0b165b5ef50e62cc361b6da3707bc0f851c77f316b223a02b81a8a0601a2a03197492021eb0d44e6bcb6a62f9b9059f943c6b8f32b8241b09e83d5e4f9c8898f1b1e4599e101ebfb9e8c1203922fbe6485f216fc848844dd197f76349b471f4d516a3974d940adaf536d610d5c0b9a0273f84489c1c52d29ec1a8e066bfa7d3edc7e03976e2b6afde96f7fd7993ed5b52520ac8ee991a132c3e7a1b6474a35205aa3e7e828acaf48bdfce835bab4174bb83ae76243904a0a3d433e060f69866a9363684d01cff8f0c1357ae3ae33eecb2a5142f48596854377cd09a890d469b234c4f475f3142c772e4be46dff603fafdaa235d39d2ee50c582e3593896aacdabf9f94888ab273a614df175f80c3c6ceb4d88920559ea391e3f1aeb1133d5c8395db163862130461c3c87d49aacf7645c1e5c9c249904740212f543c0e8b8c69998d6c1ede3eeb7c0b8fd36eddd164f8504e59b0cff5d4789beb6412fd4526e76a7bd6971a7267a94aefb8074183d9937411d42dbdea53f649188ac42c39c238453297369e4580e4601c213173ce5b810eb8ffc0d474366fd23b87bd59be587dcbb1783473c50eec1c7099ba4cddb1a059d545c032528e2e6960897b688e08984e785e4a24515c905b4d23816d8d01fcc7d59b3ccbd110e60394aae81174e71f1db6ada14bad1a54e1311921987e717cd4f779f931da79be05e77c44c257e02f40f0c352a4af8d2f7b3ff27b2993f3ad1f8fe51caeccdf515a91e3b57ac9c28b71bd8a3b33f579c72216d69a3242b732f1a344f2b6de4d390ad0950e6690d3447a4eb3fda92ed59629bd468d47aca44d260026165f3f170d5a244234016d98d692c081db71878d58b16ec25891909fdc650bd21205c7a9fd29f89b3bf178c1e04da42dfa35b30dad5261d8fcc6b41f692c4329cd99eb93b48431e7288668118787d8d36466d25f4674b9e08ca5376100a1e1802dcaf16003b84c17018203df89d870e13761c08549e0f35a1417e6f8ea8b546338cbcc812b209d98490bde5de012c0a150a520ad7ebcfc5bd2c8cb7a081062d5252b2d8b1a3c96884858aca15de8c34795e3d2b48249a95151fd8ebb5861a7a60b3571e3c78c0c2c2a4478f1df8f0a1831f3faa000000660210801c0840003818c0006e4000022c2995a83099a66891a200055859201702b2cb572051d860830d0c600099031c40090262771d01502420014f0409e244ceaa539f9ab0d7ab0270b038824b27c348e3e2817c29a0060b58000d840861c25eaf43385b45b05e945a5b0f3f19d21c9f633c9533b05189fccdedf1ac6843632d057dc8cba8510ed4f56727cb9032b8866dabdb3988f8ed8d3f6f68239db74b6ed51f429651dfaf35763760df5eb12e87f8edf50611bb21b4de01f5f3d7f67ab7c73c630c2c87a786678ced7028870ec51926edc927c962883335327402f3054d17465ccc4918d8501fe678567b5eb4c7c25c300d3d5f4059a92bce4ad3a56e53c7a436596209269850a264496492bf6dd52436c9dfb64ae59534d93a5359342e2e2e469ce46b8d34815ce4ab4d7d72faea1859ba640873e36ea6af609f2b0dd105d7ac29b3d22c2f97b01fa7da525a6bd5021b7f516a2d0b6c7cfc75add5a52dd5a518696293f6e469ea5cb5a723de6eb5f759413c55ecf251f2b50b2a95258da1286982a7144c8e89305105f6aaf4ba66bd29b01fa7dab6a3c0e68a2bc6d1af293b6af44825ecd54456a3e741ba7a74f842497b30ab641276c7096c28be7b09c59f42110fe9dccdd09c46f6db562a1795e79ca82a73664ccb119ab89e5322a4d65adfb7626e497bb20a5b6de7e6baa4bd27ed12161ad2799e1ee6193a214de7e99b5355ed99db1a4647864e56f0822e58f9d35a9caaa3044748d7e654a95a826e06a89c5db9e2c4802cf224b0dbcc08b61597fbc22d64f0246757d27443b40fc11e31a7a43d2f624b48d89bb4615ac32ec5c61f27055cc2adb460fbdab15f9853725dd715dfd75e5ba5013e1141cdd155b0f339da0a43c030b291f89863a703966377a7c3f5ea91e0b37bf5ca8c1c7703c80389849de76a209019796e254df0c4b5361a5a3d5de511169ea209aea8e209312ea76f5b65b5b9b85121958b226ef29521b038841da595433aa0b472dc8129ab73fb15467badd83a010fb659b3cce3c972e48f53dd1cb9bd68af5b282a8fd866c5937cb79ed8f97e0d0442b19198877436022c354d7b120be8c9dfa8bfba6bdbe3e56ab080f8e3c4c8345de28c00b1ecf0f7c1f83bf6b034c24eacc1a0ecfca7a57274152cf61c6d852156f2ec74b8b4559730557b2b4eeb6ec88680610cb1922f6ca41fb3d6e990e5ae78eb866419f718f635510c316075a32c3454cfc5b5fae0a604819dff82f560fbf9fc9ef7e3c793c69b0d6431c25e5816615b1661e375e16da68825f2c54e2eb05042cb90a68b9bfc69ad2c7b6ebb8891e17cd6f992e421b2dc63d82973bd395a7db10cbb1b362a88b073a3ed4593e4bf14567b336e3c48370b02e9d8dd4033cc36228e1b3466a0d498224facc4e500ee00723e801c1690db0202c9361a6dcc40a971e3c2f66878321f5aea07f7201dbbb8d1f6a2bb6827cd45b3208bbcfc808d1fa7ea4adae5b7992e758ecd992ed9d39af545ebd559e6f16c1bc6d94e47278566f0cba6c8f235a5439deaeb75a4f2e46a0fd85c57b3be4831a1694ff2f05f51f470352df26028b38fb3e154d2c5b6fc64c2ea92171048cc2976eceefeb48b9ce1c22c20b08aa0e275d52a9d5c76b7293629208bbcdc5663e84feddfa7860974bd9e26a1e12f4b02c5971e4151d1873ce8522450114f819aad616febb2e456dd9853451cca21628f389464e66f6ea21b6fe218edc9478a43f4317f316b51c3899d0c9d2821834e87eda198932d007168b292dc6270a2c417b00c699cb8b03e90ea30d40c9da4600534439a2eb0903fadb5d906434dfee8e8c98f1dfa0b9f7cf1291561284118ca2c76ef2bc40f9859dab5dfb09dcfd5ff25c9d80caf21c369848e43c767406833c771f7d878465f6b6c1bb4e7aba493d2e068e83a7642302afa67ffef73df3ffebadffb2bbaa05bbbd8d78fbc75b409d0fb1a915908c8462807ecfd4e8222b71b33c7a9be99bfc9ba813bb806fe7e1930d68171e010ee40cee1c96ead759b73cafa591f1033ecb65be047eeaefb80fe79b9eb7e69f2bcfb0cfdaebb1cb6f73b499e4a9a7cae6a92bcfce703619366d220cfadf3c20cf325c93457fc1999b91ab96e25c9abdf04e8d7cd91b3dbf7541eb5bd603f9feb76a6f162b93fbfba1ee2e9025d86264f2cc9f586fad7bb5e984137d435c618512ecc3547d7b7af2bbbc2ee01f534747dc2e4c9ca41baf69daf372e893e62be56edc557ca451c441ff14b92731c7642723c484f9888831c578369afcb71b1d692511ea4bb6ff86bc9db6b8807d0b3ff00c23f5c9ff7e4d8ec9ea7b01bb603933f239dfbb33edeef1d3fff6d2bee26c997912b7338e220fa985a4a53625b61bf813fdbc1df276f9ebb3dbbdb2b94b03b4d643ec453868f2489d96ee9c76e38dedd4f88961c8fa389ec386e28be1fafec86e0695bd205cbadb8603f4ac44aa78f1f29d0f41263646093275ad905197e0bdb3b573a735073bc0d1af411a980a5cfe6832ce3b11f9e96272a44489c2fe53019c238435a899806ce09ee09c8020564194286adbf4e73c4ad054bff71aa952e5850c8d90dd5c353b742f534cb1ca4676cbcc8b8b2603f0abb3b8d85d090ceb971ec75b99cf666ae201b86cbd0090c0bba0c699c78a1f3c701d8b413f19c35f0c0c99a58c1569a6bd53c5880ccd01763554149156c9d5c18d1640c5b1fa4b3083b212c3d22166de295d923468e9d90a682ad998fceeef997f2820c4ff0d4b7a7e776aaafccd995815944b1cadd09e929d8eb73c94ce6981421c6782725c12576beaef0b04194e1164e18217f299f9761ec59afae57cf396badd7757577b74b34519424c9471d44ee8a55d600a54740201af8e4a9a51af71b7f94e2086b84b19bd5dd62e37b898dbfaeebd775d1ce5a95662d8afbeaa65a2ad61e5912592a66496459aa4bd913544053d6820296b897b4dada41968fc2868b2549ac0fcd224b6e09a7e4c2f63828208b0f79cab2620899c9d5caf2a343c8f2104bfcd124b23c22da102f4f93e02e4f4b004b5a0bb27cad2d96e354cde2540d25cc32fc9982b2e8476d8f1d13f34191801eaa630a7a48c052122d765ac84d91254745969e67ffb82559820159820059840059e43d97089432b24bc405f00ca3492c3392244fb3079e7a0816256de654d1069825d66d2b19aba0a110dbb6d569a3513dc1ca0c9da8603533a4f1420526ca92264e0692e46de09e883e24a704b248292bfe3acae2789029774507e713cdc66723454c23432c68ca58e166649624c9ada560bf2d7fedb2a2a11352dba55132c4c20a13ccc8100b1a2be44f6b518c8a14f5c931888c778b98535d4ec98dfd9a75dd8f76142cfdd87fbcfff056356c75bb3257587b50ea63dbb024b2e45431629eb7e7bec874b1d67ad56bdb1ea4bb090d051b528243f1c79c60b763af3fba07693128a71111713cff52804030721f3601caa8c85634892cbbfeaa6f325eb2f66b5b5263b76ddbb61ecd6a56b37a743a456291383929b6c9b202028997dfa48026ce094892d7b41933320894bf6dd598533dc13ebf6aa7339ffb784a6d305bcca68af7a38b48ff453d8834182d65a38980526b3f9fa62cd647594d5937e6b924da4089c8f21307100896458e4d9e4c5835363799e2d01ccd25cb9352d234a230544567a44985c6641a8a3037e0c1278b968e5acfd5fc11d46a5616811ef176b39aacd5deb5e3c6de8153309424957b556a5849514911916af07cb4d21e8be501897ef1b808e4b96262626278ec382b858a5d7f5bb1b699adb5d98cb69aed2627056bcffd71d005c08798eff3b83dbee3fa2832310662be6a3800567efcdb72688c8d896139e906209e78dcc7dd71ecc6dce32b7ff1f11ab0957bb7865f3bb024390560e52c27b272167c4466fe480f961e5ff9c4446a78001e007cc407cb6b00c08f7996fbe8d1e33ef800fd67790f1e44f7dc87e3d0fc0fcf4538347148741f7e1ff741f41ff8080496d09a713989ee03239111fdf8880c11968bf0911acef2232bef7178f2fcba30f7f8bff29717968b5e43d7c0b2d283b572e1a9860b4f3d2e3cb134f67de55ecf5d39e8d6708881985b4891502485e229ee019e469ff8292a9ee8f21b8e34d5f06f6b4913e95ff9b7e5508aa9a81cbb3ba8e097171ebf7fd9712fe21d46231c8a1f91ee4727723fc24764e28ff0c0486488884e3a927ff4fb888978e7711ef8c80e8c4474d2bd1a2e12d1415fb94864888870289e74d041f77c741f409e7bae72e1a9a65c78eaa7c4a8a4748c174f0d3b21a39f74d1bde87134a2cb7136333ffe724ffa7988a21b47248f26e33c9445294bdbe8bc369cd564adac35928f5eb40e264e9889366cac226c345fe42db20eea21f401dc01a558c0d2bcf09c99ab8a6d527e7d77a8acbc96337657cc7d697e62b1d7195deecc733b77ddc3616c8b2bccd5c83cf1076338c2ae13b2c34bca55def7a328efffe82f2ff7a2ebb15e637333baf04452c1687ee149f4e2a9c17161c44bce2e3d41cc26357590b3ab9d6027648898af67a92c95a5b214a7aac15518c585b919496a65a8f6e43317ee5fe6925d78e2683c308b2530c8d9ada7ee309a2c8fd96036980d66836d01e5319a2b302c6049fb126c11b29cffb02fa20cbd010d0fb2e05af18aef2a9dd02e328c80064a4813ab95bfb9ca2eedd215db64dea480364c2232cc62c913597eb4b36c82adb85b13378b0956fbd7ac596bad55e32eeedb529714b40a6b0517998dcd2ae5f2e358f1cd558cc14893cae8c260488dc1781183b9f1a4a5523c2d866a292954460fd2d5bb1b6b5b6d389264b3a9dc6d4692e4b65acd5f19e454dc4de6545c0de99f570fa5c97b9330a7ba18db8f77412c168b95712a6982a715e4683c144e96e77278b8b0e7591342abaf26846d6b8e743d57b9d96b7745e865123aabdcdd0d92e2505f2ac116b93e62499337937de26fabd96e369c2d4772aa5a6fccde95e9019ebcd7bb83875f5e44f7fc05b4c37d0ff07471a87f9fe4e4c38e9828b628e3741c6a1ce2c1f37b229e5f7c44a67f4474cf1b13c9fe1f1f01c1937724a21f74ef171d02de41de4147f28b8ec43be817fd07efa027c17609890c91eca423f1fc1e4976d2e52170ef390448520c8b448608e9d991dc7b8e84f4ecb00b35e6e1def31f48cffaa0fe28e6b9a254254d2a97ef18691a5dbe57d294b203d415c140ccd7ab0e1984880ef2889edd07d041cf301219221e1c8aa02309451cda217b0ff094ddf30c233922e3830723013d3b121922a0673814ff273921113dbbe7443cf8884cc4443c3f3ee2ddf3232478121d9e6aec8ae81073bf480ff1f40bb93a0fc5dfc393e886e24187f51de2213be83e6407612432447ecf9184e245073dbb0f9e5f8ce43814718807d141f7e1febfff3d75ae3c19e98a0e22892e3c81241876db3e73a6d5ddd26498019e6c27d6db5c74f15f568db6d330e8124013e8ad025b9bf050f4947d5b497961179d64d961cdca5a73d56a56df2632ca69f6766e139e7b37c658372eced0683b9ef278bf8ed9e1e5e5e557f9fdcb8bf7d149a1f6dc50df737885e2e1e5565092bc8f5a509252767037f7c213e9c2d32f3c79179e542e3c8d2e3cedb8f0944264474c142c97d31fef0e476488807e7c243be8473c175d8261b7996df5e9e2b72938d5b68a3e6ea052d16db59d721a5d517a3bd7735d408fd5b48b5a63bd9b14d9dd96744324126ccc9e67777171e90f40204764246013014b1d08288a074960abac157dc86fab96b213826d9c263b1b08f4a9117e7d4590a8fbdce0ba946399abdd179eaff4dab53799bb31e7c8b21ec3fbed016b69c46c35b310b049b64950516bad156bb1d90a36c93879ab94c618638c3146215228c517761a1a0a6c47dfc15e71e0b8bd5fcc36a55b88941c63658104a8f10f488e8fd0247ad4729c9141ff4039fe6268433fe6f80cdf014b3a1e4f82251928ca7361cd117f42cc804d3a3370d36d45ff356b5bd2b99c31b75587d2c753d9e5d079c45fcc1d7bd80de9dcb6e6aa068daca5e1cb23581a383480f5cf6bd49c00b2c8cf70b554f4212fc3d554003d791d574b027af29475e31446dca48a1ba31c46134535491ee51715a2c8dab5916127a4488cf45fd662526f88f1ce785f1c411a1be388ac5d9ab90b73b27669e46ce634acbae78e6635adf6a411ec9724d38945869d03626ef945861de5b2acb197c80ead10fed8a881313d0d1a78467c3d887c87723fed0559fe863c0eedb5b91a5d9c8f1d3d46bb64710ba4f9d1e2fd380d18cb1c4fdbc4a97a7629741de6fa181fa10ddb0afad0b010b049b65ad2a50eb6006c92adbab42d692f62d9aa3dd9d96393934c488778ecf1d88c1d9c2dc98a60bf6c15811f60cdc575cc95eb8688324b22d8af5d5030061a274bb0a8611ac6820a48c8dced8ce55033bdec6ee81c29178a5a8da215abd6da4da01023b66065c5114b5060a4b1c20b25b565051654d4ce51796061930c31b469e20a21b8ee97848c1ee289b628abc502820a143869824d05ba30c1146e2e80b30124b8b80207e6b8b8a0e4931953dfb68aa9ebf2df5cd9e4229d9d802cf5ed4267c517a62d164b4b411669d24ca0a59aa579b4986d4b414f3e5639045bdfa11c7092dcdd8b23234b0d7f5c189ae48a3f6e05866d3ce785d35ae13c1f956aafeb910aba2e4d4d9ac214d51ea7ea591bc7250ef3459818d331da2d126117afc859e462577bd02e746661b4e702217c82cd6ab25618366b5111b429aa24c9087b611a2e6090557902b96f91989b8a8009520896a6282a08cdea219e3c8f77e6beb0491350c8594e969760b4ec472110ca822c268026ca0524c9cf8c199e7b58b4a69990bf2bc72d8ea1438618a78d146c81c6494bc364e8d858c3aec1684bc82f6c9198bf6675bce8de453f37274767a4099eb69686810e41789b9f8e87780282edaec574a9d32e798340e2d74c68319ad55c401bfa402eac052cf9a49b9d0f2ff9114e355b46d5113b290b0291f1dde51023a846eeb46d333d5778cefcdb56397edbbfb9fae64afb5c6110f4ccf38fe381080449903443ad79eb1682cb530b5dcf0ebae786aec798558bed405706b24640068b0420c8b11be206c8bd5bdc3190245f973f883204d10bcbbde2505c8921ae9a3021c3c91672b88e3ee862fc706e9ae593219d9bc310b2f4353abb10899cd8dd8374b790c810e90e3a127aed48ba83de0af140affd077a0d74f91fba83f091eda4612849f2044fdab5cf7d31e2270dcbd4138102bb07745e711028efc426b4d71c95899def3c0894cfdb4041b99efb25c99e57d9f53587ce94dd036e3ca403771cc7818338ccb0ebe7f9bc8dc73b6fe3d37361be718bf48b18a1f97a1123366737f2c933cea174342ce5cc24d9c0526584ad81630a47d410ac0da99233d2245152254d9d03a1a491a846499354a1a03814aa6bdaf3be6e75ab6b545155551d255246da00b2c8cfb8320ac82251b0ede01859d9bc99048002e4c8625df1180791906b5f58469e37cb5be70051eebc6f53dad30948c8f36a79be2f866d9f3887199ff18953204bf6208d3d7638c03c33fc09e1650cfbd5b7f3d8f98c6b6f91d979abda8b56d2748965d2a82659be72572a5992e50c4d3e754e1777a154614558e992d3de0cc37e91d539b151339b190decc22b9e189175577b80bab961b15828146a4ba91191882ff693aa962a527aa3caf2a64b61b4897ec868d693d862108142c4052276781a3022b04cbb5a5445552669b2cc1ea4a50a0289592a934190607cae5569da8d2b2cf78548c8f1ca4caf0cbcc2094d72644953db8c2555b2a5c2df8795a5aa3f60af7f8d424913bda4585ef1d141962da740490cc3300cc32e9da09a9d01faa4ea46ca782367c41bf9dd94cd66eb40c4e20a4e50372ed8500ffb22d32f32f0f05324e5933852c6202d6fbe15d2e7da194fdabb11b24829a594fd81aeb4b95fcc50625176a1c294af47e5b2ed82b5c5ce39e7ac624eedd9ccae14a5ba5cb74b730c80cde8359a922b845d0ff5ca1aaccad55ab9db6941bd385a839203dbf4d26927b4d829d3af11ebaa83232262a311961dbb9d6717e69a9560a3d1e06a28e3ae3bef866154cbbaf349206befce8d2d78ca26cd0eec475b8fc618e14c28d8ce6fb8262e32473755d8502aa40466020afbe11b03b487e14b92f49ed88983b4bc6b4c1c4b5c9f1807cc7ce31aac960c7642b2ac1be388a9d16a2fa4442cc27e36f71482bd700826946a2fc2c0b6940cd0a56e42134a85525d6a9ba1165aac5072ba84f10dd6c1d7e70df569e672e786fab195c26ea8f1909bfb32508b2d3c9065a0165b7061cbd895815a6831466eb132773a3714d6c6369c0d4f43706e1b8b75a254ab602ae01be8c9d7d8d9d2a5f9e672a48a0b8c0df23769bcd0227f2db433829d6f89315e2d3714f69b33b8ce85a716dbe960351dc50cae6d30fb422db6a8c9f1f6cacc0a93f66a5666565666ba14bfc2c4004d925918260dcdcac80b9f1ca11c3870e0d0119281c685b9c55a39bae9094d9dd118a2ce15d9b651c3834748870e1d3a4a1e1f28350c2003207b8bd51a0adb32c2421edd580f64f9b5a884e00980a64903bfc034d80b2c76ec2dd2846f2449d21a2c1a6a0aa4a113c27dbb5b9e7db5dc62e78c475032470932e77684e2dd7f3b12e4be599edd476072aca78ff79337dbfdd88046dfcb89bcdd2bd711b75d1a795ea8c5165ab4d87eacb1991cdd8c6ef018b29f85014b1176673942d3a481a4dc2114ea335d6c8ebc81a61c373295b520902ec76761748d4d6709357244a934398652dfe826aa2616d0244a415117bdc4d28f70ba54a5696e396e7260f99b3413469a688c24c9c37c268c12f2d74263a469868969cc86694ca431291d0f7deae0159a1b69da66b89933e0cfce70234a65f9152f607b3bba1cb0bcc2822cf23bba1d56e20867748339c17e386068a469c6576e566cb2fcb75293511ef1b7c2ca12dfc013ca859214e3c9de11ca1d756e6b4443472d0884469a640e6bd48a339b2224c57f5afe46ad510d04220408645e7e0406b4218c2e6dd247fc76b39437906504062c7586dea8469ae48d24c56f64336a4120308fc418b520106c14c6a8a64ba64e488c38624b9bdc18df604cd88f667c4346e6be1d8fd1a5ed18a713b261938d31f774c07c7d90c6018331c1a2e04016f91a960e9d6b770dd045fce8cc174a8ea671f806df64b4a626d32e1e335061861b26d8d10d04e2c9231cecdf888c5118f04a4b941addd8d01a49ca6e678dbb9b165dc8dbd5725551e984a888716bee2b44d6a236ed495ad35eb4c9b5068eeb8468afcd6d5a6c41855c5b6cc4198dd19e1c919133b2e9865cb9a53d194a6155d4604913a7aaa31beda39b2e5d597e34064d9657815161a24d100b342332ba04b5d022a686cacb0847051563450de6a2850faac89fca12a31c0d25a74b5f8e9b2c3f949c1c375dfa264df6a24b9dfcd50823cb1ca42bb78a5f644db340d6cada51c28092d39e75c9db3f949cac5583d5254e15372d6b61233187986f088dae90255663a11657d46425d88fd6601c3035548c3619a0499d108a5b9260274684fc8d6e72d0e40cf3a09d264d28154ac50b078c3c69742349128a9516c684fd4429514a9ab0cb6397acfcd1fce19b2ce5a918f61bdd8c6e728f7951c0880a53be1a90c617997822244edfce58e4ecca565fb5656b22eb8474f5f332c626f703e016248838d08a1f7c2177ed01165cf23c96af0bc11d763ac8bc3db3af95eb2b431a2696c85c37b3d48ed8b9adba0cad68b2848c759df8f97407e94fd758d89fce1585e0327d7742e8b52716d38e5d18c5be6ed3ce1c4cad6e934612a9249a453926180182c1a43915076da8ff3829a870b1dab16d068d862f3254bef3c9d0890a8e98464c4ea33139ed4607ebe856a3c2eeeedab506e97a6c5b4d4ef3482874b08e6ea85cb5a9cd39e79c7376301a34e4b9823ee4e19b70618cac9261132e34314295211032641551935945b0f28f0c5945a42057cfb682ddf5e0d203e7943de4fd7882fddaa55e611a115b3b82e6ec576b47f890fd088e991d3c388824b5b4f7a425ca306847c810385141184e8e88940ee91a1813ac0ae8c9df80079f2caa8dacf674694f662f346ff4db7633970cb5a207751e2296d184e8f56a806ac06ae093e3b38bfa49f428ba0f9e8b8e91fca08b2ee2c1f3df07d045f81e786a1729654d96736563bfb9da5652a06182112a87859cce450a5a85b502ae22fe91e9fc8ffc6c254d188c24c9cfc776b8d57ad6ca5ad6d286a72aba2aab1f2b6ff5f9584a2d4683d1ac686e0a4dab868674551ea4abe86e75071bdbf8db44ac556bc6bb579dd8b5b77629ddf08f1696f783d5b29aa161b53257035bf9a31367e674777717e9019e44c7c9f2313035a95c5193555d26cd96237f61343411ef20fa759514d2692afeb6d656d3f2c3d352dfe7efd3beca95895a4a9a280e4c8ee692f2f2b2e3f72f3fe9a2d0bc688443537422f7222849f71313215d74113e724c6b522e3cb1320662be4ef5a44b591367e6d01af9cd9608b3b1b111a96038566039980d576343a21f004126dd975e65d10532728d1ca6723595961a69298d8cedf32e9b0bcef554686549538aca96f2e8ad29d2e5f156aba5b546f054371717179789b51c1cada5b5b4d6ec8414c138d2d552da85f95783d1561a8da7cd68acdc7209f6db52a98943f5c740cc5409984da8fe9e5e536934ad356149d30e69fa35fc69abaccda452a9d4e8a2bff0f82bdec1f370a8debba27b2722ba878fc8d41f196124324446f78e64c7ef45af98c89f82918ceefda311ad91261e979bca534e44e5293b70a8fede73154c6d88a89c073e32c2a18a433c787eef03e8debd83ae72e189de98b7546a4b6da91149e5015ce7764739ccdc674f8f72bf0ee4eeb0c301668b8d5cb94339bc1094cc710f22b91b5f75f842c99724e60322c3202db106628e6f2e5e5e3a067bbf20f98337723920ea6023676db54e14e24b8d8d281c5d8e4497f892fd20218b95a2d452185de067b320321cd29e9de2908671805ac45f760dc4675e4b13867380a4fe05069d469098093840968ea918234dd1e50290d48f2e1f185d72c7d54c12e545a3b0f035c6968295268aba56f6d20a16958591d5b4172f3331a2b0dfa7238581814062845276b21645a5ba04af770a989854c2ac26c753fcd1ccb517c570bd9368c13bc72c8c1c333172cc6632a4304bb41729850142579f781d9409ccaa4b1f552de9124a8ea7305dd261f5842ed126786ae8655f9238a1ec40c892dd28a908da8b19a6a8145575299e2ae9d2339ef8cb72641234682f8ac19ec2c0ec469a280a92e2615c72fc2885c931d21a3524d04fa002edcd6720f2a10d1013a8c0841072b573944f00e57ecf289e1b38b8f626c4336e4b35eec10e8fe9b807c34410c220125e1a4268e0ca2106fcf03fc441804ee3211c32c4210624c97f92fcc34ec83370650c07e1b98eb707ecfd47f38fd8b94323e0f3799aa70d1d3a72e89841870c3a74e49841061dd7f3d0f5dc86c7c683b48eebf9bd19b8f27110340ecaf1d02be87e9fe11f056507c15fc76e1010874487ff70488471805974ec17cefe19b9a076ec7ecfa15016ca4259f6201274693c74693cc7fde069d038ec3e1f1cd7467bf39eabe3868d9bd2de7c8deb450e7634b0a54cec0c5c01cd0a14e519772851506e7de77ef0101bb9320ec1c3d3049a346f73bd21083110edcd531dd88f340141a56907489a9f19fe26095ab99d60e3b55778bf6720bee7ebfbe40b42f8eb5162dab3ab812bd3378d141bb972ccae87b20c9be7b890e75b16d02618059b791b5d824e48a0449ed026cf7f2979e6cfe6e9e58982fcfdc8931b410df267803c33ec02a24bdffc0e5d824ff2fc04bad4797ece9489838038da657b60e9a56c23d77b3e362089912b4b4c652a4cf9a04dee7bedf19847b03fdaebe700623f7805115cf2f74397be962cc4c024f71bd0a678ea0574e9f35aba8492fb5e9f479be0a9711082c318f6fb53daca947d8ea7cd75e9b9aba82d36f6bd8100946c95e32becba2e53b51761169f29f996e33f39858cf2780984fa78e92422a0e2ebf1920b08a4f3b8c5432c8d50ffc92398b07fb209088887f100a89f1abf18f1535ffe9344e886cc8c7278610fb6e6505eea2d0a0a0a0a4ad775af978804945146bdbd2f46fc381111cb38c93481fa71aa37a2e524d304aae55421849f9d10d809e9baaeebbaeedd618712210b7c77a50d69bb3043966c4686a42f4786bf26962101be2d0ae0eb64ab0c69b892440cd3a2c294efc61222f2f70cb9284116b8fc79126660c872a027af8bbb30f6b3ce125d8a4740b5f46351cf725e72b4beb2e80c64e9c04cecba6618b06a1c3cc593d568745ad081e9c0b420cbb22c8b27ad0bbb9d6a4e6c0896e80ea04767da937407b0246f3cd14b6740e3d225edc9a35caaa43d28e813d409c82257aa2c99c831b8b56259466738982ef5354dd334ed33b94fb5d3ce013137fe22e660da8b33e4184466929b47c8968b1264216b97cb9d4dc31ee39c946639590ecd72320a73f970e7f3c24ce3af5b64e6cee9264467bbc685ed745b3c6d996782a51ad0b35d9f41535606cc9124f94f7b3204bdd84d7a437dee494e355e0859b232581c939c234d9c153dc41317134f7d89d073f495de900f9472aa30ecf7ec1f9dc98a74be12e69cddddb203234d18d6817191a6ce0a20493e062827521d296032e6224df0844a65ac032305fb71314cb427391517d35ee78fced0996883f62213b2a8c062a24d344ed9b5246cf6e9f2e32e345c3a303010489437f9ebc0d078a147b8c28a4f15d6096e89f6ba8bd86469e4ce126d9aa80e4c97208b0a4ca20d5a87898e92ce922c3f51d2e4224d1477581049f253cc181ab923832c539d15747777bfb3824e0c3a4e74a4e8544167208b3c0743674e676ea28ff80c76d74fdc8da70ea02acda15cec6ec8deb899d08181406c64f94e0c04a265195192244344e8915aeb0df950270ca61425493d04fb75603a30cd85fdb818cc858be9d246069671b1b70b6717b9982c8f9d5e78fa1a0b81d928c9f345b05fe70afbd1198cce64197dc4df685d2b50549852650b244cc45272d636072ac07626c7b50a9404d62e9d737192dee0df8d9c85ac82c441d17714744d48b76deda050c43c6807dd07ed207c4486088824ef0308536b6510f19df7b5802702542aaab07f12a5a44b427899ebd21523d7147b1fe33ebb1cb837d7e510dfb954f529b556d577ab9d19ff526aecedb5c5e268821e5e9ac7c0b9c1213fd2d43d6ed75f8cf829878d347d6e681cc765c3c6a7fb74d7fec3a7c205d81baf53802c54e8dc38c68c0dc79b233e47a2bd3b12d03fd7defd07ed1d06fdd361cfcb129e3e179e725c991bf7f287812419fb8dc707dc805c770e7895dd10eef3b5b92e0714941b378e62b154d2a6a64b605b26fd69d236b7098a3b8c26c96bb755aa4ebd100979bb5a34706ce1c86a8fa5a279665c6d241aa58a37d087bc6a6658abb02b73e20928a4920e12a8d8ad1b39da90fd9356f83cc1266108aa1b449c78d3293993c0686c29b171bac1c68972d646b687d03e050289b79fd0d4aa675e8e576ad99df9924a6408ac5cb53e9d4d2c03e3c385ad424ad1a816814ac284e661c6b296f63c9ba1155e2091832c804675a352a9a4ac224b69051712060291b3db90903bb18bc8fa82a5d7e2183a7ca144098def8863bc69d54ba469499394825621adf8e2e666662d29d82fdedc74e98baa3c46979ee53110d84faaba04af688218f2955dda1b954a352110ecf2dddd98c539feca6a07bb42eedbb12796c597e801295510c88d2c2fa50c34c5cf2cc28a610b9f27d824e421d01b401594594059852c513fb881ca256676b31cb3cd6252043285618992282a512240e984607d650c4c69259774098552d47fd00efa0ff4dda51390e50928a4922b55da9174281e4020caa238c834fe20ab0d30801c9fd2336e92aa2c627b2db0cde862e7481789b2f1af73ba24046c22515dda644aa2ac8ddb04a5361e6f031b89d9bed3e5601f31ec6eb06fa9582a5c4137763a8832862d3c75179eb60d4bcc082b63605030aaa852613f446006fe7cac657d3e12e5d5f9fd80b5ec6f88ccf6d82d3285f042f13384452c55edb5871561bb0677abd53032b25828140a8562bb56b5ca06089b56d9c6624a7e91c94e1f23ec608e5ec45664cdb88dace84587ceb8bdb62ddec8edb213b2bdd26bc44fb009701b8c0ec2bc2d84beb9408c31e220b2cf07e9ad3f9fbd7f65d91773f6ed555620ea7c3786a9b0edfdebd985f94bc957362796cd0c222167175ee1842e64da5d33705c591c5551a5ea9995c41a8582120aa9a2976e7d65338650ec1811167bb5b7e6ed6617cbd78548c04a9b4aa552d9c70ee6161bbb57ada2f123b66b2614f66b55b427792b676868ee27b6c6695caaa492367d6e63ceda1d89767a24a077d74eff03e801a467a8142e7356498d3244330000000000f313002028100a8783e221a9682e8bb1f614800c7d9452765e2188a32487511042061962100004000010011899196201c04fd21b3fd0342259bf8a4ddcbc3b15c2d7890e5ee0e7c9adaed3cd28e45cc8001483a2a1a5e682d5ead23823989d9ba22b0b268185634609b007a67cba32729d420b6f79be4becb9db9fe70af230703cda9b0d2a982f3ae7e990c14a68e72e29289694539cc9a2f9f86d2b8ae00648868b16e5c618ef0b654631bb941148f527b1b2a24240ea88fc84473620084dd04fb03fe5eca287575fb0c20505f9695f9966249e869a9d0e6cc93d8d6de311b66fb5a26b19b0aeb7a3521f3899bf345a5beb39c4986358c0aa93c240507978ec9f554c2428a97c0d60b05884e0de98dd671ebd7bd0dec5dc7e1c2a4cab206459133406de10dfc26d1dacc4c7452bffe4fc1eefce64723e67de2348b225bdfdc69af501d8b11525d12bfde20ca9366f6746b169305279f65fc357b1abd44ee3bbefc3ddf0a29aa2e10e586d368024e7217420e2a35d0a2ff0777f98fea7fdc0de419dde4a18dfd6910fbc8ee6efdcdb57e14cd7bcd7cccc34017c1f2536b5c045360b79a8e440ece9defdf60bf5f116dcd93ae84f7154682f410d7d4a2997702188492c8e52054508be2bf212689177c47c9fb365d2b4e69b5314f6f5150b54f0fd033127a20ad45c5f42255b0e0d00d774d1f1da88a0768722b31736a626b8e75c082c408c874b83888f64435851a8ac98ed384b9359021fe453cae046218002a1405a047a3c94cdcb46e45d0c1854a5e4d787de09eeef4d2094b3ab1f0933030a58fdeb984e27c20007bb21719deee965e104ddac9ded1d44bd7757abe176bb42bc5d24052470a543a4846062d900805eb5de1f2470e2489de4aa10f3ffdf30d8f7a8ecb9607de7ad41dbe027e168814f3b94d414193c34ce775d0561dc78e5549d2fbeb08281d84ed5721678491d7b08caec995908a6037704bf2aec376d07247aa9578fe81918f381deacc2a2ed773bd94aa46738b42ca1cea9cd0229d86f3cf8936ac98488135daa8ea5c27768924f82c9805008671dcb26b1fce419279b101efcb925b6d33fc2d52c8a52121522fd08889f082bc776e7285fdcebfddb97932c2448fb84c15d1966affe4affbf39885c2ab4c7ea24ad810a4e2603922b2a5dc741c33e54dfaa73569dcedf48a6693f916dea289b64a17ea2d6627844beee12a6e39fa955dea9c8d22bc92fa577afa47b5b756b550221030699bffa19d38e1de6f3c30de8e8e7676a190530717ab0f93b82ba59b348c9d4b27799818dc424760b9632526187057242054300a8a0bc6391376f9677508ed73acc3b823534b748f43aa5f9df8e4ad417ef66cf56bc86f6eae430edb83acdf9eb9a76315f22e20b15cf52de70d0aa792a08778bee815295b708e0ad08131654e30a5bbb2eac53528d8c47dbbc9593ba0e8a65a8b33d87540fcce808c7b003245bee723da3bff15f36a9993bf21ce61be23bec48b45bcc73d731a91ae428b14c411af6ad79aa7108dc219a96ef1a70bf3765928b2fed2ccc657aa784576c452211e36595576ca71a5b7775497e713288f7edb41318425893ac1161f2955f9a2220b03b0217d183bb06efbdcbed588c60538498fac4130c9eb3d983451508204fb08e796f5455fa84f110548cb639eae2bb593646a8f848c9eb33329a5329fdba716b7ac74ad08b396fcd70de9f2a272abcc69d0056caeca44cf6423e2b6af901bede0e115e002456fe1a29a162bca8609fd17501193c1856510ecad97cbedf020b9d0c503416a984d205e41f6c1b73183eb38cd6c7ad70252206a3788f2ac884c88c7ea3df0dd976a02129caea2183838a92e2a5423f11285d4eee8294491be6f67f23fc866488e22743be9207d624ea7b92623a1fc32e23fd9a29d19d4ceb1bbe21708ff53c047cdeb99494f6390c4a58884f185de516461ef8acd2818ff277c9bbf4531a8a0cfa0d7148f0e89be7cf7c44cde411049dd72f6b71950d63ed3b69d895f75d8839c54c5b67f7e9dd0d8dc846bd3f7867040a8b82237b0e19b126473e179270bebd62c80a772fa89c4fe1a8f6dad4a60a9324192c2435f2327df77418979f4eedbd98c194f8ba0f3c7477f4dc4db150f4923c8399e3242ebda26d5a0810345b322ba254eccd87605a271552cbc883340a444ceed8c45a1c4fcc34436eb403e2f68d920834ed156642c516c5989087010a073c8db08379bc0670ad31291e86b7e3f5e39d0c4b7014984efa0c6a4e81be44093f344980bab9f57c7f10b82dbf3098cdc55ff1aba229b3ea554be35529759c4a2a9f680aa719b55eb157fd8ea307998481696dd4d7c91bfd790c79650061890e515bf8a2fc691ab98e683f97b47ea438eda58dde22410b769ad8042cbd7c6e77cd858b6d40152c26c221adc220e2bf0b1a68e00410e099aae984c4da1c115e598c4b45c4b37fbaf5e1c17a00a6350c0983bc5618995c38ea4d154e40a57e67f7009440f6b3240097fdb89581b98a9502d83c8c7f82b70003374c4594ddfe1694b39287960fcd3996f6b6ce332bdedf21c878dd7eb36b0ab4d12b5c7f3634e0431520f50305172a95f442533e46de0d3e19742c58515739613f099e3ed46af67892af6a27c7bf6f7a64acdac2e37a1b142083cc5b9d18677904b1cef9ad8d5c9a0cea322872ba5f663b3e91912cdce88c0fb69edbfbda775b77350d039249518ca1c6b91957b094a8a8e24c172232c342f5cefef0c84e36b125e5840323b72e7e1a65b78e1f20594512c289930d10de8173910ec13cd72411955cd8a968ff159acb88ddc128896ac6c99aa20cf31094a8497d60581a4ad19751691c7f538ecb6d42e3fb269776b077b4be795e41443cb7d2784492737eda721068e8ddeee4ae36a7b33346c43eb38ccc8879bd0043a24cdeac4d796ad7386044261513501464409cfccb847eae1d4f361bf10f62ef906c1d2e9aaacea8f3b96ec8752273fbf087f9c55850ee02f48c964fe2d03587a380a7e7b1e1507d2465c308ee3513be4e57d03eaa797d65ed0c533cbd1ed2cfcb8a28eed4dd6fb401d625f993faaee88add2b7e89dbcc737a3043622cfc8ba559b595cb970859441e7457dd2d085101602332b22fd32a425722e805951c8d67dd8b22b4cc0b5984ab5a80a434c540390edaf47e49c3d048726a9edd8563b0cc7384a94c32078a3be224ecc9a11b337dbcf35a4249d7fc3172edd3aed5cc46dda0740a9c5ec07ccc843e26b32112c14c7e9af8bf2ab4a930a89400b5c08f203667b303e90ead67b85dd0f3ddec96a443ca2a69dd89c1e4425af00d78360b7a994e9e59835dccf155709e97ce0e94ad2f7a96ea1acb05cb1e431c9cfef08d71ecd17253c047b2fc232be4215da8f6e58b911e97a6f131d0a9d0c9cc4fda2b396378e437893bd695dd83c4d51ba63a162fc644fc73fd2690e38706e444fdbaebf5743af7b06b165063a18fc4e6ee86bb42b9d135553c4b885dce0fe88b444ee1cc7abce5279c44a3961d43ec98a5d4e5daea16406fef2fdd3e14516e668a7619c14d6c0e281b435a87213ef9ca56585a6306ea2feca8dbd6c228b75b78f792b6a695d8bfb7e86bbab648ea79a6fd27d8aa01d5e5a60b2162357ea25710efeb3efd47c5211c064fda2e65f34d402f39864eea07d7a63a9b01e634f9e946cf04471858ef25054c0e7436c660572306d07a8b908a27de65cbad1bd3e5b034bb89417a0d57902d8b1a0894c30a797750d27f4e5fc0d63ce589ce200cc341bb34a0ea04d88ad592c561b469d31eb36e2f7db7a968ef98c458ad5dc5df1d3fc8c68d29345a08d1cd548de93a38d15be099935e810f00d199c9fec66812307c935d4fbc6b0f66cce2885ef0bc291fa19aded14315c9adeda45c011f77c2406cbc9776d1356f2543367640a006cc398a60e59ce6a0555365b77dd0c4d5a89488b4b113b00aa09519f49e4b62bd11cce8fc623cf03c62e879a7d2eccc6e2f897abad1cda3a16854a2d87fa1bab0f3891960ed64278ffd8d5bb8ed9805b32463f7b501f46947709eb81f3333c4315de0b31048832056658c3c79aa741c1365fd653dbca4896baed3b9e271087ca897b38ccf47ade94d73b5fb6adb28d273f31870b5d5a6c736ea6b7e8c6a7f718cf735e0555157c10357a55d701021a7ef3087fcf492960d8ab388fb0f5b4e02bb42a1fc30c262823d0cc3c0f0f7a86df3fb2e4c900d9d3c67daf8c00c01ad2ad34db8f29a26a64c91ce69dfcd50e336636fceaa110ca61ebbb5efb7998ef742af221dd7d06137c17a76ab2ccae37ad03102c12a7e73479f5adf628e33feebc51659fcc3f4fae02083a79e0eb766aca0789080ea4ae9a43e2a6bfda7ea97795c982d287c1b31dff77f91910008dc9ec28dca44ed7de5d3169b10615d53ee67a0b1c443f434d196b42ce040040109bdd5e2f11fcf375b3dd6d3b49779bdf234c06fc04ee0469d560cc943834ee8b27f106a102ecda5bd47e1df05eb1e2ff5adf63d68b5987221445c9192ad97a9534b0abc0ceba3a994eb85b1a8f1d76aa03d10372a995edc682beb3278761944074d0259da8074bb479b881f8ee4eb61b1d7de436976e3803ff595afcdac5b5497fcb9f91cde9bbbdbe46e4657339c8da46e4a9ac37da66832758579766ecb4a8d9191ffd833459eb0bbfced51a58afab7ed5b03d86b3223739da6bd22f2726554156129c49f1710d45d19e0e98a397df57b08f14a1d5e56c726c4b91e389ee2416cbd7a9f6a7f3ca0fb675e99a145fbcf6b4af22d30f2d7247ec71068230c686009c5456a4f0b6a841b0961ed0677eace3ce19dc82e2a622f83c0a2381f440136b3ce4cf049300e875504a03b51d4587ed7d0b82bdf29b0708bf3185aaa49847208dad80f700f27090438a51aec2e28e115a608d2d801d55917623a871dc0bba70f44ef1747f2c46ebe45985b3f72f170ddc38b680e4e23b550689c50ab041a257c2c14cad8627f66803733b5efb22ade1ba83ad9772c83943a11cbf9f2548decb51389744bbd1139184e744161cef0654bc0a075bca09b12ee29dd2cc74eb16c843d0057ae9945fbaad83c8ad6380f2eb872b38cc0a9ec06ba5416fff29b830e4616307d753664ca3ce4fdae1c70c738f8c3c2b30291e545c5265e1a1c7c923df29a48284450d420de36a97299d3e572513a54af745386e4f534b3985c38af83f1627ec94b2216a16c78524a44d76015b0f4d40a5a07330a7af51609fb937983851f7c8e18bf249617ec54c5aff72420224952b90ae8baad0837a7479df7975a587dea09d4efd4879414e572537250865eb055b7b8baaa1bb9f8e49e0ee1143b59f1d4342ee0e09f9c06e15299c38b9458a5455d86615a78bfd2f01d057ad36ca153cc9fdcfb4b904fdaa7b0d05fea2d52787041e7e56d808eff5f5eedfc7ac34e596de81b2c03bbba3208ac537bd2f789c572467f7cd6452357f480861d50e7f6a65daa69de0b80b04a235f1545ba1a5d6fb9cc3c12c1758d4aab74c36502fc8adfa9d7722d2897c440d09d4ce184a26daf58fc045d1e979056f9eda46c647ed8d319ad80d40db8b5f876bf02496fda1a96cf0d1f521991ee14d7b33e53bc284101ee662bf208dbca97ca34bc7bb1f7578faa3ed4cdd429543826399ec78d8e66ee948720faa1b47da269e3264b170cb2b5c222d649e33c21322b0fcd499bc59479c4367067a489a1c58f71dda0ebc8ef9e326a74930ce0ecafc3625d4f60570b4f4ecdd09e78c482326e15010a744c0723cff8104d9fe06b722303d78a6f5c93ecbc13b1a333a33a9c5e8edc7c19b6f8d75b568a977ae82710b29c90e14b51345be70cf91f76454c069527e3063e0e8ef8610f7d96801d058794780443f7adea60a706cc5572bd3f89115b7f8894a14c1706b8be82d494ce00be02c07462899b08b0a48f79a88451dcbac39038acb2d3d921fd74498f1ca76bac45b61f57ff52522a02594c512c1a8c347cc27c27456e6d09f41ab7b36ea1385285111670b7c8a4f5435b866172f09573c9079c2e2fc741c3793c64313f1c1704b6863da9c60575097c71bf87c4922ed541090db9dac45165ef12703e79ea0a60414aa5a0a46a0e3d766190cfdd7a9d8404b2515d4d2da2140ce080fa915d981d2514c0cf2585e3ed96caa0648d13e2789b9d56106efc965d12dc773a5877c7fc8e4065e911ea78f9d4884d230a14f493638b0b4670ab4e554d0e73dc4d97961abcf846f9fd731c6e58e8b6c2150f2ccd21860002e781df60ec61349a3bf8b4f9b02dba304769e4ca8184091fdbe503d39a7ff025fccbd11b905b8d1b8d7169f5125b7cb1905cb7b706704581a80ed35b9db3a69758e3a86a4d4cafab286fb4e4acf9377797d66a2cd467576e0d85d1d8de4718dfb47638674c2f067e0e6821a70f8c1e2f71627af8f8ef77742f0f517249a18fbfc10328f06b323ac78ab34c4a7240ecb7553824c29ce81e9c3c690fcc0059910eb1db59d820daf5f96efaf0db5a7017a31c4df8abdcac9f8847c9de166185d1ae85a06eb408230be555caec70eb86fe99c09b937624c651bba716403259d4555513ca583d44ddd45d99848a72e6ea76202f23db4a127a02ba3ecc798f7da2cbdee916a43a04c1bebfbb467494b312b799e6b2d911393107696b4915fc46a092603a0224edd632769cbe5034c91b6129f8aa001aab64c713d985c31cc16a91103833675937596be258689ff2038fe3764fd6a30c207186465aabc1edbc808f64086f17d894648261e6f0a7815751b870806268472916d3def0e78642f2baeb2067e3033171843ad7511f44feddcb1a79cbceab06082a429bb5e98478dd8fd102a0be302a5d8f8969717c85bfacb71d385bd0c45f6dd066d88a17fab0b00db6a81d598fb14e6e41e40a184121eebddb9c48c4654653f2008560b6f65912f4e07e12a33656e60411eef6bf9a8dfe56e61572b004954b44ec5d21b1008b11f550743e0d1aa7005f56906ea2918c977896475c3dbb260f1779a963726c46694ca44cacabdfd96ba7592d3a6ed58d8c8a55a455c3824701202185443737fb77043ec91a1ff711b5c087ab1ec59c5edb2b4d291929307465db38aa7f73a5d794fb4bf76723ed866b8d338881cd2168076a55784c04579040aa8f258ef7100b97dafc47c3368cc48a35bfd0e19642e4a4c46a16e2caa229d77e8c439f81db451e905ed3e4739c7844d9464d1fb2649f311547d618e6d8ec2fdc124ae8734ad87462252c42b5ff1ae00298d29f043f4901698aee29b6368d93ed1a90f220eea95189b887c0a6e41f3da79042a5a381731c99a141b834010e984c0ce83808e1ef9eb59b8f1b469567263e83855d21816c37bfb6600eade266ed878bfe7581a7667041e3e8d64b29ee0a46df1aff86184bd976f53fcac6e804a513d56b633cbe62623d053748130b673581302cfc432f5d45844e706d1748b4d0f863b43dce961b863cddbb5bf7b9c50c325d2f3705e99b0812ee5a2be1c492c22b6889ee6467ba0d5bf171e06e714e66b96d37e092a715197bd7bd94ce41778586ab9fe8b37b28703507f0919e35aca93ea2ea6104e739f661b28ac182ae2321356c2b4c6f9ab38e7815ba46ca866db4c5fe6144bc29c1da820d711ebe33a79d14ddbd1657b565c6d72468a53bb13952205b23356e76a93f9b036f8cb41073bd4b3c107f9273e998972989881f97e52806af4c51405a0c5d7ded1d01baf78cab4d3db680a181562b9f207c6e0669f36edb3a10f3b67d100dc98647f67ab0c91d27f11cdc0634adb1c6add587957ea9540f36b52b8c020e25a55cf3a13b495cac002137f466dd09eff8bd7847c85e64d272aebe707648656a3d142b5b0497245e2f8c6b1ff25189ed881dea9d684855d3ada6919851231b0e0a38378034552ac369145095b5d0a2499efc8b3dc7ecee49d229efc26131732bcf6a0976d028995b73afe81884b04823cf023dc143d31153c2a6d5bdc541391a0ae4c2693b13bce90632ddfc4c03b163006942a0150f0664f2cdd3b942878802b36ed2a3d08fd9339cf74a0173e2175dadb7529c18b4d3e5659f9a2cab25833511b385a6e8b43cb9bac570dd0054dfb558ebe27be305ace9fdc87192ff520b74c014052d695dcf6488ee22bcd499866c9120a15d8a17cd5008da1d598abea55c1c19cebe71d55da485c528c033eac49c1a7b72456f2ea5bfe13c8fb92bf5216e93b974d1cc548a1a2c6cf7151644458119bcf07bd63d2296a80de404b47b6db7f8fb3238e9f37e92e11a94ba66f921e0fb10fc8f8351f99ffd4d0907bac4d4ba4168091be7760d36e37a67cb91cd158a2a1467503ff72fec4d46365fe4857955c14468ba50d7c11cd5a2cf365d2d5a56b200c775ee30fd2ca63b890c3a4aa0357fac2fb7e851999a4443a2d7428ff416d2f7d6ebbe0007349b64bce5b9e86816925bcdc01cb7dae8967bd3ac229c81b719d44f0d779ab91a796b6794197389eafa03b712eb4ab10c2d623395613e9a9ead92f2b4450a60ca02396a18a3fefbf09ccf7f62f3331f9beb949d24788e0a5bb71e4b9fc2c2d5965d6cfcbb204a3ef700a0f4e32a26309772874d30e3eafde31eba02f888e03be9ac62f78ea5c8110b8c54f780d0d2aaa4f1f61ee9aa2aa0cde5d0479672d6ee2b296614ed1b9acc6b317be70bb98d8c06b0a365eec909e629af73ba2f2658d6b41598cdc5473ccaabf614b8d72ef44f9a4257541eebe7e8a02214010c4269adbddcb47a145359fdc777c68bfb1c691e2cad914524859b3a47e819248777eb91713c325a85dc81407fa68cd26f50115aa0ec97ff646ebcaf5fe6d6b1fa3b632dca2dd4b84ff4236ab528efad8302506ef96f98382f998dac59a8ebcfd34b073d3d0a7f4a6139209f5a425f8df1d695ed25c9840ae1b8d104a3dc7d26b862d1f9decc61f7e73e8fa66c8848b448a124ae09a57b097ecf8e9b071c52fd36558f920d3adeae92d92273a7f9d4d38bbc043e86b6ce7bb900d58bed41b6b8c7b43e5aec50848f26ea9eea4f4b8ac7cdddf93d444cbe5aa550c6ce0686b653dcb420da4378e9dad62b5052f0d79dd9a87c4dbe742c4026f7fae4f85ea308a3aca866505bf18df5fbc6c5e5accaae9a102e35e91bfa85339e2988030b309f550a13e96df47229d85760683e2f83b057fdc5b4e23da18917d31b1b4e5660982e0491ccd3fbb3a5207548ae085a0a72159ba94e9a1f2a9ec16410e968e567542079a30832b784a33e36a7ee0ac6c819514243625e97bea723338678b8eff12fb914f658f36e223a17410a7a727847ad9c30bce6e2de9311ddf6ffda71bc03dc587b3cc07171c866549cfe001d20e802051f11c6c4e91a1d30d752cd7d9c62e76a61c4de418fd2249f7012812bc7f4dfd071e9cf057280f34ccd6004aca706087bd0d78b8033973ae5a1d946d54b2a3ea7d77f57353b20dd9599e178d82b1064d5759faea3c9e08623d6ee62f30a23652bd4a91753cff77063a4e9a9538e0b150014693206fe8c633ad4f3ec80487daf1745425196649167b9c0992842bae4b29718d44817e24055704f2c301dc070b04884e7253e7f649b1321bdf965cb7f344c0d1788ad527dfbfd07ce777d8a6a24e7d1161bc50830d55b5072bd8d7f20058041cde6c41d9fd60ff989c788df202684c2be4d9938d10908af4c90a964d246d1824fcc5a210a445ed4cb50e895b262fffc2fe8634e8ae60a5f8707da74982039a5f85929b2834670bc6866de7f6c3ccb9d2a4eccf2f02fb7363c74a3badf4b85adfb2e866f14f8f2ae20475ed18a442c1cd87fbcc88c69a581d2c95df51ae9aff8a0aac0bdd1a49e8d2c9a8972aee5171bc632f1df7524c62b843ad10876803070778d528ffa3d671fa21ac0a46a4d75137c2efae6004093b306c30358c4c315e5a91d751e7847c1ec853e58207c48b69f1fe7d97d5a7349b91b8157dedd42bbce113f69a750e2011fe04251eec05716bfb9166944a39bd6eb35cfdef4077c9897e323e009fc8735ca29e01c91629bd1ec29039eff7a509be2625da42edeef3ef2d06cb7b60834b2646adbd49f06ab837d0e333b48e18b47fce0cd72ef14e14436c2129382fe398022f2bc6cdb28663ffee9b09ddbb1b887fe519ef6dead5c1a8f4e37a4913938b269e46659f19131174e7619d0399fe79b8e63dbe26184af0475c6a3851b4895e2c88597934de7a96ee2944670a025d439a820325ac402b4e7eaa70369d9e7b7f39733c6cdf5598fb3deaebfcf88eb75f540e77fbfc2aa71d9e45b97c5c8756ed18f8cb4bdd1142ab4b460ae037c9b59f34ebb5ee992706cca416023ffef0f0bf109abfad50225b2e332e947c2c005607433000c716d022b45c797564d5653bc5b528940476619f4ee37d20644cf96acd4e232ef5b46fbff2743f8a72c78ef0945952312b13504a5f666b95ee86b56b0418bae356885da3435d300bc1d6b66aa5d6ca854c78fd54e83105e8e012d8b46849ac153928fd9deaa9ef51e80d62b0b7e15ece364c09cd5e4b9f9514928abb83b2ee8e006e5fe38471104904835704b6c68c65569354fc9ad41183baccba497af99bbcc8ba48feb13ca93ffa91dd966cf4f4043bb689e5c1ea74f0e3f64732276b20043d5278bd60ba31ee4dc4fc16c8d53b55d7be865f37be4c91c16c829092c159d38628982b6041fe168d986d851156d3a4a92a05c9459ca64890102ac1896b96526b150b0887a5e04298b2c53afc781914026464025ba3ce81e6bd029853b5d2e62c144826dc91b070fe5ed54259e90b75f9645a83200f81dcb275f5a5d03f4585c458b0e501d129de165a6ae2d0ae181d352a1297ca84211df418d4d3f2be26261badef39ecc9ecbc37494bf84c5018e03cd0d6711bfb48e96d3426a672f8c167bfb0819aec10dd862fc4d24d2d3365f01da1520766f21c8893652337905ba5676a63d2df7d14534ac0cb0515c36f37012be5c834e97aacd1c1bc6a70db7337882a9007761c63a9c918531d34e9c294ef71b535e618124086740850223565ea3de0888a49e10db64a9a1613688136733284b189368ab39a76a2177d405f1516aafa0e5afc18603e2b24ee02bed40ad0dfa59147aed1316600f1294a197744bdd84b03949c9fa227790ae801155b04417f23aea5c97121458d85c27efd99576e21c0279c772808094813da4cbd9365e2b873f1577881bbcb6a29b9552630f4a42c9793f5a8d3c34364841a07074a87db47420b0dcc79b2b920335c2c651e0b36a94018a7a418416ace8b94586295ecb96914edf9f0100e71d6ee41073b7072426ce01e33fd2d69c9ba5901966741ca247e94f8ea87ca2ec31238ab90a5a2583111d54c835fed2260aeb9db138ed3ea824ca5370ba1c9787495db0dabf768b3476234a6c42c4b2f86c80bb9ecf05d88433258e5df26439880f12e488b1943a1ab6a42af02594c58fd344d836879aa24450aec24924b39cf0036dddcb9c29b83b10957f7cf67ce827428100097a8bfa30c6a28b7be8932ec132f0e4a811f56865ad70375c7c9c8411d7fe728eb970a9caa44911e067dba0d7b9b9caeea96ac9c6eb7b226bc9587bdbe48c12086ac7e8171e969fd18aba867f8a8b58649396fa43f68e7c398f0d279ed3d6570d4176c87a7cf20193e7532ec62f45e82d9a031d7d1300a7253afd6183a460bf6452970a777612bb3dbaad75dca1189dff7caac121a49ea10029138f8c621646338ee22789c00e0370bfc88ceb820cfaa90440f8cc382a539354d9f2609e689345ad2dc1e22674c2c88c934840ee985233e5af0f9a5f6b45f4e632b99b144b8e5788b4e2135c7d37098cd5893fb70ea0ab00b436c7ddda49384708563f04b8940571c720784188aa8f24fe9b0307447faf5bb57259c64eae08e556174a7d10de312469176d021336326553297269c1794f28a409a70cd06c0b373430f1d20d1f51ac7a53e02edf0f1f82f95e2c76d0ae6ba21d7f50c81a951dcba26c827a25d757ec66cfe39366568e61e73ee0a3778338894e7207171d5870e1c91944b23b19db36337a832ba04bb3dde0f72c3109de057d3c05e13785f0a9f96fca03ce7a2c04cca697f2584a17f4f5f10f217049a8e0b4472a8f8ac4c0526c7ea7f48963254c5eecc7aef3ad6649444b421006eca5ec631def41f660993f70c581bb986eb782be398f7f4f585bdcbabc206d8c79740bd35fe75a61c7eb53a9860f88c29e62b46beab2f9957221049bbd925aa267bbb3f60f56410f54c2f142dd3059c34ca8e8c7326a687e32d1e80a98376f7bf2fc7c624491034869650a878d6206721105d142c764524cc38435cbeae98f362cbdfdf023613c4a70c50807a7b391e3169eec873405804b5e63f95f8b05359b29e881e892441ae48c6f1cb465a80faf6090f784626507f0ce8156a52fd2280531155f4ca45230a646ff960919b14f86bca0a8af817e1031316497764e2b5002556000627afd3fe93e78cfb2a31992c55e407d3ca2f6cd24bda66202425968f9c69c17993a22c19b3fe22b8e2ea15bb0ec171efd28ca1b56c9b9b17302f8e7edfc654abf5f06f2a3296e5d97e79c93ed76d990f34e90ed0896ded51b30fb0f8c1f5ca63791f77d6563b1f2c10249e2452ae2f0d860167e8e8be929b8f6625f60c2462a2972291b69ff92cd408eed9fa0de2b73f8b9482b6542975763f98a67819895fbaff353c3089f518ece064b10ee405b42139f40be277958c3b69830fa62e319b5d244ad792634e3f485d174bd827c1980de46303e61e663b67c1cf12431063b0d07220a93528035035d48db5ab7ba41a68e828ed4f8b9aea5ce982db74659058c98b5a70b7089431ec0ad1c338d07cc995965376f99a61299a02b0668f0d305a25c0e352a940b50ba0f80d2d8b0f6f069e84ce984dcc523a4878048b8d9578160da24ba8e898056b7b08a5881fc71a010e0a81a633f3c4007993b9a073dfb7afac4b5abc1cafd93468d241b17c0b777d7066d42f2ab069270e8f16d6446b85bdd4f6e82a028228e925bd25a4a2edd840f18707152f8907b6c3ae230388b380a26fa3ffd786ac09cc62b46a8c54e1a7aa3bb1b1c2a2b5bcb7420c9a0b8524aab1b4edf8cd012a19acca1b5fec986cebe5eccb7d7a0d89bccb22e831e04d17652b49d78e1e6ad6df031bca35f1546fc2a9c9532d1b7b232d6cad1679a04b12cae7dcb9533c750867b517759e2b36fa1bfd228fa4bb9f146da8a73925b17242f9421d3fa1703e5dcf8d6e2a6bf02521778703fe9d96f756025daaf283fc529c55ad1d7a15e4338bbd03bb9eb26b5cd4efca8e504efe55ecfceead922d1ebb09c7e653bec229077d1d4f5cd118bd1b21de52ad2335899872f53e93de6398961d84809b27e614c4af5cb1980a338f1016af3f39e5b32fdd67b2979f786c0bddc5ba08e85ecf563afb66d45ba72c83fe06c91086ec44563cac96bb1761829dfed672a673bb9c5efce10b3b4439222ee331a8027da66f427b2abde0af83984f86ca1a7fb29e85bb2c9556fe5cad1bf603c66530b360b87cbb63e2ddb684bda386fcd457429db1c79990b6d7bb6213fbbaaa5670f5c66ec034325395aac68563e4b5620dcbec78500be8385621fcdb8760b77e914a115953b44333c8633bd6abd1d06bb195387fb909c4d34dab55b4bb4ffc5212561bdb874fb77b6ca4b2003721e3220de5eea999e66014c757bcd3672c3cd6d0052b2bb74b85318f9b811059eb78c01ff400bc43f45227f4454e375ace252217e67b86dd4f32c23e7abbf124614c15d04e2ec5c15a928142af95e25501cd2bbbe7ccef5fdaf5c1f1047e9f5a2c63768066d750338b41dbe26c8fc080f696c314d04bfc7b17fc4c1383a53146a5812d6f4ac13dd529e7397dedc948e0b831b11a9c4940d00ec96a31a2d4ceafa9eeebe729d6a47638f1d63ae132553465cf2856897aa6b5413cc2d079c2d4fad24a7dd3eaa7958bd3f2f3c0c4fc6f8c3c47c1ff20833c7697ad3b7590fe84c79db94882a6e9f1b1cff09445b98813f436ad1d8c64cf778f04b23632974c155ecf7dfcd975824c0596be6c94ed316b8df5aff85e59c854d279ac3629ecdb1444d629a358d9a5ea63773f5c4a8b4d77d4e636cde69f5249b3dec234d3d86cb5fa80726641ba3c9155fcb54e658283fc6b572cc5177009845cb6937d64ad8d0b5938ff38aa0f13696365f9775be6f686eb9820097d2a653f621c489c709e6eb9dac862019e62a53e2753ba2440db463983c8758de32728443739bf1919b8febc8399c4a6c867238497cd77cc23327fe3485645189ae2fc812209619ba7766d70b121e114b8f4f7541a39f9cdef696ff27845c2f223d83b005d4d9c0b1ed5ad600ea7e6108a825149b9da3d8f539be9692f1b7ac25cd47875753990fc5809366b18a8eca9eb5ea92f689eef2de45649551195323d5a7b6d88c19bf41fbdf2d2f925f128388f1024c3af5e443d62b32c5459a36084fd3c5345a7cbb2d6846d85cb6145314af168f93f755775a24b5dadad8e317c78723778b0fda604a86366c0b88e1100fe2fcec94cf52f990f8d6c14930181b2d51b222397f4d773497249b136dcd2d617f63bb2c93a22d0b714563599e71fdf2971c083af0bc358304b47590afb57362da18cd56a3623af75e71b794b7cc15411c53806bc64c927f740c0f5a42393e4b0b12128d53e96c356bd5dd2a141ee1a4d38e7c9de7dfc33b1c0abee413a5bf58b04124738744fa418babf1277b44e5b59220e1cbb69d18ab9b04395da3a7b94fb8e94012d1293167e27c62d755b10841900eb4562d7b5ce1e533982cc6a93ebf6d1da8247a34fdd08024ddb660f883d4ddf336408d281ae8106290ad44625da4d4817f530d390852a3ab85e818f95c0cc53acb0d406562ff12e8824ef7e3e0764f1e337ced0964b4d3b7ca81f69d7e9830034283dcdae33335f5039a69f7d551eecf10ab5f4865ea864d7a49e36f35699a39f12b267f6544c1a39abe22e29a84ad1e3a5dc424dbebc36140c6ed422aca1807431470b8a87e84e30199248378a7e10094eab347f8cdac8d07d82d21222cc5f5ef22b6ad559298fd45640ceb7bfab3b9b287d6549964b31953ed9a161d5bed16b96c250ff4e623bc13280aaa96282aa7d4f6fcc29916c524a017adde84025432f80bd9ff01c9ca904de4e5c46d55aed37251c2b0bef22b12cdb0f644022f75ac377fb3ecbf4d6a349fab7c9f4a0a4a711fd28cefa1b6e58149e27521c66f890c4cfd53c9d5d6ef66e8e9ef74198f25fd52490e980261e1a6c809084546a9cd939fd6928e306b9cbd6c5286f3e873c6d912b09ccdb4fd6a10254489b1703c9d4163156f5f92b845298c54f2811925ef506e6c2fff55ee73f6e7197f16d5c58edf7e56236dd486cb054a9a3ffb8c69a2daa265f3291270be48a7a32fe01981a9978dbf6919b2601951d46d5315b20cf53538c43305cee08d5d1e1a0014e5b1b49942c5774fdb01dbc93ff4f54e6819e1785b365f90aa854664f917102c12c39d9952b99544b56745363a0fa54b5306d29d219ea489e84f3c8196d39c07954bd65e8cd8e960554781b3f3e9ce422634aa97aa59126ad141f1419c07fd11e60ed21b80ca1f0282e5ed108a8db84f48f7a2f999f272c15813b01d0e0b082b29f4e7c5cd8e44fdde60203c9872805ead8b3f00155953e5e1cc27da9e19e1036ee4b11bc24d64b5149b2ce1015a2825f0d3a3c8b2c5b2d7610f0291a18e98ab22a78fb7918fed1fab76d3c3678c523ccd89e899c59ad0ccbcf761c4f1c0b048b7c19814e97b9268c90356daf84ac783a90e8e141b9df93c8f5d2450976ccda23294ba00d7d80334de1783038d92d1e6ad7f206288e4e08bcfdf52eb4a36d0fc946bfeb5055fa50ab8d463422e69af604283dacd2e4c9d345531cd695650d5978e999435a124da9726a4fe32140bf7e38b673cd0b9882879a5080826c6228c4fcfd47d5d427317af6eaf8b377fd34f2e7e6f3cf0eafcf9a8f1b5ec6036dc9afae2ca48c7123f68141097ba8ec441b4fff40903c7625676cea66d9a7a38c66892c5efc2c8e9dfe45821b46ceb9a4838be1961ce214e8bc4b8a6853a3aa18fd779461c03cb1e78c49ad096c6a668c5d8bd66f660dec850dd2d8cf7d43dd07518c9b810f633c6f17f9198ac84658704ce8c199c4c0756279b0714a7c63adcfa107342b551369bcec7e6e0d9f5d1107332c230c513a62452e1271db8d030c4618513e6bde4d8ff45364d3032c05b78cd59657fb6612eebad800c8173d948371602192035fd16d4a5602c3be11901f91550a6df1876cabeea2922da72576ea96e2ed08ae338dcebd262f792bfbec01400b49eb7b25c2ae9e2ee5765d34603b6cdfa26233427d244cb5292b601254bf6c20512e95f066cd9f8936adedb5799a4c4407a029a05c47f3a5c27298072296a33cf40d4a839da080a73efc4d4d1f20a741c15b76a4612f4d06cc5be06561866d83e59f9686ca812ff3d143cd5a3fa61ba3d3b529b87b52ba8c54369029d3829c041413b4890987019005f7b6fe5a68bea6599d92d9e5efa84debe202bccdf1272781e8708680e741667e41ef05939ce63a64f166bac7740084893cbfca6dae002c1fe79a729346df4eb5f95f56699744452fa016ca31db5c2cd4e486504f136c4b85edc853de74328155da9b4f5f82920bf5c3aa0ae4b8a5590d5b044de6f7c75159dbeae65b3f4c9c0c6a5a336041a665af388b78cc47785e06124b94b43e60a0597a8d48b1ad579d7626c0be28415f5be047aff0208c86402c738c27bc9f55a0907820f1c01fa8861d2686a27a43cc660bfecd1e016d094ffcf2c3320987f95ea584d55459036903a3ee9d051a4a4e640bc54a428a1461210c5d791921c753d177a0e893f2923ef1f2ab186d6d50faed1a58f250dc1ed70da743302455bc35bd3e5c14979189959ad80b1f0aab902183c4b9d603a5648e9ed7c0ce06e029290eba39ca117e4054b325a07a450bbf9243ad41730cc58abd8baa68e44209347780296e5b4e48570d61b0399a7d0591e7fa7fe72b41d0b27402800689c512ec0f4ef5142fcfbb398976ef332e189d1480db524d21b90221378c1ce66b1121dae39129db9fc58a9a6cc46a1508689cabd0ae8fffeab4f89c8c27ad4f8d96dc09520a932c0943ad751cfe1e4f68538cff4310974250fd096f7e5cc382fb23e57a0e41f36e8fe360e532530f31012f2e2a02de4d31300913e20312ef1fb5399037cb0f94b71682016e43a4569e8865ac297528ea81e2c336ed8f059a7d5755774c3450085e1c0f4df4ddcf726559919db9a1691a242d910b1ab8708e13135f928c8aad835a962cf3a54c00681a6b89eb33516a904ff64f56b9c7a588b403c9ec6c4675705fc67ecb9f3d79dcba41b8e678136688d3d8f1a20cd328c35512e8a4191b8fdc92736a16b6a49d8227154e15102e2368d455839ae1726d79d9552847559daa878d58af6a4014552b99a86a9edd1a329b84f3173257d5818f738843fcfdd5436ccf6bdc4842056d80e795a01cdf1207a0a63584546064350b489ac99b59130d480d67dd6458f05c8f885d3195cf19805fc81532dc0647275660c37edd9281a904cfe11b73c7fbf3d10ce54a700a5a2eb747c33099a99f509ad0d1f194d2612d42cf757e5cfc115b5eaa5632f9be6414815ccf68e71776b07ffe14643e96b790f4a5e32f2607f25ab97a607e4d09384c735079240d040fee2a42d5961c1a7ba7d8f20534c2c1ce752ac186eca8d25001816017e1ce3694cee80e02bedec172ce2763b0a8c47c6e5d04595d09226623143e2f84897c14c25c4928e7db398a341b739cfe39633bd1163ac158b27da82074f3ac06c17d4f64b112cbafafd1be4d54a2fb8bca4a8cbe216d28e9d8d29a99dd1d891c9b1435a643b37fb841ef98cc450a47404e07101b68e3f70a36431f91a7f4b2ccf63777a08aaf31fb04cc12e5e3c1bcc3f90707f375f13ba95f8a130f89abba2f97ef37491d4690754381ab787d1fa5aab3c11dec093e9c0e194ae2572bdb325796e1fd58a49a557b42ad2c415d4622a536c0d490b04e42d18ba5f0fa8cbe3bab649f52aad2b07f6d0458f86393ee327f703a2e07d7f68c407fd3116f9fecc8534a7a535067823d689968d4f87ecc160709abd54e304c97399dc636f925cd5562b7a0e6c5d6acc648d869db9d99cfc468756488dfc78420b24142503c2e34c0a60cce6bdc196d2ac3788566799ebed0deb52d02f7dd6a1f66d598a96704b5f3abd3b015328d3cf567faec8c579ceccb081a4a1aefc0948ef99e3e2c64119f7b8df43bc4c7603bba1456b918965c2581bf34a57a7d9df1a0b4ab39062b5284ea91106c7de6112290a65fbb16b6b1ad23ecbeebb8ecfe23848c7bf0dc8afe47408991eddc44bf80172d270919eeed22080cb47395d0a1281949659eecf692e7b24695598c7e92d43977a1af77e013b8e99016c6783d7fa1b48f42bd7b1c9963cb4e452839277440e0d8cfd92ebf3063cd31ff662b6277803dcaac168f709ca410ea5914959796d49050e6368c5ba6c5b03429f0b2e6053e63bb3fd05dec306c6687e23709210e593b9248e7aaf8bb24c9d2e77ee14f5c8313fbbc7f72687119ad5bc7912082681dc4652ae27268dee2adf2cf2b9af49b874ecc5c44f3748c0fed785fd5f803ef47bc09b5fd9272408bda35350daf56ebeaa9ee6a89298c387f4e0cdaef4424ce2d39fcee8e87179905fd2476ba42bf4a601d87307af9ffd61a45ae72b2b1d5adbda326ceab88a5d39faa8952ad7d35e571432d34dda546553da8f0647b125d55be0254e5420d626d8554b06e97a3420ecc59c59ed5051bbc9c74b9cb80c870a7450fba66f7c428045d0d5f8754ba19cab6f8446b9b9fc9ac16c2033660a8860b4b36688648662c395dee308ed65fbca9ab5079d350f710402f6cf60010313574adef573bf8776118ae31f5b240af7adf5104d089406ebfcf5301ef66fc47444fcc64b3402b2b8dcca4ae61a7c91a37e18d7ebdb25778a30796013c0fd325796ebcc3e9dff9aa9e33f0f5465c3cefe0e8e0561d7494f48ba6e54e34a5a85fe877b7a09b4085660e4d70fd0d7f36d8b52026d78adbf3d040371fc9aa747b1257c1d77da828ba556d25a7f69e60aa10fa30092f3cacba5b6397c85f150ea5d9710c6254766011abdb190d3d1f20a56fdf76e42c7879809e4c5261107588d91170d62b71e33fb5be9ce61b7c627fa2c630a179d4544c42b29c6e73dcbed33eb6f702ec96bc7da3598f9fb822f8cfb02f31b35000ec4f1dc18b73705203642b72b90ea2a205ef514c45415aad27f5dc51d6c04fffa001ed06bc85be32f7114f42878ee2f947a195d860b9e5eb0c3becd27306e90a2d25d0ac19aa3ff44c225be654610f039935b867e6c2b0a5c4e7fad499d5f6ca0ec461d7adcb2b1ec86536d80e61d2b07f579c84efe798fae4b64e78f8e87a24b9ae66c379b9b7741467dbafcbd222cca441aa6b3c2b6176f3d38ed5ed22bf8842e4a02d6001d85ae3d2bca6164072ec50f02d4559820ed82e71d3d1ed41b769fc722c60f04bec6be5fe05fdcd4c28451805a753568345526d5f1482eef50cda43d598551db7737f5e7070311ef426aa7d09e2cc48e9b436fca4e2dbbbb9d77ed182980a78ca4e5fe5a9d1a7b9bbfab1874bfc0420b52313cf615f9084aae2c9ac977c44ed95127c761e299af697163980d2641ef593c24291b78a21e5e7b4e6d3cb03a26487fd479cfc9ec4742ed85e8b0341f5a1ed7cd4be869a97b5c289d02dc7b2f6f17cb8da7172d123e91529cacb6f1b04551646095880962128989b7b8bcb0a8bd76ef9be9d934a2da250914b1e7e756ef965a47dff71d6eac15a08bc693ef7f6f69b6ff7c49305853d1cb5058bb2a8eb4c71a271777a76ea0dea030fd670d7ba6a995651d16fa1b6c4715110fd1f33ce5e1926bc0e155188bc05a667afb406b13cc3db112a2e38196018f255936a3b88a3b2b83a63145ab7a54426bf00279d0927d47da7fc4d0938a4d9ff3fce55f821ea5da076f001efc19abd32aa7dd237e45b3bd89c407fa5ccc602280757a5c23a3270e55a8acf8fd075cec730db53bbf6d0b5257c370618764ede7ac209338dbd42e7902cf04f794a376044e9226f4233bde919850937d9ba09d2a178d86b1eab21b2cd0f1e6dd0577acb6277beb22736c81a3e18ef1d59a50cc73f54127648e23daeaa77d4380b18f6d856cd3b1f3c16a5680b2c1428011be35f331db5c66e919fbe63543078de68e6aa330fc6e2f530761e8068a8450f627d6307fe0e2796888b182daeb222acfc4d740b33a4f93a64961aaf962997c170bdf3963f3c6f9810b5a8d54b8308ba00077df0d296d4592b41f29b3ffdf8b3d74a009149b354a7df4d2f2d5c4f3195c4da882edabccb8cbea714d6713323faa1d6afed242f2f334f7320208703f2c9cf1ae6764604ec45f575a4991e7febf63005dff176961293ae3f891b83d933abc18e5c7c7ec851c734436119e9be29c85b057c2d081c1ac163b51c2a093416dd500543ef9f4a6d188c8b09719ba925b2bfb382f326154ba385d110d611654a4576910a1b7a5aa4792ecc84cde912d32f732d48d4f8a10d2424422d380717210ff61cd213b0ea16f4f92d8521071482421359b6ff3a18230c482837f19cd40af6c4c2cbe292f91b0b3bd17a1954c1218c591ce734eaa98e38e33606ae31ecaabb575cf4ee08724378d606af42ef3970031c07f516535b5dc4565d4a0880a2e8ca40ded2f6b0d73abd722b0beb25788d37722353795b7c45b36c8993727e3f0855ead6716e39c5e442cea3d692e7af508dbd91a5b511ca5a29b945ad123f0d0312cda9484d8bc3b626d9b73fe1f8e4038f1234d86b067a99e8c9b5b529ee58e79fe7b03fb903676333884bf7cbdcd92dcc7f77dc0799465b18626741e70aabc3466dbf267ea18f80d56903e06d39db46ffe6878479cd8f6481a722c7019e409d70c4a46afa94b3e7c5ed5797d7b11cc2ccf53524145177db7ca927b119886d9fc7539ac9b634fa397db76e18803d54f4b477c01c6503e322d8ea4541a0ab42a256aae819472c7765f9c87f4c50182bdcc6c6dd3756699824a21569c6d148e41eb7293c13863d64c54cee5de3017188f68fc131b0ad70a0eccdaf3951d6e3a50523203012e0d9476ee60cecf3681c63dd1daf8d71e6a68014c6889ebaf47d2606b8d1a7b26b03e60a94bc9e7f87a4c48df202eaeac7d39cf594eabc8deee64925b5f644fbfc7c20a202b8ba93210bd2a9ce80170386651ea10cd12c2e6a0553a09a071ebc726d266e3a66dacc0f7bd6df33ef7be02e88fd902d7b4f9d71b32d87bfc4b7b3a1dd4289539bde29897e25e6099dacc0e8b0a5f21ef6669d3e206ce83d35fbac49ae5ba89a283c733344d01ca7a2035f5c613204be1b67dacc6e6681a8847aefb1117f11ebebe6d2fa5106c063d66afd00bbb035dec4415eb48b5d069254a8c0c0b9d243e431c2f1d16deff178bf20f78953285fa4fc8d7f4acd3a5601b9b10ec9615370634394c685e4d7dea0d8e7107d18b547f2b2157e252dc1117f562ffc50896e8f25fc2835a32bced3cc0265b92afc12dc4a6ed334f40d265b40585d2d7e6f7f887c57702b773093553c111ae49693f0b521fd888094d27e921182817cbbb4b3849272369f628928679438efda1c5ae5149012c3e1570403f893467be0b6119496d27a6fca42b9aa0a8b53132f44f30da3a23b8c5a9066abe45ebda99a26b1e8ca1eb36276e372ef841b5940ed3be71755bb59eb2dde1984328e272230eaf1ff707c9a7e3954f0fcb73f951c6e0cd78e32ddd27707c44094b1bdd53cecb8ec50c142e9840bb3706ab2d668840b825bb26f7ffbc3ba5151fb2e682986a1975fdf0605b0f80c932cc7b574133755ef3b065b00b8020007c084ac0e1990552f442789d0ffd01d97a0ff88c6d91cd71e6dd85581a0fe80694c9dcd1a950a219143f3466efd30a2a7e2a18e29d30c2f1b2461938e8ac481f73cd17aee7c0b1ee6d4fa96760902c9c3b62d98cb2ad2c5edd0445a3be1053813604c7f3ab205a6d06f1d56370d154bf3c00206266e19ae57fa54b9b64c5ff12ae7d9ec435897db4258573db10a06863baa91b8615a9a902bd442fdc3dcee0894922d2f40183df9bdab74f270382698aed9cc1afda176cc30d3343f20c62feaa26d30505dc86713e82202e225fa47c42c2997b672a0832b8d28d634152b438ce9831e570446d225b05db165d29696e4c233f694c2202284b26a3db9a1e7483105f1632f445d34d283b1b4c6694b49b96299c3dde4b774597dffafcb9151be2f1b74a8821e378a514e887cc8713133687e2fcd45e9f888b986bc3c6c8cfbfbbdd69cbe2a93791791139f59da500a713f27993de6e3e141e67736fc0ee114f7bd4a7a8839a19014dd3615a319523e9545198108b7d2f40e96b398e5a6280cb0e9ede1ba328a61928af88349ac8aac6042147555b9c80a6156454de68c537a726fe77b5aad838b8ca69d011e38fb04fbe33f66ae1a4506378674af8facb4b951faa5b13f043726ca08e329832fff893c4be41b6f04a04e74ef6f103d2105b114965e96d95eb0ee8071be9fad61543de33adff8ab2c4914f0f7889ad31c411776fd602235e94604d8e26c1cfcee416e555fc90c9d87608914773b2c4929e574c42160c6f80ebbe6fae9d76b76479e783e332f0a8cb0848230a3c38b4d194ea2dfde680bbfc5b1d3db4f899a8d898a89d5ea9c5fb3726a41482e4c546ddadbeef7ad878dce9e8b485786a5b90722e70221a85d0f4af8600eff001e27efe37d576aa9031a40c119eca10961ccb1fdb9bb89fd96d804c3aac1aa0bd1ab0d1ed9810a94139af9810b5548e0fc8ca03b103f1a12470fcc390c64c6ed1fbcd3b39094cceb8c02fa3c9a129c3b9f28e6d9fa6077b046fa0e12e4916b2f17b8f84993cf3fc8e9c5fa2b97276058b60c7f3f6dfeb9aa49c16ff02c6a436d72f44b3e162fc9d5396f4f5190d75e1fe9b242d6d7feb4d8678f7ec21804afcc5148f4f44e5e3cbdcb5ee33685d1840957f0687cce19e5d671a8bd08b91658e2ce19b42441069acba695bd2853534108db3c187d873dc0c3d31441f1ac4d119922052c5461f216d048888d941e2f49b265ca079e02b3b8b761fa0c7e390e303915c549624c194f03ae9f9ccacaa79b842fb2b778861ae77a0365e0d470932a338771ce568316f92874609421c7deda6888039662b28f4b5db91bddb02fafb738a45ce5fb4902a3ce12f8653015e5013eebfa9723fb3b9f4d208252abd898d921c1fec72e09b8cfac770b8476c82ab7f9f2cdccf8c16c894d5ac4194e8ebe782e9cfcae28fc85c5614fa31376c7335178fa066a9ec4c4db94371b0792208a624bb65000e457086fc1891ef9acc96eff66a225ecdf9aa252442b9d778655b06a8ce7be38980739f4585c1231cb05aad742066f1fdd7ed9c1239c6850dcea28a39e783a1244dc91520c22a3ca30cba993d45ec81ab8abaf44b72cc11e4bb5b930924a3405e13ed45c247e86e56eb561493b810f14b8d1abc537b8807e69d87021405594299fc6a257b8a17fa733a3f4bbffe6c0f9944ce3cb35d915b73d35b2e28daf394af125f2907c3045157fa131ffe1a84873753ea6f83f53138109bae9deb612aaf9f16635950431010303272a2a32f1a6a2cc0b25f17529ae64afee7355c6240857b8b761d87d020840e5ee1d9658ad5e1acda0bd7655289679759753c5de655f1e83257c793cba41a3c7518d2205b64594350c9cbb955917b1b9d21287b79186e309af6b854bd11de655a15cf2ed3a8aeb382edefacb40bd7655a194f9749453cbb4c95f1e832abc683cba412f2c4f286c8b4e6f095d75032ee1baecd5fae1c3702e48548353c79c706916f199ecdd4521e36130bc7ab266893ccedc00704064d156220e30fda73e1660742373b01c8b192012d95fe1876ce149a8d23d732fca45b17379c41e4a60359294f2589b090d1ed63209478769955c7d3655e1579f2490d25df2adc08dc58f2914e6f2d6bb3cb6aac0d1aad468cb7f2d22ad6c9b51b9ecd6ce5f2ec123339ce7b2d55a4f37153ded7203ec0c8fdd41d712b1eac01addcedbf85657a5b1718e8cfdab02ded3396f0bebf1797c9353bb17635d786303c62aa45a1f118e674faefb7e467c55ee07dea1d3467baa7cdbbecb52a27d470ff2c55ce8be2eee84f92f0a9d938a68ba4272f66a69b5496bfd46195ec00432d5455033be0f2754e621f9955479fda55a44d9c90a8fb6ed60afd50b138e86a459198e5aac1449a60de830954f488016ccefd3614a490af9c00b178f070c99e9e62517c9cf8f381a81a1bede10413cc0497dc7dc1954fa6faad3579c63491d2d7e238747934d0f3a9b717654ea7b465d2821f98d5bc2886c667019d7b3ebb7bda65b5216f25e75342449f990500ddf42b913be4273b74e39114e8902c433a5d65f35b7bab85040b10300469d6884042bb44b53e9a2208fd971d1593c2fa2817404f4bd042f8271309982619c76f816a1bb0fff4e37090961ab87d64029a630f882a7c80da89bd7ac7ebe87de7a045055e4513623c64fc5a7025187e0da147223460e97747da8858baf7de4d3bb006e2061a2cbe9c399796fedf6869847898fca328200eb755fc1e3883a9c0fc483573cbd0e251e493a90278c3c68a1dc027ab0e86e69a9d0888e171d94ce4249c3c49d6e89ba9552494da7432b789f341d6aaa1bacf132151d6623ed84be8dc981b35272ebb76c8444ab7443b5137894155d4705544c14eaa4ee72abe200c5661205f7f3ccdfbb5ddce0931a0de7d7394f85193c44da4752293a47eda5ad622451c6b6edc21fa020c63852449a85a456dae59e51389e66fbeeafaee4640c4196db3e786687fc7dbe26dd077a9a5e29c83b6a30247a620e166d1ccae7c0f0733b2d45a84b8c9edd9f0eac25a1d53159ba688166b245a4444d08e33c8ecff86fb922e48278969a1dc24eb338d71a53f890f044ad3a899b1429def5ee0e8d985d4e0697fe11d9dc40b87d1cadeacbe587ac1f7b0f8f39a135a6c2fe896762d7c6c0ed00921a48f40f5c2cbd5dd3d380e4544d7372e2360aceb0280ace7a411f38a6bf5501b7f2b083c963ecba12a76507fe76df70ceb5df4aa4539df05683318e137ae594b14e857e817d12a78caf1750b6bdba2056cd230ab8cc41c28754d6451c820a4033b3cd9d7cbe86e782a79c95279cef911979e53e91ad0b93c7043f0f139ecb3aa0223fe6573d93d7c7188da30c3d659d15ba3556ded1957139db6d9b38fe62a2f6495244f04fc44ef9e31b321196c4b5ac43fb8a542f30f05f6314a775bf3094cf970dc3e8e66566dc6dddf4e965bf1a8777637d0792eb399943e42fb69060cc154a93b8483f4884aad50470f15f18e5ce0a90f046570fab89fdda08a8f09c66d1101c24be00e80755381fbca731a0904d2965f1fb9a4662439cf4e28d2bb3a22d6ee5a4e65dcc38043bb5d3e02166b998931e82491b5857b45624be2284b1e836267d091958540a62172ad74b0fac32ff72b79bb019d874bab2a11683c027853464e46260e90ea981b494629be8f6dc78d03122733c28351c31016c945e750cea16bf4c7f0f2d0ec7c04bb0b59332e60dab42aadc4c239a74a61bf92dce84ce044060e340eada70644152847170aad0bb70a1d79eec6def62073cfe9436a8cfa14df777ccef400806ace8dcc7cb8c1ca16fc2936692ab466ccf68e389294355c7f055b2651eecb4a91bab36cce2ac04a59375bc2ac5ba8d56388b02bb8d46051e672c188dc4c032853a8fa12418009abe7213247caffc169c50eaee59c388162f0d6144623e8813539c980980908af3d7aba8467e1b08e59d1c4801cb8b47c6eb3342d657afe1902cfd7448e101ea380380ec97eeb7b1ae29063c27c7d03ded903037fc38c671d67715559e48554f0940049779776e4f97112f11ed2cd9ba13c53c4eec3b70981aea0875177c87cdf810ce5ef2be7a3ad7e35e212d0b0a030f0c8d9f4b7bd93b81885ec8656397919ebc459cb51180a11a9541a5eb5e1a7547645147228042c2818141260a2a08c6e308d16fa322d401cc7f414a94f165834c992a3933bf99bca8f603c90b93b80c8ac3696364b7b43ec143fb9068a6f1a4e364b3d71a50b4e2ac7030c406102c159ed1f4a54d6fe739e8ae80a4b721a39de8e712e8fe5c89a282d1a047f391443d7763349eaf493794dec932aa9dfca55226ac5e50616c2034073394c8b0da24f905acaea40cbb73c113bf86b4944ea907b2d30f2f15b30c6f18530c463e4673e7d1060f4b0b2fcf38bef35edce56fbffc45133e5f88612372f5ea6c02c2e1e039a51c8825f8e995b2e720184318cf5fb08a9dd7eb644efa99100d4b6ae8770c0e09824307ec569089e7f0566b9705dcdd2c6276e5924348597971645b54a6a4e55b895688d7f0eaa9671ed819e654a60dbcf140f995f70c5a9a90a74ecda35eab3f25df383c02ab16019097141694223edfafadb8a2c91a28ace4058f83dbec6f716e67932944396cb8d562c3803d28e74e37fa7ba1d621e5e7f972a1b070c62267c5ed59d76ee73b4e5fceb7be8e73aafa47b99a3bdec17376e17be4df3ab9052f396e4e48c4f442e4f116000cabdca75f2039e1a39700d03da81a72b06262c062912e07a0fecc05ad081f71c01ab6bbf60a9c8b39c244eb490aef4f200f5295832b45e361d466ba108034585811e1d804ced2f78b0ca3f6e63170fc1cd592f3e7d9c1d7f3596d491bc035dc0b67f3089940e1872f1568dfdeab1d508dcaa7e140e068880a5081ff4dfdabb8bfc7cdfd4d41a787abdfda471159f11628039c223e0c12ead6e3212cce11cf3ef67cc102ec23f49cdec66804f64cd72dbec7c26b43ed0b821e2d6953058ad216a865fa7af5c694e379380f3171d394048194c62aaa0516d4815303c1c599c60335d2a60724c8fa09636b5337da69196a52aa8c15f13da153e8d4652bebcbc8f589b98343136fe70524721f3bc7955fb3159903cce261a2105166478a531f3e90b5edf1b5960cb889cc3e31dceed9b690086d9d71ecfe61807f0c077b8acb7b9acf72ff72fd4ea17af43ce42da63ec14dd2eaf0ccba58dfc1a0bb876899324e68b239386c137e4c7185d69ec1335aa301d3ff60226245fdec6faa6841efe8447b27a07d1601cea60861ef4a1dd753333874d1e431065bad74d3e56f5e9ef9587badadf8a85a0d1c9b1fe8bddf4dffcd98a7bc767ae6d1c4eeb9925dc8a6c4b774938a83dca45231a023d8b7b8b40c5a2f08be306e4376ca18954a51d093403ad74afe9e34494b73d6b9961686b37a87d9aedfac157324b4f68518676c5881d2080cdf9c1be9c87fa83ca6b2a955b68601866625d86cd204c9ad0e8e52cb0cf1cf33bfddab0b702ffcebf3d7949bf350857a4de50a245107c574627f6566694c688694fe259b9928ff4cf283851329938a579c30dda4f8f7c12ca5cae9580b9dfdb0f8167ae700dd78884100ff14be14795abfa7d38e409ec6d99139676ef0e9e9ac5e30cfef5b26a84b78cd542257ef87b775c14b2ed88ebfced77455bdd409118d3b215adc5c80ea5557a8be9a32e4650f7b167b998b2ac002b53a8637efaf6c216079c7903048859c202d43610a66809c5f4801554f3fe5387f1174335a90b6aab98a0d221dab904e81f0372f965c9bb38d0e68393f36461661e623657937063d92f893a8d2e24be1ade32f1296da5e1eed27174a0669fc4f68ef0a17da6d15b6597b1295343c9f572de0235847e3964c2965b7bfbb36a0617f3bfad0f1265631f4a0ba324a0988074509d213f382ee2c23af8b34e01257558e8b94eaef3f25843335ecfe789fed212d71e0a0b5ac212735e8205132ba97e464a259c395b6e3850a4750903b9cbac048e063e298bb9f884499e54d61e79680835c7737a95607dc055038ae288abe8e4518e1e74e989c35baacd22f20a25014d10bdece56b09e72d434ff6e7a24a88d0b433e4f2078e54b83f8995aefe838891f1aef6177cbb9dfcc13c321d7b65ba5b67c1c126c68c8d08c47c6d1d2502329d47fdc8f8fe3e13af74435dce2a5711cb26c8486a9cf823b5d4965348991668f3909e587de8846e0631c1d9bb6cb3a92d369d480e0cbad46152f6ce244176a80656af9319b44718736d44e45362397f6cd881efcfadfe447c319c393e5441e8a12c2c7010786d1c4259fbf7ca2846b95a0aef475a9123e991d5a07c57492239716b58858a9e741c339a286cddf46493dae0f752edd5f9c66fe93ebef22c2af3d720098afc4fd35aec9ecd1bd991f84c4e7d4d682a2654291fb37e85c6be79584f4757ee45ae0e44b40711653c2a08592386eca3ecc7cb6e0c68f6707e4a9bfdb3f565c4f2286d321dcc9a20a3e2441673449ebd1be43bb921096cab44d2ebfcd28d8cf0c4a0b1448f5fe126917fb6b349afefcfb8541da4197d34d46be6052fe0f96e8d4d43d30edca78da1cbd6904a06d6ae20a85031baaa135297931985ae2c40a43bb0a3739f6fd45c4a76be397bf2884406434d1e9c1b926f04ead5a56fc59edceb2feb1c736fe69b48db54b34e43e6c71786d039e03ef773471a10f80ccb2d41730bf9db5225f45f540a82ec347427452e0c90c7df212d982a86083c6bf3d0bda9c75c7923c1e9c8c3bdcea4ef7effa9a576702860663021818f631e4c488770a48617e0da29f22a86bb79f3ab94cfc7379ae68518d02bc414848ed5259e78c722016f15cd64ac0faee71f8af5136aec99543cb43e27a3c8b0a91ae1661a4ced97f2d711a17912d69f1691090d7f8f546e982e55f55226589aeeeea504688f3bf7b8e7f378dd145737df48add6f641628f71db86d5dfd5ec668070af4a804ddfc1d8542f7eba6416d6c9be45d7f960731c07069fc6c4455a1965fe00c7fd7bf4fa3ac6997c27bec15afb0273a94551618f420dd7ce7908916e49127f1d89d6e032b57805829624e4b62fe8bbe1e401e52df3e3f99155a4b210c733f8c4606f29a074909796fd48b543d9257ac189529cd2867489b7fb601dc5a342f8a603a0469fe4ac7ff0b46e7aa0807e565c21d55833497b08aedc0fbcff2bed510fddc092adf1e80b012aebdf4cab317ca349a08a96e11dddbb7c940189ba8fb13867b1735893b5d2e563c8c391dc656ec27113def58b9583af69bb4316bfcc8a09e56fea6f8c792dc10be6cfd3c043f1d4440c59620db1915cf51bd2faf935cab02532783aeb283f4297d1253816894f9136d14c080b54944fbda1f694b703100ebc9b4961d44713184dff6966084cfdd40f452bae6afba19cc8f69842b65554c0370cb865a7f2bffdb99ec9390cf7ccf3f08b4025c4749e9da181c184e1ca153700a06e1467f5edb1191acd8e7c8305da59d17fc489cb6be41819b8d90c759984bb4484d395154898e98cc82da2313a3a00d6f2b66460cad2bdce242a658a433b967dddd78c3b805a21648a1469d6f6b1524cb320c04840da54bae7aaa2f69687de347dfc3ccc6bf94180bc4ff3de3d9d6f5652c44a5f7cf93e34af492244fd4da02b0fc382e6828880f8c3d830ee44575121c46a7434652131575d6713d3ac72511b47d2f69ffb1e6ac9174023650adfb3677296b7827503414a4db1af7123eae203c6812b946306e4d02cafe2a5bb2d872bf08ff0994e40f4396ea172e15ab71c000cdd7f61e106fad4c568ab2089849af80fd1130a572bdf4608160e9a7188782b3bf92b74cd888e5075764ef3b0b23dae0e12bef32ac0278a3b022619876f36943a4469af67b35b76752ccf749c72a0ffeaea6ce691a6b0e7924f9082cf5a6aeb364613c45e2a9221180efd9243fc574317f6c73d1564423e373d1f18f4f386d8f8517f357e1c0123a4cd6796073f5e0d41aa509a5af7a028b9751820d3d5a35308cb6f887f72421eaff1aee2d1868bf70cd15f3994db019f43bf3c2c6761c15cb7e6ee09dfcd23eace22ac7658eb19bc3a45439a93714b4d02f160e0e50802c6b14ca08855de0cc2de2e83e1b841e0140f32b0b59f3a9ee7ce372f447fc137cb24172caef8f89ecd3343a9707533b320727be40982d4755ba02a003b53d1169f8d90b88a8da9570b9c3c8c5af7d57022671d26a70592b1793eef93e2114215de813046502f3004efdd7e8b65799808ffb8fa85479a150b1c3f868116a8cfd5f1196b8520924d441a8896392adec3f588645bb312242e42e9c4ae261122c1cdb110f00cff79186eccf9e2f6af598c5c4c66d0464ce38565061ceb59babc82912008b244b4dd4f512b5ba664953beefea31b1e8f5add1d218a3a4ab0aca5324ec103ea2aef25e07e6ae36b01bbc707b0f6612edc92058a0e1fe714c712b947fe5ed63b4a0f5da106be83fe99113e7e1775826dc6331b064e799e8a9a6335b690cb89541bd9494e10eaf86734bc896c1f464adc477b16d6eee509f97fa0cd5054cbab1ee16f546447610936d481bb8be58793e90188b350e61848066c26f0b0bc5c3884d54eae08eda5cae1499a0069d3a145c36ff3d2a888fba8328e9f1564c845a264ed8df1c539599b0f2fec739ab8fd71c18ec56dc1cea6fea0ad2757c7021df2bf5f0f5ec8240858e07da511115acb55598d27e0b5c824381fa144f4cd64c19fbdef0bc4ed4879963d8a0fd4153fac7423d6e72b8318f170550e7e1290fc8832eb54cc724f134bec897925d736cb4f322d39429565fd34c2c3bd7d0ae8b56505de75c10a069a70e74abb6374c4fea54d1d4d15f9eee93a22b9242be42c06505831bc8d3559bd526929e2408b2fe540f0da9b3529af94ed35f4b328012f6b87c6d14971fb1770a725b66537513877a85aa9156474613f13c191da408ed5e05e18b4b00d70ec2ea861041696ca4f32ac29913d16f372beeece3dc328b0ef744ebc46d774049644592151dd11dd0237ce11d96e6cf7b295240f1e2fea66fc09b23bd0f9a1cb0bd91a0f3922baaa24a39778e18798c84329e2cec471279302b9085dd43902635fbef40098029a9ef2509f7c64b2a31ae2c587d30ccb94ebb365a34b201a44755ea96d8c67228679ea903b03371288fd75ad3a756cc9960814909dc8c9c2b92c04fdf2d9e5037980db5dc4dde0a64d388962709914d4ad50d52f56a819f96a5a40ce5d25fc34d841cc8edf83e6580c7f0bc83f3b7b9b10468b5314ecd4bcae7024fd94612b800e1bf6e4f103b672d4dd62c1cfe89d1f1e33925bbeee81e6b8b75eda16895ac4b04e5724de43e00a493cfae63af37783c4c598692b4f3adfb15206cd91fe7362f2c9697aea76b6ac68861540bb4a08d88cc70031e7e45ec5a501a4814b2ae4f8469b219027002dc3a9405cc1b1ab36182fc853109edd169108c55f21a69b7763c3ccc14e679ee125f57e505cf75829ee74c635744e71328b4744a2da0ab721017463c4d03fd8cea7f6ceed8d58c593f7e5baae15297200103bf25d0964485e98f9611fa2833f0aeb3dbefd60c9df324f7c484feabeb3bc9ce4d5f7a5543579d87c6ff088435a860563d4640fa593a8847de7cfa4d4401f4a6d1a99ab8dc1c0f703a5c5c85e884f16c620a96332f950b555d0d61aca2c933d45163360a024afab0573fe82cf85ecadbbadf01dca7ee986d1760a07e89ce6a34c556e8c554158f26801013a1d7792a68f92d673f519c7e10d56d4ad7b8d94fbb586042b4f4b69b9302580f48ad8357d59a3f3f8a27e83c187735b86429fba46ec26f2517a506296cd23cd017a432f046f8d562c611e55aa8716c24a1a0e0979aea02219901086cee8fc55ae98145938b875ece3b53aa857cb49f1aef58fe3309960442c19237beb3b4b145dd812b9ad4c514e155f4b73ce58e41f76bd9d3f4482f5c617cf3cf768a00080a291f4a3e191aaa0edcb9970a12b62efad54c6ec837416302365d85d05d8780f045ab2859d34b0f793e8b28901fed5063079e5d9f0e429074927c11864d1334769d1f983182527a5c0758735bf90bb2ddf901881d9116c9b3ff8f568b4248c7628ba2a3075c59fe9b559e63edda9a17ffa9044e3fd51758a7b274c767f7fc0ce8014a7012795a56bb25b51e70b5146023144c676b5a024844aca21b4a0fc3f89c8a8fb704f2d081ee5c442b3e95a8b3de276d242d3d96a179584f3f600a9920082335af4f5656e2af5e9ab87bdcecaba4319d9d8f963137b3a15ed09071dd3a430269392902f9942a9d7c53631b0f41bf9758cfac491b030bd71d5965ef13db659e50fd502157885dab12fbbca0ffc255f467a7c3878b889b3370eb16aa6094eee0db044d29f25212b62aa928333aba24795c93df0c95015394c058168190879d298e62f0d083fd118af738701d738f383d5380ade90009b053e4afa91cab12305917911a9596f696bddc2c048b4efe9c65c2026ac5255866309c48e7ee3cc128ce04a307f8826039edbdbb4e3da60f0f8d11df4a3c718f40d4fe90bacf2d63f661c32be5c83b276618b1619ab710711ce6c6ad5ecaed5ba8d817eab367ad79500b493c7533179f0ac2a4a523b98661a5426079066705c63b9e1c456ba2b76500fa054d7e5ae832bcbb4e49fb1a5eb36ba8459348290ec49e6d5913fa106a86eaed753d74808d708b371a12b1b4b10b4f882dc084a7f766d7ace85ed9a1469ce01cd7cdf093b658fe193f340118e39badfdfa7674cb869e1d9fe279b824f88e7d35c98e79cd8e28815e4f2040e7fc4cf0d58301c19271d09c3a557d7d1738bdbdc3457119fbf56b7b870234d0d116e296a3292226cc2011bd06f29aa4ea01606a82d000030655720df52529bebaab82cdf97df29e947702f1da77cf511bbf5364b08216413b2f7967b078f0dd00dd30ddb088bf077ca998feedc61d70393a44bdfdd992030b93e084c9eb7778626e67a9a8f3e7b7623488c36d1fd6af227fa88f4eeda93eefd6032863d4676f78b7966feeb5eb7cba40230dcc5a6b4776142d850beaec3da930e93b15ff75ac5fdc248f6d24818fb992d46f1b0244c1365ba5bfc8ddebd3bec644678a67bf699ee185eb289787478c9cd59dbb31ed951d85118f6dabb6274ea7aafc1bebdeba7f6aeb71a2cfc77e2319fe1998a51b6bd4ba573bfc11e46ae30a12098ba7e5dd775e872e1996a9315e99a39bb235026a4c41ced5128eab437252699312727e2dad25e922c047b4e7c6c127d00556f4fca9597037412553da027e7c4427a140153f2dbaf7fb1256f4e5c7cd8298af61b6c8cc2b624690f47e568e869a65845d663df2169ccd181420ec5b0d846dab3892d9e2b6707cd5a8b01cef5e44a013125efc3825d48ccc149d4f0773ac50c1b1157d145c627172c31e6e40f0a4d1c9b4c8aa43d4973284e183e8aa38a54474e0e09fd06cfa2cd507562603f2fed4989fdc4a0d11ebd2eaf3daa134fe9752eb6471b0cf6f99b3af4ead313b1d36b55a4f03a941895e1125060d301fb79f937627e68d576fa1db006ccf4309e5c61a77f91abeed9d469d517338d0b9fcd49801e8df4f0c2536726a147ae26135204b63b7659c17e2e95099f8fbbe86a87d763861d0f9aafc73447bae88abe5d17c68e4897ab6fb02fedd18ff0e482bd300eab02c54e1d25ad42c9d0cc9d660eb7b4477f6a8fa2c1c24c45bf664fab60a69f4f647ace6b8f5e745f9e605ddaa3ff3c8c099d170e9024b0fd4b678a961d50067d4c4f25b5899d3b78eab41706aaf304c63c377594b89043393414948c39ed1db9f1a63d7aed469bf6e8b34be40eb92f3245b90bc626edd1cfcbd49b3a929e523a7532f5329d3d993e36f1a2e311f306238c5574e1af334c020c8ee46fe6affa80448677a145624d539115ce108710871087c0039e5e3e76f1d9fb55b03b5a356f447b8d34336b97891133c7cfdb72f2fe9d0c0082c9da2e5f3a3e8b2f02c641e6592fd9f0cd59da9768ef1db22ed1de1a0682b5a33d0a64b1eb03485a9ebd4f04fa9c5ae20e19089f906114599e52c17ed007885e7932255fff02254b982879e20fd229d80bccfc552972250353f24f7891ff60582f1926cb9e1d198e39f2d49efc004ebe2e73ae0b4e7c2f1ec93847228e8cbf566458042453f2e7f54051840a677bf2d06708b9f2604aae4e188641278feb598380a75107ebed0429b01009448185117e24e3121b748938a5cf883d4ef0c426e24e541275784821e978a4553ab4cae53087c3479b56e1c31369d53dfc9056fdf034ad7a717821ad7271f8204d44ab5a0e1f8156a10e0fa4552c0eef8056ad1c7e8856a91cfe47ab4c87f7d12ad2e18168953dfc8efea155a27787bfd12a8e46bfc468553d843f3dab38f4bccfb82798f24eedc9f6e44f3034f2e7c1dc90a7d1aaef94e528b7f4d64a649a59f3c41f1179de87ab023def32ae859ef71897839ef71e6e859e77187742cff3e69c73a622f460dcbb1fe540be26843260a4be98617cde6f871b95805e7c0ac490e763c3d8a208e37e51892265c8f33adc78047a37d008f46c201138047af12f2e0d1402bdf816370824027af1a81b01e8c5b3b840a017bfe2fa3801c5f8dc8030a6d28d0153f1a4eb412fde5e17e8c58fee610b3c412f9ebb2ad0420f5608bde8459c3c8fdc188936530c4d1192d2922228d39f0c7bf2858b1092e70d181a991efec8d37379cb49c57299528a8b2092679e38adea3a7f668d2c126b46972684d9db7b3435edda6ab66db2b3bca4a4daa5b594a7546ed74629c5fada4eeff6bebde193765d59959717452f5f9337188b6197bc64fa5247e4fae792c1d6872e53c618e31031c61863f4e4e885895ada8b58869dc4a7f622b4ad6a5ce3833a0b1ba461fbdba86587635eb16651a555d77d81692f4efcd174768de8ec35469b75cbec5727933dd39169c73a99bed6977d492f9b76d53eaff6be50a5bd982b8661f04b7bf19f8e45c974e78e31461ce306af1823b6edbd88a531bee3659452caf8a3450c09fca1913d9ed268afb16ab34aab4ef705a6bd7e96c1d3ec9466b71ebb3fc4509556d9fc9d7253fa495f848cc3c4349d4c3dadf5d9374ae1afd33be1afc69e7ddeec31cb70abb4d718a66118fcd29e0eaafe7a4d96a9bfb20bdb677f7981376ece92ef25f2d4e6ceb635a0ea61ce7e68af554eb6bd2e6261b6313bb460e16fcc015fdbc6c054ffa5e7e5ba956bcfc24e7d2a39465963908335c20482e02c00d4563dd68c4518a511b4468969682d226b6647307030c20c1babf1ba2c0e2a569f7f1a01b0deced6c2ce3a1ee479678e91152fccd7e7e265eeb164b2a50bb30f145078a408f9b8a20f6cbe5e58cf5889c4297041688845a4c80a137e584cb23314d17870584c564697f37a1ce18a71a54c4e740739b268afdf608c3d71f01b77216be7a60638ac22a7277e584ce23f9b9d41ca0853f132cb9194e38a1d4416b79dba20450c392c22454e68e861bd0a362714767564c1ae5ef1985e81d28e8a87a4a3222e22bef1cc47baf695eb80f9aa9b1080e40bf7b36b2c7efa5755b0c0f4c4445541038c832ca10cd91a4a9261d74385f2e44e661ec563e5f515cf90be728deb2eea0747e4451289549042052d1691222b4e10c482e901c81329c2298187c564e54554402cee35accc0cf6a3f23dab5cf91032241a6995e9f251feeaa14f648c392c87e5a51bb3cd348726a12ea02fa030803256e02a64bbd37ff06765b422baa33cb1db7d25a6e519e7fba77463de4c96a4925d56664379684e66938dd02244bba2ce48a70bf510105303128155609233c42ad2352187d5916c14e95025a4974e5260c2cf11aa0c2093d30e2816b2b6f9a8cf34fcd5cc2e887aedf07e37e6cf766b235d23284d7b2b42e0d00a142295482b2b8f5fc1343193de7532a4470c3b1da46ea9746be2d5e8fd0a572adeb770757ae9a76b612a5ec5ad30153fba10a6b6973ebb20fa1b845565b3d7089aa5b0b4581e6912fbec348786e6c0da635a0547db5d003b8e7738666604cd1f904c43b3a61921cf2b33d677c4843cb348732e55526a22cb939cc832c343b090f6b232d80ffe4c203b67cbd225680ecda139a3aefac0e8c6c2b1d42bb33db2ad7022175b4741a43bc00338f8b0881439714188253a912297118658dd8b18a087c524be1444a5a052c89232214b7a842c0f3f1a84ac09c17e54880c3809d5a14db4aa62daa45528ec347f3453aa64276bd98fe6b414943dcc5bbff66da1961029a514ca69158a543a87755705bb75551851ca43d32b1126626d6c6c6c1aa3393dba46982021a4de96d2128242dbbfa669038080b2469717d2aa7a2864bb3434c7f60dcbd86fdf6e71a993e96f399688decf91ab09542bc6037221375e32c2a83e64619af30397a111ecb08814d1c8f013e5ec5abbbbd65abfa2c3515774381a66aa4395d4be4d73342d3b294ac66ecc3432093b040b1983a51503d11863c39f958caad41604c47417fdb339a6553b1000a1b8b8c7f4d6ddc8125dd48feea28b30911611962d2cd1611129429b10c4ea5e4445131693ca754b465194e8a43d2a0d40cf47884c11210848488806a08ac2607445a73090a739328937abe6d115750b41b17508c3ea906d58c30570e543a6e4ab0c2c13f8437720840648ae68add64ea021edc90b690f0a0919d22ad8d794e3854b80c1183276b35c694e12aad3de3ccda13aad822df1d6786c49876fcee2302a629a439374ca875c711ca639c8f287d620cb1574895a6bad75095899b034c81207d73fea832c4f4f1d865bf0d8c1456147ab7cc4c971974933b91ea53d198427507bad0934a3d016cd91afd54ad843b4bd70bd7ecbb64deb1e7a9a6c5a96bd47866368920cc788694e162cbd81a9965ccd2198929792decc39274d224f7da0f48a071daaa45bd409aa439b6429e913dadd6ad5476f5a0808a8a5d09b565d3d25082805cdc93427cbc708d1e0502947c922c77fd18b31b99f881599351956441c36c86db3c3713d96e4264ba55f2f753ae4fbd7758db6203abaaeebbabaebba68688eeb451ce014bb46a2118496fbd65d2368a6e7684775d8d2e99c7f6915f7799856c5fc02bbae543a7da97632dd29fea28e8e84bf6af16747dd2500e330eca37fa71765710eedd8b1c37c5dd408e7c0716df842ed7e34f47e34b45ed451f2fd0b9e5e94bccb1cc52c68832e875b969156acae8ff67e58c1fa684f3e4bf997a0cbbb04011201791f3f7a0559110cf6833e3b80c0a950680b9b0e56041fd05d6e2cbedd98596c4eec2724d3c83c83faf6afc256bd78cb5bfc4500c933f3a3cf4bd3479fd774d2fd8064d2b796395d84b25ff96892268904249ff00704481e7d7479d26324e97ea4639f8f69d361a78098bb9b300dbde2e78f913cffe24e9892b7a39c2045de0e3b99d1a7e81065ff1d653f49a47f368b48ff4e5944c2288be7a568de743fd26702badbc36e47ccdd637af4893720d8d145bf3e3b99ee13cf74b778e6c5e74997868ef06ccfc545f8a3a1f9c5e17fbf995b2e3b1ef12f306ccf05fe68e46c790b3cdb6bc1cf1ebb2050477d43ddaf48dee4cdb4e3f1891e813c3aed8290417ca2cf7f3432a3f07704ed82e820269e347984bfec9005fe6af286593c93e9cc8205de9ec92c9f7552ce4b99b5f75f5a95b594dbfd621e41a19dcca801f11d144e7822771f69a3cffb01e9213fc25f8d683eeb64e43b2a4537882c8b4627e1af26933e555c5ad34ae9a7ab54959fce62f33ccd791597e59e72ca844bb766891911b308cf8cdebd3b1ef1dd6327339a5b73a3d1bfee18a8c9f322d1e5fd806c42b00f525895f6a08c3b2b8ecd2e637a49fd16b10cffe8541ffb6cf58135c1fdf425311d9b4c23075d5aa59df4e223d116d0068c33280bb4314b7144b93883de461b3435da18c2451b56046b94a00c7aa11bf3b3d30b89368688331c1067441b406cb411018e0e1541840811bd03a28d20364aa607126d08893328f75104a20d9a3883d63002caa0cfe889c84ee945f441a20d7ada5154a6a7f41cfe3a5f0e4015d0a3951ea337829e9e26da508933e8e93900630cc9f097caf4f42f04f0e2858b00b870d102002d5ab4bcb4b4a066a0502c7c60c162858c152b4e314e27153da850c1c2030bcb4a6a6545c5535131ed60329560944a241d4824eb62ed2887d1488445a2ee761d778edb5e6c9be642d3b21659565b6ac5501876b1b82eba82d24ca18c39a594999e05d668bba2026b405b2f54c5393ad763b7ad02a257229b9624f983c9b4870925999e32a5423d4cf4207ff0894c9f698c4c1f2f7641818427197651a6668a67a20dd72313645a805edd20d5c1c8d4e1c8a5438e74d9de605bb5bdde254aaf4a36acfa2ed964397f6045ff4a1282e127d7151b4aa46e8325bdf46fd5939798bec158a95d9a64aa5e4cac8665a934d4aa6dd52353f5b55a9b633b6c6fd59335b9a4b4ea912bb882d22b892fc0e56fa5d3aad54d7b75d5932be931bdb2912b935ca97c85e555dbb81c995ae1c854fde9ae6e64aa5ec55dd9c8543dcb5d51f1b25cedc8554947f2c895caeb574de4caf4fa2a57ab9dd2ad72b5e2912ad7cad4aac94d77a523579155bfaa5fe5c815f6fad54dab563672e522a5574e5a55bf72a2574df46ac7250aeb02046b74b9ba4491ab0b1872753143ae2e6cc855879b5c75c0c9f5d32127d77aee5be9f52e4172452a01dd52507b1b2e6901aa202c01c9954b15a408ace92b8fa49b2e04e9267c04931f2a2ffd08d34917a2f4157c840a466d78c9ca214be5a5934cd5abdc9f50db4d872cd2456d18b500eca50b71dd848f201dc1e407e9d78f285d4c38ecf29d72fd14835501c91584aaa156f56bb5560594eb49f745a6ea4b772ac1c6d76fd849ff819d84a14cfdb82ef1477365edf0f5ba447161b105c1966c328ca58dc506045bb2f18195af875d10a2770c68960b904cd5fbc08a5caa0065541720286302c1d2cf77524e1b2d08ed127f32da650fedf24262c7d625a4c77410982c7b6c971be9b193d9aee1efa2b473d74eba28ed90457289c2c93b23cf9d744b514a40edd56f17c5835ebb8667388c929928edb9d7605d82b00b507bad06dbff5cb4fb83bc31b08722818403cada45577bec2ce6b15dc3331b1e89bed9bba3bdfad105a2bdfa7e03d44498dbba5b8ad25e2d01f51425a05c25fe5c5ab94a29503edaab87f9477bf5315defd292ab12900b905c0d0153922bb908e5aae15a02cab57e1b4197ccc7033e2495f698a1163b4d832e15170124cfac82727d762bce9a85141b842dbd822c48e74c02b62acf8e314e3a669e3f48ba2945947a22167be89c3deaceb2277307d3a446bb4deb303a9b497f9bb7757adc20458e9794378d8391d5d708ae9b88e4265e3757af264b5e343386a9647a1b27890f2458f331ddbd12c11746c57fd487a6330ab2ae234c2ce1043b883add9d0e992f27f55f0caad00d7948bd9a5c4e7a7666131ac81c4d26f95c5a72b5426e7892e3e9b1866fe88cad18342f645d53a6f332813d53dce4ee8278eecf9dc9d36175fe73b14932fc36e965027bdac043c5405b98d604cfcedcc93b9367081c9239236ceb77a54bfb79d3e5af9dab87855371af9e7b5d37a77b3dc1dfd5caf20aba802e27ed4d1eed33b6a290d66d240e5e48e28573ddb477ddd49c63290a59ddf5903eda863f19444490567f885ccdd9a46804e8f518a1a7553d043d792823186818a818a894ce9d143128b686a69022d45e507b52ca0b5f4dda93a7f69035e9852d609e5e88796a2713680bca90ef956fd7e2b17b39694f9ebbd74e5dc1d74d35616bf1c593d3907f6c9412878cb4ea26da689b3825cb6f40b07133753834edbab9709a60338e8b52c4560c12755bc48165a27671348403808044208848b4190287ae246055c22ec1c44583d9317139314489ab49263d5e3771eeb4c7d31e2ade74c89ab71782de848fe04e6ff1114c7e70a73f82f479c8fa24136cb7699174ee1f1c7a92b76b73477a4e4c73f7bab9701acb28ed7559db6ecddd6dc9db88dbae286bf3dc7fd093b4d9048975e1a0225e40645d37f20976f2cc9df648db1d65ad2f97bbe3911d851d02e1a3f95c09a5bd1d99d31dbb3e7e2ead494719bb7fb4a50d191aea4c5bd75a244212a4c8f196f2b6c2993a1dd1f40475976f6f164861a5d3317a67f9a43d4985dc7519b63d4d8eb4eaa3ad8cd3aa6fee04e59d89eadbd7b0508d510be04efa0feea4f749980893c63f48a41399f13a02af1b28e30ab63b1a6542613fdaeabeb55a723577604afe445bad2b2fe5a56422cb4729ea0751a0f6e8245d729f348802d128a70e4777259165e36953ba57ce757325b974e6126cc4324a4f698a2639de950cbb202615468f78667478338575834e8e579461b700c832e24d2558ecb389c50ea5e8810b9af0c212413883104ba260da9337da931765d4e75546fab4273fc2a8981fda638992e3d5600fcef0e693e3cd3214828485904d62bab3975ddee2ad356fb1c3815a00e9dc7f90ce61224cb6139927499e1fdc2d2642cf61b9d39263900af277ddcc9d3ca3b427f3ec81a542b4357732f68f06095926aa4ade2eec6903921c2f96b5db923b1c281ff330ffa08f3d403f3e9712595e4b5c4cd0408344c85f6374aa689b8a76430f5d37b086285e48b27cb3c166d74dabba632aa53d4d9b3ef693393947ead096101592ab18f42357439a5c4eae275ae5733d699576795d3b72452fdb06e77463319b2c874ead21a07c25712f11dc6b0450867c77af2339ae9b0f0e652890e086acf5d030aa727505496003849269468fb93b1e571e7517f6b48127c74ed3b26ecbb7cb7307d6b872a00c1ac0d5c5d343031f6479318183ab89d49139ed65e7dcd0246b77741db970ae1b1ed8ecdf75330425c32e887a297f0353d44728773daea396dc9cc57d09878b40a11e1613944cbd760dd7e49a1cd37d4923a0acdd9951a79626271fb9ba9ac8156d5d3f94b6b23c35c9b0eb81bdef8a21a1acd537feb05ca7ccd9c9c9f24297ce95096553ae1c5c38b02b6aed7ad880246bb773774160afdf6ecb109923571cbe441053f231c0614196ffe2cd75822b094dd3344dd3aefd4ae2bab96eae9beb66d3824e70c677738c15bb2676d5aea78b4819b3214a6cd0e5cb74b2bca89358b0b1c5f51c354e87bfbe44955a9b59b1052184106a1cacd135b2c17620cb4ee28b66b85a87d3ee8e2144f8f0f199b1097bd1e7634b4621b9badea409cfd73badcef1ba118763ab621c3194a911c6eef6d8aab5c5ba624bae204b280fe5b6c9b1094f96976fd224b64438f2c49db8730192c4826d75a20886d88a3e248c1afd1888b98b7014dfed002257436cbcc51f6ce52cdac099634b8a38eea2eb83c3468cd0f78d6cbf46d8479661d4e859ccfea39f517c04931fd8e8fd1a96c53fae0d1f813dfb75bdffe37a63224cec89548c1a9d5afca33e3e622218468d306a017d7a21628c39fac8e933a3cf8b5c7197daab88d55d98a38f5c41568cd1c876edf37edee7512346b263db95719a4e6cd10b59d9852c8e458fddc8f59a1d88d8c2ae4df6b123b6a0917e566b5a969eb0358c38ca086bcc88f398133fba3b642a6effa28d8c3751c221b0c6c4a81cdd397e0350653b5eb465183dbc43a0ea8353e4f80d404fae76540e7fd59ebed32947cfcb120456627963e1638da82519b6f9ed497e86504089c3149ce4970ca198c20832145c6802a493b9ec6283820a3ed9cb100a2ae8642ae0e42d73df38ca7dbb9fa6e118f9753db8c75f1aa6699a639acef41adefe7536fde2416fdaa216638c26d3b97fcf1cfe68a8e9311d2f0d6f557b7dd5fecd9c1899da0ea1ca6ed1c9cfcfe45ee58a740e7f1afee2d6f5d8f286b54e078b08f316634eabb647edc20df65cd78690ab78a3d29d3e7bbcdfccdc37ba7d3349fe381e441bd9b9c63a9b7a88b0097f3d733217273d8799b2162d943e52cc8479c463748867a2c71b791067701885fdba2664e52ab647fcc96c8f3db6c747eed18968239ec3d7cefdd2cee27e31b3b8d6e970f18867e24dcf5c682796ebdadd8060bfeb73a169f8a3d1b4d74ec7f6196e746cd33ea1086b2eae67dbe8c22b3b7df2162fa594ce8cc96cd9746127e20cfa18d9e2dab7dcd151d774161766598a38f2b437845cad787d8781f27cbc91ab15588854813f8ba14cb1e015fcd5f96dc3da63f778d8a96cdbb66d583bf76feb54300f4ec344e72e4675a7375d885cddce194f6fba1b102ccdcc5ca5a199ab2f912efe6866a783fbcc86bf98bb1e5ce6606afbdc366ffbe84e8cc31f066a72bca8d67ae5fb6d206fdf60ec167d1cd0b4bbc1ae07cd5b47f3c6719107d1c61773958f78520e1eae1e3fa12a7bc4dbf6fa8f8662879d867b548e8796ebafcbfcb4db16394ab9cf664d7638b8faaca6d263748b3c9107d106cc34276f918397b55a2b232d126bae225dd3d11521902da59452ee0042c24829a59c68b0dff35dac0a17d43ee8d8f211cf0925ec89f9a1553034689ce02ae6092748c93d4f3c90bf9abb5fb061872e5fb5c9d7afeb91cb0e375a03fb7958760cbbd98dd1abada3b01eac31ca1701f2754125e4ebba2e00e4ebbae0101b7a0c16ce958bcabe72c8d22e2abb76c8da66a7a3660fcab8a408acf6955fa805c86b17425ec34730f9a1bd7f8410fd157c8486956063773f98dc65fbecd67cd32562b57f5ff977ca1886fdf3b0abb8decad52e8631234c2a00934d972206b577dd74b1567bd77558d355be6142d8945675bf8e0db5aae64b285331993eb309a378986e6fba7d356501db0d1a6d4e275803dadcc0dc9823d018c1c2d1924e885c7518884c3508447726d20b45502469047ad5bd0fa4bb349d02d22a1e4e682202bd821c16d25e471bed1406a6fa147396c0021a9c7ed8d11e9c18b6b5bd2c5848b7399242cfa8427f9d888d36b6b4b4fd051bd26fe608070bff376c98112c844b2eb9ba300481cde89d81cfe8ebb38b7d31088af107b34beb92d9abeb31feba3f3a357db4179f61e21296404284f73695730ad952c6d8b11f3bde88e998564216a0944172179c45b0f51bbc46c85c8f5df8ebd2684ff6099319fefa09be622f226318c503ab980683b8e5a7f62e172f08b63ae99141f74b841242fc023f693ac313b113dec87da3e14bab2a3d46ef751d829597052f7cb2edb510e08cd20d4130de61a2bc38a055df5f68dc65f6bfad94e10a79c9128503404f522664f9464296c7b08601a08c3f4b98d11378842c5f5ce1c50b175670e1a245155ab468016a6941510185623105162c564861c58a1394d349451454a86081020bcbca135656547e54544c4e30994a4d2895484c2091ec136b47508c46a22588449d12ba8ef3e1b82d09dba62141d3b22364597da256cc08187615214b182961248cfc01248cbc01244c0124cc0d58034229a5168551864ac8c24d7cb42a56c5aa5428233618ec81c8950f1bd8affeac80bcc4cba0139e92f157ad85426a504911e0e0053f35a637655f46191b4afc552b3fb0c11f2cfcc1769fdf465dd7ddf5e8febc0d5bc344741848d5b8abab90affb3763d7a3fbe421e5e9bbcb612f92418cb0bc11179ddeeef3761d46752a9e9e87139ac0b53dc984dd30111a0652395b5b16b677bdf63f1894fdb282bda71b017c03ca88980812c0202aaf1dc809732306e605e6a5559fa50103595b73ab7acac59afdfa6c95f6eb3a6684ccdc0d9898eedc3f98dcdf8068038040b2b6f7e78eab93e9ce9d7bc7d55ff5137a8d2fece598b90822393e3e46d6cbe4fa46310cd3482364d7cfabdd125f24528a04393a1679e4fce86298e8a62f30338dcc4b2e0847f883b1b07416ffa24dd429c14e7431b19d0877d8c68e46a85a932d1e5504d81510b030093e4892a115324c42939e9c84263cb93bd661a71d80b911f3038c19a6bdabc34eaf91eb54442f125e186a44318eac4a54f2e2893a1c36467bd126dab44ade5eefa5bd913dc1dcf2c2051b75a4a6243fc1469d15274e276fe5315ab5e292a73d79961b9bac50b91d7dc5ad1dfdf44dc535a2b3fde9462339628e36f28b362a9ace2a4e53c54dd6624c13b38a973a19155771d8e950f11597197dc5377bd39d19dd92ae727b4d2313c984bfd14f57b9bd2b6eba2b3eba2b5eda9351e7a2ecebed555c94c52c383659c191070a362a698f1a79d901848f56a994e0e5289ed32ed3a3d1635ae5de88f17220e14f5e7e84774019a368248e70f4ec473aad1a5d3e2a69951461eff0920be5834ac8f275c9856fcea23e9088b01362447154d2a92951606164b4e189369127f664984391b815e99abe58743648c33ec7928abc4452baa9bf1cb33deeb03dd85ee9b0bdbe89cb25d34d271524d4ca1b474b8bb38ccef2afe6177f7168ef62489e919f1b77fbf2aebcc714bd31aa529c434727a39d5e8786610d272fba1f7dc97429bfb17cc4f2861d8f95cf6bf7ea7a344675efcb739f17d59da23a9ca326a3baa364e045d7012746c988de5d8708c3f62495f81b925bbb1ffd8a1d31dbafe00d08f61b46bb04d86bd23ea6f106043bcffd748967ec353cb35d5e4e4c23b3c5b3bd17f2b2e36192d930cd65bd0b1cc4e82c875d10a3114b5fd92cf3cdb18c584e62991cfe482cdd8205b738a9458bfe6439e91baa4fea185173be51c73a19d41b763a506781223b99c62ba6afac9c1bd2e7f057d3c9f457b896cbad3ad5d97ec5fb1a11b3c433dc57de1d8f4e86fb4a8e1a98399a9857568e819acc5dde2f66ae26a3e851a2c3d7648a51dabbd7e4bef4f2f6b9fbc5213afaf2a22bd358077d5fbb3214cbbb62b90b73cb47cfe2f67e45f2ca6197a326a3e6513a3a0cdbabc913a364faf33a344c318dcc2b9ff835998b2bb7e531b2e59ace726146f17042131f11b9f415f71b924bef0ec709afac8aabc0345247bf8818072362365ddef43ac5caf727247fa5d3c86c7a9b4c26092b95a6fb75163dcff9e62e94a26b44e7793f2299c334a61b73a954babca59b2ecc12729c288a2e2fc24674e654b01132731cc7611a298b9071d828373bce24efd759f6cca297be7157f44de51a2133f7d29db5bd95738fa569e22e8dccdc57b81711392cdfc998cee10f25c372ee1cfe6266794d367d9b77e5a2cb9d66a0f3ccca2d4a86fbca5766e6ed8ce8a3d7e4ee74a8dcf44ebba2fbcdcc7de5b1cba172d3572ed6e5b09fb1d3313a57cf5d7a950bb3a944baf67ea2d78f6e0fee127f19e82cc2349dbb733803734976ed2eb96a66af3fc1f6e575218baa742a7ee20a27146c3f0a2b4fd872c1368657512452cae205a99f2454018706157e805208b204f8041ec1834660c21320120e6000f9efc62ac30f00dad81167c8c3dfa5bd8ef1a27296438ee55a98e2be72552ef720d1068d380326ceb81167441b317186bc949277a3fbd4f293cd4508c9db761ad1469038e346b4e1c51931d1c6e9091a59ca01f0c8f43f4491b990e59fe8013d399a0216a01459422b28008838433e0a94429634c440e38500c2200017010043005a00a0058096972fbca0667861060b1fbae0c30a1952c838c5e0420c153d6ca107161ea2e06125159452f1b4e09976c8c20e2518588041d2218a0ed6e50a2ea31cac90830857017717e872a7c2b7175378a1b990828bac059416b5250a2d180a0aa82bcb48bfa35534cb1599be07ac719aa74caf005843855491e983889d8325d30321bf43a5576632bd9655ec52695c04914c0f69907a14a5657ccb59e19c11bffcf8f8d1aaaf723ba20f18b98aac135cf98029f9ef49b0428e1736e8f2c520a812e3b582f146c5d10b8c25a3c734ad81c556238c8271c81aa9388c82710dc3783fbe6018e625fe7b89f9a153fd5e83bdf009626be5a401f3d2decb0b8c7cf121570358ad54347cf88c8e393b74c4f10e80eea89353ede202030a507b7d1838feb4d7d7e12ef127c71f201deeb2c3875ce1f781c8550eefec7d885d1a27b2251596d3591cca558bb7b8f88b5cc11cc663e40a46c25c2b5302f80bfd4a75770c8086006e002e00eecb9d711fae8c18b787cbc34d5d6f07182f3a60cf051f884cf5f1f57177c854ff2e708b0b65aa05b3c05fdc517157aee942992a61d285435008b620908d11cf1ed889270f2c7ca94616a11163a13561832e51fe18a2bdbec43ea26d2044f4f431448452d6cf13ea99a772c5fd9b46487801fb0b8c7e9dbb469a9bf3ddf99041411188bbea6673930175a38a377a232bd62a29066b749e339a21cf19a3c8f326374e0644a6e6b3bbe312717d78f37a048a413b3badf375ce148de2905c613802691ba68f4072356488bb905523d0d4b66c47aee6e777e6b438eac49cf921f002a58bbe4d4e62c1923e3f3bfbebc628775601ca984050c66cd2a4a46d22a00cd4aaf8b95d0444aeb0cffbe0e676d2acd55aa09823d07cad40980f0c1b31d29dbb11faaa69da865123fc83bb868930199d4877ee234c7f2614eedb85a8d7268a74c822e10540967c828d36253c64c85e2c8fe0f6ee3fb677980813d289c86f27e11fda2926d25d6d6c3277618703b580eedc85e8ce713f42bebb10dc2b3ea2651edd6a93b7ec425613b9924dbed3fc8b5c659ff7e4aa7e1e66c20ce6d8a427cf39b1d37f5e9e46b667ef6ec488f67a0e88f6e67c77e7b73a9fcdd3796c4620999a8fe90cf3b1a3bd392f7f6cfc077da0cc708a60919ab4b0e588d9b324251441a8f552332b571b7cdd21571bf6340c65f5a4dc73b150063d7d16c87d4969e3d3a9857b81357a16b96a644f2360f986ad0f63610a62165b24c6163839c618638c718b1487eed056cd3e2d016d4ca016d024f9d9fbd629ed753afa14497b1449156a2fc3384880a20daa049c212f5100654c2b501c4aeb10c5a138b046ac43594e91658d1f9c2c0daa9cc2267710ca7071d239591727183ee4ef344fe54f724571624afee5c5f3fed3c95215c4d504aa9ff853e11795e743fe284e3c8cfc519c4871284e0412e58fe2dc6446b29bcca6bdfe34015cc16fc260ae20cb4f24a02a0470da441bd8e5a707608d8ba6002e016d60989e20ce90352e4c914019f21407952a0165504a29a55409b89274892c290d7090f109ca909743f394e3bf5386235a814ece3a0a0a4022600d2e670f02d390b38ce55ffc40ce5874188868d5e8d983b4aa3ebb9056899e9da655ddb35e91fec12972065b43e485c8557622e4aa234eceecbce991e3fadb8fd86ec247f4b777aa1da097c14722a08cec3b4c60cacf0b213ff1114c7e6cef1fc15d62d475224c7e98ae32b737465d78495f0513316122256c652abb246126d733314461c3822c26a2d7aa6170094adce4eb5a2790c8b10b02651f9120c9d7e59c4022c32e0894c5393ac7a1f6b2479cf6b2c317b922e2d9b30c026197cb19f6d1ad77b6775d746b7bd7bbabddd91e761dc3608df88116290746bf6d970899cace65d742a0e534088cd448845c5da6b2d76a4fa7dff3b25c7d2f590921c8d9682091a10f28237b90f63221ed65d73011ed65ff9eb3cb1b4bb343970ccf541d5a338b744d536d0c3b4f328462c749a6f7214328764890298c859ecccccd43e67e9478498d38240c6b840946e9ebaf3bdba3b4b60a5e1825718e4c73f3c001163eb17393b363b193d8471356a53d099b846919a669584be1c969565fcbb01dadfa620e10ad2a65924465415a85ca708eced961cf0c708cf48f9ddcf7d1aac892fb42a28d915e19e1768490fbf148af60187e1cd02af8c48e4dee03c93019f343ab48b7f674fa214c7dec16105970924e979fc17ed9c96018629517ddcb924a2639690e8e640db58480805a409dac4880cd23af1d289b7497931e6ed3b24ecb24122660dac65d1dcc6aa6d58dbb3a89c9eee2362de68edbb4ac621794525e99b6c18ad50cd33679c94dcb362dabd825a19492644722b8719ddcb8aee336b949d83847964091128d6edc85772c0bbbf30895b348acc1684543c37743f94bd4651add38ac5e543b2cd3e8c65d52c46d54cb3a2d935db18b4a2f8ce048cad1e8c62c2db4525a4982244922dd9825d436ae13691bd7896c86441db76992dba28d3634d46ab548b12ae1e709a02841401dd4e3339db40a83a5295a45b2465aa45db5e9286915b7d3aa4ec8092432abda85b56cab0927a6c85f0f4d23ed4d9b2986a6cc6bea68a2d614f3661e41e26488b65aad29a4cdd050abd5aa5d0892a255226de3ba216de3baa1215150c76dda50fbf45438d40bd3b29f1c243bf6744fcb2eacc29e1b3b3b3b3b56e620c1ae1dcfdbd9d9b9ae9f0c77ae263d3b3f3b3b3b3b3b3b5c0d9a60f041403f3e3d7de300204342ad27374d7a806c9edc38f1e4e6e626e7e626e746e7660bc24a243b1269dbc5754011482269998aafd5dad38927e220c9e9984449d5b68bebb01b40303cd55a6b9b074afe24921c3fb2a4124ec75d9b26ea964cc5ffa7134fcca398b94d8302c41365f7b40f5003354f6c350f506cc955f3c0144ff394e246859ef6e927edd33eedd33fd8a36857076535fe6044a28d4cdd1c692f228949aa12eee21135905cc18e754afcd1ae0c92a928d794f89355eca2dd31a87d722a9cf12706b50f4cc5fbc49ff6e9c9b20e38d1508a8ed250fa493fd14e7c8670401f3132c51429500a1f27dac9134fa0c82852f8f0f8cc1f277a9e983e3df0f306f69b3d7126e955d708647a2c3d5e0ab58af47839a555f6f17268dab46af4f879d3aa23ade226925675173dc2f74d508e3640b1257b223c941c1f9fc8f1b1e3b59824e6442411e747ec894e6293e844e4c9f15913397e34844cc5dfdc449bb6191a12126a050159a024393e4a9ea924c7aba7e5f303d42d1c3945a8a514d9924dc47748723c8693e3b923397ebbc9d1a64bb145d12773174a91b77be5069211885e314a39d45e9499911c5f9bc8f165a8401197c1b610ee96147662944c6c1db98a400d141b0827c7069aa6c831b14197cfeae4ec8707fec02e08fcc9188eee10b2881ee425735ccc58d36a8cddb2611097dcdf4ba6d1de0e4c7cf8fbd6642d76384439606cb7025cbe4e69550ec797af536436ad6271b915e0c24e8d9ec385ede1ab7d857616dafc36da4617881062c146dbee65c1bf166737e2d335c02d61d8a9adeb8feebdb7f7da3dbd740df0969917c5a9c47eb1470a2ec66bb3ab2cf9acc3d1e195ad59bb5487eeb4373a3795d8afb6a694f6a4a664a788ed48580d56a10e58ee2f54f1055ed9f862b6a650e432878b98d1706d7535b9e23aa5bd51ec5952ea91ab92f65862e96ebbc7eeb1c3a1e18e876ff36edaed518e8f915f4df7e4e61ed3f77bc93dfa077186f6ee7db5d9e1d0e2db496e29797b779b8b919187df76727f1067882efae8c60ec7e8a21734c7b6b4187fb2ecb15f52c35e21f45fcc96def2b0f6d7af53eddd89941e7d640ac6461823d3f9a96c00ea4029f6c8d40a6c8c6f8fe7545a35b35dc5daf658cef2be73d3a1758f5dc49cc7828bf86a32cb59f06c8fe52cefb40e763a1a460cdbdb5e5fbb1eddfbf175c39fa6fdf498eeeed7f974ad6a9aa6693f755ad566b69faee1de7efa344e74fbb13ece3945f3469ef80b72caa28bde1fdddaf5d8b208eb74b47c74e8a455a2f7451d8edeeebbfb6b37fbe9aab801ae8dcf5befdd7b18f77771b3b7b82a7ee3daf89cda8635dc3df95379d73f8836e6bbed588b13fe3a636f81dbc98db7707118de1b63fdaff1cc76ecfd8fa65f7287759f0a9e1885bdc22e8877f76e126df43bdc2b4e6aa7a37be399fee95857b5799515dc75a9ee2a6e76dffd762a55fbccec34adab564adefad26deb53c5fded761369baf13a5cd4bdcbe230ee8abb38ddc635c05bdc1c7ee316e02d3cdc2f661eb6ee5abc36b50dcf74efe38fc5bbbbe2dac5577173b88d5b80b75c98bb6b1b6739cbb956a938cb59aed2aa1667c1414e19d3be6d18c333dabb6f41747d160c7f2e3e1ffb3348905366398c772cc7fecd025cd8a9ed395c7cb9f6b6afb8b6bded2cae4a7b1bfe82e0abd3d17d86a50797bb0e7f18e81f943a1c71737165175dd73d68767161fe5ef28c9d4c636de3daf88db7886fb99a96a3a7b0db162c77eb0d1bb8b664eac6852c15b7661b17b22e1854855460e3c482e5260e16963bd39fa22fe6781ddce36bb276bf49c4170f3b1d44e4afbf61b8bb35b92f1179bb414eb9e2fe419cc1227a8c8bf251fa11a5f77019df44ef1f441b308b663bc91cfe5e3c764394dec36364c9064ac12a02a560f58051393a6fefe1a20b330f32f476a6afc577d7ae6d1b2dfefa2f667bb2c661075ddeaf7151dd6f6091e112903891476831014fb073849b0dd55619e28fe4ba8e0d3405966515e392460f8fe9c761f4ee40ec8e4168640dcfd86f34f24cfcf619bb45cedac734127bc491fc026b45024498b88a373225affa570740e3df2977f5b3a7d4bf7badc9571dfed9ef94eb06c3b6f8658b08256221e211ad189d462a46f7df09ffb3d9e6f0af66abd34a721f006da4537d026030ad4e92fb2bfc9da21430d59732658a7a235751094c753402531d0198ea3751fb01c09f7592fb3ce0ef84bf3ff1a0bc44c97d95d8b31391e4be0e3b4972dfc33b52aa0bfcd916f807974e75e92d98a78fc22c6e9c4eb8a5024f98ea1cf05755ecc567414ffebbe8bdf8f7b6dddd595eba469a8544e9b0ebf17717e6daeabfe8635da18c8bca31cf7d9e6a5aa7dd983b4d5b52928934b2f6ae55d35eb40e1f96aee81bc7bde3e6bb79aec34b4ada577b649bc5dd1dfee27ef63ec6e7dde1dbd603b62edf6e6571b9f618a5f77021eb9c94aead106c5c477292edf0ef2e3d3bdcf884a428b01fd5e9f8844eab5cbe82acd87302fb519d4c0753a867ab552f979f525a3543ae80c8947c0b0ed9bcf8cb01505bad2339fbb2275f26a5bb9ff6449392e594ecc3b797ebf21914664dd3ee4c909e92b707e92979faf072afcfb8325ec2a81fa5f7f01e3011541fb27a7809a31a2f20b24a87ac183edc99edf3ed041be356a19654e22f3e8a038bcd89d53e3fb35d13bd776c7f935bf78eef3ad8f1d034eeddfd7acadd80607bca26bb78d839e93ed1b5f794ac451c7bfc025b3c7a61024b4b606724d07f86f9ab2dfbedc25c7b3afc11c9dde422777ab7c271da7657def6dc0de29255dabe53e9e8935bca8bcb57218cbb74f896715a37fad639d61a45c4bcc156893ec29f76fbedc53542e6d1ed8d4ff4dce8f3e2a37fb1a7d52a7bedc5e845c4d1e8338f308ac7e8f1a3c7739d4ccded7eb7d145c98c3e0ab8e4197c151fe10cc83cf3bbbc26eb78d15d8efb6ec5e18517667c3f978ccfc18c8f7fbf9a7faef40d76ea7f774fc777e5bf2ecfe1ba9cbb31dbebf217415cb2e92aee17c425ab7ce5f76ecdd5eec535edfde2b2ebd17f818d9059fbb66933d3329537feba2681157d83b12d74b878fc0663ec70acf806637338ec70a00e3b1c39a860a1021f7638f063fa1e76386eec38fb178f696aa43d496d8a807118d2b44b33a7684f4e694f4e299ab65dbbadf6646dc11a5896afde611cc27822eff06803cb432bc9a9cf96b5a7d3ef79addc2385ae9c22ef9d4e34994e66cfcce1ce3b9fb4dc0945dbf0e43962353058ada5c8d608ec86ab506db537c760a38cb7c579b85f2b49f57cf4c8e6449677719ffcf43cb18434dc64026448842784f27671dd8519b66ae5dfb7f8c5dc7da74d076b7fdb9dbafff6c7ac0eef1ed32dbe8dae119d476f71a992f6e4e85087ee7cb44a69957c6db5aac5e5ab506d8d7e693afff72f42c6e1ffccc7281e3fa6897974ac9319fdf88b3a46ef5311d88de705aeadf6926c3adbce086f2daecb6912568b4f4c51648ff659ed9a46757464aac3d11a12374ae4affa881e9de8d56cc9f844ab545cf4e8d3aa17173d3ee955e9a24728adb2177517f545da45f1a2c723ad6ab96874d18a8b5a5c74ba88bb0875d1e34eabb68b1e9b68158b8b5c5c844fd7e53a5c98bb17bda4143b115ed9189461d703c5e3da2d16d247f19841e57098f13b8cb2f0c5457577c1dd4b17d5e1da6a4f4a08ecff2e878baf4adb7bfc029f208ad94a92e5a5a6640ad9e4afb67ab229ed09b527afdd4c4ae62227cbb3401dc9f2dc4d962e6e1ca12e9422b3b8d127cf96945328f68c7036d49ecca63092e555684de4ea736a69eff4f80ee3ab0d1c0bce1173ad52da6baf456f6c3f117d6294de255ca5d4160d815d420a9c743578c99ca645ed0679c95bbfc1d3993cb189fcb97c5ed49140f67bd191ab0a0698923743966743ce3a90e577224f6c525b3aad4c79b42ee46ff2685a4cd716ac111b43f9b213644a24616bcd238c44864408c14d5e913f0f874cc23ef348b9aa3e30255f7d74726690bfc9d303c50bf2572b18a00cd9755dd775af60a866a86cc83a9025814fed757499d7e5daaae4be4e863914a1355c1159732a126b4657f4404e8544326d8eeb79c1964b50839d3b6015604f73a1953fd85399e84962e5942c2fa7c8f2d0c70f09650b6ce479a93d5f320becf578789a21adba70b4a1d207943fd106fe449b6863ff4525a725ac123609fa63024d39e5a4d7c710edbdc040960fbc95abd80198924fe2a4448e4b64c83adda33f68b48132e4271ec2477bf30af0e78978d38ff4d61b9b2cd844d836da09ae8e36fd1b31ed512143ae60617b270ae3e512f68b36361f148201d2aaef24550053a98532053070558235a292dc4b58d24b38dad46a21feaced443836616b7b3ef001c7719aa6f9e0d31eaa75a8e42bd6c5a91c754ccd88000300006314002030100c0705a3d180409355b5f714800c91c65868501c67418e42c818638c21000000000000004484490335d84bd805856abc98932c618afc14724ba4f217b67b8dc50f3c313261647db033be03bb1216fc3ea226ac07bd24c6f11c830c5087a1415acfb406bd0dd6e1c6dc87774ddbcb47ddd72f3652721a5fd0af878ffb00e5f07cfec89cfc1701e471c295a8ee4d0a9df4b8689d40a2d339c60bcfc858fa96e9dba3c3dd39164181cf168c370c1b05850f631910c652ccb6bc553352931e703857a3c7e405e39888395596b2ce6c2e47362c780aeb95302a8d9488fb4204060e1c56046c88a2116c83f6a37e4a816f7412baf72080c1f719c6417576e0f7c30368861b08bad093d02620ad402688bf42af79f061a45613c9e6a78c1c082c2280d9e33f4a8344118c250cf9bd2238309d1ff83ee484b0dd183a538af47ea6aed589500d61e447bf121146076c8a446cfb47345332e90c7983d4bf7666d0894c82230f5a29852a444f621974f8162164c0df3a50d77d606624d0de0e73038fb1a256b18967e646174b401d6a15309a02b41226d5be6b439fb37c560e69c12594f80d94bd77c5478bee33b355458ca42c292e2ef630001501e321873f6c58fe08a8be040d34f9a3d90436fa567c96c1b709328b6ddca5b605f35260b77e5996060ea861e7ca08171fb730b9b2ab1a1f16bdac1d659f62123205fc584b6affdff13e738c15fa3c9f8d3f6c1366f8b8f552d0bc8954224745e86f14d973819312a7ec047e366a7d9e73a25038ac4f631807d7d9e96b13bc0e0a8b1b740b54d22e504337f8c243fb067d415ada0b8c2499b1e6b7fca0ad51bfa099dc8314c9b1c3e2440f6d71b8e7c297d27308a24d562c16cf0f6a67c39d212744fed277d29794597ae175977e47231d10336c0a39a6a6785a4579b7dad4ee4fd5a053c02e8558dedf4bbd4c3f8331c67715ad07771f4c3c42d913df954362165f7bacc2f043900a5bea2003b554c9012d05f50135887a3e52d00993360b64ab5e3b5d0b8061b167399ed093261fb18f99b3ea645f2913fe8673dcc4e0c29a69b9d99ce30cea8d58a1ed16e79fe043574fbd05c00d2c23882bded0aa6dad3270900a30fde21faf291bc6c8207a145863374bf03881ef465ac480d06cd849af17d7bf8be483ae522316fb95528eaf028d17cd36d4315252a047cda8ee2bff8a6831a736eb5ca1ef21697653162720e9e3d123a0964d9db54a291b0eecce946615fecc2a66c704f65d14d48bad340eaaa3c7ecf8312e82a9acbc06fb1c26470b0385c61f8bd950fe6ec90b6a295405737487717ce2077ff9630a55f1dd29de2fb1fcca5432f017e9b9001d7e466c7b572dbbc41bba54fa139acee14b631b34a416706426373ec6c728ffc94b8ad608659bff6d1e7c950dc1b35cd1cc9556647e7483f4c6fe42a9f5ddf83ea593598bc8dc681d719bbeebcc3aeed7dbef46c7de0cd2a66e2cd39fe6b033c8db17b7eb9b848effe0dae0aa427289682e320ffef1e8e9344d0dba2d8f9db295e2df42ea4777d31fdc2c445f1084552784d872460a13c78c02216de14e8dc03abdcc1f87ada16af91da30ae143b77836f6411eae1f23cc35f2fe8e046db4afe0db9795dfd98af9b1899c343dd241e32b8da94db0aa103a181c401458f64728b41d95e135fbb0186d5e0a9cba26b843432a7e9e7254ce0b7898bd8bb03a23278209b8e2838c41826fb31642b96e847ab05b7211f03d18ad63f24d62b72954e353bdcfe963db21bfd51f55ab0b58e4f9271c798e4bd296a2a20be62432b9e4e55ab6462101c0c5de2c5f8708df0c00c0ad0d8e5625a05913df6a87342ae646217c11335827584bf92f3d1c60eaeddb14d64645941cda5768a69c7dd38056a3768439962a17d48aada12a0d8aec3010d819118f758944f5173f22556df060035a407fac93ae698df92643033faab90dd198dfcbc307c980f8ddb5d3c0d9494f364895f3b3511235c523a09285420fb3c836489817228d5a35f93a5757926d804bb9d9eb6b2cca40ca47d183e39f0d906916189de4805518e2d40ca6b176cb13caa6ca07d642a2dbea94d81c9363dce531f6d69598ee0c7dc96d6a860d1fc4784fc3f4f56bae41b2261283347fa297f3815edac4631175d5b6107b33afb658d9b2ddb0bfddb8d1bf71c3051aa152cacb9078d9bab1a4c89437c64b0ba14e23de57d52b62788cb97c422c6fbc50832c964cddf37380d49424fa3d93fdfb44d7f834b1e1a2a83248b128325212df9f5874ded834cd4537d96a2bd7ec5b5d4f97f573f0a4a2a7adbd432fb0ba7a1fec2c9837a9187460d4911326b4da7217a46a969bced6fd3cf5a2106839714052b8f7e39439d9008c2bfd42413b849639e2462d36860026a5cc129f70a1b2e42dba300f4d801e06e18b87894ea12c6aa504c9764d52a373112dca0cea2ad88e50c4d2d0ee26c353ea8c4210fcc6d14b3a6dd1cda875da345514ce31ae98162073ef7742635ad49092380514542585dd7a5b22e765fc048b532b7da46cc5de934783efb71e1223943c6a7e5b4341a7622941acdf1f222ade84e33815f110b5c319e263195a17e17952a9a62b1f459289ee1b4a32b7fd222148ad7e39610ed726bb6e10ca9e5f5d73268a1f858056d77ab3623d683a5b4561c28e052090d7452d59ff77cc0220be26cb28ea4f925cfc601a1a15227d3621804231e8aa1cd4328e21d9b241855fe13af8812e0d63a5d0e75baca829a0e6e24d9678ecf8a1b52388bd9ab11b54195eaaf218b7c007d616ea5038c096448b8d6f90ddc0d7b5d491f49ac80bb30edd1cc4d10cd70f0cbfeaa8488f54f8a36b4e60e068e65d0ace9d2a84e96d4cd4874c1d2a72a5c219dec99f3160be053681de2ceee4e60c67747d1b82622c347c73ad6f03d3ecae43559441f235d84f3e679edc7729a17c5cc0ef19953c3ab01a4b3fc6882932fc4ca6798b8563686b9efa52a27cef9f59482e375da2bc4ce1bbb86013cb1857c06e215abd9bd5b4ae1e529ecdc6e58babc20c464d7d3622d19f492867c356265c5730985b0bf92eaffa3c7f5abd17bdd369c5ba91112b958dbde9cbc604a0adfddfa3734a7cecf3956a778170dfe0119ff073ef639995e3e470893226708909009350dc69a9aba61fd74d51fdb4953f648be624b45eeac8903ebf4919b65f8bf2f04a30c88fee6c761d04f065a09ee6882871bd5b77938d90b4c16916542a16bbc86e745ff2567d6fa46d371e33fb69c293d86cb783d2060c3355fab20aae959d88af7f7df57d02b0fe8efa0a6ed8aacb49a9ce41cb191793cb89c53d0200ad37465cb6b5a18d2093a9cd4f867ae7ea4563174ad7f3ac2afb12b0f61d8caccb0029dbc70f437609682520f7885787abd968a4a7d4fab79f90db38a32e8b65f7882336497d64688cb8059545ed3c41d5821bfc3e47efd4675768a32ff82dd04b98dc734d14bdd7af799e1470b7f5f599d6d37ae1ac5cd79c295703740152b97e2f2ccafc3d528ee249f14c64762fe12ec4e4672a59715a694a018fcdb30a389c62f7ec776c52f2cecb5c8a2589ef8bb94185adb3e73eb37f3364e133f23cc54397a64c54ca031691e3d3775d25c13e1306cf0f9fef9ce0734aa6ef890edfec88d4aa5c3a41f282dc469a0c28708af297ca5fcca7b9465118898476d393ee586eecc3aed613d052602513c427844d06919ab08d3caae630c8420b0c846fe2064883d92c4ee9a5f358fa3de0311f36f65f7a128f9185737ce7a1a8972ddbe1523b7a6514808a54ef93818cf0f7fab7906395f8a78e591ea7894a8996a42b27f0589e6006a0bf1e4f3a3caa9f6f689c663cd6c9500834b63c2090eb9623ad36fb7f2495003769dd2d35c6bdc2106660f48140f388fda32674e4c070aa860a9886e2eb9a19f605c0a777aefd50bffb3637a8623cbc7e3eccc68054c14474280b247b794c522278c4ae2b019f492ebe1fe7024f9f6f7c96b8b75ad0c562191c583d7abf6092b1e3dbf6576879a50b8456a55472c1331c0556745b3cfa1709ff0d84485f39956ba1f6ba05d99b6b62682d26b8b1554d76e58c6926a3e346549d0f35dfac225ad08bc6a16ef1cb563e508a02504c10f85513acfc05c43f2e8120b5af04f601b721969da0a88ae298170d318476e2119d6c881b324934299c4dcae108118c38878427b5ab6762b2a5e3fe03b411b1be1af86f1a62311ea036a939d528eea8c0b0a95b0f1c8e3e0fa98dc411ece5c0f92d84f77f434a260be7d913dd12a0a2f222fd1c9cb6baee24cf5e645d5184c945e714993b40578de01adc26cce0f55a6f5c8e1e41a086f062a98edc40662a7afaa558c0ed3563f680f5d714a0345f825bbbdaeff0c529ada03ff4a2ea00cb147ee256d8e81ac88d52de36465e977fba0385e9716908cb0d5b505d3f806407e2ea82327139237e45e865abcf59fc8cd95bc136c20d7658d1365a7afa82f154991d2933e287802af5ffb87f6c2cf35494d904e5e92fb351b151652cb7c13e0986f58137c6ada2c09b11b26d769a4fcbcf19566ebaf5ac1938e935dd5f5012d1a0109708fb440aca55460371f4f0247b2d43c092e87139e1d412c035ebfc9926efb6bbf53cd0a51787b69368c21fc47b3d01cd09067920a2aae453bc8b54477213b33a09736339a58878dd0c19c0b99b9399adedfea9c7f7c2e128017c4551b7d60b3815cf51a8801eeffcd77edeed9ef4180e9b09682f3eaba0e2883fb218a547a38bcb2b1781e6e15e633f71d8d5558314fe9d1806023d6a610d65c6e85fd07f3881a115afefcc00b0ef73d22c2938e4358f671c2bcc7ad783013fa6ecfadac19ab2327a00e43fecb5b4ece85558e7c1b44eec0f7194396c1852a1f2df607c6f62ab013a00729da2fa46e9d2520b89d5a033aa41449388ddf02015babcdf62231c3b0f7431782380b30327425769eb1b49d776997d5b5dbe91db2027fc320202101c39b1978dbce618a72bf61d7ce111ab1a832de6ec1fcedcb0ed0a54b99b18a4e06902e7343aba7831ac2e9c59c340532bec758166341f5681092e5090760851a165cf546058866d752f0882c7bd3840253f8a836e1e9691de00e429ccc30b966baa4fc8e91127bddfda9b1021d9035d864ed8eee2a4eec21545b79f9f981494c9183a8285e259fa4774a26d565b0fa44718553856202d090f69e6300dfe64b6f2424a30a48ed28961d349bcaf8a3cac723f5a512b72ba976beb8cb24e86da4a73591e5961cb689a504f568d59dd24f52d8d0bb8f7ed81441ce045078754c55c18383e3c275f22829a26f874bbab1be34a506f5224874cfa98b104f0c138d82ee5b6d37cddd30680ed64b090be564b1fcbb96c693567ce6b1b2c1ae9208ca9cc376141b36d8f0dedb4c27101b8e09a0e8c598f2f52da671bdff6e9f17ad7494b08af63982ba710a58ced25badf7ce2f445e7b960ee02d19f98c48953a48536c154018ad5ef8e23e1f1704808aa4d867a0f3e6d44e55628c0aa3eb22f50713e6b6102508055a126e740b5b41b64c218b6e46ca6021ce14c2287b54618cd4ac97e1b76b5d2e0804f5015fceab7e9ea607f26bdd4812ef5ec83fcd8f8b1fba7f3adfd826c3a585f0f221235a54af593d6e8ab8cfd8080615f8e7c5d1eeb41ab4c14457632586a445eea184bd7a192100c946a244145123687b85868b549a1614171307f98b55471f6879dd15dede19e7f98d1f6e4dd2940039e979a61ab62661f6635b43b013ec4dd1da38083b920c5b01931fbad22a28a9d49a35b562a9aef5a17d30f8900b24754da5784224072aa567721362fabe727e8ab5dd2faf81854fa08586e41df54002e45eb85f40d6efdf5778e342b84549768e40779c5721b224b49d0031615607d28bc5a21813731ae2efd6d46d414cb1eb90676e1625ed35e9d020141f408e9f178f5ef6162b34290871e017b1c0a6b24c48a493ce8f4f333183fbbd634675015c9742351dc3232a1a475294f3d28fbd62c093cfaeaf0e8dc1e492c1bdff52b0fc2695c0733efa06334f9f9dadeaa9920a4cce858205315e017fdf43d4514e4b2e994863634b804520d0856725cdf9cc065911a02b904da8d2fe16a76fd1ff14500b8374d7deaf5d58bc7c088642cac70874f721b937e9062fab4d97d954a90df48e26262d71025865d9e0e6b88be8a8ba1b6a2006a47213d31dcc3d1415261f3d592afc58465ca0f5bb9a0cbc0e62e8cb8b2e7cbc21255777a6205ef05c12edee22c8a03a8e0c3428720680020c702194df4843baa29ba466cffe3b84da8fb2e1021e95b41830a89b8d3cec1c060c797377b570e0b9d2aeb41727557e4f011550884d9394f74d640e2413d5633138624e5f581b7f3511e96aae0307e839fbdbcb7ba440be516d8e7b0a796ef5dbaa8efacd404e58b4c28b29d3d53756dac92edbf1ba2511318b2da7fbb701406eaae8dd06de221f7673851b6f7a9b70b9e3c3c5e5225e2ba239c0674ba27aeb3ca146741d17f6808efb381bb34c9ef5e210cb7d3469d9536f510195ef878abac05e1cc5d3ab412bac5e6ff46c24565a86bd00ef6d40829b30981e63504d0cd13a1f8f8aa05ad8ea94a35ca5044ef4bdec5a7a0a692d0fe6d5218f84e67774ed8256554ff06a33286ef1e204d323b623ea4363f5be6536756eba25e303969b2883c1d049f5592e02740920bdbdf2989a2a17949563157441465db5996f8a565903ab28b45f1dbd0d1eb1fdcdbc93ec09ce1affd2a052e9973fda3796df2fc0bf28382cfb16b87cc9838f36821b76828ea5e949093021ecc2e2c28e183d7831b07f1ed0ae7b293703dbf62ec5491bcce2397941a590a6f9187a624c03b761ace348ca48a18fd4af8ed935e4477f1a8032e57daca1f3c56b2e71bf548cd4428fb469d83054a67d63e555c9a00d012b4a16892253837a31ddab03f4823fa24c064c1e40b36f85144081cbfa4440e9a9554f654f6930998a0a2274b934d3d9f74970a898b96f3a2d015a35f113a74d49a70444c7264a0b7b3c91ed4c0b0f9be2ba98fb0389926a39129109e3efd40f307c24a0ee821205c3174b2de2312a54f05c54fbe26f2ce85b4798d276ce1f0d66439a0df1661c23f13186782c2fcf1888781384930686643e0d1329a03709c3045462f07c2b092c3cbf03f110a5c26ccd2b0d81265cde99cd72f16127595f8a785730430550787d4451cdd85b51433952a5c034ded4a23f317b17e5105a7ccf0a8bfae99678a6806b022ede2c13a316c818f0c76132e55ea62e022107438884e5751f0d9e895fa92f0007cb1dd74f526c74988892dce8405d8cba8ab9c870002833977c425cdaca1021bbe9ff6c381122eaa9c52a9123f02f010f6deb1d5d5b5f2ec16de3df3d8eebf7c899143bf0c3d63e8231e84199ccca3e22a70e4b587db5d5208750dbbc01ba6be5f7a87795f05d18212b03eeedf0fd213bde0fafc88dd7ba686ff60dcc3aabc1b6063904e247626dee77f6d5fb1b8b263c97567ba5404a4bf1943cbae8be5a3b1484336fb920a0d981b1f2eeb59e6fed736ad2ba572ce852873a29992186e535c5d294b6427706e31e3cebacaf0e454e9c5a6c37f74df85aa77cd61416bbed20e39715229cd2d43306559e2a013f87047234d90a43a11e7bf95bcea9843a1f5370f5efad73c15025687c496cea374a239c8aac5a8c2982c2453e111cb24ef6ec4cdc3449041f14322764dd96daa6501bd065abcca486ac8e3758677286b399bfc87576f71055f58cd1f0d2a78fc22d016b5e8a36af6e267714da42af8226383c80ee7f4853bd2859313a99e14a2318e4f308f72e179e5f421ac9f4cb8b0bbff7b81739032d9b5269a9826db6c0405fc198a24ccc41c2448cd7d2a309887b561b3bb5d64f3f96b159c2be01955402e7f2dd0d1545039e8ccb819c1a3ec046d8608189250559400d22716475fcc83040814e15b2abaffce11079bfe877434279fc45b78f773744acf93f53dcfc27f70cfe249bb38c5ab1bc75c575030ace72763b6c188869af9860f0b2ac9dc216e23e125da8738d230c49f60134010b7e556611a15bad0e9a62ed19e2a693b19069d0d0e43b87f2d30db61bed4ff7195ead10b3ad134eabfd0e511c4d73caaa39911c9fa3744c006b8f16495bf0fb0fe3d74de326e2f970bb83058f68e0191f2c1006b24ca390ddb4a574ced0fa14ea6381d1e34989e6248159c87b5062ab545742285ada953307416ad060394e1f7ed678b2374d0f88d28d2b8c4c71768f1c271b64608f00c044eb139c31e9bc8dd5f1394e063cd777ef4dda8f9b281bcf9cc71a04259288c7382a44e0339a7a6c3b8dd2b2d0d77304fb5d896616f5ff9f3e6bd8799262a207715cf1805eba32b4bb59b807aa8f9f2c5a98e8b92d81e3c93282f80d389dddf0d420de5cc05082885e9825f9c3741f13035b02c1c58ea893e9d291b8fc8ff948f010632a2204bc2ca1102a30748e1e057b5b7f199162c8da0f2b8c0113a73fb7b236d39400a8d51e534eafc0aeed9af5e0bcc55a50d0c338b54d1683c49ae006f29fdadf7932416367f28446490633be4258e3b529387c4f483a642719fe47b34542d55439c9637f275be6a417b11f8109d4995de44c59f8443c98fe6fe09587b5220c5f3cc626ff2c0ac9e6b519043ff82f5023daf306a35c06db5412bb750b7d072c0cc72d66ae949004d08907c2d95e6bc627f39c2094471677bcf74a37433cf20eb8c5549d9dc69c3269df06e41ae72083a0123f6f4fc299b0bfefb0528d52e94e3080108c4a71d8b57dcd8a001f8b78621eac7b981519786f81c5a940f3153a351bc6539c92558a1f1825d2ed8512d139475b2b324178d19e6fa4b945ab922a2ac3b335505405005f3bfac168d04f5eb5ae48a233b4dc6630050b44b41a7f2fd26b38f4186f56faed9ea4165ffd106f8ad2c2544350a40a50d469494900c702baed1d15be5af23ff571838bb532b18bb181a3adcce55464b83910c61d77f0662d9f4afb7850450bb1816bf90706c8ff0990ad1bd00aca15a4c22e7495c52ebe73824015c26fc9a35008602ff0d9f05970f80db4620d675590de293d53ddfb520ac8ff28ffa158ba6b99219a4ba57710265e2c4a655755d1bf7f510a92eb5460936f5fee59ec6e01202910666ade846c070be578bb314a27808a37dd7dc63f9b543f1a428d83246104ee01756bdc1101c387ceb8d02b8b890247f91f19ec1be3e8f0f4439c5a2f123c748cecaa324cded5c77be0d746343147876bd4a5cc660356b99e67ff6cee0ede2f44ed7430ee9a83b52ee4f067a8f46a9450fac6b5642dfa24deba429da172ff622013ab96f5442054780067561216412d5628bd68c719ee2da811bc2529a4c882bca5436f2d60b0af2dfffd42b5aab41fd924309e1f3e700f254745676d2d10b4070344de26005ca16ba78768cfabe66715992a20642adde0f5a2ea148cd3fe153ae12e19129f99694b779b71176c2b4ff04bd1b7e1e597f55c5ac24762b4ab474f0b40e24b9a46760e97f9de14790ac608d2d459f2dbc86d3254ecdeffe51102e5a0b3018ca47de19aaaee59c22cf6e2e1be4a252134a7abd78043d63a88cc1ec0346436f1702778a780cb3f04185216e16a662bd9688ca492a8a706c8aa7d79895df2d5e13061c48adf29af7a69a2f6319f0fdbd94aa39caf68df68824cc2e26c40b38ef3648ee965a9911cf478062488a855f15d5006d86b2c1685adba4e67cd8428ff51a8f51141bc2d4ffecb973e9e5397e144950ba971ff15da3ffbe889c2ca2e245280ebabb02b3070e9c9ae29610c8915b21bb665d2203082d8cc2498da351ea9abf3fc8527ebd8ce5f6c1932f7fe88a5f073bd6323c2f6551d490c8a0db309b930aec536d9f397634044a574ee3dae03ceb4a6c20d810cfa451c5ae944ac22542c7a22ea454371c6f24b65ff39bfe2a053751ea484f59995d8d6de054af4a672a55e0fa544295475f9c40b5940b5bfa5808b7109bf223cac7cd1fc81e2352fae83189052b99ec8408b508c80014d026254018c8772787a1865e5491e3a6f3762d190d01a96c6792444867207271b540d764cfb86614726442eb029d03b692785bbb22d94a3450d067704542802a6ea313edc0da41eb9c2c048a098c3ec72c09782597dcd700b83680cab046cdb059da9ac871170020a8e1e2b5e49346c70f2564fb94534f5114e9fc6e9fa2d02891cf633061c386a63da20890118d5584a6e2248e1820667ada39d5853404ea6a1c41aa5b7bf885a9cb7e36fb48d709125c42ca0a0223c337bdbc0d04f2365f4d0324d7a5198acc1758ac8498aa65fd4e75d415fc86880bdf042c51c3c4d3f955e6040128e60cccae5200dccccc99fbc74d335b747e70e0010020e9caa88535ef6848e503981e8fcf36400bbca9cd392100d3f05105083e9f59959c94e9e5a786a24df709d49f227d9c338240d30447e7ddcddf32896f6561d686ccbad1cac3aa91669a64fbf5d8a621e1f46ef746a9f213dda549060cf653fb3f0bc3716968d7401cd2d5410c1a8e7eea0fc76103728f21de4c1d1ceba434bbf3e1fcd8d0d56d13f05984c342aeb04cefc7fe3280e9729d267da7b0d372cf17f2ace52f941ab975f69d4f9b82078792496d9fdfa81425616dbaacbf70ff90c94c8b44cbd3d9017724aa01f149e2f56cf25500ebbc213d2a627cc79acc4627b6f242520da8fe15a7b4f4b219f6ac68d78d512d728257ec609fce15cc5c582ee94d8dae7ac92186d0c316a52bec3023e29d5108e38f537b568432fe7c48f6f18e9e18a4a45df46d73a50243da937c4c7b2f086c4c04020523f4394e0b1a3f97096d68a3348b016a36d48f9d6d8e4e3701213619ece90bdad9f1654a05d6797d1518421806f3f03f01f6ecfbc1dfda9ffb29ed6b1450a3856968fb66c110e11aa2464c38221ec1a9dc1e8e37c644f91de1e04bfdaccd222acc7026fd3c9d954112c5020c2e8344f7d1616544de04ae058b4e487904f418feb834a4a0a6595ae9e8de1f55b107c65f5b4732a4c5ba4a5ae3b00f7f89cd1084246bf01a4b932854abb26854b9ea89f40de37b5feaefc3758a295b0df6bb3f520827cc64cb0a00bf68a40345da99ec9bba6999cfbbb4fd7beb8b9304e480325124ba3e37025ab8f620fecb6fe79a587ee025b3e00375b5453710253d9a40a174294ac2f9421ea5eb240c7ffdd55e0e3f1d6dd23138b044d68721df89eb2baa46baf3196ca9f0fcaf0fd59ae6337f1e56781292ab9d0798ce3f5f7c8917703100877c28dcddd3eeda3dd8427f4607d9d9ed2e55d5b49065552742f41a9b88a3542b5ef6599f134609b379a89626dc454d8b64b23ac2e51a0bee8ab9147da15a4d767e69bb6be69ac6d0649e98a2700e9e26a4d206cd8d09e9834e0167818bda31c03391be13143017ba160c868e3daa1487227b441a8932f8353045367cb40c402f748a380bec64cd992f422bb5db44a1c33b0feaba2dc7a19a2bda94db092a745b5654cb324eb70d40b5deff028fa69a0e3a88c0dcdf70112607167e9982d723af7b89666775547bcfaa6237be74930858d0b9f28574ef6c8411b7084f030647b02dcdecfb0752826ef41c0ef5fb876f895f7574b008d62019682069cddd2ab614eae2888798afb64ce10510c6a4e735177182d1c5487ac346633b15b79468aceb7f1a663ddce95e6bc340914c3579a9851dfa0a33805f416754a7b1d38a6d1f17d729a755f4ee204f28eca8776bc4fcd77dd0212ea093a5a9b80008f4a662e76468b2e9c6b6178a7b03d14b7a2e4702b7e31a9b705b2f956c7efc7938ee0edadb097dd2e9bb5504bc07d6554dbcbdb2593f884979962285bc67c2b7d3b35f05ac58fb34035ed3162d6b8003a19af417546a2e1d56e9c88d257211e00afa2e2da365226b7255074be574bcdbf8e1c8b63633f7cfa118f1168e4925dd8523de3bc958fbc2f5e02b919008262f6022bdd698389c387048c44c25dde0f9cb910815794db2212b5a6c2cbbfd11fc970bc331544d0dfa7096ec8e84f3ba627c2e2800fc7ffb24e5dfa73454e560a53fb2818ed78c9251bfea59665a6ec220471b262a630dc8c0ad52e35270bf01d3f6355785b51fd070a75ea9fc249544eef153edfc0b94e2b4914acff14ead56e22236d6d45dbb2a9b829d8b74dba92117cb8d4e3bcaf6c7119c8ad068bcc098e27497d7a8c29187398b35452852f9befb3bd5b074df8bba7eea0cb2e609cf995d3f15351367a758b7bca681668f947c40a92a918b284cf892812551681caf26b1db3b810527bee23d63d6867b22434e903731e4244026029748d91a41366112ff34cfd75f9ce4cec8bc9c5046fa2b39529f4e870a0d6b21642d1b86aaa3481630696758a2502ad7f7307818cf9686ff0c0bde84208e072a48c9fd9b9adc82a9a9690b4844838a7c3956213228e03dc4d01ab8fc21a217d08b527f1003d46b5377cee2b798ea41148b4e549debfb3049c76597dec9c2a5f5129bccbd5435accfa1d9e31bcd298d099ac0d93c7f166ac824f2f8946bc1aeadbf38ff042bfe72471a8264f2e2a4cd9f87120c2bc1050040926b931fe6be2ea2d6230d2d5f5cc6fffb307fcc74c618589bf70d8ec44c44f34c5e36f8156ae0ed4d500bd5007afe5cf8a3bd78fbb9d7cfcba2793352599f03cbfd386edb3fe6bbf43097df5bb31eb8d648e1a8f7e47dcf3da0b306fe32b4ae807e616b186d1865a5167efe14708fb74497357ee197a9906506e0a4bf135e3df5c9df7be9f8cba25076461f828885ff23a19505f356f30ab05ea1db05be4edcb8eb5c68c0e65068b4277e4b7ad193bdff610848c0ed216e3956366a5351f53020ccf47fe6ac53ac5b299921cd936a3b572bf2eb20e7a8897bd64c4701a847a2de14bc91bc73d580273de063df1e54b619973e2d19db0b964e3112fc00a4288adf923a48414b2430ee3d4bf739e3f075eac071e980b4146bbf9a0a041afd3698a713335bcb7360f260fed693b09d34f5e2a45281c05ae84e9dd163726c98e8183c93ad157223ffc588c239b437a90c22573a83e2e0026c9da348cf2f4b00f18ce0297aea5f1f972418374be01289913b281a56e51c4e5344abdfa629cd9bd74b22e735b8806f2ff3378f8045c680cca13a8f582a423614fd90c924dd84550f727763477031c8caf917ba3a5d14664ab1f2cd12658458b883817552dcf603e249107c6b72dc2fbfb08e936399da35ac5bbee320813bb5acf9770dd4987523dce38e0c5d028c98e3ff80dc875c1849c5578c8d96e2aca82db95f8399c77130550c41291470d4c3846ee1ed64cd94a61dbdd67ad10620a110ac6c751a4a2f707887de2642d5f917ce1364aba7b89393c3df327ebf81d8880a9d042d52a9647ede26d096541e0e37f4c0b1791eb30a27a3704e9ca355f3786e8b3ad52807019b34df52a12480ff27c70059511cad0eb13d47b67fccaccef29c4ad9844b54dd910cc962b21f729cb2c821a53120526837065aeb8048c874963f6f2bfa4a8e05d9d007aa93d17cce5a3fdc526316f7310895235f5bac7eb7f279dfe6152fc393ffc5c196ec9aa2fdb5a91cbb8b09447e44049444d1849b26a139f913665dfb7c3b8234b6c64e312d1811f89aca0fb2d44c985eb7e58c78d9539912f0e5194d63198439b984f8d25062cfa5debad37b390a66e426d10e327ed7d6cc88bb0c645eacfa94530b4852449c8833b44728a133d15a36d8479413157522d2a62d66964ba12c828421993282c90aaac289c8e7688898a78445b9c31fbbbf139194aa3cafafa6364a2d60c033b141429082af73af6f752b07f3e038dc905f660d9cd4d6d783843f3f89635f7948d4c068b08fbf2b3e30a0a8a66c7025a1541018dae6733841f582bd9ec20a4a07ec2e068c9b29228b8462a547cf580d78b5e4361a97d9c32baccc22b272889097489efddcae27fae72f470e8a084bc58a6241c58c2e2d04e0352956eb1e1c9d2eb52abaf81ff9e02f691e73f4832ff182f37e8ce93722cdf011234cdd583ed90c5f0eac4405476b36d05a5948742495a21b8929f20e365103c125d7af2127005d11d78116d136ef89daa3cdf35ebb3e64bc5275234d89343dec63a6f65ff2a38cae4ee12ee410c1c81991db33ca0fe124fade1f7fda953d1ed50e647ec83fb319af74d1b5d5031fc0d921bccb463754a96791c91b4de3abf67cbb495f1a21d571542c003f67d0c8336112075288b84864a3ae9bd0e0dca45894787d2aa7b34be69c6501dae1660c979821776d79edc2e6993f6824e206fc43952177c6540d19e7fde9fb2cd2eca42072fa4c3979e0d81481521ce1025932e9fc8c70237848e3712888486d51390e9d9d112a024ecfa5cb5ad14a20b9c717e315fbdcc528066be6299561d5d9767e710c723a26031df01de03f09504b408c1f1387661b3ed31d740a70aaf3ab85d087e2870bc9fe0b212d710a6262fdf6483da82f3910315eaa27a2377a46bb4537c40d73bfa7b949ff52ffb44688f253b0f413e83a55801982580584bb66229d4aaf7d38b3e3e7ec3c41a1b59bb4c536386272ce68931d7da59eee65066387eff068b9aed0d21eb37fce43037266e9fbe75db4354c608efb236a6bf960ef4f8995eebe3f81d5b7e21a91dc27865ebede8c5f1ea313733e8615df1e0e66a34ac41524e12915a59af02505341009ba8dc414120fbe35db146656b80923d7e48ea4440f290756563ad9e85e5165d2a85a776342f69132bc2f93805893aa66b4680cb4cdf8dcc050c55f96dda268e92a54ac5be838836c2f6448eb01a8392e6c078565acdf580274ff2c3a07c57b9d1d0512c2b891fddf22d0ff2578b10fe8d1823c1e6bb0649f3491353756b124a350e12d41b8408dc14a7e54f1f31d0b8e7196e7cf3b7cfe6d88789d7d8a7d532331c53c26eb112c33b3b233c42267c27da6b5bdbb161e2faa4d8d7da28ace9f47a7adec1655264100b82d8fd3d77a02c64f0424c6562405c67837b4819c4b1f8b6ca002818c9e6bef936e6088d278c3b2b3c7c2ecdf02ff506974b17c2c6d0238e763ed0f63541f86f1051207b77b1ee396da6b88e20f7e6b06a50e3c1726630e7855180e1f73d6080e67fe8c148227e8b701856ce8ec18989a781e5806d8d41a419c15f493c2303bc1a56250f0d8a9a21134f927a408ecbed0f82de4569b6ce4ef5bc3af09cf6285c449706bd9acdd84153dfe15341876b48d1e963ab1984ac464ba259b52066c3de66ee9cee11c27eae9b4032f7a0b6bd5ebd6e71afd9ecbc9560581a9b3994ae804adc527dfdde1e4eb2615e746d4001f2089f1902056d21ce2a1e84c34ec2b36e3a28260c52ca01d3f1492d4ae0116694240b9751ca870bd6533e149a4e5acc612ac701df7ebeb8a38149c433f09c82c537b4c7d6c4b7720485318ce91a662afefd8c382269170f90f54a0c044649625b58911dde803439a186f22b1f0506d65c713103b1caf33a1a99bc0bee33246c24ff7828c43337750f208e976e28632c0ce1ceb13de43656c5700caf50c51f3f6111a93f4a0c499d7306012e5c9080c411b63be627b0afc220532262490c89df194f443fcc4fffa9146d530eff3faed620382a3085345b2fe7f34dff068f9ed9f8ba990b38ec86aaa0ceb08aecc2f532b08bf6d27026c084009fa85ca65bcf153706040148db3cc7f26a98511072d6ac892110e549ed0f6c766a9a35caca3db1d48258745cc171c946558c6575de544804fc5b78be28b4f4df245d30eb7e0e0bf050422a051236abd22911c2bea347ebdd5cd7ce924ca2942501ad35f608a284195a30568a01ab7a58aefd90cb8362d082503eac0d0dd01bbde21a02e51b128679465fd93c069c0fcec41e07de9ad3bcec6819aa0d1f0ba8753190a66c8edfa381e84837fe167883ee4383e4da21c92ff2b4ac0ac08888bc084925987cc1bcc8d029fdcb63a4ea869c9d72ecb617597d725ea3cd30c43c44ef8f35edcc0094fc9d3fba2117d5e6c76a6f40f1fd0964f35178896534d549746e8cceed7742e9fe136dbd0060fb7dc401eba508d33be536fe4c20c86fab90c02fee799e7f09582b9caa3f46ad75f07e578b5198343bdfb9f579720d53cb6321c9efc9ca47143e6c9cfc95012a87a6ecc21fe58aaa3d199720e071f124c6bcc11aa73f783e4d736244fcded388a4458ffc5bc5a05d8314537c2e1bde885c590059d211aa05f971d9c2f5408c9ae79d9b104653b851d05b4f1e15fbd1cc9736655db22811363d2ba676e431806258e5af7f2bc0376e3ed8b85054c00c7ec51c3629c1c1fc53878fb597858a2494addbe6044ecdabe89f40f97a7865f2d4453e01abbbbad083fcfaa32c8d360cd01f7bd4e988ba875f63dcf307c44f3a4e538901cf6760d0ccc176dcd3446a1ec6b061a9bd3eb5c14f683506f96039c3ba693897c9e6088055487279600b2155a911862d0a969054702f3eab0b3239b322d071aace518993527ad1e62e21c732b7caed821f8031e5fbd8f25966d3b4d31736acc5850397acb319fa82269741803ed1969cf17825a65894b54c422a570a140d97962232dbcadcfef9df9a70369b2ec20fa4cab1b9c81a4ab34f80918b8785c223b9b5bc3811afaec1d3eb6fd1e31c39296f896fdf4967dd961bda91889b6446a0c2d88606c6d1f5da642f4c6aff5fcf3716c7b34887ddafe7bb9c57afec6a56590216a3d932da902a2f0f9965a74cf077d7e2702c05eba9d7fcef2647aa603c44f226e4840c167ee26c2e9ed3b5eacdb2b1dd24e5eef24262626ef573b48d22b04e6d6f67c70b0d4226b7d0bc586c6bb894b5ca69199121f56f038fe0cdfead781e0d2fadf29158969ec503de25be4675ec8758df2096b969519e16861306720aadc9afbc2938096129f6fb83ff900ceabbf7535829019e10f722796faf06a74750d73fbd3c75b2137b6a3604cf165ee9c6eecbe5be4b91c64462b4f6b68c05098fb9916997ec30140a0acb99cc7ec5570bedfa73248ff6900bae66b093dd54adaa57d9b43d1336714426d7ff2f2d4bfbb9481505fc36396d01ae1717c7105d15ca14676c09ff3fa49c9fe69c387c75a98aed8a5ca00ab19f441f5bb2104c30a0d0284a6a93574c4734f8b5f0abc6c04faed5244903c6bd1859a34438013a0da8354d6c096e4c52952db69300cbe0cd2dd5bc63ebd42d9c72c5081212a467bed54b50e4809423e8b69b751c1a9466eb1e4281aa44ca0a40dca2f4c16de7f19c259edca7fd2c4f7c30bd6fd67c2a33336decb6d52d16da48dcfed0786cf869e6f0883fef2e0d52f62e1f290c35fdc75962746410f01b46ae19188966debe75bb3529fcaf1c418228e7e7b721da43510438fde40f7b8b91efbaf647cf4b5114d193b23a0981e0d2f24d9d9eb475cabeee41471471fb52be4921a3e12ca23e705faa6a2da1623755ab9a6ff52a70206990dcad4dd2e72e2106a002dd11e8e258a9d60a632e98d3ab3c62f2db338564f561d3d112e34e2a06de8523344874b06bdd4e28479906c7c8241cc0210a9e1d588bb5162a535a31706bdb11708d07a0a8d0f81e01ce481086c4ccc31d581c881cd46aed09bb6d8d2746e83c171e0c7ba77f0706d5ae63663738e37d13ff153fca156ad245951eb3c08acc754469012c62b3899a37a264e4207c530355c261064b6a981d21034f5a040a58d654e151c71df56024393adc6046a6d933f6618b268302604e73518541ddcbab2e2c106fc86fe6e3ec3af6f0c282932a56538dff1ad728053abadebc69a941aa47adc6808f842657589163664ab23854e017cff781363c664e458c8f10b62ccb0ab71b7d75146588e26af2c70965a96b44234a922f3e416ac941b27fff7fce9789efd740c1aea536980f3ce61eae221806394adcdbcba7f5bde8003cd8f729a653dfd35325a4c4c897626978283dc5d48e3ee4047c6f946b83067552b68a1428c1f3f16aa78f29a7bb0e3fcc289d0b5b4243da773cc2602f8840009ccc89a94635064ca26654c95fb4fbae6921fd26a1545c6d878f4a1f6afb7c30503dc96460fe7bf9bf9cbba23a68474c0ef27c687cb31ecf36d87036621d32ddf4a97f927947bebbd00c01321aa56f425c9efc791c808865b60ba1303b073ef6b180b3d4b2e92c6c2c68d55f1f68cb7a59f2a2ac21c6b7310cff3d002133fc4b9f9e0b7bbf5f6175991d53a916a96912639d611a0fe1072ea5949045ce66187a81571a2fab6f8d972d0f987b0cc98cc63d40316266719eef114c759a6ff23886a484dd9670a6ec3ae9f79b1a18ead5fc4b85774b3f6f50f68b71792e3ff6c917006a722267fa2f527da898215767bd44808ccff2ac01db5ac4a1ea05790e039f5c7479f504dd055913e87b08518ec3969a7608ac36b8b3555d81db596212b4dbae32d8a8dd59a198dfa5ea5c08a30cd37ee9b93df7d279dce59b9d3083db9afbc28ea7dbe6fee8d1b9b524a019f049a62d8e11e7d7f2ae7b8a866bbe4a6d0433d03619eec18facd63cfa743c4d5f920a65b55088ebc1c12d00a335a69ebdd74de9b1df641276d2c79f1ab9d018815debce9435539224908a0c99ab21bf4e7fb4ecc2e605629c8007e06dc8d0c5beeb3662737a3ea79a59bd48481fb845bab135c8f48afa956ceba5bf3be6f9fa4f3d2097da48e38e7a0f0ba7f1d2aedc6e81a5a1c754033e51b4f41c13e4e397cfb01cf540a29ca21d51f847db198294befffd593dba7beccf5211a12fa138885e988982575c287d1cff3edaa94e186c2a2f2d0af74b3b488f9259610d8201fd89f5615b0388c2c734cb33f75d1fe0749b04f79384611a57684349a2e048a9a28007a872882dc109bf8ccabe84a6b9dd1e68e0062b9c3c00d6a9d6e77ac4eb86bc9e41e76312c6aa0929bbc43d66e99d4e69e9386a6c4cf10e87458050ba2891a299228f9cb4b402e6b502873ce239bb7801e3e186d8cc8377925ceab7672848656dc6306073bd14c81191691f23b8ad16c2192b4d9468c91c467900741ce00d03b76059ad4acc86687d8bb160993b1a8bf82a8766d39025a7f1e39d991a823ff3a9cd6ff0933e42064e77a08623d16631160896ebd6706217ba3c832dc8107a2cdd4b3821a9459a2fa1ac75be9e59b41d2b77ad52c53784122ce2b19a4e6ccdd7550e10f38ba95b427e5baeaf3532cee2a62fe10240ffa420b7036480a15ab7f00a1588cb90bef44433edd82b87e4620631275a93d12e8a3708c453603b95276e5a598ace93d12705a2ceb25a5abf2c112611423f5663c1e0cd00d94b2f872554d79e64ab1743522b912a453027a5919374f89b1fcb17721213cc811e018b8b09b113abafcde58c068eced108e05feb59c072659520a051fdc1a0d910f5f2d42e804be1ea440ccd64847641177c632da73a38d50fec33697dd810065e7c4536db5264c367096bf123142d4e0d2c82626ee92bd1fd7c1f44fa6fcfbae51f993d1de9fb5322ab24ddd2fc850a747d75debf87723af6d47e073c81f4c589880951ff34a90512fb823cc9ee1f9d22a18cad32a12faf87571fa6a54f7f6911120bb78120eb99561f3f8b766910c5632825bd92f636ca46efc2b0aba64afae53f56140b986782e69fca998d2097d396caec8e2ca4a161c45d8be28ba10bb824e9327c2fc148de1e86a5ee812ce93f4918c590c9ca680c5c53a789ffe04406f509bc3fc331d2784ee189aa3ab3a9956e7ab6c2f632e1602dad1f50ee55d800c47a1c7d143c9a8c6aefdebff95d6f885b112e4fc8485885fab59101d0d7d56b441d0ce8679908e93cc9a3775e63701991556239532c7b24e32047802cd312c2638c54bfb4d93ab0abca6cff54afd297a5d969705c84c027f86dd8b69a7ca92e0cb86b9a6f01fa2f1c37829359259c5f48d5fe00ddaa308d677325d6728bb08806f24ff9780501a772dc896511556f350b824d2dbe3954273db2a295d2e3c172dddd88aa759bea11854c9107ee84e441f386d5faef2a229bea593631d034d4bfd047914115cc53917a1150e46c85ffdc21e709d8c88aa0d38ac8ee665dd5fc2e6a5e054490d2c75586804ff327242b5bb0e2d440dd5a88fdb71f178382e5534743aff431374c72ef4e4c1fb6fced0b3fcf055c22013335244cfa6e71365bd53c8c927b9ec30eb5dcb4a7cf00952408e530e92e762933ed504083034b3e21f5f4cfbf948630153d467c80a4b43a8907d385e74a229ffae199c64c22f719dab15f3fb9390b548f311a51108df48e52ace4d19128966bec2b0bd368bcd7396e93300ca3297bf257b2c2221cc92732704780f711ccf1243ba27b246c7bdefdb9d93758b3224a482750a60a212e810cf45ef2ade4f8cdbf231e6945d8fa4455195a1cd3730872fd9a14ae49a100304b80d16d5d2355f1d8571ea9d50ab33c9517d03b6d1105d1143e7afed719f92b4427a8032155b5223efdfd1af37b6a4961de3c32981050cf8025e844e62b8c302d42e766c08de01e06731d2f251e643463cb99cc3c8fe73b7feddb58d2db2420062ce09d5cfd248186cae37e2e01e152a065c612b3f5bee53171280a060ea51cd837cf82645850b6d117d966d16496a2e2454a16e5b2994471501bea7932c42e78abf0f4ae0fb218348df656698f64f0ae7eb2033f17b21793ea95584aa5df379d201bbbb4375f7e7c531394a14ac149508d34218ac4c3dc33776bea1e100be7140b6b8fca1233b89c56efa1dc21e7180aa11b226c2b12f4c90bc55c7bfa39d6828153bd8f84303074fa13ba75d739b52eb79b22dd63586c720ca009b464d334d5dec9a3a78f1a8aafb882017cc6f0abaa25eed65ff66ce459dbf532b4bf4bfbfcc2147168ff853b9ded0e219595f61981c093a0e8b178fd83c92d425649d71510df8668e91afdf2ad27b80e064b0f211ea19e30c5cf3f4f61137ab265833cda04618ea5af76688cdcf14938ce5c98343468ac4a8c3c4690671a5987e629b291d0acff273e2da89cb0b7348b4a0e20a423244e4510240c6a2e3286dc27bb33688b5430e6f2fe2f66de02ac9603232ebbc599ed48d50c269707db967a7c2e1a3d248942bdf5070ed5fde54f3e173feed5a0b58b1bf9a931f30d1fb370262fe10f2ccc3c068458a50e900db96665227ef4298795d0a997319d036cd9ba0a5364ab2896b40b40ede05a89935d5f59ea366333795b8b6ab78d5ac121a2cbde5411045587baf0195869009b4c173263b4931adf55ceee21473ed2b01d48c85d7650745b541ec7523805ca5336b26b08c63d10de6cbdc696f5a18ee58c6462fed3a39c410b8b576985a4640307a7ba26296ccd26c6b7ce00e293da4652d903d0670fae16f418a2c020b9158648d25756eecfb4473b06a2a6cd780cf7c5ae3991584ab7840519102f692f12c9cc108218919f43708b54056cc484369163f6c1f761120e70b6751fbc72df8311a8484103e1127da7dac22838e5e1639e6c14dc8f31f14fdec2499857e4038621c4227ae629d76a945e5ffd8db9cbf9fd8a649986961c052be76f4649028ca268a29e06a168f670c6acf98fde9528a1abceb4cbba094cc2763d3c63ffea7a7e12e32a6a89848fca5d5a284732c2e4d590b545df7f0ec08d21516a5cd4a4c0b4a994134c0db215e2e48098f212bffaaf1ba376ebe3ed1523410c164ed0f6b1d1d0b17e6631c88432d89a4761699b837793a8bc0b22cc2b3203d0f2f15012dbf95b81b20b5260278d9756231a6795060ce9cc823f2317ecf548ab6faf0c3951eacb0e710669206644726d69ce49908a36d01f791f661a9d6bbf9af3b250643f7015c4224e35680c5c59cb4c2ceadb22e1c1c7747af89afac1f7d281b5d5c3135961472445f770ba5f0042e11a0df47fc60120540e24662f100968899cf188e64749591e3d03967003d97e6470350bd24538fb6a3187e45300ae3c6f92b0b25478eb3825f46a29e0f09b5703f89409ecbd4d5f419313e37e4f52f48612c042ba68224700aca06d11e60347e3184500e448e98d690f8dbe4633b9b5f3c64fd19a1626893c418cbfa0a93d7d1e3f1c3237f60ce6530f3a25a89a0b5efe0f5b7f8244ba103233c2004e6fc39a10fdc0d15822a277c558f9f7b62fc18e90c256e7f6395a24c34443aa732fe516f8ea219f04487deef4c05c0c97b2ba32fa9e242c1699a80e1771298183ade3478c37d204aafcbbd73647c24e6889fb5b4e889bc4361744e4b4b68858bf827dc432403a11095703cbaf8c1f14480f38fb769760ea36d65f14f03007d0d730467d909fd68c37883f16c75247610ec86941830a89da51a9c01dcb936731159382f9b030b3cb8a96343d99d6fe165fe8b06983f4fc3cb24fb3eab4230ef5ce84793f42adeb212675fe4438571a1ce4d48bb6b13cd0801c397de1a7cf35fe42070b53a0ef803347f086ad778068c90b593ba32befe522349356c36f28d8b9d336626c53b6789b456280fbd5f710e7b7506262b26fc1333b9ffa6ada281265828169e50415da238d99bc0aa075b8ba4af34d5e855803e98ffb105125c6aaff3575b4a013bdffdc4cc4ea55596bd4c4d6a66ca7d7b0444a182ffb010442c17bcda4af5a38e0d93c1ee85b77fbf5daddf0d42821302c000bd2e040b4130fb7611252236af50098ab8c03872f11bf613864d1b4af227d928eb1b328cad958d0c8cbe298d9b7c542844cb6e8a843ed94f864d90382d9618509d38e6a7eac9a89b91df86022ea5dd54b43e0c40df7bbb4c0a8943c6b81267cf2d67a711d0d90cfd2ea131de9088d1d784c6777919da13a72abf6da69e8cd56f9de19620c55ac08f1dd9f839462022be09ab8e76ecbdc35d293bbe1d3bac97c235194cbc12a65da972f0aef6b3b83751502c0657e896e79c06a1157aad752588841ad2298a0437d59622a3de31a0125c9805bba23a47e9f66917e3c10221d23b9f8725445f247ad6de630cb1dd87aab4de8ff30f344c2f1e74e96142a395fe845043f24914d0c840872dfa581505453cd203a4223b83d386c55b3f1c49f56caae729aa4560aabbb5be434dd85ff10ebd4fee6290841125351e2d09301357676b5787db4b5af16b45eb1ed078f300bb25563783802a09f93339266ece4c0946074a310dd4eb3570b2df6994ff13db5daffbb29d84b70a955ceeccb4d1b120acff1df3713e7b37b7cd9a989143e3b6cc2bac580223b1652782218065b6c010badb315e4c1dc159331a7f1e648bc43e4e1571dc495c4ae51699a26a8573c84d917c38e1f34300986d79e9d0d4215e7503fe385113c415465dc13f6cbec37c12f9d2b73e5ad4c3696a072013e9edde689928a2277f9a3ef39769e352bb99432703074a2e164c4057ad77256505789fc9fee836532861e7fe5bf768248e798b4ec899c0ec7ebd8755c1dae653d4a431909630c54fa569c8efef04138e62ec22c989b9da148607ec924dd41b211a73c6e696f27173f3330fd0fb6b0b470fe72f9b9bfd79d8fb04b50caac2763eb391fe68494368196ee667e9612ac41bb466e0225eee0c667149433f7b984da496f9ea3c815db1afb0c8c33f076174784b4e13911cd25931b84d58f5ebe3bb62d8ee353fb4b5f9a3324d1f7dce3b4ee23720281e9572e6e8274263282f90e69e5a94b6103573249378bc20f131847b7daf61eeee3e2da2e8f110abc2b5c700f5eac72c25f998c024bb4b923bd79dc7bd7fc094ce47111883c812598818b816d0f7d944a3948e77818a37f04db4450a92e0bc71e6cbdf512a0ddd5e47deeb6e92622d92cfb3ccd84d802eaf41964e28776300cb261d6a3a09ce3e3c3435d373a3e98059301365d403a17fb3380742110768ad4960ebeddeea096f5a3eb1c3aa801d87f0991922a1dc03462c51054ee80437bfdecc19c91459f82ad13532a8b558fc74667b5b9344780ee21e96fad157b8e531af690c08e4183696d5e2247cc0e89189038159bd812da52f869ebb65202c5f60e7fd08e1f712e330bec88de86c4bd833e8cc16ec565e672ff5671f872f2cae0cdd6e5bbc606da991663c3f139d957f9b46cca5735fec5398173bac04e3c62b79a2a9fe839592d4c39b4e06d0140595dfc4a56ace6eb8cbd3407c2036d4f36d6abc1f1318f7ea6a80f3366f2a56af1f1fb4fab0a5e71dc06869244876d679f4f32cd696f503025ef6a8f4ce25391baf77e97bd700fcc81415f3aa56d32248f4fb5f9a39442d01f30733d9cb31d781caac3e989827e2b5a6eb21e1d2d9cbc1e72918ae56475c240c0e01889537f1615994e27240501591fab240ce7f5b6b6be0e7dbb2a482acd022bfebbbb56fa341752bf6e51f6e6e3d8e303431cf9d56b77bbe3989e79ca1e6225a1028226545d6055900842f5d500b64bf528f917f7784fe4bb796f66c08f8c33005343540fd4fd7b94e6580197445632a4bd1358c33cc4a18cd7290a11e98cee4af4fdb7502d690ab4561439755d3949a236b993516ce153bc0d619635f822449a1328f054516e921a5c62611efa9a53f3f2476d323fdcb41b15d0feae97e8c909c67b02c2f96a565b8f89b1a07fd414b45a63275cb0a0d15bfeaf48f59b13c2ba4493091c02b9cd4bc757adafb8645b5fd88738921040c3f6712958dd2070555550fe2219c95650216a1121a6710af03d49f1ff66d2c93bf47b50f6c0dc390344238c2920f23bf365b6fb2d415cc053710cba304a5e685b1f5d081e43e950383472e73a8d0f3959a98d6f1b606638bbdf6249a20865ed101832c0dd0c28d4bc23f206a66de928fbdd67165790b7641311b29a13f9e90d838d4e622e1efcbf3f96bf0318869a053a0401e4e703233416d4c6c60309b339187a992136ac76931034c87cff6be28d5db096f86baf24d4b5665869be58485052f786f27329b3c9fa495bc5dd340a311c27f162b23b2cbbc54040488bbfc718dcf279dd184400cef025ef724830f654228c81ba0c34c6351e29b9c9e246cc8a844ae5a48938aef9f2329d5c6ba9a7fa92f17c8730ed80c5821d1c57324b198c30129ca5412745ea9ec6582e48232a4d2572d50dcd839447a4bb6be93706d34c5c55f28a444ef2c5a9c6e3b5d7dbf689d180059ff7a4f808324ff346e49137c5a9a90dd42e535e0c75696c0894f8cfa488f1e177c051987630bafc5b39689e35f82053433989dbb549304d8a2f0b6569424219260d6d9e7fd4be5399660d51e26fc190ca6e83b97824a99688e6b18a96c3cecfdd05bbb011fe7656210b7e5014f719731183222523fa4f0a69ca2f63fa7cc85182090fc8ee179d0380f98e979a37a0f21e0f8b0d17cf91e6cf4f682403f824559367a7799ec9649fdbc21183d0b1b57f02edb7f8fea6942ca5f2d713a759c1e8edf9ffb0645f6a8a4b1456dc766cbacf35a9d1e6be0460755aa7c347066ec992fca031bef23eff41b7640a0bb258833c734fbd113fc0f94c6a980e481807bd6dc9bdbf0b54b9b5bbf81d98fcac977c600cf88011dc6a4403ebefb72cdabfebbd54c4c483767a96a2c50fef06d9a045969a369b089dae3aff4335cc7dbcb2b84736dc86c72d1edb485651abdc82cc881522f2e76e18e2410b2a4f0a0f611cb263b038742148e986d35f6b3e9692b0110fbe01eeec2606cf04819204b422b949da992159a5636aea3395c73b756c401729c975cc9327a945144db0c6334931843265aadc445bbc79c78151282ec123806640a815b16463d443a9cb181f7eeb8e7f6443edcabb88f7ca6b9059f1277a2279d995d9ffb8a38dd631e7f77b1dce1c4ca76dc8e448786df629dd7b2cb23f91a78b6522ebaaa4efd388fe300b9091c97c6cb5236ad255b04518ab77bce260afcb4e8084d9faca69b92f64e4da65be3964fb198dc674b86ffe29b517d94aa16cdba045a63a115dc0a0b70e3a1e9d5ca0aa94832f50c53e782799e5577a330e99f205fa864c11a644bbd04fe88a9e4ecf758c8962e73ecf33d3ea1f1b1494f5957d2c32af1223b8e777265e164d4dae3c809a019bc4d5785b2e99a7980234d7e8ea2fc3c368eac70d44734f1373203440c362a197345b0dde761fd052e32e258944f7e3f0151f536072fd90b7871892028590932406a7cede53008cb37aa7f2a1eb752cacee49fba176782029902bd81f99c53f5557afb925f9b5cb6ef9138a9ae094baf28737d7ba4d76aac2e59232c71bfc964da9b135f9286304a2992c57368a43007eef3b2265f622cfd4fe962ca44e4e015a36cb841f18012a00bc2ca2be12ee4bc3e06847c639f4e48e960036c29c836540a8a6379d1c7ff84ded8d67f204443189234f12503d580709e64ef752aa9025b78b1719bc982d9718f315cc7b008d5c3ed397c3d36ddb3731615631d62751633913c7ed1ff68c919df12cb11154dbcf88cbd88ae0ed65cd5485eef24c223eb11a8329654159d994914d6d649e1da2380e06b176bbd07b1e8b1a6dfa3276090c7307f3f6505ba70f297718da11a70b2d9f3bea1a2df65e670da8888099a8612bf0f55b43a9e1a0f04d5394cac69950a220cd78b90a51e08b51b170f95b2edfc3a8c1e63eebc136c2a6a8d34bb621b00e50653e1bbf560cf3f21b42937d4ed26be3aba8515ff45b871f82a7057841f8f3404b2a3ea088bfde39a359c3ec1d28cfa327d7d5014e4cb6239c31c667fce037d931dd372a3bf4dbaaf267343c4937daee9624c5f84fac50eb30560b73d658b8fa194f4f444df7eae06bb796a31b31a6205b6ee6790f848eb605170fa810da91ab088c3de5480ea8c812c61e1ca66732827b3329bd4f596b235dc330285638949f1eeb16a2380c018361ab63c11ba8b2d252fa5e5946cbfd4f6878215caff4b668db16af9511e28d653b1a8588ba0159482bce0f0a166832a9ebd837bcecb052bca48f2a157488d7468c54bcc2480b6895218ec1f505a9a0cf9110b2b165e7e91d245aca95dd20897f59161a9b70017d80adf19eef420b97f43944ca5b0e399f899051b310c2de1e2761cbd88f2e3ab9e055506e53aae5aee10d54799430d5798a486518bc04b9ca034d21eab5d19d5b0bbd4ad4d4aa84f845ee708f8fb87608fc8fa84172b8efa4dc0de418b73c3e507878985bc09bf7740d3bf84c3f8e16b4d488d27f3e83dbd351078c6c978444c134bb9bd6793c58a31a82418c783d814639476cd82f1f8322de83308734c8f3c6ec9e351ffa359e602199ac0b06846c6947088653f786f3a4426ef574c04ffabd98b4c898828483fdb480af16004a2722960773c0dc1253e3b24feb08918ee3438f4b590d9678f0945caefb87451a4716630f3283f0b5bbe1fbd0cf08a0553acec3cc4cac79ffd9a72120473374dfd6e5085778488f15cc0771e2764dc6f732212ee7330e05343a0c5ad120bd0e94a4174a6ef14c97cc55bff16ea1dfc6b921e348b22d8f8d8c82ac2c5c86c73594293274574e2a09e947b828daeb0b4e2110d21f946027d55c7b8d99ce4b8549b0058081ed43af6b8e4f6fdd806bbfcbcfffc6bc0d52432afac8871c74a63db282c7c03698242da82ca5f9b2dfa87b2820b981f4b90a153153d9a870ae7129cb2f0394b77f5a331eb0c4c254039ad1307696d24134c32d8c5c5bfe49064d56e005f80092cfde45a13607559f6eb8c774e9e648e512cf415e4b407828432fe9baeda784ad83af50652f44cf57475a6dfdfe3ac58d6b8ce75f3cffaef450ed0678a185c7fcbfb12009970b83a6132a4d1022d3f4cbe31ee43d131a65409c4163b08d7d9deafa8bd9852bd6961ce71f4384f524e2a22c1bdd611f892b1acdec121dbaf82e61e0f93b43105f8fde92ef9c8cd18db979aba57fbdf8419a435bcf73274626a77c39a392d9602614e66775de6d6cac3a94cc21cb4353a71c7fb7ced2c1b0ba1cdc2043a013072588104e4245a6418425bc083444b11a7cebc9993a2e5b94dc4d9ee83daeb191d2c6002cdf57c554d1aa47fd90dddd300d8878d0b192c7ade84b8b5d2b5b574fc323bd5a23cd6902698587c747fb8db99f5e1ac82daee4117a52171764fa5afc2fea519a293949a75daee14981545cab8eacaf22ebd770d6058916f85461f1c847217a7778616dbf61ea3f087d9e21255abfebfa0ef6320131745534a116d0bfafbf8900b98577a51202d71997e6eaf0c24566c2b3fdf21b441acc26352296f99805c8701b854cacc97a34e49caa65c43262badb735c910807e02080aa226c624064bb1d53904e7d1de1f3da0b18da377b687a1c346241f47403121eaddd53fe2077430e71fe479631647e7e903f99715bf1ef3b0980ab50835464367a0e5298892092fd5a211f13c910f9a7bc086416301f4af2bd0d68b3fbf6b4838fd3690c77760d7dae2d604aed85e949d091f198374f1091c1bfea44e2d4ef5b8e32925f348db80c0885a1b5633e07ecdf5e4b914bbdf1374598a2e4bf251347dcacecab4a63b83e4271c8225c9c8dce69f01e59b859f7d0c2c104ef1debfc6e0a5e5a7a5e67d55e00b95c85d60df15f406cab3011d2655b16a8a90cf3a4ba5be9e716ff47a5ad40cd68761e525ab37052b17f8b0b9eeb0f1584557a2446918ad54c5400ece5eac4b68606b6645a6146439d7c213ffdac3cfac0308218f175460aa83bc538a37c9c069d0f56eacac38a600a040af1e0efd6462c88d5c8227925aa1e3e31a6e82f6530345a398dc4c1902d455d56f502947220537b5a228e66c0066b6b505b367c711c877ff481223eef32cf95cfa6f4e3a89f52bc0a7c43b39cc4dbbf13b11e24c6bda6e520b505e5a8b2d080856bc513c634800157c7feb07c454382dfbdbdfefa18c9176c18d9d1b397ff4c559841c3150023b351274556fc15c33892eb6808f142b14062a3100211f5bccecaf0ff57fdef4bc2e45430d25613f751054e5d0051093798dea011a3391b2ef513310461f77b8f024efd24f29ca6f4b7e1936c6787a4150f31bb504ff44af4ce94983e9329a8a16fdf939b18c9f8c39f3d662adfdd9739ffe67c554c260845fa0dbff35ee68d7c9aad9f99d659639c3e8944d5cba0c279f16ab98fb0538eb4719f09b4c3ad017e5e88967fffdcd7f3aeaec5d38261ab89739ac4dbbf2ad76db2e9102a88e64f2299b9f3f2b7ab0e80c8353a2cccf77fc5cd441fa8cdb412bb80e4d72417726e14f703161c6b1f07390f386f292749a043a15ee463640eacd36e251c55fb9412f6707b4a810748499b5563b4a3624ab19719f47bd4278473e74d240946eebb45d18d27d9b064a76b34e3d28074c3754b0c787c1eca1394d216d3c1c88463a8af789670ff8d76271a1ce009281ee70f247c04db195493432515cd0d9eefc828f395748254ac51d2430926aed2a132cad443a1d40811e7a47751c13a05f266b57810b18eb992c6c6700eee665750702289e82585d6f383dc5103a51530162040f542970c0bb83df6ef6590fac2c7684affcf0c72a17605811ec60f0e74f503e44e0e6d626d6a1a1aaa80761a0e7e6ea875becdcbd4feba50e93e2baf9de13833afc1e158ce1ed1c51258793e4a80da058d25c7f12ef883254bdbcfeda611fc37eb3c9ec853b9ad925ad389bf80f7f6d0d3b1571fae3009b6aa13a64dcc9e42595161d469a6b7c3039cfe1fc185e727f05830b71e005f208bc9b0eccebcea82652406215eccd26033b9442ef85d09194d90141d0b6906fa0c2a78cfafede62a73c2519d8ae198611e4f7cb3ba5358a2ece19552d174d57578ad51e1a4b987c74680f452762253aa14632cb4ea256a3142ad716079260c109e411acbd676ffb0a0917363d605326a26e9bbde5cefd2426688d1e21786084140970d4e053ae8333889f8c18870978197dfaba3842b994dfbb77cf2fb6cfc542b52d25dabc00f4e8214c30b4b9a3878598ccc5b688c1580fd20d71dda6f34c60a73d03c8d7a3f1048f5f7cd1dc99a3ca201c4239878ec39c861fb40b9084b27d15bf83cf5a48a6bd1233fee53465cf8f2247c72e5c09910021820832e02e429525b0b91f1b933e60eccc80956a1e2cea343d937401efc818372270cbfc68b53f198e235ef6585fb2f75f84668e69af2160a35e1bfc4908d79e606cdd590d26859aaafa0b097b12eb31791c9c95a8500b78c5a0ef97db4389195038b3f91b80fd56e60061cef7a43f97018f26c4f1cc44bfcd9df3d7596e4e2403edea9325b61bb0176587f7523c4f0d8a48eaab6be69a8f5a0fd4bf982a93c0e2d49f0d37b61657c187e6a2fa3b955999ab2723b62c232ef18822994bafb8a23309e2adca426655c9ae0f4d0555a7536cf0c7cee22df2927da7f37a1f88f5a0e3fab02b53353f8c7c4d918cb8627f8f2cf56018aeecbd56e50c4076d65f5fb1ae8882c9beafe0ffcd3646555d871b3cb03c41ed4d748d28c150c77989dd852e645907774e3283a69182fb79c5e05e77130fcb711ebbe8f9db82e679507f92cafd063cdc15289d54dd4a78494286c8b208c6a3b6a861d11fb345e8734546173f3f81c7d45f7f1d94c138b6f07cd24d37875f75a16966f35613a803a8431f5f3b99e5512ae18e51dd6084a991d16915140fa5589132aedda96d44c2b2223e03e59b120947a4e203ff49fc802452ffa46a5f15a04184d701b4b54ba4049392eac027524c80503b4898a76e78b61efa0880d842fa28dbc361daceed0036ce832064e8c01a266387e9f7098dde6d54a41656bad4500ca81f74d64c23fdd4e77ec2f5b1fced012139768c92ff780a2027b63a50251468609bfd2885abb3e5e48f78af341e8ccab5012b38779c6c0a843fba5eb004e6489a7ff80759e86476fc56836061628561a70cce5e751e04b41f1fe5f3faacacef715dfa84cfc3449c06928acf4bdd103e593eb8304c5d67a1759fafc9f72e0362019e4a61b75496022765d6db9101d3103e899d093ceb9c338f4844751dd82449fdc872b8570c653380e2cdac2be1db3f1fa1c4d12c3ae36c5d6995cd3ece19402d81bb3850dc004126c760eb19fb7af20c8515334cbe70dd5e29670018727348143614ae68ed163abf75f860808bd4e980fe439940c3864f9215ba366d1b69052c385fff1200c28a3218dfa65d0c809e3eb3c10ece2a18808f85c0c5ba4f408cd2d1dba64108ba87f54996422f23f7b02f2f56b76999093ca1678eb9255fc7183f3b7af8a19c0cb78ed8a778e9e4078e308c0290ec18b40af6d8f3a5776de084c0d027a24c50eb8f3ba33df0536657f91a7288ee25adcea15078824f8e6941e19069dac9585b033946772914869a26763755de04bbc6d7cb940d791f27cb5c13a408469df50632d6b0507eedaa3c1aaed82789761a34c8f38f62ac759859504edf24dd4f9a152dc6c6c03a7ca45582dde82252bcd146bbb0e42965614dc673900626a9e51a5a30378d297bdb53e1e849d914ab57e45243e95990add8c7f7ae45b7bcb9e9e7bfde80d7f0272a319c3bdd844afb9379349e80c36657bf3602e7b61ad499e17b16e539a3936ab19bd5e045ada63645725a9ba7fe188d17bbc57610643da49439f2fb6ae98b09cb014149e39fb18c275a515d5d1581e0cffc57b8b621eed70808f016eec514aaf2645e84a10aa20488cc98cf6f7728ee50697c08f5020cdc1b2be9ddfd1255695c529fbfaacea2c04395c680f9db104f0b9e3630c343ae98c083c6e3a15719064ff4fa56a000e4b5103a5e86b7381a4b6cdfcee6456327534fabf88eba5ed0fda5669de3b415706cb9455d66df9993c784bbbc9fe0da6e38bc0a8f6f0c6b0d1c6d0558d105bcc1577bf38969572be3adf2c67e67e4660ced602e413194290bf74e4611636e446ed86a145d169d1e22b1fb27aa1cab9436475c1706d893c4a2986083018d297e3c7918ace0a0a871a40996402e3d72dc3d02a446acb965b9794598ba60b1c946326af13309a968002faee2db97988a5afb6c7f7a0da5d67deca07c19b34c772af5c2601a7e1f50700db2d069030cbfc7bfce2002f0f5e093d0f600e2109ec94c828b08d7d74157b0f9b42ffe0d58db3f6a603ab18c837091cc6f6b3d9d0ea05450ef7c90d7893b445aae5fc091856135266ac6677376aa05e9068a17ca4f9206df30c362b472e5933835fff53e520088b4bda719e6dd9b68637004057940d3dcb44174c3332f5132884d534c263bf639a77db4e86da2e29829bc7188046567c27a1e30a4f2073109425ec542f26587db3b247ef014007ebb080da9c02ecefa597072e8e4835e7565a386b88e7f4e3c83a60126f5c742150777ab72dd23840cf4433b4b5b5d95c5b7ceb0cb4f88174a2d8dc5a1bc313c83299ec59dea8e1e90cf11ffec554fccbfe318aeb480f2c8cdc239490f02c574261da7c91cae15271b3c5714a60a098b8054440929042e394be8f80df4bcf64976e88325623bec14db4812d0241e08d58afe5cbd10c622272de2fdb4c4399a1e4a664020186b154a505170e633da9c513470372016a47d9ad7cd932cd3d10d8eb86308ff6a8614109fbc6c625cfa42744c1cae4ae8410818723b3b2c59b3e85bb3499614d1d9c9e5fbc81d0d49286063f8a9ad5615520282239f45a6e243ab96597a61234ad9e84d63c005c4a894dc65b5283bcf6a9f4172b1932ce907f2c638b19f848e448965a807a01dd37818b0c569df9a4f46105cba86490fb48ecbd48012193bf81f7e16d2e108255d874fbe6f300eb1589525f3e770e0a5016369bcb72b9c4d6c3c9b7e5960b60acd9fa4fc7a6635fb6121cd007a62f86c655a41165322812751f7bf2df515bd9c1a8ab619f07a5a87d8042d760e5b9c37805db8810f36f51738fb80f0b0ee9e8ede62212036f7de8f0ae0a4805961ec33cb18988beb0889247699d9e68fa5be8e65f824766874addac0c1afceae51a0b77dbc1615698c94b42a655515bea891d3e4fe53b16de482f5b560d56c6cd06380ba0e80b5a1273165c6d3ef04b36277e11f9fc8b7df78c0f0a420bca4a9d687bdfce965b1d680280fb761449078571df13077cbf51577137925d0a23361b4c3d41453a9511f88d4ea05883f68d10835be21922364c8242e2cb291115db89721ba4ddda05f57864d5a687b425ed29de755bcd4fb108c4657077d737e509619161bcb78c43347beabb3d2e0f4eb53e0149d610497e7f80b02f87d5dcd65b4c62251f348fe8a1bc338fcbccc532a93074a9b7a06bdcafac0dac53e8b8a25bae9004e823200257be321ee9e2971e5c68ccbd696e5975c637b3480549e322a0f752550f24d122ceb902592c2ef07385cb8b3e95bf847309f649057fc867148fb90112c42eb79f2fc7b07e6d13679626523606e6383d24e70595540435b504b98e2b68fd00418d8d786146c44dfc86b7627f29b7f20ec418430811c808350d925c8c5f66262a465da2f0e11d37157ec32ac869292272826a476357e44983434b20d29de3e834ef80c89a5c6ec071ef5b9b6f9991697a8d56ead7955f84f59203a753e78d722a550a827c7d9709ee8f5ad1258f8c674c0b6bf6845932f402b0c1cb8c67eec9179da54f4a1a1802ab94496dbc0fe5caa962a1b05c11745d36bb1bbb736978a0b9d6de03be02db02091816227bb58bdccab0414f967963afbef7867f4cc559bf15209fad7a30ffd88022e718f945d7b54cc5dbe41480875cbafa18809a9c60f27efe5305827ef00ddcf4e440d13e2e936981ea05e217d9354fa7a880195f90d573e044ae48278e7b6ce09d6a04c6f77ea425433f102f5657232b0254c4617aaa12f5f067154507a04c6834b39ce62e096fa94099f53698969f6c13b4eb8017e2e3461575f71d7051e9f030f4928204bc1b5efef5f4249e406f339e6a63dac771d8234b25b8e7276bb65457dce0814b667650ec21afa04e0fafacb6ae0ca278de7648afc79b13ec31dcde673145627c31919634281d16e993b04d6e992066a60966ff59e302f6f45249fba77f5230d40408955c84746414345cf8b88f50afce4ec5e988913e5858ff80506518234720d61ca5df83be30916fdc9d776962373a823950427d63f1b11d69dfdbee57743d318cd7dc99b176e2a090ec15bc10921e33515d98f381c294de4eb39896eeef6b96911697bc4640359ad7382f326fdc5717a476c09040227fa8870653af731209e8c9a943d3bb018f48af6760c940fa262ae8786c8e86595079fedb27988fd5891a0c91ef502d84756f1d8fca53266f1683501db29b94adda6cfafadad5d09bd62ee4cc8086be825fe1d2e9e2a851b7742a83d417a3b234976b0c8faf08b53adc30460f5b865847205b06f00336bf7ce1ee0bac94c9003f69fb13ad93b84747cdf8f878aeb04a32969b1c12472dc83f163881ab11ac55782ee9a4208f29109c81273890ca8165bcfa666626d811811c656c2bec08866016068f20e0d9748a8298f5a8384c1d41437a6f5a26480d879595213d4e7556b3b10cc836106c116cf0d63c360ad45896a5cd3328b4e3fb767be62d552eb2858a21a2ef09659156918d63352c9caa8a3ab710c03827d25274d3aca17e85120df8571f5895a6fbbca1f3ce7c1996dc4a96018ea1a256419c36818d7b29143870db5ba65dab4f978dddb063292c2044a171608b1e53ac81adcedcc9ef942df2b2cf135501b524aaff5198fd4c1f1a8c827b37e18665f0226dd1ce421eddb25ec3207f611e421a839c862b32a5ea1ffc3e25d03b5dc4db5b68b21e44b873e3cd57828b11541ac9d162dc66fad4044a9e82e3b01e36bd16d12e681415ace6c5a45e3acfff9d414448d22a5b072c5718137de4b81b063ef8d32a28adf58694455870846f30480991eeaf0275d975a70b38fbdb3746c1bfbc576dba1ea81956fc9fb875631279fb91ffb6f178be5551d86241e20e4f1b7331318f24db1289154ba954219b9bc7320e72eae985a5b34ae86e3292d84f8691654c4efc55a90e8178c1ebcd3cde6e46574a53e94a4b15e19e8ec140e25c8cfe035ede19c0c90350242e6d73f562b9d625f1d132b04053a07e21dbc28951c111ed2dc9ff2692181d0617b45e8e0a64fbc3d857c963b67a52237e65e163caef16c9b40bf5677a98c0a787504496a29ebcefbd33518eb34233a2420c3c3aaa2bdb30ce8a32e84898973f0e6777df2bf5e9e990527adbe3fffda65374a7ccd9ee951cf37a28fc8088b0c55cae95a9763968d4888ac3f137c17ddcf1d36adf9e515278b653b6e0c32d819c9e412d31117d656b8fc93dfdfd8b7fec9281cf734c93de7a9adc04bc16af09dbb4e4e02d30fb5f66ca64d2f0f7d9a4e71d76d55d85f27641b59bcb97d82ff92dc073e91638606e9511977723b42dd3a2721edccfb6bef777b42fa3310c33a6fdf956c80ba1f3ec7a5f43f8e46f634d93605d5f5df2f5dbe50f07865ff9f2c4fde0b18bafa89e307dc58c6e6d4ede50a0b006c08ce6f5fdcddd1434de0cfd694a862620a4ea84b231107c77413c675dbfaadcfdbab017e8b3a8d5267cbd6fba06064e8c3c7074858e35a63bac7f7631b0bbb0c65cfa954ea768a6d2cc04f504fbde4ac0a680be6ec7bc5b69c03d59d163d09e7b556e150dea9f8f931da72e053d71f70490b870b6d30e514455b8aea195451df93194db6c1af26d51d4d4055690ca2e04ce2f718c3789431e41a1f3a98f6652d12999cd4557e59cc633ceda34fcb90938200e334391bbe43dac71f3061a6e012b399ebcfeee1c2fee4a50e23afa3a0d1d5388e1236e949341035ce648d841f4406aae1760ec486ff0e8b79e9d4534578a7cb36add74a61a2408c95909e810e28fea6d4232830f42765553504f61678e50d76e639c6059c970e6f8c07a6cc65f6c8acd776bb00708da45aa8c5cf6ccb38d301b52d14076c679a5968a566e0fb9ba997f6660ef4ca215d541f3fea9c4298683cb8ef344745c1dbf557ebf2ec0d6e24a02b79bca75a182e724f680171568b4f606675b7ac1aaa35c8f3f8ecdfea4dd0f30292d7ec1662464a2a0a41ce7443556597ab552f0a45b2e7938aa23143d80a82a63d821ad0d9f479a928262913f762560879ca59eab8c7fae1c5a0800b62f5f051a92cd6c7a01110d4e483e5df5f69db889e03572a3cfb93b7cb3656120b597c14ae4adea75f79d8ce2cefad6e37b9f70dccc0b9165884765a08d2cd8aa8bccd5022c13d1eff3cc276711dfc15d6393590f0a3b19c9a1feb3b62378d938cd45734f6b018d42519f734f8ffa70aa9bdffcb4b114ae7cb0e480121067bba9a56825455a66ae546e2eee9d48801cda7d60f088e39971a5d5f6461f13ad7bfcfbea997c012d688b369e4daa486fc5a531f1b969e0f2ed5d2d87811100370fd5589089c1b51125f2e89e2a67057c27a3f652533dc9fcc86bafc90bc7e9c27921edb9b055ebad3cee611137db5e2ae347c201f3f8d4b0853345330350888a0f1d2e92d029219675dbe161c43b225d3c18ca505f79676c020fe2e575a237528be71f37f8bed3ab0ecbebf43015107cfeb820be4b7dacf7617b76341653520a901b5740ad0a66be793ae95723d44a3833765dc4567c60b3dff35e019997065b5fa3150ca6a82a0546a9bc242328980ce01cd22d569f0e4c34c5649f0c2bae11341fa7966d49ac711ea60ee8b14d0783c081bbfeb3a001c27b3183abbef4a669b240dcb438e8dd8ab7306a15466cef3d0d52d72ade3664e8e1ad63dfd2d7f68a7587b793424328e51f5d685d375cb2a2f0f8713d9177b395b71dfe19b4c03b35b7415d66b33f5ca61d8c3db66c86e44740e927290bd9604e87ee17f04bf34a9d51bb9720b8788161110609b54e0b602c30adf029af2cff19c0b8c6011fe4dcb8a4bd0670fa9a3a8980dc00acf361d6063e67141ca74a0bfd66f8a1e9d0a2b722c2209bce828014f6988173a06389eb2442387cb0226741b5164710457cd1b933a3e32fb15ac4de2b9932a3ad6986cb48aff0a7532ad52373638f2e75916297488532b5fdd4b82d2214b4e1f5873d5fd3757f2b1174d8918c5aa68145a4fed930e54dc0d10acc763cb203e4efd201cbcdaf38519bf22c68633c388a6e85e3e40683cc4f557e0f74d6bb2d0eefe27d9e73a57e4dc914af9624b624159847fd0160e067c4c17e0d37ee344972fdd1330778b011f0b9b3194b3e5629f864f49833f3df69ddb65f4f734354daa831cc4a90b9930d8635dbe12d0b689b6657f3d23109d1fe1a5fa3c91918d0bc88dd2fbafc3975c5847295eb14e91f570e664206568e777579e8908420184b82f93cbe0ac1d2fd4fbeccba63ca4f866fe992b6f728a011b5c3b41895c49b3b19a44573dad04e88606b9671c4cf33f93f31cc457f9b34d109180542a0402fba9a9a6878c3a04fa5d1fab56209a556d0ed94b313ef23ff622c1db755f31206e2ffe4f21b09be8144ea567ee53519f0ec8587c06454fecd72e001c77dc710422242b67d50049b2eff397fc7bf65a053cc28c0b6a1d6a53dbb5dddddd5be49632a514ab0a780a7f0a6fbfa31ab7faa6e4aefde656e3cc799aed3aa75ff9d273a8b03ded3cbdf3e24f2f48271868e54f7ffa9579d23a47244bd4f5e1aca6c237c0acae82bbd556dc74ab7dfa05a75b6da455c8d26f4c9f825305b35a8b268af974ab93f48b916eb551bff4b7485a719b2cfd96815dba3319fb2a719516ccea34b0aa63ddea257ebb0ca724ddf21ba36e39cee74091f393d3a5c6be9ea36939a88c270c3cdc0e5ad38bdf4edc1da6af6ffaf03b0dccf22858d54b5a89b3ec9b2cf12022b0aaff64f41f7415aceaf71bf0fb1d0ac7d9be2de957b0aa4f64f75cfaedea6700c835bde9ed687a1b67b5a9fb96c8d2bef8a5b51ffe8c694d9a55e2db881d7e579b45d2c606903b49de83db42b89d84db9cf7a0130906baf63bedab99d36a95b4e105d9d87019321dc4cf18e7f11ce61ce7f11c1732856de8d8bbbbbbdfa6bb3f0867b5a05698ddb966b6f37f086460548f0ae7ca868d01e6bbf380ce39990a51ea4f84dd33322ee99d24d04e17f309ef79761d21eed279a7e24e7f3d4b109755bacecb592417e246bebda708eed36164a87c92fd3232501c73c30b46576bc2dcc6a6e1a9ba2d53f24f56999184cfabfe1205c3abe6be21fe52f716c1f2063786a3666b46492592b8949a80812062f96e95abbc61eefc7e9a4538499b19aef2ff61007f6699eb4ad081d12d61ae3b113ad36afd2ccbb22ccbb22caba316b2d0c87efb8e7acc451841e6b8a52a4711ad632ea07e463b4dab1da952b3af8f809ea2ea5ae819c45d062af2040ee28f8849a3630de1142378e208973a8bfb0e33274b96222c0f96eb1a0f5ff55b1d46425e851ab30e6dc6588057fd6ab8bd85cc8cc9a19a31362d45139a8388da522ec94674a9f7d1cf630074539797f086d7edb800e167515a5dc3cd3db9a5aa378fb716128e3b5bb69f238f966b9b8867e6a5df5ce098cd8757f4b5305cbac585c23604de907069132e75d596c5a57f04c37290d47ed7def7d57109df7e6efd59e42c7f7acb8e55fbf3ed4f7289befe955cc2af53cd875ffbda37847d25e61bb2b10a09776e8a20510489f92a3578cceb4f3f04f84f5205013dc97208be493c127debf7ad369d4c98848fed081d395c55448d2f49e22a9a82b0ec24947e9522dc361f2737233fc2edc7c9491f7cd9cfc6d2ba7fbf78ec7cae07bd4da469618882754f1a714040fa2c68437bb29b381641a2e57abf8d0dd441275ff64fcbb51ba527e38ef8dee8c36f4d0b4d919393efab61df2391de92b443d4e7f367cc6e2c8db8195976df630f5afef521fe6e2b77fbbe34ddcdbb9bcf5cd1ff5aeee63363bac857f43d902cb71fd316b472cb26da842ecbdd7c683623cacf60a13f79040f57d1cfe3e1ac6c1ea1c359dbf4235c459bc7c74863be1242f4cfef6eeae0b1f9641d4e7f7f98bb63fef79d0f672101739ddcfa6eaeedb5f1645f6eae8d8aad67e32191baef6778f635d197da773f13a0625f0587f6a46780f624d2922a38b8273d03b827f180b9db0cfff86e3e9a4696e1dd7c42b20d1e0b4b0e7abd5e2f728e20ec18d9445408cbfea928089738abec4ee23105d0220b5e7101b4c002af78f3d97c660cc7af1903e36988ba3048e655f7289a26866189ca91042bb95427f43eb0c122fa1be2fb933f8d272a952f5b5c39ec707dbc9ec2dabe34d978605ca75fa25c4ff5ab5fe83b0dd8857e59baee30f7f4fd1d382201b31909bdd2e7db8fab9ae8c5979b4f91b378c05c50bbb489e80e8cf7d1c784f1e2fd5f90fcf4337c73954abfe2baf45546bf197b89abe8a7c6ee8255f4516397a11b0caca2df34d8784c9e7edf989e7ebf3cd62477ccdfdee42dc973a9e933b2742ade6c92a1fdd2dffbfe68f86ff6b7511c4fc6b2ef490926eefcfe19d334963d865b2a8d65ca1b7b50243e8ddb119ffbc40f09983bc98ff434580e67854fbf082740ced39066a8e2e4e643b319f115fd8c08936e113212b4c842a341fd6363c359fdd9532150a5a8badd37775d46d4799b7fd9773dfa5884ab680e57d121c2bedb970cf37116dd7e2ef5a191dd7eba80ed9be436924677b7b5ca0dee13607f7bdf3a1f512b1daabf9aecedc892fd0f20349c4c688b7ccc4693ab688c6c2257d1cf9e089b0a99322035c42eea7efeccdc4efff323e0584f1072df44412efdcd08fdcdc7597da977c3edc8a51b924b33b2dc862ef523315751da4446d77ed944333c08ecb209a1a370e9974260116e47d87cd885be09424a3f07f567f6a7df44b124464a8e965cfadccc48a2cb383490cc0b80139e3fc684b34a86e9e051aa7214d1affae6671f87b37668dd10d983bf8d38503cc9fe0ab34a6fffc42d2350acb5f6416e1d115efb965b1d649b7900bbf4977eed33b77290a58fac8e3bb4afdf6d639125b216d51061c70335db7e359b8efe486f471fd9b59f1a69d85742881aa9b76f3f45bf1aa4b7e4fc86d8d99e44eea0c89ca7d9de880e850803acea3f8d4b7413acc27940ff1141fa7370df627faddd7056bf0e6769649337ec735f4be6e2f21aee076e6f6311fb9dfd6ae6b44b64b792385cd52c7403c70cedaf0e5ef5c754584841e4aa5a0774a28168d936458b8c2665f83377a740fd3640069091610eea0f72c1cf2d5968096f90e296da95814685dbaec8871c891f712037e2566c1c0fb77556bb81c3830c51c163bbd9d5e9e2215d2e1e578f0be8a76808c911980e1e302087fdc07e3acfc8114c28c86f8ed07164a485b0fea9486e8c20b9b9b9d1b9b9d1b971ddc8803da64b6248022bc7605349c78e36522896fae6f36ac76960ac713c464512378ac5bcda713a1d176b368ac562b19b586c2bd23a8fc5414ed4b01f3c7d335749821c96258121b99cd524dca6d9a00a8305c182604641300fdaaa8044a86828c6c48f18128f0979dd8d09791d8b9f08d6463e3a8f892223a1598b8ed8cebbb1222323a31b23a31ba31c23161cf12067f1170d21214ac207d111270a22fa69da437ba88f35298961ddb486cd1bd31147fa1098389392185624403230d5bc114b26461536c3b0d2785d10ac268105d5a0a0212218cc837a8c82603d413fcd75d143c4c7c88f8f0fcce7e7c5f3ba311e34573d64c29c65322989be75defcc01732934c252d64e44433e6f41d0252f8213891249349493c12d44f1ac3b9ea0f3b73a322a2a10923cac1b9994ba611cf55df902628164b3295dcfe0af3090af209f2192282c1827c827c827c7a1c08addb154113c859fc4430a13ee291c4d051d01c3a02eaa13e3acae9a39c3ed2e9230eb6f1b4665d860806060b7bb8b98488cbe572b95cae58ace3aca77da00d57dd98abfe5006e672b95c2a189eb9ca7cc21f54d00ba9603044a1583221027e9a67492e1919181895cae57259eb2e1918d5a36c887a97cc2ddd3597e06831eb7265a4bb623197cb5d22142c57370d88c86bd3b86af988cd24f2aa5cecf57abd80a6fbac2531246d536ba127829f134392b6596f7e603da2cd95460ac592c7e6ca357582dc948e36cdd6098b0509c182342546dcc759fc4543488e0009197184901117f2110a7a0d89bd0a86830cf07abd5e61385f436c7dbd5eafd72be8d5e3f37abd5eafd76b89e5eaa61d19e2da34ae5a069a3187b82ac7c3c3033b3237cdd699e468c9bc393a3a9a3731233ee2ac2a8642be8dcb3a67794440438864424d44816effcc8909d1a141684e904f0f153caf86c55cf4c8edcf728e8e8e62b1a3d8d49939332776d41f8b1dc5d250124312a86d443c5b4b6248b260d536cec88f1029144bab8edb34b0eba0bb8d5c74b5b1de29c4817453e3f98925318ac562460e73d83529892189eb32efdb7aa8151e039a94c490c47599f76d33b78a46303ae5abb11a3d059d82328e045f4631be1ad1280da16854a37d3bcfbe2f62bce73f7acc315c1783e33d144fe39145b24fe5cc988e045f73e5efd656146524e06bc6885bf0cadfd5c073fdd94330921e73ea71a0d0681e8a90e605588392add30b512b1e2ef7f031a82f6138262566e54b1652f992617dfa19def6720903a7316497d2f757732a9dc8eeaeeed92c8d9476184ae3bc2963c8abef53ff62cc096952247f467ce10dbf90cc32bf2ba55729954cbe5f0c3f3a8a4a50c69431f5553c0ac98f2c4b6dad458dcc4c6d9d99271ad5082f2579abef240e5e6a87a94ae5f08b7f9943bd6c35cfb42283fb92057cf18b7fd7665566c34f15923c330b7a1d57d2f9a6c5a163f19859a91c56312195e3dfcc025facf2676dbb3c137ed979cca41600ccf0159c04a112086e090162ec4fbf70eb54ae4e58b08b7fd9c3cd2e6954a2df7077c0e796944670a3b8fe4baeffc928a6a114e4fa9f4a21b8fe26d10ddc2f65e9899f16d970b1e019110dec12d42d5149bff89770c4365c7ffb231a39ab92d99bf47c5badc9d8835eb014a98b5bb08bbf388a676017ff7014b960175722de5c7faf9473fd49251d1a1d061cb0cecdb31bb8d9b3cb7cfad5d4ce9e5753341295f8ca6fa65dd12816f697a2d1c5f1bebba1e92c7b3eba4eabdf6980fb6ab24aa767cd15f4db272827138a490945444141095150b80d05454341b128282828354341e123c0fa9975c9482ee94559b14034275ab33dd4838e358d5f1b7978933a23995c14bb54d3386d925efbeed334202e86dcd465202e6e6e27ba9f703d97beed344dab7583f1ccb402d330dc2d2080b52c180bf47ba88bbcd3b4a97d1ef8f9126ec38685aec3da89a85fedb7a9694faf46aa20a06a9bc70d51eb4f4d7b951ab56adaf7d5bcefebfd00754cd5496c13d9aa72255ee4312ff2b171c3c6553e33c65d7345dfc60d1b77d9d8207d359acd1ccbeaf221bcf3fdf7d54caf07bd3c54d7e78afefced3b1090de40aa6105aba956eee3de8e0efab8eaa7749f6a693d712da7e79efb13e9ab51bb4a0685a44fe37ec6dcc6d2883bc972eb667873a4d0e6c1afc6dacc181ff21515229125c39c891c66356d920e237ba88bba8b366d92650f11396b896cc8599da6f590ab68fbc86868af8410cf7d5a1315cd189b39372387853ec9ecb527695fbfeb24ce4242759de484709c0ee7e27438221c8fb334ee45dae9baf97d35b427bdc3286c36a0fbec19d0f150dda97dfd4c1b499aa6850e739ffea1ee439538ab74971721a109bce25b7a92cb4136b02177cd9817bff2a516d217e40ac9dc477cc43bddcff0b9a246ee83841622d5b0d6efb09190fef4a6f1f42c3afde231aea758271df73ab9a83e22b9cb5dc02ef44beebaea9a9050d97015adb9e1afe24361a832eeaca854de5f4574d3cf704e47143f852c9d7e6af423fa28a39381fd0bada2dff4dd05dcab8fdc45357287f6cd71af3b8fb46fa1a96977725b3bf38a63e26a7f1acbbe26be2663d995c4b14c21a102bf9a5a3d4f45525d8d6c24240d2400a52afe2a4edad870228d74180721e1960e7323f4b9afc67fb4a79ab5d65a6decdbd5380073e10a973e4be1d29ff4ab09b4d087dc59350723384217504ab6e74ef41652c1417a037953447b9506644da8ec7cd9bb4a58744daea2a1672144b90c5414bb2507a1de0b61e9b04b6d84a80a9c705b2804edf7d558a2d0bfe420274bfa73e9d3ea7d43e470157deebd8f0137bc8f01dd3b6caee87739e6d0a5cf3673455bc859489855ce83e56a4565c7ae27b994832c594e5858c9d289886891b34acfb94eb91e500ba2063e3b777777958c8c20dcdd7f4ecf55dea4505397a2cbda693632af68dc041d03f1cd3330ece23f51344614ef0cef21323f30cb86552a66d9e76f6196f6dc2ff33f18f519855b2bfd32337e13136aa55b32fda2ea97f93c983e6fc561d8a57f2c8db8be69b666323ca8c66023069b30d8c46cc060f3051b2fd814d96861d3051b2ed810d96cc1460b3659b019b2c182cd156cac6003b3a9820d156ca66083c4260b1b29d844c146c86601360ab049808d0d271c889d1e1b8454df2243061f69e9969624081149410a3a66292dbd3ebf673c4c8d77755b136fc34cf2877daed8fe78bfc188de29d8a290df3e4a1b4376eb9e9de0c788671675c4f3e8f9d96e71fbf00c5fa131218cc29d56b03decd7dfda67dbb46f9f36d2b156e2311de4d5402380355127b98de4cedfb4ec081eae9a743e6a444541d38cb2da858e594a4da773f0944d854a0d06729d0b610e9e612e6861e02dae333b114d9363ae5cd3712a74b7f6dc334d6ba40a11f5b76f807d8e6c827bfb1bd944111c9cd6c4f69554d19e69ea33cdd36d2479d43cec4ca69d7a91c34295edf981d0f8e798312a1ba94284fd7e1cf647918dc4d1cfe40ffed6fe47bf2555b6671afb4068b4b016091f66b2cc75170cc1c205b7e41f6f42c72ce5f7baf53b7a51150733a82da828a83eb7da19fc9385aa6933c82e9c31edaa27b586558689b962a2512a64893a2183f848f58d428522e9653195ea1f85f29c39a7f6b9bb73b3bacf5cd5fa26373ef7716ff49cb9aa0f8ece337aa7ca4c27133b874e3e7c7b726242965a89244da209237df81df56ae612bffcab6a770fddc91ba40fdf7d5ce7e8d65aab4896fe6352224b27f2986864449661fdee533e9c31a9b7d6be3716317d479a3d465fca6b8f937a4ee546d7912aa7ef4052e5d43d0eed3bf24791d3ff4821b53f9138b81439391a3463324d0bc3a00cf40db7278d4c33c375e6aa8a3d4cdf43c4d17ee3ab6959ac6e1bcfb896a921ac1fa823b835dba2d6174a13b320aeaad99b5efc2c36639aa67e366659cce572b95c2e57acbea685210af5af52c1c06431a3ece826a7ba5c199189cc7472726e7d1a3463342d0c51a87f95aa14744b999b81ee6837b3108aa62c89ab8c3cd2485db467aeea7f237dcd557d9491facc557d8df2dcfa28fa73ebfb47230b03bbd42cc62e3573652e25b237c962d99bb8660ce9eb4b244bea73abeb52995b82b925d52dfd974aa5d2873386fbd27726a6d1349349fc4e27a4e2aa64599615318d37361207a77bed71b8ff4ca388425111c91b285245fc0d855411491cda6f2289e3fb41d39db6cc8a5bff346e99a66d7f428fb8aaaa9c9e69544e24114c33a31052a1139206d57f7937374938d2b9a1725239912a446cef3d8eedbdd36f7f42e2007f8473757af081d06c7f3a99467bc5ccfbed7178bf913f8a9cfc0ffa1e7942e2d81e247fccdfc889c45575cbb4066caf914d14c1315ffb26e86fdf00ed3fb28939af481a9bc664e44bf3e2b959cfad2663dfcc35358d68c2666c1e815f6bfdae490f961376eb91980dc95e2299b9baea4c4d0b4314ea5fa58281b15fca54d78ba7e756ae33e856a119b37dfd0ee2bed6efa31903964d6474eb4d3832e9c1b763d941b77ebf3d0e0e676b663457f5b7ece8d6e7726e7d4fe7d6ff5cb73ef8bab5f2dc9ac598c67548cf7155fd328bddfa5328f4af2b4238ffd3807816840b3a0e22a46d08996c1b45309983bf491b57cd10d0f67292469037fc6147394c24a14387b3fafd7974dfdcc460a40e980cc7f44dd00b70dadb5b877271851aac00e227779b50a1b3b409153a8cc9bfa70915ba2a34fd1217d2727472584e851bb95dc23490b34841ecb8a37d67c37ea7ef6c7c34b227911c73830720aefd996bff05b3506f7fe499d4db3f61968ffe3275ed93b8f5a35ffa4bf1da2f310b255eea4c1e7f43f04fb25495fcf34dbe1a2679a8ae892b6d170461875d3213eca952541085b5a7fc0843d64e5e9f78dd28e73fe1d5a528194aa3bc4e799e32be51d8e077f959c59b6608fb995d562b20b34b870232bbf0fbbc01828e9d458e1f03c68a4a4a0a85727232999444929f829fd7719b666b46e76527416791740c1db3644f6323353b967fadc67164998d4b6497fb3afa7095734930c1d9d8b0d9b29106c791da73daabdefb4815aa2339f2d2b1473765ba447629b3d7b40bee9326242719c27e5f65de51af79953dffb6013aadd0314be9ed9366b56d6b9b479da53dcc977ee343b7c17f891ad0c0adbe69f9c6e9177f9c2d5ebeec315ccee917e71c31dc21222b70ab88212c4c81592a2970cb8846f2046e021739e1f2f71298a5c3c794f0d3e291c40897bf83c03fe05612fde2df3ce02ab8e5a35ffc95ec20074cf48bf714fd8241cbe0f2770bb8572005b3609c000551e420c1e526b825e30dac94e75fa20763805b06d8620c361c6331a45ae6f337805b30fde20fc3005e00731364b0e01f9669005e0a71f905c02c20f8855b2cfde2cfd2838a8767b9312eff8b304c31eb7b12b74c2566798f42914a97c1e5771870ab59b574d70ab8d53a2d6056f78c82cbef27e0560b712998457feb20dd6a2320fe8756f2c35b214bfa8549709903e287ad8ead4577d42ece6e3ffa06e6c50797164e2ba25b9df3d2415aa785f038cae1a070fd5f728228c187203a46b8e2fabb0811420bd92aed616c30f0ca9f87956a87235c7f1d8670fd7318d9552c388081db091cf775b4d5462bc101a35b25c71fd955316070dcd83973b55d32bad54633bad54a6a1f7574ab2f56545232dad1b1761d05726d4bb7da08a6763274ab2914ca146957c7eeb9dadcd39f3129d77dbb565ea53a39994c4a9452916e53a477c7fceeb7b1ec9e5eaf5b6de429e923ae97b41b8c6a0fae2be929a86825ad05b70c58e537b8fe7dd435b86ee0998e01bb2ce9560fe9172dacb844ce2a7b07d7df6d70fdb9eeede87216577664c93dad29b9bbb998551eb8f3e9f59bd5ec41a74bbdb82c52524bd3bac9dd833fddc8d2af36c79605bd564b9365eabed03e0ce7163adb51f63967ad37bb9d7bddd682cd2e944ed29cef945de8537f76a14e682452479fcefe8ec43ca33990d9738b8e59ca958e7a9366d56a39e8b083aa052688c922f111cfb4c2824a7dc940a5cbdfd5d15329d306ee845ecf3c9a4433368d8894322eadf69b2a18db03dbc32aeb6377608760adb84c8378c7e520245d703cfd946e5039a92b98b522c42aff952c80ae9f7e6ee9463c9a314df39305fd31419e3e839de1081a813c930c9d65f5abd57ad45acdf3e8d85dd48883fa177f0a4a9d5ca7d7f5b73f3cd7df47e8d4635fa7233be05bf03ff027f8dd8b314c195790f8ca57845ce5a91ca19b0ae23120115f09314dca0812f19583af2d664a9b1e87ea3410b4f613c55a3fe45b3671b7af86763d07e1c671a047478de349d58d5dea6f5f0dfd8ea3e1ba018d5dea6b5f4dc6c49d559b5d47f2e8683dcf0b3d3a56effb3e31f346938947377af43d1204c1927dd257539f239974a3683457a89c1b80f0a341af68e45cf8d5d06ef89da934443c2a09b9feed4d7086271f117c812ff1948d279f2130cbfa38ab3c05e1bacf2d43fb23c6a66844e49620d092cb33534023d7bf419f9b0a62e2790ec26f92a91c0f659c7c44a3548e18e3999aca2162eb2c4a279d871a4db810acdf20c9630683189a72d061071527e14b56021f81f1253b81b3f8a870ea5a829081f22503e5f8152e7f14599877d26f55e6a2922ed8c0fda26de3131704d79f762a0a668135e0548eb3ba499008780309dcd916c80764ce39f9655e3b2de9c4744af9210c262531b464e966926529e76664686de5b6995b5b49e00eb39869ed00776db9eb3634e9bf5d7bd9f4b2ac6662d75966d5e7f5da7a3b70adcf99d16c52176936f6c8be762835abb3ce14d77929afe3acb5b6945a71f5a3619bb8d6543570375b1a77ecad1cb81bb983befd6ee376f0fb9a55b2a42fa6ec47c3895bd227a552505029289454969532311c4bbf2472c714c7927ef6a2d14ec7d972fe8ef97e3bebd59d9417c79d179f85b4ac7792a5fdf05fa0c02a521db819b9c33e4da1a0525028295babcdd8d67a2db97d343a70cbecc59f314b1cd831ff7bd128248d373c1977520f7a1d673a99685f0d5a53296b2ddde65bfbb66492612166497c26711393b74366ebec544eb812b280af1ed9cf9991316e07ab76a77f35b6ce0eb31ef3ed773eb4dbc34778b38f867627199b3c9bf86aace9e4b5c0049122b432a1364471a4ce04c52b9347194dbe3496aa6bf2e258e6b8e2a3468d57269f329aa0745cb146784ba1896842edcc3c906bb14b6359fd74e2b5c0c8a448406d885af1c04bc7ed56ed86e30eca8ba911a788f8503c4deac11107248bd0a75fda413f2c91fc5deaab11459186306228ceacd29066f572234e281e41a1d1e040f13438508434621af8077fb10b0680bfb80507c0df7e4468341c291af10f1ab78356ab5f4dcd324fdb9ce3382e0596e8f767bb1ab4dbbcef04c593297150cb11ae7fd9036f59683a35e114c42a7faefb52554a85f5661724e2ac93b34cde517ee5968eb81f8a5525b0e7faa374988c2656951e65a4bc2a7d6a2c51130f2fb16a6615e43afa7ddf37bf69e7756ba9a57e419e190386bcb2f6fbb6e1b803be08da9955aefbb2ae2c5a6b438b92637f3cf035c9aeada8c4555bf08beba0442e4e585cff894a7934abb64b79d9386fb54d33da55ce1cfc7e86cf2c1c77b84f8d201018dcf12cc77dcd3e1adf974e5caef34ad08703bd8e563a964da452348fc581dd5c36c1efc11e7772f4e9ac292a5e2a0a9a7d5e680251281ce4a5722e7fd765dfdc482ff7915e4b5744c28e3b289f8d3b2994ff52a99f5f0dee8a4b807e45b2fc3e43994e5c4aeef87e3e1804e63e3563bad4aae36836eea4bc1d775e3c6a148fe6ca1f454cf999f25fca872f9e7e444c1a9014e7185e8ce04e153785eb5e29ab31eb4ac11a300804067758e5df8d6015bc028d70fd43eebf7109ed663f47f00506814122ceea1e8fe9783c86f3be047dee8ab77257a5b8a445a3efebf83da55ff8d1f0b31f8d4a55563c665aa753ceea8a57e13f2042f523428ec4613e44f98acb2ffe4830c015412e041b3db8fc477c70b9f3db304ebc45a59abe32647baccf90ed718f813259e6f7bf228595a1217febe3c3bd8155d9fbaf484154d2dd944024b925cecafe04d7bfec9e1881fde8e46b806e599f15211aa45ffcadcf8a90c9373dbdc98f2baa4c4491dc91a59428a5947e35325244a1766e08d42d6e49bff8706e089570c3cfd6b9224483706ee096ac7ce19785a418c22cf5d5dc0081101d0c932fb36a358f06a141f8c5bfee6085587ee6cadf8e7ebb17313cd42c7df8dce448372b63dcec9967765a739ed9c941598e497df6281c83f219598a6fc71df5ed775cf6e20812015f208f6804be94f891b3ba7d644a0891654fe9cfcf26f79343194120f0ca3f35823bacbd37822f9007ec99312919e0939e4f5fce6bf2fc269f1a4b382bfee1e4bd917d65fa3e1a5906e4866339c3320609f4294b414a7149592a410906e1fa7f30a67852faec2dc92b5fb8d37da9fb6fdcc90969ba17c79d1c144df7f667c69cdefef407cd186f92a5d6a72007f0ca1f9ca24b70fd4b3a45ae47a64ec02b524692ae7f97ca69b214975c7f2fe1a472e85b4bbdbe38ed37660fe3a3519b08312ed5e1521cbe7419c09741c868b1669e7e89590278fa2966c93cfd6756ccd3df8159aca7ef03b302f0f403e0c3d31700c7d03cfde616cad3d7b8857afa246ea59e3efd17dc129f3e0bb74c4fbf076ee1f0f481e0d600c81d1f9e92e5f71d07e4aaf0aba157dcedf36205783aee14807482afa032c69e9766e496c02b7f1ce8e3f026d3cb7851fc017c48804fa55e88478d331e65ece123bcf7519efb99313e94f3c288f130de87f18301affcef0c2108300019e37782d68c0064625801700902002e40b8fc00f3827a3aa21e05e5bd98b350f44d1ae553df6fea8b224bfae1d38f067dd189b0047253df4fc39ad3cf7024f88aedabf97af3e1b7ef8a135f712257502497f17b01bff8b78c9f907ef1ef61fc46c02ffe398c5e12f7947847f3bbf11c76f15779317e3a2c8841bff8ef30ea308ecc2efffcd5ac905e4c0d265f723f530c1ddf200000c40f63f991a0fc50f0b9ca0f06d77f1ccb6f05d7ffc7f28be2b381764d90702573669464f9afa69a5e1c4d1f86a54b5397eee083c99701483da3287dea31d9e9e99b30cbe5e9a730abe5e98fcceae1e9ab98c5c3d37f61d6eae9b398a57afa0360d60e4fdf00ccd2e1e9db704c0e4f3fecd6c9c9a33c7d146eade0f02c4f1f06b754c6279f7e0edc4a89f1fff45bb825be78184f1f00dc3251f995a73fc3ad94c9a73cfdcb2d14d9c34778519f7a4a96f53b0e88fbe182bc18f793c4593c58e88a9e91665f0bc91248cf0d9f8ecc2824bb8a66df4dcf8b398bc5b7e38e0fee03e904d36f08fbe2bb8c9e193c34b4ca6b03ab3e1cffa2508d9f143b8c5f0b7418bf570ee347c4e3825ffc7118c9d15b43bff88fe38fdf07f8c53fc60863fc5e8c2be377027ef1574919bf15f48bbfc9981a3f18f08b3f6a4419bd24a3570676f121dc1312652cfba2a41e05f5ed8222cb9337f9191365d4fe64f4c0a55df6154dbc24be22bd98ab9c0d613fdfb0f4ba28bd25e507828f04e58782f2737d32b8fe9a17bbce42948558a8853f952a3472c2819838d1316cace049c47dc4acf95d742d03b742fe164383a19bbfb54075172e7f23e18671cc0e51e0d6ca4a164e60d60a16dcfa3fa20466a520815b2c2c493002b34623dc52a98ae0c32cd207dc6a6901c265e1a0036ec1c0f45cfe9e8259393c7fef340e6ac02c9657b764666870f9dbc5ac179f92c1029409b835e347870422e8115cfe0601b3fed9860ff0c4e54f825927cfef8363509eff875f805b368e98e1f25b8059a7e7a700b76e4c8025c02d1c10c8c1ad1c3888e05611093800b78c2840c92efd25012ebf8c6ee9f8815b3c1800979f06b3c0e71722081917666d5fb674809f076e25a103b34a2d1f3198d52d26faa59f7578eb5f0d9331a1df5c1dbae5438684ddf2d7cbd42d274204d52de749e1199f62a55b4e45ff77cb7b7a58bae556f4abbae53e3e2dfd30ddf29f9f20bae540fdd2df2fd32d0f9ae119c742c69119dd722124b003f08c5fc1c60da11f2440fd38721461c411454862b024433a667c0decc2a35bbe24896ecd211fdd9a414c746bde748067e613ecd2bf24c9d00c52e2345de79e0fe9d68f217dd3383d05cf34093a4890d6d1692142dad54386f4ebd544faa59f48f3f40b163cd3533415541cb9dd3d6d45fb5c81675a08ecd23f3f430dd4417da45f5aa891f44b7fc3faa5ff484cc89320e9a17ee935f04c6ba1bb68decc27887c49d1504c87b169605e7c7069e98187950ae6c50797961e7858a99a8aee692b5a480fe997143ba8aca48c240e39789fb890239943eee33f0e048472f29d7620d6c003fdc424f68949d4b45033d1b2ade42f224478321d50a165f309b7bfcbaab7cab89383a2d1e1fba75b6df4021474a485bae5373d0821e996e3f08004d62dcf59c186bae541b4d02dd751111575cb85a8145d77f1907ee9f718b04bcf0b69850f3e2eed465afca707b28178c059e504e9961f3101cff813d8a55b2ea4d211d22d47a222a45b0e234beff721ddf2a118f08c6b815dfce5449c87043ce33a6097eee996b715edd342e8201c4447073d2da4bf5d2f1ab85ef012f22272fb77182714867a003a3011ee14cda3c3f74f2702665ee5800339a6ac8c9f328e4f92630a0e5fa63ccb98f22acf8fc3489629bff2f3a391f239788085050732879495e787b19242ee80f129ef46dd9a43fdd2e3b3903890e48b71368155fdc20d4be61118dcfe9e58b04bfff8e265705f9542c580f1a911068cd48b2f538f5a515179fe172ba94ff91953654c2153235f941321e99617c1bae5b1212df08c97815d7a7c70895ca808c96d18107aacd081cf8e911fa01e2b70e04303232ff8b942402f146b70fb4d53dcfed30e6eff89cf138e78f8de18be38ce1bef4f9e77bc69bc21597a0ffefc68787ff2c009911779193c8989e8769f38238dcd2af09ddc417aefddc8a4b46973c87c293972c31225a4cf461249637e0df43c92b6e0052f1198e0f6d7a9022722c58ce2ba0e786642e154746be2f44bbf1022b704b7df79b879e32cae37eeb91b39722271b3f98c81eb1bafe6fb5743bb95f933fe16a0dd494472a2e77683071d7516d30e2778629ac111788003d80a59b0146a2e13608659a4e78f11000064c05c207270ee59606caff2be34295d238cd041d83fc392383232070a69e308139d9c4c53cba944946693e8868623870cab5193921892ac11ceb25946674cca44de7783e2b0398ab8c16c38032b41d2de5801567571cb70790c1428a25b4744c14b729c0c466459d36f203de8499358406bcdb2fa4cc3caeac837cb68cdb28c52b2390059466bcdb2ac8bb8d324d0ee6933cdf6e9d21d19697ab96ee283898749c9c5e40225b1a5848418f620622024f110264102572425c04f05f6f8bc1dbe0c789d0e9e8f8ecba1d300b7b1704b6c1a0edb06344b6a4cd83a5ecb819a957f6bc62e3446e6013aaf3f0cca2ef4e75743512b36b3d3669bdd32d4cd460de52c2d7bee35ad7e3432276e36f2e56270b6f7a98d53d3b42ccb6c23e1bcce4bf10a95656f27a98a6ec664213790eb2bfa53bc14032bba853c33af3be140a6f71a6a65cd92b4ce2ec27e9f37a07fe32c0da7e9771bb845a9a6b519bae9f6f4fb0ccd1a03b33ada39f4352f34396bd650fe6a32cdeb562b392af14caf815dfa5bf39b9ccc323fa594524a29a59407cb9dd34849bf74b7fca85f7a0d3ce36ee8a36ef9927ee9374ad245d388c8ce223684bc7963f3aa923b8cd470d96034c1d0c5edd75cc9911b78667e815dfafb7d49b76651bff493e1d2d15a92b39fcf6f2bd39f402ea593a8f3ed48c72c258ce5e16d1b4735cddbecb77d1e4d110474af7da77d1f9dd4a35f0d4a52cad4d360e6a457e8d85919ab28abe8a4737a0b61ecf71813067d91ad5495142db5a13894eec43b7d26d084540ac5b04432014ddfc93be95038d496d252ac0743d36278a347d636d0d95c84ad69932c439f6e294f37b908db35f7ae01894422914856ab19b5d533eafdf4e725912a896449249e6125e84dc72cedddd652ed3e7d66a155a0a0445d762e40ffbc8c7e35f3e8cac0b46439771bb38eabdb9c314db315e54ecfa04d8d28845d7e771584fd5284dde352f07bb316cd499834fa65262187a619f5d994662a35fcce6726ee15e8dcba25ab599d35ab9607956a5a6aada6699c6dbed9d4b00bc7d9c8a1eb6ad6b6320ed5ba6deff2b30bb7b6c51082e917da06a37196a7512964170eab977d149c241819981637cdd68c5bd9ea4fe6d49b1fd8242fd45438efcf9b678ae7f1e71f0876730e93c4947a8324948fceb98587d909e851d20c5dcc4cbc300cc3300c3d1445511445b187608ee4f2fb1157b153e1419234151d24c9e4232d97bfe7f44aa5509c3eb2cb1f7e356ee205a7f6a854ec988a7a183234031000000002b315002020100c8784a2d1601e48a9a47a14000f6e905c6a5ea009645912c42884143286106208000098119819da3622b39471a704de5fd4fed9ee01981d52cd763c8b8de82f6007b33f7e055085f2e867bc1dc9dd6ad01d02e8bfc1aedf256da080085eda0fc17514b03571f6d8328860c85aec479afcd1799f2b0bb394373839dbd8319759bef01f72a8bee8cff510cbcef37a20f3ecfe88af40d15338a9b183aa94104b86dc81984a27f6caa74e8d5c26c4435843cdf868ee0f6952828cbb5ae1b80108e5443a06bbc50b9446e47f7890ab32671306c54bc4c2ac87f483504ef5c222c81c6ab3e685d2d21de51d33cfbf45bee8c9f3fb5deb9e14e4a53f4f2da2ffa77420bb2a66214c98eaa6ebe4ec6f0105fc95aaa462f779047c87b4c2cd36580f3824147795f6a15d1fb469e582353cb70bebd25416581b62ba54687a9e1de9b625116ace31bfa4bd0cd781549936a4cb00c733e265aecf13ca7f6a4034f4ce300441dfa6610395a4c541646357505ef982662b830cb9f6c168ba88e303a221a6ec82da843985df4bba25b159617f6ec418018ccc587f8d8ab12682ee16c574e2adcbe3d4efb3f2be7ed72d7cd5b4085d2401f1046b921cb29b57952ba6e512ef560ec2c0cd4fef7aaa473da6e7a597c4c18f91713187c7a1d7e94455ba28125f5752ff5b222b00938f855657e29b7f9d8400248459dcba6f84acb2db7ffa36984814327c408b9e60ddc84f72720f2f5a5ab42f1a765ebc058c6f641da3459976d8cd4ceaf4ade57734c2cae39e2af9f847c456572215b70e517ef4bf8ef416ca5ac27ce89e0e9b9e7288ada5435239eb5d9af01035fa6444d28d9920799708090fd2a6de00a79182dd1b4a2a6c570b2690f8c99b0389f857b9637fe43898c28746cb82de4dfb4bbed2212ce1d02df0ae623341d32b765be31cf43417b21e5d59b7eaa8d0c56efe0e5fae8fcd501b7f2ccfcfa02f116a3f2a9d6d0c3699b636ec93cff8206905ccba1c5ebde41672cc141e3b3a04d461f664cd01c137a8903948646cfcb7ee0e8a2b49bbbebcbe9abf5bb2bba34ef6d29a71afab3237a601b68fd034feede16ea6360290e8d298ee262fd5109cbbc96c0311c71373b93886cd9dcec5b9a914c149d03c32c6a83efcfcda8e7e7498fa4715d7433f52b8d1737234ccf07247646ae22e00c219d81d6a8cf0f025c4b3d7e15060de0d03399a7cb00ecf3910f4b49723eb6e0b5d62489ac1779edaae8e199771438295c15d598f79b5ecfe6b5297052aa798d84d11f3d4a943ff30580b653ef3b35380f07e336ef992f99108368c3e9ad05e3cd0fa3a6ef652e0f379ac0a3fa24f3017e793747df11d7f7115fa843f3f2473813f3230a408115d8e90097b3aa5d4a0d6870819590343d82387c39e43917fe74e7b816fe94c1095bd60e86a33401dc85c92165cb0eca2e6e02c1e09a539b20b3dc5d110000708b4885ae56140949467ff18a76dc0730db0e92b2369a3779f008e24a9883e35b7e1000e2da38fdecfec63e3924113f2fb0edcb767591d9dd3b23a22780de27f64386a9566ae3d822843240b01ecb52f7214aa3736230146b044bf4bcc0fdcfbe8f6fadd064f525ee72c5bec1dcb442b0409aed0db9026b5fede6881d7610bbf292e19be901cedd844cd275b758c7e295e862f4248c13a523fa07edb2f7197bf3e547d0e94e587494b520d5b06fa5795c39729910c34ff65c367b71650568fa6065047456f2cce6b778004018d3796278170f0de7fd0e96514845b2c76228f07bc79b840e5c0e93c5ca807eda11eee0b5256cf183870101966353547195e3f8e9a23ca9acfd538b30be6f5ce018693c6e6f556f6a1df6959476da30d1252e4dcdbc5d89720320a1eb3443f4ba3e3d34496acfb86e241e5e79f7fb65f93991775340061280d2803be50e80f096e198d2183b4a31b019176ecc18d87096990fd5c80f5779c3d71851bdc7003175c4326b88ed82086031c84831cc001298d1da00cb26a02fa7a0aa384d6d174a2ad03fd74176bc4aae34d915d101d4409648ed845ef625950fdaba60df68e38bc0e2bce0e3a6e51b207f2ccf526b3c3f7fa1cb3f5086bf7a46f51324a7c588afb7a103ba9de4e250f2d683db9743927fdc289b9a0f49cd044abdb947cde6a43bd262ae3fc8705f140fb1265387e99e7904dacc3e2cae322d3715205fee39e2b73b60b9b1bee612102b94a99348196c6275d9939607222f8a2c55d7f401fd42374a3dc6e9496d039cee167beeafb004f19de28239bdc692d7376dcd4ae5c7025f8f2f6855cdf130ef2c3a03198fa9109c6b033624b80c9a3830325fd1d84ec32c428d160bbc1cab20c199af4ea06fd52a876da5c5b34790606baadd4f0880d7a67d4598b8279a0068132ea882aef342c38738951916d4d304c801553bc8236689fdf644645d6a84424bca8cd92c7770dd0f2e5cd6efab2b81b88d7ba59701c9522e9a6dada910773bab1d11384d32fb397d46603ef4b602d3fdb5229c999976182aef0eb091c09cee04846ea53ba7bf0d9c5b166706c08442cfe87dc65f6cb75ce1937421f30479073c0a40d4dbcd567ec0904c438120d185f2ca66283c84e41877562171ae13bda7f658b5f69b405cd743c9dbdb1f1aec4e73f63e787d15d53673eb709fe8e7ed07cbac2badac9b6e33416c982240e87002d0d5ffd90ef6a2c66890697a09b9192bd6e3fb3f1c8258e21b10a8232523987a4ae48f7ceb7429eee59a8c9cb63e275a7d3266fe18b915b2bad499dc3a38b2a3e50784b38a12100ba1c2270b4afb0fc0c0fa108d2d3acd7c0d1723f71c5e1c23f617cbe2356d28262d808c0ea9ec027ce7b60c42fddb163da72101fe000ee5d98ebbbd52b99ac61f4145b8d7080f8af2123eef7dae620a7ac62041c9e9e4873a64a1696db334de057aac41dabab816826322c98c5cec0653565aba12d97630abe4c906b00f9d92df267890ebe1125bb8b707f1213d0d06616cfe80c67637282a4f316926b109cbc1bb5a80023ee4dd61bd17dc6dd67ff7531d467f2170be19bc81b62ff31a56eccda398048df2afa727c582f42687b8a0c79d89b4b31cd1815bcaa2f360f9f80e786ba2813bba867cd766bb2f5941cf17a329e39365ecab250296d29c4823bd3be854651fc30b62a6b602929f571927820a4625f49c5a1906bdc254505796dd4a0528cfaf38afe15f8cebe739f967b1148cf24852ee901262adf869c84e7002fc8c0c9798571ebc480b95b56189df9130840cb9caf8ac6ce9568a852dfb8e7b00cac6050fa94b160629a4c1099996175d5c726b642da73bb8e2fc2fe64d829a9f8ababb01cc86975cdd3da103f5d5943b4ee34ca94cf03ce5c11f6ab684c0e49e62ba42e8e114a664a813f89e879afd0e3c42fe8357248971266e794382e814fa86d1696a4fc3a41cba879f2056ba1e7f81eac1a1c23f831e80a9edf4e2da808addb13647a63b36cd7385696b6aebf6404c9f9d74efd180a7d05f2af6f3d8fa3fbeba8c21cf0120525711ea5861861b690d93dd82bcc2620828947d0938c42c2c0b0a67aa4b5b40aa42e94945df3205d1148cb97a2c4abd6f6c811d42c8788fc62388796c3556682b2aaa5594f51991510bd5dafdc6274011b6b84d7055831f1f65c809464fb3798b26ed9865a4d6668a68bb60a7b5b45090cc385db6d95ea10c0b4595c450375d57253b69ac726df36a138c1aebc8e25bd37bea081f8aa5fcbdcaa680f5df8825df6ce6639e8be2a9e29b0bff12b200e08af6b971a0b784023d664cf3024865a94c2c2b10289fd6423a95f9e3bdb0b0a6fd9d9acd6d9c32a444677c3292f12e82ae28a0b298f0ee2e749508bba36f1f85af455107024464b1f7722ac5a719610b0958579804004e4251a172f96f61c8a5f3a6bfa74daaefe338d4b6c9c802b686944c8ba41018fe16aba5a7c80382ac3df7fc48035f33f5906ceed916927b6aab8372e1f80d41e5fc6b4831e2b774462e14ca062a6e5aa08b03aa2cb48c91330116181830a0cc71500d212c7bc6c39c6dcf1ba3a597d6e8251b3d020e09731d1a105149a3be478480f82f810fc712bdcda3a78ac01a8ad655708202c43be6e4c41467a1ffe4f98f01c1564d7cd68e63b76dd582729ff67e474472cc4d08440463a62409c2421ac72796727f473b2f576f47e4313c1e8469eba2d002fd82ba3d5f4562b436defedd051059f6191e12b31be1de1a0b3b743becd71f803252736df8e70fc9c8b00e58212f33242647eac1911e1e109be6f47f16e33c228eb47aefa7e40733d50a4baa709f3e3df0eaf79dfd88f3b9cd4d7c7eb61b3cdd408586d86ecf10cb32cec8f3b58e97ce3b85468ab73a9782d6acd6123414fc5d4f834168e8203824128000b475855c4821448e85238751fcd86d36100200802c162302b059194034a3a2aaec2a7b331541cc003b522447354cbce25878b58dd13af9ac9add73ab409b5f34998f7d0edd1c01332a9faab253720b6cc28b2bf313383d87c14afc46ff3e6cc1dc54ed02088e612fde451ba06a5b58c984f3e95636c4e17aef9eb14e0b15810367c2eb669071396478d4e1c1037c250e37a0b9a0054f7a9faadf259153fa965e4568fed8611db4d51f599d850a3e985595f0377d40cb94390f6a54299e210fa4f3aadc3e70b48da53f39d807291aeace5763e38fc6c0a560f16dc81845c6e16d53281326842bb2e6d59fc8f2947789abd476bb8ffb3ee081386d7f5e77615ae93becf0f2ff24b548bfe9a8077541077f945b78c63d456615aaefdae63dcb78a58bd68e06ec8d624db0a4ebc8a894c7eb35d1ffb1d29257b3496ceac336458f80f6a4fbd9773fcf22161fd19ee3c0614e7c329f558a40177dcbf694fb7765adef41bcf4d451eb7ad0e41913b2374417c3b5c494b8bccb90e0eec8fd0c5e08e7bab1ca8bbfc66ccda1353e049c900cec9bd8b70c701d4af7a6dd56fe85d82b75a307cadda5b9175a6d4879ef6043a5c157c0ee17cf20d14dd1ac8adc62b38bfa0ccc31af911ed776fef4c62eae571b1ee281c038f549aae8ade4a5372007ec8d04d62c8ee2b869ed2d03497eae1e6c178d54a8afa4cd89d6cc08014452e304531194e99118a41cb522276b9776833953b7d4b1597a27d7a315008c378d9ff1a326484b1c96d5aa79bd69a524147c4ab5b384dfad7f9fc602c2e259bf72d0dfff127ddd60cd874b0575ee064189eac1a56870eed0921c29e021ffb566d6feed736d2d650d2095f7b2cc4325723505bb1357edb1f353535aeeb6d1f6f6a1b27765b6758926d4da031ed0f183ef51381dc752c43673d87188b2a00534d4f00ae329a00e844b35d2db32a904ca6c283cb358989bd306a2a4aeea7a4d700214d4390589ce0189d499c378ed1e59177148625e6f2cc613a5d28a2584b7a58ab79d4921c3e278fb1e4705a9cb1d55f1947cc8c93324cfb92768b0cd382c3c2ff72505c2833a5132d22067eaf108e33d1631d6eb27a0ce789ee76dcc3875f9fbc90293bfa74bd34cc2cb54730926fbf70156dfa17c2605376d0d616d0dc242f237b5e38a2e77198d34250d102f453af39da2154b76025aa30034fd23ce3d38eb468b7f02d57e69e8ba2950416a452b456e9683bb76412d28efa20b1e4acdf14102a2e00284fa7ada41dedb724997815616f627a29edc88146987630da48b43e62dbc9c3824b2c56858f67abd9199006ec34ed22cbaf229052f35323aa16313eb8253700b4b3213b5dbbd0f0b603c330ce37aaa4d025ba8a9505bc40cb9c8011a70df674ed02fe205ebed8885560c04ca4bf3d2386ec8938203517be451459ec1020ea8296b03f2d2b8a915983e379f1de453ba9e76de99cd64a5d86fa213175915bd242fe11ddf635784aa6c3451691a238925f618f97be917fdd06d6c58d4db38965de5dac6e6814455b3222782f062461ad2c5ebf1465104c13432591722df7be12e41f6cc154ecd9de4e89c772e498b5c9a2d1e9126b87931c8aaac81edd285e3df34a49a5059e66a35a3d8acd63ec65a19673c3b6e7509455a5f3ad575c002d21bb149051914e6546e0507af85d2bffc215578bb75826b0da16903163bd983b01cb6e0fe4b1f531bcbddd0c3464614628b8437709ba2cc66f0c4f0ccc80a4a751e640b1c8aa0ca9797f42b608c27e1f91f37adb1669ce7699f2fda4ae43cd3c0fc291428911992bc695606d26a20ff0d32a8cdc1c9a6c8d1b84beb8c9354dfb3b6745fc455484a4082892ad510d298f6c6d9e15162a3a6610d326c9d12abd88561b220cc5842caa96729c4213128624425d2722f7e50134c1b0165de604b248f56682bdbdf3a3e82a61fb15a868c404c98a5140a857315250cee61735a12caa4d7cac847a5e6cc9580410a8bbac7f9106546775454e0521da0fbe769dbf986a04799fdbb1982a3caba3520c274fbe0114680e15163dcf4c4c0acc8fd0afb54cc986b8283dd2f830046a2f1a7d4e3efffabfb2a221dd9a22992a4e464cf8a4b9be76327148123d4d362958d875d033165139027104674405329585e2a13af44df5a7ae9835c6244708df1e31c74e033337175317a23d57532ecdb22f2dd794c09a3f12a2354cf45079e049593b51532199b6baf791026bb8f792c3bbb2e30f3daf7e72ef761064cef5800b997a6ca6f65326bd72426ee8165341f1f546e5d41ac9bd3148b420f7c755341ee4fa9e4b127e36330f118cad23da4102d09d59c81c56147734e98cc0383df295b018b24dc1148d140113f67a661c9e998c745c0e51d8b673c51387f8e0d0db40383189dd363af29be312d5ccf4a8c68c10958ee69f318c83d2eee2ffadb08bbf0033559e079310bfcf2c69d612142bd022cc906840bb8d27922334440dbdc29c72796c71920024787f89673f03f44eafbd01d13dcc406a2b351dbbfa324e7300a553c8cb10bee477bbe0e7ce8e4d521845c8f092e98dff3a5310cc4529644253799f3a36fd800509561126dedf92c5ce8b79a460c558e2bb10f66f099194396e2af9841488748ab5876716a69411ea33aed8d16f776e044bb893864b566ac45d35a81172d7203a5b86112c61488948e73d18ca1d1894ce293dd3729ef2896d43b7d74bd097c6ff43ec698944b8e78379753a2a838b72c0afc9a686779ebdb8fef69bbe464c5c903156ec13c762b291b1501d8cdb4cc6604dc92f35f8e716f91b1230a1f4a5fe409c228fbd4dba572224e885465e0b77934fa894a8c5886e371493ff591097539b8800db7292882639e169e3099f9fd0e9017e9b49f9b2942a69d02dc0a028f961f34466343e08f937a73ba9af7a0d9d83fe50b86b38d5e54cae04848b5fc111bd8557b77720ee9b4c8e38a857f09247f5a7959ef42bd35c0a038d9cfedb509a7d1622e33287465864753f848873e0e735affa02a3594da67a4bdbaa66750231387ed04059dbb144e47df12268dec55556540ce03edb839bf5d5e8d99f7fa8f17a3b319013037c15a6020d9b5fb8a67051e4d9aaf54c7595682e3ef00d896c6eb6848b5de8f80f2b85ac34c5e288be116b1f9695edd3948e7e451298a4bf5000322af7cc76fc8cfb80bc0a8f52883d3531dbc45a375c2443bcc8192bfac745aa0f3e50971f8b548758df58c22bb8e7cb922d3df1c5e44113bf5e71bdb94204b8c26a6154f01df35e803baa100f8f26ea01c1dcdd082c26ed6f7d01ea8834ebc925af79166d8b4aa4b0f43adc02aa62b4937326c574c54013b481fe24128806fdd82992b483a7b38522e5ba1f1aa5ebe8724e8b26b2b8577d04ccf3e9368000f5c78cfb5d3e108a39cb712eda8d0675a239042c50c39a7dd9b85046b959147412dff50c9462f4b075c78b8fd5983c9058fb29a9aadd9701209025041d338b8985727b715b825ca9e209c6bef995ef0e8484464edc0d9cdbf4c18d8f3884a58c9c5a4ef0f2d64ceeb23d0710e45eb7d4cec3fd3fbba192937880191980fb3b624cf1ff1159390dd5f208d9bf70a91680d2dee31cc3938e5def6907cf402905c6331cb5862426478eedc739d755f7dd34e6373c930f666d0d55ebfb7d3680b437e945fa90b4acae3665ac345f642a6857ab7a1e780d3dd77474ee83cdd28f3c9e7f08ceb14c2315995d7a9a2636411016aa3d72625b7a2f2ffc11eb0cc3d91775b89abcdfc728d71187083ba8c57ba3e2af16248324d16ffeb789af66223402305081d7d9b561dbc0e3155e407017df34286496a9ae8ef0bfbbde8d9635bc332056097f2b64511b23185d553ba9997a20e650ec8237e4517a3f527524af495ca8a17145a6a2b4272189b990fd70a948ea3dfe88e0025258e0481cd188560135c775170fd09a3439649a7271e7c500511d12a87e10664059e2e35fd63288cc32970dd4012ff707250db1d2435b8e0c696707e6a87623990bd9bf1c21cb3ae36d9d5f0134e6a9cea793dc16b024aba8428d1fe83ea31ebebccb94149a6507de61569c935dc2bbcf15e75a83287ee05ce0b2f7ef56a985da72d5a52cb5a712a9c15e3309fcf367c7285500e0fdefcfb19352513d53f4caa6ca8d9438cf6aed7ca8dbcec100dcefa297cafa304851c0d08a16f1166c74aa132dbca069a0d899c2f515b5e65af6608a887ca58f7161e99c50b7f035f4be1583c14f108d45c6127bc6e7010a75389ccb4d7208603e7e081ee1a3141b0554799f94f292da427d0447d0ada090f7c1fa31190f34eca25d21a79abd86c42848e57e210a9d9a85cc646ba81f31dade5d06f0c0fe1db96bdcf32061b9e6ba0775d77a13311190d7493f17fea0c58e6d4c1b66c8967f608957bb03b65a49b9e1c952adeea19c9210168568b8545193434a38ee13872c8db0886e86c202b82e09ca92de17d9126efdef7a6b05a8304322a9f056284dafcc2950a2ba07521bb4ffea0747ca8ea45d6e5fcb88e9b4c6963fdc341fc748bbae076ea3a41da9ba1e8f4e916bd2d14f32db247898458ebecea0233a7262471f3a26dad2f91772f5af6957de55aa70161a6f6af646e57a6efc52e16e34e32547d5b6df8b5afe12d014da77106753e3708f80ec1793ceb2378f8ec6417ad48ed634bdeb9ae8c6e608410bdca576cfa29002a91621122e9bed528b92a8cf6221c66ba1123104a23a2a3649dad310a3b172ab725a5763d12f02ad7e4ad28ed558115abd88cfd92d521bcb6122b10013649f442eddff5c0a88feb1b74653adb5b74690ca327a53bcd1251c0f7adf95a95329c75823cb8804a7409826b4e04ad676c170fc07caa6a3dd604c76a8031e7b984114aa0190e858c45af60e6088510eec07e873b988457efa8b528a3ce4acd96a3ad04f7f05bf0d7cde60d83343d18022db96e434d39a8edcc9049dff760688ceafcfa0d90218718cf52dfec9f94f01e80287921290ea1e97f3a71d08c2a29d2f2a682f1f6e4268c968d3236bad16d322cdfe9c54e351e920f625d7e0b96b554162caa7f87aeb4d63ee28af5cb996f82fe10c06e8abe224d0f03a8f0586f41b2566649d9d80f00d4704ad11fa73881950152f64d7941f4472a8efe38a5a3e74ff3819b5d49be7bcdee269385725e7754cbe15001a5daad48144f98d8fce8eb5f5f17d66ddfa6d235cde535cfed68774e998d5ab37e414a6628cd4fdd2bf448de830818c2bd3f5bd5f449bb780b1bdb106ed5dd28f1714b8f44ab73a5cd82b76d8f74b11b254605577f1c41297d06be10ac216a8bb878f0dfa54f6e042b0fb913dd427f5c03777eae7b6d266c59b6e5326f4c97e2a1b48d73a102085e58eb9da1fed02b42c58051b35efaf6eab52a34e49170c5f7d32969db27b0714cb24882b27d1c5f330edd4bd71a5e2f75aa89dc1d37b96f4000ecb1a817006672c919fd6b1ab57aa1249163e63b7ae64a95daf3e29b3f5ea708b268de24e95a871d28de2da3d6962256726a02eceb3b3026e5e2dce9c2706e2ce0606800c0f2136e1ee098bc34e81e5535b4f489c8b6138bdfaf0b2eeea5f1af27257d763905c57a498ba8bb52464a52dabc0f8916e75aa77f5538ca2ea04cbb36f3c815c606abf6ec261d038a772d389eb5ed3185b0771cee3ea651b3b4dba738d8faee37e0970c5fef09b4582fe0b200be1b923cfe35431d3bd080bc5d1ab65c74541efd9b076b02516a9bf7c88c3dad8ea3d06a341d4a60594914e186d449490fa9e1dde3fbf3eceba85af121d100488654345805a95ffc561385345c705be49302b34a14b90bacba1015bdeea21be73899e5a7a46e16186d1648e2cb1f8c0ca70bf0c1dccd993e82e201a15b0275d29b7cc012f6eb25021573431a58b4514eb1909f190e350cbf8326b526d3f2a14914e7e86c8080a44c5a3f6ac4d8084ba1f28767d57db1e452c5cd96d5f5a04e176cad119de1e78c07257e28729a67cdfed22c203875f656dd6a000cb13b18f04fca193b7b789e0eb1f20880803e1aba8fcccdba8c5078c4823d91bd862d44092bd3d9142b659f6e6dbdf9f7c317b1d5fd0e512229116eca9ec2d0ff92018c6ad4f5ab084274487de84f592c78b2611ce6fd33dd51e0a53da1267e0397bd04f0f52277ef4bd279b9995f67f002e04c2c9bed591c9784611dd882167c6aa184f9c8e5540714253bd707334a6d1a499c1273ce989dd36049684b254b70c36ae7105f86fa1a6f9853cc2e0114a9ba62a15a4942023e35900995b8201f06c82b09c7dffa6626e06dba2954461eaaa006c37ca9f80ea917fa4a8bc7e89cf4b1d6d7daedde5a9a04408e242bf2efa8e9b4f54b0b5bae70aa95156716676b9efe1907365b2c207a0b9062bb86ad05ee386dc2ddf358e652a721d99de5df4f1cf9b797ee2aa463a44ced9a19dc8b2b7451f62dae3e9e0f3a053148b1b2342e4f27fdb721a6242c325f2f4384231a8f27c82390aaecd7815e648777c58b5a3d745087063092676887287edc18e255c7effb0d23134f19a2102794911130b30029a0b89fc5b181d4109b1c81c52b90f57747ea3a39897665949bc700a4879b4e787b30f04df0cf2ca56f6f08e12024d7451d6d1cdd9e091ad0ea83c594f03c1e72be6be880cc3e61a6f7e128bb36b6a0b00694566340ae120dcd5bc15004b15acb4dbf9a3ffeba742615b21751f44c73765b95524c753fef84a8ee2bc2fce7bb54685c0d89ae732bcaf179cf2006fd9bcbc31c3b0840875d1dad91da929963e33be9b80b1128f7ea0db0ffa0d872ded29de1ff8bcf1610de8527e05fba5f757ff43c42e6a95a70efac259f5457bacb47a04035babd87d2e0236529b79b30dadc075d8e44328594507f4a08d99c0147d114ce8fafa77d67e8a6e29b7844c34fc85395350dc22188352de0e446bca22482b94890f5c6a78a612c659c90e997d47494008c3c8761ad7549f7dcd29f38b201234a5098f185f2f77511d941aff1c6c0c150de2368c8912d677d1a75f31d441d7fec976b89165f1ba1eff6951d6593224e8a2528e76120ba516be6b8420d115c756ce31e0ebe721ea0d3a54ac63372d957a6c7c38f99e3620583042ad97f3e72d006c91ca85cc712e8392b58c2c51092a03af90e6f1e3c35cd35065441407a1d45e05c7c9f6dc0b76f45a6572557fdd48ec3ea34caaac6a7b627e8760c31477f29f2d901b4c29caf3e7799c8345d8c1eb0cefc19eb898cbb331baaf4bb5d5702a88e2bfe470125abcd054cb65b5c06ac729da3ba3e65a81d51fa25cedaccc158edde9d8fd048d3fc02cfd504408905851576c467572de300e2711ba6032c2ad2aee94f2206641b8843fb9c5ccb9608b664f3d9da459cb374a6cf3808a23f8e856b9070020bc8bd5e05da1b0b82c1362249463d3e3db53830727367a21a375061f5879197f9b76901e60c1300b85db0a5d68bfcc23ea98e686b20563ce36003ca5cae903f8102972774cbea9f5a15804754ba15e672b39064605805d8d127cc1ebb874ae8ec101560f1046b2417f0c62c1d292f98d357add06ed911615c6468624bf28d8b5ef01100c5a5af01acc3e1e4e2c889d53fecdcc927903a837a713b0f75d5ea27248e6b9e73560c4b945ff85a604790ecf4876264e6c72a8008741fd73b3617c8f50285535f99d2fd9004f0086679e165f6410f74a7e7b56bc8520d36587f7ab03dee6cd151a665a2d16e950551eb48405d393989ab59159a285a0f532b609e8750cca98dd924a570d10326848736347b1335f0c79812b20aa3112b24b85c9ecf4e93a2c9c363f11125265acf78b13e01ae64317d314111b4d6ff3816c6fc3432b77b8f8b3b7e16f49d162400e24460470ecd5156ce0f94a4891f1bab30961331603d1f95dfc5e6d4d7a00a20e89916a1bd22648f736f868629479b807e6185239ba50a4c7ea1a4f218ec90e488e58f1dc4fda5429592c3393e993856cf221000cbe66dd32bea0269291c82f3c264f7c54dd6972bd938b38daf823989310f49b803351e81f678c94ef42758c01a1287a48289d8bf8c288619f8794114725f9a7d2f8e11b5f51ece7ae11b1b4e209635ce18df2ecd371096eab4a82b302fa19f16cb9b126f57cb6120a7b5f1595b2dea4a67d36c0aa94a5d96003415cce8e579a0083359031a3fb395281813101e8c1f628493528d2e2c89f6671c79ffdfac57bceef399b32bace40abe645bde303fea9091b3e9ba837f0f0c7368839b64b0ee6cfe8ad20ad4f26a9e167693ecf4f81a53f2827400ec782a2894aa940943434bc186615a12d5669eb64cde5bbbd16a28f09a0a84377da32d6f0e83516ccb50fd4f6a60e7e4baf149c1c28718b62db7dec4c58aa0369192889ed0b25a24380a232d722f5ef941323a61296be3801acf19ee3784b3bd2c1f074aa43d70044158e1033fa29c8c895deff3380a80808e4022dca1ede5584c8e66b47ade917ba6695b91e727ee47c9132945f8854ca1072b9a18a86bc261b5e9d2ab07141d0068166372b5485660010e94a4f4b6858b6d8d602019c493f2c890dcab7f682b2ae86ab13a029ea9a90f52fec744ab7c551891af3fbf4555405735188062b3b69b7e744e674300bc34af8c6117014df4ce5dae29ec1928ccad3f30bb6144f415a2b90a458fa3c752390142eb2cc787f740d68873f8335dde0ce40e94ca9ed7450d8937f3d9bb7a1cd944014a56e5d890b47af2c7ca5aa1e629194b84903fe9a711899015b6b9f35e87557691348b5da649a1c2eeea27cc076e1fdd69e6bad31708b2a0ffe607083a36856476e4470e32d97cbc616915ff71801a0b5b4cf1a2ede2991bfdad9aff297380df1088b7eb1e219a4ad30b3dc876f938f1ff7573ff2645202816c2459e23aec634a8440b04fac8e7fbfde4545e670ea6f339e32a5c3753a068329811b9c08b06aea72946a4e50934829ce656921323e9d3b4f974ec3a757fcf9b21f76fe314fb737aee2f4c693abc309e175e8d5eec8344f161a6b762e36f0a15afbf14f8e0c8ac5f9d2932ca83d874f406f456d4a61ea2610362d34a66707201d3fceb268d903ec17bad3925fd7580de22e1d26769f5f471021b85b271954d7f75043fecf7a1310424bd412ddc60a8ad87604640f08aba838b2aa872400303619d68e89068b4d81fafa5f612c97dd31e6b09bbf727c4c831e87e6d5b3b499fd73ce180ac796119208259db45490a6775a117cb000ba9ab8554c2c2309cca95190a5f180131f0c47cb047b6be7f728419eb1641ef8f8614054152a4a7837c9a0b5d93198a164abc6b52f30bfc0074774dbb2179fd35dbdb341d6f999dcb8d2f45d9cb92b4c7613b5c7d2db12f14c616bb9daf9b1d14b3b178740f1289f90732e70053797150d0e8fe27fced854bd120de43c7b05ae85c8366c772666888442acf1fb9997483228d39710e76f8c71370bf388eae98a297bbc173bf9f96e6f7b28f479c4420bd92ac75d74ace89ffd9af867d7000d7ef0ed2f44b26eb1a02aaf0180642768a41ffe026341b177c1563fd5e1d573f20e680c6bd88b167da42e6d6e3db7bbd49063663add63ad6a3191320daaa2b420004da3a7a70199504b067ba4ecdb8bfa7b5c03a24101ad583a04c75c03093c11bb13aba904d0dc405da553f2437f379c0a8823bec3a9a8015039c91c2f4e04b0acac0a68af4670959e5f62339802f1999a6ab6297a75a398f0b0fb5cfb62d1c0adf4b450e600a6a635cd135e59b97b2a3ce283bdec92c52feeedb0810c4ad504d7d500fde5e42d16572e0d3b6409d3fcbb24a93af454b0116108ab61da0fd329dec21aca0ef3fa7ee3fc2e036bb7687d9dea1868f771996201e1f58a4559d4867006e691f5d96be0e670ac530eeab58429d22f51b59221736c21c662c31bac91ae8fb1be5e70cab12ef2b6346e88ed1129e5cd2a3e168dabc725585e8b6ca5ff1dac00d8904dcfad0fd2403bda3c0b077dba8f8f5c67819ce4c39cbc59244d27d39f3d0c35c7915ba4bce6961960be9b7079f65752bf6b3cc327519078ca4099f10c8cd0c7334574a184a2b070d33bf8419fad0fed3afdb3590b4ac6a895b646d951c26eda01e00c88bd4d86c6fe577e0498b8b6560069cbd0c355ef25c7f05a0cf7409ede1bb032cba6c0e2a0751ffac5a3413f1df9a0d2fe82d7af097d4795ea367bc4a26f987717b58b19d97be64fc872dc50659cc29ae04beb9aa7ed98bb0e19c755a8e53cdce8cf1adb09e9950363764e6c277e6872b26fbad2e6f0fb3eb8797f68252c1f119a5ad88363ee5cfa9a474101066330a120aac66845c1ad143454932ca3c0f72d82ecddfc35a7a3a5beb3d5c249c6e4fd2b8b71cb96de523ccde1e1a64c4d249a0dd01ba25e9641cb50115d3602cdf86a08acaaaf419b1495a81f7633ba06d3c04d5e448b0bd3fcc339ba6edbe5898deb184d2c2f452e3ea8a02727733f825cb2e0ed20dccd05157680fc159c6872962147c6ac2281c83cd6e4bbec908ff276a84596ec74c2eca1b321f061fb5a8c22080e78c454b45cb9f572cb216563c00cbd05d5448f654304d417b89d345ce3e8a854ed54d065224e041750d78b40fad063453f4a0e50aaee1777a2aae78ee7e124ccdec3e805daa0a2a8d3ac56e18dde91cb6f2bbe4ff711d520f27ad4ef9dd89a0c375e1a59738b1aed8c24848f4cd74abcf2b369a53d9ae2739adc06d437cc4b280cc97315fad31d312d41e9defea6a9d264500d26f105bb88b31ff74663f5a39d75288cae11ce7ef2da35f0fe3a353b68d83aaca809c42c0a600cdc486555773f5690271d2f0a3f6771e1be5bf5f314295495892ed8acfb40c52c773a4d715ea2ba86525ee4ddaec85cc6f016aa60f93d106ef27ecfd11e69126c029e88287f023707ee00f134f804a0d930b2bd0c3f6e5d53976ca6a302025ded535b248f5c129426ef27842b0d5ed841ca993c0cc269cbc20462fb1f3fdcae9ad3fc808a9f5212661bede48bbc74ce49ff64439c4c2fa869e5087ea85a8f9fe1f6f50e4c064bb543d0a52954398dcd6425d50338ada4bc1390d0b260e02f4a057c0ce14742ae38935d25b8eb4be88a352b5f027bca0586ca451b98554a7178ec61d3e1e07db0ea2be2b2b5ea6914202b4fef0749b893f54899ae2604e4e24b0528a0182231327fba2f9d2f6bb757986f85434eda7929453061c26375872ebf3ed5cbcbab2fcd857df428e74b6716146c996ad9118a89f3d184cf44b34541fcabde9cc914782a91b7217e2606ea9960a4f5f1be441c0ae82db1951d3f6c3d41c3160f5bdfea65060674af19141b1e3c4cfcfe1c9604c5cd7588026168e9bbe472a988822ee7af8c747a24c293685c571a507f0ffc3001584eb7157aea44640117a89850a549017dc5eac65b444b4f6613fb31719d4921a60cd6d1dee689ac70dabe4f4f551972ca61285e9c6c8f6eea8e5f07ec6ca24fef48369514a16ca72701e45027a3f63ed96cc3ca669951504ded255b94028e2f4b4c611abb3b532193d192322b8dea49fe3c4589358d08da55722077a781ef1f939ed1a98234c5c44b0d674aa0d068f406f33ea744f0d30b2c2faf31ad7ad5a99ce0adc1ffeadb483a7efcde12b2e9b1f1e3d5922047f93c51168ed2f6899321f542000ba8f0214e367cb49bc6fe180d6ad40746a21ca9d318e777c47784428d90a9923893f91c8387a9028fa6429ef85609e2d8924a6cc185c110f829c95399762a84af3c3bfa1193a6ae5b4c209dcfdfaf1ffbaf73099d71ba78e1bd08294e47b5cdaf11d000003517c049c5eef225c4971f5577fd4a66d9f5a72924187bc87070118840e1c1490473bdc4e9af4497e756d3e4d63546dd59b85c9477b24456087d88131840a079518925ea3224ca36294b5d7fc2e8576006514e53bcbf66847c5cc3c7edf8dab2fdd5ff461e607ea2378235d00f46283b0f620f33e825c12261857f775d30620ba1c08117a3a9ace29f0653ab357f5ade0aa67b4240efcfc143328032fb746d4d28b9918df82b823c453bd53fe80b5baf85b7e18a1d4aecdde19b428d7bd97d2f3e9198773ce92ccd61cdd4c5ed3a23f3ece600fed3d0f13baa99f6ff4d3449ca9ba3caad47e3f6ce5dd87e5111fa09738869b4bb404eff4727c9479d41d9fdcf4835c6babbeeb439b170a9950a8e83fe0383d3b0d07e4009ef062aa80a734dc1408aad1d31e5730a7bfda02cda78480349a5717001b0d1c83703e2832f788d0aee9f6aef9ecb2178664bb8ce16e69a65c7cd223c3e9adaa64fb63217811d745acf7343b591659ba5f7812b44c0c50cd0659ba06f4fdb5dc3993765738eedf09c7c921380774d7e1f3884bc7e831abc0e2d2947b7000524c5aadf90bfdb3250d3f8a011666cc8f44facc1cdf891c6553d6a8530f4b0ef64ae424bd80500a7cca9f629eea6a9d0543c4bda9fdcb6a05bd8000656ca594239584223d56314709d979205aa0f1cfb716d84b4af9683eceb29f92df202c6ca72ce50f3da3aeab5fd0a457bbe6468d2b4a086f88e60b28874bb711b8771ccd7d2cc5934778d1a0e576c9622dc368c79b483b38385f86194709151030634ab5eddb1947983086a2b39472f101dd1b20e6a0e30167b846da153cd2054c83bba23e5662f192649feff932504a7cc835ecf6ef9c867a82585d92f7e26266209894db74a136ee3f624af7cd9219d066caa7f69379869ec857c37d999658fc36cc603e3591cc0e93a465a57c1573aeab0d6635d04e9c64d9f588e1be5266bd0e542555bbfcf7ca8d0394bd8b6a190cee401aadb0eedca3e5457104eed9b200ed1128cce7a9a18458828ce8b6050b5c69d67ba3ff192eefcd35ab87f6c948a4ea6bd6d70d0d7bbdc98d61c7eb44752ce1e0113c0e6afc177e257af5bb843ffec0eb25e16c3528c3f636f5664d3185cf14fda01e161f778678ab7a199e7ea7eef3fa4885565b8f576a4e90a46bb7fa6351e26361fa2a59eac0e0216e6686b864d533044fc8b6bc1ca88fda4f9aa816ef1dbac8b0028b74978bab1336d5e19803638b1f821c6de5159342559726a94b71d2b8bf0da0c072e5d4f0508dcd28c9eed1c42ef2cacb327018d69340a3fbb94e1654ec81a107d3d6d51b69a6f2933252cf89199668d1005e4d44c33142a5e611e712b0132b121a3253a5f609da232b741fb38a5d30c98122140f615c08bc7ce015df6343916f05102d0231100746cd74d7514cfa23a428ed8d8359b1fa480dd305adb37f73f7cac17d14118a9ebeb48dbf9c942569fe94f047c12ce59af26ea7a18639b931992f3e86e06cb114061b22a15e18d002d42206367c3229a1e8cf5d21df152dbefc502f8b86fa1397a36e909862f4508c3d4d0714a6a2d878919ec984768f4dd42c178b39e92706380c217ab277b6b9fe2882b5aaad763dbc2cae421225be54ae1d73272f3f5fc3bc1092c9a51f8f0715bc5cbd2705d1f0938d68f07867192f7a283821a91559180b5db2ca220bd002e0e36e10506d463e6a2b83b588630e3058ad733c418c49f04daa8aeb64540436d99a53db7639fc81d79ba636fd482c406ac9f2eb66c0fa901cdfed5fa0f78e4997da14a9225ca8e5db1fbaa8c8dacd176a00cfc324b7ca53b9f7eb5168d76093a8900ee0c608c48d3baa5ebb7fd6f2b09991e2cb6f86edfe204eb68542120e17de47f2121090f5e2a93970ce5abd50e390507ba9a9c0c087100e1e755fc64719895e3b52b7ba7a7e6314fd84caf5ac3f9060d5ead8eb28d14ad792a5653357f7ff774aba8e1f154473a00c319c101ce11b1ea57956d21a8b08d1f53e4cbce0acc7dcca90f45b3152c39b9e7429b1b9683b9d302ac6a7978cc9036e9f204e0f8660b3196d189da548f80f03e0331bf9a98b40e242af97701c44fd648684144690c7ccc40f032b3d0a40706448549d0cd7d960e159a77401effa7a72ef9694e98bef7d90b273679a4e0674aa2d46a1215820fbe109ef785f86722dc78560f40522b4416f3bcbe300719a47742651b8bdf373858bd3637092cc8515eae057c423a52470856645fc88f05379e7a6b7b36f92998be7064beb7617160b0f7426b1bf4c228242f0c6c090a19bd81bb701daa13e1dc04254107a5f3c0a300b9c1ba50604ef80c4b04b091f10316ccbbac5d3867f0f290804cb7f48c5d884be6141212cc663a4f6d491f5a6c86c614f3421fabaa6aec850d0aec1502fa4db0be50643a53b44c64c225d639430365d134cb30863354efbe383e91864e997a8343a9ac8394c541df07d5a10f1727bc9b3a99ef1c0ca388b10e7dbd7097c705666fc470ebd959b7c045550bcd21589635b2d09b61f8d7bf21fc9f8761f3ca8f230b2cbb87e1c9fd0b5f8b42a8d98395394324e8ef69c4897387a22f50075657c01906d76a13b1145fab144f6737656e56208dca100bc0e2e49a94758eeaff86c5c23500714767187f938c96311bf29810df9d6168be4039dcba9d61b4278ad8198684ce515c4e42ee0c2d539e8e1654475a4d67482b2e5c21786ca69fccef823fec48f8fb023d436b743b27123d9b15b669747efb67d8b3052f6bee3374857066fbe453c4c9f920555fff1942666a466016fb70e2d616fdceb9687686fcb91226cf19de007e872d95f70238ff0a2ecf554c45f20e48285d88f4fc9eb8cb190543ce99c469263354df79d08a5c97fa2f2746c3bea06cbafd812dbb90c6447330c386bd643d5cc1f38b6faf79a744d051ed3a86c32fb65f2540a3d52497928967c467a509df32040b57d8aba9dab0101d712e269677e4ca0a551489fb598849bb36435856800e474d4a3e49a07b5a929915e38ae7982d1398da5361cb50bb5456b23b2d9b1d13da3e341b55550b297d7a0fb199824c38ed5b5a185d56b8e4c1b4b519566543e56bb9a1f7856fc36603a59b51ef9922d0de6c69cf27f34388c2eeefd4f6aa91574cce22a89513e272dab821cc87532785b6b17c0b4dfde4d26fce19c70d67fac1e09a40a609fdd10989ba264eba891bc2fd38e8c7c04e635a0e841138eb060a371c1174b88e8b1e7b06111c6ec1df8b4a569c022f998d784d2e3555e20ef2b18c471d2808396cc42dc9db07b5f7a940addee7bfeefcf1bf1115078f50b0e08b685c98eac0c46e0f040812b1b363458ee3d21492addf1b87edb7ba77a00d33993b2e64aa386cef1f96a887b3d81ca8d16bb3fdc47d31e9de328fe0215271c25007aa18c360fff43f9624e2c22c8aa7d70dc1e3e2c521a31f021273881bf4b61d8bb0dde66ba3a6c971d2cd2133798efe871b86f08d2e7da88506e361f3e4ad4f036fa7d8c3a000c89d9d4367e766e9b6ecf7f9a670fd9400de8cbec99801180f6cc5a6e2af6ce26d25c0372e69e77d772158c32172eabea6c6ee064d15a29024ec36a4c46e0ecdb496a986fac333b8f093e77de61074efdf32b83e8b3a31e8db760b7dfbcf17a0653ef2b0d700b333993f4e1815cecc66325179e2bc02b102f44d6c49cd0e1155b043664e050523c33b8a8954345466f89815953d88b4c952085ba27d1dc08aebf0bbb7cecf287688caa0feab5b984d0eebb4f2dfadd4e3f6e086a04024f8a2f63fef2e161273c80d388fc843440f18c5b2e523f1a70b2d8b06c2f89b3d34742e7a870fabc566861b3a3896ab2dc2b48c64ce33f745fc807c9375cecd34ed9cd6d72f0686015b2727f68af0ef387e23809a8b016b597fcdefd0a90e85214dd62389c3d173dcb2d214346e1b1a05432810527c3131afb3a5d4d0fc5a3a6a9dc2858d382d8f1a1873286c458da99a9512c421f92bf7cbb8abadafce7a8d9043833cf8f1d42109f842916e4b95ba547afcf32bdc49f2c3bb4a6177693fc07e6c3a4141ead990239dabebf764b559fda36a40aa1dc34ab79c41de4d114c651afea6e42850f035d7f997a65e57cb5728e66bbeffdc83b54dc5cffa4312fb426d90d47606287a93f9fc7dfef3a17b21860eabf71051e707250164088099b9b40842606f247b475aa048cc959f1bc015c7a8ad57f4ddc2262542cac5bb009fb6f42583777ef40d9e7ba09db719971f583a963bef446fb5d24e4d83a16373f50bf07ab919ebe64501722d7d7e31896fb65d5dd011946dda7581a969d806757b81b94e4308f097a6562438bdfe02fce4e0207c6297919a68158c62172745883ec60b81e386d5c0dcb4fdd95fdf3a1305f506fc9b2b64580278a40b9f13a088c6070278057c43861dfa58ecd9b2191cc08e7db2feb702ab214d2a533b252fb72bdf640e48006c063371e3c72c23ba3c46da581739382ebe59d9bbccde58987b360493b276bec2b532900f705eaf4e29e95188ada47d65009267117be08914ed5229a0c7edecc8281003728c4716dae93ebaba04737f3f7579f6ec27cf4c5ff8fb8d8791a5669148c0ae173ea30b108700bdcc3a376b54f0fe1b68a40c63a41cfa30a7d2cc454347b016a604deafbeaea829eb4a5f468687157c48b14ffc2563f4c39dc4b0e1a3bf42eb83ee97d8bebb7280d79bf65de9d7bbd69fcac29ef65d297ddd782735d9c658badf8985d83c48bb0f31975c331ccddfa4ba181694dd87945baa098ec66f525d1c0fc2ee4bc82dd70c45eb37a12c86076d77be5bdf8d4f0bbf2964d7c0782108b5f41077b55fba109a448f9bdda6a464c6874b5c971bc3288a690919fb12439879d3d696f8ce122a8fca5fa8049cf2e644460fbbcc901bde57c201f8b42ca0c40a4f462037a04df62e5e842e12644937f413758cd797b968a63795ecad6f7dc96fcc6400a235da430c47ec3bc69bcc412292b0d2cbe26820c407c37c8d13e98f721519ae57b09e31e597a7f3eb18046a47df177188b567eb7e358a5e4e99decd9805646d26cfd1357c578914f75dc4f10d82b16abd37153bd0008c5dcc712d528f995b2a1e105a44fbe9049cc3efb9fb67b444e31de3662c69187252d2d9c8fead69ac521038a8bd726c238c0d4b771d2cd292111cb6771a0eba0b3b942445e207e12c541ce7582a59cdd6b9b661df1b50a1ec50ce34d89360a8facd4e54a56433caec49d014d45579dc50f957cfc385b0b9fbedf66e6954950974762c97d17703a7759ba7d17a0f1ad2fe391dcac974c497a94f82d88d83f7a85199f41e1c5146e5d36fac151257d0dc86c3080dd241865249f3f03b8e8bfa4d9f075766956636f4bc410b7842080f9a17731c22e9e152fd3238a5158ae8e0172256272426f28caba6b0dd271cace7f44d14c9ff96f74e39a8b23ee882f063a7839069f04bd9ebf22137ace3131416c006f4a868985ad552a9d6df1510ac7ab9751d67ac8f38b100bf015ad22cd30864154774049d5ee0a27a99412af961c874c088846045a4d1b4bf0660d1276869a14b69c3a2cb5f4562c4ebd91925055fba439b034ca1e19adcbb2546f1f5de54503e86459fb144d1a0dabc890d84416b2ab12d2e77e09ee1076466efe58eee3ad1f1b6d2bfd19972cafe68ee956fb40826841135c81dcfa0c198561c937d7e4635701be6fee586feb463d3b7a1bc16cdc518cbec08b87a0b053f7a80f30610b5255d177f49913cab333462e733f1e77bba61f3a2d5df81a494a6489b41be1383a11234c824b5599aa00a50dfa555bca015006726f6ae5d380b2c1d90c6cdfcc5cc4b5db736ca7a772224795ea2baa9745e4c5689e76467981af881ff36bcb90cf1f787618c01921d377bce641bb938bb84887f2393eb3041d8aa267eb5f56ab11ec51e2f8cd53b605b3a691b6a76652f1e78447bb6fe272ab460ff55df578c5e5fe78d4d80a649c0504f6e19988a3fa203b0de0df9c906c17f6d04efe979d83dd0a685dd6ea3a9091b5e188440d24d908cb418c6c2b883df1f769b9693d4ec12f12353ef9b9a90e312922554a2d0d64f1513904eb42707354f404469a31ef8e53748b438e995fc948b27990a82c5059dc947fb37c8648f2fa41193b2ebb3831254ea729ab48b78891bbfc5310a0737108eae11d1388e6c856ee946b7981ce497e22d2a1e584ed899b6cf0e40d1a13b9a47796e1dc3801a0a7ddc02eb2bcc780c210a44f014739348804f9d5b923fc671e0e95ae90a6654eb60e875cb94526f5a024dc5fa44acf66f9fcbb87ca2e4a70ad502110528ecc82b2904ead3612939e65f2591a5050c18f2eac1c737e0b8f4f456d29afbc7431cb0656367eab1d7c330cac8685f3d05714a4136ec8b83ed6bc012b8a2c749697f39e95bd59ae0a93c22b32a11ac1abd3bf371c7eef95dc4f47885be6737137c3dac06a8a243952ec56c04335c04632e303715a61792a8983b94a4f031e92867e821355dd1bdf167e68d99abde6d8f4337ef574712c74b31dd8c379626f98890304cac488391292987a52d53ada23e77887aed67ceea99ccf258d31b89772ddf80e26816800a97a751d6e4483c6ee351db4ec80360e73423cc380c3ea5cb36334b30639abe4b6ae4296a278dbda62e51af77245cd4c239547b891b8c2d1be5b28f0d42cbca5402ec3cf6c3e1e312b3a54f6c5d5bde2ba63c8e697bc480a2c78316a3b7268a48c55d8d803c098203ca5931837a11a6661d99ac7c23cbd6287f028bad803a9fba26d4bda226df3cbf93b70f8f091d76ad9387996bb034488440dad0199c443d0a6e19876b10be6145d11910bec0e3e021f010710c8db777ce75c86cbd65adfdedc14ef973557d94b5a190fa7bf01832c6c7ae3c76bbabc09e30e7d96baca0477bc71955e98288795c798571d1c2f3bbe229946f0087680e0b502bbf7ef4ed8ae5ff75242713a8e35877c485b6ab8ac7e1149a53b2e160b4b1fc074616e592550dcc8f93effb3e12a0f1d6c3fdbd8a9f104d5715ab970ead0b00ecd52258751d0722254b1869fc339faf8ab3159c1a5b625f767fea50b034dd6459482831aa154f2508682a645506f463887702f953ef934409f300295c3f3d33d0d9622a8f25e59ed2582bf6a9c9a2ba2fce5950f685225d1123f2c30c3dd82e71853e8e97d12c2261620781459ad8648972a4e31e798cbd54571fc90d5d425d2b58ee5ed470ee3a710c6e041870ae9f7ac4d1110cf3ee85cc1f6cc81939e647c517eb5d7e47becc11e38e3db1399ed2e6aa7a6dfdefb278735560a20212c850506f56a995c37d13e2f7cc4679f6a8f0409c42a6088bd9522f01c3bfba062674fa3e0cbba515eff16e3292d75983fcb697d8328c27b4211c9fd636fd79af067c3797c3f7e44aab383e6e15e9f348d042b0dad29aa5a7e0077cf4b9bced0af481d661ecb0b4883a0955084faf50f5b84b65554c8ba55a97c25855ea4e72e82e915768a408caeefe03ae1f08c7459ebdf4b1b0fb08151ce80780d013417dd63ddaa416aa6e9704967d003047e2bfc8680151c90f3a2f4a1a523c47ded77462221a2789703919d6fa464e2ab9fd0a16c9120ea04862e5e8a9478bfcc33e7991cdb739d07058c4635682f1d6dfa446cc72991a108ad30d35e9fe8f886673805502057871e46970819a1ad8acc17c19d55f7ad0051712bb70dd7d2655f544f0584c2a780a3f298ee426b49cb8ce2faa94d4552f06fb557edb0c55bb59c38f5ed8787f8ba1025253cb6d1d914daa1a8ce845635cf067630dde14889d6f46f44201b36cdd2ed780a620c30ac4b41bd2620aa82d0d063d2a7d2b0bb1712e1feecf75f4a96360371762d5cb47bce8b26c9487175b3cd5a9eeacafb5416c65b801aba77bcdda8fdd1aeb95a7d478952bda377753eefd633b5dc8f3461d48794853ab9fc24679624807be4b8d7d5268cdbf80bd1f684ffe5cad3c62f3b0521a581541bced62b35838d01cc7aa1813b3b1ffd2820b7749237c2a9e6b85748f95cc682406799b4a10c4ed851090e67fc274ac33188add4a048796696c410b3b159da52ee5ea39450ea9c6a87ef2b83e2436c33e6d33b22e5294f8043c82e893f1f4c6a0450e924f3403803dc888dff58e209ae6c15f383a0cccdded08f6bf7eb635a57f6b5a6f8cac8fa345b85caea884e7431ce0eb740fc46013f347142c49c25248b5e483e5b4e6e0cedd424e22a1b4925f844fb0d0f3a9abcdaa50a7ebdd9e9759813c53327a850f6a01ec8621145a2c0ec489d1134f12a7369d1976929f6de18800b3282a57bacdfddc7e371ba95e86cf6d7fd2d9c29bf9b12dc77d11954d491041456a999a4d28ab127b523623132a93a5b3836811e4e8af8ed19e4b66ddc253762d0099d6e6bc8c383d00824835e3e586623c097ce3ceb21e4192198fa23a150ea0e3a93e840df4054859ecc08795a0ec62cadf9b91c0679337ffda26f17aed490c755bbfc32fb8d7af6337f697d85dbbf6060178df4c3a09562afb94337e77ca518d41404261b90fdb1131005c19b302cd6ad32138e210642e07f66ca1ccc21ddbce502d0c1597ddc96ddb920b684766860ffcba25ff0ecef2a93dfc78661c20ebee307ba0998650d8c348b9ec98e7a67cbcebac8c0218c5e14d4e181fabf7eddf83f0e9905c95161eaf87e465fe0d63bfb1cbecee9bac6de55cdd0cedda85422a9a57606232faf04ab8ec693f313c6a3d071b4184294c3e5f774effb32f94c41de9eb206913b251ea5eca061dc036f7ec95810f939830f47ecc529e032131c003fea35d032aa0146339c30f90881077fc6acf69041f636cec242541b36b001a92df690475e2a4a84c522f548a939e8b2774707aa9b76ee39f104dd53b40b394f4d9b99d8b82d56913c4e6dd9189a8fd1254c1c55bf385c2f8cfb991b2ed0db59ea1ae048c35bde3b98db8754b79d29862e5d579aee67d6781285fbf7de053a3ae28e194c9248a720e97c293057ee36055de1d7468caef0fe9819a9f993ca0d62685862e64069e65a3ab7cf5777df41d7eedfe15dd716e3aa282fd29afeed001d667b6083775882e90818ce17c262345a2e3d6fc28b362512f7b9e55b35d1bfa9e1ae32bd3398036d799e1fea8956818a03bb20d8920d1c31e0f21e8a28c783c3bb4368d1677e0c4f60748f29b388aee048a6ac0fa4bab7cc2ae9f68a74e9895b39526dbbf209af97fb0446c77c5788d66c6aff0fee25be6ec9f02f7f8a5a5068f9da462097910faf9f0151156f3fa9053ce2bcff94038206277f04e47a6f4b051acd45b1eccfe7cb9a412c9b837238c4988342656a0ee3b1f411a1b1d5573a5635c075130cc397c65eb66bc8365c003443056cfc80ece6b92caf73e6474023b71e69fed6b7008c61c8a4d2eca20b1b4c870c91e0cf9b282c16d1f59d411b76b68bcc2466ce54c965094d210c0ac90c84ae4c8986b2142fb0f18091a031db0132b10dbf4a52498946ef26355f13293f4e6121dae6cb66bb6d98ef564926ea6ed450d2ee918fb0a50009068e749570e6462475b53da2bab736a0c712eef1092ad2b24ff9c9f4cc9a995129649a6562b2fa71cf8c0a29ca9a9475580dca61ede852487a1e59b1d322b623fb75bfd5a0656d20f5aa2496299b45606a76e2fbc0748330e82da62ae83802eabec92fa2af16713a6fdab5186342c0e1a380fbea73f1af89bc2dd6b4d19e56660575bb4f44fe3cd2e499c0f1ff6580597657ea4a1a403a6e1b885c7e42dfcf8beba0b28e2e92fc8783204acfb0b58328e9870914c1551e2742a54853f40b36d4e58464d90f01a33c416d809faa60405186afd34284e0ad71e58a2842074565dcd9046c953a2496a3693555e086d457abad5e091c25067b68dc6e2021e29690a6475bf839d9096d2252a4d11622d4c21781d168ba11f7658eeefdee37c849340d59145962d8d39688a828118e9d2385e5dc9964334b377bfedaa6bfc4313804f6620f32c5dffce1f662c41e21325a92e935143eace5bb08099181b3fb28e39d837a120370957a8a5c52b75e38fa318cc569cbb7db009d818947411a6db7b1883540c6304d69b752f06c325df62fb673c2409c6d6b6922804d511a0d922cded22bfa20701cda4bc888b2b644c72e1465284b862b0e90c7515ccb5f48368a599e3e540181686e850f025a9937f516da511a5ae9058db49129570256581f181489f49a94f8251a1f61bdc8073b7ae1a4d1342c99daba349ed50a885b13e1b58e1027660e1981a9a83dc377c895b454651c61f11166d61946f444e2b4b3469a78a1f0c19f5c68bf02ec22b62a753ea86a6560bfe80b5dbfd8030c7ce29184243c6561e10e143410bde30c9ebd082ec93482f84b01b4259c0d746e7c7ac51be92b420ba7efafe0947194eb1b89e4818fe90604c7249a2fb98fbb65271d7ab13211e87ef31891b101a73169de274aae7462379e77653c6eb06946813d71a945efe6b329531aee0e033f95b91614951d207fd46781e2a531a91c09f6c282c28453215c6011f2dd872c9aeb2bb577a8484492ba9663677add415256caa2775f858dbb21bf78b703ea23613d388d0cd0d3e9830aab1ddf16245a518c45380c9ddd7b0d2d5d65b77eb56878efb657aeb7f8f3ba2e7c6069babb85eccfd9e8c7a70283d242e0c27f8ef633dfa0d0a3144e0d8fb2f12264b039e0d48eda246d1a5d0eebc1773dc0c5b9f577f124ff4bfe84429206fdf9b5e4b3cbcdc1f6529de2e47a7043eacff77bfc663ed980ef0b536b7e80ca5b2867a9e5c7d31241e6a03103a45d1234d6423d80d4a3a8bf4b647c87ea6f2b2eab9e0ea6836629ca674602970cfe2cfcd3b19cbd45f3b94cc41d230a8095a3cb6400b58590d82511df260002366bfc7a7865752ce6720fa1448e43ae84bcfc80604e86306316a0e1de7caf806d5cde6798a7a09982a8626a729734db73c803a2fc0c52b743b811b26c70f433a95e8ab9b3510a632a612cb322e11a8d8062da45e436496191437e8747c99c2b210c2944671a3ebbf1bcf73b9aa03fbae51a4b756095cc074bd654a85d80d066928ece4e85296663a69d58c723fbdc203a1673b8a5c35bf1b839ea228ee1894492767a7fb2158d244919ddfcdbc41174fa1e63c5c45a971bdd989f0e02b4c08561bf5a48120a4c55c3ed5f764a489c8af563062232d14d81896950ab4063cb1f9b54eee08ae5c12e28a0218509a0b20998248e9ee030558470166c612e8dd69fbe22c469ba741bb101de86c8dd63e579fb3eee84b1da68354df3f312d0c286230cd432c647924643c0e39ad04a272f2bdb7ed79d44a48690592651a8a6432b8bc56e046bbaa663f56665cf925e10c69bacb6ec196a944b745dd8aa8a909cdce565a7ea74cb2cb28210514bafc551830652e077897861ecef022fd1b2f95660c90a970f5c1ccacd4e2ae55910a458a5158dee43d027830052fcad9e48d7b0d3c8ca162b2755dbd7d4464ca882b9a4a199e253e702751aa7564f5565729941f52e0ff4b7f7c4618fddcca477c04a606877805309b32c1df85e22682a1019f9604949a98b6442ddd5a7f10da9b976e9d3a56f2f868af0e769652000f812485c8e31b003963612acf930493fb0e8f3eb484386b4f78ecc9cfdaf3cd7f28c130a5beeda50b73fd8d4d9719ba23753d962b4441c286f933c11ca6d9cb387fa9b594197de973bd8c17f33512340cf873cf7d1585c3987f85312e2d77c728884a2b9fee10eed55e7487863b8f5c3e5c4f9d8f4bf1d59797ecce4b1f1294e541f9bf5ff13f7e82b678fd55f280513a30f8c1b66cfd92e3b753f8f0c8f7533d2f5c1a84f15cf0818a63edd2abdd4e24a8f8a528654fec3f18bfe81afce0b9461779c3e3c52f6070d36d962aa869d1a08dd327dbf7937dc8df90b32b8f061f618095dbbc10f2285a24bc8ddeaaf5598ae7317968043f0e72ed75ee3e8584635f1c00589966103cecfe8b98fdb2413909d1b4083e99c97729467c8e5c8d66e0142866d5c054d65c3f57d4c18116a5c64d3035d7638c58cc752b71b5f59f84c2bd8f011e14cabce3edc916d4abc33a6e4e051b1cb80438120a9dc180f5fc0876505b2377094bcb71e19d1fe7880ee2fea49a3ce1b0a79cdd36dc6156a807c2cb1111d4d088c4abbfa0c249ab809d0d9fa137ea399c1fd47f07922c247f000957bb8df4e0b890c4d8950797d46ac39f942c5dad4852810899f91c02d36756fa214f6af963fa5c0eb95638dc88f70afb9364d7bdc00373fa413e666b44b1dae62b53dea257d730c293015f103bdbee6e7a9be2de498aa798c39ef23be22d58d6bcdc1d66a79d1988c6099b717002dbb03ee372e643e652bc9032156dfd2dbbb2d53265fa04453140d72dbe2586e5dbf7cee710ab4bb578f5b73751b52c08758a9cf9b93949c4770d0e43c16112f552e7f0fcfafb2f790741011897147dd69f68d2e6c15f1e39ecfda3313289ebaab44512be60a0075f090fbab18339555e39ba9d9886654d45945190f7ea9ac696c81cdc5a1786a821747f1c645492557bf06fc29593ee31b0450af01bd92af94b2b408547918ce31d640a8c287880796da845605434c9b23320408cc57c7ec125c27018f789477cc009e4856b6d99cb300feedc083c6b27a12d349582c7f217748b0f42584231b1bd5bb1356e311853e06544a61c3d1e6e25619fbb1ad31b4510450c1d1137c2377908132efd7e0629391c99eca71daffc3f88528e8bf613208dc7d902fb198426770c015c451ff08bca632c6dc3c4b0d1fdfc2535d0a8f4b2b8859d43651a48381062cfa23ad7d514ac7c533b7ece7a3a02bc9206818315cb4981dc847ca36572a2f925a81f0942cf72ce0854bfa42a7aaeab468e8787edcbd1df39c012c9a2ff8ad66c6c4470655134836215808e0395ac07176dc01e195787f6a136800e01e6b4d0c4e8387ceb7297deb548d1ad4d9346aba31eac4f9e094e1296b3acb4f0b6b39412ac6982d874986135cc9ca9416259b937747328016dcef049ce9cee58e2cd6e09e00b4dfa735142995fd7a25f26d8646a8c84b37c0b6c76bfc88f4081d10fb80acb111f3e736a0576dbb2b9e66c53bb93348aaf3037788a980879d2029d98bdd8430b16bead30598a956a8beac58ff88df9114cb9aca3f9ccd3d3d3b374ee6df302808e59c80ef7547ca2d9c14afb084fd1b88c88b5421c8c80f84061b2d782a1c12f446716cdf6c736550dac85289fd918215c7aac8545f7329345bbd63a5d0a15572802c9a76fca8b2021449fc53176dbd47d5427d2f0032ead670bc8519f14608aa24d0c3472ffbcf14e709819e435c310ca3d0b99e183b7ac2fb80274f30fd699132baebae238fd3bacdabb7245f69420f3cbd5c3e148082310e9e2d0d8cb6e2e73f485df029e3422292f9e309bb80c7f55d93b43123a414ac4bca423c371ec6666dc8b467e213ba2e0c89c3af40122bfaa1fb69ae825886ab18b9fd0d0ecb1c8772fd3b289e4bdc3ac1660e22cd07d6e3b8040c30ca0ed042ac3b3ee4f0eb89caa5cc81bc346c9edcc644f6466e6abc343d39040b6fc2109ed46ac550e27f3197094776861accc61e5617220babce39e53afe4bd8b6068620178585ea352afe51a71c6070cb04cd145653e58cf7f47b74ef3304288226a149a98334ef44ab52a380424027e00d83d8c5c3fabc8d124bb738c52c613854d1609b9cc935c99716db209e5724647e45ab283f3581121d198fb782322fa1e8fdb7fc0c3a559e22a980c177a00439053a41fa4ad5a8a29dee09bef290c1cd76cb2118c7b6938145be9254edb0c680bf73256de1f3fb7dc58fb5b0c59ee06447436b3a16bcb1db7a71cd403281ba50dbea054bf183b302cabf006bac739ad7d4022d75be4333f7c76c909d5b09e089f17c98d4432f5bc28f23be7e0e1a4c171e060947378a71824da646a959d7ef3d843f5c4421d13f57e54e422cf3916bd9efaebf947c820b5b327dab56c47301589783ef88a278e817f0c908d6384f1be794b54824d68a89230dac0c23a52b5642288b15157a89edbf7592f682a41f9bf19c2a1b8ab1f86a99bc2d57694610562f70f9190153ed0371090b804cfb3c449987d9884ac903d51e895bcdb5994374923ff875eeb0284f3321f2dc4d8bbc5bc6e0858923784bb024eb948c3d9ef037c1f4345f89f9097e25cd8870ecf107ebb47a7dcb9ec3fad41383f04dddc77663bed7fe0e527dc9575fc11d38d887541155175321054c5497aa23c381fda11344b8f9007a287739da7e0b0946cf9b734c01de0baf4d8f69a39d07b39274b7f4ceafd68526e515b3464b718efda6a933e55061f9f6bc359a0e377edf7fefc1e9fcf4385c785a1637d62014ba44384ad6977c7e94e878bf5658d1bf6f18291f508f51d90babd4891f071fcd57ce94ce26c8b498b665adfd364b6211e770f0c07e4083df4c9f37c059c9800f27b6530db666a1f2cfe0663277bb00229da328d65bc2dcdd13fedc15e2cd5a5c378deff3a175eca763ab808b082146e2490ae9bb9cd1b61f4b1bd04ab616598a1533e2cc88a4dd222bbc7402863b4590a6520ab2a67c94e6e17c3f95a1a1b3632c68051830914170f4a44affc65b4536ccf81d059f0da1c296edd6efaf3690c540f9958636e34407ed027e6db2b2d77ce9f702be93ef6027fd748a543bccb0f46c90dc16db2e3482223337d53772668de6bfa522e13499f1547107365df0f54fa96ec454b16fac891fc3fe89d2b004b341d1e17c1b15aecebf6853dbde939a3fcc0f184e9a52b1ef5f74019db1f1332a7eb9b91a5ac866fa4c4e5c47c193cdbf165f0ae922e8d454459a7ba41664fedf082754ee62d4f5757e8b02ad04554454606ca787ac23ea027fff213d9d8652a12259e3e3024370a6ec341325c1b8938d9f5f5cd2385db11495c584b527dcb9dc0f2ca27d51aef9b972fb7522f9835e042b94847205e5c27f3177871e8a9fe159f02850861069d9877d4abf2cf055309a81b28bfa1978b571404a2d5d493931b950a842e67804124816600f80c8a79537105cf30aa8f867f5406c7bf73de431935f3960bcf451ad27aa288b8a3c6efebdace2eaf272392016c19d55a8f25eebe28dfc5f32d4d3e8390292c06f1e959a16f62173bab2a6e0b049ed5efee0b4672124abd0040e8208829683f485dc69960cdcea14ba96c262bf38d0c304042fce67bb3e0f7bda337b9310c5ac62e124aa1399ac7ca5662b8d3262b88efc5c1c42f8c2804eb9271ea8a6a39afe715775be711f26de534ef478ac06db083c3183cc7ad605ab11c9b8a9356441d53fbc1aa3ab81da4403eec269bb991c0742979261de68b511041eb7c35351ab624a3b29f22d93cd4ea57fabf08ed42722c33621c78ef36c81accea7d496986396cfc565b7c1f19db66d95614fe6a8a0767deee648cb32369bf9b5bc164e6efe5d8564c13884d4839e9de7851722f70b0a35aff48e699195429eeb261ad88466804bca32813c6bf0b66a534e6b488ff90dee04592ab0de40a7cfd1e9690fe4d919080fb98cf1fcc3c154f9344556bafec0aefcf96b98820e8255ca3f7ad96167b9e21a933b146a0c41e4e7c45688721011badb005ea3a63c1b56af50e0815c5de448674655829f85e0419c03a57a403af4298717ec3e940947162bde9138854169b9316639891623c11625c4386a156f6e00b02b31c3f0f649c66ed9decb06124ad5280257b0c0051dfb6c6bd38e95fc7f8e2966a11ea2da08316288448503933190a0e1076c1820054abc1b3a3e374df336d3e0ca445dabc1eb9c1a590da14970cc3ffd4b9a106f1d450607531a78efe965867532f866e889ea91d8902dac6e802a8098934f9163aec86ca0e68b4cb69f7f0ad2eefa895f586480919ba0d35919dfc2bf20d35a3044f82242d15ba2c7105443837d9a7b146ca11150f22721b01b2202e9fe7e37b98da6f41cdc274a351eb6358c6d12828041d99b32fd1255218b29a8f23bb1d983fa884c86e50e6efebeb363c313e5a7787711fc1808c813116a0aa8d62eb84fe6240189494b2939bb0b0329b3316554417b0b18eac82d3c63ac5d4894c02db489ad5d46bf8c3d9e396b783fc96575eea5fa887b2760d8888a56198c074d8e5b384c90794ea2f0b28d51c06975b7a14da21008127dba8de3c6ad9703d9d7e6663c019680c4ad080161683b8036087d5201a0557684d3773b261ce0b887eae6e6837ca5e6502a5655b81d441104d369a3721f1366fa96c7b75c5968a1fd216403f83eee9c85117626b3364524cea5faabc04403f780f5a3e6cf094eddb441cbf0153e642df504d91f233a042b7b2d19eb8351c3aca8035160b5067b613304b569237394d120ad482bd5251795b53a649c08da5b2070d75698de87d4950d414147cb8773f9738ada143cfa1528722c5d307c3d44de1d63a0bf002ae443cab2c02b2c0071ab30cfa706f839609a1a765d556685941d96af5252d912b8b736e7289e51f31572ccf24a3c6ce24270bd4ac0379ee8b235c6018bd1686ada669fb7fc7d8522a7a910f97dda0b5b1e84aa4e95a93b1cd8368580d71b7637db0525c1be1fda3ea0fb1a02c6ed217e3b292c6edbc3683ca1c8cebf8e344dfbbf2370e2c9470c32a2aaf5acf8ac15ed967369abfc2af809e94c115a1c4a60e43d6a8928fa3c4894f94eac706b6db2cacc93f74b7ca40a3ea98d07b1ff527a735600afd784417e3c398e5c62f4e461859a1c208c0fcd8eedbdc52d4412ef658f60cc4ca817ec8d89b227a8dc206f4027375ef947916cf14eac459e1a4a8c97f1e7875b3d3f4af67e21045c27c33101fdcd1579c2995862a56bcc56364c595a2e11aaa800c0e6e30e7285d712b662c169be548f0d70ca003ef795ac4b04d211dcfeccc3836861e2fbe3b056a0dccd33f7f6f8cd9a8c92a9e24112e34b397169fe98014f63d455d6a245da4104c1c1aa03068156817e49bef7ace4851e2197c00a090b89a83fb66e1325ca3c80ae20167179ea30e74883864e6f75bfd008daf2d501a22f1b3e84e2ef65dee0efd112e353b633d81ac47892ed0456e979d3590078c6c62238114f2101e96bc90ec4f8b81d85456f32d0327ed356c03815d0dac1f54f303a723cb0402288c4a83510164889676654317a0e8073fd26b89616561c1d67329df20a3511a38fd106b829b062effffe14b50066cbfed151cee78a24e66f86161859710da3c5940061912857c0422c6b6540c5c9e055ec9041a0f54205c59493a5558e20c4faadae119a4e390673848551cbcaea3dc12673cf9480b0b5d8bdcd1088c56c84d8468c697b76ebd53c3ef4d7ac75e09b8207fc02594f7d231b4d8c6d85a5b24ad114248238490bde5de016b0f080faa0e7d65547d6556facaf495e1b87a4b7d6564babe32a8be32b7d53042fc8af2f316e490930093c42ed84a12669c714689136538298df950c6061dbf388a0ae4ab0919cec7d5953da988798fbfa1fd93c6149ece526bb449d3c48c993f3a0251538825c49a4d58c009e923ab9057dc788453441316d0a4006298d92b44679fbf91a3b14fd3cc29bb66aa303126fb47e331ccde55ae966a8c339709ec37a0682cc3ec0d0ee79bd83610f4a1f30e3893469a20c6ccb360930188039f5863bea6a79ce1d79474089695dce08411507129a165272bc4a5c4e9a8a3ac909b2a0c4128e7f421392b56484b1ab8e8c911b272296c6c018b9e1c214be897781f92937d480e0cff54691440ac48154798d8c47ec2a687715c078538dbebe1799ee77973ce151230ac542a754456495646b815873e4320667966d31ef4ddbbee88eef41da534d2ce22412581c2564656aa102152c4300481484fcee9529cec121618384c9f40733a8ceda78de5300ea307cb5b549cba6f95c4ae8c34f92acfca0887ab235880776564f3be7da5844309450d6264dba81340ae76735e9ed9dba7b5298f0bd2637bcb5b7a7807c17b27039506cf7d3a5b6faed4e9574df875575ccae2e04e715f19591da9d2262122d4c814eaf0a4e55745ab274c43243b2a834fcbafa0304d3c32129d7082292dbf4a514ed552a64edf04b7eaf16102136813647374e563573d4c00efca48cb8e93dca401f6bb3232df52efb43c33e503ca233830e533e7398ef36aec099eb3a91e70fbe117b73262b9ba02e2905505bf36bb52b204108a262066619cd5c99ebb1dc67966b3c8204ab7ce4234869f0e4047223178a15b6779c7523916cb7dab3c4a8fb35b16c9cab77a69c3387f49acd89803a3f2b882121876ba007c14437a430207370b8b152bcc86b77c055e5945832670b31d7301469b2fdad096974a562eb78dd5237b4e00321c40b904e47ebbb77efaca6faaebbaaef33a2dcb300ca3944e96324618938f013477ad533dd295eae1989797cd65b753dd381b638d3bd39bc9042d6bdabbc9fb3aaf96dec52f8767af44d5956da6b76f30bdd1ac7a54bd3d3211a75fb037976fdb573d93467e750513b182597ef197bb2e4f5c18c345c6e705f8f332695245a6cb6e93fa4c9a98932a32ed3f5389fb74b6276a5671e5d3a99efe5df51001533c687afbe91cf7d239f921513a689fa8d94c75ebf86d484ee73e296a7296947e144568c8c811558f8ac85114a12123a9239d12b877b274c4a12c59151287f23ded93b023510994341493664584fba45929a5c0d3539607f4b20f8402ac41560d3eb5f2e197ec71f1d81afcd620f8d241cb23dbfbe9dbe1bd6453a583efb24f07044b27d457be044a8995989315423d6f9b34a7778f1f163f1dfa53056ba704d0eb34cf035d0758f9e94bac7425bb449c31dd0fe051bb9a22d658d1beabd405fb3b567fd0bbf5b76d0727cdcab76d3b0e77f507edcd5e1eac87fb4a0d678c84f12e0960cc59229780dbb9733c596fbf0146a2125cd191a8045574097a7ad5c3af38852353e85769ab5a8675877999b76d95bbdb36d33c0ec78651b79411a1d4518f1121d511bf36cba9239c1ae2541426c2477888a3a47a523d454649292a3f4580828a8c9254545aba7c550587f247f6f4802f7fe1da5e9eea99342efba358ac156b65d0aa477e554511f9d51592466eb3ab9e195d56a8f4b45156aa954ae5526bcc89cc05b841418d80708ae0a123a3434dada41270b5eae15004a0d7427a9a5f5c5cf510611a3047ae84f815894830a5e5ef6aa8e5bb95117913c81b5901b55c05b594f16875841af590a62cdb62379bd5288527e86023d2a588a47c523d1c4a6907b02745445e6e75d5c32b9f2480dbef0ad5237b3e0470cecac88c91a74800b9df9591ed9ce59ed5963470d11d3101b84ad2cd11ac3ceef22be975f7dd59e903de544f9223fc5a2969f9548f945fa954b27b56ab155df5b45c6935ea70dfb800c1af8c441b53cbaf92449bace5574af8d5d1a47a1ef975b7369def00ae1ce54a22d5d3451b68e24e83c0ee7765445e555750385c1df10a68c6c82fc7e63d7e3966af9e70d2871a01ec3ef0f3f9b73ac231f21c65b532c22fd777d957b6a9332d6187e875365e70db6c8ff89591ac76704812cac15655c0f74dad8cb47cea67d24091eaa149ac544f4b1f4d748f1946da4a41250fc1b824aae822bfa2d01ba4344bcb2abd6d4a4436025301c6cb13638c52099050932026404a921c317245110ee3d98a8ee79f2a7c88d01e0e8504e18162c7090b3471d68c397fdb664c6482c3259448c2081d45e0dca89991c9ba9040f099f24726e14ba049d3ea69c23431a7e8059dec6248933814294cd3382485f0031998f087912b98cd9352cfa3f2b4a8a349c056c5c85281a09c537ecc27fe0128df9de4d14627e5c1166b4c36b061ce240b50a18894e6a123158a1075778ad4eb11ed8ed7f13b9edc11ff227f1c42a59402ced323f134c6a3c6610b2c318f5ad0755d378fa28003309e7fa3ab5213e2306a435a51572904ca503a2365389c33130c938a0c8734a21026044ab0067ce9e69c77d6bb437d72c89642e005bd52099c73ca9cde544d24164727c7711ccb7832dd2132d6805f8eade7a4b4883b6e3a3ba18eb4d8a7699a86691ad5264b2d6a9ac6628ab1c6ddd16c2c6d710390d22841486cdbd6723374a386f914c3ee8ed7f3d89c343098b35493521e2c9ebdc8842ec2dc2803f06e3de34b5ab2451294f0d3d363802e06315323136566848054466672d84e68300ca53b343a7e167979790118efb18a5fbcc412fc8e2577d126f6a43b61c718e512ee1f521780f1575022c393d4cc4c1a088893301b9a0db271989362709a739e79ce19852216995e4ae61fca0c0408e29833877bb60f7433983fcfcc10e8e41dc0f8d85380b1638c43a4140092942851a4202149918214250ae6d2b85ee9d22c0e253021115b890b9021c889c73e2427e6b08b9e3fab8b5a1cfc8eeba5f1cb7187b87044a13744e929f486a3969fce9c3e64c70bbd014a0f9152f090396595ae434916c6e00ddd30905f5b4dacc1bfd9e7a386459bad5ed9996673c4c64ea39292ac31463e6603404b29e5719812016f34e2d7c6e10f4a251bc1af6c0c2c00831a6214d23045cb27f144f2a458a66d25aee3a213e2102b46a6c64f6712799ff7c5c9d39391919101190bcc05e662ebbccf54fa4ca74d93b32413c4154a1ca5f9f30b5bb4159c108da1060a00baa0852c10699b864d1c3e75606d3b8d4a482d3aabb7a2699976de8264f40321d5b2d28a874a4d554ac53048ada315a32430108454cb4cd8e397c4118dcc8ce1d794845a1d8b58e4c792289b184b5183ced664260d4f21c6f0b1d0fc5bc385662e3822a21287bd138ad103264fb0396511b6c19d699209487f24b5c15603622f4dd982e2c7948c849499a48cac34380c6b3e243258d03a24d3a99b1892142227e88e8eed07142bdc2567a91353f4a40289d9c071603bb00fd341c71b9acfff216f98e1d07c2246e29756d2b692d66d8c748afca29b375520a871a5af84044e39854e49a54b1f0e188dfda031899150d8942fcd73e948a363c6c4cb2eec7058c7a48162829c55d9f20c3186df069ec314727b96d18d9374a8a52c0529c3aed123d515526ae14915a8948884d4056172765394b69951b9cd8ccad2124a9c96715ab66d253b80660984006689d34a19a76d93caeca5745a4be757492bd94b9f85a0e90f4a8b382a5d84b9e06cb1dec2c2c26a61a9cf5a734a0f67d21d9ed29b949f4eaa8585c55efa524b476550de4b27499975e84a25199dd493e81599eecaf4ca695831a3696d5a0446aab12b5a5a27233407b106d3d2bb52f7e9b4a44a54867274751c3e59216f4e478ac89b53922be4cd498911797302ca41b4390d21d6b0a2598a34bd82751c3e1d9137581279b3fd9c94c81b4ee804246f3ca4d310a28d87865883914e4792b4925a63feeac363d41f0ea3d2f88b5ae35895f1970a806348f2e6c444dae05390b421246f4e4da40d96372721e9a121da9cb098f1cb2c5644d2e93ceffb744c39641ec46554216014248d6628e23772217e218b2d747ea31656a0110b387e2315b4a059e4f88d435b481b4ce31374fc0ed1059b03fcded8414f60a00228c0af0d31d0687a81e0f11b363d9541d23be3e6f745d38a0697a6f7a5294baf21d5f4ae84f83dd5b841daa0d7d4f414077ab5a6a7d12600a7f6b2dec9a8444c32ceaadc1027643a02909ab224022a929c9b724ca76db2ae1d08b8e9a623c0f2c8a6375119a7f614057973a243149a7fca42de9cee70caa2f9272bc81b5004272b34ffa485bc014970d2a2f9a72de40d7882d316cd3f7541de802a38c0a90bcd3f8141de802d008318e40d0803244e6268fea90cf2069cc1a90ccd3fa141de803638a1a1f9a735c81b3007a73534ffe4067903f2e0e486e69fe2206f401f18e049c4a1f9273ac81b70c992e69b4e7468fee90ef206043add4104f206642282e6832490376010099a0f9e40de804d5a4ed07c5005f206149236f82d2a683ed80279030e491bccd282e68330903720111230683e380379033a39620636903760d11137c206399037e01323de39e081bc018dfa383c683ee803790342913618e706f041f3c12279031e3d913760142379038252a40d069af91145463c69231c283320130104bd9ad09c0f0a814302f8c7e4752ea869de6ad22d42cd32d47c1e05d8a123070e9dfac9a088fa19e10fb40248043aa196a85b2d5ccb7766a920680f899aec15324410f5ca0ee2a30f40a5fce9b48ee40d17246d482348f2660e8152e40d86246df08f9aa3341a628d2e00757627bded47dae0d6e934145d6e2af784086e3ff286725808f18bfe7213f10054ee188938addf14310ed263430c33f6025065dfef2ce7ea95a27b7c6f3917c43542d8dcf8a0812f8dcc210cc9b6ea1dd22dcab5dec2d94bcf72edc3415b35044d3b8d659cd44403c02245b7c85883e5f3d3699da5d5c2d212844c5df244446acaa29c8c7332ac1411490649c67aadc7b0d5a3e5ac9f98b87a70dd0693e61316f6728341a7f34f4d5cce3f0981e7c7d3437b0a6ab697dbe5334e4d5a4e6bcb59585ab8056439ebf22d2dc93ace1cd2ac4a5756759ca98a3d807a5ff4f590685f4ee87a6fb8a8164dbd7fd53b4300f5022100b03e21837d3aa51286c974329d55d5d85dc71e7d57290bcbf908bf5e2e8332f6cb470002b6e93c609f7e990930ffe13c2c28347d41390b3fc2f380fdfd72179a321210bf2c45324182fdb2119480c4a726c7f4cb4bc0e2741eb07df8e5a12900d9daf5cb5428eae1347e598b2dd4f8652e80c1fe0002f6771eb0b95f3eba69f9653234a5f6eef0940eb5813ca53b14cd39cdb152f0147a90ce212318d210878418f281409d7aa79f8e771696d37a39094851773d7e3a2f4e2e8f5f125444286a84f474b9ac3c147bf1bae5382c5f2eab8ce3704b452283fbfc5875e082b826d16675febe8add4d8fbf9de804205baf56b4e577722b013954bd5aad2c13417a4565517689954726403e25993e4fc52aa9aa0e6503b8041318fd8d44d36eb447c030390cd3f3311cfa02525f19212a38e90baee44624e5e3a4efa594924a59730e25275154b4b5e1c80b5bf881d1310b2a903e1648c10b5d0431399c5c8a33091d464e2cc1c4bc1244f745e830827592a02276d145175d40d119280449f67132fb74b4974ad9892c01429be36a840e0ee739238e0926820434e76b6289da71f711bbe8ce9d7bc7959e59249fe5d795ef7a48afb33559262dbdc13535d2d6dc909f59465bb32e1ed9b56bf6c6acd92a0da6e79764cba248209f6a53a014a3188d94bf44dcfa46221d93a6460a2cf8a98114b890340328ae232c1db1b842498c8e523032a244325b4f9a3027861d238dfcdcfaaca1a4287def8406f2e70b4ca670e4040b1a084d2848010a141b987c5c4c1d3dad459ac5618c95c61af2b2ee80510a6b38eaeb75f5706627bd4864491c5283199a552387710adda4980e2392d08114c4c8899d2a2e8b091d46c41757e30d8dc8c32b7b747995561d9f3ab5bca9f1769886cc8c4db429408d9432a699223eebc4141c88a1f4e9972c2221453a34ff0dcd3d5e801d69832f715ea232b391c32d40f94f664950688193221b948148164c78420da83ce10a2427a0b80b4652f002d2d00f865a7b56036e5ed66959d7659204499d96cd4dcb364ddbe4087eb46c9ba708e345190e61b6f7c8aefd666771287764365e3b42186bd868041089cf734adf5e3a76d6dc9070dcb78ccbb42264dab7775826331b136d62c71af7459b5b111919197ef1670cf66d03e3f6195e8243c99209deb0c90446cfc28e6d33d6c0de00ec0c8d61d8e71940ec2a9e61e8621042334629a95402821b872f670961d1d01c9e2330810f9a7fae1dc1825600279554747106148a9ccfb52b2353530f13ceabeacc520e63c424165d7cd5e99810936ad3eba0a7941a3515e2ff1e6bd0c71a5bd302482f9fc4aa650194f1470e93a60363ace9ba48a5a7f4c9020e497a5e08d370ce3c8f4c18a550229d5d522a9dfbbc0b677570a8432935423ed1815d281ab3359a1140ca16b3a7e75f566fde7c943ff40edd2cc59cae54638e56a3a3a374d701b0735f40f7d2316cca58a5e75921439668791dbd53d3f108c7adb9e6a2ef1e73b8eaa296c149b3c5180d7c57c319a31dab6c42827d0999835921436a3ab348b06bd59561d5256da42ca6748b17cf99508605320d40e944ac112febe0041230894c80f1095c78d2dc69777229c1c78e59218c840a5472f8823f2daf29019c5d00e9634f3ee2236e5ea1e3e6ec2c47b9c3dde9328e7e3a1cc73de8b9a3ace8dc90269d9d221163e7715f21cdc3740be0e5a3ede80a20abbee592910134fd3b78d65f4efbc5155afe578836ab9f70f87500ef66843a4f019a2836e99c93a768d3ac37cb664fd2912c32e2887ac698792e8895a463cc7ce7491f4ffe78b2c8bc8a8a8a1f63e68936a39e53a667f81833cf72c6913d759cb9524f9ff57b764b455a06958c6e894a7345b8a03ea58ea51a954a9d62bc89e6de7d33aacdc3af3c82f99542327ea5911e7e650f8c9b50a7a78f5c7464e952bf1429b37c146b6401944592686ab159b0283bbdabdfb3ca7a8a8f0ea3de28148faeec81a9571ae99b255d29d4374b8a51398baa97354ddcbb96fab5fce39ece5aecf7cd496d07b0ee71fae5c1ba55952dbb0664e981440a999c252bdfe63bea9deaca552a655575287a47a67b44d5bdea44f6eede55d547f63ba4331bc587c37aa114424874dbb3ea230811114cd1d3510ce958ef8abddb954de9a743b3ec496654742fa39225655dd7550924937098444eefd3e93a4e1665459d4149f94c9f19237f6a22d6d352c88a9a2aba44a465cfa7232589226599902ce36a6654c461c64d8ecb8888529f42db106f58687b43cb6f6a88afd5e537346c6590af6d0cf18689a48d3044306c525a6e64e8299d54d9da103734c80dca185a9ead20869677dbe0106d6c6b9036e43733441bf27268f94e28a9e5b933b01340592489a450240e259174228bbe8e262599328914178fd4e9538f2b2b59c0a18b2e805d00693a6621872a4deb06650a8199aa89eeb8d33b9377fa388e5ee53a558e7274a2b473bd33d113f53cdb01ec288de5dd3b4f35279dd366d99651d93e9908126039d8333ef270ecd836cffbf4bccd48b5d18e09e0e7330e09667deafd4a653baeeb58dda1ce829a9da6b178ef988b718b60a4f95fc1184363e8b11a630c55b127b9abec9bb32c5fd5cb83457b1cce6c4d62e9e3c762190c6092ed09426b98d50b41cf6f7c44047fcb915bafac705d92325aa957ebe19e12880aef1776ce285a133a3ac4041f1f39f83b17516b8539c5b68120ebb3b6ced527788abe21e8a233bbc35334a87d2cd403e73bccb39cb58e320adee538cc4ff8e56281b42ecfaaaeae6b591a70b6c01ce07d0cc0d53de6a85647513629278ed275979fceceac48f89d54a284e52be79d77540a27d15f8ac453745507894f45b2233b3d7d0622e1cf295a12b5bc459b805726915488520b29b91089708ca476887190940d328bcb9d42c598fae928d6418a2493c8241cca95954bdf70291db0297e687d25d1955bb4fc42cbb750a47bae4b9ee0297abefb6637bb4f0a9e8285a7e8cc4a25d66bd5aa664f38942a9b159d7d4aa5a10c876bc0798d09203df796e6230ec370041aa8210634a842166fc899df224d1c0313285590830eaaa00552ce3c186fa411173d8f8a36367ab6b4d176c421a59fa79fb6c77c76970ed9dc0b30a4e98774006baae2a26afb917dde4533eba227aa52227128a514b6a2250d3e0e2b41a3e7dca1d19c6a72818b9667683950a437b4bcb40a459adc1055a7a2aaa355e5e1c641ef6376716a81c89e5fcd1237f7d297837b9755243d52542025f4e45071ea59f244f699ddb583eecca69fd99c2d973ca218d24f70dd721cceba009e3a52a1087768da05d0eb480523b4a0bb1a907f3cc94c6a40ac87438911e1904e91537a8bc2a1dc905c00de2d4a57036653e6b4f78c644d59917c562f9715654ff8c57d9f4e96753b303dbf194d1aba3af357b81487e240cec358eed56c4a52cda8b0dcf49b2571140976168ce5b459ac6b87c964fa76707cce4a507554caaedccb8fb21c67aeb81f14c461987ef1bc53f6b27bff3e1d8f8f268d87a44a7a61b11ecd8cc0b9b2740a274def220ecf779100e0eaf44c86e270a4231d3a0ec12149779ae6f2ccf50ee5a53eba7d38c0abec7d157e758c94670a9529fc62d4279dc2a1943c180e7a6a51a747b1504a85564971f699c57cf8b5b257f66a7a3d552f7307a67bd0af3e7f619ade7b8711e1d78a7d02a6a7e5272f1519c924a85f2e924a56a88a8419f57914cb8a7ef5cd88b3d6c5ddba38cba37be4d03b7db6a2ab1fb5583689da8181508f9185d52c3346ceed6833da02349ac22f22c498d82c8f9186006350428c89cd7221206da3a9ca8a26cdb173362bba952a0c641ba3c9e52cf57a2e495c958f301be11009d2a4c992664c0fbfbcff62445a1efb01e994cff32e3f1d2a45ae8e7aaaa21ee3ebe5f7a5e7b948da98ae9eab9ea69e5a12548c5f55cfc7782389a48df9f53c95375991b4213fb58835e6b47707a653f7de7995a3b83c173e6224dea0f06b07a657eed1cd6825ab48b0cff9d69444f28689322d8aa68dd10678a9b231ec6518d68217daa8bcd46d4addd4b0954186f2adba852186f26c05a217b53de83395b5f49b11d2bcea5708559622d52ba4e951729e36a38beabb6d464fc0f47cc732bda99a2a98f969a914ab02299214262273cd53d7b47cc45196006e47763322426f4659523785819826e6b0112a334676d6757aec2af8d57249a5884ce23083b27d21d2f0119b214acbf31822cd66948696d796005e498575986f50b61b4ecb471c661335b3094e6a198922f1cba57aeceed99615b18fcc0c8732db667bf8d501ac57b687772ab20ab7f2ac5e59efbb9b5d278950477d65596589a63d4a7ddb4030f5cbbaffb42620fdeaf19b51a6094046b27ce404ccbeb2ae9a1b1c4a1fa30dca76c4afec725bfd82ad8a71dacbddf39eddcde807ed15aca745e2f31cb6ae79246c5dd36e461b148e916730809bd1ac027832c924dc26936c01de2ca98bb2a12514e93c976771707befbe19f10b6bf90d8a4fc90aa68953008ac2af38b4a449cb1f4de926d2b7d4d3f26868072de85baaa2a5d7717cc4af2b8f34bf56984b87d69325693e59524bf6f99458e24a423b665dd9b9c69c2225f89a15e25aa209a29815654544bd65453e4ecc1809c58c91770589d242725c9f3e51c0532a1469d2f0917c0119e40f8745c800064d9a2dc9a4e1a3cd2889dc8c5ae6684a00238cb43dc01f294b72054598619e821894a83a4e810ba0ad254f66e60952da81f3d3a3735ebaf11b6434e23bb10413352c236a6e50a6c12ef388cd190e59662684999772ca3b80f218cf1c4881021ba2c84885226ca15937e0a4483ae5ac9d12407929611ef214a20cf16548e0f1abe6064ecd904c11323335376a40eeaae43e35ce86ac591a1ccee64f67bb0fd98566af2cb5f76ddee0707e39be7b46f06b4edaf3fbeefde3be1df21e1772cc9f212759d3c9e8a7b36d92664066b3a5e17138278d393d7e71b34055913014d182250a43584421226ed8d4bc6682900182860f610f30f6305e5c582c2a1468f2b82da3532835cc874383e1814df7033cd83a4d1704f5316050d315d2fc8ec278f1e272c14c37042e2d560bcb2a335d2934d31db299f8dd26df83a5ed21cff1072dcf11bb024c52f3bdf8eea5724e5703a29270a8844346017118b24c332a48668661a4f0eba29234a39aa092a0942060ce1cf65e2acc65840ec039307fa933074584129a31300d23c4b2370a35ebadeabaac2e2dff2f4c4b191e7e6b88a40de6a1e58b96304e64942f1812a64846796a98271ecc16b106ff9a5a06eb1725d47c1822790363e444dec04029923730474fe40d4c942da20d4c19620d7e0f44d63a8179a9324746ad316c1da6ca8831adf350a35b77d52b001e2d0f63246f6090a0c81b182947f20615246d9421daa07c001345dea018064af3d111a7be0f68799640cbc32065b748cdaf350936827562c88751899021ff45a589211fe5031829a8a0ededb2529a5d5041e7e13162b0c48001a3c278f162f5e2e545f5e272a55c2e2e2f5c5aad97168b8562b5b4b8b4b0b0642cabd5ca4ad5dc3aa84aa5585228d40ab5b2725a01c114d8f232ad6b2793c964fa9a638dd6bfcff34e5ed7993a8ef3b852c92b6ddbb669cd2d1c5ad6dc3a77fe70642d2f136bb45a9e26dad0cbd0967fcd2900e658a3253f136d5c247f3a2e97e1578cb275977a87b4bc9cf42cd92cf5462dde5726465f990b0355afabaf4c4b35e668f209c7602dd8b29ecc0aa6914f987fbcbefcf3c3af2bd80a2ee2301e0b03c8daf89765c51658a55512913d6c007f3469b847164d1a991463e2232b4699c4464a2bf8e97b5db7f21df13d48f7bbc9ef88cf226141617a574fffbec7781c5ea95a9be427122d573dab4844ad7b774c0520d55e92da3fafba78ac5cbba6b3627b68df6ce91bcbb65e7a67aa3d5c3fadbc050a6b18ea96ab4ef56e7d32c51addbf9fba7b3b4c413c4f3b1d67f6b82e2ffd7bb792faa9ba70685ff909f5d3bfeac2d1f5e099cd2968ec58bce114441bd84da6d368b3bac9deafe3777be5fd01454ff3cc8e62489b90b0beaa3e242b8a216db2dfa53cddc5c3f4f8687bac5cbb29c8dd013e72687af72e487f9dbd32055c77afdead91001fb5e3ccb862efd79866ef873a0ec71e286bb2aeecf226573ce78a3fa2dda17de53bba7b1fd2d326b004a7eab2d7c5f2cc56dd7454953dbdd2d3dfb7a3e52b2dff9000df69de5b5aea56ba575d3b56aefaca55ef22136084c21aac68790d89554bdba36a56521183f5d63dcfdead4dd7deaa916334fbdd7b90d6ee55f921b1b2f2d3bbae7ab7577e3c3ef0f143c2eb2edf216159b0d61ba4638c4c7abb0785353c6979ef1df5547545653724c05b1592965de199a5d2e587c476efddfc90881c6a362221bfe10094d7aedd28866caceeac207d79e64abdb2bffe74bef8ed38dda57de5a66ba60eacda4fd564ba57b583d5fbc9f4d5bb7216d70934995207ef5dab2ed44fd7baae7bfcea4dd91d2c7799bef2d46f7599ec8e95a71edf72f0a7ea3a3d75d3bb96ba3a4b55adde52bdb3acec1da2fa0f79517607eaaed33dd91d2b07bf77a90a1e554fffaa6cad824f55eda87a32ed088247b6f6aeeeccd62c10de8c80f2d9760350de47f66f55663b562dcf3fa9a97a42d7d580349c74bc8c2ec62a314908cfb681208bf587a18ccc67cc7c9c0378a3d1120c6e9eec993100eaf9243f56cca9a4e734d2f373cef9a9647ece1f7e4d2ba47414820378a74ffbcc2ae804124237dfcd1a7d4e48c8bb78c41efc68a51187f1d24a221cc6cb271c776874188f9845cdd135afd03e9310e9613132812693d98469a214a059c5fc296954f87527115779e1d7e5a490b234ff33378692f494b499c453947038894c9fd943e32cca84ba3803c62df5d8796fb1502714cb7a377e38bc7f2bf7222b0ad2d15954ba299e170589c3dbfa8b968ce1986f3d3d312daf3392f1e2c3c31931b6ca84fbcd84b221ecd3f16612559d403349ab582da11933ffe29ebd3b30ddf2148cc7647a35601745a7eb8eba230e6767c4f2ee62b15acfa0f08bab342a439a3444680954d0f35952368569886844486fe8f9ac0ad3d048ca9cf02b664182292d4fc7f3bc186fc813f2883c2130c68bb9f718eedb01deb3fce500dff2173513e2aeb25c890bb0bb27a469407c0f084adf79d42571386792ed85ea7d0afb24d3a71e7ee711cd3c9a31f35b8cbd1b38cfb2f72d7bc39e47322d8ff579c4b2301e47f16076b05c1eee7d5555ef7878a1fa9017316fbd6bd5e8bde5c2b135eb3c2d96edd1baea437a4877eca9ea8af556bd1a68c5ee56adb3eab56fc5540df860bd938f6248f3f8d0ba877cec211d3f9d2ebad5bdf0ceba14cdfafc70c86e55ef3135f68b7aadf5567ff1a3c5ea18d6bd56ddd8b1e3c752d51f2a95f5a1f57df198c74fe747eb31c76115cbde178fb14066bfb01d94d89d11bf3c14ab51a89007d983c3a4b34ba9c9ce83bd32503a7bd2d95fd87b2760cb729286a999f5666493779c793949df12d0eda0f47c0f27267d4b40eca4d61b768cf919f3e1bc0ff5725d91db05f5fc4abd21a8a2bfb3d4ebbdd572330bd62760b254c619d3b7ea13138ad9e1cb8b17ac9f4ea7ec749cc9aa5f59f9e9593dbdab0155d964e2f10ac05b022a451d381c66deb311cc22b2ecedd91290042a25e9d90467752d0b11186970224d29ad56abc53f5c2ebb6591b83c7e0788423d31d668dda51259d2b2373ceb24b80fefc20a8404513a6ed1310b1254d123a8d2a6b0766076eb3e54eaf9505b0f6be42f0a1dabb7ec6d7d751db15bb6c33c9728c4637520b35bb6a5c3b2adcbd64df7aa8b657768ed79add63f9a21200af560968a011cf5b4eaf71209c29c253e6403693dabd7c57a6cf09f8b657168dd7aeb60fc32ebfabe71987d553d0eb3b754d7e779f7520732337b9a5163cc242f9bd52c5b69333a7431ce52595858588e330f53eaba1054d1deb3ac4967432d968d1cb2b2cf96eed59717380c148b5aff1eb7ce5e1e3f9d0ae3f1bf99bda8cffbbe1e2c8f711ccee2044afaa5631627f8e98e697f31ce72afceb856596abdb26bf6ecdbcbbb9799b17ee751fd0badac8c07ebd959f6caae395ebc1e9582bc23da1390f5ec9eb52897d65933ce3a1939d212e2707a441cce24a75f4f2809bf5ead99e474fad6f2d35b4adf0eef996784c3d923b35e12eb1de170de039a403309873c2451a201e17018747d689d7946b8f5e90909451b1e6e8f7a46fa0777ebb3a7a7b3b72a0fb7d75302aa46bc242eac7a0ebf16ebc3b16d016cfdfbb605d07bf656f53ebb2501b7df4dc5e104656f49c05b02c2992b1f2ea387cf97864a4ea2e8e13e1c875b1389c3f0d4aaac7b15f5b57c2d1e78cfb33e6403f1a1750b55af6be54066a31e5d2b7687d6acfbd01a7594f521bb6855eba89a3aabaabceaa3c5f2487b5d3bb6ce56e1b3ea436b1f9eaad7e58557559767337b5bd687d6d94b4c389c16c86c1fec8cb20ae2703eacdb16db16e0dc11cee0fec1c3fb0c9b39d1b4002590d93dd86c88b67618199fa79f8e0ccba2c9d69887fa83da7a4b42252018afaee3f02be5702716457e22167d3a2f2f5aa6d9cf7745304d490831661e094e9c509a424f8e4e383ee108a5042433730dbc672f4fb161fd7bd6b13ed6c723fbabd7b5230addefa877191187a954ea5ba7ac8b87eaa9ab6ceaf351d3d981643fbef3ccd6f9ac0fad59a796ea9d55413b3d3b8f389cffb23841938e449fece157667966b7debad1eb3b4e373d1a73c01805251035bf4a42fc22ea212a0391a6e19c212cb240a55b8f5f0eef5df683f5186b0075f6cc6379deb3775ef511c590fee13dc61a990fad2f3b7e393c5b6ac221cb22f1097330ab7d01bcf3a88b108958725dac039925a14913738858126fc41b4b5c2cbb63ebccfa905ddc12126c627fefbe7ab3774b00b3f8ede0ce50ef50b4055462c2af56ebfbbef5f73d6ba16a3654cad11272f1e8ec9ef5a1b5e940a66946e157e9f3f3287b9f8eaa9746a3eed5fbc94e6a7d6643d9673321a66a005bbf99102bf6870473f93dfdb39f1f122d17ebc201f89e2b8e0e4f60450ebfcf5ed45b90707d8f3925261c339fc96ea9aeefe03f5b02ca842c5702e252f6f341e9a84ac193cc4a351be2700a65443d81be12137ecd9780660968bea1b3cf931e12f25df69b15652f5a656591a7e450bb44664225a0182334630948a86709a8a7260310e421124b820a1d3f4a20c944067118721366be6cc2af2b8124906442a33d6e53cbde75d83fed2e3552a25a762d593738d2c64a11d2068ed72fedddde6995c892276874a6017190f441fd4aa02aa4fce117f5e1faacee403d7b765426a53dd9159b5ac0023227dd12f2c609698389262c80816803e404451e7183776207080f91264ce39288bc0922a447ca13c41a7c2a445e518f515987515bfea2b2fca5aeeeaaaacb1adb453e94f6a67e021244ca26d2868cb47182682387106bf8c81bd992445a56b6d440c240ca157ca033db23f5ec7cd9c4934d64eab2a6b436a54cf6ca9724c7f0f4f0b462ef0764ac71baecf0f4a62145676fd074ee30a4c12f534993729351461a4fd0e8ac25851c8251d008d8e529c264d9337b79664720b3b3530ee9e3250523d564179ae5918dc963f6405875c4c28a2ba205a0a03c2f04943e4330cfa41bb1c6ac9991a1c1e1ec09529be03005f1080e34467ad6f987528cd2f032329306643da1c994be51a8a888065485651a38c34943e97bfed186fb7cacdbe3630d9043565516872f3cf9079de74d37b004e90ef5a12c90434a772695a697736e734e4abb3967c72d9873dac4ac053c00e59c32a924613de09d32671e95c1d29e167c01299b2942078e8c95076b29a5d5215313cf20188d704c75acbb3c54c6ec1956290fd6d16e740b20772197f0644dcf337bc67f3be6a5a5d2d93b4a594a1f413adbb0cb6b9b8def346a81ccce2c66e913a6031643b693b347ce4e39c462b03acc694517672626a59c9d94db66af945b1763b79d4a25d0244d53826cf26c8fd23dd3a7f3591ab0f495bc52c9eb50b5f47997df562a95b6d2572a59cff35eb291d24fe7a5d256a957afc4e1bda3262efb38eef44f8687f6f753e5e1c6f1dd47ecc29efefdc47ddec11edbca76f0db1efb3bf6e97c25abe2cb9b6c2c0de1364be59309878e0af9833dd436500787d88da822836197608cc29a363ea17300ef16897404914494302256894631caf6439b10c5c7097330d27e9ab54e32cd344ec22f25fcf2ce40cc8483b8090bf1d0765988b988370c246df081c6d051b4d0f1fc85f8e29889b4b145e42cc41b0e9236f87c056682159a38d962b8f215b0526d25489b569eadc89f302a85e9c4a6688c0a20ca061a87663b34bf44a4f91b134adfc04c8836740d540aadd2cc140ecd41cd5be55eaa774897b8ed6ed7b6cfed1404cdda4f0aba0873b123254a386267233e622420a6d9b0221c62d8151c83fd494721275d3324d3a4b14b7b43267d258d1dc38e74120c3b850388fd72122771d23432957015ec3c05fb994766cfac023bc288246d3b353adbbf8ac588c1347643ec4563adc61ee30bfc4535d635c6d2186ba5b16f12e35f2eaba9b140131cb21335cd37def8ceafe1e3700dbb5c568a9aedd8b7176983439768e3c3c97a945d6a8c31adfa226f68481b3230f266c68768438150de34c142d9bbf21307bac7cae9a58f6248af9c068bc60062c8072b0e19f259ea114a300564626c2285ea9512f613280578ca19d2ef6a5a73d6644fd434b534a2a49043282d0d613c3d8ec11e31ae5b0ce523a5747eab2942e581e10d566374328f284e78688d9d46186c0b1004cd6084d2974aa58c528ca39a76cf3b1a404927a53e5d46bd15d0446b8fd3e9f77ddf572aad7860b7812693e9f48b7dfb091bd2dee5c10700b0346a8b322bba248a2a752ff72770a6562f1a30c6a07ea3104bf56288ba0a2533532303c62350b5d384056466b4ade4994e9ed773764165ddf17a665ff2cad70d6845cdb687cce47dbc2458216d10f4446e7c1edd9c4229019824619a9213961cf5053b46212acc61260650b61418e1a464399999312a259d92a9f0f58e1afbf590bca40e63047b13e210dbde4d19b1df52b42939a1310cc328f33421a1dfea26346336a2c63ebf03700eb55bd08cc19ed9008c39f43935d8318c0a01d514d28cc19eb9328b833b934c881abb77e449619a9511af09bfe2139e00d4589093c640afa8b124a3be9e516318d0139e6086be5e94c632c95bd026b411f1eba690ba09bf5a8d797773d2580a69d2504a84d1e0107ba85501d9fea0ed11cd1ee210ab834607f052a2c6ce94c390434c68d61f34c8035a823d04a24c68308d944a5249cc1d932ecec82da421137ed3eab93ee1d108e773dcb0a7d7fcf91acaa56ba5edd8b743fb66ef76ad8706240377486fd6c583bf9d2d92ec9b7569e7bec131f3436a28eba0931c6bac8cbcac025e992b835d7ea68669349df21d1385e62481e4232c55318a6a481561a80aa4a9a2a60f41159c04dca6f04cec22bf14f005fc7a4a3c966aa96469974af1c3513a031af0f8e934e058f6ed9cb46d8cb461d8e664db360cc3b0ed19866ddbb6e36d7f564b471ad2130ea966c441e18eb8275c114704c349130e298c6795138251b9206c0a0c18fc03ded44f117e4554128a0a873a5a128ec759c4e364d9c7f98200198c0cc61187319e4c0151a8a4c7f87abc2a9e94240e298cdf8836f487d31f4e7f8071a37a475e140e1df0002620100109bcc0d1244b59912a62533f1ca67e52565c54524754ad28230e75ee49e197014eef257954bc2a5f0fbf7848011dc1468e10e25c50adfc9334294c17200cbb7b8d4c77c776ecd8b1c3c6c6c626890ffb6abef02bc0d71fcca7257d430c31c4103838383848b8b8b8b8b85c2e97104208214413a7f9eb02f8cc03f020ae253d71187bb70dbced05775e007b593d1edafb1a7bc3635ad293d0920e80cbdcc681388dfb7022ae7a8d23f11f7ee3f5310ee3d9990bed23c2af1a9f2abe1f7ee538fd6705bf78383d8eda2901e4a101bca6d61c070e1c55764dd58434229601b60c56cbe861eb1ec0ee21885f56f750d39e4c7b617b6771113c00efb2fa46e60600bf5bdfdcf8704120b0d5236fbde2cbbaf10b766aeb542a068cece5f20760f7097c2529e73cf66e9d731a7bb728ec053be72f7bc11ff6b23ae702b0a81f1ff66e1b1436001cb0413c6107b0015b84bde08ebd2c560f6befed0d9bfb0b0dd82bd3dc0960839cb0353668c63360efd6330e007b370cd80bf68ccb5cc05e56cf00329d1e95d4ba05ec65b5e940d8cbaa80a5612f4801eb43110f4b84bd9b0e7bc16e1dc05e56b75ee327e6492071c35e10a6b68d612fab00164698d99218409d4aa93ce117004eaf19f10bc6e93528fc0ac0e9b5237ec99c5e8bc2af204eaf21f18b88d36b57f0ab9e5ea3d78eb046af29e1178dd31ba7d798b016c42f204eaf35e1d7cce935217ed938bd36c42f1f8c7864235808c3ece5a2cb95870a72981dac9163662af600600fa26297397f3a443cc2380ec74fc7871af1d3a9a1a2a1baf1188f9f4e8cfaacee78fdc3e3a7f383012c65c0e397830100a80c8543ec32d86360ff4149635761a751b1dfc05e033b10d86d1035761f2a7618d8892855cb4738c4ce53967856578ca8978b62ea85b971285ec9e54ca05e7ed192606e1c8a37f54aaf07194dd4cb475c2e38448ed8d42b77d4cb448438820bbaec6400f56e12a8b7eb69fa08d4db19697a08d4db09353d13f576474dff807a3d234def807abd251ebf0654ba0403ea02aeaa336ce55855e2a5fa84aaef4e6f7647d50b68614f0155894aab70d8d35910bf94383dd764e3d1f2ec2dcf2c10d92d578005c24a581a1053a2521eee96e7687937e98e6aa7b763f5aa1a2b61e7b2205bdd5165f31ad1a56f7726ebb82cbb5a73f687bcd863ed81d99d99eca5a1ce5e1a406665b310874cc4217d071271d6b74ac45bea00eefd5080a34e31ccde9577d8576a0ef072411cd7845f3baa6ee184b8a016f01877ec9cc52c4f0e96b7f060a119432fd4d12c7ca434f6d28b7611c388451a4a85461beef11cc771d8cdb90bb1042a7db920a01e8e885f310a4b40a2e11cce89098ab44bc72c7caa74373daefb4d7753bb731df7cede9873d7113be6f23b82fb8c73510a885f9ca5dfe1eabaae036b609df665de31100437212a0b719f5181cc9ef198ea43eb199687ae6bc66377df5c332c0eadb9db2b2ff6e1e05cd9eb575d19c675da89c78ef3c81ec2d4970b2a652d85433ae52843c2be75338e5521867042db684fc0b6390e77f10978b9a0e6a0f06bdb68eb31ae24adb46ca84c1af008b80f8f932601cf91801a630c022a48e33f3c7ce93b02b33ebaf7f01e7bc73bcec33e1c43bc1ba20271f9e5c0b9cdf9d3f16658d78cfbd0ba0a61af6b86dda1f58c03993dc3deab3eb4eee63e64171d736c881a9b466555206ce4b0c66d2c43e1707b4c6f37dd7d689d591f5a6307321bb3981520451de0776b97247ec17641e297d52e2803fc6e47fc82ed62b5cb88df1a997ed1f90dfb05c7effb25c72fd82f2f94cacbcd0b9c170478817af1c834a8a41943696a1e9986c6c65fdfe9230760c6e60278649ad4cf8ca18f1104001e59e691ffc8b5d6cb1f807d7bd4cf101fe207b0771be249d80b0e7124503f4d8f02da6e007bb7ed47d80b6e1702a8e929152184784a88e710e23e08711c17e23a322dc48b10e246d85b5334696415bd9d00f66edb718ab6df14353d2a09e726e2dc062a29e21c085452c4390d5452dfdcc6deede631a99f9bcf48fda4806ca8cd397b5936cfaccd31fbeede51e751af114d806f1f8f1de728bd7dfb72ec3890d92ce5d3f9e1f3c00cc3aed761ffa1c6bedf0b50817073ffe19dead3f9e1874a5bc5c3bde3aa2fc78e1d76e390cb8e59ae09c7d0bbb0f370cc724162005547e9b0574813e01d7fdc154638a4c728866118f6559165c7308c7b562dd643053b837784a180aa21a34cc3456c84eacb4537c7e114130e2917ad6afc70a9044c05a58038a46cc4451c0ae1227e42ef0929c28870480578534061ea590a28c505a56a3c87bda00f960a0e7baf636fd845502a9179e082b61680a7cf28a228cfca22ad2f1764f3ab8026c055a209606ff77dc64bd5bb33d7882fc7d69ce582ba689d9e52699d5ed302cca947e49ceb9ebd2b55aceecc34d6f5f2918bb37d00446c19cb4ad575473dac72dd611e564bddc596c6387aae09123785696e8ab8217ec52c7cb8274dcf5dee72529ae66c1946a9f0ebf21537f583f9f0ebf2533f4cabf08b9b62449a6255344d0115699d022a8d01e420202325479e70b87dfb8cdf1450d377196b087b99081b89361c12620d7adad20282776b193d5c4676d3451a80fc2161fa8df865b44a9119838f87e9379e7596e3613af63de3275fedb27aa3623e1cd2df545a2552e10a4afaa6c6eee8d9c8326d02ce78150e29150ec100cef88af604b4b117a6b70b61af3cd2db7138461a261263b657d1db6becdd1ac6761a7bc18671456f7fd9cb6a18e78cb8a04903de023166fb7601d8bb4de9ed33f682557a7b00ec65758cc7b83d087b59db01602fb85dc6deadff18698a8831db1f63c3dead63be02c25eb0635e830ba2612fab63fe83bd2c1feafb72419313f262eca52d0630b4e790d2cfa8f10a7eb59cf6507fb08cfa43d2c3d4abe2c1d6cbb5fea0af172646bd710846bd31ca8b7ae54bbdf288ab5eef8aa677a99789f4e5827e4816f6ad85a53ea1eaed5a12bf28fdb652a550760a6f9e8a3e324d154d572812f0f153e52cc18ec3fcc32f2bf8753add6ae991693a271c437f25942bae3872448912264c64932672480e3517447459742491e86512bda497559826e65026d2b4643ba293757d8fed311b3eafc872da66333a84938643428ca177c2360590c342d32de482628d0bce22e0b9204a25c6d07341acbb51ca6a1ab920ac2f1774446653550a1ed252c8211e1685178a848688848a384952e40a254e84848666523cfcd290691b69837fe8410611305a5ec6af4b4e4b3d0e6903558052d733339d62a2af7ea5d015fcda992962a448c8a1956266c7eaa9a7be4ad9c81b0310216f1090236f168043de38a000f22602d2065f65632262c5462c9a411b852c9a513780bc994044800322c045f35356506961daa2b90bcd6038aa4618efa1beb88cfa7298ea3a0f55755b4faf15fcabcb6384e7d3904ec89b2042e4eaa624791e9f2ae4cfcaf6d4d45fd4d55bee52593186b7d4a887fc42d9bbf2283a7352851016b106ffd81e2bcf2eadb0e20691077209932a83b0283911523941c93ba451aa8b7af615952905a46537630d53ecb0e401b0d2189a4ea6ac489122456666663a0355f252c821185d194151c4aaccd9e42f8ba593d3c92863c97483b48f204de712187b41f7d2f9d818c01ba9b89c2f845fa79b545d80da59e72940c62216a3267d82bc46fbb2167b7574cb5575a3e2f4f2fdcac45454a95d36f4dace4cdf1e2cc7aebaf63b33d3da595fd52b6f4d2f7962a6b3b370c0d6ce0cc80231242f33ad56b66dc778609abd2c5f3d084f543cf89dc55523b531d6f87baef4913f57dea019a985070b23a3e38b9ef1bb0af275f46aeb7f97aa4fd474fc2b679f8e1087cc44e12f0ba54e5361ac3cdcd1ba78c4878f0fb118646e33ecddc01e64c4570c70d2c0fc6e323c0ef94a748ff81d1abdfaea3cd4d5ea4168afceabf7602f6b7519f682abc3d8da721e1eeba5d1f1d7e5190f262cb260d4110c1db1d0620eddb167312e4079ed8c6975be8bdf0eed2b1b39543dd61ac3157f67fa7b0ef0df573eebca5155b6aabaa2c501fefbf7d8a8d35e3dd6167b6974fcaa625ae50f473c0b8c6b75a6585fa9f1d98b83f5eecc740cd659bac390de0bd6cc766271adaefaea5e7561571dfbe6fa8bba2179d1b4d872adee78cd625f70b8a5bae2ad184086c1094e550813a9aa9f5c54ae550b54c76a645169516b9939006fa4d2423848b76dacb33e3f245cbec2beaa3de28ae5aab86261adec8dabb75ce5f2557579ac2e5608c730f7adc506e1905b59c8a00cf11213c2e10e144e70c8372212919c80a22606119242004fbf914a107ea9b0158a051559885facf3e3dd504f09f16b889db06c102c0cd1c68f5956962d66ef93a002dce890c6a28d16c96623c7784fb110152460bdc7cd3289433ead17ec5b73cef2b8829297aa4b7bccd930211ca404a0133186bf448c99f6b26234eaa4984356a4e0211956676084c6130e99897018d9c7720f8791ca247e41a12f002ff7700ffb6c48b6cdf2cf8cd14a25233a2904b08ba7e199bc78ef53674e1a21b0444bf9e160263c1a3b33aee6aa8b2d0e1d59da02af52a864cc14c6b11e660a0d4100000000e313002030140c8784a2e17834a289c2a80314800d92b058705c1d87414c21840c32860000000000000008804043327e1ec9303fa8bfa9b0a931c8236064cb356f734403561f4ca1ba56ef05c5af72a66057f8b12782da56cbc92ce8e9ebcc891c1fa82d9b74f69bf6801db3eb0b9414298fee200331321eee4071f81c6836c79955701a387bd1a13cd8106bb8750b58e4405afce2d4e10bd3f4c8d57fd80f96fde677fe61a1588117d1521c1eb83cb614da9aebfa8b344ad194d353f63a976705b34d43850dd07c9733d0a35eaa7396a8cf00f95c7d8861632d038e12e122811deec8eb58d06e924e8d55a32fa1f02a55fc7bb5f42156a0a83edefb84d6c0528e82951acc98a7bacdb9e4c27986f323e299b0fea5722228d97059bc422b72008985fc30b04af39fa427a1b8c4e2750d6900c5512324b1a25b91d715aefdcc612e3ed7d90906feee4c1271d6df544721ecb914c9d1676d7f7db7e14bc6e43223d41457c014e566a63a61b3aa96b4f1096099bbf4a35ca3f038960f8cbe7241114d344138f91c18537a22535aae5569fefb6016fe227c2073025eefad3a7cf4b698b976d6a4d6402c6b078a62d6c3efb21bca4591686515b7538e3400c59a228955b5a9180d933a31c3039ebd12255bcdd1fa754a545a225be565f722ca1358a8bef8f4b301c98233cd7e6d39b0a4fbb4eb9e274aa9d3e3e2503e80f893c5ccde7afd0c3386ed1665a057ad3790c792985267ba4723f8b62cc8e72dfe454fb1da6ef07b25de208e777366ebbbe39fbba7a8001095629e3ccc76a41e6588f99bc534085710f17ff2e29fa4c92493dcd9d7b73e1f8dc8a8b18aa3fec41ef22b4de45fb6b4fe15d681191f35ac73915bd427c71301c35e8ddb6efc79e6c13024f51cf00b9c7b3fe960770cc2700885c111b1b6c5c1d17bd162b012050abbf2fbabb4a996bee065f1052c70d5c3094d60ac5d7bfcf53fbc309f92cca70786df1b818f5b933a1f34f5cba7881731a2015110cac3b7adf0ae484c76143266b52beba5eff413ef36e514d8060a4b084b49da38309d828693364c3a8410db4ab35a71e5808d06c1de6117ac92a8e6c8a19757bb4ef90e35cefb44c509491ed352ebaf5619804b994eaee23405779b0e09e113b339900e6ba9a0e8bf34a9bb18c6141d5b4e5714aedbb40c2841027ea35f10ada174f2a4fae31cbbb77964f5c765840815227060329fb8692dd50b1fec2e48c96f4e4ed564337229ccc4d3d20018f9aaa6e368f72128f38bb9c942354a930a71e395eb30b61836cb575d96c87f6e55561914b0130e299bbe32a3277b4d8fe2de60eeca0456ce23225cd6ab3cae52ee4537bd09be8cd17ab0a4543266b1e29aa2fca416c5bfa87bc51a1031dd725bc888fd6844a241c095f4d45e3e9afc34b4d1e421999591b6c207c8a7fa4ab45186d991e5e97b352e50a4121ebfcc07a7eac0a7834461060e1f42fef095e66f5e1b230a2e7da787284fba87f7f80314e43cb7297455c9b8b0c85f9d3bcad2b4914ece578f4eff6b89824b232821bb33b5311d351a0dcba878b380c967ce3aa09a17dea25ff255be0d7817908e12cbc8ab93988f2ec0c0428b31648d394100e825cdb701eacc64fe2a152acc264ec532b78365135b61de8a7796503060df39f8598149c9a728fd22c3d109b5b5c37b46c05e36cc6afc1a358bb144f16a487b8aebb83c3510244c2ca8ff9a7298393eabf618b9035bb62496a582d1ab6951116261739205ecd5f0164e03e4d7f38cfcec7e833df7ed9c204504f87ac5e474739f50315f4881297b77ddef31e79d3c28ffcb6487f0c2f466d887cae3c39c94def75f0a4d59966472fe118ebf9898f34aba6e3854efa6e3ff4b37fa406af139a2b7132fd734bec1e6ff65e7e27134de586a9f635a8a03c4c323db8e936af614c9b2921b9d9f4a0a581c6c67819e3097545cefd28564b225201112212c0b6c7023cd40c69bc29d817d2cec98d218c859d85a1ec14fd8aa73d696253baba1d9f0bcc21bb5dccaab8a0845c6c5e46a15caba233ede06a9ac922722b2f2314e616c7110c728c4fed501025805fbe5f0571002ce024591be39e7baf8dfa7df85d7e4fc767fbbfb3d0c1c974efddfe9e6dc8bc5b8b79b7bc1f570302c0dfec8448529015d5afdc6693f99b9e0e925306606cdfd203ef7043bea42ef1a7f8cdd758eddaed0dc6d3c52513c4b9763bc4577e0f873f85084227fc18439ba299a45cb3bc2b036345a79f373ec30ecac8f9223f48e45ac20492b32fd3e508c9c5a3e281a1600557b7529907607a7a4585683d21f20fddfba56bd7ba2adbef0fa5b92fd86c00ef099282379760963e235582cb93961bc6f7fe8e5120614c909a3a1878e0cc63801a567cc1a75eb370741233d058b8affd078d44529c28ff8e218b585dbd415a1db77c6ac3308f9fc9d01194bf120218659a111be60d607649298a43c919987902ab374db3262409f59c2d8207d7e9038ddad4ce52ff88c69a1daa5a5af2d28e8091ae62202c8af50d8d8569df4e8a96d036d06d91da331af91e258eedc91714c1f78cfeae11404a99dbb20b876732dd540972204d60463b4cae72a8616f44eed5e4f24bdc0141c7697bc5d8c91a22200a3afdf5e2f661b26f80a10af7074767de9f21b80feab7c5e2f36826be86948ccb21accba308c9d78e52bad81cfcccf3540f9a07920ea0cdfb743f63dc3e5550b0bece01d1d20f80676380bfc86334c5c9d39b22d6aeb316387d137e32cf67e83b6fbe381959b002c64b930411b710aed8a44f558be2cbd4b10250a8cb395c2ca8f0642ff0c090e51e04f6154c86166cf2bb62d501914f074f198ef9f44d8a213386f641978c34dfaf17d854bd0528faf8ea0982fed0aee8d584278e033e4f6ac3c0c33853dbc087043e72f0316b0f680550b7b0f75b787963e46ba3a7fdc2e99cb4fdf3f74b221584ac44cab8df73b9b4075184e1cd7075db5cf1d83cea7848964d3d640cb57556c24f88816625f9fd763e756fea91a6d57884c308df3aacc5833df181bc8e7d54f25e552824ab7e755e517f9fe43c7764973bddee5609bc911200dbfa6dd4401674a3c35cd5f41af45dc5829a0b095fc0cb7ea3901807e52977e49dce27822d9ca00c269cd760cedc55f499846d14b1bb51910f14f1cd8a52cf2f515daccbb81e82334fbf57894b1bf894b5c20d6d065cddb0640b25c69a6c37cc40a2c7c239cabab254747889c14b6dc27e9826734b9a2fc9579eb8dd8988474f946b9fb06e803618deeecc5087ce61e64a7659ddebef0ed33bbf58947a42c55b3fc567142e366447f89fc5f50e4d616b5c7d9ac12cd4fd0a88396955d48c195f8bfb3e02eb97b6ee9fef83a74e2acdaaabecd48dca17b871c23d1e250c4538bf6f3de26c10af61187b1de5aca57443deca602a86635a2789954d9824a5e3b25bcc13967439789a1a408bd2e6acb72949a8daa78f757a306165c0c06851b64e2723bce61d4a1f5a279a07cc190b5622b59ff8e61818a4839d74096e72ca3f066a3c853e82316df389497eb443f6ce200a289bc7ff7871beca9ad2dee39ca2853113042533d47bbebaa5f54240065ed945416f4dc2c4c44b95fd8851384613ed8152436e297d6f30e1ecfc7f192935c1f0d3f833850dac67740212d618f84584c1c8eebcec1b179ec7423abb65cfa4eff8730736dbb3e822901e2d47eb57ef5d7a636de0d9008387a1b2ce0f94b67001869985e66303926771ecfdfa16723e5ebee95c384e2373ff1a1de6b00d78ac149136f5a879d9d62f2cac273498f6346baab60b3c15857a9b422c7c07ba4039ea9a209c8928c53be266cbbf04cdec781ceb6b9ddbcb374907f1f9d652c049cea5e447f8072610a48c15268eed001dee4e89acd7e0fa40f600dfc26d4de085304e50a2dc5f43802bd0c675c22a1140c0ebc60a86148f21526926a0398315485b044289dcb81ab8b76b6a8107e73a5e5a031275b9b46e7dbb4e20d810da0d963dad51634c039c5dfe055ef1c96379a2c28a5e4069a518f4f8b75b67935110b53df0203fab067bb939fc70dccac1f0e7a5d5b047b0dc7f8c60f109d9c3c0e92752b546c5412d58ca3a65f27fc3d5dcec6ced16cda627d4fab2df2284cd20ce715c0c729c69e7173a01ac105f420eacaf844e2390d16fd773ea041c8c63ec507b8787d37f6caa55a6341699de9f29371ec6ceddccf1c95939d6b2c9d5ad1259022d20b6cd0c79e4c1c0422f25ea2e8a8f206226c3311ba0c1d62d16f0f3bc6b21f6380f1b2493a11aeb5811c7fc71b13973f3434aacc8c4be0bfc371121361971139b1209c1d78a3a28e20dc8731d4f8a1886a230f14e060e209a7918dd35d40996f271260dccaa1bfded4e022818fe1ce6da61ab630343441e5f48626ac51fdd7d0c44636f4d3fde2ce95116e569a50d30e4ba4667009160b464de039bf309d36f9bdc85d5935c18ac3ded8a00d5e1f2f1d5b6cd28d6ad7d70c58d496552024c863ed3026df07a90928bab7a6003361743b35fcd2094731e186f4f2520edae9faa218e24d4ed047bf2ce123a8ccc090dfe16d2cebcf2b68a277228d28ceb4995556bdf08ff62d0075a0db655fd70359ba70ba8667f1ca137d0977025ace9ad7255e70fa26de041242acc50396b168e066387d4d71937628c4ecdd03ba36308fac4b45f8783bdb481a20149e4562654ef2df413a8c9f14209a142ff27d5911d3f3d19143427d1ca341e01b5996c768754b8d41cb6f1393408827c05efed231b165092bc17fbbb325831886c0996d76c11f00888e607c3aa0114abc05626a10a100bd5df409da47daa416469539d672820e70ae33a0d50ada635bf7c0eb2298fa433b5de2e0c9d88804b9a24d206521af0218c2c72b39de8a9a1196b2ba435736f1107dadde430c52a05303f4c8f9eb9731e17928d8ddd00c3e975d2f53c0cc9d0461e4e81f394ed22187e9bc479c68c95c64402bd36dd996d2ab672b67dba52145a5b1caa79941326320e2a0fb6af1695ae8eb68c6e03168e55f4fb35c62792e8a18525af7e72d02cf9dbc59358499ae86f3bee68a42c6f849bb41d0d1c22c47a0ec8c35fec817f36783b7dda52641c129ebd095b3995f6c7892050783ad55b59e079856086f16ae18850935958922ab5890e59c0ee5cae508fd1f2186f4c61845b5ec09cafbc330152807c6018ae6c1941104246782b67cb2a66f072cf6e652838f542a10843c2ed10f7e884544dae3b31e8582a0d113c169510414119cde1b22de7da5b341b8447aaa59a1689311626551a657d5171091508b85781afbda7ed93a686d75fe42dd0e86f71a088af28ba680e901e82d400940d52fdca36ed411290b5acdf642df93e5cecef133b05117c2aac6bba412bbdb45be034342a91d96e4c121efc4e6bdb33e8c7aee5c45a898192a74ac63cf15db2f3d39ea30bb04ff378a7f47c7a0c863ac708ab70441a14c12565ea39da7a15b046b52123507a0f650463eb0b9993358964f6a7199d93e14b6c27ecdc9112d53209109e10b04740b38d0c88e04f38487b54675ea564467d417cca8b437f88485ebcf3d7ebf0d499431022124f9438ea47be6a8d37207877337caa011793017277bcbf223420147823fa17641345cb8669e42f7dd8551ad9f26081eaed2b93062af9a8dffcbd638fbb49b311cd937634338d6f841e1c3e5bd76fc03fd1b07c07187ea5f77e8c9076b3a2310bf3341028187d56750027174a41b1735a4a3787521abb7a469aac894ebdfee0ace8bbdbaedccb5d3519fe6df5d40cc242067e4c46c31de163f8f21a6819b0313302ceecbf1dd23453b596dc3b12d61eb8d4b87132fc730e3374adabf0ac7fbeb6f306f373e9935167e34da61f7e4640d0e5f3716094f34dc145b6c3f5a8df5eb7e5fd2b27cb1318427e7f6eb7aaaa0372445d51a9b102ab613facf8c4ae8f185db395d7bea2f28ebc089d6c3a67a68af4b64ec8a9e408c792c45ed04e8168f5385a0637a9de1ba8fb45b34edb53992615f8ad368434c7211953a5c735f87b037a3b4ead4495c86bc10d2c3619342325683a0a2c3b2a218022d3cf3dc6c6e1f3c6219ad47a6f67835d6766b99cbf44dbf146d02072adc217cf266cec00cbaa8c368e6d3cc1e96e49547382eef1ed8507863f1b2acf2a608f345ac0ffd181e1690375b9648cc8d8f749de372e8925b5acc6b15d2045ab3ca73212a625449886b100e55ee99e17fea4be537b795a4bf13fb9b7a8e18da7f14b7ffe8a29809a52a23b079a8ef19be33b08b2b6320c44eb5801fbb8c5f66b5c286062f1267a1c2eba785ae0104ae76dc1aad2a0daaf042ea8dd3731ae3e6057168b5fc0fdd6f6edbc6d6f0dad9d5053f39ed2df6ad9d3085ed4b585d612f2aa1fad2f139ded75087a14b2166db07449aa510eb049c303e31d41166ccc04a813c080d8534ab7f62217dcd5582c6a107091684bfdb0c668198c81ff71a3e1dc01cba9e156cc67a0a71fe0f8003ca39496f4bf24d5dc1fc77994510e27fb0cb138bc08a2bd80776f2323d48c5b0348c0aaae106e708921890246aed56f9f9b11d23f11a46bb9b2799258145dd226b58f05328838dabb26e10b764a99d4a77ac241b5fd4380e8f527531b88004061b3be21226a7607f0b9d541d3a2d55e43a8e6d5e3fc12f97e1972f232245a0a4610abbc03ca0d2256130e2928f4673ea92c996c5e9668cb53dd8c2d8aed9efda66dad11a113aa48c43e5e42f403e1c7b669082d6729437e3d8f1c71a7e5f729952809970bf1920322ebdd09db06dcb9d6cbf36eecdc0a65cbaa43a2df9847d90337f946da98516ade70ecaa1e9fd25bd7d21475fb978cfc05f14308d37c3a0a109995f46cba45b045b385c5bbfff2aa978a3f0fe6a28b839b47251eaa86586a75819e9a8807edb409363e6578ca9766259b228cb0c15a43f9d4d7bf6b5b9cd5d4284cc2d48cfd9d90e4b8e45697bdccc59846e251cdb371f1818093093612c7bd09ab251229b00f933a255ea09ee4b2bd7844a186ccb602980c17568439aa58a255b1144d683a9ae866b09db4c5c38fefff38909ae856871f6ee153c90c323d1edf1df9a527ab95a6d60ea845390bd0f6a4fb04f18742a249a2b56aab34e6520e4b4e503d873c00297cd785d9d0cb1b0e8e614d8020cb5e332c7358c81be1d10690d66fd7987950a67b5cf97c9850f41527dc55dbc213e76c4feddfa910e4032bbcc7e15bbe2757e1c5ab9aae248709d235c1a7eb762a10b3b1153f9c70c2d893ba9e276105bd841caf0e02511bf4ff4acf7438caa502e9107a3f7a668f47367988d2c29b43146044a60c79c89c3efc4d9a338fb6d8af22287743409c0d81687c52101b9aea00faf4cf3b293032d8e1f543e659a0e949e9e063c8fc923a139b1c007d1b905751ba0d93c879e28f9021fbfce16b4a74e02c6e225e208278b72f4c386b463043bde1ce3920da60b3d156f0d6e6309b3d4aaf689908b66194591eb9e3bb8c02fbdfa5858a9323dcb84c0777198ed4721258391b7fefb2de365596f8ac3b118212749c3bd94cc72d7eb5ebf39d598726fef907c0b50572a88f0db1f7eae2e39aff376597497da0f14dc9692ee56adac4137261d95446073ede4db3c6a03da63b3904f7f52968dee5d972231fe616e306568b90dd9a698f06d3045138406b74f3e5d633cfab60a64e8bec82513ad106b24af9ea7f5225f181b361d54244dd21aa043cca1c83e576be8cd9bd1be36a0ed083015c58b9ca08075120b62ca94e53044da5d67d73145d5fb8178af01de79e9379486ee188521ff364c06f74fed610583ac4a9bf1487257874cc148620f78192236736be486811adf09854dec1f5d7a0bd959f9bc61fc8b0496cd08c23201765281590556f11ab397bf87fcda1604ae39d9e4174ac8b5eb34b0fe2fc4e8f61218b253a6d77fe48a567245c6f345c30ad513e2c5fd2435442313eada5991ed8763e793caf25d7a9f6d15758185ce634abff712e2126d29f9fa9fab40940219f24d4b1d23bc3e5fc7a08da520bf04591c1eb65f84a73c68b9cd1781058afc34f7ee4bafa3496264ee6b632a4c08fc412610ba1a72ec7c016a2c0974eda462c662ed3ead4a1c09bb27e40c0784dfb4045e13032de6ae495bdeb80ad27fd6708cff94d1ffb6732ebcb4bd20db2f3092ad1529083e1d84670ac2394903fa93fccbfeeac2c1dd0068ed9e512ce998887acf0c0dbd732929b1dc50177b3daaaa111a3eb3c007eb80a5a68d9342a219473bef036fff36dfb54ee3f486119034f0e4e12fd2084c794820b37d8ecf9b3e13ef9b4857c0ab2ba8f32030be266ab1ae031ccfaec71ea3808eec43ff9959e6320048dec2533481f021fb94e991e944110a5b340a81e3c7cf9c4870447c15f82711a80582637fcf9e86e39d14551c6749ae5c7ebc11fcc18c41e8a2c692e90269ce08e31149e5e51d42da27604441828e3cb4aaebfebc442feb5e82f885e75896067774abad52f8516444b960d8232161695f38c6663e6aaf0a552a11570bdc0d9dda99d61e554b1e03c74859826102e7db00c78a2fda8ea3434adcd6f1c7c7af55c1582ded020251752a5709f089ec1aac0f01c1d87ef581f805612722cc100e39348899ad06bc7d4cbd1d82113be3e5ae96f7c17417943adc3112eb43d0e4dc94ca34c46efdd8a3ca53c579ad152daaadcd2fdac6cd9d62844759283529738abc0a8e9bc92bb81f3f7a1f9855bb5a1aac4e8b9fa3090ba7a32394709fb821b37400e2fb9c1242063c7bce5cac86938009947a92705e6eb6368daea22f2782ac1c724eda72a4c94b92275e27221cca9114df8400899b0d8e0b048d77da692b2728ebf176342af86b2cf8c1b39064413b06070136a7df0ab17efba4b07d5d8cb3d62ea3d1eadfb887a64bfc97646fb3c9b8fb6da54954f8fc8a9b29f5c62cc685a3a90ba4090457086071023c7ca8584ad430a8c755e1b60ca8ce36a84ef1dc182675d23a677cc57f9d07cd74961f13339140337304aa2250cb2dc86b81d9d6fcb67128aa80f0be4e772fe4bef5464d73c4ae058122d3b90c9da6efa56e12061582af8c55060761bfbca97a7e6840dce3caaa0d82b08327d52cef69645c0f3b9c14f37a13648fd58a2d35ed49ee724b1580919044629119e6cf871e97ff18f15e242034c07fc8686babf4855943f1881fdeba9c58c1aad0b5e5b767142fcec72c3195668ca9c5a7bfbfdf55b8c03e777dee6e69753895fd90ea95deed03752abe95180385d22d5e97e0ba2e30d48f033e5c41ef08569b39668175d0451cf8c507ac7a53688cdf82aa971f736d77f3853c6db3a476d4f895d1d73750bd53394074dafc5ec5095bd528eb0b650b22b12101adbf2661e96350d0092322e468d94fb40285e5471a0e51a2e5109086b1e8a7f134c97ac0194a73245ad104ac9d8a8bee55a0b79ce9d550b8d27101c3256d51fd83a5a245a9bd908b97850f2ae31ef6c800dc7524d3973204be3876096a121cd6b91c87560cea005a2a9840dbac882e560da107cbf2a7e44faa02520aa6d733b645a7ace6644815720e8162617c640a00f4a025a4427c82240d7075942fc34fa63b72ce749df3c6cdb46f41f699f2b027625ac36e1c32a14e71eb7277b4981dccc461c9ed535ebd8942e194e23e5ef5c76b9c8291fcf033514719ab8da0fdff4b88ea1e9409434383803185e32921d61352fe833bf1d99f33875bda59e3e0d0ec680d75e59f4e17858a331954acb76dd6115853cf2b54056d194a2f2e6be6cb0e1a9efce24e5b8b01e0b26a46b45cdb04ad13b24871c5992e44671067bd0bf7de1026d0c91252c89bf66030d83c9736c0a1a831952016e4958eb08f58e2b79458fed216789319d25256063232d333015f825f782ba1877bd319756d049ea015502620e7a486db1ac254003a1dad0320832b92830db9cdbc197bafac222188208339d89239e557e702100843ce0e2d9663c68b1414504535027484d6002661754f552621be0b4837300924619a33bb87f8ac419ea2761b0d5020db2ad0f574c40c43a58753305b068e1fbbdf61dab8938f28b82df65ee10e75ba0fdf5fc3bbfd50eb39d85a94b2501c85c8a90fd81c109c14fe1e2e63e117429031cb2406368c73041498ba2e458f8cb6dcd11261c05e4f9bf6d28e7c10733440714c34b858b3dd5010ad31bc34b15d622957aebed86213643beb33aa5691709aa0c6a3519ee59fb73c4457959b68aa6510f83df7a3a3730e2878f1e79b8fea3343d353905c427353b4a531a61a0946e8801f8b3b1a47c750c9057718231c1d654120e0b4ff0ee1dd77e6fd8462be72ba300363123558e6eafa4d38a4caae22b811cac72b8a26cdb84ee7d951ff7764b2b3f7a21700102b23c02d41c13e7637039f5db6b1ae85525d9e2458cbce603a7a9461654dae6954104b4e0b9de72e69607ed684b380d2835336b9a11c51c8f02dd9ae34d0f9283355b3fc871d775d526843ba589bc3fc5dfd356944cb16d9804c1a068d587b7e1294c4ebc2e944c84e0ab873eb9af26c32a75900e6c63c1f5649e9af331b73c1b0b59356c22e84a16733f80a4727cbe6a93782a71da5fe299897104ea8cfa4cb6939419247906ac585951c025b286ce24fb915d5f93e6ac1721ad0a1d3873521a2b0d35f5f82e618f50be5002936528064bdd9d3bac8595330726894547a9e253e664ec150df869310974c634d2703da8895933f06eadd89995903158b7792b5949edfccb85b57fdf04e464921252c7ba2187d9723588ded54ca18302cebd0e500b05ff33848ec9e60dad76c77f2a3dd8982754c5ddf662b45bf90792d3441d69dd863d4b5ff67da9d4c54ade52d87e87fd038f3fc8ecddd89d8dd9daca69ffca0800aaca8a23e0a7797d8434e02ddee84095fbae0383698a6a9c34bc81391e645860179428c7e3ca16fa707e1536fecdaf1e4cd1a3329a7780eedfd78e281e671d008557eb42015cbbf2a1bfc3c7a5f67306842cd265c1982918903aacfbdb1461df3856a920c829235d20f8c9b1cbb88d6f9f2f725f0373e478fc306f93a54cfbe278453b79438e79cf9ad3e412f05bd86cbced6544ca8c3f58a4ec20ec860d945a26e98e6cb980e14039007837380a954cd2ecc4f0207e120ab9be99f4499abf521dadceabfabc5e8b6cdbcc1af6ef529cc08ad18cf71f13fa2579c702484cc472b6fdac4dfe9fe343e0cdf9fc72f489c763f31e438fa063a5f2d97909e68e644ff488f1ec61f54ca19d253077d52675427e077c9e1ed00c7d8d929277ed2cc6ccd19ccf85d95b2c5b533db96833181c401074ae349ea508fc41fb0d2599933c5bf7ebd70a263e307a561eeb9a8e2e3422c6dcf51fa7fc2a3905a480f47880e8db7140752db16703e8d273a0e53f461fd0ab8ed365c690f05dcffa972d102c2e9701032a5ae8e6adbf4b7cb56976dc2a8b0971ab6050d82d025e640d1cc6f3a8abcb44c69d952e2fa9020da8c226b0f66c66f61c210a09f0999faedc9bdf23d0263198e893255eebec6a2ed728c5cfd07314cd0344a6b7bff49e8ec20d0cc432a6149acb9170c3daa77b3848b2a9103ab5eecc616f4f95ada8df175e573ff839e0ecd6afd73d13c9bfe07ffcf6026924f37a9082ae5e09742a0d71f234fc6e4f46e35cc3323ebf0d673dbd73c8b43834de344643f69e644642cdb7887b432283ba3b111141d7e91898da0cd2bdba9406223e04bd1c3a6f4a26f2d8e9a70d55f33f71202be4c4f0706bde2aff6b4335728c7a51b6e7fc53ab149c47838bc2c2aa1d73a9fd3d0d416336238b717568895283d513a070f2b42b1f613a8a0f01b4294520f0c588718c438f05c0675c6640f637de28040dd47fc6731809abd12c139f97192fc6d36f0aac4704925a17c74d31fc2e4f9846893bd68a55cc2fc067a007664492070f16170935512cc753aee30d1f66ba716740be5fcd11f2070f59001b2d93fbb905dc558211ea0493fccae0afb678117c03a42bf1b190613e61d51cbaa4a39b8265581d807a8c8a85da72689ca74f5c7455fda7222e40de6660f14d691d8c38ca56b7714d9c99fd59da69bac114ec4139f0260d14a0e0d50ad4471925f2f1b2fa74e4dfdb7130a1438fdf9ed58711420d3d7cbdd2300f0e04796eeabacc5a43c24485ef52442c323c11d27becda01f34395f8195431eb268271a061390f4a7e44318558e93c37d1e3d8cd8ee3dc51b6b22ae9e0aa842ddc71ae39625fac6e0cd9060d53bebe2b0251e478796481578281b14f4012fe79d5f4405f235e10e0b7dd4c5ba16b8cc8be1404b39382a893a7b000088aea853f6b1b2a18484f6313ded891f50e0121f64222c844969a9f1f826d8daa36ad4ef65ae830d2ff48e23634f0be4a5918a2b1f80b885c48d4fd1dc9a6c296e507efc5e82825a84ef8d30e6ed851095182a3274fc469c654fa669ac0859b87458f77386fe5ea2b6761156b7f30b9c65adc50872651549afa4354368420f00402ad3f2cfd18a5a35513976f339ab92bc4861183772af8044c9e15872321edcc81a02f8bd9958cef3ff3c7f3a4f73316c6dcdb38757fd6dd666afa2f625b73999063b068deca0e7a7488e11521d0ec81069d947d88ca99ceece387abf612d75908596d64a3c8da0975f297e8a628650f44fce049f433b7786b2fd405c39e6506e24e1e8013b423a7622df119f2e5746807cad10104457b6d4c8cff1177d4e3a0dcd4b29e145fc7bd24e71bca529facf4abc8833bde64f65c05d21408c915141c30443614f28b75a82da08a0c0790692fce4e841d69ec0353e7f8df0016ee0e39e2c4eb8d2d3cfd0c40b4d56ba3bb7f9e1f491a7f3fdf6c624dcff31e9ad97d105a5449bcd5d718049006dd0a8280965b84ebcee77d39224224250466403e29d4b711ec29154587cacda90b154c419807f9589d8f1510772abfbc3d53322f4f9c10e1ab29fd8af4fc5c89e6956cf08b749fd9d009f2cefccaa47459a9584151d66faa6444f60b8acdea4956a1d7268926e14687f2f12b6a474b10469b6fb4e26c9b6a93c1b35c2551ead681b0edc8d04c2c0e972f45225cde5f6436ee8d58a3f4dd3b6baafd08253c56f5c6bb7db428be9795e322700d0dc0e3077fb7fa89407e3ac1d3b9b70311a1629fa8bafa5c7aca9f9d02f0a5b0880c3dae0eb9b5de0bab0d2664a5763549ccf5180671fc8de4068ba3f110f4b9c23421b705adffc61bb2fb53fca1135f99e64fe0def57a56f54d9b0f9305f6f7a9f022da1677763096a63c842d993d2364d088f8656710092709cf333fdbf6ec8799b4429c03f77c1638a769729e634af7e14c388a07ca18a1636a46651ef819035a932fc28a7be7fceea5633179ecd50b15558748b64c9a86fa82f537c13b6d211332b609d9dd0ceacbf403822c88a0f9854271a4b1d853697163be34c3ddaba34889633f622a447bad70807702f684e9843523509e371d3d6cc5124024230d168d376ebab3a099ac5adfb6d07cc70317dd4f826239d0017e073f20310c9c76859ff1f5dca2c53aed7a419d2ef1f8f0889dfa4452c782afea479faab457698a726e1fa306638bb15a8657c68cd9626ecec4a307b879cd04874b29b39f37f3bbe3ee1644783c08987df733ceba95cfd99c3f85aacfb4f69377d23bdb8e0f203fb7c8b9450bef71884f00e6c204f434fe3890d6ec9a500056c5c254a2d48c60dc3f05efd2ccbed6a3e25283432e79935a9789e1105c256501883712061cef5df1d6abe59bfe5b8a67b8660624b87b4c401623660f5bdfb35d605009ce410be2b132dc3edf1dca594cbb5ab9a385dd00d7a54a51a44629d838d5b00b059840d7451c5a2852e459ca33c1f53911f90b51ce097cb0a8766ba92c05b46fac82939f2d64bc71eb62847025028ce06adf62ac43cc49d9cd64f5069e2c2b15fdc97329142729ba4354e5267f8d3df3febd78541359b944989afa0438f22e7e1741b6f66be88fcde361bea0be4bf49aabc51a61f093806632bfedf8a9e0cbcc8cd6a921a766586f7a006ecec0b8e828160b4627d2af35358d8e54ec8b088c5f23a097259225bacfc6379265f42bd6561d74b1d6f01aa6ea954af2375560ed79a930ea5cbbf5426bdf742213861cf23577d0d7b050880e1806940d0e831d9ffda82de77938882ec5c8602df426c04f0f5eb49fa63694807cad3012e2b259ef33d9f9caeeb03c40206877059b20aaa4607fc7586081b7b738ac69c90b18463fce1710f0c46fc15950de6f275575a46f3a5bef33c3013425764d6c147c6a06a2430ee8275720b79ae4c4afc2892a13c9b0786be46eb1f1aa4598c596851fc318f2c681067ad4d60744f1eb6f771af9166c7944f60991a64bb9e0e85920970d6ae80c6c8d09733e4a0a91b68e2f8e64a3b00d9783359eb1a53e5370090048f3172f7b348c9e63ded27110d8530369412b1e4e012af12d5e14036206a81ce493e4b782bc413c281a1c07873a20e565fc634db31d17f8fa1973bb6a4cfe1ddf94d599c1a3babd428aae94e56960315e3b59e87eaf6f742e3de8ebd6350c0c3869eb8685d764432ff22068579010b266d6cc70de14454ced449ce60a37aa07a423f71ab423c5ae34a1b9a5fe1cbfc279e8e1ca3b5b745bdd6a81ec84a9c1c5185382f75925035cd30766394b255796b95134b3c50ff9f0339de0ff48d8f0503fc94c2014dc68d0443b3dfb56d54ba8fd6e9194713007ff181be845d01d8dac9e224065744562a67652897866022f6079906ce279ec33142a9d2ea9a983f371c45f5bb9dd41f92674b57b800c90b8ef707239f6de85a7d6c4c1678c538ec8d2207e9ecbcda866fd99cd449af803067fb497fdc524696de6d756a937353031478c991c4899fbb789a4f14815455289f224ddfba4c353aa9a5adc5d29a4d75025a07731998994550d7b0b040fe7a2231531eb02c58e3dba59a76d7c186f50bb02ae587907fc49687318c0c83f1cfc4713c60ae10e73c600ffc0cd7fc4d51e78312852c9f12e220c2c8064aa2409cfb809e95f9530cb7aeb526b00b4bf90d2fee3f9c81b4277a4cefeae985cf59483b32494ce33bb27b1f6deca9062b491d5f8703a6d242c69568bb4d1e11929f3550e52a6d3ad4ef0faf7e0c92ca54477edde9891f6c39f68e2ce5787c8c09df3e0225bcf66fbfd517a43b31c3a3347fc8df0db7a9a142498021b544954f4bb5a0a320bdead918c17cbe2893df7de38fa42cc85364ea6656bcba540e3b6466b98e9c154be578cd95911988496c3dbd73c146c491fac7276933a1f5436e39094d79ffd07125cd705097ac829cb5e72647c7cd71d74d92a329bda456839249bf6d0e1f660c3b1a07c39f9efe5f92c9026fb6f662e1d14c1ac7ad0a5e26115c3f77a1e08558ad91fb03ca62a325d7378629c4676293de1e1a4357a429f3aeb8a3c7cd7a9020caa40b2af9425c2b044495599f2976e9d527a948ae47bc7d00c96b2bae029b5cb30bad7937e883358d371fcac29b8f27a00a7fe6f8d6f1621d74a267ffcce19bacf36b585e59abfbc75f4ad3824b400227e682f1f9c0611b1ffdf2b684a97f6f67a829bc6d31350b2979f00923b462317fcfc1f9757beb3978f4f08acc845cdefecfe249a7c3af1e25cbf35d8545726828f9830cc9073dbba3b8903da4bfb55e35512a13eb42de88b8b081a28e203d94ec296fc1b83e0df7e64c576e12dbcf69d94c8005d811aedd5570bd5bfaa2c9bc21d869d5d934b765c1783ac9554cec3c70083b0a96809da9e91bb5b603d27c2e696279b9b529e6eff168ecacde76ac4bea636bb76dec951184d5965cd8092d822a2996bdb2d2a4022cd541f968f66e43c339ab2fcaab4640548adb6cdc4ccb339f7fd4b4570b3751b1528a789e1a19fe30d4a853bbcb78b8cbd74f74a1ec7961864c563232e5363250a6641eb3428b8676958a948400c35f1c936f58e8a068a71d58b19c1640106819002f930cc2badc4e99071f9ee21956f2e48fee71f02c4cc4f0bd06b01ce6f0f946679f7d450a6b83fd32c8da4cb84476d761eb00cc12a01d2d12f7247a2bd0897437a1d523a5e900ea0f9382bb5cda65ecc01775dd2ffe104de3e424e8bc139bfe8efeeeda067fb0a0ed4dafb71a5e9da35dbdc45c3fd8f9df97b8e591fe4d3d874b592350c513085fe41a26455d933204dc7d1297409d23da0a2c084e9786f799f8ca782707f19c25e5a9bec573b0d66d24f71b0ce8f5a9c02377c1c73979b6238b83468c44ca847dbb8212eecdcf680982d6deda6ee990aeab2c3c309c2cbc09d0f8a4d4227fc3885b6c96c6a9cd4d1ae809a9b3aa524301e576118f347a8a0bba7ed0778a8adb788a1b8234014b462dec32a7bd747762ddf38cb0d42df08914ff21ee32135f92d26254bfdf6188122ce179ca2adb8ad632dce5fbc5b34a1f3c35b9fe93d705e688d06a528c6a84352ae7d81f756c0bb5b7b33ffb974483588931223728c41e925c3d7012927bd57cbc03cfffbda9f9722b18fa793ff518357fe2d0507845acd69a39ba89a862eccfcd82df05f9f85c3708bc20f6e65e9abafc50e8e15ab734120d5af1b654b3d8c9386962d1cb4e0011f3692e8e25e6b7886c59b7a6a4a8fc5173c51f61b688d5811942c9c42686f4162cc3707b8df1e2fe17f960c840d68f38e6fec22c31aa07af47e68e3f962f17f6d1a77f121bcd3aa12dbb76892d10476b9cde8f518e2f4e03086f84b99e0bb60b2407f1a62b9074076d75f1395d4290b505c838914e7b0e90d0855dbf816492ad337ea9051442e4e242540acb790391ac4cc4586c8794021461ec0d3b7aa25fc2d32ac8bf03ec3f09e40df926e4c21e9379b75511e22167fdbaf30c81c10666d2eac4c00ac4282ae04d648c7df0738620c9434e80f0ef6e6fc420e6e44b27c2170b128037b0e3767d8047f6f9fb60b7d60738a60be81b1d1dd50738975e4616cac00f560422ad5a7107ef8ac4797a1a98fda9153d41012b5a9bb4706f4956fcab53ac07a41bc31a7b1807a4757c6a0954ea0350c4087b4817624c4890c9e4a9762cebe74e53a783efee264c06a4fbe49e63f111380e96f5a9ad95ee336d0e858660c94acbc11c367bb660d30f700452a9a169344bb7b322290924fff54d0edbdc95e86716dbe1a1b4a55f6bd76f182e9ee858e50ef4d333b55870d6a6efaabdf0e8fac44c4c1408017c4df782b1efab2c69c0a93da31aad52427d0ff0a7ae9a320bfbdecdb97b8420de903b7a394666326fd2b21baddb603f380e44af635145bb5f544ac5e35858de10ce1e5c3ebb06aad45a5275a3afb4bd9efb5abebad12233b11d20a10410fb40f7ea6409e60bcaf303d61ef904a3a27e5faab9839a1386210078918501bbe21bef6c079325739165d1d59a743bc15768a9830d1f8fb80a0ffd29de4c2aed968ff7c90183d05bd253204bd9364fbd39c260d01016a4788c20330e37b03e219ef25b334de883343a463466d6ee5863a34d666563175ae9e3c5d800802444a30364976a3742f32d87c1478035cf0c76f47f6f24861ff6d38b3f5f8926bd254d9e7b83131ee81e6b21cb1745159a983dce6c5033145a6703e4c84d7e89361a8f9e81dbcb7c4283a0e1f4fd1d9ebc8806c1edabc4aed2c30f9ca5f8738e113c50456629b32f14f1a06fb47b7b2f6ffa46d2ff1d3c7ea34821f9ef7b23205497afd76096c1c4c2d46431db2c527a06363195161a305e1ddfa417cb07f649b2eae77ed15483d4711a2eb3b65235343438924b1caea46aed922be26028c34a6535ce2b0e400cec0dc4488adc4b9231061ff25003b41a11fc6a8d4de81ae06c5ed172fb4662ecc73bdc638a358ec1063915bbbd33ce2263880ddf46ae3a8c9ddf723df42b0349cbd063b3e6504f3fbd4a81529e92d0196f07ea57cd0189dd49616c8f7ebfe35bc5b600d9be620800ecb4f5fe2dcc2ebc2a98c94fa71e6d8e85caeac82a6a174e7a6d5c802edea6f5616a48afef2eb2c4fbd2f994958ec9db589ef10bed6b60fcfd2480a85e42f6604bdb9e4b9625d6089a463dae01bb2330b41b82e2c6c3c820c92136467ff84c08be9f0f6902f030dc84c38efd5b2b8b702941d799393d9dbd0751bd57002ab99945c5f7df677a2e79db2993d17db8a59a34bffbc261b7d0fb318a6cc579fba41edde0ef631b127a2042f62addc00579912465384bcb14826b0088ea618fe72fdf073e6a57d719ad4393ff86a444f21e9840cedeb939b861a5fe34ad0a2ae0cd1ed656c64f3bf76a15b8b4a92cb766d4b35719b5894ad43adc8f81f0dbc05784f7a2aecd92d8f33f3e7451eaf06af57034077231d3125cfa882a5de3ae8d29f09b6a22e9bcf256b1b3819f0e065ab18ab95b194cd5330bc7a45a745537cbcd028a544881db1b4751c9a877955d352e38e7a0633af86b28886d20c56794e4fc22c75cbb1abc34512e54ba74e6d560527c0eb7519224b9e4c460bbff4b4aa60dfa235592669b0aead6a94d4efa2f29e8454fc19928db4254c5de22ca3b8bd5ac187e181270472e4524342ec55831f04e864b61e6dbb49858d225a2132712137bc4bf1091fdb621aab751eb4f5a488bd6fc172f8f8b3bb0a1048208ecd03c7a513a7b5d7fb224971433da66383ed55da6031270314397d410632d5b15db760cbfdb869da2e127e3722d08f449607644cf544cbfa1d51af62ff1200121ad3a0e98ee38267fd7935d8beebe80ffb6078fd2652ca600055f82fcf8591dba7f87981d084d528e4cef38d6e1b7211c3b460b2f26341c0dfc68dee9f1bd88b2bdc37ba9fdea3803421617670a88e69c8d63fe504ab6da4e70e4e76dbd6078c82e627da22838d09cf2402ba444033f64b844e51074bbb1a13822dcd403528b5fe9f1877826e421a8a5cf36d0a3b9169940d1538fa3095e401f6bf60cdcadea69b618384a3fac058ef4cbfc74d77c63e2fb46fc750ea0bafe79228320bc023832506f3266bc76cb3d91ddcb68c82d0d81130818ac3ec677c70c8d0973aa1f802ffe6ff50f41e141a0af0fde3e813dd53a71f37b6312d48da1414d5ef8cac0ce038b8f352c1aa9070e9aab6f2a59c6628a32cdf435304e92ce9eed11a9fa892c440f26dd1b6a994ab10fc384d52951025fb7fc38063713cb45b2d0be4cf0f22f138d8b32704a9bfed56c69d8f9230c35cb597ade18bcf638df9f20d0c92bc65b586b4f3069949a976c8d1ad027a69578a534d3cbdb11088725032778ac0f7a577a088ebfe1f4c1f4d5be424cbef43a126dacab92cf311b85b6e12f9ca990436e92cbdbc8af5f05b7d5eec25740d37b6ffd9a04a1a570392128b8d605720f5f75501a1beb0db312485d3dc3a4c5c94b580b9b04157a2bce175736e110d0fe019d08bc25bacad4d76b88b76526265ae84d73f7267610e8e03a48e8d8c0357859fb6eb4fe7fd36887f93462067490e883c1e76ffa5d6db761c09e3322d0f01f87ab047b082eded141da2a88add7fb80b4b6c417c585383d13d9836112918b91e9b30ce180872cd59e1a163b162c1ac8fc1976fa33b6e0a6f5921474dee891b08c0bef049de2c842f4096b5a2d6f8064f7570290b0f2a46f467fa5cf5eb3b5a782a56f40751b49671d0abc8f85f1187ca36864746bebc8d0344ba2229cee3eb3c2e36728bd863072a68bc0f5b74d09ecffbf61fc7828b4184a4d43aa8963dec4666c980de7bc6154f780306af9064363f2db13588bb4fb274b525d68c8612fbf4666de39d18025d6d86d790b4224768b247edad219f5c34b6272ffe12179910421588f81c85a625b3284a471cf3c7870ce26c3e2a5d1c6e30f3f557b248d0b63cd055d7128c179641e2b20c525efd24dee2a7ce756fa1d204cb26272150c9594797c5c3d72899f9db90b22f22939a76eebf6b8a155cac0ebf215c041768832d35f29b2d05f38f5e627844f0f09680ab05ab33c3e1ae2a4a8d6a628277110753dc96e56eed380e5c2ade820cd24daa63b031c2f483aa4f6f4c9be0c7e7bce3f02111071c9cb6b63e8da717e70bd680823e01f11dcf82be763832efd3e00d4afcd7445be4e0d996822f22b7d9f05b3b84bb4b12a3f40fafa4f1e616dc1d8f91ea633b3cbf8f423889c8fe5f74215567e86def052007b6dc8e9cfb50ebe808afc018d233bc8d189bc1560fb1f48ad24c6825e3b1c81855172c9be2f40b2807cd9c270ba207b748cb348ffcf3e0e65c4cdcac880b9765c1518cbc8031999a88adc1e23d8a6d064533922cea30064116c46e062e74292e2999e5799ebed62936a9cd26191e282d0d4d4ba9d4c29fdc2428780757c3886914129796503d51b15c34861b83149d1624555b34e1e4b882f50d37836ccb23cfd0bcd04934a9c9a2901b3647b406de12c0ef1e8b57c8955bf14905600d7f446462d362d589ed7a567b9f8259a483e8a0bc0b7bdb6ae715577ac09b4cff67d14ae9f25e111b3122ec4e192d78b909a979cd1f3014a92e225e52327bcace9b3a95013e02087c7d88caea7a4fcd826d5adfa2626024b4072c02ae9f41ea9c5708f18302ad91b4a67ac3271942761544f7d63e830a0f4f9ea8521a7f8731a6b8042cc52bde70b300313676659605251769d1f4dad332e0b028259e63fa111d00a770a070179126aaade1267e76ae6d9f720d1ce8a03e0c47a265c723deaa4247150787680d693ce349923cdeab5aad7095bd4529fbc2c8e961fb490674320361c90f515e9433d686123dbf5dd7731e0502c69c984972ca837c32af21a3a24277e8d65798bc0ba01f118379770851df1f51859f60240621fa4f68cf0c05461885b37761f0668d33ca32ecf1bc008aedcfde837a3c953803d892eb6dc7e862c9ae6f3ff23754b730143120867113cbd71f0d873ca977d3ce7dd60c8941aaf4eabfeb4a6b4dbc474db3e13371e9431fb0006df790c2695c77532656e16c14b42ed677304fc852b0843d69df53c7b37ba74b0fd5d15c52d3865e16429c1f31426730f699d4c553318431dbd8084a3c23f9bcd8ea39067ff9578133561b59aaf94272443a8b1d03580d0159c6e707f607d2ff6a826879b8f5a9899d3d4ce59ea9dbfb2f31261374113e477407b5ed887cb93b4c77fbf6e004ac0ef2dbb6ae768019c20da6c9a6d724164e649532fcd5cae23ba8072f7939a3bbf9a28d06962a8c4a54a87882b489812974c031df2e20e6d5861929e2e68fe13d3a184aa598e4d14f42625566c3f9dd58ad2ef64ffa50280fa4f70e9d056bde5d1b6f81ff4b29712c715be830675cebb7d8c99d2e0aa42e78a3b73def40b6a5316e980a221ed8ecd0da62a529fde7cf3bf52bea4021773b3299b08ca094df4653d8e230ab5463abdcc51a79b2e2cb56eb68f412650ce9fc1759a1a5e3e6035242b5e5cc34a0ade8545e740da56a3e92ee57c863a223103dc9f2ee1702a763de4d86a3d7a18926abf521acf53e51cab936361fdd787dbffdd5f69379bae338f9fe5e505b7ffbfbf9a10ae091c4803a0b6e99a31f828b2861fb4e04bc29726483dccd871b1ee9452ecbe698272a6d21d5e31c2655fa1e0810b54d203616882776ecce958db8b226931e584b66098400d575b0f9fa3fe3b85710666f85cac161d4bdb2df6c57a751882f5824c90034b91098490e66459fc86e3046baefb52e1f107308d81b762e0df913ba48b69005df7f1a7184c3ac5173a2b50d6f812df9eab7af674a1f8a565ec350eace271b52c39f195a08000e9a187d7b3b15602c116c77fa354d3c7ad3fa03e2ce78c6eee7020737931cbaf47eeaf840407a8bdcd511b075cbd26bfba76f4d187363987a9bc4f92f71fb340a6f208f5b9c1b08f30acaf52fa2094beee6525b74e44bcbbfdbb84f638150f748401cb4bbbc619a03b63ef1d57bcc280f926a066d8e71241f78e0e50b95c73690a0824caea34d23939ecc13f3be14459868d62bf048054323e77c608ab1b068de1b8f5e38fdc87d684f0acf1eb5ba6d0a1b75d9a58848bd13992ba24175a52c56c340b3553464bf4500c94b3ac701d7f6a94d98f18129e78aef1d7ee312b57b88b3f2b5a51e5d19043611be578d26db4c959cd7256f69d31fdebc6a5bf0912d63a0eaf154b4f2d9b4254edc5eb43dd642b579da72af092f6a23461853f454a1a531c23fc5ce89f9a0ae481b04ee93ece1a0e4eef3b1b5985c820ea90a73fbc1656be31a40464ea3884ea674cb78710bba1a14b2ab74fe0d687753650e2b2fea14d187eac43b50bd854c9c8130c930b096833b1c3f0559c79160779cea92c73fb6841f339d9b361f5105272dddd4253615c87a293e0c075e4630c8276d79a9053731f4f187fba5c81c901475831a2cba66c57b952c67087b5c43ad33ab7a9e61a9111bd12f7d23bec4a074cea155c79a8a4d4c4125b65d8c9f2787700dcc5232e732b5965b6844b29745a1340bb7032ffc36bce1f0d705eb0ee15a3334db1c3afa2e0795bf51cbee542d1c33da0c554c9bc89cee000b9835ce21c82cb543eeee853ca99d8fb37533a553fd6d9012877ce64910999eeb863d2d98ce0897107b14f15154664e20edfc991801c89061c475b6340cca8ca7b730fbff63310d37afce35bc0a595860fcdfead958f717cf775eaeec39d60d6bbabda4b9b6dc8d62fd97aaccbdd9786d0a4f15ca635ee7a9ea710cb91922700d44abf2251479185d4449e2753d98acb072e3caa78d04e5fa140c278b113142b6a8b7bbb9e1cd10986557999d64574e822e247ce17a707e7d28b725ecddbbab9444874dcda616eb120edff676ed21b87adb0bec41a159e2385203a1f3419e038fee7e2ca45b186d1bf231bc1c139772166044c8537976b1b5d3b50d76be316995dcbd903a388af86cc95f8c9669c6c61dc89525f74a3e14486874dd709a1737e21ec60433ac36e651c924d5d33454ef491eed78409a1a1d82cb72f3c4622ebcf6110b56a7404406cfa651d86311268891a5a775da64a7d4ac81418c917c602af19b96094940350209d929c644d097dcbf65a4465ae351762b8bd2e2e705a21a1fc255536b11263a0e2cb2e030554f6e23fc45d64744994236fab58ded038a739a8bbf2de014aa582e76e85144e9e7a7dcf15c12df22657aa33a7f3832ae8b97a700c5d3f489fc1082987f31b085715ba22151148cb0a2a2ab2f10b013c561a7935abf6397a5b7edb057f6c14f2f71ad82d219738b76d8d38032d3c80501a8e73f8d728c0f10a0f136eba05361ea932a7424f375154789d85b5de04cf08d089a7ade9d64cbd189f990c238330de5401ac3b043081c618d194d613e6648313fceb1c432bc6eea0cc812e909dd8735c438c67adf38140e1262a1949ad0005f404e5b77fb28cb36698080fc4843d4929121132bded31c80a897021631e30925515d6d5c767e9db1a5d522e70dd89f50c5b544f131f8313f92f19a4049f1fa39a471ed190de7d6febfeeaee7813749ad6e4ee14e9cfc2dafe8c245e9ff03a673b83e9b3dfe57501f01efdc1a0d393afab60f9a842a4ade14d921760eadb885007745fb693bdebad4ecfb280a03f312bb78701facef01e030e386668491c37f88639beab6aca7b97c5cea4c3cf59de8c9a502206c8d03bd497c5cbc221abde08476305a37f0ed32e81b7c5028384d01ea4a11779f8ce0144a508ce9cab44f3f05f4739375679f846bbf0bbe13c4fa4191e16e42dc1f934371eecbc0cf3bf4e1a03456260e44147410dcada27299bd5557f1f14c77548450cb51daf0ab2169bb5b952634788ed1581b20796740c3916ae3df5685208a0dc62c4284457b9c1b378ebc6a443ed3339fa77fe7ae734846952b5a9dcdd662fd9c588ef76c251ce3cb0569dc67c9d520dafb46586e007b913a71cb1273c5f2bfbc056c03f159fb06b1cdf9f5eb208889efa1e12a0c6608dc604eacd8d710fc2a4d9905999b643d41023219e1f91e56af57941611c4ac73fb7db657c10ea66a294b35ecd35b3a889d8079fa47619058a4f9408609090b6f78c36e27824c31ee1962f35504630c34e228b853b4a2ab41bbbaa29a20b09b3d18abfca88bd015499b7b63b0dd3ebd6b28dd0f1bc44da3ea9dc4accb8039e683fe59bf308000b3f238b3879080091fc77b51fd01d7c5bd30450947569fdc3cf66da5aa68c39275684510f5dcc663c4f65cfeb08f806ee6d3a50c4e4c43a550b5640e0adfb63354ca5c58a70b75da447521f2b556a5cbf3f0ac130862cc8a34ee7ff8dc4db5790bff5542f55549e03434b31482c733906e859fa1142ee9ebbc8973860e1dda07bb1c32a900d89bb460b5f623b71c4f726d5bae57c1ba6482d96b960169523ed30f1bc527fceec1dd33f24cddfc43d2d20a438691b921fa5f38de530718f194086b992ecc96b938e0b554e72d10cb29b052119c2caf44cfe770a35834cd10d76f7ac5a12e7bfd71a80eabada7952c7ddd1d80f8c56b7d1a3753a3aa1d2cc69c34e87efa8dc93a21cd9d2b09a425c6aa02be94d5d4e37b6a47feecedd421543d9c225549315c3ba38d0d2a7caa8ef6e7a94b3c3d7490bc558d0c3b2c2774447c53efc1737dee913fba3fcdd113ce3f9432c1c5bbc243b2a7b34cf9ba9405352b5e47e882bb9f70cf4b11714b5ca3f095cb4f830440c98923e37a78c23171cdd6d0dbe1f8d1fa14c0f07a61222ef04a2819f18d45f5694ac9bdb8760fe058c5ee670dc6af6198a792d4114704b7af7ad495508bb2712ee56d58e0118b9968bade343d9d55447de95543e85fed8d508c09101ee686aa0f7be97ff876ad143738aab484ead93c3eb398cc564eb0f9baf3c3d560b1a6530f905a81bf58162e180c4dc3191ffd8a3ea5858404811d9e8e14c26b330c8736739b7147f7d8811cfb9654c7053a9b657d403722189ebc70996ee26aa127f317bbd9f8a3852cea220d61851db42e5880ab4b6d2216f993a9086d2f60e7dc5bdaab7ca0c30830afd32a5ffacb3ecaefc6ac5155c60ca9e0e8650b62dc922233564f2a6545677546d0079297944506ae756185ba6ce752155a381ae65a832a7dd68c4239ddff63e044767de51e2e3db03de13524876cdc365c37f24c2df0855961d14a6e34905a030cf400abc63737e01ea5cfdff5c765dd7206faf798f88d02d4e80250f8405bc9b8f700bf6b9ae3a95d42dee240a40703474fa9088cbf25d1e915876de3bcc17c2a4fde942fb4721220f59eb1fd37ca7a6e04279a79ef74659549e175c215d66e0174a2b82450e6522f429017c49fb6243dc0a444d8a70c1ee6eaf881a3c3777f1df35f5829fb2baec0a261a9b992b054c7ed291aa570ca8096817dd57851ef56ef52700fda29f90f8bcee150fb331b72600eec85bc50289ecdb7bfa98a814e77724b856d047e5aeb685c20a7e949c73f8ee019ae86d3567a034d92383b8190e20a92c79a7445990bc71344df6aba8e113e89ebe89e5649190d3c179b0f9fb93a2e7e8b5da690c5223c5cc65a72ecbc222aa2b866d1a50d5f708b234cfbdad00d8e89c0813d452c27da8893d3f498d32320db09425bde949cb5f2c7a7de6f7b9b3258d425fa97c005529ba860f93ffee4e43e8b51af101f528253a7fc7f99b3cbc304602804c9aa166ba98e7abb803d17a8c29d2e91f8c95f7bbc85e1b6d7c4714bfd9303b5603cf90adeae87dd92036c41b242ae5cf4e83266d372f8471075da41b1e20de7ca472f3bcedb32ee39853a84e02a291d558bd32add39cb8ab42f707e032920509ff54e6a6496cdf983fa251269589327e26b7234101ef2617e899ccb3aac6e14eb695c204ed9a09f0393e816051eff74f165f393de803976e517a18f326e27b8b2d30727db9400256103a776745308a98bc15996f7524f4fd75d7a61085e8c60c870e7101b77c1495f26edb3da65118d28196ab27a6cc58f1c916066c15690d2b2de887952ee7d1cb1f544e7e634ac2038b9e03c947ccbf852d34aa9e0b128a55a6e7c59250114d96166fec0d8378e57c56e46c5a345c423d37083ae11fc80e22eeb89a17aceb7d87d6bd75accaba9807e314e273adf8464b42379b758d620e939d969c87c199d2b2331639a4c9a6ee1bbd3f46081722d073d16b2c52cd11392b7b48a7eb49e142d4b0394e4dd58cb465e74a1c8ee74dffca2ed021f4c3424f0a72f550f60bd0afaca402bd002634992ff124f44b46e9704bf0b115307fe611b6704e955946d89a00c6c053058913e2038e1c789dae7f4537ca3e6dfa5c595444e27713a0048932305c6111ba17f33d021f7c8f7acc9180cbe4a963a2a881f9f0f700ccb01befb202025602533816246de5ecc33940e13071235a82c6f53d3316588d0c0c9969ef7cacdd4f0b590064d3f74a01534270bc4124a6b0c83abc7575d588d4f47aa99aa72073d45e33412c84821258853281aa4652584cf0f56fee8b8395a6978b0a739adeb9042fda1aeea2b9a475d61797bd58b336dfdcef1aaf0e302f1e0771e9e255dfc241c19991d104aeda30f07dbb8a655359000c7a320df6092e44e81e5f6fc9d54afb52e5d886b2a5cce81eb632b281b93aeb4eaf1aaacadf9586cbf84b089cf4c8f8127e503270bb6da66e356626330be66cba0aa830873e76c2a384ad56e6eea371e0d5eee9430554ded5d9a15758eb5a94526cd95b7bd050d54d7d69ea2b0544dfc5b263f8d4646aa4dd81859d4847e0f550db033a0b3b3c2eab93909219529ec2c2be6f8c2b33bd0a525bb209ed82c404bbd8bdc78e1ec222781a983b44c5bbec3661df57e1f0b14720b6f3691a41d0489a6d76fa5fc07d94d5627a77dd48b35f5d22c75918c72701acc4cefde09f7bdac115ad2d379651a1c13dedceee0ed220fb5c3850413e776ee8c7ef8da4014733a9ecaa73e8faa851af9c620e721e51711a992183be51d9b55da20085817818ebb546de0e484d475608af7896197ed340fa0852f57ac1d40a63f9f3b0588cf8dac698fd004aa14680041c23f407b219347635259d1361799a5715de25edd9d4eb20cdcbbeb0459c4757079209e61de14414dc7c24ebc8e851ac7725fef18d092074e143dd5ce053e421b6d59eecb48406cd1709c1ef6e1de229920c65e7f288d0d1e46b6313d0d44b5d4068f7542cf850b4983a7e7eee6b832c5443b6e12e9325ea37ed18a8e35b32f8d001a545487b7aa3790e35a3e7825d6a91fbecb744a2c43b455f9311dfedd03660aa0aaf6170ebc345f7b56d62e6dafa4ee9c8171edbf541e71b035c6f9132e0404a7c4653356d652995617a268ece24b8235ba949095b2205c1d021a5ea23b2ff797b75236f536de1205c226cb6d3adbdc07de317e39ee3897610cf9952a299abfba37c02a7a36f0fb785883ada1f74054617521494ba96236ffb2da1503745d7af91acd834f9513fb6ddc3b26905a2c5240071db266796c6b78dd9e94953101b7b7dfcb18641a7a9fb140b2aecdb77746aa218bdc978cf0ef135f6224e83b5692e9ee50f7c6d86bcc64e140ecddecb6e55dfa02129f3ba18946ee00207dce6a0f58d1d22ce928f793e5c63e3bb9000b17020574f3a23bad263c99e6028aeac862dfa0ee590e49019aceaa2ef29e53a45fe35ee331cb4d9776cc9a4fef8e41d88084d2186d1dfa96c5319f870d11308c16d072199e427c94d7f8ffc979f153e943ecc3d0338922b0bafc6164696a51fd913501575c40482c1985aeae2e8a8b13d8afa015f279c7268815cb1dfa6dc88ba2d4e13123f76aba4bef20b88dc434931e010335c38d4d1e921566b8cd8228bd92147b0820423e58c08c1b8df02c21fa15354edf9b79adfe9fdb2827c65ca6610a5b6b4c276014d6730aed6962e2ae9fdc3359ea14a0c093b83f7bbef1c1a9cf6f2e26033c125809b91b62a31f9f89651be91ff3f9c730e0d97d1b8b18b59875ef0bb36893bfa7daf43625ec66a54fb18be84da645e755e09b2524a57ed730672743fea32b637c042182adfed0fdf29d41bc6ad2994f92884a792dd6a74e8972583a1d54648265d974dbd9c09ef8781250e297c3aff9743648061abcc5c745a2142a4424ddb2b8cca4a43896a30c3e862641184bd5c4a6f10b6f4782489df9af8e27be1d6bfe99c75d426cd59ce156f06ce79e21eec043c0e1e1f943be06644a96e4d71de60111dac378c36e540628feb409350834faabd01c41c721b765c29fd54d3238a613ef34c206163216b5ba6e3587959e1dc8d85305c64bdb15216c32c50e2f4ef7f60a876bfc456eef3deff75500e9e3a16ac61eb814387fd62521efef2324204a3d8cbc1b0dcf030b43cfb3265409ca6a3d13fdde3c884c92ba4cd0a7f25c01540484e0bdb44409a0f1c927e742c5ae8e07692f293036467944fc17fba7a4cdf7bb485f9bbd56659f1c75b513785146c75b2c9e8230449920d6cc412784f94e4ebf1a6405b21aeeffd240211ef362a1d2f3f9e376b784d84a48791730abe28afd4b88357b025891f811ccf767825cc654ba412a1a7d0e620227f2d32cf5b6f46597121c74d1df23fdbe599fecb7206c9ff517581e8505ab69294277e93ac7a2d5c30343f298e349a59cb2d0e01b5f4cfe05015942a3aa51aa03763f1798d8105cf5f4811ce39175a56c389fc5b12159084a6457eb3824cba227997a498f07d1038604925859620034b7b7a8b4d51c3a653843736406e121f5fbc3b89dcf8c87b010f6c916965d906a7859b406ba38149ec5a8462e402c7a01682ad40ad0071de2453a21de8043967f30b969d21a76851b53e3125df3da2b23e81e9043d1e487e1a0b6cfc6e5867d1f58c0d9822144f4c53701c24c63a36a71dbecad4872700cdb18457445756dfce28a49902a4120494803652a9d00e73295277957cedc49756593558b83831a2429920bf1f7c545d7deb79be23afb397093a4655bca16df2fe0d1e31693996258ee99cbdd66f6a23deed74c29b773b477eb2f41bf9258d85967631647eb4590b4a36b7e073b622b5d5729c23a4108d8b4273bcd3106e34e8544db02837c38d7db236c9f4a65c6c4023ad4ea3b8b8ae296cf151712c569c32c888b760c7867d3e85ac0213b8834e652070118e7acbec114da1a1073b1e1c6c6dff7b9104585d7974f3047021fc68101cb3fec6e655fb94fea268740c84e86b24e7fb3cd53d38e6c1221c040dad9cb37a2fa41827b9d793a92738a6d702e95fe23666c0c374928bcf9735818f8ab41e448cfd1202658828f90b028401d7b388d16285179bfb8981d176f6e54ffd3f27d70464b32b63a86c8fecc285b5bde09286c954a85332927b2a8bbd3ff3abb964758779e0e371da1a52626ac71a849fcf20854fcb608c7418bc56b9926cb3be4b44fbe832ef535c23db76d6f75117b89301a72e0ec7c0406d511e2cb1bd07a9ecb7e6d8f627d95295e8b16c593b3de8a3e6e5d18d0eac8adc2dc60254f3be16f71ea3dea67c4e970fe35b70ebc7f2560817038938d74a4ab0ba6910e83efc0bf64d8b3b74539d9678e8a066234cf162312c7fc062b20ed493c27a3fd9e4eb9d090de71992f9f0e2243ac77e4b45d1926b6eaf14232ca4c52b5bf548d63bb5eb9a03b19e6fa92a6cecdfbe680987b9c312c8d20a88f2050617e122c487d263613e11c1406055caef2c657a7e606eda7045eb4fdaa65f0348f925228fb50d223fc92e368d52186bb4a80522c7fa435c819ba45d7c6d70aa967b42fe1b255dbff3fa3ff22fc44ebb94e49cc09e1336fa35087988c2d360609f0a94b5dff91fb72039094d1968592148c113a14289499fc11824437a2aa8bb1fe88012fb5874ec70d424fee26f8d2e034370c03bab1072c46974c7840573a2061e65b0b3d4283c5f1dd73d445be85aff0f384550fea9b5b36233f80e737e7ece6c160137c778743f626eca52611dc8903a7e7e99c921025d31c01f887b8ef0efa0d86fe5671f346c63226a819aa7eabb518231906ab4d72e1c17ef5223f50e3e7b0d3a3394ef6699231405f9fc9d8387ec58e0255f722a852182acf58a429d95ec8b223d0e1d37fa3603b93bd881f6d4cad52ea5b941794799eb4808161d203c5db8972c8d00a149d5b35cabfa9b71a57cc035c407be0dc9391cafd277ca525e75deeaf7254d15ecf083eb52d3e914d96b5a785540cd8e3117a9fe359fc86d2946c899eaeb5ce9f8b600fc014842ded12bd432eae707cef33eded9dfffb0415f804a60f0eecef54a908687a975bb57361616cd9397d81c56da8bf79b2142077baf0a25de4e038c9759f628ad6d922fd81652d3ef5088972af64ca1e2e81ddc4310760ed3290fd5994cfa19ef08cf963c1acdcbe85f916c8e2b02ce0d6c4621403e9124029a856ad547bb5be35a529d2fff2ae7324f1b2bddc0e842f1397a46fe9ca0fce920a218d7c538234995406e13eaf880dc7b893c60109e842f2b5a45f5e43fc4caad23f77e7fd794070e23e6600b9bc86605b4c82edbdccc0fc1f50ef8dee6a12f147d37b23443f56863f6a5681cfc0a0b11243294614e97771b8f5989b4004adee7865ddc4f111afa21ffdafa69dbaa2470001e70438472e560c1fac5ac869056af849772398e0c0ca8a8b2ba3f12e2042527e01effe2e0dd803d1f358c8503c0e03f91bf0c8389076374f522b42c6dc526575f29ea175c323c9c9b8300703fce66457a516d3a94f13edba559e61bb6f79ab514f0032b221cdcab56b4989205dea5d9c1bb63b988ed82f0e36a0b45256592dd9068e16f4a18028246ccfc8761858b58c32bd709d98aea49f5dec59551ff181c26c15a9f188b4010daeb14e476e051d954448cfbb5807f4765b23f522a161dcd1f18244a7067e90fdc278143f53c4655cbfb2cc485a4b8c39312e8141c1f07340eb9993e0b5664714abf694eaef3a035a4cbcc19b5f13cb739595577e2fbb40abcd8883277ca6db4d316ff3ed2d0c5b8e390c4da246fbd760afa262aa1d2034753f9927574961cc8c7fab3fa5abf96afc577f9597eac5fcbcfe2bbfe5c3e1703d7ebbfb9c3b798e8ce3cf9b5823dcb9ed0e335135075fe98af2bd598311fceabeb5d518ddc32e8595d86d35e9725f6fbe7e5e87bd654eb237e120226921bdb619e91cfb5c82462d886e5b6d73c77086c9308ea945ae060bd6eed7265e060f9ada8fd9c35fcdb795259863fd035f9f513d277d9eeef5b080c1d0a81b97211147d995c9c72ad106ed2cd680561ea9b1eb6dc4f915c67f4e88099be52383ae763d32c69483b1db3d9e83e2e19018584e80724a92f4b1c13d3dd406fb79f8cea13bbff4a1209ce9f1712a4249aeca71cba915e8d8afd48c0f85b4899e62a9835dcc388dd0159cde30cf4b0f8bf97293988259d983ebdb4962c02c941a107a22d69df5f29a1578cfbf49cdb5e1f765f2bc037e9af09d4fc7331b88fa0b020b574e0015ad3c7c0c04cc4a360a72b14425ff2cc3e46b3cc4ff8583a49abdffe0030d1641ada452f3c7ab6893377ba61a7f7b7b1f4a4f95640ac1a98bcdffaee722de92629c9d524e6d4312704585c1a70bb94cdc13d67d032119258677750f315fff7d3d31693119715b84b243765fd2dc5701da283a66478183ab288aca2085ec555a49a6263eae886561364141dddc4564d7a2ab986faa1edce99407af815d547eebc185330cf328e8f60c3dcc59b0dd5c136144594aba4327d3ae5ac9c6721d5b818e9f94a70395cbccf369ec63f591ce3615b2de7506797bf8caefdf12f45eb509b7f8954f3d2423e90ba053e457f7c9843e76a0c8903d0d2f3f89aab7476b493358f4cf1f6ba6c777be17a103c3fe05659a406cfda091ca2935cbcbaff658047394f0f51aa3c5c9eb2a25cd8831593ce1035882f66a87277c23bd799d30a5ae34215e37406159dc1ffac471d6cb2c79aa0dc3ce6f0921863bfed402c18630105c899771bb8b44d90724b6cb24b326abca6873cd586aae74fa8507b1e1f63f9a61343430c6aa69634681c570f1b70ce90459532da6abb58614a43ec131af57d7651b15fac7b693ca397e98720be1bb2c60021bea7fca61ed57c60e97d1ea381d4f6317ac1da8c9cb6e8aaf170138dd102dd89db612723584d9c31ceabdc821c04e9e538410c8148d68864c8c760d1b018dad82806bf6ab645322de929e844e69dc6e63d1759d90f54f347530ec20ec246d86604db431fc1cb5d13fae3473708a6e0ae06ba0b9b8a76a0d3275ac220171c5f4bfdc604b3888733d2977c9c35a12612bea955107eb93d88ecf7fa3353a0122d7f738d2c6745f1362fd4de31b321cf86e54e5d46db03a51f261410a0c9201d127426d025dc2013a9f83006a45c6b4c0f957a45fa0aa20cd389d562140376e3cab5e27d060f42bec86d0192189070faaeb20678901473157f3192e3427e1f1bf1930b3af367584b6f445a706a08f92143416663b2a599134a4196e8c3f45354596f5bcc408289b6f0c17689729d0f351e84ef461a0f06346eb0f571354d544e1ac5c7b4f3351f1a048119afe63fd16769e9fd2a44b9eff6091ab6f6e0ecc3caff1f3bac7aaa8dddfc2d5259fb76fcf110b37e2e380c6eb1e9b50bb66e9182c89150ef24b00f6dd40d5a7e3973ff164d308efc48b5b3cad5668b58f31b0de4490e0ae5cef1edcc5b2dc9d7d95c655600f693c7214a52df1ac396762f9af731e3524c6fa915e86cd70d3b172bfc1026b1ae12b14902391a0cfe3ff8eba12c5b8ac65ac4513fb87e39c141c90f5f17038bf5c3a8e22baf4c582378b07317e10bf5a6abe56d4cc3c8e4e90a8c646bfd37fffea05dd36edbe64cef90c0b6a86c900fdaa3ed8602fec2464abdf85a193488349940957a2a9598d3d29e4efd227452bfc34df7e5bcfc66c85aa8a5bcfc079ea3a06b0b7dfc9a7699c569229cd2d7b55d0c5c35856ff90d3902de1121154deb1864164d674128e318afc56ec5c4473b1cd6df354f32e438d7e76a4dce4b5ac164fdf03432ffae379f5897a3477376947eac0fb804a7d7acaf57d12db8794395eab88b648265d1c770b74b738fb260e2a007abaefa983ede8e9712076b31264d83f601daa630421feba9385f397d0466d5c2be2a7a50ad2ccba7a1485283a3c3fce263c641f0e68fbb0162c1c17e33e91a089e5250da5952b883edf856ef91ad4b6f1bc4df7cc28edc16a0214e3a11a11420f558fc2c24d409cfa0f5b22c3b03937d00eb030f5cbb1b2cc07add978f64b3ca698c7b3704c52dffdef74b9370c8cdf7240cfa2f405685d043f386647d209364291be832f42c0a268b7741bb660d4739e28a13b3d946cab0fa6e04c58fb91c5cac64c1c1ce2ae909c87682e863c32b799595193bd6a541c57e9ecf8da54fd84eeec94a34a70ebe4002202294a5f6dfe5950c7bf4748136baaa55a421136248735187f830b11a0a018e483b83f6f9fd3d007f09ce3ad036f35598e2e5214a344a53972acf0f57c504c06ceb96ffe9f7b0c4d74b58503fd5b9d635f4c25ec7129d22cf49aec5389f932826e6de1c888a6f24ec303d4a58e4b72c7fdfddb2c2576061e5915d61b5fc2e0cf29f836eb308515a1e9bd4d1109431eb42dc975d36ea505b698b41a4b203f216efaf2b4004a14c62c45f34ea46eac852595e4511d21e6bb2b00e4f2e04dc9aca40a42806c03f2260ce3c7f68ea4fc2382dd974d774b8eb7fc95943048a5eef56ca178179e8fd742d2a64dc9286b76ec6c36db801ebbcc6f17121d65ea4e822768c6f69b6253c5dfa59f20fbd33f6bace06bd811984f2c6d0925045411e0bb8d3c44444998144539a9a19cfb213c8daa7c7bd2f5449ac5bd2feeb8259429e596d2baa8929f38a72715026a8aa37ae22b0289781727b49abbe5df49897b8810cda01087f875c5ae32d41a6b28d59e5900e848f68ac4fd047754da72e6215c930b201585147e1132d8208cb8cc889bbf86dc23ded3a62e23a3a538d1262227b88a13b6841d42a7e2fdb8345d99132373cb9afdf5e1692a6e1dfe1cdc37d90ee20640768e5c3894a466d746435696d825676da47884486526d03897a5e6e5782c0dd9be044c99d2dc53bf5f7e1f0aa9988ac40fc4e4c91006e4766d931ce66199c1e4470ab22ee743b8094e331f5da113e03b2c17a694f8c3a7b093fa3bff44e7abafd4ac365f525bcd108a85b74f6819794dd55f4cbf7a104a48d81efdcb9f141640d9c58d230dc266220205f50d719e2c11ac87b89bce5158dafcf7b942a3b28d58fee065b88089f172b9037106e8b6f20cbe4b0a3e0230773e7dd01d92ce3a374e203ec1cef34430002290ebc5e8e4209e1bd08655ee36f4b637f8b564db52cbb318e203ccb8a5e8019ed6a1cc41a9f81549a13d75fc0a1e06d10345a4540dcd342cb42554657a7a594725cd1542e1a85057314ff633e941960cbdd370a41696d294f54227c3f043c8db234a335c77e57ffc5a0ce0b9be8b2080a0a9d9d09aeed0a3467adade16447b2553bf374a1022ba4a98e09b3b2044269a5666e7b974a57afb04ce063463e10eb9853aff9ca9d0fa4776d57b8ae348dd094bfb238f7f118e60c605f6d8f481db37e22274d75892b2d170a0da18d2965053fbddf74349c728e2b9151f3efa2f5e4e8e34a439d1e09bdfca8b15695bb0ce0851660cfb4b376638f0a88a130e601296df6f9a2f1960ae9e5ef3f49d3e1a6c9b834489f8e7cf89711fdc8a11449b458cf13d5518f1e5da9572d2bbd808a6377c358397399bf1c6b4e93c05e0695962d04b78d688230f7490cfdbdb179aa266fc3efdad408a054aafcc256dc571de71b78ec29348bc2100178cffe4d4a21160f36b713493f91c13144086a53df4099016a9a10311a21901364ffbed1f9443cc8a73d96f0ee942d530845ff9f3d7f3e1f90f6abc359e8f9d15216fa61b4330b7af8f11571639c2bc9d03f0e54783b24cf886afe3eb0f43a9bb9778f2c122b93d4027af2538771c53584437d744f1e87e970cc449f208970c722a245e8363c44a48e26c193bed6873f1706b6afbe64e48c0ac02ca0863336610602cbe36461be15e610f6f9105d2ceece5037e2bc185d73bb64f0a7cb33a87369677cb0d0d70eb2082f49e485fd43bf4ed64873aa5aa3824a4b74c630f2ac2af035fe91cc92f439aad86d15fc80c244adfd196020acc35d0608b58490eeb07f3c657c52847518267aa95d7a27459ef5f05ed7e13499653b29cac4b1e907cb63994333afd9e8c2422009983a377ebe429a43c8313b819228ed90003b54769c1f49584ec8a51cb137500729a57c19d67e512daa8851fc8e86aa165cca435e6cc722592ac40c9258b17d7adbcf7246c8d303c27620da687760af3e22a2e39377d042f37a2542dd94b2a339690a180d8527676f01d60eaf790bdbe18a0efd55c7ae3c777099839a34b5a9f2ac9c15ca9ff007c2176c6f744a2b316c051963008d1927e804f8bfb9317eb13e5d17ea0455d67bdf74f306fb9b3125bf7d18ad58f45dcde4f17fc2e3e42d65ed8a10838c9e9826f04322ad51cbd0e468aed1d907da65566b48745cfe0167c0c6d2458f2c91538abe2da224e62038951a30a2cdf2feda9de4e0504e6c3ffc257749d91de15f5bfe96986be71bd1c9707feadc8c86f793ff81a1cd6f91e2f93bd73d1242ee9a1ff1483d0f23e5d561e202ebb9305a05a4bd613597a7baaaa80ae79dc77e9124c128c8249827c38664608b6348c9abe35e2e4685504c8d1ddec34568079158e7b3ca55099a58c315858477904697c548462ed5d56179c23095c9e1ae30f8e5ce4d30439377780baeeca409d30bf03fcc9a5b0049c1ef7e2c16710c7e75ceb4e4860cde0076204f322877f599776b434c425681ccdaaa1c80c2bd1e53651a0a0cc7bf7120b79651a6f7c3454bb2d5f5f648e10d1926dfa7d4a7d8b229dcf702519400d0fa458bbae54823bcb0833690b8b213aeba690586a57d51e6f93c0015b07016dda0d7a85f43a5512a9867e4ce26eed4c5a5fba7380648b216d5b8169e0d1721dbf50d5e63c2231c5b5b58ffe099d3ea5fceb020f97016ad2b652d3bf7751d0c89f1d9f9e3d265e287082671a09d795492edb7e5bbb5f014526e78199e4d6ecd83db73272b144d82e24fab34626b629d77912833e4d0175e5020d16983fa213ec44f1d7bfee1c64610d94d15326887ad2285f59b20506d631e8d80ba9ea44d7e9ca0136cc70fc9a00cefe2218a72a625cba6ddd2bf32813b2a8ebbdc74f07be7948b361ed5a70d68ed936da0c89b48a93872ff6fd27f9b95b1b6fa1e0b7e487d7b079a36052d8114cabcc4fa8bef19830ccf36ed81a6c3f18a501aed15d7a9550121fe905bd23dbe4c0a16b52e5a80b3f699042367c449e1b6017a913067702396e502cb90f8f2405901259620c66194edca6eaf3935db4288184ab2383cef773cef3ae0ca260692d8de2ed7b683f929fb5437237be764f495ca7821c763a5acc8b068ee8fb42678723306ce1ce0496730336adee67cd0cdaedc6e98a6db4b43e1ea23b2dd60fff4c7c404b33111ca7d63806eab27d62addfc20700dab4a326d01af1be1147f02e0e8f5c8e29f710fcee3d2ca033338b7b5e92552d28caaf25faf0695f0c0062aed81a8907aa8c98ca0a44a9d77b28677b63aac90279c6d7cd7373a9bc9e6d87b53e2011babc4c3365694e5c60d179f652665ebbe4e26ed1df7aa142a8528510c2fe1e7108dd48fc8983718e9790d7ce8f2c0dad965d031e8fd9c832a469a1858585b32746653c0cfab53ec57df24663001aee1f7787a0d2b23bd8a50fb15abfaa8a61903ce2d4e812e079910b6ec85b861a27bc1cf462c4b0e4b280c2d845257d4f7c1a275f1200ee7b0f9af1eecc1031ca1017d6864fa373a2aeeb81851ed7d7554186174c499e2b316e4e264161c6794aa86e6c9451c2d705055bb0cfd1e7f50e5a23d5ed4e61550c78afbdadc4579400023aa87cd03898c3ea5627ae100b91b62a1b2ddbca488be81dfe76993656111de71ab0d993d3a517c8d7cbe91b0196bf8dd4934a69919548d8b855182cb799e8c2d8aa2f11cf0e8278511df4d0d3926aaacf46b6e68c57a58b1246b5b700bd4fbedcd28be36faf06eb4a2626c01536fe1c8d9761f40d7d331dcfc8789dfa2375d46c1792662b7a69d78de661421ec880d86839c95e47031be75e59e23535af7109a6500ab3f632b37f0caa22c8f2f205f2e8a6be4a95aca99906d15bb8edbff7101806d84da54243ab8e87dbca8eb4f29b5568bf92b7d3c2e552c85437cb0a3a927565b14267bfbe6438e17e7123dc79759ddf913ca6432212c7c52d55aa70ab6e11931643636b9ce6b7a7e104c6841ada4824701de84dbe3de343d52a5394cd1a7e2597c92b718f9e52401da26dc05b1e2d7b8991f5db5a4b964de0ca5a5dc26dcbc9a1b7b991b0eaa9e13bb6cdc32444a64ba71d89b2853abd1456b36ae5ab2807f08b7704d3c060cdce95cb1189edc46958df6184a5196281ae28bbdf928f9cf9116b164c9dc79e1470ea6bc921abe81a14761fd83530b1ff0bd649ad3213d655ab385b7641cd0e583f00e8698861b3d56a2691be6e0a545c95022fb24f6d3fd3cfef19ca6128551f1e7bfd83c912b81ca8d38fd1a6d0f1c6f02be7def8e76a58e838dfaf63c9788fce772091a3e9b2173910e9ead6ae488f3551e7e92eede059dd213ca0e19d6e93047e0f46d7032b1a64e610e61cf0f41d5eea8855a455d3a56c10136734257aeac20ad877a25aa418a4a09af71e32fd67fc4618225e8e150d1c63c19880ed9266262d92704645c02cb096b265da3e66840308aadd30941d462808f3c9db61d9a627fc256d840d91ec424f168ad910f76d26793890c91da01eaf44ee8ada9d0e688581674113bdd00a633cfa2c4ead2822b8ffa3b296da982f6a9e5a9d277b6370b7d2b1c87af45ff2dc1dd2f9339698ded0ec2c3d630da41c8607f250cea42f014dbd7c92cc2550ae8780caa956a82b14d995bd52c6dfbc0ff8912393424909b8946a94996d69cc785235b87148e054b0f1949e5a88d5c08220d1fd0a3dcaeceb1ff0e22050e063ccbfa48c8ed6b4a3ce3c83da436f0aa54c61e6e3f2744b434b468af0c6cd7f9207b3632fcd99986fd170f186ad2b79235b5a329d4794045e2ae9839694e3f125004acc6de3017a8f02e9d8a8d87ac69f3326c66710a2a213f21802eedd22827137110091fd0631e94df9d588bcc62b3356e18c505d4e545e8044d833161676bfd8c0f85496781f2f126378330377abf6edde88875125fc9fa7a74304944426672b8af305e76df3b8f27027539d3e0b43ce164cd8ebd2054f3ec27078ae51ffa060fc9642171c6618e010cc0144a586db2b385fb0c4a44d5bced706de9a449017d8cefd901f14d5a032ae1676ea32bad600937a61f6ffec0008831fc912258641fb920a0ddd91f61d8138fd684fa7091251cc1a228cef1f0faa63720fe90c8f36c55828c322b6a5b6445677348cb942cf437012e9e63c41c029ef42629b6b996987d1bf99ca1707d3bae2587eeeec1cc0f2832f817ada98ecb1ee0eb804e9e798beccdb33e563a5c5a1ce992f95ebcfca488957b44a57045bc7cba915697da1c294ace1248d622b25594a7790bfc899ab4659c74745d5e84cd8d44c074581cd9d49a183ca008544a20a3623b541e833bf10b409eb006e2cf70e7c4455840dc812e9e30f583a624431dc29245cda73094006c37d35c50768f173e87626e7a2bb7f3a17a7e7791fb4be9b65a5b858aafc595a1237eb810ae953b0e5c7713d54a494b5ceed4bdf2bc3a1368d502d9c385be8559ca2bd797988056faa3f6b64055ad034b50c0d51b593bd0694b0304fdeb50e7a6a524ae3db74d421b7721872eb072a71d3aa65dfaa485533ecc691b32c48ec5dd84a444a57d9a0ddb682390bf9c6432e2f834169d4b0995e2c53f3086cf485fe0a9a74dfbe844f94e6621bd679add588d9022a02fdad1061c7314c3e3c0cae73000c17a977cba9115eb5815a67a6154acec825785ebf0a63a34e58d611dd59e8a20dc8fab868673a8ad3a08ec635235515da9258e14b234f714ae551e70c4808eecda82945c0faa93dc574aa6426ffab074ca1178182a840e7f8414200edc0ea70914f2f44d1ff78381d21b9d4082501b48570b04b7b72431d69011e2a22d4bb7938397f30f8b5052a05e7c6fe5bdb58d448af9c2ed3e9a3fe13491e010f505d1cced34180a77e69d875c3f0efb212edd26c4d4ead967df311eafb6912acb34e12e42503c7391b49c2e905f87b933eb40428bc44d2f42c6dd851cde3f3ee4419bf3091a48a0bca5eee4f767837e6c94170a9912564122844300043d0cb290b45f7d8ff33d01647657c137b0c53f08b79ed25a35622b4fee7fc96c3230e014616e052601bc8d6ebdc11431eb0014e63f302b03fc46868fe5b5c4ac43dbfc8f46c427beb04aaf3d12d2aca339f2bdc31ee7b4e8661da3e16fb652680a5a873e68c5d83575d14e79358177e05603151d5ae64da58a88d7966160e53ac5707775c15ee5ecfb6dd901f1e7ad88b5ceb241c79d5bf55152268179d0c7873a53b3536b07bda54fdba15dbe50340b93ca8315f2696c2b580d9e7eee0a90a59e3dd6573f871b8c9c6e1d08a18391a6f6d3b61ca7ddacafdc493dcb507bf64a7728fbe9ace4bf743d93bb24860065d042b85207441532a8459c2bfe20911258382ea86e591c56fa574f449a93238b963e98059fd2f1c0475ba16b51cd8a4d84ba020f51f67f61971ecd9ae9781af007a9a8491e3aa5a49d6d6e2bd3fd50c206de854528179b19c699af0fbdd3f163d0a28e2cc1559608cbbb613a8651f51ef6d35ac1d34386aed2e58206dc5925268a04ff5602b2d7c0bc9d114f87b0a02266f43171e651961fe3fd07961b5f37e4e6a9045c8b6e2ef726ec8578b6d310d88c850d019b9276f96a1d3368781a481c973fc90b8c7334aedbeaa52dd92168bba0d66a33ab15eaf3dfe74f1a0d12aacce34469b4b844ea9d80c00d29603ca7c77590590fd2a771467d28ac253094a11ec852e3c10963794df44c191dff91fb2a82dbfc693161dcbe8c3134014546a9e5bb7cc9a7e1ce313724b486cd9ae59962665f901e25aea446775f1e506182e5e82c561351fd72eb664e20d1592b8a2bb78800269d0beb75439f5f0beb382ccf057a54971de89e4e5083828232728c5d6712e0395e9a4840075b2eb1f95240138df682ccb868cfb1f9313559c29693bc52ce47976c5107f7e8cd36c19685fbebf783dae7eea52d81253be7399aafe3177c70eee68e994cf7f8e78355a7253b61882c831247b8e207dfd2e6cb265c553b0cc0d2f78441ce51ea89ac498c22acf982efdb0f51b1d8cbe178021c45ab8d9f3cd5282d557a9c7e82b6b099f28c21871e2925064d796d924231f298abe477e43820c916890e7423231af13158b28da7831e2768fb101ec31dc65ae7a9cac367053ae26f1232e57a90b0f3f294089596cc3c2c55695df48c0ff026c282121280d658d84c2d99177d7121adde4468f0e2e6a57aff4e791b5e15167763088951bac4fd5459d9ede0685e325d04c2337ac6c2282bb07aa494e95687f1f96671d8e12bbcb0ff2f0b6b54d936c8e5be2ac1e6055ebbe46014bae56f1a0b39406807b4bd7eb0dcfa6d48e4c4827777b5584c4f099b8f0f18a22ae7ff48e99fb1036783681eb21aef62572543468f1d44a0c327834e3284bcdafe7ffcc9128d9646187e0ffa0dc4625fac53b4e1214e6f3271ddc1750c8c9d12fe2ea553e83d167718109e02557bf5f72866746c3845bc337905be511bbb6695b70c55a2478fd6053ce29529828258d28080ec3bfc2d9ceba89ba91b5d47673452e7a79ada81ea2b6a3321ac18b9109b11f0ed8eedc56171ff9fd567f7f0e367726cfbdf904364dcd98f0124f14a7913f23ca53a6a982b6777575adba6a213110f91a02e75265ce93727e54cd490a40e995f641db51e929c094426c48e7f11c7383140a2718286c81de74d88c5cff2f0f49b5e52d53c4044e98cbe3f6a5c27f8d0c56d90c8f6a2411cd848a563a362dae57bb6646b524004b7a3b8660678dd26676ee4279528b8aa8150e77a466d3cc9e47182b5d8ecc49bb7ebd236860d9e3d11426ffc723dedf50499f055975b6892beb29ef315e7159890528f7c04c6d84c70766cc8c53facf682fb42026c1e5eac74e7c79b204b2dabcbe1c2051861c732946f546b620854c95ab928199456fe79642da37068498337f06a44a3b860ceba21af5648e64e25619990c76d553365fe21f495055fb6dcec5c624c0d96ece4de8b92d9fe354c9441c8b3e498d77bb1b79ee5ca55d00530faaa172aa5b8dac850aee7c38e4bcda283c98097a91e93fc43f9f7f16f5a07d6061ea4cc9f2b5a566770103d6c3d977452497883d0b7c65c137fd69c721b656a9889b0f22ebee02685e1e599b290a0fff177ba442a861b86e9e7cd6cd26abf6ede74b952b51b86030b0126b392e80b8eb4657939388c1a9aa3ced97518024c7472cdbcfeb5886d4b56e509a8b2f420e4fc1f51a52e0f51392e5c7f2e53ba8f231c3b617bf72c4df538ea24b2e0690571be46277ef0f7bb8581b916516e43d82b4deaf8038a9370456307a371ac9394d3a3a333f5be880b51d91010eb61a0e8538984476215ae02e9452303f47aa5a1286ef490921a65bed267e81b779e41ca422a3889e1f092d5f50965f686b8e458894b3a15a638043c540d3c88501add9a2513c0de87773725b7d34683ae35f6f91a6053e12fbfcc38c7208167441f7800c6d6eada57057d039490d485223c83dba134cc4f5f099ca6b73d55d505fc651fba5c7267b00e0ef28c1a62752d2b4f1c625d7be4bda0f0e0cc86fbf3607135961dda8f1ca47d52cb6ba63e175e67812648d02552e7f2e644c679907518342d060afbadb8f9d02fe92d76f32329c11d2fa35dc4e7e11cedf412bbf1a1c792bd1c6c2e958efb2576a08db81c331ab054a7c74d52989901581c9f1393b412896650ca634de8e58a04b90577cd618d230a104950744114730113ddde574320758d3c0e5df5cf983f3e2a7348075a2318eec8f7f2c1c7cde9a57449d58c31b22b0207b9a4ec80a9245ab3c73fc92c87a56651af59f0ad693bdb2ef1de8c2b22c5b5349dec5c02dea98216e1a33a9bc49278b041fa753833025db3fccfb88dfb022af2fd9f8a424d3c43da9c4d5ad20e552357a097cb0de7ab9df461cd73e477600ca522dfb11e367c8bd599f5d1da00bedabe6b260aa5179f3099d99524a8387868acfbf0a2b43bd1bab2fc06ba0cc42a1f1aaab547a0d7c502f6812295d3c48a49bd14d18f5036b4b2e9a7f9298e76df1a98dcb178f54f8602d4ff62062760c7406d95bef659bb6c985b1caf10864450a34cd0d8f2ced412b1327a33c42e7dc91f11042f4daeca5eaf5de10fbccd6305043d4a76cb472dbfbb33605b105cd8a6e65bb779cd6ea22f4803a4a0e919ca56e83eab4e1671a008084a9f7dcf637ffaac19cc84d976ac631f202a1a71b2a46903d4062e7750ef7d3f0324da40dcce38cda1ea14b5f5e3273c0f07f9dfeed5b078bf916a5fd9d43890ce0e26101f4cbcb988c673c61fa2e19f60f50450c23f54c74b97211027c9e0076097f3160c893ebaac36f44fed6f461324d5d9937d3b9a90dd23106a2c3b573351e386dce1664c95857de4f9f35041c952a6e62a01acf890c42a60726f13d0ac1f37f21aebdd39c5ce226ab017a7b44df6f6b828b0cdeb2ca7f616caf7d45f638ee61fff584d196418354e6270fc2375c87f004ed42cc709e1140b532909691069cd6c8fcb32c0fe1b90434441708cf69ec936802a9023161f45ce78cbe0b194af0b3b496a646f9316637c003dd0bac17baf0281bf1e0baf5b31c41ebba3e593d98b062606c9bf967b1f2875c88d62d48a601c43d82427c5866814e0f07d0dd956c92e678284e80a659d37c972035c21a372326914f47ce337f5464d47ab5f9362941bb21e07f2f2da90b2438e5e122649f12b2986f9fe966e0c5c7636a88ca89781090b43cc9a62c8743ce9ee47ef4d5246cc2c130e39eba5a884293245bcd38f25550693bc34c36fff506c3adc5c086a46d5167a0756c46655524b7656626f029c11ab8a462e81f93155cc68ab00e53699b2acd484619e77a2e6ababa44645f18c50438a835e7bb760433ae431b2b9616ac58c16542682dda8b45aeb023f882a4fc38edd9862884fbe6133e15684d5af1d9053a88fb3541204da9957bd55209cd53807437cf98025433cc49fbdf8ecd8024fc41cc908f675c94688170d00db7fb4238705f03b4ebf20c7a031dc85900c8719aaa8581ec1c447581c545dade631424989c07f44fbdffe6f379166bb7b4b29a50ce90bf20b960b2b7fc2cb122f45bc0cf13254fa93fd1410b102cebebf0874ff01d8f1d4233a7e3aaeb4e38a01ccbebf006adf4f00b3ef1fc0cadaf71381f6d17cf5cd71651db900c6fd439c7dbf10fcecfb8350fbfe00b47d7fccf8ebf8e7c8cf715c51c7b105c0f82d106ddf7f641c6dc6fd3f8ca3ea83faecb852c3f6fd4556d027328e6c0f6cdf2f337221a339a6e34a9031edfb7918f71f4135abf452226a6d159b86fbcdbe8fc4340bfc932fcdbe7f0da17d3f88edfbdbbe5b152b2365597330d34f8c530d4f90a5edfbd9beff8497314cd52a03656163b47a0513d1be55a90c536c3163aca5b46f159a43a9e58ca1c64855680e6d4b0c3506aa4a65982d668c35c6a95265b0b43138cb8ad2d29a542c49469a8309b628acc924ad23143c43d6c4d292ce910c33c6da372906fac5485148156afadbfa1c5a520c15d481ada1ce40736075586da8aa73c64923d5415da935521aabd5460d74d5d23875486da0354e1aa60ea90db4c6a9579b86b95a6dd440572d8d530775a5d64867983474586da8aa73c64923d581b5b1d65067a039b0a3275bcebec28ee7887ebad27274651dcd57dfe463bba2fefae7c872734c571e7dd2eff0e4b72031fcf02428dffa617a204f8eeb97c4f41d4889f23ff8a8961f4f427a1f3bf0d295a3f5fc773cf9ece867ca24a3ef31c37fd4b1ae2c2f266f95885a49f8f3d8a14307ca76dabedb95fdb0a808f52994daf79fe8484b39dabe592f7259fbce91f69d1a61cc151d2a3a4c994ff134873af212c62c75a8a50eb3e4323c878ae2255775a4395c5616cf91ea68f99ac385cd81ea6075a09c7569739c3a561d678ef5c5e4ed0adaf7dbac9a45e23fe22fe7cb8ae374315d549a6671fe82beb06ddfff72beac384e17d34565350be525754171a0fb057d615dd21b2d8e75a65926ee72e2486fac38da1715878943fddc50fb7ef345c561e2506fa8395cce9716477a63c5d1bea42e280ef4068be3a42da5221d6c9c354cb02db1221474da30c1f6c48a56d0a98369a33db19e15a47e6e98ad1251abc47a561a6aca0c951713a5631d9da71c2bc85bd2d9b228675328aba3e56b8e7625f53ce9b272f1491853876a7a5287d937cbe750798ae2629eebe9a2aea616655d52940db12fa90bfab7257af2a5fddb2a3d89232571b49f276faca0275dcef18238f9a2729388e3306142258e43154f780ed3070fffc1bca1aaa02876b49e5430079694a2ced1c986aa3a49690a1dcd304f3aa82b9564234dd54057689ca755db37b85afb26f910d321ed1be5836a03e54a44ad910fb21a270b57226a9dfeb69efbb0d23053b80fa95eed15dbf7ff00d32c9093d81c7112bb509cc4a70af7e4a0daa436b0232f1b34868d1aeb52bde294363ffc606ad69117879377c6769cbc348e93b77d7d4fe39ce1fa958da92a7fa83d0d4e5ed90c4e5e75c549199512d2bedf8754b34a3196fad3fb30d3ac133fa9292a0ff2d30f361d7f9c3f4c1f649f95f7f0fd3eaca768f3524f1f2dffd1fe407db069df2cff317dfc50615ec4fe58d136e64d6adf8f85fa63058202697da831bcab3e7ea840ce9ec270206c477db03f52202c1c880944eda78ff647fb03fdc10249fb8ff3c7ca68e31a6dccf187232fcd2a533ee5c30f5f0627fff4a7ef3ff0c16fe1afbedf46a659291ce429a2b3ef7da6ac27e985a0d9f78e31437515f152e664ade77a3eab8561992298344605f152c6d4abcd8a3161d4f504c34a61d09894c5b2d01816e68c61b12c34868539636058561ad3c2a031ac16a6659930698cca045987594fd6ca3a63625618d564a93126cb8c516152560bd3b2d29898140686cd81258385aa62d8550c5aa4a6c29c7dbf0d6a03d32c1328d3aaa90779b4e77e9b54b344bfdf26a659aa4cbac35c55be63a2a257779c7be53f3367df3cd2be4b6f2aad2474d4f62dda3cd4be4d326cdf278fb223edfb64f337f15851bc94615178b9233de1250fd3c44b1e9cf3584bbc942977a0e58eb69c41398f102f65d41de70ef65ce13c52997487b9639d3155380f19997687caa34d711ea788472b83cab43b541e270f74c6944977983bd61d2c8f74e69451779c3b76b4211eea0c2ab3f6fd1185a60c7b5b9f6b477a5b9dd3bcad1492c75a83ead5a6f160fb7e1b53b3ca1f6a9a65f6bd836aaa7d7fbadfe6e5e354cfbedfdcc1dc41f561aa33e989ae6cdfbfeeb0fa3867d41dce1ea68d8b455934edd1a6336ddf3bb43dd21eed0ee94cbb433bc3f6407bb03ed21d501fe8ccda6307b647a8872a9a9e1dd4f7618233e9c7144fcf0e6bdf3e4e7046fd9ca01eab6707f67da0e0cc4af6407b8876403fed1b9c6143bc15f2d295a3157ab2477a5b5f18fed7a315b53a9eefa4cf6f2b8597ff294fee702ab2ead5fee840e435d31651c7223197ef8c57af70e8109dac474d432c3ef3f303157fb42735e5f4d1fe484166df2b16e8e783fdfc50417f5b7faa6cf8e9e763ed5b89a825e2f7f4e48fb56f91b752d01057226a79d4b66f2cd4be3f3ea4f5a19645646511f54691d84b59243d7d8eb2084caff60fab6681bc880e4eba5cbdc2c14999174e8a2e9cbcea0d4e9e74e0f812689a157a25a2161328c216f8667a3a591b9cc426283ef8a2da37115ab4efffb230d720ab99b64eb60627f10bfcefa4fca7a74f61c13f9da2075bb5f3222f83a83cb468cb6cd1e0243e3fef41bf0fd7ce7f443047df61d30f2f4344503f2f96540441facf974140bce441e465ebc3cbbef296879741505ef2f0f1920753979d1df156cacb20292f796079c9c359f696b7667012bbf009822fc86082298471ae6fa6a4ecaa5960062e82a08133acc154db14f454d140e3c20c81d9843665ffc94b8435c53ca5d88b0e7020075204a10daddb029fbc58b01d94a403265250c102278ca1755b1d538b73071990618a25c880034f68ddd6bb88a0b6bc8820830d74e0032768dd56cad9ae5871c5076a00043604addb3a71fcca02ed5bd3e00c59f4608b2c7cd1ba2d90fbe0ba58ac7d3f1155b38cb07ab57f7667ac8a9397a5c9e0e4a5e5c0c9db12796956a944d472e568859ff20f7e0c4eba809d07dfe3a4cce9fbd3bb72b43cdd87bcfcd1b692b470f2ca8ca0467e34121b8d9cc69b0e6935ab3472c660e866e4a5572d9c74e170d2bbb27ed5ccc91317a7b8058d8bb3efafa9a57c470c818cb8443f22954c27cfe41f0aafa6055150a9670285f8a97cf8fb8d98f8f913388cd6af8c2cfc537e7f0d2de4354ba851420d17f765ef67196baac0c71a2ad44ca1c60a3557a8c1420d136abaa869428d13c0b1c68b9a2cd468a1660b355ca8e9428d176aa050f3849a28d47c515323d3ac9077b8c8b790f5fd1610c99b043309b0bebfc8c9fd879ecee79940219e7e7f11140cbd68442a99521e74e9d3090aea4b3dcbef2ff2d2ac960ba7802acf048a536be5994021b6f83381c26b8dffbfbf88a9594fe8305a4ca07069b1701a23a85a3445b82ffb9940f12d1a2deecb7e1a35c3ecdfcf479a27dc97fde348e3c57dd9ff238d13eecbfe9591060af765bfca481385fbb23f65a4f9e2beec4f8d3447b82ffb51230d12eecb7e94912609f765ffc948b3c57dd97f1a69b8b82ffb4d238d14eecbfed2483385fbb29f34d250e1beec1f8d3455b82ffb45238d15eecbfed0487385fbb21f34d22ce1beec17471a25dc97fd9f918609f765bf67a4e9e2beec0f479a26dc97ddbd70be8349205eb5eb170b2dce4ec3e1a4e77152ec3879e238f91b27559a932e9993329dbc48503b798d80f6fd5804f939fd26010db24ede23b4eb11dabe7f05b204a4046509b7b30abec8b7c35cde34de7bdfbddd7b379d37e6769a33914eaf4a24649ed3322240821430c6590a318b79244f18efad23bb6c3a4a97ae5941e38d7196026729c49c7987f3b6f7debf6d9cb107ca881c0edebbc39fa5c018638c31c618638c31c618639c33c618e3d71d0decd77dd18040d382488a1b636f83a79cb5d67b6ffd19a0ed1717f6ab6f7a3b3d885971d3b56dbfbadeaffde2cc609bc126832d06db0c36196c3158b2e1195e6c5d9eba5d826e35187da361acb7bce52d67ad37bd6dbff7f652ffa7d169b4d136bd6ddbb66d5bde366edbb66ddbf2c6e59c73ce39e73cdab69019be8cffd318e39cf3a6b5a61d614151dc1cbeda43d35bd8365ad66260b76d931137c7795bade7dfa190d4ff69741aa53ccf03bd6db6a8549ffa54cb89a347270c622c827a74c34e9642044119510443d40f446fdbf639ebd1e7731aa53e5114412050d63a73db6badb5deb4d69bd6db73fab7acb3283d7b5fa2f032541bd14432524c05d52cd39346b15044eb9934ebd9841ac9482f51ad6712ad67116c2423896a249ae8358a9168a499c835828d6aa219e913f3d03a2ece68e6c1c29847d609d5382f8f168e6a215967267279b07014eb396422cd382fa2797f5f3d77a42745b09e479cf32a2399e96fab147678ca4a7af5cce129b2930e4f21d1385e92bcefe2d01a3d9cef985e1c132dd6f3732559cfa558cfe187a78c42b59ec3ff849e59cf23949ff55c7af55ca2f5eceaf951545c3d7fa9d6b3ec647c984aad67d3f3d2b4c2cb134caf722d859f6a295e965c285e966a28bc34c94e7879a29df8e965e2e56956e265e945e2658936e2e5c925e2a6102f4d1f0f2f4d30bdca0fe225d38b97269a2e4f318e972559cce329a25a49f6a2c566a69a0c468b794f9e5cb357a96692bd68259736411bded0c40630c8a2755b1c9599c9058507be08a31606145ab7e5e97095d5347b39420ab21006145ab43cae2283e11fb08104ae348cc06c755c45d5b5298c60052ea820044968dd16c75562a45a57c9299a063f05d5ac17e773ca0b4c79b552ad6695dce74fd53a3c0987a76470e882637278128fa7d6fc292e8f27e9786af644fe9433c5ea554ed1f42a67590f5bafacb89a10f788646f7ffbc699c04b8864ca84f5fc15305794a82cc14ab8257b73001b3eb56ff0e423e5c993ec74effd27718b6bfdbaae7a79e07e9b1097604224ef115a2686b4ff4a442dd28fde95a3351af1527cd2e8459f1f793a9ddfdf03aa59b7e5890f9385ea27fa50ca8b381328c21637022a93f53da41d8780a1f6fd9f58dfef49fbfe0eacef7ff4d5f77f9f723a89e0b851211a393d2ceb39df1e84d5acd3ef0f42d3aceff7076983d434eb7fbf1053884bb346bf5f48aa5933bf5fc84cb3c2273de9227355fee495edf0e49d5d96b6e3c9db92d874959ec4e7c993f875b560fb8d987af106243ee86f5020d48d0825ba092511a5789250e8515c14e2204e7344845b50dd264e515fb2a27caeac664c4e597cf6a0cd9b53cc626d02c928c6b975c9275695c8ec671317915711b7183d92d5515dc12d0b8a12575633656ffb2c2c56fb16f10a834d99cf6d46c551e47133c6fcf8644e5778921b259ef5ac6fddacac3c8959ae44d462e132372a309f4445a5dfa8bcca93f844f578199ee406c593a050dcc6c74d2af5e4bd41fd13e0c708217a1911cb0f2c418a14f952003f040144a210cb0f0f638497321f63e451658fbf2927f0a01e3c78921bd03f2196ae1c2d25781216b761f56a4f8027013d88dbd03cfb9140fbfe23544f2a0aa1210bf2881e10b67dbf03401e557486d2316c41ebdaf73300edfb17a0f6fd0a30fbfe2240ac671585548f0962f5cad37a5a912a52436c88f5844c4f0142a68725002bba7a553386d671f59ca056009e5389a825ee54b3a06dd5a728fe90b36fd6d62dccc66a9485979bb935bbade7deab296ead4e597e082fb773abbadd58cdb237bb4f16ced4aa8c91aded1bedfb65b853af9bbadb8d72a75eb774b3fbe4cc235c6fe85ef7d6ea1f5633654f14863d55dd9aa9686bd175c8939bdda7e64c9a27b79486df7cff3db9a943f84d4786dffc3fb9d1bf2d16bf49497952affce67444081a948ad2a2c49c98276b101400ccbe5f0027e7098b627bd8bf3fc89768dfdff65d048542d7017c91d4ec3b6506814afbfe023c10272aca29042f5366894a4b1496972705e028678942a128eb493a008e62a25027ca0911fca445ad2813253d394f58bdda2815a545414fcc9395a3c9d0d8186ec3dec47ccc0dcd3f01fe4d49c36d56bdda374dfc1360eb66c800645e899fc023f9259e091956902f8f78f29178097c122c20bec8970f78073c04de888f408c105f0601c407e04b20be34c017e089f8017c49c49702f872882f15f045fc029e01df8077e5680d809744f05200bc1c8297437ccc0be089f801bc10bc0c829701e02510bc04e2c10fc007f142bc0d2f7de0650d2f8bf0b2c8b388f0b2075e0ae165105e0679191e7849c34b9a1fc2c337d1848804f71ad9b5b17f099109b4ef5f22edfb91a8ccbe5f09b3ef9f400e6b0bba4a8f8c2a93666431878c39ac4948008923888c2de90a95d1b29c32630e6a04d4bedf88b3ef87c003d0bedf013663cbea94c18e2c680e03185b1ad0c2aa5a06086094a12e4086caa2c68c399c0a6051fbfe2272684940cbba42c0ca94718071edfb8118595270cc01654987d4348b871e386a97c6ec67fb3ec1bf7aabfb693c0e1dc24b8fe5a8a967722c1157b776315cca413d7448aab61c4ac4d4ac21dd7944a5f1d2211dcb3139afa643bb96f3386787766d7772aa97762cc7ecd6cee4520efa8367c2786cdf1cb54b4536c4c178ab88938254ae0d712c1e2ae2a0a0b533392feddb8809eabaf3076e85f15411e7240057226a81c04e0463c095f5ce18f5343fb483a669a7e5b09ffa999df5fbce0ea7eda8df7776386d47e5b09ffa999db4b37650cefaa569a705d5cee9b5e68782e0da3159efec502c7c11c506d09006363551b5042ff041146b104118addbaa67aab2623849d084dacc5cd1740505e10b1b38c31568008453b4551648f1031560318696a7ed61bae1892aa2f08431b4442a143a48439334b85a21b60a5bfc80c908a4208456c8fcd103d806d2a00130b43ca88ad2a2ec6aa6ea498bb227eb49141af324ca0af3248a7992ca3c896a65b8cd6ab2b8cd0c95c6701b9685e1363414166e233b51fb36d15465ae29fbec3bed1bedbbed9bed3bed5b3d57e68af69df6bdf6cdf6ad6afb563b3580610560b8a14993d6d9b72af3b143ce187085e9982cdec91a02aa9dd36bd336064c51160eeb53693ed34867edb070581657226ac9f0b2c8bb72b47e78f25b69b812516bc86d85823cf99d46b812512bc608d981e1250fefcad102e26f4becfc60233aa5a6b30dc083a15534e4a49a509852102f1ab134414eeb91f4875388a769831421c2f6fd2615ed7b880fb2bf88cda9f5c1b4d69452017c11514b3a6d78792a4d6b594a4b51cb496779624b935a4245ec109c745a4d69e914ad42f051ab9a4a66a80d828fd8536a3a496d28007cb4b2702078d9c32b11b5644253145150ed5b264461c49665177951dab791301d22b232a259f32c16350280e7e1d5be5f5c3fad0f6f046c3f270f3dac424435c8c7e67908cd8fd9032fc3b514d5f2c396a1c93f26007819aaa5b87e5ab0e59f334c45563441967fd010155bf1048bf04f1a82c4affda89cf6e46b4be707647a443454c1b4847e504f1b9ea06882d00feb494376e549716d534f7ecebe3d603b3e19aa7ca40957506925e6495155e1e487253f26d83af24a442d10eb417978f0b38ecc904adb776925a5413e24a6a35325662cb1aa904f9d68ccd9f797486b0f1f03424729cd09fdc164e44b224f034a47ea115e9ed0d26496a41294f2915a9eceb2445a41281fa527b3445241271fa1a656aff64a4a453e3a4d6c49257d78e02313002d9957226add487540cfbec1196ddf68df3a9cfb45b62dadfc8d5307b3edfb4b33561a66df6fa365fb7e95192a0d1d5a56cc7e98fd32bcd4a12d6db0658db59c91721aea0dd3465b839da1721aeb8d5307b3c68cd508a7c1de404f1b33584ea34dd17308af6186a6ca673d31b12515354be789989adad24a4afb26a92814749a25b6ef524b5a4729082d1d89e9d546f99154afb6993a02d3abcd1e41f56af3232f507a729652d119925a7045b1a5502b5243b464a2ced4a815ade1dab729eddba4a64aa80ac90c45ec894585780a645a3b5722124be987934e3ea4266afb7e2744dcbaad2f926ad60a0ce695885a9e14aba29ea7cce3f9b1ed9b45a12ba6874d695552e7caa96a568a99b27e54504fdaf7b77dffc8cb54cbaaa4a9952231cd4aa5a8289533a4f6fd6cdf2b2c29e9a8b2925a5556185ea6942969a9925a55d694149533a5aab029292aa95445e50cb1624afb5151574ed08a1942c554fb51494128aa4da52966ca0a4a51512a674a85fda4524e156e24d5abedcad1023d9982320213b19e4c49534650bddaa48af9e1465e272a2b88974fe830c26801e095885a9f033c023e015fc42be083fa72004fc413e00bf00660c57c09f325cb97e397417c005e881fe205c0a2f9f04b2a8218f2345f0ef952e64bd6973c7c9017f23d3c9177e56885471e003ffc1123ffc39746be2cf235efc3db3c10efcad102002f8ff0f2075e1ae1a5910fff873ff200781a5e0ee1a50c2f59bc643df8323fe4693e869730bc64e1e5c8cbf13fcff2301ff32bbc54e1658a97285ea25efcd4ab7c59d5e14dc02739e7f71f0e87f87c3cc906f47f5f6eff71d410df871ff224db7f9c0ad4edbb058e9f1d02715b190ee2a39ae5593dea5de55f61d9a3f6fc21ab591e54af482451643d4cb28a332ed184d83924b836f27344706f704a905735f0f4c083660feae901e7d42fd1e3f29859959fe47c21de1cba344b9fa13eb50df2eb1d5c16e7d4525c8d83ab6178e63b49ad762178cf39354bcbf4eac433dd496a59987377e6e7b44cb3c0eec433f8dec09fff091d3fd98d20e3ecedacbab5dcb284cd5b1e562fd994e825784ba1207f40c40fa2683e7dfb4fdfb6c74d30a0bf89dd9b98a8215a9bbbc096e617db80f4f073aff928abc42122ee1dc775dd7bdf81dc1198e359f5ffffffffff618ddafd769c3920e627f18b09627ef2b240ccef01313f7eccc4d346e815fe7ceab303c9787bc1775b482e83180c6c846675e14905b0df107858d3c420e2ff4efc81fc1fc8ad0e0c2c063c835b8fe7ff3406238b4e722e5aebd13631f4fc7c09dcc5113442b3b4111f0e87e41b1220fc0e57821a02b73a8f5b1dee025be1bb768b49e7a1f05ae077236ee13088dd0a39144f7c5a9dcfad9b63360fdf17cee350c877a4f31cefb76dfb1c0ec97d73aeec03113fc9b9b62d6cb4ad6fbeb11bdb736e51e0d49b38f50e34e2de303af740b2159cdeb82e0c2eaa3f799ea757d7cb24502f17e27d52ecf9eacc0451adc0de59354ddc9a66574088fdd2d0aa46bedb428abd87e6de05f1cc12b86f9cf7e3cd6f56a17ac0bd860eacb14a26dec75a03db11c4fc57d5ab2bf3567176629fa66af5ea76206d4daf30c623f078f0cc8c9e731651508113c31462124c1d4e882de1d55183d8b2734ccedf047fe6dc86082403c94bb0129c818078efbd09f1aed7894ca8e870bce73e7f06c4fc5e9701717b1c0776cd3d0ed659c8709c8afd9f55fab7bf7bdbb6debb057cc37683ab433cb15002da2f164a307b8d7eb1e0a2091dbf889f547939785cd9e542c5e1cd6ab4991ef806abdf7739725916d02bfc1d96ae7fbc3318764f6eca8d11bdfed29d314293a718d0ebffdc192440fbc68c6694b8fa7272ffa7c78e067f8f980568f7d25b77beeb9c4e5c48a3bf03ff863d34015f7323f00c11f891c0330630f1224a0fb836f09388c0331d1f894220d100453ca0011c2ab02c5d6badb5d65a6badb5d65a6badb5d65a6badb53692559a13e17c7ece83238af3b7d5d19b2a623497a7ccfa567e6134c75ccc023ca373ef8167940082679a0882391170f01d7fe8838eff6345c74a04a1e3c7df04de41c737b836f014f806fe2a32ee41c7af57b658595149828a4a0a12525252b2540a7504140ac5082828274538393969713a9988603295b2289548589048237534125d21128586100a81ac0081c42a44f12384cfc713048f27044218823110fc7ef07d1d1f743a9c1e70381e0f3cafdb41d7713ae858731d6f1ba77d6f1c5c1e5aeb1b5c1e39632ab27e0cc353648e5f18bd42cc38d55f88a89aedf3674e4ac0057dfb1bd284b2d0378eeafe0e4124312cfcf27fafc712f47efbcf83e36ddd70730cdbac103d8e4d6e81acda6a10f37fc6ef3f0ed4a1674c022c2d5003bb27c4e9d7047c0deaff5ef32670ffdec393007b668939ccbc09f837043f8eca7fb770416f3b4113f01479859f336218876dfd9d340bd7e0aef0e7c00342c78f453fe113be3011d6e102378eb83694804927310cc32ca059f8752fecd6bc5ac7f8052ac14bb012bc84b3c5e0c2775bf2fe4e7e0f82fbcb71545ed2ea1eb33818ff55f54aafb84d04e2e5ccbd64cb990d5adf0c73ff5eadafd67f2feb92fdaab2293afe1cdadcfe83ef75e0fe97c7ddf98164972e6a968bcb77137c1787a801d2fbfac5c20d53ace05e7cf91d71f1377174472044be10c925418800c1413a5cd8f6260224abf626850824bbecdd71dd77528cb9bfff350b0827557def2dc6c4fdb9df96bd61af0a4c2882183819175a68c1854cc60517322db450b5a8a20a2d54550b2dd42aaa8855c1031e54118b5551458c073cc0a20853a45814810758148107581421c5a208535c1c1b87e0fb3ef80a97bd75b864d595c939e75ce3aaf7f28caf104931e79cf31557809f7bf5fe6cdce7f3d1d803e3bb2d246e7bc7755d0bf7dbd6fd369afedbfa3d9ce34697e5a2fbb6fdf6fbc6807e7befc6ecdf1ebcacd26f1b132a9268e9a67f42896ec4549865d6f4a727f18cc9f6b97399241257d2626ac2fdc68188fc2b8d4ca8d8440f1a974082c3e8a06fc2eba1ff42bbef1133c1aeacca1da4c110b7cfe3ad397b4b6d5bfe8cb977441b37e2380d6ea3e847631397d77a62258c30c28883d92a3de8899591e837d18fb6e86fdfff6d4ef45d4823da9f55f9bb1009ee4d4a3c3311f17f9ba8f47b6ce23ab5480f7a20fa88661521c46539e0ae8ad02c25f4ca01974581bba2c065612a609a856554c840239ec255e52f8d580bb2cee7d1b348e073fe92ba73fe923b7c52f7cfa5574cacd8702cfcbc8da317891e9b3966b46d2352f47bc439a25149df3ee3d643a3135e17c5cf166ea0cddb9e13d26c9bb3e5ad3bb8733dcff6f8c36f566120da835bd0f37ff90abc849edf33f573231549b4f46ddbbe05b71e2578c9de3eea775bc895f51b59d1f393e1490f6e67fb6db18a631e6cc3278d8eb2f17d42e3c409e4490f7a7e149766a13c1145a3b85612a507df7fdf885b28a8b4e747b9346b058672a15c2b3094abe75761354b25e557cc534d6c699e278aa713ade7dfff817a24310e7b58d9b0ca795baa4c655d81ada49a55c2b8cfaf579757649ac5719f0cbb330f97f52bc788a8dee5beacf5fc235e6a172622bfbc9598667d2eae9de4520ee159cf3239d3f42abbf0cc022a5cc3b28c6346e41a2ee558867d42fcf25cd928bf3eda856177f698f6c938e6c1357c6b25199e5da68c67ae909f841e1e7a54362e36dab070d7f4cc53e21e0e8652dab24c85971b1783ed9a9e85f896856a1ae679f5fc240eb6639ab6c9b2ecc3495bed44cbb658fe93ad655b8c73edbd5d3a06dbb3adb6657a9535f7daf2363371a10df3e859966db29e4db0d08e7968273af5da324fed44c77ade603d6fb53deb79bb4e504a3c55d3b2142ac5dc623daba4b85ce5494bb57a9551382fafc6d552389b0be584d6b936191cef75c279b093594713bd5acfafd2c13a4fe602891ccd9379ddace466f02ec6cdbcae8375b2eec5c93c983753f18ee6d13ad7c671799c9757e36a1cd8e6daaf0ebff1843c1c7ec349c2e1f09456afb2c76f3c8ff31e4fa1e955bee9fe89cedf24f17437dc3fd1799e847bee53682935cdf2a8989ad5f1fc2a2ecde2f2a7b49a9542e3feab791f6cd6332793f51ca2f52cebc47ae6cc7a0e7db39e479943fb64b59e3b3013f8e2d4525facf34af1f28b75689d17e8727d9d0e0c7c716adfec737562208cf3d1f42a7faf8e0c8c7166df07ebcc382832d3079b71649e992946a27daf8ecc130b69245868d65d3558cf9c1af892f58cf2c57a367568a3ceabe3e25c3d97de8365f73ae48f6916c75366c73d7ef5ca06274570e3e47795d8b57102f36a5c6d73792f14c745736d340f461b79b397cc93bb9aac8371b3d249985d3dab74b3ae8b71dd4929848d3c311737fbc84ec218ecc4533b01699f58287b796860ed030b3d2ecfccf57985b4b0e691859c58480b6b1e59c889851e976716ba3eaf50e679796860ed13c63c304f0da47d6221cc13fbb8c0d947c6d14e6625d828d67d5c9c0c152b85b10ec6d550b4146c04d63a19f7ead9d5b367d6b30a17ce7a2e659021ad675258eb59c5447a64dddf160a2739313ee395885a26104c947d683d7fbe84f58cf2a9a180626248069ab5fc8a48136b2019b39e4520578c0789ab9f01aaa97e057ac9789528e3339bc14b506dc54bd04bc54b31268397a11cf867568666258856825ca5f8d2abfc31b808d3ab3cf2322403892d5cac95e2ec530bc54031100826ca3e21ce432a21170a08d6334916fad03e219809244301c548b39e43b59e4331d30c5523d17a165d3d7f643d9b683d835c3d8bb09ec5570fcd544454cbb371f2047af54c22c5580aaa579954f9a4bc42af9edf0991543961b0953fadc07a7e95976695a633e5d17a9e7162b0d47b9450ad67d2e8d5f36744ebf9238b791ff232441bcd443118cc73f53c8279cfa905fbbd1c83fb569140dba1ba3de1cb527051702e206429b8278090f10cf6c1131ce9f57b3934fac63730ab8357fb3b600825c5c91655c78157fb3d4f14f509ab902a5d07666153aff04c896fecff9e44019f0c751247df7f71a79338b677676bb97f7738f9df7b9c3c81fb33288aa713ffdfff718163e055c612fabaaeab108ed39a0855d843e7bd079271cdf3700debee71ce732312aace7538121c46efb847e1f750d88b378c28cc71ed66157723e219c678cdae2ca4f0814f46d4f15975f1c86ddc08fc9f468231c69b7eac6df66b8cf3e31a9f551cce26f86e165f6ce1f15804f30d0c515facb1c62e72495782755b4bbae6f46ffab7d65a6bad39bde9ad7be86c03d1f41be989a0274f26d393aaee9d1e89686b123eb9fde94fa25048f49c3ffdb66d5ba8c913218fc2f33761e8f17c187a461fa2807f23de95e947a62f991efc1b13278f7423b6bf3d9f1e48feba4fb1985071c47ed47f1e93bbe3ffb23822d9b66de31c4eeedee9a836a4bfe1f6a9178d4d4e1e65f4f4aa349e524f1ac9ee53293efa8cde481ee9a7ff4e462a3a8f1a51345eef3c121dd979ceeb500887b344cee790a6f31c4e8a386f32fa1c8eb6ffb63189ae37a1fbf64bf036a26876dfdeabe9fa866a9dc6abca20ed37dc1e46bc461842153dd5af118680f6efbbe03692182fd1b9010e7108a3771e09134bba135def702fc71cb15ffc6d247117bbffbc3dcaf879a51a7de8f437b3505ef437b34a4fea7ca9f328e3cdab2df49d0e1f8d37af484f7aa2edfb167a52d5371c460785d14f79e34e9c74d3773a9cdc9ef35fe63c12eec9b28b7f2f8f8d3b7152a33b12ee993822bff847e4df381b47c23dd9393da7c39170df794e6724b7fcdb293f27732426de248ad28f4aa51f8d4ae08f3e1ed183e1df8cdef337a50f4ba3d757a1d08b4652ec212ede700836fbbd36409c14f9f69cf7c4f1347e2379a473bae790dd737ad7fd7738a9fb16da74bf756a9cc0dde34874dd09ddbbdfb8569297e4bd84c301499173aed1f7ab72cc11f855db23e99e2cfbe54e9c74efc9fbdb7f77e470bf3dc7e170381c8723f1363688fbb9df4870c7dc09dd8dc0fcde1ae4e548ba278de0bc90ee8ee4eef7723847e2f126fa3bfeaf5937afeedfcb6d2e7c355a522311bff4bbea77ec973cd2410ebe3722014110e44c74389c91ecde7b1d729ef340f4f7751d67a2d33d8773241d6fb2f128b6bfe1b86d7b0e73f9b7d3cdbda25ee1bf39e915fe25dc76834d7a63139d54a2c8ed9793e5ae894ae418dc8174dcabfa1a1e8866ddcd6d7b7b6ec8fdcde4c2777188dff5bcbba941249f0894233986fbed83c8313a14c27140b67fbd79a2b85f6bd12fee7157f8bb8fdbefc271d7071faaf39dffbe0e278f7424a413ba1bd179ce88a4f3e492de79de792696f40e67c2d323b9c14e13b8dfbf9ce79020212be0063884d1b967c2e348784c36a081eec449e7fef27b5564c79170bc4914fb6fb6df368fe2d4bad9bff128bcd6cdcdf637222f3b2e78410f5260822bb6405b4aee0c06871b2fb6f0843850d1ba371b17f5eafecdbdab935eddd79c2fd994e425596f0d7c5b833138678f08ee6056f10d0c713fde577f1b63ec626449277bf49c830fbf0bcfcc5cd3b43deb39b732b89eb288820c5faef37cd8aeffc3692aabfe746d64fdd229766d272ea65372433b19aa5dffca6515a75b9d59e76891555ac651af8d0e4caff403c99bde3c8ce9d5a60451ff9b1f36eb2d6edfca707bdb9d087dc6dcd5ee0417829787c6365b34cd8ed9f0e9b708646022868d7dc0c5ce3ee0813e7d2aa56590f1557df0010f44a1404fed8118764babf60905765427479d14416f5fae63019271081ffe14bf7426533d7f0b88471ea278b3f0c2d5f3d7c8acdce39455b8659463507abe3a04db16385eeefa0744d21bb5a44e9bd35df6720744fc3a97e2f7fcf97c3ed9e3809f4f87b3c1124236bcc7ede43d99fa96063c6002a3be911089e2209240280487501220d01b4013104537884a7c3e6df820f178d8e059220c6b211320b806b089ef53c347814e270d1d27381c303815f03c347816e8ba337417e038337018d832d0b9096c6e27a1b92d818edbdd237179e0cfdce5b8aedbf6e682c7f5ad7ffbdb400eec0c10129155f967dcde38349b07c181e191cec37de779a10dc61d8c3b8cb515609861107a74087a21f77ddfb6bd0de46d9e6de33554aa1e761f4fecb6bd89a07bdedfbdeef8fd44363b140ad9b64f0bf7cf658e4756d570d118eb37ec717b6c04de39e6bb2f140a9710f23d877b2039e4e89e3b87f3fd11df6ffcfe37026dbe47f9ac103fd1077e1f07adc05bdf6d7bbadf1edff8dad84021adad082de1368d32bfef3f8cc32584ecef72a61961441744bc819c07de1b033e794a7d8b164ca4fd3d40cfe8d104aeeac6a5e9ed452691280e120885427048020402bd6102a228ba4189cfe7d306241e8f870d4b846158630204c13534f17d9f1a28d0e974d2e00487c301a3029ee7a1c1025dd79de1021cc7990103dbb6f5dc66604f60ef5227a175927c6d6809e4dc7367d3ff71402f14b28490ce7bdff9404ee7fb3ef00bf76800223c1dad791047c48ef33a2cfd1da88d101135cbf3917171017542dbdfdf36c7093b8fc4e5c17dfe6b448ec13d737249dfc450c8a67bee77a370a010f790d7d09d50a5fa3810f7dc49255d7f2884db2f0a9710a23ffc91077a3ce3296c22ea551675f86118f268cd5bb67f2e86f364cbd789e9902c0ab8796b4f031eb03d2393abc2570d3dff032e8f24ae0d242ebeb743f38cc0fac18d93fabbffc21ef4734baeeeb97b9ddf8ee8fcd71185423eceea9fce8b214d678b204ecf21a9532a75c08cf285175e78e185175e60ec856ec2771f8f3ab276e92123b3374eb7fcd750a9b82e8b5a5ba1adf0c0bde9297c5bd719732016f2ceaa1b84c8e5405c5cb60944555eddc77f6f0bde2d0b68fda4df2c9ac076b3d38d4a24d1fd11dc67211d47f5903be7bdc71d891b6ebcc9f7dbd6f9ad06ffde7f5b605ee9bdb99705d1e3190e23c00247737c73b35f16257889973794b38fe09edb41385aebdd82f441af436500436f0dbbca0f4c81d6406590710e6b746fc95e28047f17ea521db7e49893c7afca31a2d771d231aa6352c79e8e3b99d0a8c71776fc1bcf00c137f2e356c7212a92a8816580d111c36aa027319a6390a8d143de5b2004023d7e1cfacf03bbd06bc9311e308736a1c7a1d7211d7826482b3f8a8e8f4c8f051cc15a84b8f8962016508417b30f3fe9214e86fef3d8021de32954f8467e0c038ce21b229a1840df0477c178950004502cb9207e4408c3600a152a9ac2a3eaa1c76368eba00fed0e7acf873ff75903c9b7766bb786f1deff2da791b8e95007df6d216fe77dffa53ac771bb737fefef8b448dce3501ffebdc9329fd9242eebdbbe23812353ace1dd41cb839eb1a9d7baef37b3c827bfc75ae206e2e7795bff3013f1724af32f7354c9842bb706a280493b3818ef0063cd8a6d0448badb378a97b8b2288993f21eacf79db7d67bd846f6fdce79c778d2de79c9fe3c61e3240643246881c219273ce595523d750a9543572e6728dcc8dbbe7676fbe8be331c62da2a8c53cdabb0ca2be39e79c73aab3180115f21659e00045ef82bce562176f097d79e09edfbb3ceee55c16be2bfc272720ef66310228f41ba375637420594fb139a10b7c4513bae8025fe184269c015fd145175d74d145175d9ce1b6901e16c4dd0654e827fd6e6103b57f1aecde9bfd7a92c974d1d42b0dd3ab4d35651da6593aa3ec69d6f36a9e4e621722a9651adf19cfe4ba12705b88a486f5fcdf3da781def1ee9555dd9955f9b9d727237225b7d53825c82c3038ddd666557e0ed95d1eb773ceee3fbdeb1ef76e93ad7a953735734024bbb33b735782ccf25af97728a4e32cd1eb99e4a4e8998b416c059d1362ef9ee454d0f36fad66dd2380a0957f53356b8332e7819eb9277a9eb9a17338b9b15c4dafb659cf7886b3b5a1e7ef4ad0f37331cdf29833ae163341dc4cfc7033fe86eeec4224bff33b4b10babc3054417fb58814a2a1aa49248e7a1ee7fcbab163f6ab45d12386ac5e992451f4409cf444d183923ae9313b5e7430984e671dee593b5f82acca3a0a91f3e29c33a580a834ca9654a3dc293423020000a00023160000301414094482f1388b723415ab0314000b5c9a7e826822cbb31c0b22a58c210400c000000000000080800100cf769c3fedaec22d5dbbccf55d64258169e5d17f721ed40d34892cc4f00dff4b1634effddb365f8f8b582b0195c37898c47a93ef5fbc2d62a51f1b46f69dd9cb4b0f71dcb17b86385b8cdf725d7d34acbdd62949421027c8a93bc2281759948e9c66b262b0b0d6479772853447192019c19ca81bd246c931e9fd80cf9702551f43a122adb91d331c43843f9c31fa715bff103697f0953cdc9b5d11392c652246194d3826f3921765a28e34f5c430899e214e7384322f48cf472845b387f9450c1da405b0e8142329973fb4073622a479e41f822ece49164986be4849e78ec42b3c24689e76bb0f58388f0a6c74824456f328ce0f9b2b853168295cee30551f88c0dd814a18f39ff9a5860a35b74aa800f08f6af6865906369b8fa55c98705f16906c61a7bd44eb418a850958bc922d947a350b2b9961a1861c0cffa05bce486fa0a223abb51f25dd9de49955e551b7dbb24f8ec4b370c823840557f2dfa0fea7ad410530389082203f2023f88022c98f5ef183c49373ce0c6e80865e624fb36e397ea0c2fc1e3075324733fee1c6ba0f096037ebe7540aa4f30139bd2b99d25c88cddd25e682a2983ac7e50293172df049b8caa51799841c6e1771a5e530117b0d537a6c509eb744348abad01a6238e3f760bcd38fd5e363b6d00c4a01d2894ae99feb77e18827b09ff078ff1f2f28a5635dfd8a9c8a36b1595d1d6955201d9b03a186cc2a6432989f01c91ef5b452e3fb4eff6420d56e6c6121065860de5e01044de962200db340165ce3b70a0a436695af07dc610d3a1c0f48d655936bfdbaf2f97d0b435a8c82b9910cf3014a9344a5487d5d0d13ccbdd4dd82c4ba5bdebf31a341dbebb868d175b8194294ce26471059eb2726312aa75844d9a6f94697f7f264f7515f5d427869591e44fdab8f5fd797a64d9f33fa96825fd3025f3f59bf3d927c012ca5fb8eb07b103129f778813ff87b278390c828b6309f4574bd4f55b72c8c052def82d8b3a25868c0e2d95c811978f595ddd8cef54b1a20036b3ac80c55eadd5d8aedaf5fce13affa22106e115fa7cdc81609e2349f06ef1f92dd68d33582ecc167889cedaa3cb0dfba4e9ff38ccf7e8120453e447ea98326c03be6511256d8223232659b3df076ff61b165e96380980017a658d5b4dcc65ea324ec3801af902ba22b313f47e94e311e5cdc81c466056592611e0859fe16c610def4d4242fe745d262d981cdf83cba3819e8dd39808ab4653af18c2432d35ef49660ead17b9eec9348f19f745b0b15c10a4b5f6cd2c187d3113ef81e3f36873304f1e6d4a758d70e4890f4f97c5ae1867a8c02a0fc5252df15ea238356d8b7c09fa86309d5fc551dc64c801778b7211cea40c0bba43a46082953cac4340a0e6a35db08ea67aeca821179889c050428d63813eecf9cf0de6f20f5d7dcb9d8fc39a68f942240c13fac98bf10f0c084cccd5a110130ad8b592138ced6a16b79a93fa8b60bb3e1e55b66e35dd72e2bc0e534aff9d5a34e47e17e5ba696e3b1be0f3eac55d5cc16415d5233e9b6bc45bfcdf9d807c922e027659ed3916dda788f438cf1361edd12b711605193880c40e389b656f976c76840e25be18a4c05141a35e5f9f948a08c44b0960496866c4a73bacc2651614a143ab926dbbd053145ccc0141d69d4b570726d30f3d6ff233b63631d878d790736cc72d7ff961815d885ebb824e8ec6d379cfa0d97922b1b3e0f5225c5171ff670f7709244d78694cd4b9f32f747df253766a17ab2e5c84b948bb10c680caae66d5033ed12b69738764519c032121a52766c59089707e99c646118711bf65f6f5f7dd7ad6aca5d652a6ef121775db86e8e711f5df5f745a307456ff03e75f0649f3c337895fe01dba8c6608c7928211d0c8f3f1d585dd445146921c27b1404fc2c501e21c711b8e33fde8161c1284e3e1f12c2a81b3538ab253cc879234dd93605ffd1f536070e536f9848199af550936b3d14cc0bdccc82c4c8163c1f8e5dff92ea4ea30832f0c30f60efec9e3d0ea1d11c3bf162ee2c449c626de2acacc2be3f2dd84bc2680ab9a5e5ff25edef21e939d35d6055a71dbfb1ecb14ad54566bbfc4bdae06b296eb0b4ccef7b84adf5bd4754a946dd74f6f7f29e60cacd6051872299b434d3b243be7a069fb2a51630aaa9166e986f46929a397ef97d937439305a29f270e70a3757f1e16a1cdfe8a2decf2a42ba7b0dc40cdcfbbb643e1e83adbe36e7808bacc31710fc99e746632f7e1bbeaad44b4fb2efb2dca15699b89fdb902174c8e0f189bfcbd301ff14c8cc491dab32be43d51b9fe8f3c1c6f78d1f8d6586785fa2f9869d79b9446a0c14f2100bba76ab609ec2ebf5a563957eac7c8795d137790035cf85a591cfc8321309c0a8bdc5441b76b5c88e1582a354a31b7a55eb84d225cc0a5f83922dcf80da8846541e38e77a38b7afa71da06780f0cc66019140d861dd38edc1253b11895757408456f342013dc62163dcae2cb925216f2895b96bcf9e6f642506cd3ebb0941e3d4c2b88310091841790844e14e7489d94e17865deb9b38f4a2f678d5c10ba23707bc219cde8e1a9064c967c220bb50a12328513c8b435a3638de7dd6f5c7452ee7024d029dd5627243f6500f4e55e4f7cde28b101cd04acc1991060919b8a37c2db67ab0212a0dfb784bdf08d456376f5cacaec0299cf11293d9324f9e8706a70818bd8b7ce0c4dec9ecb802a0b7f8f57c2da8085f4ff1a92b665e85c4d2e1dbeb18b87ba0940e625085fb779e43686d1aad918930908e6f233c2226aed0a9c85cffe4c320f44746a84d6c86a8fedc7a0cdbf8ab35880c9aa1fceca6481df3cb4c28fd14d32504185b249966698a352716824b44984e286ad548ae22d6cc14bb0912b66876337fbcedac285c0aba12f0bddcb6103e591f12dcc7f6e8521435081936e84943f595bd47967b01ed063178e4d7c36031abbab4162d9977aaf34149044344c11ca9a0edb9e74548dcdb2f84a325c8e5f935aaeb7c96afd687e89f9a7238382040a6e567b7abddb13d25e413864b580ca47a0769be3c18272f7cfaf1089c03cdfd29f257d099c20f8588da0108def6b39655f8c32b03653256bdabca802b3820882770e0b3941f56b0743dae1ea923152efd8e6f46103b4a89ec672eb829846846da0c69b3f42940d823a7b228698b0cdf0d767f6e40c8154251e8196fecb0b87210851fd84a2e77c82619a100ea8f206aac480d428fcdf134bc75a8fb241cf75318a7f527e75dddbf1bbf711f57d9ea0b667908b1796ea97fd82d5518502bd2af12909314fa045f91349119244be91cde1046f986d2f9d4c306333db44d3922a422808559f856f0c9612b09598643e420910a67e1f97e2f251bd512baffdb2017d5e28765d4c54d929bef4b5b02fc9928734a1d3b0f1f6485d9a0e0fabbdb9f039834c1fe64bebb4a2d1cee84b8f0dc424afed33cf9299c3fe200cfe1a2aad068c1a6a2ecbf32cf8de7e0dce2574c7339cd96029d96c4d2303d619b4a30c0386cafaf2c47d4222000e689806ee113ed9fb587ce7148f05fe00ef9a2eb18dcd77cfbc1fe0dbda472802e769d68065dbfa048b30065580b3b63cf908b53646571685c56e91b8f4339a5ce62cbfbccaf605d927fe30698cf22d1cb4abc4b8bfb6b0752a10527c39338cc6558152b253726b3457b5a29715030a6be74e2f16edc8d25142b80c107cd4b80adb75e20e88cfb78c032909ffd4d28de9658484a14e2acc3b329c65f849a78c92cbb7a3522845e5129c853617bf5fd60503540ddcff0dc89b6762542b46106f2081663e0c78aa26e030a0439d2baf442946ecf446a3951564f3fedfb10a08c159d515402747a7f0fd1a439b17d358b4e9d9445db6aa78bfee46cb90c179f30576b416d6bdcb5ecf707284436c2db0e46f12a89f963ae7335f4b972ce3ea2fa7d1b1f0a259c17e19c028203f4d8de929fc7c361f74eec813f5db7124eb96f87fc2c411bfda422fd3dd885621283f59cb602157b62e73632c51a4ba8a9e76d514b065c94e35c2835c12935b32a52a70155ca5cf96e4d7f49dc42ceeabc2db4f1c3a8328c637cf0e2a999f0d907fc5398b78c0187dbc3c126e794c141c1149781441d37687cb3019392a1a3f44788e4c7bd602b5e11f9b26078abf10e62717b3f6683a7631e01b14ba699973596a8e24bba701027ec5304754666324db1b5ad965b093b0fcf5b6828f46b750c5b703f0e5a0312ccc821a5e1d76e821dd16cd134c318b3e7dd685d20fe106c337fbad5f91fc28e6c0b82722bc4024b4e6cc37aa8a80e2e1b432aef184f4e1c8b0dc6c347c7ff0d3bd6eed1a5f2ee5b28fc33ccdafa227b4f8310f74ae2a57ea94ec45fa26843cfb940c1e7d2d236680fcb355439ebf02436ac4d525700aff414b180d9b8f62511d01a0518705d48efb5180b1fbc1d552ec5087ba0b7464fc6af60fb9400eeca486ea24d49a34360c899eae728c9b89eb012cd1016dfc758090834e0fae66a223828f80bde02b3df6f9692cbc5046a03a49ff85f16b602493958a7a9c99bf3dc8cef1f4749cb32fc981718f7313d83b7e7e08919409e9018482bef5c61de149d7b9a1b9e22e7d0c33260a78336f0ca5eb9ea0c4f6cc4231b490c3120e1675e4fe85c8e5815aa0ea942faae821528cd20523fb3a476481d9dfed6d3297b80afb66a24b714e91df42a294e0cabcb2ad084384562711bf5560e7be23f6f4dd456ad7a4220a17cf73f98085fb8dc0ba13b5b3938d6ca9c539c0d615df5aaf00213a80d3fd73594b936ab0156064e58f36bf221e10939638c4421f9830828ed95f8e52eab05da41e626082fd10234ab8410fba6a0e89e9c2c9bd589fe7a65ebb90e2a4911a89f6459efe0cef5c72d52e43ea2a0dbcdfb473c0d366dc9b66009286fc11f18252ab025621b571f26d431792a9ffb5093494f9465068f1c624f1a2c96971241bf245589796db84a93b5b2ccc763d358af27d5623e1f5ad3729fa896e37dd4988bfb64b14ecf63c35c9ea795653e1e9bc67ae9bb5f327984b76d8f7fc2896aadac99847cea58ec35a6711a4e5725504f440358eb7b77ebd7ebb832275c6d131920ecb251dd3ca38bedd1074e7397de865b005a01bc1f57a7e4ebf176b0eeddc4bc5e0f992a8293b6529a560669cfdb48f370e422ce5847f9a0c3a2e085c23d3e71d10e1112181a4b5a87e9548a9510279c1a371e5596b4a3b44c7ef33c349848c23c585ede4b9a20511b9c50f60aa39f0809896d06da15d47379856fe797ae19c20893b798ac1f608cfa6b732c65e8d4358b6db677f55fd9d822a7e73c08d3ccb9f443761d8d4f16d0861667c8d019a63b0c83c31838c5d8968d8c14cb7913a809a0e89669e5da706130b7274318bc584fec7e67318bb166b9d72e547ec8a2152ae3582fa2fd5c515fdf724d2cd5fbc543f86e6bf1e231eac5c6690525cee0ae2c3f47b0a0d52e9a18f44bb113f5d63e9ee4bcb94a04cee785b3a6ef49b10e3c8f4eeded54703c55408beeb11a8d1d84977c9555433c3c773f6367f11606106a5049057a578999cad13dcfd2dd0dc8557d0bd738558fb646068e2a9b3e1241ef409199b4c76dc82e9f9e0979aeed165981451407af44474a9a3bb6dde260e43619e7eb31ddc6b98dbc43fc38997a65a3ce07476431d965e50bbf287e57eab5827b803ea7c00f78e0a60f1edd57a2e4fde0ff9f81d91e1daf332f2497c8d42d565c3cc4120c1ff4e56854f15b8c671498c81274cb39a4e3e0d45fabe8293e00add82d395dbb7867fed9014c959c9af41a5d61cd40facfe83eb7ecd5264c2fdf10b507cd0daaafdc6837c77ddde03be44c74ddd914ec3cf70333b482574599d21992c04f22e9dd4a6f38d4ce9a4b88969f0efa933764f1b97ae3b4cb6c4b01050e460e48e3b93febc0e49b3bea5b9777c450c81ee1071d5ba24a53e9fe4e6539bd7d60081a42218fd58bf5b27c45fe27df8779341891977ac7fb6dbd123d7860706a40d29d21d12769009b580eb3f940de3e5a34d710bf769a87b4077fe68928b64151335e5da79b7cebd83c05a7744c37259e149bb07ca9bd0f5d082b9ec6570b013de71ee2b912a7e04281bdbb94423bfd4ad996267cbe8cb1c9d2b06b2df5908719ba48a13ed427ef067db76aacb319aa4e47b67087d7ddcfa2e7b1978ab210c62208649d462530a60381af56231a01335dc1828ea4293ff4ba5da081e800c26926a6bb0008733e43960b2c23753151546bace31f1e48852902bcced1ebb3745d8a4060d06df5c3a54ae7e6d055083a716ec9a6f6369600c8e738195178049555f4ebe0694373df728b69c1134b0ed252601f09e23dc14db61ba9e34ed1217aa44882db33488da751341f2abe0ce5601c95f3117dbae55ed80add23540c8103618452e537ac7f5f9751dada4eb37ceb9388567884e4a2162df5ac6a0192a1f3d1f19ee1a3b1a11b1fd18af2199b0e279956e00371b5fed3403b986db4a5f776ad3f87c9a20845f3476eb797015e680107a16d71d6cb1f0adfcb2ccf4cb1f5372304ed671f688de16d98ddff4aef09d81fec89973fcb30c751d942b922ff3a6e76f74de57d86713c176fec20547dfa3c26d6a95c245ee711e03dd1be21ed00c3612f1d5a7ceea4716fd1f701bbb6808956fda099fd290d2798be03803d6370e57d6bb3e311da2ccd90865a72108ea87ee842cdd5bde13686fd1448fbe22fac280e77a97f7a7a59ed35193d31856d8e5cc7b6c3e593345a49bab08cd811eed84bcd9fc74936844ace965edc9183230b08dc79211c59f1c2fd9e857297b11d9c18b8d3b286545d6c5d961863d298627cae4815a4595ad5d15515340f1a47ec67f89c9527debe7362d65200c87ae434d0e7cf91bc448db99f5ed8b8f908c50c3084fe3e53b0f188345cb79713a42182920601a634ca4458af48fa4d57ffa4bea1841b3cc4288f06c60ed2883f76239773fc944bc0d70e2eb43b90c685666dfddbdcde3160b638aa2b5c430d0d1ba67f5904e66965047780cca3c1034c0b8ce180fb0ceddc7b2dc1ed2cf2334a28df157cdce417e185dc1c1442eef7de446723c83f83a57e565a5067c6034050b7471a5dfb80372137ed3ef8117f66e11afa7e89eeddb6824c31f62f70c5c4a9216b1eae41f12ea079367112bc9e09f80fce8c44896b50753c0b8a84bbb6d070f8c04049d6ab845f1105a634de6ad2642c1572c4ce1dbe0790ca161b2ba6e9094f5862439b900db51deb74b9544dab37d6c13901b4860a3aefa781bc3c41646e62bcfb86587adcd48c6363f66cf314eb2de5535eb4ca78604f0c98c1f1be5b9c24d3eb39da452f0121df1929a93da18f3d7af4451eef67ffda82e65f0fa4d943e21a6c40864766e189d4b9d21dce611eca03029f93e90c47d868a46014567090cf006fa6eb4fbea2f9dc066f6ab66b786ee725d4b28a6e5002a2e6a2e9173e70b9e82b23544d92f558637761ded3660437fa2bc867bca0772b93ad30d69eaa223999296e66a56f7b6ccfe460982f24e0de1ccea895222fbb93dc1caf1ec22b6d36b2737aac0061d3ae0dbfbf7c35c9032e0f1c4999e425cc8f43b6e5816f418161fe877020f581b1e7401ed407c4cb166ffa06d69bc2da1c28847ee3bc0930dcb1a510c73c7984e301b98ea0d1bec90cba0587a0b5363d173e246982ded8da053087931059faf99491b8fb69723853e6e1927e965f0ebf29dae3157dbea7c769cc97e6b70983f4e313af9a8ef46412ced1afc6346b84d91a00f3ded2a9af61e2c6b36c45d0c7e7f55b801d6196dc5557d8d7980fb4afd9775ee3ab47896f9513dcdca17d8d64fc1e213eac08b176eef88e5a4fcd4de8bb53c9f6f06cd70eb5dad724491984b020932e5f0f558452980c589b7408c58a8470a78f81ae006c0c09daf18f3d4e0656254adc0477fa33ca864ebdc2d38d6faa2278c7c055249c9ae32e94159c2d221b63bd38ed87816cbff15d72a657be6a87a8facbaacee295c016167c56306b1cd31c6cb09701eaa197abce621cce90508f9040607744d5581432ce23913cf4ee71732ae19682f82992d022a34cb69aebb7f1b1a57d698cb31c30373d946fa584ea4cfaaf3e34479e7dcb933cbc727cebf539e53b6c8b5918a84e22466cc9a212b5d18da68a9270ba937909eae807858ea0d3cf3807ead4f4c42c76d196d85832c106c918a99600169ff0e425f55a12e9ed6601438abd6bac94841caec387e5799beedfb6c9fa5cc7561370328c874dd07b7cef684fa8676a3dc43ea4f76ea71843d26bdd5403499193e0cdbd7234312bee915ecba697889e4c5d6dfe37f087e38890110dfd3fcaa50a3546419079c0531c1d378c9a6ec82bbf9f1f70828398e75fc438ca1761544ff5e1dc61720ccb7d0ba3427cfbb4057e4b55ad49961600a18ea3902c009e53d02cb4f0be2362c46adf378ce62d29342b6f0d8be993d274813283795c76e3ae13b850d2bf15004e0f7c699da5033b80038c8b55430834b5e4b23adf308823d6fb3516dbd85b491ef0acc104b596441cb318b44940f7fcfbb5b7f2008535e6e23389d8b8cd397fcb0f532e92011a2338693272069268165d53d95b19c623f51e3d3556266f589eed6a6081f2ae12aa0c469b1d390fa7ff19a57ddc12524d3822a112f413824b0bdf9b19d10bc7a6d24db805ee44e212a7e9204786e2a622acbff35c68eb322b83751507e32afbb08ac8030fa59a02d3990e78a7ff0a3722cb62eeefd2bd4829de11cc365bd0602ad4e230ce6e8a7e328b111b77fe1350b0323ac67fc555f0a252fc80e039f596dc7f308fd46db748e8d51918772d79aabfc9474ac321ea24bfc09f2e049801c3b58e2f8c3cf1bc28bb3ee345a8fd4544de2aae71454fa06fcdbd442b00c93dcf71c089351155b955b0a0b9132191f6062bb6f30d7dd9f47a9d20d073f7d307d75a0bc3eade3cf4a84b669e00c5cc9236c331fa0c580edf515be5a829ace83f432b8aa021ea743d0cd65a65839b76ea690b1738f2a763877ade5113b08b1057667be34a2155bcf730fd00b32555a35b77bdc8683fb27d8ba9492367f876e99581f98f9742416d139dc1812a8d0a3cd2fa63c01d4741b1f3371520d6d17326e77430a81694673a117efebd6fbc9bb4b39f043d1a1b3ab88e60e3d75f128afc45bc96ad26cc80302ef6362858d8b78ebdc3af7d725ba22a67939c6d3a7e8fef957a4701b7bc5b372fbf7b99325746c20f6944a5e6c568ad78f092fbb32bea085a1e91dc32e9581648429a3c56b035f92b276416504d44bd775e88dcb4534ebe3e503eff33776f780bba467efe6dff55827b8c0fe0f50f61d4bebc5386301ad88894685b9993025a1034c501bc60843971d24cbacdb84b4343905f61c0dd83f707113d4ce45b01587c8b87c175dcef8264c1093e4b6a4ab9f2e4fc243dcf35c0178ae1233048285ac50b8a76592a3e5c1343799b8b08706c54fb58a9044e33a35f85af1700ccc765553c1353187ee2773072afdb28f898cbc97b2eb1ece82ffecfda8b30a3283ca22d5e26d097bf35551a608f7061d3d1ed22be2016ff10d4efc120fb00ad77928582e465ab6e5575cc1b10fd0ed0d9b483947202d9bd134c0b918ee826e7a13b18e87f4eb730dd81ee715fd3ff7b26246a443fdf9f274d48a4434335f1c0144cee5e43216d77e496cb48d4485e3399009cdef165289602c470e7ce7b67efec549e023960de0001302365a9ce5bb8f4ca832d6e8dda137ca5bc3a2989a1bfda65d885d65f9771ac290b5424e501f2227a520afe83849839817c3db42889b7da6fc135f9681c4fb092c6443fd4a4f8f6d28da9843d63e5d9dd9487fafce50931448f9fc9012db899d83a7b510a15bff53586beebb5fe9ef73d2b557fd162099c5199c82b555833957fc807a0d19682f3e99fe436a947fe8a86562c14b92e0656410feac37af045652b6ce07748de7308d511dac3414755fa5ae6590ed71c445c469d5b217a085c1752bfa8ea6cab7f71de3bda87d58d8d3b488a71929521ba137d2a7b831fa945d23b6b4741e27a3eac7ed153a15ca7122296cae6d76eb1ce3241149c31d63df0d55c235c8eb07244a1a4e665af7db0deb6704d29a2f70b29a6260f4a599b4fa373c69f968c9c626415801566858954df370f1ee108dc0a9e91027e173a4aadcc53b33c6822338b6946a1e3747b90b401d82660f81a857056b9137e174002237a667a15b486291ca0cdf4088a14fdf2c52638c5e9095a5b95cb38370ac2d47d507ca87323223e28eddfac4a5fb9096cce4572853fd99e488523fc020dcaaf150a98b7246a7d3c396898dd5a6e66769b681cd93e663dc5b4c02cf512deadc717a4da5fcb63efbdf08650c04e754470bcc159c572694c531371dc060844a00906544a8dea1486742114bbb1a75534c0ee211f43f4f9497ab31154f31778390545b396cd2819d7b55327d6052a3a035f1eb5b28d1d5bc1f02dfe1985100d94e583a2b10aefc9d1f8257736342681fdf36766335b39587848a2f7f7cf31dce6f55984f614b77ce46e34550a9799e2aefeddc7f19f2009cfbaeea2b70a5ccd547627b20ccdf604074afad60d9f29e929571ebad204684e4293a6cb6d911d7d4fc639e4efd91fc273556ece50c662b7b9e0e1140824b5a193048b330a700be793cd009c7e87c0407b400ba99e6859d9ad27d0304d881a685f89200068bf6b79e8ff146e326e21e59c2858a4e4258113cf3bd80d5b946e8612f2752851b847125d531389b71e87e758061fbc2b146d5039d6c2dd1ad44ec09a5c3dab73a80db1e2b9fc3b41e0304ca49baca3336dcb05271912047e82951644182b9c3fd5d19d50d52aa49c5fc05210ca3b24b9dc84d7c69e6c31f6aed2b3fc717dce8e17d6103ab3a9622f61a2f50f5d34a8a4b7fe570452c19802672cd44bb7726901fcd1eb98bf46451303b5815c5429b0a58801c902310db0145452934dbc96af4a2e7b7910085d3ad8496808d35ef83a5f81539e068d3278d6672ad04a4952b0e9878a9fbf0a506bd37901675132abb09be1e0d01c719eade1483de63176cf7d21ca551d6b6a280d0c76103aaa08a2442e240fd95af9e4a52403cd439750102b35f8d9e9c0a2ee169bb28cd78ef0f4ddd0f73c21d668bf29a5fede034b84d9ccfbcd2cb732097093aa8b8e100e7455d2393b4123d6a0d7fb6db0959bf9045ba2307353485853a61b53e81d144d35460af26c011fed2ac6e7357d7cc515f812854ccc0e5b9bdb5f22a7885f3141b7306100483040474697e3b40990940014c4e1a407b28a80ca5d268e5d6a2df352ce0513c1b3211b8239a75dee982a705f79fe987fda634f2c63ba735a8d16a34c11b9b0f22b1fed9dbf8eb4ba59c1b5a74614e20998e850e503708afbaba8de24ca509289f99d8bf492213209ef836ea575e45be1a26dd93a5542a81e74fbdc6ae7950999c8d534c9f4f79994943c25d453957a7dd133d7fd5100dc9540f3610476f81829a83164a671f2d82a1fda705c30f22422289b6edb5090399c5bc248be9b1e68863dca29890488936e95730c18d16defaf6c7f483da81a8aef84d9345712a92a2212397d9e535c54147251c5919a92a8593e2449d1088631799655f3bb6c4f31bda14c5b8f0db12e9e850831827291e3a9f98cd52ab38a58b897984d6cb1126becc51ecb58c52af658883d1663896dec62156becc41abbb1c53656b1893d5662eb5ffd17ff14160baf8c22607b7b1913ed61447390122fa864e4b64516c115e4d6d8da96a322b5f7b23ee834096d050fe7c4a6e8c091e6745d30fdedca2044f831ea6209cd0d22358ebae173a8b69c0cbbc7f9507dad6e276e2fad670a84bf7b3234029d73b793d80a545c6514d5d2687452a54c50dd95508a5efa35f94862f12ca353b6b8ba56beb6374439ef16a9eb12a7a3c93d72fa4385a50e4f2a299693b25f47f6c817cb1b9f2d034950136eeb07ad91e2b28199e6465b55d4a4a555230fa93c2c5aaaa22625ad1a7948e561d15215352969d5c8432a0f8b96aaa84949ab461e527958b454454d4a5a35f290cac3a2a52a6a5242baa3ba92eaa1853aada4be8cf4dea2291f2b2254764401303d60c05eac99da3688586b7b20caf051afa3cffb568de1fc9dc2dc912d90096ce762d2993e32a3b85b2ac82214be67fd0cbf1f850b8ebeb823919c227fa2236505e657a940e6b84fe3a09afcf1b8281204577d7a7fa0173b3405b33a87dcfce31796807c1d031bbd42f53d0e3cdc85a33e01c42896360e568e533ea05178fb0ed57e54f6516c04efdec75a3bf6cfd9aa0d04d27b1da2cc15d49ed844b3d7e1f46e5296cc6ce15397312dbe301d6019b169dd5d9657c1db260efcebea87905d98bdbe645ce44f776ce9b8cb54c744c9b2ece20a62a438990ee71dd7272f4636f42a0093ae4ffa0104907f483e2df976be4c81ac501488e83ef7ce44b4974cb2e09e73874432222888b0401757a00fce7f9624cfa9eef9bb8436c2e5637646df49ead7fe728d48bf91b017b052837b44608e094097dcf0bc322c6e5c52402dde4dd99d46360d53ed0bb3c8686408bd2088435a398ce5271518db858c782fddac76a67accfd332d941636246d686d48e75687cb8acd274ebf36a118d139584a294b31f4515a026297a27d29ec6b1d750728509c5091f1727a0aaad3bce6c48a56a342c6ada4c8051a7cf10364769975981a05745014aadab83719b8e16d30f585929934240b67fdeeec9941ea48064e8db5b0cdfbb5194a6ec964770ab18579d7936630e47ccc75ab1fa9a81bb25b4a33e066de39be27a619e6947ddf0f144546f1d0c5aff51e9638bb9926e4e872c1cce7fb17f7c2b7d9b5b862d02d2b8bb5d0dd4ef0169fc985b392580bc59b977cf95626041aba5091c660baf65c91336c1e4f5a526911c123db8713ba9b5fa0dc29f14c62ce349f67d7b5f9bb8fe7c3412ea6e2416643cdd19c7da26bb2cf8ebf758dcbfb45b8cedec1720fa7b0c554465fb599c380c4d312222668c6e88c9d99e48e1ad18ff12c55c793363e9a77800c6f45c1b50577174bd0e49f7ae55412722fdb854af21ced00b8af7288aa6df81c723ded06cdfdaab8726b36a8d0c580c84ab075d81a8db650c2991fa4b3c9bd1e90e38c800e5c78de3b5a2b42f340c0450961568b4a20ff58b93804831e20cff4bcc6c0cfaba7a1e226d0495b44abbac815ef6a813ef226c46313513b9f6a4677fec2d015689faf646f020044a4fbb6534af5fe62bd8e54fd1c5cab9f496a50b12fccb7593190da56adbf064f45473c36dad25600615fe3596f57d08f1c51a59456322b9c5a9fd408551613636bf85512150e5e12f214707d4f0f19b471d0d8454652264f71056d307b597ea1f682341f48a264c45edbc94383d23a00827dc75e756837476951e9d17f266b7d3643912d8724a2f86755d644d3854e486e2cd874c1a432f14b44f4935d9ee1547bc95412a74f4af1af7e391ec68bf2859e92bdfc28d53ff46df2389c5a2fb84ae2f54929e1020c67c4853cc0b524222b83b36be820f8c396e15f2c6401eb6d3aa25cb9e1d0471d26e51acd4c635dd8276929b373304726f43f33ef288face433cbe9e48466c5822334dc15ebb3ce95c2e7206c0db36553baf0cc2925d9bfc0b280cf4968ae17518b083f8b5c8c47dec7496b8de1fe030865c4c465096dc5603d7930f70d4c069631e559c084b62e85eddb1fec96092dfb27229377cab8dc3f63eb4b8386c6c38c85d29aba493ca1897c3fa1513e83422bf1e3399388d00c109bdcd81f0b328ddcd42b5eaa3d852f3985c570bd6fd026daabbc042aab5972267f375d1351795b40bb45bc2842eb216f97bc646395ae088ad1ef38512c734c15cc42c0ab3afbe9a6ae93853ea4b55b270b8adcb3fdf0ba670604213be644afcd7437ed20eece779d503296ef61eb7546846aed4a885c35b84a1246df568dec8eb9fbee3173b3f9485f600754a7d98d9a25562534af0b796316de82717532cdc0ed4c71488885fd0d555d22b04ddbf9b377f55c55e2953599d44b7bbe3d034ff32820a3d9f5192734fd6241eb4437d6ae871574120ac4d4f0f4f55cd0ac65acc93459d6d6870aa24eaec20a9c35afeaf5457a734edcfc1a85a5bdc5e96e74081033408ff0d48eb189e198563b068bf8a00588dd7bd1883d8742381119fa8b9f7ec9fd3c4eb375cc49180a18a2b1245c8c679109f526391a22a51cb56c621fef68474a7a4602b26af39e473f189ace38c3b2f87cd71c4737a61d9509ab641938f83193b3f9444e0d702d39af4e0e3a9367e7328a8b1bf7eab2ee76049400d62579803f99fa2360f2a5440e005532b6a6104b9fd2cbbd9659dcd6cf219748e48152b75b5019062b1e5e50b43814d8ad5dfe94e491009269a0e31450c7a898608f7f486d5e956518c0cb78b23ee4d9305f7a7f00899bfb750720ffbb663635b55d786d13346151dea3f07005ca5070203f0c4714fcc89c1fb5cb827e49ba69cc43c3e43057ab8398296235197d3bc4caf062e550ef9fbf05cf338dd48dd5e06e72414d1d64826e2dd8b9d4be6a5d5e72ff39d610c3cf3af08bcf649fc27f4a0b3a15c116e15b55ebac7be903b35c30c597687f6c4f89c66488e02161e170d2ef7cfafc052e768acf88137443bbad5875431bc37cd4de626a932fc4a2ec17422b6d6d76b62218a104c81222b94f8b7132e6f846d882678f88007da7a55b97ff54c0f45c9169f0b3e848954d15e00109e56721027408d297c77218f674d4e1232007a991d6031f487e99cfeb4969add19f6d47f2c6d5267c0faaa405d6eaf56cc4370a0ab9abefe9ee5bb94229078276876210970bd1014468c2f505241ea9b6a364c9fe9ae21a3da68e3381df74321054d6d608ba3ecc1becd64065773b52a6d31cdd595f0cefaaa8a2a6542f9630b3292a733d9ec4992f2a77c9c2853a79f0994640f99649f28e1b3c44ae266e7ab144f25b0c352f884cb6a62cfa48c1ae9548794b08cb1de0b59e1d2be43d96f93c8237dd44978d1ff43062c030cc343ca0309497b9945201d11d6b27641fda940f511c8b6cdad7d8bf03a2f38b2cd22741c1d85f2ccacdaca6b9f0e7c029f04c5cd756570f02d03bba8aad2f587d1cd1413ecd644a64fcd8371434d53f7654b3c64a2193bf864362ce5894d71d5d77ae3f64374ad798f50a488bb3fb75d958bf45e71f7810f46b67066172dba6dad1df19b5f4937ad592a2f48631e34f5733d1939a882a97259c6ccd786a7c23df61a7dab5e0deb89fdec0de0d4d50c7954e9a5e0b18beea3a3eb06f710479f5b5047f427584c6adf122da15122d1dd7de440ea589b2e87b66dc20ce82407a35ebc3b02b64003517c9f43e4ea0c5d30e1e900424c646f980102adb3a7842f36d9d0aada7a819a80d2d808520d2679921ba22ba5aef05407f7444975cccf455540393dabc29fd03758b7c4f15fdf6f2fa54b47ad8a2813482888dc61977c62ee79977e112a2bad48a7945f49d289f1b0925a7f8816a71830d2477e7001171c22506435455893a9aa59849d2210432a4e4d83e0a60c84246e3a8ca08a9664c5ef847515067ef25821dace74809b3196a71cd9ba8e40f682d7d31146d62c2994ee386dd883c91215670073f156fadc2b8eaf45a675c99d060736da4a0958885fe2033482d1be76afa03984578b6ef3f51548318e9e5cb7513adee41255655e6071f5ade1cc39fb242f6599fd52211a1f2395f7ec43024933af4eb13d83a2b9a05270d2cd9f6d19cc799b0e6f6c753c490537a5f0db920b22fc6d9c3d365d8eafa06dafb3053a61b75cb25a9c4b0dd3f51f6e5f4ae1eaec0fc5fe0e657d9a6e00ffd9eb1244f56edfb231aab120fc79a503a4653f504ae26c25562772b0ed21397f7ce0e9f5cfb06b40cab9578fb6e1fce5570cf56b46ab5e2b83604019184c7980d76c49054dff484ad3bd96e5b5b9d48df3fd7b87e6fca92ddbd9911efdb2d12af7f6d439c4fbb8722a39912d80fcaedb8341ec7b773c9989d0ccfeb10c2bf27020e43432e5aabca32be51b8ab21aede65bc9c01a382a8c991ab5cf361842fe39b80c11a8b8a7737188a1da80e21ac05cd09f870309f40eba32931a4097b6a9d2ad74d743f27d7bc8b6c3cd9e3d5936a233fda9eff0ad05b81ad435e30277b2a800fee58c97f9089055e349e67d573fd1a0aa092c18f0f0f88a9bb20deb7c9c25d850df0f27133e55977e2ecb45567fc4cf4d151d54912bb1f209cc3aa4d2ef5101e93f7cb078a12c18ed687bf742cf31e05bbb08ca9971221f07c4348984d34b0a64c2475912a8d95a7f3b99a290de5ce504a4ea9d45d5628c23cc8e29ed094bf78653edc968a9633ecc29035dce3395baf03376ecf50ef80b3248bc85723e243d0b1ae54df01cea614fe4fef4819321973f39da82d8365b09286d4079b91999c20fd5c42ea6b0254f114ec0fc158acabdd8c89c4c4d3b448fce0db422b443242eed1a9b584949860e5cc27b0bdf70bec445c4ff02c5ba46ae03a53c5042450ea69a3310f84e523cae9e6856529f197fe281f98a6e857f18d4f036e87853ae70878a83b71aabe36e01c63675038ceab0103ef2fcf5079cdf466316daa017525e030cfacb048b947cdde23ac8d28ef6b8e4fd11d1d4073f2a3559af9ae4d202132360a683c5cb81327fae87f9a612bb0372474d68be24e201bfb0f7fb0059320d10ddf083f8c39d8c4c2f957fb0f77520ff543a52e40b39494315622228d65605594fc027548143752c329ff618301a8305140e51d20f51f4e4d80e61748135b0764f887b6c47036c964ac67f8961ece46c454d3a6f648be0db1dd192095d3faa2e9aaaaf4b452f9ca918168034ae29f21e8d49e681e8f0c2e415885e43212d8163790244e3546254bf0cc1bac54b178db243243b5bcbb8a2e8b2b49a286305ce69fdd3864910171513545d45063ab288cf62f873bf0da1c881e42d827a13e3ddeb8fc1cfdfde9cc8da57a30d8b11f8942caa394c28b00f4e91a4f72f354f4de3bf52ce4c2e14cddbc815a77472592c936279ad822b0232a10dd591dcfcf51a7a4133224d748dc0c0c1e96864f20ea2806b943de01a9848867bc0ad90fd812afc671fb23cab9ea76265ddaa389688003bb46c5588cdfc7d00d8f8b3128709635408d219d432311a7648f8cfebaca1857345add878160abf1044d1e75fa5b06970e518a2b2fceb4cbe775a393ab5a5cab3d2b82d3b30880aa7a42d8c7042f8bf32485a3567d3917afbc41dbc8cbfb5a1620df8f91d16639882e3c31b074bcc695e2f2f7650512d6a60f674e06742671450edd771bc4ba7b90edf490d14d348fc20bacee561a1e3a30a1d15781efef79447f861be052c357b2f70df30b167cd9af73267b6309453091cf1e04cb804b1d89f8bcec9e374fe373ea096ed5311996492ddddba704d30b7171ea388074a9ff8b72e1d658eacaea76f9d0d517ae639062852a22864b6856303fc27f7f54829cda5f230d324b9eab787f59cb1701f8a554915f6d6118826da801f6fd53b626cc486d2e3b13456fa878787aa61c75dcfa1a1d8719f39ee15cd1d395c53836a1bcd92750378e1c5ca216d1958d9029ec74cb46f3c9d29789f7a136c3f83ff4be110fd006df402d03edd671169f7c1fe856a99fb2510b498b819feca71d6a519a2aa413788998e9787ae40ec323844783b112a6a9a3f7558b9c470236c5ca3f198765f30d16dd85a7308b3c7d80d0abd152e6134a0984064774b65eedee5e8953cd906a21560accc04d1ffd9d19210ef35033195cc3d1feca40997e3fc0e54a0cd10ce3de0622332a4bf901bcbb7061d5617a961d122600b3c285744767e666c3fa8c5f97f7a474c18e2c028f0d8e955d5813c777345adb17e9bfe1484f7173905f95e7d153e543c213f3e8223c18bd9f8d0bd1c317e67ac537d1d83a1b0036dfe0f3b494472c240185d8b9ed226e4d1cf85fcd546d1f73c7c59f531e9d0d9b87f600dfeed286da326e1e279327fdef330f771c0ad11b98898683882623023f48d06ac1ce83691fdd748a351e29c028a88e1d01cc7c4fecfe070a6cbd40c2b7a1ffddcca3c189b3e71ba29f0a458733a2251709893ff109e0ce3cdc465bf0129a7a6c00658a01d7c1fdd0e74bc2cb6e45dfb7fa439cb9ba761f1c1f9584c8616f2477ae8295994eff62af33813eb1182892ecba925d56ba0feaa0715b67db462d1b2693d6ccf588f8b8b0f1968ce3a383b1c9028da34b76126f9bb65355459c96098915c9152f719b370916bf79af3d6997c9def470fae121fa2b7d88e57e55c687034cb31719ee08a5a103200e6df0e8b57fc71020d16796390abc98276460587999d06f1285154c40d8ba242fa9ca498d62643db73a0d1989b6437aa23fd6f087d4301ea7c4fb7d4470d62ae27233c20da19ea6ed1765bc0707a6a49497718b7524984de784e4a6e0b975e65446361a6cb7c537454171aac845de37432845f4eb556d14b797cdfa28535c87775ac450ca5797e12e4e579fc1016902bdf06e9766205d72a45f4be2636bbe5e1736bd572877b9fed0ad233c764c28a889175e5d02dfbe5a1c96c5eb5c04be9291aa321a02e98dd1a325f27a212f96596a7462f1c511437676e6c9f1e8b79b493ffd650a229e8f2980b0adc6b25c02cd3b0619332da8c1672451126e80ef5cbf6f4e80d1ae05757b9cca79014b8a0fe7e0d015d7549ce49363db06e0d2480931e497717a805e9060ea6d02308e39627f518534196b516f4d413bc2714600a0b9154c124f37e1edc1340816bd1479d25eea5afa10f002c792a723fe86e89c72202df78081a3d2f5fed153c4f2bd090b8a5e41c723236f49abcb38166afea60904eb760f090f1a37c19a15f8c1cb90548099734e80095691630961ea8bd3fb21a6c63270a41fcd211a7841486b56444c73e2e8162d50593622b560600407a453a719f15934fb7eaf4f1c469c9e85fdc8c013039e627284e3a0ee94253ceca86a4e335bc15e94a237d76a4891c41f232de0c6b4297d975cd265adf6b0f664031b362076300ef9b12c91bbeece8a872ea2b076aefc2d50f2db48ce407f03a07e4dd4c570bed711fd837020d41e7625bf83d3713917fb60fd4963584becc4a5ee5924cf1f350c8a40e9ac47f18e1679cffd1e4fe3f05185747b248bdc0de6f3f1a8bbb7bc1ecc06470d2614ddf6eff5497aabb8202321008b0eab01dce6fa5de4f2b960b8a22faa126857191337ecd9a103a8d617c1caace8edf52582694dbaf4e036588447d01125c1613a77e3165c26d3184329a0b9291966d07fbf160f4648b57edba0fbfe620d8b0e7f640c3d1b13b02571e383bc888411fe2ebf99e3587b6845ab0a51c0bb0711456f752e9e5507e23f8530b2d6389250d0446911943c117b5bd9c5491846e5f0b7414541bfcdab44b4aa3cf1baa3168d5542fdfb82d774ee8c31c678139e2e4917a6e1ca40b75a6333b767d2a6792bc465f7b816376c2879d3711ec6ea96f1b668e35e8e5d6bcb75519bbb01c87b58c63b7caa990bc290da400880ab27329bc9d530b0710126a8dbe2d2986dc191c569c2a0dd343052839b51d744c9f2d0a540f80aae65776383e84cb9acdfa54baab5e1f68922573d136f944793abbc5763532212761152e5a3accffeb6bc31170695bc80c9884d54145847868b0ae0b7c678ea1a565858f9fd1b5c4915f8b5ab3e0510ab846dd67aa500d7b7d67a8ab7b53da500113d47bd847eed862086bafeb855289f89f8443f3a6ddda7e092cc23378075ae2b7928a92c296adb21d83324276551a475bd0818628b05dba1a82455a6d8df85ac2d5742b060f00b05176e083835a6d462a4f0b2d62f8a5d0d5b5519f87813c8f5b19d89680d5396189cd62804716bd42ca2603b13ca39a4320cf569f7232f758de23b3bc6217208b9c8c59fd0b5f5c482d1bf93e330120191601a6b11ef14a5fd10211a458b2622bacb477b711343b79c0823e65fd7d06e11e52037140560ebcdb74a7e4dc431fdac35ac9db77a85bc27ea28ac6ce6534d64695104b502038adaf6ca1656375cae3561c243c8b5c41522514d7111aa20ad0434e7183fafa6f7bdd814753d3eee4ca7c93bbf3106df580fac6712334480ebcec9e8aef1424053c22ced6ef4b1721a59c12d3cc0a8eabe13385a710c17d04b82176817f9d9e1829edea0d294b033b8b0942f4e94c0f4a77b93d20b5b2a6e4e5d2fc18c7e944a013fd2bdc9e9c1aeae6c4b85a78928bdeb48f50413930af3f30c61529241b8f29b2709d071f292cf618109bd95c20213664980a5bd22dc413dc585a9d08bc48dcd355cb88fa490caf92489dd27d0f20533c492f486762195869ebfd96accaacddba438955f87b0705600412ded5798b28a3b8633259d1b29e3bb14150be7ae3fcd3959c5ee341d88c117d0bb91dbc6988174efa3c4ce0d76373b327637b7b0579b9bc2af2e298301dc40df5b383653bda17b23b370e8d1f7e9e9a3cff35e681bef47347b0105180f04590eeb72a7e4edf9805fa8927df9f36c2bf5f7b4d178e51dbe34be2344e3793f132ac3fd72d766331dfc0427292ce2920fdc261502486c04c2076bfeb9af8e7a4f1edc07feb6347a87e64262fcded909d451d4a4ee791c3c48aa30adf19b9a5e3a353530f4f2d79a004b29929fbe6414c52a6dfebd8d8eba857bc42646b2841fbece03737fb2e8795478677ec406f4f86599915172985efaa5119962c196974bc455bfa5bd7a39cb6f198d4779b41fb8af9be6e1647eb1d487c9c5b9920828da382f31e82d77cdc5bd2ffbf7d21a9a57eb8d5edd6b7db4b17f1bda3b87ccef4a749cbd74ef5b5d42d81146ee9dbe518afc5737f5193c4f548fcd70b327bb814423fd2f2e43a2c98f8083ff5ab60fdc1cd8f82b100936b3e2db3c5b637d65cb9fbe91530647939af2c93e7fb1a1ce7471118614d3cb56e13e46fdb979b7a46ebb69eaa35103daa47737e9f6ccc43c9ae519ed1c4f5252f51cc43944f59a1430a98b83e775e83b7aa063cd89c2454007d80f5e6e1b90950ac97b7896a295c240ea8965e7f85b034d23d9b10bd07e283fa31b78b17607d944527fefd6f4eb5e1c0f52f9be9113089a2e2205c52b13228bc7fe14af07171803aa706df48c1ff6ce546e03413bebc0882d25965221ec9ea437646004abfbc8bb3a0185d150c3f0065c8d5ea2d7104a58493c7fe8c28f68245c6ed213bfd4332b0adad89224f5a89f3e16d85e8001aa260eb6285b8488b8b87e31afb2c3ce741b58ea9c69139325e8751af2cb6d4940a088663f865875691df8c4d24821e0cd433e07fb5b4ae4ac07c43b171a084db012d36f1ae288dd151dc8da2048cfba0bffceefec7225659a04d6495962ca1dc2e01f90f4398188137ff09bc334774bfbdbf9872e36222f898650889752bbe6d77d15c71cf94a8ccc19d95a9d9024b03f912f5ee7148da63748bcc43d0e6e09569694ecf4209220096e5a49e24074f0088af02349ec53248ee75cdbb5e4ac24918fd3a14832f290b5d8912da2131c0203b77cd97fd063aa1684428a6ce3e7ae6c344ab1ebbad67ea2e575814e298b3832d84a1eca34a7ed6c12d19c6fdc2e271b499f94f98684e3ec13a99c6dc2d1c386b2dee857a42c96452d13feb953a42cbe06d778383104991b44f8e4087323953dcc2489c0419731669032401b386ede870d70680c0812958ba9af501538f57cd0227bddf4d312417622bdbc04200700ba03575e4c8a1d916eda930e8f4d0262b64d8472b5ede0d82811d28df2356efa11d524e71f94b51e6ee29cff0a19065f41ca3cdca63c48b64ad89bb60a95ed3984c2a0a43e3ffafc0658e24365c40d791a981e1eb8826ee5b629108b4d895d51b2281a1e7f6589dfe39a6423dfd3d93eb5939f87af770a4c720cd2236270571c9c7c8027fbce83faf996ad651ec0d0479094d603b7e0127e11c173b00cde3b22defec702501309069c1113728ccf872ca2e0693651c64e83091fca452eae8df5e3b7c89ad1b187758b64f01b79e5907e8b89f6e9984a59d86dc13eb83c067eef891bd9f6be8ed16dd4128624418e10237ddab152b4a62ad500f2d09a9096cb43f2a81653b18bdab4c6f2adba3d77bf990e2dbe72d72704f85da39f5405dfae6f96c640d93c5cb7359154b7c7f987a75e847ff953438e3839e5d79ac56d48fd24453aa03038bd3299552216453274482a694daccae266fab0ff380e78883d4bd36655efad9baf1274761b88926aa5724e9ea67e0f5b322889033344094e4958bcf516c1b183499fd121978ae47e9857e2be0a5b1519b62707f8257640bccbd9f8b1f0c9106a3a336a83bf9c2dbba7ea68f56eb0dd80d50740dc6e2c62f0716a03a02edec7eb5f1528b6fe2884776029742de178cb12d451134c0ae10851b1a99c3e97751efb96034f5959037b50962aa41178ddf06a31cba503679462c11023a2ef72a3dc48a9dd5edef0c735bec8d0319fc3bdf4f0a6d4c2eb6303c266cc9fb2ce88054223fafcbe56b897a80842569e1d9dc533a78c42f10e07054a844ed278dcb62bf5dca26018ecedb612f011d6fc38c51a33a91db68531db6d45f33e59b92a3d0be848c521ac77ec310613b5cd69b987cca1df6d053816c2a9133e4ca781d5a0755778192311f3c0b9f6d59c35a38950ef4edc822067282d873450ee8a3d608c1f8dc5c980c1beeb7256addf70699c85004048d1609e24f6c9d209f278965bd05c70828b87dac023a49b51065b1b260021d0de65cffb9657131208dfb64fd0b941d0e1db7c4aa3c4b516c901b5fb3815b0c83ee8d51e6c66c4ad905ee8b4a88bb423d7163d327ca8e9b0d5314e570f2b07e819c1f7de78498fbdf713da51cd7d93a81919889c2031e6fcbdc6b51102539c850e23ee0047e13e2da247ad16391908536002df4be2103258a62a9b49dc69eaf9f8935a1a24a6d4d157e999521543396239d43a9ecd707852c0ce6244acf3bdd520f84ea74faf6f742dd37eca785f22476ab89bbd10e74711c7e7eeca4b7dc39db7bb6b36db02f78c68e1cee144031e3f40b2497e4512d76fa4f9c95f0f9322c064361356ccc9ea69b482d7e91255f4f23511a5b7a9f01b1ac0ad485dc534c092481bd44b0c67a490a03a8d10d3a4f6a334f4dc05907e81b2414863a37d46188947031999084b9308d511fd346c7bf48a97ad6466b1963d0e5489131ce7dc4b01c9f165a14a9958b99bb850251936663c9501350d33265a1fd07d08398f7cb2a0326aac7933a28424383cd7d9a23482cc9e1bb32e5f45ae548c520f27b7a868ea7629a44676b949601c5534cac455304657d95f867e92222ed055d07e6d1d3a52092056de85481de8cde71aa50b6b46dce5833488a8233cc1aa89a8f26d490f83102526b8dc53df3a7d780892f4bc13d2a6beef327ebb3a08b9c1972cb940a6c3c38300a6ce2108e8af91368b0fb15370785c8ada6d327648870002c3f36dea2488502e4fe8cc87071753061bdc943aa98dbf34bc9ac0963913fa92b0e035376628a9e27eb4d341fe46234a400f1684d7b5646bd63b4104acb2ddad02b34baa0fbd5060e24d05b0d6b2b4e28d6c4d7e65ee570bc5148d5422ce236081dc199ca9aa9131715a2e072e919ca97492c57184f01b09d53a41ae7f3cee69afbd02496168654f7e9f0f496a54ffdf741077568796ee8bcda6ef6dbe9bc64b427868da0262f39ba8b1315f8540184e49c6221ed46aa0a5c307bec47e38b68b47c630dabd6708111265ea5eca6c76101a475833e355316e29fdb9f161dae68c36dbdae8a68a8e5880ec33b6caf232b5062c5aeddf79ccf39c09381d84aa5cb5de9b27c7b897572489f9f6bf19107250285f5cd2581301d69dfc41eea46c9034f0eab3e3ba3f7736330df2774cda6bbcba8338de1817cf967165abadd174cdc5bb9fa37fe2b14313f1fc134110bd3f0b398b08e90045f35614ae89a6b62744a24a32926c5bae78d208b91f0f7c595a8b4781151c98717b527a6e51995e267239ed3ead9d2bbf702ba80ba14c68b925139091fbc780e51558b99618c8f168f9d68c6ec9f4db74fd409fa874896e8d8eff2e69660839cc139b6b26e7a742b8f3734c6a01e4fa59245428fde3f50b123fe3534ec395ec3fe27e1548482ff3ab801f11782d41895c914163abe54a95c8e286d914cc8de168a43cd7c1c5f8461d63747497ff33370495f6c1b8affa6ae28218c61a0bc27c445fd452332255e9c03b46d5aa439f1e06a7944199badb98810c47d905c73742a8b24d9466c77eada2f0f0ac53ba3eef825813e3b85e5746ee125e8f1d5ee10ab19a8b00d0e207663419a6fb887084026487dc37706b27002dacf64df5504a22f4f31075572217a34d0ba9cbb3ea2a7926943c3856a562188279215ba9cc0d295d3bd70b2993f161684a7fbbd5bec11cf98bdb64784a0fe9a605d1156d8eeb9128723f1ac5ce44a4d651ddcb69ea0a9ec525418929bd4cac288f7ccdb497bb904a11dad61eb45f9989c6f1cfcb02971d7813bfffd2408414048b076264f9530bc87ae77a0c92cc9cd74d9db25eef1bbfb3a0fcdc2216a96ea3c7ca4f79e0f2c1a3272cd45e207e3df038e70bec16d8162954e217be0c75f582b8a237df6030db3e77f120a9bb5b88fcdfe142b1ea619050fd9c9beb137560080c62173555839b34d9c7aab48fd48a6eac7a0251e15ca80860d642e29029f35ddc8d5a982af46bc59654fbd88008addf654b4252233b7089daa5a9bd427681475cac8a6971f04f0b0dd3955c1c4ca4ab4a74ab14078fbb612c8daa05e36364b7f136a513a5bf296e79cb732e4dc58732e4a0965994aedb2131572b71a196df33ec2998c63d374a1fd90631b6c4905bb2b4a3f3d6164124d37ebb27bfcf083c0d35f7787121f78888e6e5c7b2e27ebbb6b2a4358ab317247dd1f3c70ecd1e17b5a8bde436087637fb79985c747f95b319804aee229e2a068d0771789fbd11b41dfbd8537fe7909b6d4b24e9540833f09fc10d2e8aa96d1666bc5c94becd12b9058f60f64920e0fa3e0b1df11d9856c727eb1b9ac4c3612140098553a17b1bac37bc811af218003e800b6f74114fd1efe9de48bac6af93bba3ef00ca4ce56e297853da4ca12fa489522f9502e5ef86fe307a6982be88e26fd4f3b518adaa86ce25c56a8ebd29ef419aced73f064d8bbaf0a63b06d21abfee6fa6eb4fa695a7d2923ad4a5d86f89bd13f32c9d50b0a38f8f3b208f05ffa9945b7920c75e41486674ce086f92ab2ea4561210feafaa33b1cb532fc346791ce0c3539dcf2437d1f5eeb5d91c80828752677a2381ff97919b4f32bd06e86a7b5ddf99c01d517a864697d7e11d90a0404bc04f660570381b90f327abe9e2c23b76c20f05765ef8242465774dc1153e2399be76ebcdab4ae7d1107cb1b5e8e55687fcc6d43b4e875c74b3fa088a539c74c82f54661b1df83f8638e0b139271876ed2b126235169c2c2eb49601509f12c66b15b4a2d301667a6483f25985d945af8f8685c68a13397b70c48a58927cad2e46b055f172484216634b65b04413d07f5a8a4598046e2d9cdca3639661be2785a930e160e92f66e00aa5ad717a83aff973ccc3ac7c3b664480397f83a70788c308991966f54fa68295b2563dfa57530458c0811793579fce4de20a4f74fcb24ae8b56bfefc0778a239971cc3e8116c64ee338fce0367613fbe012246762fd24e046ec33fa6ed9c03ef5c1fec901725cd1b059af6c2546ebd7715acacfcc520bf183e4cb66c7d89fb9eef5fb4b23b91df9162a85f407b7152c11332bb7d08918870761008e165d5638aef62dcc4aecfc0d7d326d0fa791d6787842dee00d98b07bfbd2e82700e7ecc2ab7026bef413c3ca90a91fbbbf15800c2aaf0265fb6e24c171482d8bfd7bdff70d636eef510676df7a31877b3d19c6a3665d90440329b6a27d38a1fa57f75567d1ad40285bfb444bd412ed095e1fb2eccd220985de8167e2b6f779dce26c5526471bdca99bc20046ed84923cd5aa16e9ba428db2f6cc05ac198cf9bcd0d293c12fdd02493fd2939ea3a5e8dc0d0ce1fce9fd08ff66c7397a5ccec98038cfd3005692e2a58a77fa31a887eafd3f398fcd5e245e6f184af4968a0e7f4a4c09705403d2fbbae46513b8262d6ba454b3d87a829e01e2d85b145b192756515330931a855dabea6df53cd9c20ca8daaafe18382799d5864198b941846860bbeadc0d919d53cf54568a695aff4c687d0102c8c755bb0fca8560dd8a2ce0dfbe07daca05ec5433a188cdd91caab4a83604a33fe48ceb5c58dd3daeff00ba620103e987b2d4f61511ded29457407be2068aa627cdf209dddd5b591ec714aa12b4736483a32725c906418de72f333f2c34ea56892995b7b29f9d6fdf4b11002c93be3c9a26850e9a98abf648b5363fc8c8959ec52246a9d894c55b768a9e7102905dc23a464ea19f0da79a55b96b55d61e3820c83be8ed0de44f1cf047708068c9984140b55e5d148fc4ee277e63aa48f6fc3b6ca3f241f4f864e6da4c085cd15c53114bb4396c9a0c6edb81ca0d7c14134e7737cd4c7c3c131837159798bb4a4914a0f9acb95a7437e7b803bdd30606b0556ae7d24400c56cbe83cbc1acf0402fe21e58114039db03ab458e06141fa719751389df721032ffd117bbb8f3322c0081a4b04942671904a4933a30838ce4e45b4d8dacf22ce1fa85e6465f26d87dfd243dc9f5b7543c23769a70087491901322688dd91f7d20ba4d4fe685ba0c98f51a96af54747133822d24501273a94e968e054782071314d5ac3ff1f8af1f2b52fe7485cd1f58d49551a1caccc0ed1b40c1ce400d3b25cee204a89b9f760859f2a7749d1a9cbf2f352582f35accbce1b7db45d1c8d969da55c0ad2a648df9961bc99037159c2a6a4a7575cb1076fac1973244500b0b22e913b81aec4343bb4b209b0dc63732b25bacbafc47b56d69f7dd23735f4de2d1aa3bc62b673a4fc15b636b7e3ccb76c0226230014c50922fb123229ae3269cc76c4e6f81bef761b7a9371d98829a82af49d5486eb817e06fd4cbe20b849ab8a43f7f883e61f39827217346fee5ae1596282b0da739d87d78954e5b9c2b388ee9792de2509a473f43452234f215e79746a9e6a1827dbe8da31aca34b8894d7347b720681868a15c1ef44322b836cdfb6922c355a5ace6eb8120bcd07b31bbbf5a80d63110d0a67a7e07ee7b5c94cbb345dcc21224578e97700e1ba1be247ca237643beeb3ababd88a1c76590ae26c3af2f58e0706e80ac9ae8ddabd876509ee52c26f44c569493625f00339c5e2699b3d7a84257487ce24831a9e64240689600bcb03bb967fe7f45249a447fb5bcd109e7bea2222345e4abe1fd5419be21d827654fa0859e6d7db3862fc33b78173d283af11e2abce3e2e4bdf61e3b240ccfc3eb78cce21df68727ed88c7f374a031401e46590d081b5c98f12a7495738f85f251b3b426714831668033c87811b652c9593283fde2191c7633697f6596d2005c864348aee29cf947a9ca4d70eca9e793c2bfda95fe712d9558ca71834618c9817600c0aee92f7ec380b56edca9eb586d553ac8d0e40beb1f3d99ed32fd6210a3c7fc3f392e642f8bbdd0ac3813028f10c66420a41269284138a3a50c3dcf62fb2b41c19f8988961f720936344ddb5c4e71469c07a33b3de049a5794b6984816d646e408866eaa390fbcc73b6ce17ef0984f8b066564542541c0c931e8cc9ddc67d628a0b107763ed6fb1a770f8b8c58b3ec2f3b52abaffd58f7b7de0020aaa0cc8a1b88fefcc20c3ef62e0213bb3fb31e817ac581cf08317fd0036a8c6c6e1b826c9cc8e3f5ef3a02ac7035c88ff4841b650c0b3ba210a96b080d4c86409ddb6aa7f4a928848aa8a5468492d622e8b968adde610017310528a0fb8d68857c1648bebefaed3b875d10e1e8f3b2e89bf0a8397f600bf973ade3105eebbbed3a18d8283c5ea96e64e665353ef27a133463386e553f58b4f0d2e6e1c28c70f033b36a32ccb9797e1d0da3dffa397ac8f1687df04833bf438a6d863881b1737e66f7638bada1a125336b2849271d6369868b1f732a9b9ed46679edd9f32f51b07579456994a7aa2f9323e31f1b90f901b8dedbd9928f6dbcb053406a6c70e13eb768a204c53da6dfde2c76b3713dfe506f22a5be6571cf06be3d028a09bbf7cc760dd0dd6dc5d3932fe22127a4101e36a7b23d465ec047295631171b3263d4481a0357d1a86918ace00b4d511e36c389885b604c49f63a74210dbe94304f276fc52d0061fac0aeaf6b3b6841ef7e9a0217f89512f6b8be416f30342cc8490aa90d7386a2869af91b56b89895467607133ee25ecd5f4b9348ba347c68cf96704a93fb7edd6688fa19803c15a20ee3dea6d16d4c9f4d0ddeda5a4b7c65ec7ed4f0264a4e768bf2410af5ee6d7e8649bce17be1e8b920f0655958876106adbb6a651f26459d5406d5c7b1d95fb44fc0a44c98ba3706d6974953b397fabeda882e50e59cbddc036bcc8c5918e1ab0967ca3df060cf03f4abea94c83be621f1c036d9e8b35738565dfbf7705c07b1d77869eac6fa1a045c99fa955f8a6ec484684f3441c6ae28c6dc9372f987ac9df3c540978b4ffd8321ff7cb2f1adcab2830585f339ed8efbdac0953a003662292ef4eb3d211c18949b852e6210538529e46c993cdf43365e3d878b15255acbc64e4924255c7b68368e0bf7229409c7e4f9ac2d089a84de78b1f9e3eb1d89d4a8dd03de406dd07e19cde73a3dedc5c80a6ff57c320861aff9d88cda9c47e41221442beee8ec04f83b9c6d6b9f2685d53dcae04929f4857a1328e888c219cead49f71b91d476151b0a2e1903476ff056aa590a180963984f11a8d47dd584fbd758ea9e3168f19ff7a88b1443fa05545dde911e993f4192bdf0f18a8a5fc49f6696d5c9be1a616d4a93303265bc7ea4db5421cedb83f2b9e6d366e729dce879ac719ab05635c4abcdd0ea6bf68adcf8403a5ebaf5dd2b7f2a6b683f62305e5ccd612d1da0c5e84a6b5d52cde72db03c390a33d68660c363cf07f99a1ea6fece405db050280c0c26caa49a8ca7d45e5883807667080716119d39d0c55efd3f67cd9a5bca18afbec6ef706029c7818cd8f61b549c7c4aa002773866b112af0bf7bf39613ada1c0f20537f072b1b21ddb92df7e1e3efca681152251b8450b03583f22a14a9242e3eda8a1b60d0b55b236e498597696000efb9747294973a6dcce0fa3a2361d596f631e80e63d3754887677435fe4551b5cee034d256072bf0ceea41a241c47cdd46ce3aa2b121c6e539212a3f7a34d8d96ea890f9c5dc4de2258b937400329d4a38b26ffbbf1c4bcf5fff32819dadc2d2e9e921280c3600551ea29e503f3b58fb36e8d241ab279f80080d1846281bbcb56a40ab15a3639fdc1f608ce280ae62b0593af731ecb1483a45f7661ca868cd1d1dc20e3cba1bfb6a9a7628d91f2d49033b404ce09a88abe1dfaee74935666c4aa9094dbdd1b37e461f50a703cb3ce5a5fb412049e81e6987f4aa491fa5420e09ec9dc9709aa46889b7d16800db93c2b45d24605883524f4c5c6ab286185a32bf6a0106d6361b9b2ae6765a4ce42c40a7d05fbdcc13644b855a6bd9f03471756d879feb66698d8be4b35dd984a0f1a2637b918c6008d506469e56af807354a962782cda6f982ccc10f59a94a0e7d0b64f0705ce32f0aa8b4241e0745547897851af4e010c735d9c5be48bcee76556d174aa5a80887569690316b45f185107f83f7628e086176529807345afc27529f8aea6a4f47c456dbe57b21bb8a629ca53a4eb8905dea4fd6d39aa8081a678853b2252efbe00e4652d097580754a4045af667c657301a15713af9006f477c6e98d9c1eec6c149551c410e06de0ef1c6985ac26f57f1b981c71cfba3fedeeca1653e4e0fceed2a20080045015c185dbb3f6bae2bafa21815f569688be98f51c21e417e118964d444c8967bef810c600c830cb8ac1f08939c741066c99684f410e92aed6d379b919a229d924817f1cc29c01592b71941c22d71cba4a655a3afec9a14973ef5535e50af988b71d414e8a392ddc237b04b385a8cd26a9047251b7495aa09e18230ad3ab9406379fb0138b93a3cb9ec783ac2a5292eadfabc0fea508b5a75e23a71d98bc692eb58b6078da56859d93e3c71d93e091251579fb169fa64cf5d5c768d07cfb09d12f5c23872ff2b712bf776b31dc9f4266bf7c88fb3486819b6d373ed27048942b43689040023d1649a3a074861a949643609cad2e19a064084e4f0a689cb0b8c2be67559dcb088b168d6fc849937af7923336f662aec8a277f88b9e2c91f5e62dc15ffc30f37a4cd6b6030d80f2cc81f4e8abfdd7acfcc1634321c8c0c6723c3c970329c0cc7b9d0c0d8c4cc980c3765401a4f83b9f45fcc9bd9f3d0ecb54ba6f394524a29e5c018dc0a5cd1b84093e76badb5d618dbaae7bbbb3b86b6b236995a6b6d8c6c95d1982ccb62d8552ca665608c5ef53ded9b321b17a3ae5ae3c2ddc018dc8b1d3dce4c147dcfbcc0c4208b32302e73a2b2899a1335c7225c9e4f344124d30cdcf9441342f296e7134d5421d77ff3b5073d98e7134dc85439d0630fd03ce49ea8fa9208dc3953d3d2793ef1840fb2886372766fceed86cb0d1c1c11f4893b62848bd5d4e46242b89e4ff0da37a6abf94dee554467a3e4dd57a39ce592138fe4ac246921b991b32ea693e9664aca0f8b7311967d77b8dbf8697d584544258fc5fdb02af969e962b8d0587263792fac8bf9b0b6ad2e71b96f1809db92c1e5702e393b5dcd0f09feb47c583eaee825500704ea7443405d914e080d48ea8046a30e6804927eac884172761fb37b7ddb28466179130c7d33f1a8641653492d9b5c4740478ea0b4b67324258d6ec3dab7d2769456467965f11c4669d950581b8a12a0969cb57210445edb860f703d5163e2b6aa3f7ae722aca6b66717619e905cda0d24ca3db04a162df42d740d6f25395392304b718944d364eedb43de768e6292127d0facdc434c56a91e874f47a80fda49b653ac921a09a6df8438e181faa09d7bc992c5d21493b377f00cee45c491e213a964769b9cbd822b253c37908890864bdbca9a76d1bd12e68008631d95cc300c765532fb8b4bb37b9f96d245e7f287555373477f857e3b1d69d05c7a06c2287d1b4b965cbab7e1128ceddb59f286bb2095ccba2295cc2a99bd8355327b286bd8b6b2a77da11845b898035d4c73dcbda2f893e40f5d0c0b16b695fb151c93b0ad550f0d976068dfbe8da576169c43c313b32a99995c7dcaae15e196af29718e9c611c39c3377206835b8854d56530aba668f92339bb919cbdc8655af5611d461c4b9164bc0c0c468321c2d5cecd0fab55d9ddee6943b824ef5e2a2924fb463276392ad9e988e9784ccd43695552bb4a0be1763c76f4556af7e299f554729eec1bb872c719dc919b4a662fc1dc4c8de28a19ab0b51b8a021679f979cbd14dd40c2ca19496bc85d711537a25f7223ec4d4ad0558f92f622fa252fc2dea462b461578c367ad8e897bcec645e93b3b27be5ec990d5317d32abab2d14386e9f6364ade2f3b9992361251f2be1125a311a6f17610fa0af7c3f2a8086b951d53c0b232bd9f029655c9b3579a7b3f2c159f56ab4abee2324abee2da578c357a68a30cd3558c35ec4d6349abd12f194b1acbeadcf64a663761b24fd94bb0d6e3fe1fd63c6527194bce2667db081369ec2de660bc128dc755f1929b5c261f35e57966e2618a293f2c1126d204c9db588a4372f6f2c312692a99bdb108eb5326f6c0cae24bb864c9a5dbb3ac4ada28a36fc71a3db4d750b16963c99b65c55d63e2927cdb4e823520dcedaef2662ed4a798256b1889a6c9a1f18407ea83780e97e42b8b57e92235253efb295653338b3fe181ba98597c09cfdc3db0b247bf5256248bb09a9ad92938448b8a979c8369951d4bda7f1b296e7a3696b4b144447fc58bb0ff68a3e4f62b461b3d64948c2cb2db5031ce3e69da0f6e8ab124c39a46eea54f19076b951d4b45581bab3e8b113d72b03e65bfa157ae7309617a10dee886bb16dcb56246b07aca3eaa217dd61ad235fc9b4a9664f4eded58e3b1919b99b12337d3a755e752c9ec20dcb954b2bb51c9c61c0daba5aae68ad5b5d05cad635532eb34ba69946a25f483d5d04dbb4649ceddbb1ba51ad56aa5d1a8a6699aa6699aa6699aa66d9bb6695996699b46354dd3348d6edaa669dba66d9aa6699ab6691aa7514dd3344dd3364deb344dd334aa6d9aa67d5fd683bbfddbb40d839f76105c01c1954d0431e566e46e1b8c8ad7366d4ecfa66d9a77effd7cb44d0b57b6512bbddcb66ddbe8b6bd94b6536dd3386de480e0c69264c72d3f8fb5aa24c3d628c9e897bca4cfb2b2e3637dcaceb2caee35feb4fa94ddb3df6f62af69d565ace60358c643f4297b833b20d0a7ecd50a57f472ceccd9f5d3294990b7af44584db1e4ec3595cc2efec39a2db667db15f236ce890a91680f8d392b7162919aca384e84d55496e7139c98c9df8d18cb4ec22269c94e72a3aa402c71884cce2ed6b4caaee8f661d5544b4dad68d55478c3a5a6c067ffe0a82952cefe79a9a9cfb37f72d41449a5453c8392706947b8e47ce4ec223cc3660f81b02d678ca3c9d9e56c6a68ba1b35d579f68e55539d310822af4ace709d4bed5ac0b1e46039fb37c27863c9b9341db748ceb29a1211d9584d500108c83641853970324d3c8103584d9597c9d9cbd77c585d4cce3a59458a8e4cd6cee2726e3698b261793b95b9db0ebe9dc365c380e8c8646de4b6f74cc39a860d79fbf6b2c16cae19cbdb3936379cd88686bcbdb3d18e4c1641cc06dbeed94f7b8332ba17204ef6c08acc8d73a2ca12d864eda5086232121b2c6fd770e9d9646ee3582c15641ada699e601062d6c63951dc383bd02adbbd1f93fd93fd32afa9a97a2334d0a7ecdd88813e655c4d8556465432b3c22d674c0435a55d04356c7276eaf251555d4c6a3ea109989c89b09cbd346594f522e3c4097249613418275e904bca6355d256cece6d9a5863635353e5bc1161a21091a6a6eac5212211532e4558a6815675a05538bb1908b23de10845342ac09e10045603716b9f0033933d0107ae1aa40927d0704304879d5d839b62aab82992cc94f54212744421534fa62f3f6faa442fe3ba43d772273367ebf89a9a321912bc928cd331097a3af6984f82520264b5da67b4c9df50d3ae948b43958147a3e6feba52ab812b5a566b666b13e1d677f965cb8572d3ca83d6ce628645294a8085022c504f7d239670cb1f7e38405bd174b938dcfa9b37587a6e5aae55b4d29a655a766f28cb7ebdceba264f6d9cb305f8811fab92b803956c0d6fd6dacfed76b3dfec58da6c9e6a9a4aed40255f7063b8d795c96316875b65aa4cab38f01c56d1a1a39e5474f0f80eae807b0a3aae9b50c0d1fa418628c8f8600e342c4d00820dba00871d3a5e8ad4a86c81054738f2841b760086d50abca780e371e7740d70c20847f8021072c8608915c779c7bdc7a4821c5e32675c81c8816e8c010a353868c20c4056263af00214ad1e37629085558feccd1aa24f5d5223656de170dc1cb9fb94c7a579ce4401938320325353653961411099c994821f10f7de9beb7e23326a39611d91215c3057285551d897b52ca3b43ebb4a1d02050dc055483d758555b2276c7255665e2bfcd0a73ed799d530fda15544cc2ecc28c62126aa4fe948274cc610cf25eebbc3949943b4583bc6ce13fdd7d4d65896ac416f88e1e18a71f18889e1e172b974c0b86074b85c3a60606072bcc0bce48081c9f1f292ddf3d0d35a1a4b9de1acd4e3045f00319d20c38b1364c091db0932b86434682bd05a1a0aee972bbd95fcb8df5c529255aa1d626e84053050c9be11956c1693460146586002a9261348a72a20d3d245a609c81401074029002ad31f0640804c05904d2954ac38ed540032fd0acc02cf3e953c05368d2577cf024660a0557a39696ed4964bab964aa53a81745792baa02c51a80fc27492a09bfcd0efa7da08cfd82535da457554b24fc2340793ec8f30ad0125fb21a63098293a1e511f04caead396ef7dcaa3bd8bbaebd8e32bd961884d2a998df88ce0efe819cb77e80c72df20f70e72f70462ed04328164934ab68918ba31a18f0a542c2f7da139280c7dd1ccc45e3f82d01711d4a02f3447930d06e1c92815670f09b2410d01b97f325d2060fad0f7d02f834e6f02c22cfad4ff703c92cc600e0a435fe14bfaf2a3a69020f3aba6b8b7a521886954123c08d249d2b36895e77d235ae519e94b9f685982fcfd736f2cc5cba21b3fa578c7ebb5d7e94c5abb43c1b1a42fde0b7d4d54bfd17067d0d6c88dd4c88cc285b64e0bde9ca2dcd76e682e2aeba2c520f7129a4babb4569f9698290d06d3d360d0b226c8dd367dca138c41575dd3a7e67215e2621386dc9f5173a9c560f29c37114d213be92938019aed48292c533aabea0611787fb4695510ef03a0d52a09bc0f0057ab26f03e00665a4581f70160d32a21de3769b56a88f74d5cad22421ccb1f4a167346c5cb09c32f278d0d005ece9b19a3ad00bca42e2fae18fa9aa1301a02bca4363ebca4373496f2b2b60af0b2ba18e0657d39c0cbea42c0cb1a937a595faa977586c5cb0aab342d5e561b172feb8d025ed658b718f0b25dfaa55d9912817b08dc42e04a015c2780ab04700d02d39a08600a03530860fa0263a04ff44060953ed1afe0f789fe01d80198eb13fd0ab74c9fe8b38a2bd337e025d333002fa05b995e012e5a2480852af58ae99301700170ca0f310260149e7d4219c02926d393d835fb14007c824d0080473cfb94c284290561ee258d2308837a9119f5fa2197204cca0aba8c7a4d94162ee825a7fa9ccb15148661188661f839973d8bb7ace5ecb567334ffbb6cf769d1da37f46e30c97bdd08ace569d504a6ab617ff8349559db83418ea35c2de076faf3ed1a35e1b904cb720993e2403aa09514a59dcd86c8157d0913a5247bad714b73ad8080273c686c210281412452e1c776f28da30cd224d873ad4a10e852f4f5c2bd30f930c10ed21f6967045fcf14494526b3bb824e958d2b01b367d95894b1fde64a4927d2235956cfb0fa62bcf8d8934dcbd2fc52bd2dc9869484dd59888d4547890178a2c88653f123c330b8421f2341a8a426b3dfb8970f8d144c45463c4626a32428267bee9558a5ca6c2dcbd0f9b68845c2ec4224c1f7a1fa52128e44018a0d104049b7e988408a9643fc58504d3fc71a657ca8b905c623c839a8c988ae4369986e4bee94735d1942621262035e5827a7963298a9c710459fb193aea472545a81914ac6f3a5848248ae20689078aee95be9a8c5e9288726282e4be35013185865c0ccc9ad902dcc144f59b44ba37f4b6176206ecc9147c41330893850bc2882024c913dcd1813044f18c9a4b1086087b91742dab2385464e3e4a26507841182010280c41f3a323ea758f7ad9b14405094121f0e380a2d7b8f27ca2e6251b20cf27c430862c7ea09011d029fec975e261fa526849b0a29a8a653b00bdf48830072c3ef1a8649f4e31b9ffe2eef88c496c30aba22c160b0630abfe0784115e34d6bc011410d1412827d0a942bd266a097383cd169c6c3f9f90fba007269fb85a75729d5ca190cc8d995e29395260525e26ea870c13a857257bc8d582d0c13a186c058499a8be45c12d41180a03bec0022d390d8a5b9e5ccd5df1240bd82d4daf13d3ab44bd4c2f2068b6018544b863454826ad94d2f233fda8a7141f8b9ba2a5a2b582ceee84d65a6badb5d686f74825eda765acc12dd14beefb43a85322bae9d5aa7e699ac9ad5de1a2dc4cd469e6aee8342b5cfb59498e859ac95c8b56856b8ffad1c14e64489ef22272ddfb293836cffb292eb30525bdf394184c172491e6fb3cd97f6c449a56f5cd3cd9772ce70ecfc98963d74cd2fe835bda66a6d84f1671d74c94bd07838023278af4856c3fa70f657741c43b46e746ef461177a758cb9eeef6db390c022e77f748c0956deb211260c99da599284badbd4afd422e51af6e484af8d043a18794aa548a720344b1a596d2d041a13034964e789cc8fcc4c57141eeace04af704ea05137d0402892ee9e1bd999514dd18692c6d2b93ba8ed64f14fe25fbbf3c7195eebd36b46128a354025d748d8950281412711d0893afceeb609d901eddee84bcb4ea3396ec4b377d3416f1f9e845984a63d7f489f4d1487a88c4755cd75da52fde6e2a49372395a426442a69625349939a89ea8b4476c5f6db85de5c271a6d88a5518195ed151d44a3cb577495ee30c732b169554b8f1934b89c5d89af7a78de390d2e73de37a9016f12c5742172e3f779b7389bf3c4d5aa8ecd13e9a4dbecc15d6492d9d8369324bd04b7f4cd4c211d0549b05625f7aa86dba633369149926aeee0263251a48b980c99f48e62fa40ba673fbbe3f3ec730f6e9b3e915e42c29e5bac650e060197bd255c4f8641c065cfbd92c773d25374914a92ee695ba76b268af4ac4de1924e322143ee7b250ac80d0969bc476eecc62a597e42aa8a6d26d7ae49111a520ad5e47e294493fb25708810ac4f7da492fd617d583746f28d183047a3091524a380d86e26378974e23ae181b5992b5e93c22d452e51b8475025280dc712a585a28437674a8e4a768ac6c42551a9448c0ca9a194a2b028aaa5928d6a55b251ac13d7c95553f4886773f8f2e40aef81f0cc94526be927180a41b7a71ec5a17bfd515ca9e8208cd212a25634a2b02a1986d8da832e9e6141d68526a7c8a40081c22d51afee9e4551028585d222b22c1a1d8a12284aa0b0505a505a282c1425b67ba4a6b60d855553a4dfa3b45017335f94564d5d94170a0b450914168a12d487d0b236524ba6501842a48891dc27c971d23a7181e158475058284aa0b432f8aa5e085b518e4a3608d251533387f0cc970817f4ed4825391047ab28b68874e4be28476e9a2034319e06e41e113ecb153553537d14aca648630facfc03050415a4a6ec18aab4c6c4d5ee4d3a6777767c3ec122eaea33a25ea8564a90214066401614e24e4389cd16f77d140b0593ec77582427ae93ebc4e3a718cbaaa9c32a8982997a16a60caca61a8a4982de7f168464d06113052a4f2e11db4a825e82b97a02fd83475e08cfdc03cbde87bfe40ce882b0280c2d4884670675fec612850eb94f5282e7ca8343b84b91c929ae4a76789bc223f7136e897a6db12de6596b6d49b37d682c5972285c0985b7a2db1e58a287e44c0681c692862df17e801e8ac6926650082f83461108db9f40a0f7c07a09b862551a84ad4ab5f622b86243a47798f4ed86f4eea723d4c5cc5d0fa493c4e40a4e80933bb412c2f0b21d4f50ac4bba884b54ebe47a420a90aa0261fad44f0922a44c1992fb5a4b5df54d6e5ad5c1fad4e74c621d6b0e048ae75e8230a00e3026f72d1679210e5d1bc2057d565248d9d5e4fe160b3f11682cb9108b5cfec1130cc53215bd54f28a44d4091289442291ec28de0441f3a8397145bfdd59565d135774d21585d6e2d05a1b860fdde2d086a1b5d6f4c30433c12ad9250d9b43b727e11274d1a7ada9f0a27b21b607cd3c962c3db02a195ea54b96b02597f6346ab60f3dc4f6a1d0da300c475b49d14323574991682c8943c49b1b4de66e2f4daf5b8a5c72f7452fadd25cfad47d918b08474d89a6579b5ead32b9e4dbb11f8e462c251929528c1b4c076b956904614a7dc2e3c405c25c3b86425efd9c509eb832e9a1f020d0a80101d4b188422743b4946e2a8d367ad8dbf8bc74908d929b0e2a5dc6c7a452adb5172fba4a253dc42c59844b917410c91596bc4c79398969158df5a9dfa5482598c67c62462f694ca382c44026452ad92637b94d6c4c6afad4f846c52d0ef56ac265c93397b8b5dde493cbc70c9bcb93cb62dc026d2bdb975cab1d4bce337d9fa7dc141c397c99f2923b081d4b14105178d1492412a5a0cf4b4696152814a2d18000c26118e24ef4b0131d2412894427e1993de08aa89257b419c914f5ea94d6e89f872ff95cd9702c11517ac98b28bd64b4d1c3c6e8a571f6c98e4594bcf4d268e3f39271dab1dc605a65a3f492cbf449fbc12d8d2519a3977cf4927183e913fd46f3198da522469f4fd088cfb8d19494a8f8b69abed16ab9d4d0c060a512b852ba51c9a694629710e356257b6e362ad4ab4ffd90c3916988c406e370549286394a32469b4d9fe847e306eb133dcb8afe83a90db8834e222bbe595323ddeebdc577f49297a8570a8e9497941c35d5e17c382819d4abebbad1e7a3cbf87c34fae753f20fea857a89e2a8ebe056c93f120e8f30be1f09ee78366d3c7155b255f0a864831e824e6240f824064e9a65e0ca89c729e6e4aae4c7e286d7c09513e861c902c2a7987a7255d2d64e78e251a23746ee704fb6c845bd50afc6ad100585610842a26359f40aae881e8620126eb5eae49aa73e6e9d5c3c50af4a86615d0209db5aa1b93b566b70430f71097a35c1059d74195c4a6328194f84777c0ec2f73e18df005742e38ecf67249d78d4533f035742e3c9c5848bfa514ffdb6a0e81ab8220a3d043d5469775ab98f7ad514cd19f5a3a64263890292b3fc614d54df18292433518d7a55d40f1046c9fcb8e589abe4a46bb7b7020027d7126e89c22dd4aba628bea1848b5d70ab3cb950af568dde47c9a0666aaae6ce7608ea75c2a347b72c160b052bfb1f5af5b9bd6883654d07ceb65740f15799d0745cfaf2444dbe89fa5149944c25fb7644bd5e97be44bd6a0a6c9867721200017c2727e00a1227e04a165a6badb5d6dae66e31f7aefb7c74931a132235457adfc4a69a14a929ef7d72e156ab4aec1b7c797261178c5b7d6a12e8a48ba268ff39cb2ab4638988d13f9731fa67acd1c3bec6e7a11d65947cf49291651512891e8617610d0837b4f6a18302de76efd947bb5ac675c06fa3770ef882f32dbba6dd66d97b606da3ada41d4fdab7ee9e7f5c0f2db9a471c20375f17da351479fa010a1b1ac39e37a60e56d341a3f5cd29c8d5e8e46dbbfdb9a0afd1bbd23b8672f496310d9ed98e1b1f4bdbbe6f14c00867df64cfb965dcbb2b20756d638e00bd2b3f188eca37756f378b27724add348ddb92d3be99be6d1b4ec5d7652d7e08a97e16c668de338ee2a35c3367f232ebb06bed8ce7987ed555a843b0f61f020fc7dc333577cbdce9795db966ddfd61fc766f7e00da661b63e1c69d8ecd1ba6b63d364cf78c4766b27c08ddda895ba67ffceb981c9ad3df3bc2467f2377a4bb8dee7194b72e685fd11dc58520d14e2cbb6e4dc801889cc8ee50758b2f6efde4fde4f78c8c0158f839ba6d3369bd90b9165fb2c97e44ccee6b7537002dab9b1a439d3b271d679dca92c608765f03c9a234786e918983c6f5b479eb79d03489ecf7ee4d92f36458810b189d914215289d423cd8ad91421d2adee963c6b80ccc8340f1e15489da93231f31a0fd816245757ec881123b1d81123d648acdea82e2f68aeadd81123f5a5e6983732407efc901142039301f223fb2123042603e4470d913c5f9ad6d2d2ca91e739eea5bb91e7bb96790ed5e1b5e7553a3dca9a93d6da6dedb6c1e6bbae862324cf7382dc189945f2e43a333324d6da5ff7672d175a11515638e00b9a4970c50bb1f8c01734731d05b8bc128c7ebd5771090233574f0906fdfc0bfa7916af09b714041d5ff23ca594524ab99a5a6bad5b7555579eefee6eedc65a6bb3579665966a5acf9999d1dbc12defadabec9ec7dbc1e5c0187405a3be4f334bf6385ca764c9c61e5f589a2908c38e73a27aa479c8cde590c995739615c5a56d2c11d1a797d1357a6ca30cee9cb146697b789615f71aa56d9c2183fe7a3af7408c59e3b2ac7ae4c61a3d4aeea5225c5481084ec8033726c1bdcf924123cbaac7f624848d87688a3ff8077c72fcf8ba73d543d48083554e18cb8ac32cabef1c10d0203a5316f76eac51a3037daac7c06c11f4a97e468cb9d2409fea3d1063ae38ac79d3d59a370a435dc0170e0c07c430356fe087b71104d803357fa798823364d073c61a3538e78c31e6aa85be858e9f2b4ea5393c571fa6d9c3259dc99543f36a822b33c3ea6b9b591bb3b1a445725d955c5dc9e409802434964ea259acb64d81ce19ab3e2aa55438834d1474501b0a8f525a2b4d9d73ce3927a593ce2cd356e8ac737edb4cbf181243268ea3b34e1392bce9261371ce3927a55743c1a5ff40d0c867c843279df77e3e36a493cef91507b8c97d8f6edc77dc7acf821ef0987093874cc3dad1f3caaeebbace765d67bbabd4ed2a95d2ba123a48b401dbca16096fe649ba3112a9a6b28febe3e3d3f2c1f181f9f0208574eca05ef9440c3f7b0bc7aee913681b41dd588aa093c612040a854220440fc718a08b26080ad51a869f967ba49efae328a5a0d38fd3e95471ebc6502fdcba5d89c4bd5b27125d125124f17815e3c037eaf78d5d4f4e2e1049e8e4247492432f4fb2502804794ef22611dd9e9bdf4cdd5b4f23c3bde50e3af951c9131f24dc2269b865b531dcf2243a87cbeea21bab0cf884c66d8c4223113d176df77e1d4dbb4088bfefdca385d65a6badb5d6761e76eec55b2c72b66de3386ee364241e120fc93d60b86507f30e537369aef9f47d1fd75dd7755d8b9d7733288927c3e57644c49d4f901b193057e58747d9abe04a8988927f5e84e9a38f6a3ee2102da57f46a3d2472fa2e4a6d1c6e7252fc128993ed99108ba42bda0b84874d14b11b7307e9ffa25dc212e4f1fd6e58930e828c9acd0c53c11063adcd8d8d9d0100b2d1b2c3eb96eac9240662ad9a1284581c2300c0f42a18084e1d26b60b821ec325be03081cd165366ce1633d4b1993122d1d1b64ec7d35070b556e8a857133d5b8030ca4d0b50dc30c93e492e4fae89ea7ff0c9d5a7d310a60f3de3e5f2e40a3f657ce0520a47206a0eb321b98fb24119a92a52cd145e1044084ac6bea00d2c18c02097a822b9437b72d1d454295241bfec86e4d650704320102a328d55d248a988918d4f89c59645a9894d2545619e9f8f2c2bb4a0d2a4268bf589a6055388d6328122b7090cef20775698416e198ca30b826310855b725988cd267f6e54f253d2304cd1d165b194154cb2ff820242ea827456c8947e6e54f2e3f2d10153c98f4b253f9f1b9f984a7e7c5492b3e3a735512c1268ae5a7572d5535f544f4e80c9fd714921f7249998a925cc9310e60909b34578f1e54909b93f59fc077f72bc7c7cc4e43ecd95890b128944611886a2d05a70c58661780e5c09bd4a2bed0e68fcf0a8640cbafab0b65b7c639f15d81bbbb11b2b3f2d28996d043d9c2dc2b7600a11b52a142d402f1b86f314a60b3108f5a12de9a24c9f4225ea754522510c92bb5553224c6bc14c8959d0645a656af5a993c92939525e825017261c59ac955b44980972bfbb20291c0a8a10a9890cab52f8c0a097a02e4c3a3e2d98a9d03f2cb0431ee607055305b38548c78ad80a3b80442a98a836c554b2571831c5d4d4c90913937c9dd52723d4c55da80f7698a92f31c9584dfd762b8ce4be7716c8e5446e2e0ffb90dcb787d9c83c8a43712193ecdf9c0cb95153c05153a8244c72899942fd982428a595fb274cac20f7515d087d784ed45977a12e5053983ef4594fe47e7919e4a659fbc22d6f2cd4c44c3d474846079f184c134c17d7417db8473eacf28be5a8a9bb2aa98313d775d033d1dda8e36382d00433752029acd902f44ba183004135315d3c08f5a13f965e2e51af3ce9ea30cd0bb744d15c1e161a61ba023fc2a41fc8a570723dc883e4934b84ddf7c52cdc8b2fc556abfa261c8d23f7c3b2c325980434e4be4805b345786d26aa2fc22009833a2a09f2c87dcbb2f4c4057a20ac225724dc12dbc170cbe2f2c6700bf457915b76b09a2a4daf6ca220dc372f5464908a58256d4c569dc4f0c02dd08e116a06f5ea1308ccb51582ee514a69adb57677a5b56b77b6238e1fd6cafc0002bea019bf2af9c23219887d5412fba82412daab926dadc53ef08f4a368ea9645bd03330c65ce1981775e639b10b057389920161a88b6a82921284a134c4c425a25b95293079a8b5be88728870b870b01418538ca908a6d70a9b15464c4530c5985e2b6c56185921071fb7ec601dec5324124d4b3b13ea35962899ae0bc3f0175c096f2ccbc49b50483412c2455ed02cdaf8b8190a061a317a499dc22d419810857a3581720235a32287a8112e2c859279c3bdf6221567d5f7802be1a8ba9c2cd28835b34514b3851d41c0650f341e5859f4be68c3dd58ee3cdc1275d46bb6a8e19b48ee21b9afa99efae5778f70df0de5f2c6ca1bfbe100a757df581bb2e9e50c790c852831a4ba972832e41e834907aac6e4aaa4890954169e985270c23cf54d3a4263795f5a85bac23cb96a0af5aaa4898999422d61925c30bd50c1a423f73dd4aba66a16726341b8cb6386ed8ca3923dbb52db11b984349a4bde4c5477b944c970a1cbb03c74ab93eb7412b97031e86ab46d600c6e35bab77d343436361cc7c5d856231b9b582c86b61addeb3e1b1b0e87d38dee713ecff362d8d5e89ef7c5625f8c5e8d2618a3ae46f740ae03bed8311ac371c7e81af86206057a79e2c2317d8a62e44a8941ea4c4cb24b2ef4102524a7b8a4bc08210afa1255f31814cd65a80ffd6b5fa2b2907226525a5c3595628249b610f21d4b141428192c7acc65a80b5413d3877e8f250a66afe3d271c60b9aed5f740c86e53e7669a2f812ff20f72775217a898190bbc43c30f6011a4bfccaf847eec6404c3f5ef684c7494c09c2dcd83df2b9015353a5c805d471e23ae16173e821b812822ba05008bea0398441d4d4a4aee08a78b9733493ee59d2fbbec1952b0a854222f1a4ee5ec6e276b7a45b7085140a752c0cdd4318898e6d3756b30d593a8a43bae68b513fb8990c84cd242cd06d0499a42709ba06c2b039f4dc813a44d0451a419813978571a42bb3d28da8971b6e29d2587b956ab5cac4b5f7365a732d4a265faf92ba1687d4142934459a26dab80c5cd1eecc31b944d5a082a0662ad93f71c172df66b145144dcc8ed2497847c92d08c3e67b2f846916e119a2d3e072e86d2384eb4475ef44984e543769ed6c57a9224d4d89dd28d2a4ac60a6409849f61becc18ddc4f69cd78247a729db62c74692393d489027d035742ab0f8b0389e85625237dc32d459aae8648dea06b5ca5b33b1d9b451aad5124a037495fc80441a37df8b283857634c9bccc703fb3bb5b73f9383124cf279c08927bc8f3092778905149982adc9a2d406f8c049b98285c5d8081e2650ab9b14b13b9ef7dbecac40539b932713f63f6462fba0c1a535a13d5c7ade9830fb9c4adcde296c8c4a55bb8e589eb96e24bd264a655ab77ab1cf03e7e69d503dec7ae56adbc8f675a05c4fbd8a6552fde1f5bad82c0fba3ab5530de1f675a151dcbd9555ca5daa8189bc626052e3fb8fcba4fb09675ecb8b645b8f53d67c75e7276ae3496dcf7c2bdd0ec799eb1ecaef1dc90f4c062c925a7e04ac94b44a8f8e81550e17905baa64f9ecf3e99c4ab54af71d9341a106edff35a6fc2e5cda6142429486e22b94a97e0997d7535c2201186e5ecdf0b4dce32504dce3211972e9e04972c990414a49220186866a23293e98d4d58a3c2ed979e9b1a2c9a4b2ff904abf81266c915d3e87289f85592de4ac26e187a7650900fe8d94133b3457d069ac27441fa077a6e7036f25cf4bd789e791e0aafe7228fe85ebdb86d401fcfbdfee02632519e933c9e7bf68621cf4538ab58cba0fbfacf430c82cefddceab9763d9eabd4eac93c57a9a027cab6f1dce4ec5e5757b6fe1393a82c9c24284ba6cd10633ac639c3e5321e35657b9ba82088bce612b77caed672644d71ce013bdce675df0f95ac5cc7b2c51ce8d8f571632af92a6f0c8f9a42a263d9158a71d9ef34898e8d3468b6a71b2ec57c73075292aca9c69cc6e12f9313e4368fd3d1f2a5d8516d44d9f15da57277cc35e3415f32c323574f6bf00598e9972fcd35d3f1c6744fb822ab55dfabc7e9b8cf90eb1bbb7c6eae668bc9351bc5184e8331dc271c6daecda5dd70371c6536d7e6fa389b6b736daecdb5b9369766ad4aad339b5bcdc915833bc7e9faf16a57f3d0d1331d0448c3d8d0222bb4d5ac1b234570647a23d36a537db40f5b5ff5878f3a2453fa58f7115a59b5e5084ca63a32a5310b6466480dcd0684b3c99452992cbba1ddd0b1b2c150177aee06e591e99c94d65abbdb5aab69def6b1b8344556e8399bae13c2a1744e4a6baddd6dad154d4c3fc00ae57c2c2efd585c999517348b296c55d99eb569679dba802378b300afdfad235753b792a5185a7528d3d14deedb9b65ea845b760d14d7deeb6c330e8aabd4cd47257b7b55b26bad9b8f1fb9eb1baeed54bcc554d20db70c63bfb9e516c64033956cb5e1de03d3aa30363d2eadf27e304f7d579ede0fa8408769cb2d099ec7e5071e9789ea6f37b86518cbdd0f8fd477cd5dc35817a9a46ba2ba667453870754b2aa6434cba61d21c042c60d7d16ae1d8d18a292f53ab8e597825bce9b3a6b5e4e18065e5fa70d290519cce472d67411bc6952926a72bd176e2f68766ee446941b1c50087bdacfea761a356b166fd9b66d637b1d374e40a393c39d73faba81dfb891030ae1e56decc0179d49bf6d94b62887c2bd71769bfb1bca0d1425a80bebd14e3ff73e4121ee5856ad4469e5e6529fdf7ba3567ab15cc7927d766e3b1dcb5314167d8f1ca5254a2b731df8223c1d8fe0422e3bd75b87d7388ecbc2cca338d3344dcb46fac1a0ed508f178b796e723dc79d1bb96fa72f6974130c627b568a816c72a534babcf58bed47d8f11414e2cb5bc9b1a6a5d129f1010e27cbb62cd30d4509eaa2a4aceddc58d2e8ba7cc4767a8e1b4b1a5ddede1bad463ecbea537db7dd86e47a70abc9f560b5ac49396ed4a87039167d3f3b8d2e67a34a7b284a50173d278b4459b6fe948195fbd93b9a9a9aa9ef5dda732c6e2c6d0cabedc7b578564a7cd5a3477d494c910f4109121fa89c90f110e490bdecab58b444f6e6963501f0f87c1012217bfd515cda3e9f28820c4adb4399c31c20d9cb3e8ab757ccddd3be8a4959c8def6552c12210dd99b1c9dddf14067edf70479a35c876b99282e0560a6783e51042be40d97e8b3b3acecb3cbb0cfb2db918e32ecbb5b8e35b3da29a946a30181e2b2868b033f41ba61964c41ef9ce77d7e180997a655dddb8b7937d9b3e93963af523916adb2307deaae46f4a9dbc2b4cac6c4c464f905a3ce9921668b395141cc16dd87315d7414d3870fc64cd149d63a0404644060b6d0724bc00337dbac9adab61bb9cfb5d41477ae554fed04c3e55810a863ab5c729f659f89b305670292a9e24e404ffdb6c1e44e2c684f26e15859b8f525c7cafd0c7378c7ec13ed242a0bcd3a6b98b385462dc5de12342a0196e63aa3f49f8f68ba49779b89683951cc95c35d3ba709f5ba7a1577b4f3b4a152acb57eb5bf9a75425ee32cdbec55cf7e8d6bd63cedf33e1aa6b93d5aaeb3eb68942b431ba964ad7d33516d538a377b4bdcec25d79b5c72fdac6f9a56d967381b3f1f95acf57b6531c6f3f28b1145d19379461a1486f76c34b5aa69895b722d979a2abddef34ab72fade23a9f3746043b31c6b6b81cf3009773d93e0f5cf9ceb9d0170ee67bc94beec5474dd5733135f5aa298e8bd931fec3e398846d95fc7bc9488366efde5682c59756550ee7e028c6e47aafbf122e6d0bbc4a25dd4c54fd87494630295649ae564f07d7f315a731e86abcd7c735ecc77b2caee946254d9fa0a955c91e32f0ed475ce31f5b31201b4cbae95355c1812f4d5a13778891926c5a357a3cb7d5279ce2a09a56d956e15792b1bcf9238e25973f2f2ac6d6d7aad94763c9958ce5fdbaaf358e1c4e814bdbea1a5c924a9195eb3f2f4a2387c3845fca5bb956abe68871ffda5a569b56d5d557535c4d65e304228391e10e782cee88746d7be20a3e72dfebfc08cfe98a48f2aee45d8ad277d3571cd1816c3cc2bbe71c9cddc31d8f10f7d958fa9c039ef383b8f4f1ce7957d1bda47bd6b9470385c8c612f8cc834be03ff7fce2123802f1cf3ff77efff1dc2b3f0f79df3ba3b784eb1991b02dd0bd2d0323f01dc4de2748019abf7b23e7a07be311dfc1f10815f790f07ca3ad648a73549c2b792a52641fdd2bdd34da4a96c68f4ec10994bce4ddb14741189e97759e679fce73ef59c958dac8c009d4ec8df63396a32e23e946928f4848a61d4b1a9dbb8fee913008da74a3921fb892ddd432b9985a376a8a46e7564d8d5e7f5d6acade16a933106376efd93d2feb2ec0b928647ad3c59d4fc06a32f89266afcfe13c0385e064f019167fef357045cc70760d04c2fbc773efe1993b1fd0f33c111c8f10cf81218e254bfe2efee006459c791e0ffff0def2e0b2f3d03d3c828066703c223be79c53203ccfa3d9e3fc039e6730377b894b9abd7bdd07bef0fe399e59ec5cf40f2e9300220437b9e4dee11c9c9983c5abb488fbddcc23112e3f6093b987b867e1bbb00301d5be097a075932e7decbf0c779863f9f67cf40203cbfa7e56dd9960746e78ec7f3f2b672f560aee7b6331ee1bd57ba7bd8f3c60c5ce9c62068eedc9303dc0efb09dabe4b2909ca522db683374dcacfa508b77238baa6aab621f5544fc4a6c88d915cbf1dc9f5a5656526244a4d69473c94d606034589dbce5a4369d96cf788c2eac6daa88079cfdad76f95335b3bdd6e72ad9f613d0eeeb0a76963b7d6e44c96f5f77945b865d38837e37070386a776b6db9ad667b63ed5ef6ed6d4f47acd6200cca4257407c2e9c1794168a12ab3b9f888247ee5f3147ee9b6acae67e143a72df7a9eaef4eb8185eb0a7d86ebafe04d93926365e770cdf0fc2a39b72195a45b4d25e9463351b4a592ad4ad2bebd657999c682d262a9954697b5d36be7b6ca651577d7304a4bc7bd66759c336cfe581d6d3bcc573c5f7be299875492760d1337fb04e99ba6a6fab4eddcba6b2d596a9f46cddb876772adb844a269fadb2bee4fccb9977ddd7536eebed573ea67fdf6729b6173d9345d93690facb63535f3e4540bc49b26dc0a0cd7889aea0c515f6a60ea0b683f33da19cb2ac3711c30ab2f56d3668b5a7f90ede7ac43c8b62661e6b2ee20d76fef401bd127fb0f8ba04ff61dc6409f58cc3e655ab8a17b9ebd569856716e4b16b9ac2f9dcf67083ab5a92fa0d14614bfcf589ef438b83bc7dd2b8affaabe54182bc3a1b1b79e91c21a76ede94b73dcbda2f8db19a07beef5d7432ef76ef5c936186ef8f9bada60a26c7d99287b95da62b8a0b1d4f93f40b387bebed4d48c52e7bbe7adeadb77c088566db7c740abba579a70bcadaad967f6f22cbbf7c194daf4c99ee35e34ed1f3c8436b6b47807dfc22975c621ea63cc551d5956459cc008410a79587d63bd0cf075acd1e3f31a5ee733cae8fefd1b6b70de8da5cebb7f6759953aaf9f2b0e973a638908f0f732c0dfb1468fce6bf4c1774619dfbff7bdac3444bfde8367a63637f5f3acacb5f63f902c20d02aedf6e2e66dd75e922c327b181b2363afc168ea8b86816c34a2bed064dbafef601c4bcd4222de3429272cd3348c6fad3cf0c24f93b243ba4b46409e4f708126db6fdc6c774d1b3b21b667dd671d69d46c471a3573db685fd2b065cda3dbce7e84bb2c1b8d9ebd6c9a9c8ddde82a15b401a8caa8048db396519042453402000040015314002028180e0805a3c1784053f450b50714800d8cac527a569c49519052c818630c0001000000000000400040005eab0937cd0ad7fe6c840db097ce9d909f0aae25bf4ecb27047164b7db316675184ccac05c0f2de2b2cb391bf8eb817a6beae76cbf8a5f2cfe78d3401764ce54dcf7e890230fc7643eeee92bb2f0896563c3f28ce99a3cb503071ec9c35cfbd468cf8e2bb6f8977322ea441081368380b97a9a0968e668227eb94bcf11820c6440f20b2a2a1a542cba2cd7f115fad974dfa0415fe7bc829e11e8612dc99396e8b2333a21c2ee5965e864aca7b5a381746f12393ded19dc57340eb032bdeeda11b5197ac559ed460348478e3276cf20a3c0eeb035efa07b5496f3003b7c1eaec9f54d6eb082dd0f78eb0d928ece2b032c99ff7178c0ece851f5250194540c3548637204e5482bcb909c44b4cc033ca0fcb254c69003747bfe56929045aed62ed42ecee33e7828fa303625fa92aa0d6024eae88cfc27e65af171589065aa497f8d8a8873e4f33662bd00cba3f34fd727c31ec5536237cca5a211d57c6d451e388d65b092afc8659d62c3fbd66cefdb678f651ba1290e3eb24ee7e929b29b4400e8d5943852269c60e5959279c8814e4f91a7e53937ac28d899eed8e9dceafb30eaf79aa18415059c94cabd460e1fa3d9a0be164ed6a93d84b2a2e6a27b5909d6c91a5a06ec15fd0b3c840afe77d64eeb0457be2cc165b9aca5cbf45171d9f6c2b5c667845336b7e2bce93c158bf27e90ed42f54ee38a6f9d68d0f87115400707a3506094ef959a5d5651b8ce52fc196f155a6a30084607669537d76c4b280d09055eda59ad05e845baa29593822540672d5e62455af8c9d4a5b9fc42c617ae0f85fcf42367c7068d5442fa06c548eb11d3192eb0857519a8d8f08c04d6d510cbf16401fb431744b0a0d4f792bc19e3f8743ac823f938dcbec82ff90f1a9eb86ca390714b086a104cf395de8e42d4897b465e8504c9b9b5c172b60ce035e55c17bca37304bab627a124d3c7400dd2f9a676b1969a02830871a990b4004e17e64b846102aa22699064109f0a4274e493601e6ac0fb4826ce467c04d56abda1bc03eac8124c042604a76920e3d7e5d696214176e7ee287a6aa10a4dd3b4e8c611faa86c912cdc08bb217894072540aa3f1e39c1aca520338a0d23cae23cc9c1f0ae7c786cbb6621c019366aae3221c785031e3d60589b29979f0f28f4346ee62c200d03e8d6e6549055e5ea861dcf59b21f74614a05f4cde2e8a31deead5b7def19f0a019b6c6453822f4ee7f87136c5f6272d9f9be4d594631fc1d0415ae16af3fdcc20463df5abe302fa8bfcc227968cedea5d01eb4764ec1286f401839301e332d5f2b6f7032e2f49b091defb7e96abf61dcf82daaedea2c745b4a67ed45204f9df6932661e341f712b50ac797a121eddaa46aeb60990e3c86ea8d7507c8578ba9770e7692d81093260353da402a6c067c8eb2421a572066590f6c96b79c7e0037c5952e4cc1c21c928a6e6695be3c75f5b5558eb9a07e897218b4a921964119489e807290fb81d87142e632eec75357051fe8d7c95c1fc5f8fcb583faabcf014677f3d1d65fc3da4db8815bed467adf8cb257c74ed4edd9d85a406f293696f890d89ffda9110e81760056e7d75fb3b77db5fdabf4a57898e72b69adb5f45d5c42762c0884b88fa3fad61ef995228f24dda1a9af4286786a9c7d4931064cdf1a8fd7bc4c0a493e08984b12c103d24e4197310bbcd367fea7380d733dafe0a81d876b43ebfd3d58198086af809bd35039904b99b76f3645ade885f9633592e85a3754fc9f134d82e7d7f33ceae0ebec44a1f200a91d7ecdb3d52b0f091338bd75dbe4fec927b0b8adc808321ee262557b614025f6b601f61436a7b21dc8421bc243d9a40e91370f916d7915350c1ba37933e18d82e08594c66eb51eba8bc7219e28ad0c39bdb0f24413ca51affbca7dcbeb6c5ab368d152852d97bc1703bc91e3eb8359c9189f6ff248f1724be17c62c067b88959b144a59e1cd85a5ba8af1df3fd7bd32b69fd98e5cf2265d6649b93fab59616f55743a2369b8eea0c2bc1fd7684762a716cbd70992d307726bd3aba634c46a64fbfd05da3eb25f6ce2dcb8a670a89cea92836fb9c87fa5838b239ebfd79c3996ec1e6ca175612c59fd61745bd54751eb8957b98212757f2408f4a1fad3ba583e714b4edc8376b75f8d8938949821fe880889352cb44e20f4772c4a93d9b801dc37baa2059a8b02987de7d45c624a010c1a0aebc22f85d37093c961f4dec5b2dd1af79a18337aaf5eba0b367ad81b027d184a62492130ae667c8edaccbe32233cb63f9f2190d566702c636e7ae5055b3dc2114b466f4509ba3cb080f01e0bddd2a6944774a09e40568e512212bc7d823b8c2244c33b48454a12539bf3d644dd53826516f97eb2a76addad8231404f65f73bd42981e8b1cc1cf9db6e8ca2cfbdb5504b08ea0cbc9e5175e7c70596b269c231219aa30fb258f6fb9a7cf8bc6522c2c77036b1c2dc8dca273b3468b563f53f32ed9276f4b90a42e956912c6d0164e8fc8fc2bb5d42523006e1cf7ca4455b4a72baccdaac4d39597f5a7367224d43d07d44fd2b36a672caac96ce47cb6e98737d8a5a5cae4ab4e00f1ad097c5e49e82c5b4849fb237dff2c606e61d1532197d7c636386cd45c848b0dfefa9151b8122cf089bd2458a7436c85091d124e626ad9c17ccf36321a50365619e82edd2bfc6bdb7a079c693b2e94222e0ec5e3dba992c23fba5a28156f8a3332b6bf89cc0c7112f1de7c147b7771c835fe85032f49a9c632e600457a1f36f989473565c0e733f767a6aea2a81e18291164aef4172be8201cde0f5f571cde52e027583ca842267b403acbef15857bce630f18e2dacd96e4e498713c2bce84073b71f7be8a1d3353c89cf8fb2424e123719cc69d3a95fc64a7b0b21e27919df7d7865d2b02e4061b211c820e5ab5f13e004817caf57c5401c281ab352863410996ad6954454d810ecc869719a52b35bf185103436825b1e91269a9c3fc0b41e9103b2a7a28ff142cd9732e9e24994ea42e1c36855a9028efaa7090f91ded439a6e569f1c5864ef52e0ee0d1661d65dfa98f4901c39de4c7d74ec6d51511e46846e10b72e57e89d5e184f0fd118299e9e5713e9ba8ec11768864839f5117e8ee101bc2ef85c182fce9998463c1e6328659ac1888572a289de1dfdbac5e302ca439df44502d901e26c42a83830edfc28f05fbf1b0d8506868b407aa6ff7d3e54a4ed9220045788619ee60079b19b6d55d466a23aeda17de0f9f7dac6541aae64b2e284cacb100b8d25a5096b988071134355fe1c1cf8336c1590a030a0f39cdf6ca1b743889f318f3ed26b75695aab1414fb085d2954aa3581705145c3114d883627e4bb5e18260b48238b297f6d340770b847ff30d050e74b6d5161d681483ef1a3291806f9048726dfe9f99b0067606be35bd311dc4e55888238e30a7ae7ad45753c292199b422a1816f199bfbd219cebc643ac7c57b2e4be32f94678dfc8eed5465e518a98c3ace2744987a74cf8f5f141f603d7dacf5b2098bc627b779bb627bc951fb93ad8728a6fc3a85ad8d8d8d1023e4480d3af24523ead7eaa252c681340667c5cb892082819d0ed906c4c1198e3f11cae087e0eca17a3df5d9c654bb580439a18f7e08800008de4928f1e81da4c69ff51296062ff58ae05f88e941d63ef83ec31952df865363a61be48ed76853458f840d82dfb59418b736890f709ce18883c5d566f9d6eaea889b1857a6272acc224b71236470fd80234c22a453e5de2a6e0f7d60aa4c5f3b3888c0ad15b9d0d42de939fc89f874b80da46c2c59731e8f17f7e0c5a601aec89710009a9e80aa6ae8519db8585aa6f4fe07137fb2edfd943579242f5d8900d3a6cc6dc9cffb6f0229d4f552e76a67a1db7c4c5dc4fa4c178128ed92941ac62446c450a37c4b3791f0bd92e2e8e65db3139c5df65a4199835cb9b21ea3f423d13476b74435d0a3723e82e9c251584976e2a3156432db1c7464b8a20595cda9f9b8f1ad46ee2effb63de374abeba9a31d59ea5f77d063f4d0f1e4abadcf90b82ed7c5568cb431e46100021025430738b454ceaeb73c78c6a4c9d6a3ff8426ebf63e7dd228313cbc485ef11058e81bd2ec10229ed9b52e30c1fe9f812384bfeb684068226808244fddd67c380a28acc8246152b8c372320bcba2b78d6ca8dfe9fe653843c4e489382ba3b833c04251a80143591d5ec595196269818a5dde2fb9122bc4488b42a1a4838f4e57ef9cd9c836fd71fd8e8be186432af48c5e54e86a6f48f052a4135de0644524aca9679218c3e3896052d34aa7af42813daa897557b198bc0fcccc531b0121dcc2970571f7b4a617498adb8b5077c419d85d817da111a68e8bd37dc335272e21fb5d52b97460857c3206fe5d522dbabfd67054a694fd30371b8b167cb6692e384c2446160f0732b37640071ef271b9ee0f9261546e3ffa128f51082577a6ea03d0edd7b74ba192bdb85577dc35e4ca84c4b38892859ee113c0c208c8ab17c1bbdb646abeb4a38afe8eb7cab9dd7eb9a8e9efb95feae8a40e77dddf250bbb4fd10c7464c676ba3039028e7532d29242b0244b08e3f2590b2edd2283a8fc26b528602d616116875f231a266e340900f1f4ef5665c55060d22f411450c71f9cf01b2e87d4aa4013013291610f0369b2ad9b5b0742416cc8bc8ddc7707ff01aa8528bd9a28a5a83e8c0bf730d2a291f7b5f57472917593681b91a85883804290068fe12c37be2349e8875ce9f7f637066909033a1087c7c0a9d5be8a0e740fe8103d37a21e8c5b4ad3af3dbc49646ee57567e0e9ead9c3dd4f1bba8cb5a1dedf0f86bd5824fbe3cabbc2ace109991dd688e770214941cfd43a06040b6892aae77491311e973f68fd9a849562971f077f25a2e01a7ad48a13622723546f92cccb857f65877f8623c3098ceb8172ff1a18a5f8c05546c44619082952cd874c945ab2eac90f18652586d016148b4a39350e8836379dc86ed8e80af20f397c036378b04675b785f97b0709dd9ed828bbb792ccfa50d14dca8b168690eccc24f5c09655fca4b6cb9ad3303a2f60f08b355ce8f7a111b0aa1cef6140860dfdff3b31bc9b2556ae4edd6bb6f8463f6ccb000017b2380af03fef80f39991aec02243708937e55922abbd12495fe99bc8208b656f3dfac00e6f108a033e724a2458c986025b0d025b5c3bf61729fb8e95c3538717fa230c88baa61d6a5cc7081c578c44e855e047d2c47319d8b3e05cacb4d24ddaf0cac018e8b846946f7ef8c58514c1e6b372bcc6093d7fe1517d3111a1e3746ec179717caf1a6cb950354d216afaa9c62b847f05ba8ae9ef59b0ce096cacc380c36055ba6d8e8e1c060b7b587965b91c77fa7879cf96805bad108bf67d074c1f98fdb237efe87f584809d578e28fece5feb609720cd3726ecd945a966023c6e93180bd2f49afe5d2b00bfdd88d396f939d00153e139849458f4e89319f5804943215adb03f92ff268b81e08cc006e9649ba518edb88c64fa346bc60eb0db5df0ef04e1c3d9cbaa683518a1b1a8ca0b2d3dd0a82b5bc9211ddbdfd357e4954ebc78059973372ae02af25dd11a180c99d0da2691f50badda740aa17919fc2133bc6411a68ac8a0e208c67e3293f4043f4765b0cf0e42aa1faea2516b6d0f8d6054499693cabe62c0773ec8ba31f7f4954c79122ea992cf543b40e485dacde37ec48576ba077100479a2040c8d9e0bf531ad1940b5d7fbf945ca027023f0b83721ed4e2101eef2e9810ca750a746517a011756eacb53d974684e447ad2d9b5d2c7a23de7ce964c55b64ec6e22aa3599e0682e301ead755713eb429425be5ebb89c0be1cb6998f970406f0d3365f24f0eb6c2472a01f5ec1ed49a61fe979355a20fd1caedc9427aa6a1ec1e313681d780b930fd4055f76da7ddb48c000929458b50919e263d3285b816f3d9b395e4e54abba7f476dcc10cd0e74850df47257af021529a7cfadf5731172c2c96f042e67204d353af81af70fc79c0937caa3ae2ece73cd3b6ed9c31d076d136dbabd11295f5d41be242ee581f762f59913969616e5afeb2187f3b035e4d71cf5a816c3d950db869deca8f410e5f4c5628ce5d764632d3b6ddd4ccfd4cd4314a02adb47b2fba07a99b5105b4e1b67e800c2d6870727cac07ca53679c1ad86a2a01f2216dbd55b2fae1722c69a855e56819dbe6bf792095488002d66bdec8d543ea55bda24cc956fc16213e7ce28ebc36221253529d38d9a0900f45278ce93325b27d8827103065b68c77d43dd4220346964f3ac59331f3c50870e12fa2de33208e99d5ff33952c02bb73701ab1c4710fbfbceb6330e66f4fcf26d4e23bc00594e015a81adef6abb677e23e0e1c03fc7a7a54bd521101d2a51385f1c5a3f17b8f7ef444237e9192ada809b3a74b8a484918606e5030cf9ec2f16c85e424f2b881942f01e83ac5ea711c4fe8d0ec61309ebf58ad12126cac7a73484c272399938958c383872c4a43d80fd6362f51f1d8a6cee3bc6d90e359eb839c442eb56cb204ef21e36977934da3139c5033cb24d66b27c600613e45ea9670f4b3609d241b822089ac0ce9177664cc4fb45c981785dc43eb82e24da49e5adc718656a998bf14eced3ae18f1ee5e30ecb64f2a4887eae6f44c9196c8b68441030ebbbd7b980d1ab9b758eb26ae32e65ded6756d8af2a6d614ea14a7d30b045eb7bfafa51d178cd539590d7a0a15e38ea757c666c2806db4e093a9ad9d61328deae51c2e870f633930b690978040420cf9b6dd65280e7e51a95e87d6cd3bfd02ddf255b6a4e21443334f09e7c35f7be12c0616c5727c4f7a96c770ef6a8baf68d4f991b0b98d6e476f7504c155b6e163dbcc7095c674440fa1ae7df0ecf760dece4060cc57de10f074540df1a9a2954f0ca92473fe6306a82952ea6102084ad125eb187ffb360770c51630cb5cfbe5b7c4fa894af26b6b3da50798a968a7eb634dfd4da9a0d48b367decf17b24ef7f20afe3faef51379c2be237c15000e3453369919019a593b3ced14bda06d80503b23560725c9408e8ca110dab2cabe96f4d69b232223f511c26370c6578ddcfb0ac791bc0aaecc7dbad243fa38ce845fbe25c56200f694ff284754701db7b072c669e7a731f9510ca4e20fde02709a060d75e4729eee58e8edc676e91485c17f0418861be6bfdb5932695730be3c1a49d88e90163490b5f95ff0071b74037b865d1ed7245d3753a4c262af582f50a296a52d91d838dda895af5b7c24a91c6df30498e07ff2aeca72123aff84cec41117314e105c7915e38cd8e632d9feac98528a31bd8b85e8340bd70d3851eeaee241fe5de67c725ee216a6df03606c27b9b4e6e82dcab3a996617a5e4e348a9c309005a9fbfa5b10958f90b70232d0320eeae0c2b9f0ae2691a7ed3443cb9f02ad252d9b7f44ab012e8f8bef882c56d5f96a91415185ae0848759c91421c1b40fb52cd6a464f8dabe641447c4b854e3f50e96cb777214fd27bc53a96553302b9563bfefd53b14a6cbe1478db7aa46eafea51824d9c5c641a714b79e185e21a41b70dda1f5cb31288a7616bc0ba995f725a130f02782a8d180e4b3c3eaaeee0f999a005519184786f4e656df874ea66ef013543432055aa60b97b6173911e7a80d2775ce990e118b6b2d2eeb370316e4856d1a506fe1a84258c52911a5924d67e3c63e55a9966fb39108efc65bdcbae93aa162518a14ad9de6a6176ac02a819ec62e31394ec19859dbf38af33d80b476a705755324c4254bff2eeea8ec58766cfefa18a348f26d101f4badf2c963f148428401cf950362c46d8af81cec23698f83b80b946710d006bb58eb6b7ca7c86d2eebb3287260bf70e480b4e3a782c88dfe02783338f211b96c15a43e4f3d56a3bda643bc268b02f80d4446cf7abaa8e6f50004e989669fc66444fc7d1c4971bef1fa27b3299b923a0ebdecbb35007603c8c4cc4c9e0cdd65d6be56a8d1bebfcb743def6bf6d2c625ce82dc8e89d28878fd068d7ed84b62eecddf788afbba7c1056efae10d981e2bac5d4cf681758e8fef397b60270ae514146936a0d6c78005e263e7a5c3fed71d740b0ed970b7a2dff76b886c2b0984d3cb85e4838356716ddb28a0658aec0b65ba893dd66be6b1be5a32eec1b9ad4614dbfd0406815ff917ca99fd698b9896699495ca63656860b6de763597ca143dc47473764e9ac4d85222971482eb03ad96dbce094ca310338e4a2255c7c3a1912b93bbff4300b815408e1dc41946c3e7c245eeb5968420c43f388e92c498ebde0970b7b9bd9fcf85f2591f78d87d1761a03299bb412b7e713c4cec853c5b32bcef73b5310ed35057770aeff3d4a5fa97fe3c7ca38975528e60a8459f7ef696dd31e8e39fb365699a4578f02a9837b0fe401e2b9a7b314c54ac90994ce0894198959d1d1c405963f0f5d47b540561dc6bc33e15c16f2c835c46cc575acf78789147ff95b0060e7fb00abea18324a0e7cc4055e45912fcf8983e4e9c92372631e6b3e54b5fc343f7d718b698f688e89cfc941e16aca52124fe8aaf74e13ee2d3327536042f934316b7e7c582171529be74f3ce0d7bc9db5fd278e9055c9ed96d80a3f46c4199cc4d62d0b84a40ae4f7325412c66ddd67fcb4ef12f2bc4fc380be866054255879daca7e930e4e2f3a106dd02a6b4293f4b354c91ebb96b37724681d493c57115cdb8f01fdb5f6e8f8f58c6a14c752b6bd58c504d86933274013bffdafd742c5ea7c7f0d53bc24e8068abd0f567c174d0c48b74296a38458be55ec26f995050eb0eca7f2ba8836685d8aa78c7018d5091729113df8b41152b74e71c0a4e564cea58e32dbfeaba2197f94c15d5324a04359cce353ca9846df24ea9e52489a5fae02dcd1b23d37ed3e5bc544883b519ce468e42f1f7a4cdbd197ea863143d8e46435e92b878c6cd8bbc6c5b2269971f2ea9ebb39635f793667e64ed0bd893a43ee865185d42cdd9c09c4056306ccd28434d186f61e5362d02c17974ff15f9b0239268df670acb8dcdfd932133df9198d1d62a39d25866a8542b822ad9c0d4ad9091e500fc25a158316231cb3eed8dae41216bf7a3a886f49cac7a8ffea168950f16f9e9617cc8465a238ddf4ea0f7074ae03f1090261a4375e1b30c24b979e0cbcbc034d40f36d482b51f372abd87ad15f1462639a385c7452171c7257854bdf028303c800f62769b482a8f835195484e8f5320f1570a669a0e83b84f693638b41f4c27425d56553c7332a7983c015576ddc20752da2bf230451c1f8143f54c7834ca3f682f39fb816a79b4e23c4e114f3e54abb40e5a1f5a20e35449527806da9bc16fe8109f0361da5055ed206bda9d1e647b0c55cdc888f31fca88d98ac681bdb294d186e6a625f015e880124e8552661e17085a883160ee13fb81b7ea436fb4b0c83c8eb353b7b1a78eb8529ec5a2edc178ef3a298e39fd726e1bf597a985a75087a202ad14559657da2f8bacda5e2b1a0b066440682e3d02ce3c2ea6f111dd0819b2dd8dc16d6b3c6a92c1a2fc5061b15843d8c8bf6da561cf462542e707e607404749365ec8a21e1f0ab057b1c056480b6e89e30d4c88e458c3ec62e2168308cebd5edc09864b0da884ee26f39f256d24fa5ba0353edb36e9aadae255eb299551ff515bf6222796d299166bba22ac720412287d9063f53245e87cfc50442ca2f41dcf386ca3fa1f82e8cf317a0a942fb456e34c31d736f081c4a96e637dd152cffe38f9cb11688c7b39dcf07df0fad5defa05c7ceb8d7be91aeab5f744a9e56be1eafab97585e98f5400874463f378d557730ee349d3fd2581d957d846208ea4050960bcec177ae703e165f2bd066b8a407b1d5428ea36ab09191e8711464332073c0bdc59d668014f3ed316f5fd5036c8468cb65c34cf1eec8103658fe49eec8fc89347e65449012e6b6522d7908d88b8921e659ec19e845e6e066a72a9524830f5857ca8b45af0129c5d4be4c2efd41daf400e6f6c74f24eb51f2e99ad6d97881be6a9055ae771de497f238d3c45f6640b3d0d99d0e4cbefdd19f988d1a6fb966f82a838f47cd1ed43a2f350ee8ad6e6e1762655da2a6ad3e867df0100546b83b89e0be72617ae71562ec7c7b715d4f1bc0de800c54278c09d6126ec9f0f91709bb507d481d6cb80ec5b5addd77b939945f07a22ef738cb3d5bd3fc72ea702ea9a5ed9d6b312c5f472a577c00b4224218c8930dd15c4ae1141462f08c75bf29ae9ed5c2e6f637c2cfedb81a972f9a971da6b8e0fbcc8669cbf10d85ede21152cbfb73d2a41bdddfbdf2da46b1a21503d4b8833eefab36229fa22cec413e3f94e12dcadf15e1fa3d99b689dd95914b002d28013d878bd40ba05b94bd0ac5df22132d63e0dae15213a20dd3a4737dd4273cca8af7d9ec976adbacdd9aedf646da50cbade5861045372cf16683f2c235005edb84018fde5a2a781985da0c04792728774e5fafc2ba0b740463b0b7e57b5b726202aa034d6dc3e334dcb69062a8388064f92cf091e7a1f9754f3cb793a5b05c214351a10a5b3e148b10511aff30ebdd9383266200335628a820076aba7d75fcf914ca98a5f066edbd79d8883b02e139e88dcc88f0f292a2fc2dfc2e1881a07722df32f7a48184f256587055e70818dceaf14a6178eb0740b3d1e9fb0c691684c1053eac7f9254165c5205a7c457e7ec5e8b40605bc06b0be204162278001f41f18461ed4e0a482860466d9a1c4bf2e7e0f15c68724a8bd740a14c55512510595e04e08db290bd2ac99f9f31cfd49d467d3a3a5555d6202af0b6b244ee0ad3e904ee33806974e90f7c582fa7392cf1aa8cceb216bccb75b9035eb2961c04cf6f8522dfeb8fa572575597f8111ec430e8ce82d8c055ab4ac69bba91cfb3295c0daa8729f130d9befa63e10788290b714701354814ed711f06d95dbaba3ac1e95752b5c4e3ab9a635a9fa44b4b8f400027b6d9ee1c88649a5fc716f411a570e4904ad582f4ee0d6b4954bd64a33caab1897bc750dd7f729de699d4aced9aff774a6a7f090886d2ff7d3468a7284566a28115b5e5e6e6ce3c0e9ca857c1a5b359e01d1f0b869b2409c2e5f81810a876a5dd34d197c3826bdbdc905f634ee297651be2200c85efb5aba0113aa71400996205c4764ad9957d4f6b3e4e8f891bc659d4d7bc06b9c9bb9d040bd8b70192981048cc84045554abf4488fb99385e728af130e62741a7312e9743c782c97bed240f4b89f708053b2c9abde4a257a7fc99f0d428ef3d0cea552cb819101e9a35cf80c09b91e6ab1753551376ee43637bb995b2754dbbe9fe266e3d9a81d58c38ddc726bf74c92362d7eb61b835158db8ddde24edacf8ebd7a662458b8a95d2cabdcec3eb3cda6bb9ead3020d47a2f9255ddac7dd9a01d692339fe1712d0fc086c99e2a6ecae19eab11f3b4253db54467426d9c8b545c227f04675e4d0b46f3ee73965270cf3c0c2644f40fcf64d9fd3af3600e9e27f4868d9af033a7a84c92c3a4aec183acab48753e995999474df4cafccab88e4280a38d07a0d468b3f447b7d0e2b3402e899f092ee716d45de525a0a98c7a98293247c97e80c9a64989e17302d16c87989d95867df62cd1aaefab1b3546de0995e81088bd5d98987fc0bdae70d32bb351d37d34d125703c155506dd64527c2e673db5115a9db718331a24b52825022039e2a409ed5f3f6c2bb46a708fce750ba0cbc8df9883b50c07779171dd44684843a1fe41adc79c44148f6b95f94731f20930eb9a8d78d193a8468ff3966fa9909013585d1929befac602d04222aeb68451b7a7ca7ec6f8f59f75a8adacafd180ed98df6f7823699e8ee5bd9003f134f9cef611540cc5f216b4365e91d6c6b5c5335e8807c0665110a1849e2298f104ba312c4a5554cf15c56a681d39c6ba881dc51722d706b6d116070093c248178b7b06258cb1bef62033d86b6a19dc8fa02edc2dd4a9a4e7215e345639bea07b64d1489e6350c724fa29b0acead8157fbdc0f5f9a8ca369747071a987a614a32ceeb386e771382ff31eefbf6c86fd4f700bf8cfdb892e26bd06c06c7cc546b3b4ca55a3fed7d566b4bc242d1e842259faaf81aacc062fd031e16190ec7154be061bd8433c683e699c7da7ab4da1c158d4c27fc126b228c9f3f701c76c05cc2a32e8de696a42f1a86d1d5b6ed2fb578e783f5f5bce7767d6436f665786333ab1102add4436a04812ce3273deb932e2650f628a204b5459d00e940d0c1407ffcb78c89a5c22a85902ddae1b13acd067417957bdc36e6430c705d237f2f61f0f6642cf10757aa3937bdb77c90867e870d7a9570bbc67fdb44b344e65f9a31959e8adb25e407bf22b12616095b1b9d7b5c888be70e4cb0d2bc9353d06d8875b85e6d728b7817dfa7b7f5642dc82e8eaab749a4de67fe4d60bcc2f91b297abe8ef9827ce89420f24181b4b2e4fc26cecee367631675d54ea6a9b156b934fb318e761180e342dd6807ddc5a97fb748b82221e9d5e73693396f679546556a60e294829590c91f483bc4b89e31f342b9102d4169677fa891c18db25f618c60271cdcda3b4d6c1c39097e065bc64e08c4c6242fceb8c73627ebfa8b7f8322c7f0cbebe3d199830bb5ceb8261c6d3082ba2ac47539894be40651c49fa5834509bdfb76cb812551af7d84a562d369521dcf9942dc37b70d97e95ff0aa770b00f1b92385b78251fdac98e3ead49b4eb104dfd3a755ffece7c712da060637a3c1face64f78da935dd16013b655f9861bf1cc8ed7848033b96834e726b7de2cfde40a2a8ed88326f6fdbd553da4ebfb5898ac781deb26c1ec592b445415ec4d5b20d49a39f742b3785df6801327071a09e49b1a0e9c35c537fd8937992b3682f710addafb9933a5f9e7660c23832e2d720e3221417ae5f0a513e7128d5c054a77e94337ed0914834c5bbffc0bf7a8405a7a8aced311e843861b2e435532d4b02502cbd606a4a26f6b8ed49f639b3f962c17f05017c565252643982d01f5038642d191c31ea675d0e1383e6e52ede3ea3682abbc77f30457d34c40eb3c814ac79bf8e1922109634d9e2969efe811f188351521cca03b7d4ae5f52f89fb336f31f19316333ed192895f68a543672b771dc60e2f5727253fda1b2a475cf4e6cf14419c5a65ab9258da3192603f0539d67c31a5988c4f495033403c2f8e78437cb2c70e3e7317dd9fa205cbe440a1b592d1151558003dcf7350d8e557c4c18a164da429252cc7e32d2338781ab6b8a70a0a0d02f3860abb4cf181447a52f3ea0cc7971ac33504188a3d76034678d4804d374c113cc491e7dc2c620824cd00612bc84929670990f0ab8c0fc69f4dd208e356e9893785d73aaef0da306d595ce234e8a669690cac3bddd9638a0920ac7daadb5701e0f29b278e32ec0d2dc7e046b004dfd6decdcbda9db2f015e591f4ced84062a67329a864fab9aa175d732128c4d004be91d1511b517a19dbecf81494371e9adf0bda9b94b12d0ab63568ced1e803098ba5c04f49ef19686539f5842ac723785c9eeac759d4f2b83e5bd25b4660254d530ff2a27cfd54aa4db478984e95582f2a5c75e7172cb8f27a90bd26e2d51fcf60dbe8653363e1b5ce38bf7968f2c2898987a8d43be5be4e9d939cf5f8a9c475d90886bb55deac69550243a2e3d9be261601e0211c8a6d4b6f8486bc9eb89d4461a8b6f51d21db00413be506471e53465d10d5216fa373e2e077b56f5d876ac959839f03d3881387db876753f1a8d91bb2d1d53fc8317d53d43165f218e315003f81f26b2a899128718f9889c9ebf943c7e3764e49ac8be88bd6270642b77dbeadbcc8a5a6877a81497d84787b07a8c301eb7d06c563d1c20498845fb8ce483a50b1b5ba3173084a5b371e8e10013317013d021f27ed07a6e32e1ffb724c568edcbd8ccedb97d8ff689e21e1411ba15dcd8196e546e67d472bb9344c3323db5cbefd25669c4e09505fe91e55f7e3df25558a4c9e86e0dc45303b66b3e8ce1526e863fab292bf9184cd0fc9d26e07932c7cd3c324384ba1673bacd04293e23ec9e93f276e7c3da16a3a4b7a52371c139f786b97036dd2376917e94ec0b684ecd54785405058ed681894124cf51e688dda0498499808f74dd2d97627d1896000c1a98429039c7d9e73d4916bbe0a446137556da461c6e3a2f7c699753c1aa915c3da7b934c66ed9283249f6c80b52fc3a52354b768c2a1783ade13ca7ecd9fa372c3590438291ff6239c68e92b22ec18860e717e3ee95358e7cf444d57f8e52a8f730c735e75b86b5f13787ab441895356478515ac18e1a208e810a85baad1fc4c5034d801498bc98048cc1712932d8c31f2f6ac135aacccb762a5e9d8d8125e678f137541c89484f910a04813d4dac265bc086880ecc8219e0cc8987043b30215914e24acd12582c3640bbbb5de1d418c20e8d9aae88682fd9882ba1932e922e193188ca888542d885b2494d4ea02b8acb7518421b3153d1670458cf10b00b048dee62464fb4f5f732c1368074c5159d3247dbc855cf7e8116f68d14da838b02adc755c5e5ae241783ad64bb1ead6baff1d4811f8c5d73390a2aef903c3e5196ae2421ed26207aa2e301966d223c9e7c2a9ff49447524576d4bb4a90977b79298147f172621e06190d6524783940b4069339805ef599471b5129d588530c9ab55d59000f93db05586b76447b0ecf11d7a3a0a012c1af21f4f3284e62157d945f080383dd54d18e07bd099a16c046ffafab5e787171366b15c1d816a8ccdc1049e78cacde3d818e0e2155bc62f1549cdb266cb6daf62972d5b5e34934e799c799f03beae53f0dd720266bb3d0b8b8ece80edc75212941f6ad4291dbe15db6b57269ac6293d1815355fa287860e6117e47e9cdec99222e0718ffc77cddd6d4266e5c595a7034e826e482441b00cf010ad0f63937673ddbe3512aee3ed5dad5141cf8b954f6934cdee4df321a8f098c95b659993c80b8b667cc0f17bdaf4e9e127ff64851220654ecf155fccf86822b2b97c381bdb24bfd0b5833c37da2d2d96ddb77252361a63e5e1f861c7f57537a612c7650874b6ea5248487ba14bc867b0bc17849867776659d1be1c1eb04d82ebeb6c959d141f9172a7f7cba6852be5ca4e31b2d5cb1a8992d85b4f9d4d2521f4a22c90319e134ed8f3242181341c33a992a258178edd1daf864ed06196bd6cba643cfff53045f1e61727a82c60f5edfdff1f449085bfda586292b5a54dcdd4663df9af27ae26a39747bb0924a22305cbb3d2d09aaef20cc24de9f0ffe0fab0e68e1247b59019862450d2da76c748fb039c02ee692324b3b62b363feebe45e956ae2b044094d0b46e9b091ee2e514ba848c86ae34e59eae3d8280b1ba1810e05a3527b8fb7b4520a5fd2965757b0da152bfecc17c33cfb6fe766fa94730e2e3d84a90b642e055281228c8f31c092f567e908138333d25ceba47f76b5fbd9d12dceddf99b5e2259a399a7aa011616c4065a966f014117a2b546b7ccc9d79ac250d2417170643b7fca8fc80c41ffe8472ca09663e418b60bbd5070f0d344e914e927705639d85e4f219b2cf34767c677da728fe9ddf8f769ed9ea25e836505f3813f42af5f21066e8dbed4e74d942c044616c25b01ba7fafc65d159c9e4740e0024314332b0e84456e681d08fdafe4d52030154bccf97836313aaa41479fa6665942d013f33feb4c2ae6a898cfe80f9ca41d141ed2accbe79db8b1c790afea11a54fc0fd0a0b521eea6b3f7b046191254a5df047df824d6accbbd7ae283af774694ad3891a28bef93359edb4c7ac9c987860096c4ec444c87b246c10012d39011385585de76832c991266eee976eaac62583ad6c3579b47e4a4b5237bd92d84a9a03a788bef2ea26fa6702cdcaf5dac30d9ad8975d17723a5561cfe0513f53abda5f6a44a29056587523be1efe2a6107dc3125cee3a5c41b0f71c1d3f70335c5d316d088b20a4cd63f2ddef7bea3d9129677d476602219e6e80a843be4bbe5b79cd6a42ed448887d04d05f06db7a126d65f6e36e6903fb5d04bda8a35da8658c0caf57f9f4e50af5bfdabea326fcda130e38abb18ee9100b132b51cf13389475eac07123f108bb40b22b5e0686286def6d0d41ee8f2390fd2354c4d44cc828076dd94b31a8ee6db455c9291db1dddad344bf8a45d08315cf970b4f9d0008475dff6e80ab5bb931de30b37559c719eea8af17f0dccd8423a402a6ce30830b02cf347fc1090710d61b5a8b46ddb5f1d2223210b0da2e19cc1db53092053e74cc44b9e9dcefb3346321188ed36bd6d88e4e4be9f85fe6171868095d6501240af66a736557fefcde026e679a61ae0c693254d0f3e4ee9d2436fa76abdc28c54cebb99e46bef7d75b7170f138e00e423211cfd84544bad6dd6be3ebfe65935e61b2130bd0f12aa3905f43b5c6cecdebdab0ec7659349ffceba1fb86bfe31e808b89c78f10a3b26e203003b0dbf7c83f2361a99f074417415168988b5f2ce367c315a8727f418471c29b1ec017f54fb3b6a634ff04c324023a9d2f3c4cbf380e0e3a4265bc540f15ad76f33520269142114b77124cbb352e18e6c937031739ba300d68429371d15ab79122329862af209964172329da192d003e059fa3481f5b66caa4bb7195e5a439cedcc79ca97df33af2d5d4abe059ae85076cffe68ca1cd2fffb5ff16a4f4e2ab041e1a455031aa637d2cec340e4191fec1b930584988cd43da49ea16f991e31186998809b78f6315d37f184f6aacfeb7607010aef9abae67a899af71675eaaff21737c692eca07e77cbe9046312da8177b07c47e8884cc301ac0719cf920ae7c8e9ada78950f7d39b9b7df8a9f350dd0c1461777ace21cc22b3ac209b039245253bb1ceee9a25a040a93ab3db5205e7eb4b11f58ea91b169ac9be68b8dadf8e68dac8bdc22ce758352a029deed30ba55e908465de6bb997c25283e91cdbf07bc8005a8f123075732b0fe2769c6341fc2df48f73ee007d7d1f66dba1304bde233bd42b281833b1452786674f018fa15efdb90e2130bee3bd833cce76e56bd1931fec9ee070309cb81a26f81062d326466c0d37e0f6e0d70178b790bb1ec31d9b05b3d417520b4dee645d4f60987eefe6ad7f53775871a1ad06fe78534097c4719a91e4fe8dc6498481eda39c11ebab9ad2b93378feedf77ceafe8de1119e1526a639acabf3fe322c64b2588c297ec41cf07f3f7a5ef74afc4257262846ffe7e9fd35866c66bdf507539775ba123d385ce8ca0b95789786538ca2a0d88f49bd4e3b0bc6c4428ecd59968e387b5a844c41c5be91ec3eac070dba03559d30e3ade5e7d78c8940a2f46f7fbf13e236b8af91ab45d3a0af2ab36b5da1b2b1fa135558927643926fd20baff3306a0f07cb0ca8abf615a53312d0a30f01eb2a2ffe153963906be81bf0fe7504e37149f1d7dce6d3b7d4462b74b092489a8624dc2f95dcaceed9b8f8909c18e233edbd5c789358ff189e6334e9b8108e711ad0f2cd05cfb29ac1380ba8d53dc8d5930a4f9d455bb1839c94b443b6ef943bd88b4dcdde3b006f12bc71124526129c4324eda09b1ab5160b767f1a8a09bb0d3440301e74efedc9f44867dab555395beafbe99a6544be9a1b52e90840c1ac2f9af0395c262b1e734fce918d057c2a14585bff033f3449989494bd944ab72565c7329695d97156eb148e97a757c9aa29cd222bf555c2c62b2852a572dc204dea8e4e43534cc51ab1c732be98a45863f1967c0659b1845833fb984eedab37a5cd2eb947e979d54415a84308e8a8b010bf92d3042240e22abedd42e708870b744dd0ff855cea3ae6bf7c677a5d6bace3eddaad6c66978b1ff5f89e405c886134c86e171f95fd2f8c0ac96774bb0d961ef2306a78e4a446cf68ef04b47b24cba69fe6795e2f42fc8d1916a122f74003ea241c11c863de9894f06a240e3d54b7c1bfa6c1d9128442857585b1bea08128dfde4151116ac56e7f100eb0109da1a0a64661f5c2792723064d5c57b48af29ed31393255b4d5832700de1a0a2eb510f671a3ce6f43964915caff1a4fa2e4f5c3b7b53fab6300e9c7fc9e2822c6ecc3b4c097ea42ee6b60bb62bbd3aec8a034baec39dcfb728f736cbcc240eb898bc673c69cc75d628b37f550fb3a39814c95b19d58b489b11b44e607d0c3b7bf4742c0e313ac2a062242a39f19a18cc777ade291d7ea3efce084c3f9e58c704edf1b1316b64aa7e994af32df9f368ed20a2ce606d4e84c0541f045e1db4587c3c0e4def7f22cd861df33bc45b080260b0eb1ff367502e5df298700366d6bbe6849168926596124689430505e28d678377857ca4a53d5adeea6972e587ee06fed12a51a3acdd6c0cf468f8c4fc1a6da510a899e74136353410fb4711a95e232395617fecb22c52dac8f15759023fbd138fa60162886c811e5846adf7ec26fa6a03cd2fc492717d69f09ce0787d85a71181a174b17da1604b15cabb0eb58bc7ff17b9f826cee08cb7befd0782d4d30632c1b4e8b721b0e43ffa20365ba5190d8f0b7bed526894d39b7e9975498ce152640551a8828d5e93b02b4bb75a7bed69289ef2cdfcb2f80a34b46a520aeed885ea7bd636f6d6d3fb81448378b036fe66ccfbb5e40c2c284706d7b8f384c11d5ddbc3c317e2df8dd1d2836a53563639a5ef44de73b2f7df4b090246a8080c7b644e418bc82a8c68696193e9ed0b7e9d6ecbfa57f75f88288c18b5015ab5eedf1e82535953d3320e5cd7df55a8b86ec0db8228536b5c806d2fd1bdb775daf9eeccb8cb582ee75443558caaf5d0449b4a3d5c31d07f34d007959c3ae59fbde730c4d4c078be4744201187245770bee047c3a27d1cf3c1e93c4a4a9583f7190324601a9f0b0ffea1eca4ecbcbee88bfd686b279c3d266f4e0cfc7e97ca3d70f4b04150baf5638c54b57153897fbf024d5dfc3e36e0ee2a141b6afa2f7080ff5d90181a0a1e51748ee53201950e280f201b551598e2e56616e7190f1770c374d307abc3ab8c9108e5802be250c677d40786541972d949cc66f192597ee748eba26690316b423882d3b90f17239705f62436b8f16fe4515ff1219743c3c5a2e7c5aa94d5c7e742310591bc783a6b61af8e0384826d9104eb5a8f0bef4106beb920319fe5fa9d98ad9b5dfc8519cf803ca53dc7cce88e2dd65d168492073ba75fcbc2135551f174661614ab5a6415c6ce7de19d53083211bcad1d6e0815932d30415dd536f465a8cc0bc4ad42ab8f0590a7a1d1425fb3f9e7a2a7c971ec536e46a76884dfe66008afc29793018b7323af43dc854edfce29a3c029120b998bfc67d17040c2a100dd9907cb9d37a236f4efc361c3a4e1f3d06ceaf38c01eae7a98656409dfad7cff3a08f37374d3f147c9e1e83c6e478e37949d72ef4be477bdb8d2ef61d61b7005651ff79097f0b04e05ea0678200ce0251cb018816f5dd80d8770fb1fe19717e8735e7f78a2c24ed658d712ca3fe3d21c1a98e379c0b313f41850008dbfcd0126d127d20fea7b75f5b3970fe606e24f596466f86002276929df8fe1f174da1d720ee809c7bd5770ae27c1c8515344461a5fb71fb7e6bb2dbc3919092b3f20c93735c7afb186aafd5038bf5fc360b83c2b99b73fc677554069179a9074f06628d2088db8a7e3867b4fdecf42c6240984e49600f86f2e76d26eb19d82d72c1cb4fda20e6373cd47bcc1a2e32ac047daaf35168d1aca5181db87f6f0537a4b51ab8dd80f2cb6f5903c70df8b554734c039f1a47b12d70c944135929409580e224ab3cb2652c704e89be2ec9735ad3a6838f028036b355dd7b944e234c384d013798f752cc2bf56537f445d125697fbccd989942e934c499c4ceaedadcbd0652ad0572ba5af921f4a301401ffe41ffd20f52d0c323605d196c0db50f5841b98da21913f592cb6df26653487384feca72df39ad31b40ab429c091adef98135e1d2ef77ef044765681192d596b970710dd7fe68af52a7d3f051d96f101c4bd7737795122fae0afc5c364a47bc47783343d8e65d234b3098094a65929e798dc67dcc4d38194d7f3f452d3a8fd490486c1ee864005a93d24cfb1b90ddb20e85b4d24a1fceb2b64fb749bd8955235e96187c47a4d9cfe03a5174c71767a7d24c14d19a63dac94f9044730584161bdb705b6eb72475b0882af711e52b00435f6e11ca3db9f026cae750ec20e3be1578ae724f2894e5032bd1e05836f3f13b724af1708b056e80df0e75c8b6cb27ded02eaeabf80f20b1516f01ef1bc75dc712dbb849438b03094181936ca992f3d1a5ba035bb63a546e9f2f752fd05efb4cb67ad7fbed863123786d54b60bcf5d7580dd19bae68051142f775ca0f65c3c10e64aeacacc0bdea7815a0f7efefd3b5f66075013f8275f758d0de1c0a97f9f5e86649e3b1e064006472b2f1f02deaf4262b98d897ca7fc3443e580c5e363bcd31768a7ff866279b4a9e009c8e0d681d3a8d574720f15c49eb9a27ddb7d8cd76ebd09cba1f71e9d6ae6571f43b9184fd279bb8fb1a32ec962fa49b9f46d735cc1b29a36388d6ae3d3781de76b1c19dd4c12857623c459793b70619b0631a554a7990790bd1c77f71a0886d026f0e7df03c248d2474e87b37156fe3a5c9e5a19d4877eeb26766a0ce7baaa103d03e592d3e889767f307dcfaa5c07ed015c98a7b89131974dd144f9451e7cbdc0032b20991a370e47be90695cbd4c817dc198ac99bb4d5b9d6b451d40786364d64a1320562e5a59bdf38d31eb7f0ba7163eec70d129a0aa8a46990453b6b80d36e8edf12adf27eb196aadbc9e6650325e6b981013334b2ab5fb267f87f188436fd61beb547282bc3f56689d9d918f17fc990497e48ccc6eb1a2dd82e01f0f362f8987d946c3a18a163af46f9b0f56d36b603a87df5388877c633d5c514c2e5141138bae97dedda039f3a76da08bcb4ba803ba0be1507786779a815dec6fcfff2859983c32f43caeddba621b6279731eb4f0fab09688115f91309d5775b404facf9569f15e6a5f989c7d624fd72caf95726555a7192cbd95cd30db8cdb2e6719d6f06d2582bd6708106ed5b0c2528fcc6b676bfa6e15a9313294ac9405b5f2b42aa99e5577eff68281c86c41444d85937939a1a276a1626647d01ecebc9fe160b072e7aba7fec441f4e7b7ef9a259e3ac8efc11b81076c6257110920fec45cb90a82eda86b8de6169d8864bdaabd372d8cee6f3fccfa19a8c83938f655b4000396e68a8cf487b9e5a1ece91876b34aa35f0714a07e317941bdbb96d3bf100589080beaa16221805526b8655e5a6315e77cbc417275fda1295cf07bbdbaa39cc35af08cde973a8999445592b06a54604ffa2455c393e523fd85225a6780599c5b46f66292702bae4d80881c9229aafc4323b0fb959b417c9759dc60c2d7e96d853c9257b153e516fca11b9cc0d3c70492756e2d6b3a48f309ba7d570b2e34e39869a054b6b66301f87476febe93e15e1ba12ea686d66eb30023fe00551fe5db22e62716c9b96bd88dcd17e8ec4740fadcbb0927de4f4416e2b16a40241f689a6fd33712312d510d3912248a559e8215bd6a46bdffc0ec1a9db1543a32f98e1b1521907ba9e809cc278d3567e2c51d46be9fdd43b3a3aa5d6c025244ee643d72270cae00377c65245543e8d0e27c6d55d7f74cf12172162477d3e49d16261b05df24b20bd3e15a77ce95514b8601dc2a61d512b26e47a5fdda5b8e574c4e7c7ba9d217e901bd0b26cbaeacf765405e88a7f4592462ef721a9b2e52b50855a3140ca3597f651c306176d48d119e7b537f9e933ed5bfef1b3ad66c317b1378e9d58e2d7ff25ef47696ed5f58efa513d07219db3b526f7d17c3c85046bd85a739e856d502e25c72609008b97c7765180c7a1357ab38c62eee311992a087ee8cdb87b34f190bf34c5ba12d368a452e33f89b762995f2686a34322217820a4a0266f5cd5e538bda9a31f8de7ab2462f57a9f45c9a99fb8785126358fe1d116ce9f7ffd727bb37af769ac0229128d2d0660467edd8a5ef7abc4bc73ec8c9920613fb1583f4d8307f6d35506c89a6784420e24947154832c86f9c654308626e88dac6925c02510a1d4330ec9deaba52b0420322912118d209fcb466010e6a75c9e94fb15c42146c189f054e6a46cb193fb9d6e83ab85a87a397f8bc4808f6fd68a8abf2d0f69f42e60fe5283f5c546d3af07785f2cc1aa3f256d35304687d96f1d66dd1346eb25f43692de539a567d2e25eeafa49c6b428e23ad31f92a3c7da7bffe1438a99e45ba550875dfdaa42a064a1cc71c065b9adf62cbedb6cf180134445026e4152f10b7ea00dbab63bee02111b09f5170ad8981fc580b69817c6e6e948cef413f09e8abca9000696fbe4e8242b154ec495025dfce9b66fc78fe60060e1816febb9c84b1854cb74c04e856cc90c8e066ccaafba4832eb5e50a448387a405e107a03c5a4c8aca656cb8a6dc0673f616e3d56b7c58b6955710f351e4086ff2563510a1948160b5004854c1c04bb72a4d6e60648c6160dea2563b89c386c536e42cc3a57f9596535a7edcd341a24af25da767e9e55dc99132f6448f2ae6092f714dcc00742668ac0aa8b05587b64e894549f9210ae0da9c04bdc033db02a86213a1b6799fad8f4918b1420649cee7be60ee16f8a42f36fdcd3a988d869cd22760c4ad12b156fba27e1fbd8ff447582cbd5f4e6cb432ec512f3291b0ef6772b37eec5842972b0bef12b295db6274a4c40adf72bed2abc75e03bb4af35e088dd7fd8d57141f5b3baaa1eca0303fd7757cca7af597bf497e77b9090349029d87f76c37a107851e9f6f13c640747565b15e156ba58fe5b405d74f5eacc5e710b8ed12eee40214fab022cd74ec17e9088b733d2eda9f4b4c8b4da359112b4e2e6ca692e2d13660c9ee672e09b876f3556f2ac9d5ab74e1ac401ceff29ca574e93916827e0b9cd44429a7b830e3baa8719bf92fa905deb2d0ad281bba399276adc8e8ad55a3d0c5e3c94267d56156bc1a4a45992c5c0296fdecd8b77a13a444b016eb291666d1a54cdfd5381c8067017ea65f4d8ff68916792b435c684f9a82b10be1e2cc6c76ffc8d7c0dea931f489d645043d790a0db0ae5d7330790421d069d59d17de7602ac2abe20fa79271305232dcb840de716439f0d3202aac8bc0e7f174415e819c52ae3fbdd1809b4c63b35ed46e11a1f8a2e20092e95a9ba8ae6567720d76ec56ae8871078e1b1526d9888c2c9e51afdb3110356c3966a127d4296cc3e684535f307b0d1c5c888bbdc786d36bbd60f7367156055eb4a6128b12aaa6222ce3b40830af56348b117aeb94bd876abfc27d437b0732b8b7ae17b8da40378804a028b933b522489152be6f21df244e0f9f9f22ef3baa1635d85996cd0f6463d54e9d4750d780b730fd435e7ea001604b6e94d41af3618c71914cd5d4a1d55e7f975d9f5474d922b093b9aa68d5c7cbd74247c98d2a6adae5a771cf12d79232e63aa57ca1114e7c6e600249317a99f7311efbc4f6e8348ada438ce03f9bea3d5378a298553f5e2447a0617d9df48c7ff9ecda924e3aea8256044d521d96bc87342a581af941c3f50b621340403f5245539d3dd7f54ee072650c1b62dbd5db9d41884166b82c4d880eca731ec35c05770b2265507917530931179ac83260f35d66612391b55161f501215a30ac4bff68ac8c9d6e710df44807e67c851435a52e820c93cdc9602a21a126ceb92c12368b6cdd8de56e01ef1a248a62ea6316bbb674fd1c404637efce229a5c8dcddfb635558022dcf51f07ae35bbcb19bd76bf54c6cc69cebaf2d84fa4c2273e7434f1140e8bf526c49a0891bec546686eca1638211f60028ae7e072ccb049e49feae49948543fe2687fce57d46ca638b080f3c53958be6f417bb2c91ab5e8ed8e099b428530889519943f4701263015ad04fa4636a89a9415e0385e8322d5e9a748d08800cf2c140c09920d129074ba11a00fa075321878582c1831c2345a364e2c435fb55d6af0a68ef64372039c5bd71352289e45c919f5314a143aebd2e0b2527320e522a44f60a7698ba87eff60e70aab837b1fccf6dede9867fe93f68f2d1d8fc7e4b4e9962a79bb442b8ffc10e46691b740c08043acc9ece66cd09293a7ce8636039061f199f6c1303556e281b9e1660ea0644c4a4a06ecba0864dbde9564038071162b394428551b5a781d307c7c469113329fba3cfb2a4ce0dcc689af3911cfed00381225a3555a71f4e0d6c238f13f8b9349ba6067016afc33cad75dca21cba76030a0b25fd2062ff2e6b3d21177e0c2850f33de046a552aea79bd79de34b822212c4f09990b0351539f62fe674f58a626e12f5bb23428558be0739ae2b5d5e2bf2e7580ab2bafd0c03567c7c8b1f996120ca859f99423420da338c6b0c06c1e847d467371e87c73f7739f0c4fb8c089db18e3700b937a6b87c87420b38bb0c86c6947702045d1692cf0b9ab1383481327c11516c1832d379cb50b2afd97e87a18fef7b60ecaf595d2f0c5ca3561bb8c82f72990f77a9236d2b116ebfc22f3b42131b743fd14b15c04f4f3109931701c4f098162e1c0d0941b5d1e412ecec99388f7d2085cd28a7cc016d39866b48a231001a7c67ea918b07b8ee4aa370287a5bf6e087001e9731ed991e10b23e5fe57a425004817fa4d198bf80f7c6fe00278d9ef29e71cf9bf26196bdccd714e5961db8b9898712b56fb892c5c764f9e372fa47235a5f295bb0192e753726c36e240956b0afbf4a5af612949c9931548f1722ce846ebc0b0d09793b06a71f125a7f8ce7784a18da382aea9dc7ab703c263abb229f0d5025945b9dbc82691b495468204498869498666e46f765a48062bbba12c41a036881befd43ff4bcd71f53344f31987aace37be5cdc1005ee3e88242eeb5967443cc00285e50e9e4ab17c9646a4c2f4b0bc54bae8ced779c81a9cdf0a10775e60a1189007c0e79c1860b3e73930a668bca5f1c378a6d80d40ad2caf5031640b1eafa84e603056f4a2ef5d1307e3759f0f44e89f1a5698c1157419695c114dc9db9ad864d32a8be9ccb12e899d810b01dbe7d219d2e246b10e30aeb6622fc626702c24bddfce52a81189a9604f40523ff45c4db9c3450b88dcedfc512ff3852d4bc129a64b86ea0fc158ee9a1463dddb6f4265576d3ef0272b01912f11f8c442bc9b6b9164662200b5dbea107c929d13a867d24e5892384be1ba590164fcdba573e068b091b0109e80c11f13de0f3e4a2e1cf58b405e8f9f015a6184df4c22ca1ae7993bbb43a619e559c0ef5d08316d8e15634463808e56bc1c8deb3c35f7977ca67c8dfb41699aa0d999d83cc7ee4a2d884023dcec42436a12f9772be4b8e701368998aafa76fc5b2e1cfe19e7e5c2213026d78e4a3573aef8fc0479a72511954cf09b6e966879bdb892694fc3641dd33449f3353397bb91a65575c844b5a13619f9af7f40e08726a82d7daf8e1cdfafb2cf705901d0e461b176369e05a72bb3e5b4635ca63e11bd9e7b2b9fd5e7f15f38f645ad8288e040a1468d7127b71982ead6010366a4a326590591de2575ed271d3a8d9361567f7601494d959d959932137eb578ee8c08b11c84713a78debd0994cd38fb06e85ccdebc1bc655f5447bbd240beeae7561e62c83df7c5ba26166bdb9791be75ba743ad038b0a68ef4af2fcfd1f78d8f53b4ff5fdc98e4279e069adff38b64954eb67d6a80dcda8783e2afbef4e427b754563a9138d0c99add1c3114b0ec82bad61a279f1568da69544b33b8754dd2d921a53031be65a66767154bbd420e740a794727f1351a25fd67b3054ae71384c99616e81bdd75c85f1a8cce7b32ba04c0a6a181bb018794f5348ac6cc132212e44e27e51120560cf864c8070508b09fdaa9a4064523816832f26c7b31e040c2b3eb839ff5be520768efbbef9fe62c133fc3668483dcb1b824b7b4b7f0d831dc03841a914a8f6a25189fa8b6a9da6cae5afb0d10e641f6839eaa1ae1cefcea9e0e3eaebbdbc03052904317ff46b55be19550bf528b6e823a717f99ed0058ab041120754fc10e5ebd5685dfb68250bb8e9b69ce51bd4c2669dde345eb5d7e7d6f6ff58fecdf8caf09fd2e01f0f7bf0ea9066d945e8f29c9a7a6f92348800643aec847d06b62c04ef2e863f4ad033221873a7f51a2bceded3aba21bc53bc6fee86221a8f10b7f85b0431704330a837820dd6800c18fd238b7c7bbe9936e6bb180513b99c25a429261e065f0e342f6042d2777a991b2b17725f645e01e20411a151c344ee2cefa24b3dfc6642e381e16f07713ddfd17c847b5e950aa78c8b78fefac3e5a4cba71ea94f611e0e80d51588351685a12c0f440362d5ae57efae2862b984776f5746a239357bebdd0ab1f4f67941302dcd7be497d8ac3d75c991c4861f62d9dd001e62279dff7175eb09e40d68ed216c748a92d3d9487fd9e95f5a6a9074ac0ae8faba8dba3bcc3ea719fa1c04613e9f6131e51c6a9e7f2a6d570f17354ab2ea862d12f589cebc02255283df1077df274ba6053d3345bb6103e23f9c5ba8f36e05dcb9666509370b9eb81964d91f71ab8fd5e7e8b28ec5a9dcce80207489baa10a785fdea3ceb083b18b0603f2472345201d2e8a2a7d97b7eb2b80aa0ec7d9be06c3d0c8568fa14fcfbcb41186a8f4a3685da1f5baf60cba8bfacd41d7fb87905e270d64d783d5e0adced65575d98b015b6545f44cf826ea6ddfd1808cd85a97588fa07b9fb006c545d05cd706c0cc38d7d15b72b6f57b31ae4b25fa6ba42942cd44c9d15c20c11074762abba78f68acbde4d7144596b598ca8a921acd6ab3e50b5baa00759c0ea806a1ebb00d687972ac391e97d9d929e1b6434f065009afa721cec47b88c32b43a054e9ab62b2125eb4f069feb701ac71c11522177578625ed4a60332ecf87fdd3161686fcb1fb75c87d5dc30b9b20e64d250ecc3936d21a204c84e0f884ab65e0a732e8852b7c880a90bff0ed2d3177d1b0d719b142e3116c5b99380fea82ea9f5eb7224f894b91ecf7cf576aecb0410ddb458560291bc13f9356bc47eaa952f16ac4b501f794da9f3c2a3bcd9d787a85aa88936579a9ab790cf0fdd7d08509ca14d3cec4586677126a4c7b46557016f667930165b7eeb5a94017ae2628ff4e7817edcad6a48f771ebf0757b9b1aa0ebe2abb44a79bc4eb825d9faac42f43fb92d244fbd7c1aba2ff406c67f7d696ad017b64647184b142982ae377f811305c139f0de131cbcbac6d3f6df33dad38da1eac2489b2e9f60f2dbe027b5cad315fbafd99d637068f419d5f9b1ec75a0ccc6be1e9147ae3230d287258094ebbddf89a8bce6a8aed314116031d44e771ca0f182ec8f9bfc29e30f294d33f9d4b2f2fcd9aecb842a70281d420e576464897fdbdf14580f7ddb274b1c1298660b75ddf3815921d658b6dd88ec261a445afd60b2229a1888a41e24c980a61166dbc02b7837887a2cb93b88a8f12a8154ec55ad81379907e996d741df20ea42576f8e560a621035223b9d959751dbae54cb9ccfd14615c4635a363e4c15330cdaf2e62c5f5e38698c6d0614e862232552d6c6278278f9e786b6714968810f45e06dfb9031868f1a3d983028721bc98e1b1be42462f825885551161b9272f5ec0687052c2528cf0752477956ad1ef6b6a21a6823a8d4b141bc565784e60789b84fecc2d5d4d285501d3e6463501f21fa8401a06948815449d42ca6ee05117a5505d60f848784788888d2482368380dfa667b5fe8e129b1718c55217f46d11a649824257a7700890ce2b80d2ead5df5425c3139a8cad722df36fc726f4b1e9c04708bb7d6f22725d7d10b74b75786383280f9f3f050ce1f995d27c308fa75483a75ecca0932fdfb36fb48ad9ad09c4f86b6f8bb25e8d9df93353c8936296d1927e8c5cc1cbb11e82bdff9e4d3fbbe7db174761fae67c7d216c006c119b963e85b5f3c32462e7933887b6b8c5043c7072825a83464909aac72388185e89650e5185a5f14acf402f50d4c70909f6037d15a6a9467ef61b723d296606b5bd71ffe211fc4aff5c52be9a7781a26f07fd13230b1fae31ff661fb5a5f5c8e6e38f4e9cd5a1ff793a4c97cad2f269fa1e807e910ac7adef0554860036191810da0af1a52482bbf621a84dca4f9b0f864c48be035fc8bc1a05bea95334c953ec05f9625cf131c38a77a8131fa522da75e0b4a459fb1df880b735159da510a62e84b6b4c91b826349d3854d922fce802048a35029d506005302bd97db1c604c7cbe242099fca148bafdcf143d22f1828e8102a7405d0738ac2db33f11bf65f89af0e658357aa4486b09137cace80e12eb999a49f0278a51cd060a5d3e3b6219830ead033bd955b2249a71861a734a644876bb3045852af9b21fffcca4e1cef4050a53e8c9bd370804afd06fd123359db4cc7962013adeb26287ab6f625297d625c36c2f6c5d383c3f3eaaa32cde47d0baae3f8f18e00505c647889e6e9eaf6a1e7ac09393dc5e094eb67073ca6b64d26bcc9499b4d0264a18fd148d44048b017fe1a62ab73b41613828e9f5a7b22873d610b525f7c6d08a1301f79f8d782403841e803f88e78c0fa1e096ffb4ae8042f7633684598f258932dc87011f2902ece692f9aeaeb280fa9012edab923a00a82b025ab9376f68c67edad88476b38d49435435a6c6d35e16aa00a8286e91038ac0eb1659b8ea1bc6b58c019c84e21a02ad74e0157563f860d3e8fc3b3f73a614b2a97ced48a3dbc897639ddda4184c96048442d2dd496abb7b6e31a7fe2144ae5f8863876bb20c0cdb293f5a4fbc0b959bd72989754c5a94be804b174b90242a562104cbeebd32873bf34490957ac7797dfb3ca2c9297dfae9cbfb970a621c060dbbe638def63ffd578c128611f3bf01f70e0033ebfcef8a844d612b426774696308e335b6ec3e909fdbc7e6a6e0ab84c92528258c3f0abc38f17b3984b4ffdbbe5068012d3417abe793fcc8d56c69b532f5e595a8784a8cde7bb6b235a9260addfe824047ccc523386952ccbdeb2dd7e22fa44e1942718ece0bed40508d665db84526bbd55311f9f4137940bdb145a520331468991b1a6f5b6b850cd62d0a0ea79a7e4a9725af6d7e7f11ecbf8d800898ca63e725efbf71e7ad83fd3aec768e02e83e1cb8ee096c1b3ebce8fb4bf85e665626c2a37b1b6a576e8fe097cc1d4fd0cf15db530281739a53000483fb27a5aa84be75b7403f40c23cd3e5be832d6548f1c37451c56c674583163973037f46450bdef30a3a05d7154d5c5cc3d920175d6fcf444e4205416ff64d8c5131e18ab26bf95170f7ca31abc71bc7ea36bf0e2feec703fb2c210689fd135aacf88e899c0d9afae157cb4fd4ca3b0f8846565f1816bfd8a7707cfcb85fb18c3d0d46ae72e1798e6cc2620a792e930ba49a49380a8670c9ecbbd0205a7e0aa5eb4231062a0c0579552e6c4a5c84763f7820a1f685c5f6fd475be1e69ee24f14ec6090e5a6a553d93ec9d86072ae769c90a02111366a6260bad0eaa62cd443acf3251a1aa0c302f7ebc39a8a82c81922966400250c8a53c9f267a95750091ff9b1e42f925ea02bd33c6248c6af54b92f3f1f82b228ce9532d145130982ee4bd4ca5bd2a8d4fcccb2f01a7aff11c0ed891f131ce106fe6f921a85ecac71271e262ed5ccafb77f430c301f3a986ff23625e1f85aa4a9388897e521cfa2b7d85edb72460c82cd0e73f02eb7824c6b443a4c80e09f48b098bb1a6b03299607d049795d4cfc322ca2cbe357bb47559aa8b1eab50653b3fdabd460335acc4b8cc30bc06702ac4720d0f239d8697fda786bf42dc945a1437ae2661fa537f137f1a5dcf00d1575cc3dba697424c9bfece1528d272715241a4468ae2faa79842c02e13cf06efff9ba447901d28aba246b2f0c89c918f71dedbbf4a938c245aedd64dd1579a785d775c6964fb6f8f71c1b36c562bf36e5ea7ce6a9d6fc420671fe4f108e7ad6e89af414c4800154bd88491292e091df53d19c4f7fadacd0e3e13b5e0ea39de8e125b2d243a516f3ae049824e5d7a4540057d2c19073b569fd580bca32755fabcd261e88d28c26ad4acd5e7275fc3fe82bc6a847bcf11f92c1315d66e92afca21bb0a6f48657ee66d1cd4ba0140a902c96c77a4df1b22d50ee590539744517ffd56a2dfd01a4bae2a7f772597d88125101e552c154ed3e026f35be3082731d0d12308bc2446a9f37a20393759a8592bf31848e16f58a97219ac8265bea9c2920879c6e5717add28b811c2e19f0cbae04859c9993f1cf9916177918b3c5c82da07fee9c7ff90065d66710d6d9173ac9c4b7e846522941620998b388b94db6f30ffa8f7ec6163f1283b480d3ac2d59ddc262ca77344f6de0b546cf85821aafc1d258ff495ade92ffa98a6b6f4bf9b12439e835faba5943570ff2af582be63ed4bfdbb4f5c02187d29e03d4ba8da62362ec489c5b0eed26945b1a1bc81cd3df6d731efed523f30dfd011d2df7d3c06943a349751a5cbd4356ef078150169390445a3d1ed9974782016c6bccaf8bf577f3ae32dd89fd1d087f964ce083aba16cfc55be4a6e9e39ae0957886675d4813e30533f9255602d9c91081a26d343c2bd763ed7e3d83ce425230ffd0ad4eca69ac752382a8e3e38fe8a2f647dcb684c3c689ee7d2c4bb7c8d5acde9617bc02b0edc1de826d9ac893754cc0d72b1dd56e10d7663e2d309bb3f1b0465548a945ee368f499d267f1a5588ad3ecadce39940ccdc0066e7d52e23e364a7affe3a1e0e113c93528ceafd450d13b1bff078b40c919ac5090906107ca7b165180675430103a0c205674abdb6ec2d35573c8975a28c4e8e1cb266a9c5fb2c46d9bba90610e9ebaaf80990265bb17952d5e768206bee317f87ec50e8ea3fca8f043a24fb88817444fd117589f0ab39a33d3754335f94d9a108eb6132124d815b8989113159c6a956a013122ed2553b111554c8c23f0f30baff984f117689cc36b8eb9f6827286a09af89fe641a8692faf012d024f196e0c2a27811b4f9ed7ec166acb5bad5f7db5209643b8e98463fc1b098bec28307f57f2002c1be1f83b2bdb0d4fbda13dd078621594e227e94416c130caaa36d889d96247e0a8638ae77e5d5291d3cb5ed5c39a10176ee467bfeaf25ff2317b2e154025f3c6144ae4b4d4b7528ce381aa37a5f6f54577411450f6ccfd8afdc9f4945177d131c4826fd0c37d5974665e7a7745064cdd2aa4f9590eb11922d87274a9ba253a5aaab7345384645ad05b6aaae976f82a6bd51ed8b7732b7e69e98dcb88a9810f4c784451ab3744ac70461b496964e096d97d007d34a362999897c2dd9c53d120212e36d2b26c814911dcf967a70cb0fc216bb865f72a4857ec2f2270e1ec6d1f10353418221922492daf4d893d88bde4a67607ae00041707458037f7d62afabf4cffde2568ebeb081108e0ecf968b7964441aa9beba4c71a37bfa1e3a367cdc7cd2be182f6c2aa958f66bf13ada428a559f2d0f99af15eba86c367074e40aa9ae2aef5f24c32dfb7256ef85ad9446d400a0ec0943b75c45326bdc269a159d0a3c1d70f5b86b20dabc232eff85af002f901e33b0b761808c69255f2162dfa3e38c70f2aaeafdc83c017c686fa0c78c99118840cb5beb5bbe4247b7912caa8d3539e25ea36d8d082a22ca1b87727dd5846d95f2124347ee21cc00cb4c82b0adc0a448ac79b04b3e59f71ad823b38fc83d039ce66530dd5d29535604df4e2568361578660f982adc84880e81342198eb84c42a6b30751434b1378b3591204c314850a22c830fcc60f488d471a6627bd18c09949fd32b1d168aa76acccb12441ed39689948e910457609e1070e2929dfd2082fedd1afc16899c37d1cbc8023d723fb62f0ef19739e3e8e36661827cecb8713527fbcf86ccc1d316da87116b3441867944794b7277cf3cc8d27fcb2102940e1e0db56462ccbbde27e8ec33a199f35a4c7104118de050b5b0c609f9f28f690c6564694edcbb64c524f34648d3247e952521f962107ac2e48fcaf5ce3c47ac59152ae74a34f66d7296c3c12442806b335cdc91e41b9bf61234c89df2bf9fec0b235e5c74e1fccd901ae5c39527ecb737aa76041d5aefa3fe888eb821f6fb324c4bf211161b623f4bc15097fd10e35c9c01befbffa53396dec400f267e272f77a555707dda48d2dddcbfdbbe95375fcbbd9c26834edb6d3dc7dfc30f13cf71e50b9db796f43b83188588098e64de6da284ba414f78dd837458d576dfcf70dc7d3a5e78da9ee2637bfcef80dbdb66fb0349b87a66f5c3c0c7d43d1636dd7052ea8914401136f370cc44517fe9cf607708c1e86efefbeae3bcd494fba9b3512f89366cf2117908abf5473cc31299688e902661369c488b1a5d4b3ba5a8112e15a6ac86d0694da215b2f79a045b1aebc98981b3d8e3a2cae4bf288bf93cb24faf72d2f809640dbe182dc5a0f79eec699ce682647c78cf06e415d28e178aa326ac37a746684521ead9c1a33db11cea5eda6c7d78f6cde2a4f587e056bcffd2072006ceb7f41e371bb2a9a6c6a12fa5cae549e94f8aa0a2f350eab88d965b2a721b763f040f0222a88c8af6d4e7ce478d5ad9899bacc751dec303361f310cd404af00e00c03ffb0521c0b3fdacb3f8ca2bbfce8b8df7df75ee3614d18a7613d0064373f7198b653a81b9e5e72165b5f02856978565e2d83f55ff9f71a974416b54e7fbec3c1b5672385761e064de9fc95573c36bdcaa359ef4e7b6c65d9d6f98186f3dc2c561f1707b6be8de1c858bc850fa9764a93717fb4e6c6ed3dacdff7b6cc1864b4072116ec372c6bb8e86cbc561ef5a846168638c2d437d4443e163822dc0a7fef30e803b83f149b6cbfb3caecf92ddfd77a3cea2a8d5e9ab8c0a6967482cdbcc220b7792fe63cbf87ac00b6163eaf5535daac4ba1afd5cfa398ef01ef85c636e790ece8ac65a5d317bf24cbf6c1afe5073375cb1a49b8683f782f09599efe826e6eeff931ef280abb43ef8523c1c6390f1640ce709a82a6d0a693191f021f8044c1d63a0e05f97c3a868e842467e7b1cd7076ce33290991d0ebc18814f580f4d06aa0b966435ad6befcde4fcb71bc777d2de2f9bab84d52d5e2803c8a2e86ade9b17a39762ae2a4df708f076f172037acc3d28810ec89c6e5b5095405a88984880b228b5e4e4453bf821a9540edce88a402b6bd48984573211a9f39606bda531c6e177ebc5dc310542ca332d04c86c48dfe809dc06db6beb39a3a3a10fe7d48e1616b141e7477c8c190df91a967860cbddee316ca3d0e4fa25e46adef3d19bee378a83599d61316c34dc4f6e4e70b5dbc59b632289f0730b1a5967a749a3f7fda5c7fb7e15bf7df2a719633bf9cead11f512d6398be406f7cec38cc27efe2a1fa1709fa0c28589d3e17029da3ff10d90edbadf0edd6f2b162c8c40ef2c7bb3504ad7158a9d0b97edce85eead2813cbbd0529a7ed6490e71c016acdc7116bdf55570a2b9a349d025c68a915a8abaaa1c747787e1562fc1c5cf1276cbea27ae6613e92d17be0c707914c984b26bd7358065b819de35bb8e18a22bdf3080c57c92dbd4c12cca8cec5d900a066ee2de8ebb534e5b25dfa1db84524ed36c010ebb52ccbae47068ec7675a1a46178f1ab946579e503f05c51d99ff5509e8ea7003c96cf5edd9047b8aeeb1e7e91a3cf1fe881acb58a709b3ddfa3fab5f07f334803f76d368559c075f95c769d8b676f3bd689d7c14f60ebd44551256b09bb358eebedcf5be889d36e92bbe0dd1e2a96cad3a58f973c17e46884216f6e731165aca4e69e23387d6e35052295acf280c3740d96e6aa7f1bf6135edd633a98261515b29fa508aa812c185341184b1620778d0d444ecf1021e60ca9c3bceb688268d7859c70cd2d60e5b0cc772fdc9d8e9f8b1f89fdd48dcacc786fd02ad493a47ffbcb894a9f38b0d62cb3b3a7e5c4bde7a645e3155d743511103d318ce1be29ac5dc923a937ce2c989c30772d517f46e0cb5054209f216e22bb6b8d4d2ce98a1d565f32c35b39d8c40e999448ea9c073a0a48496e80744112b97e496d4a486c4645a0c84a487646bd859b490047fdc21f363abdc0a0643ad165e4222ff779259b129370684c1060b1593d8b7fbc9dc87b97bc88260deda696c60246f07b16eba3bd5a9dd85445052f1331b14eccb1959753b0758415fc6b6064e6ff72b585e44f7c58dfcaec80e52e53b24daf49cdf722bbcdab53fc070f01bd04e43e93e45e75a49bf0c7809b8c395e81ae7d8f865153cbdf627e00f4129c8b4da508a4bb3837130f562413a84095af288dd516834b442cc4c850398f4bf8e3324ceb6eedd3c70c42901f4e64875ec00e8cc5312b9052c0e397311a61594ed658c118fcadf4604ffd22482b37eca19cb473a7d52bac194521195ba97fc38650946cafc2d12433b25985c9bebe42c6108a0aff19e956cb81ef2ce1f901bf15415806957fc8972143c78bc2efcc731ec1f88fc1126e107e5e86363dafe52b2fbe359d555b1286a2ee9d0acda6df813968552fa38f7ed56b46feb62ae8225d659f214dc117296d1a19040820a573eae8ec273ba8298f171174dbfc749fe54ef34516f3e34b83056f406aee6e0d2b607a1b01c702c610346022f6cb5db618c2b8210576e6561d1ea8d74bcb5b745c55ed15165aad7d5368e69e7d7b32a56914ab3d61a56811bc6e060b99656a03257e84a150728142740f06aa026b885716d96ce5346e246ab54b35f250fd1eea4c06b0c635c61ac790cfd0342e52763218f27e3297fe1d9c1db2e55d2e5c46522c33f1639c60c1dcf12f04b17ebbc37531ad315a750e94d3e9e2d1f92630b3db8b587104fc22916f20495ffa2271e6f5b9debf7f76aac82cf57e9dc14b0b05231b791fe55d6267487fe15f549cef15d9bb964d75fc58795190468253593ac3ed2b5eeae109449c88e9ca6e7298096f9c2b590e161f44b16b8ac766f23ef4e00e81bcc67eafe2a2150b4e84956632022755c38e239b291346642bd774b9e859d4f81e0f1d740d123ca8f856263580530e7b6743809470b13ee8c1108ce0a5afe2dd4ba4e8af3f9df91a0671b2f99b74d4e01ff33e9d329dc8931660ca8fdc0fd47e52905be5a5e5612e7b382145d809b816da928c7c91a51a64ea2994ec6b53d0134ec2f31563750299d34a26709707058293e6094855f310ccb2da4ccc11bfaf849c84ed4684844a61ae295a78655467f57d798c882b763b1721367a9e5d3c9d9a428b4da013499560a1b4fa40a58d74f851b46a7cb2f0f3e864ff23970d61f3f04220a1a24c1466cb21d0f55b8df3c0a17295253e050b03ee930cfbafb4e1126b5d91e1165452dbd3f7eb237c271f48a60946179389f851950ec7cfc3c8e7bb0f755b3b86f2253d2aaa463958a50e762c3f206ea2d2b92ed44ced9ab680944614c9351f1a7bf9c8ed29333845f28b45b647e05d5c96e492433439704808d4eed28a0adae64dd83b3d0239d662e8116eafcc0d475308ada479129539ae25e4bf87b979c37a149c411902a5d50c7d4864928914b9a077f5319ac59f9eb7e0647bf0078bbfc64125f807fbbc5d67c2fe6fd9fcb1d15d2eccf097366d6edef03806d4846e77b03ba4f84cf478c53b1091707533f62a1ccc7c1306f0030d143bbc0027186e606cc57047aac33bd5720d8554d3a096d3bbdecfcae978fefd5edb72abeedf4f294858fde9544a8cac7f7ccc4a68ec41fdb148ed7cea37da719cff5ef3d623eef3f8ff67b86f973df5e08ca7e84bdbc104b5bb468a2649b34b5b609217bcbbd037e0bc50bfc0b5e6a461b48a8e4863c89339238838486888a662741515aa2fd00f510519151ed0849a9ca2590d6fa39102c68a8855aa0c0928e9494248be63c6a89462e2db0cf59e7cf5145020a0a12121a1a9a44b3c80829c618638c924869098a521214a4a4186b4c9c255528602bb526ad8b7119aa4460512bc60939346751292a290d2d0d356d68688b91434343434343b3a81a81b5d6515212969c4c9249324926c9245afd01815a41ef50d4ce980e0a0a0a0a0a526a81024b3a52aba2a8ed983e9a3f73d6d20283fdad16081e81b505be057b0b6c6e7709bdd2250c2fd6d82e0f336732723cf6169a33219ec47dbcce99ca2513a8533d178229178d192c00d81b1ee7ace5361060000140c0011ee72ce606b0f1f2386735bff13867407cf638673f3c013e9c07fc3867457c87c739e3711d8f73a6739ac739c3f9cce39cd95cc688c7390372221ee7ecc78708e271ce769ef338670cf8cde39c09f9118f7386c47b3cce5990f7bc5b0076d1046b0d79bc37c4e67b9be5363a5bc6743175ce62f10031d62e319a524be8875813ce7689123f6cce94f8124cdcfe124ad824e4192004892016888d33d6737fd838633e2ecf8e8e8d33967373276179736d6c9cb123ee026c9cb11ed708f9226c9c31222e0f1b676c882b848d3316c4adb171c680b071c6686eee212c67ae0f36ce98ccedc1c619e3e1c6d83863f8ee707774d0cbcd32e9c6cd12caec66a994809be512026e964607b859d6e4119636ae148add2c870670b3240ac09d3100dc2c69f6de70b304b241ba248d3be3e6a8c4ba3946a3589bb18884ba2ddccd2e341af5adb3753e30c86923e61ebf78984e5d76112965371b310ef16624f127bbc59fe23f6d8c3d678c6deacfd81951208f6bc24c6a19aa561c699862ac0f724e006bb4218966b0c91d80319bb5720760c76863d662cc9c9d146df4bbfe2ce1f02e1fa3d2762a9c06153161daa973dc2665ca5249ed1663346852dcd909251e60feb34f6652844d4ced44dd18618d5136461bdb9c127fb69b7749bdf49ee5b0c93e7105ed649fb8824651749b37d1894db01a13096926cd59bd1b17a0ecd7f079ba45cbe6e5466717ebb7e949796ece5f7ae975e14c95b6f90de58a6130963a9331b205b70e2cdd3da3663d0a6fb5eb380e0d1dd765e064603a574ff554b95a6bed947200eb69a441354f8a1a16b1c785014241e7376bbde9de5c85d130ba3a5a21356c757a5ead9eb48c08fd2aa957505a56f12aa9cff5e9dc4ff3a3993f75d130cad99aa461d4ba4e8fb876d129358c56a099f9eed5d21f233a25db04fdc17356b07558cb7459d28f3de7bb7737cf23c191d2cfa9d4d195d08c3d01f3eca2524ab5c0f4738c9e794a4094facc28987e2a794af388f39494ea3c9ad754df754a7306829572d509552161faca99ec9c47a61a6862a14589526bc7e2c342fb6e4682bf7335008f30ed501b6a436d8df29452f7945ad67d2ae530a2443999b86ece8e3b7573769fb5ce30ea3c0a574f2908a07c576d6cc9ebba39bbae9ba69eb5bbe9d376af96ebba7abae964fa0403f494700d1c1540faab6a59556b1b71a07593ab260e85e2884055182daba99ca88ebc89427d3278722f0065b5f59d3575b5e34c5dad748cf63aabaaa99ca88e6000cee3b9a34f690dd3434131edabaacd18bd1454b595d2b461033a8042aaca9285eadbc7c3c39c0a346d2168e2529cc771298f0bc19b402c636d99c9647af8aa02afea40962c5868aab364a15201356c522d681011c0d8b0ba6101cb7f5fc0f228284cc01e16b0c084a93467130a943946cb5435804ff9dc424fa596a93eefa53e999494d4170412ac12022825cae6d66482a959b2889485c69205cb4fa44400597e40e9a92009423107d34f312585fb54366569ca730bf7274d75c6c08f4787421dfcc966fa7de1654d799db3d45352eee19473e1cd12a7f0f070ca8ddf4ccab7c334eea6d25c1a0298559c10c0cfda531f075ad7f9d812f7181a70a0c5966268d8246a08200e34ea4d8e06a0ca46a5dcb673f6c649676b80cef7e346bb224c511849ce27f334934cdd3bea793fd9ec598e05e0e9dd4d72bbc922c112165b8aa18186d419cd21ef893ce72aa23bf71edb6977b98bc5d6df2638436955c528e367c7d1d972e326d29d48d10645d23d5310243444546454fb011a222a32aa1d21292d35ed072848a8c8a876849404e507284868886849094a12526d812dd8613f5d4c0ddc86b6181ac3cd60c6d4c0ad066ee0169434a4542469357093924e4c7bce4e55c163a1b5008c4269b428941639ae7291abb1ab2c34962caec0b500ec88ba8d3b711c67e24e1cc799623d678a3576a6a626e8587e28cb0fee6aa034d33b13365dbab164c1924557398bbc5823abacc4c0bd4ac20dd2c0aef3a9d4878642a1685e8c92a60ed3a90ea4b5ac415a675dae22529feff11d85456a42c1e2036948a4e9b27ea67b35d5d7fba4bb4fb89e9fdfcc362948e9566766c77d32ddf57400520cd29880338ad62e9afaae72f5aebaab428a363816801d48dbb818ea0204b7ad0b2e86bce8bc004114ad617d10a4b5ac7231d445cb4ce0a97a26d3c954bbe062c88bea050d456b19477f68929649142da3681ecb4f46d275de61da747a776adaf419a4e1bef76abbae9a4ef59ea9eb4cefeca9d224422de31aab4c191c40c2301cc17842145cc303c0110c26086126006104e008069218d8c6a6cc1417693c447e7b7c9e37ca4fa561f1dde92f52bcf52a2f884ca454eae69927d2cd45e63579f774ee19c990d3cd3217a1328606f952ef10f9ee78bbb73b51ba520535ec76358fc88b1e9147e41135ec897ca528d47d82a1a0aaa038391680591544c4bd5305854aaaa06ddb36939411e511a9823c22a5704915d4b2134dc279aaa0ac9a367a9eb79d6e3a75a6eeae46d4b24e698e3197bcec114d1bbdd3e99491702793ed4c96fbc972f38743753faaa0aea35ad0245c9cb8c0d223aad63bdd74cebb973a55538d2d7d34a63b953e19eed29f14aab3bdc5eed49239ef112431f3ab2b241249431b2851a2448912254a9450254a942851a2440955a2448912254aa812254a9428a14a94285142952851429528a14a68df99d948ba6ee145194f07e0ecee39e79c4ba074094a4a54d224ad5603411a436b35ca2d817aa66f6609bdb161574824dd9c16fa607f25b62647371cb8181ae826db024ba0618b23184a10033f19f288e2c54156afeb8ae6ecf4c681265fa48f4ca67ba5dc368e93527647b8d61519e16601983ba44e8c96b968468291e825cccc4822ca23dae84683195556a9525ad55042a820d4162822940d56a56132b6a45262c970b164ac7cdeb5e2b2ad5894d8928cb39e554af3346c4602050d8386c1b2326c9c31d56cb5ae6ab95a1c8aab815c5d59b9b7b93a1665ba5cddba55a861dbe92743e3d3d6a0b6750b0e06603f06d52d88865ac669cc5832501d53a1cf346ee536d7b459ba2c0bad25ca6badacacdc655b6f3b5daaaf58169f964b7559682e1b715cb94ccf90359c460d35d440a386e7631a47f1881909b6210815140405c535d81c94554a33b2ca7a2bbdf276b5de5f69d1b43e67bb66cb75d5ec76cdb775b9deba9426e3723d7e362c6d367c3b1703b0b7281408c40d7a1555955ad658653392a952a241740b2a44b9a0414335a7d7759dd730dd52caeeeed33eedeeee1905f712942d3ce9eea4ee3ed7e7babb9528ddfa5c6da56df3c2ebba7eed9bbaa8ab35a8bb6394b2bbe79c94d2aeabfd6a329dfaa7ee8e51caee9e73524a6baddddddd92e9eeee5b430daa0c36ac1ba361db9252b4b10551540d5c1720eb325661b42c57bcad9ccc94ab94e6ec95f24c554b2fab52026d46c2cdb3649cf51e32ceba4798cc1f615d468fd7eb2289e99b5d6f5d8e05e00a885d2bad8e86cbc28a6878b56551d6fad66a759f4caba25897b1b2721a3468d0a01d8059a5a4526a198d6f578dd1b2956f572db56c7ebb2a8acb75391680aedc5f011fbf997e0b496be53093c6caeb371ca623931e32feba15aceb9a67fdf4d36fb856c8b8ae795d459ccefa1127d68f78bdfeba5d07a26a0072367434561e6db061e5e616b6e1ae6bc3fbb418809906754a7326e3dbd29cb1e6d2e6ba7df3540a1b4ebd5a1f524fddfad4eb2d4273aaaff387febbb9851b4c69f0b82d1414ab6451c3b628364c1fdba876fd3b7f7810673349c7b6cba219dbce0513b630c2d442084545455e70812ed473c051489cf24d26b5b4d08256e30ddbb6264fa058184b122ca9d59221e3dc2723e3dc39ef04512693aab73d4f2ef076ae0b60dfbbca555e486ad9fc691815a26c5e20c2b69f6c03cd58075d20ca3a0c11d64a1b6c9b3e4143f347c66cd3a7655b6e957cd2b318937a8721cab668a596cd1044d8f62d3597c0dc4b4b2d8b423bd9d9b409f4168e5f80c0025c1740d555ee3dcb22cf022a7602d9f933639beace202e802a2fd02cb600e6f993f2d624aa796a6164748464647484f4f920f176eea953b52d9fd5a1851671b41fd5a44d4bf2008da69ca6a050946ea877c0061d24019a451228d4ea265d3b02b65113ee93e9540ab6cdebab72910db716b69f80a99fbcbeb2480b60ea7650c3b69f6e03356cfb1240faa87a7f33a99feeaaf94eff3516e0dc3eb1004fdf7e1a868b7cd845f37dd7c521c16d34675d2b68444f2b9a854b8e98a25a10d12c84e66c5620c6b66f006f0f01de3e4f8037a1b96d5c16c02c8b66d16a954a8177957b44c67813e8ce9f86bd6f86b5d111f06dc39f6cee87446058a5faa91f4fb2555f70c00845dcea6659c31bcda287cabd7b44c6a85c17cc0f4546b5a2d4d1c90355a0381a7d91054e016baaa250e7b83a43c6b79a7133f7947b60ea29a919600a3863c6539f0182333e03ace05132be15e6ea51e0e91c16c09a92929292f2793a9d7eaa5565230e6dcd9322171085026d55790659ff56293df8bb99861ffd16d2d4f7d4bf2d95a2287ad529853ba9620d9f5057512c80a8300cc3f0f39309bb5158005128d465c51e113d8e3cebba89e98948a87bdf470486bff727f3218175ce64cc1119e33d750ada25e6930845953a5157ea1147f993e4a7e9bdce05ac4fb5cc75fa994012005de0fc01d202480679560acdd8f6f9244895ba31043780022669d9162d93dbd4026f48209d3f4524e6be7d35f4471a66a461dbea11d3b87450f51408965656d2a4cf1962085e55eaa397df8c6ca0530f20cd24b1614feeb45946f951a5e8672346a140abb219865514c454d504ac9bb411b55da3ff8aa417d2e8e49da63e9ad3e9cd2e1afaef1f3d3d15de0ca6dcd41b3c355659184ed9a293d1679b80617a140af5399331a8a39678f73e8fa64f4faf2ce2ae00729f407326bde8a239eb30eea4259b6c6fb5aa11de6411de382b80dc731b35d0f6ad6e5bd3f0564d954847809b4755a2400446f12463bad841c14d7f32fda13fb5ca008cf3024da009847b0275ac3fb930c07933e5c6e0cdc71a9995d405c9b8401ac80006925ca0023f14c8028b8ac1d6915c61c5912aa89862a97b4057a483401745274507c5134e38a08906101992995842091c3252483e383a008e60f8a00438c584383b21451c32ee69e0471581322c7d41090ba7941470cbf034f05c33f00c62e0b9856592e763798167189616f08ee69c593c1f0b9f098011a03d1f9f60f874c5730b3e19cd58df8ae77ae419ace2533cc38c50299e5ba2788641e0f9459e5b0f780631144b4f3c57279e41073cb79a787e039e61449e5bf090e716ec651813cf5fe2b9a5c43388bdc724b8cd0037550ddc5cc10cdc0cb6307073eb496ebebcc0cd30690159812b7fae77242920b39058481f15959c8094808cc045fd481a922b6e6eb1e24815544c61448aa5289620b054640984e2899bab1337830eb81fd11b703f222243a04061e283b2c4078505265180fba584be94d0f77d351cce487012f782e62c1412020a12d2409050068284301024942448e802477316560bdc5cc10adc0cb67ebc230a7847597847ded1cf9cad805046d5e7e60a4ee066b025819b5b8fc08af683e4e78a6b05cae808caa80a94111528a3295046b88f5a9a3315da47d462e4e616981437c31ec5cd6f41e0e61658e466f001a8a50ac5cd157ce266b0e5c4cdad3be0e6c39ab819d6809b5bfa1f94395351620dcd58bf85c8cd2db02137c39e6f7e8b899b5be01237834adc0ab68ec34d09c9502895124a09a584524229a1d4734bbf8b095be52a9f2b20950a4805a4025201a98054a7ab1a08ae6ae0aa06ae6ae0aa06ae6ae037155a0a2d8596424ba1a5d0529e5b3895a29e73b2ce3aeb9d8a529f353467a79616184c454945a9da7806599e5bac211cce1a8a3d1b0067d6501277c9f6a039bb793f85346749736680f75350e6ace5fdd4922a48a5429ab39df7554b73c6f33e1834673ee6ec0798129452346748bc9f82346742de4f596ac15c622d1e4524188e970f4002c9200180450150cdbc460a298504801452eae65632e2b9976c8fa3f20c3ae2cf93681631c04e217622613b886d20b67b6cffb0128a0f2b79ac1c9ab1f89d781dbbc48cc5e7d81f662c1ec7c2662cfec6ceda8cc5db1c11bf801e36ce981144d838633cec10718526ced838633e58191b67ac071b63228cddc1eeb0f13a6c9cb1d68b8d3386c3de70899f59597c0222027268b106b0b10037d7d5ea2c37b75627c0cd5f1d879b61abc76e3600cea72498cd2a23559210eed7b0194cca294229462949b87f9b43dacbda6057accbd66069d8969d616558564e21e5164a21c5259c53484438a79052363712ce29a46cc24038a7904e96b339c52ad998ea825c34b9038a36fa9e273f8f220e570d96771e451b31a6c4f8645249a931524badd4b04e25352cf5648ad13015ad612a9f86a5a2346cda79146d448e72dc6cc99d52291fb903d0a3e14cefaa89785a4fa2ea4d38cfcbdab038adab460ee9e423f6a494524a29b9bb64fb9c85484849211214a510692944ea682152f703c409017143401c1150119011508d3bc25d9b31285509dc965ab4ffc0805a681b11ad886644abd18e6848b4a4a2a5a28d56b4fd146d40455b50d1265434845b69c68c6a0d3c6a213d090605ab28cdda3c9ab314d28c75c441df520423fa504b080c4a21c15a0e6b1d6ca590c219ac805635159a4a918a9251175453489145802b664862574824734b62095ecb8cd1963cc500ab0bc058fb21e26022daa0a7a789b32c2390640626601ac180e97334c22c882e4289384163ccd1302a135b54788968839e4302389f2394d3d68c511a983b02f8c30f7346a49bf6cd1c0dc03e3de541ec493b9409d52da826d9936e5c574da925d20b32c56cf35eb7492fc6b912a23268d8aaa88936a11517738b864d538c0bb8325a512f1a365741d1c6bcea087327244e09604e259d524973a6aa15045bad1f064b25a5924c581554f19c9f48aaa31853ed7c77429a9ff328e2581df5e44c34ccddf3e61364ed74eeb226a1547ab35432c16657efb33246d6b8af39c904cc4929604e620173e752f6a6bef3e6136a2d5359396918f7ce4624ccc1c0668cbbcadecc18f7cefe3063dc3fdb3263dc3d1713ac266918b7bdca18ee7b1050ee1f170e063e7adce9cadaac75c6c07bbdb6a725a044289fac1d21612e883bc73d880bdaae04923fdc978850a0d80e9ebb9442883638598b36b8cf2880590e0db54cbae81f2031f81a47bb83a9599ffb4dcb52ce7da767cee6b9b7702a5cadd66aadd6eeadacc4b2c6bd561064b2b244f4f5f1f18ebacfe91fa5371d498c8b5e4a6f8fefdd3b24312976497fb30f03f7112d02f5ee477c37d9eeaa1f617af8eeaaab6eb221a6ae4da5726d9d756d8f31444c5da82a621a01746209ee1208fc99008e9fcced7ec474afbb473a1711aa1b116354d73b4a758f9c7c98c41f90610cdc44d5d69f09984cddad9837fd88eedfb5a2df3d65630c68259643b35610acdfb9d7562ae2182223236aae1d4b67e591acc598968671af17d6308efb3c02b91a4db4ee5494bc1ad4f7543c00e765b41e2d22c66cae22b86fcfe1e2968de0784408c727352ccac4d927f04c3b005fc0e10806182bc02d2c6435c59448437ab369c81967aa46c348d0dddd2d7334ac6b12a661ed427bf6612d2d8b6000c14908a634629d68589c8f7733d231c69814638c11c411083b58411cc3a3f76875c2d25234faaa13aafc9696aa13ba169a50a0f4579dd05d9dc05527cc6f56276c4b4bf4a3d509db579d30ab1324ee54d509d5b481c193b267e8b7cf19f918e3ca8cfc64a64a664e227c402c361f64b441f15431adacccd4a8df4c6b9e3e23e28c791e089e3a4f07dff7cd4cd437736b782a1fe8bc67aa5da73292195a712c43d82a54a174491d0f960b6263c382dcc5c686b9c0847c878d0ddbf11f3fded37320409e80e23b3c8087ebd89c219f440af8fc9401109f9f453c3e3fbd28c2a865b9479396659dcb5acb72ce574e5a968df8eb881546cb7210b7416a591ee23762b42c13719ca423f20fc72dcb307ff9ccb1613bbc0255a42320eec8c686c1fce5e53f601b1b864f848d0d23e243d8d8b0211e848d0d0be246d8d8b022cfb1b16139d7b1b1613a2fc2c68611390f1b1bd6c481b0b1610e0022f328e2f31da565d988cf4f5acbb2021e7ef6b8fc5cc0579ff988bf3e3312677d6606dce63389df7c66258ef3f929d4b2bcc4c897f8fce4a265190267222fc9f1285e9384f1286cfd8180ad3e4cd8ea64095b95b05d12b66380ed90b09d51b700dbf5b09d026c6784e58ae061b9269cd116bde3e741bde3c63d4237a139c361e4c6193b00be590549eeb8b90694de6164878eda0e239ff700cff5e5e6964b6d76b30bc6b19b161bd096e465379fde680d8b42971a365d3e5f7d5a36fb7cfd6919139faf495ab6c4e72b50cb767cbe0ab54cc7e7cbf17fb8594589c3dcdc4ae23bdcbc02732137d760c083541a1217e266169c2b6d87d7dcac03ce9526e43437bbe05c69413e73738e99cf774d5a46f3f9aed6b29acf774e5a26c40f9fef925ac6e3530107e241dcac12c487b8b935c489b879858803b9b94611efb91966c47fdcccd2e33e6ed681e766979d9b7374b49601f97ce7d3b29ecf773f2dfbf1f92e49cb7c7cf27ce27cbebe739d9b55749e73732be7456e5eb9f9036eae6173286e86b1fec4cd2cab3b71b30e0db8d925a6a33d4056e41070d232288e5af6c4e7b9a49635e0f39c52cb62eec41d70b38a03dec4cdad264ee4e615221f72738d21cf37c3f279b8998587f770b30e3d5ce6661799fb70730e8cc3deb05b50fc7cb81909f6e13f2c102bae6379aab88dc599e2d2beac141deeb1d2a6e74bf0dce5c70364111b9c9e9b6bfe43082a5c74a838721f56f4f8e0f9cc0a1a26ac9881c0cd3fde6305143e66acb0c2e6c7cd331dcd95a2ba5c29ea8c66e63f8efcb819c87d1cf9e1e33e4c6a6eaef9ec8810370b719a234c2c711f26333743e03f80dc0cc57dbc87e73a5450a103848a1e2a80f4dc8709cfcd33d7a182860a97d9030ea4c87bbe63c4c8ce7718e1d1b90f93278c38610487c7c8cecd435cc748123b708c50f19c2a76729c38ae020825aaf8c10137eb7ca78a26aac871e266fc1faa00abb0d1b9f9870e882b454de24a519300e287eb50a17333cf73a8d0c9b90f93206e0ee2495031c4cd431c082a2e163e4c9448e23e4c7eb8d901d7e1b9b989e77c07579cdbecb0e1d9e1d9b90f137cf30fdf01c46d8cecc04f9cc789effcc64a1b2470541c38f761d20022386e6c74e0c0b952804810b9b13172d61437305310c1802986dc6cf39b293e056b0a982918701f26363713d1d54ac46d8cd8dc8c7396111bd67d9814717311678011236e36e24818b958f830610012f76142c4cd436e8373733eeb3744ae1415a612a1e3751cf91b9c9bfb30e171338f1301733311d7a103e63e4c5e3737e038f26622bff9caae1670b3140f72c4cd0b8822c8cb57ab4b296e3ee2512ce0418244711f262f578aeee6d7258e87568a0e2fc951f1921c3d6e7ec9b18310f9550e993047b8438e979b77b8901c42eec344dedc43c744de87c91137f7b8902b455dc0cd42aa0c0e19e290e17d98f4b8790197c121e4e6231e04879020f761d2c3cd3d5cca3cfcea4ad1e1253c4471a5a83bd41e2f3c5c295078c98dd79502b5ba0f1305dcac80f7b871738fbf5c29408c850f93971deec324e6e698bf78b89987af0e332150e401503ce184039a6800912199092be44bd82057c20a791236c8196085dc25378e840d72ef263463f340eceb3d76f51f56de870dcf635fdfb1abeb58f91c1b1ec7be2ebdb1ab4b6dacbc1bcd86773bc20af105d89af7b03457809db911568817616b4e84a5390f3bf321ac10770bc2d6dc0d084b73b71fecccdd7cb0272c63392644e08b31700fb603e3a70931c03cd8198208d4ba80632c77011e285501e31b87c9f11d707c875d72e31e913137aec32ec9718f74cc8dbfd82538ee911973e3fa307199b3bb6dd1b019ca6c46828b28212f9f00bb4487eb6099b4bce5b6c81c5a1060a3681c3e879f15ad65397cbe3aa1b816ae661a5a2edf7279a3903c5a8e801b45e79083a5451ab73c7e332d6f39556a195d7aa651f09cae59c3f3f683e7966403dab438c0cd5b109e39009b86e3e30d370415a1c5d602587a840301586cc460031040006a588959acc404b012e31071cc4a0cb3b28607601b0bc0c627380096c3f2e8a80600aefd0d7636d2ac2ea034d9a489175ec840065d74c105175b6c81a5165ae0dc4a40ab1ee3f555784d485e005fb7976e2b352c5c3d7cbdee0c0c5f613e5edd569a1dc5a822d55e7faeac28e0f1ebdef044ab345b7d1a36efb2354905aa5ab46c0daa32ee3ceb4a596b73d65f98af40523d4ac25900a3518c55209ac5eab2eaa461b586d5560a402bf5183d038f68341a1631b3873020451b6118c288b00dc3b40743bbc0f3ad34a34cd43c9d3fcd9f0a337de63719e0793a5f81e6ac33aab439eb689d5167d4d1bca3177a854472802aa9a04427a5b4659fb6c058830a01e4a8cb8a8c3d670a8c36e46b8c4930e298f8c8abd115987d6705e836ffc39cf3447a84ec607aac355a36a4ef6ddc4a94859767c59796194f893295cb9fa28c259371f9547cd1a18b2f444c58cee7c6b2beb343fadd3d936512c52664f62c41e372decb31ef02a3a2212fa58c335a7688b07996f541c2e655ac10b1c74dc3e671d081c83c6ca6ccefe0bcf35efe74eef341ca1c7d10bf884680829a2c93ae45362c6f141bee6e8d9baa29487ac36a340184b9e06e71c9b1d3b2fc7ada94767777d3eeeeeea6ddb49b76d36eda4dbb6937eda6ddb49b76d36eda4dbb6937eda6ddb49b76d36eda4dbb6937eda6ddb49b76d36eda4dbb69b74aff84042fd6f0568eab0bc7d3882f951565f5b1c39494751d8e2a389e7634e22a5f62c4b8a2409c5570cb97d609255f564ca07cb941b5703fdd15f952e30443dd16f9c252003072ec01ee7713dc3fdd171d309d388bb0fa03dcef76e07e01220e59b4215f74d0894e6e8480fbfd1b9070c30daf23bc5e3618c1061b568e56565c4570b96a20420d35d018020d1a2d27add60c3066cc90f1850c192c21b0582a351595551056ab10086198f2839414b00908aa7ca052a57a904a7d3cf83e543442a1bc1d3cefb4e37432e930996a8e5abb970e07c76d37703fb6d06883ce228e3965114727e02d3a748ba55980f91985062fd69058ca78ab8ccf2d31c773b1fb5b5c5ab0ec2c67374b2d0ebc2131e6716500fb912291b2a516910063133220e128041c9b8c210aee8905c7ba8ccbdd7a55ac6765928cd3f6944bd7e527e3ba9dd142f303188833591463db2b106534061eb0400ff0b603bc05356c53491cc4591b79985b02238eb85d6555b6360c0428200398e5904c4a9d407bb2d9e2d3a9cdd6d3016831fd496565fa662427f05dd37d9bb09888c5a9c76f26e5ead7103db9981b4309845a167e9bf1ed3d44d4b254ca5ddfeecdb011872a0e6541905b7df533c21921a89aa19af1192a6ec65532eab742d9195c18866118726270d98853526dc510dea6c85802fe74f0a814caf5d461fa5b85299b6ac28ae1a74f26c564faaeb0314c505d48018b81e338295128ae0a34258e0b5728d487fabe9ffe7dffb85538c6c9641a234c85465f2c216523569d1ac72fba00056f9f45b349cf52538b96452124e94286dc685e6c29a2244f709e5ee0ed445b0ec52f9e80006f110b98e2ee8f86c3c009b0ea6138c3ef744aa152a93140d4e993094d26d4181cc7a5a417d24816d19e417376a016065445d5d7542a954a8501e45028140ac585e1b422640537889b5a222bb89bd23b7f68609ea77704c04ed14f2695e256f01150e5f51c985570a7deab1359c16d5556707b3fcd19771159c18df304c2dbdc543e43e55eb132e314cf98f119335aa5ef4cd2cd8101cc3249c6adf77e11b4f405ac7a0af8ed353c621a2b1b5ec5d54fc60ceeab7baa954bb552b95c3fdda552b9ee52d519323e555dad56ab55ad60c4292894e4944014773a9d4e37ab9e722f95724aa5a4649c2ee3a7cb48a57e3a5dc6659c52a8d4410eb412abc09412884a4949494941cd1f251055836dad709c0b288352d4a92db26195aa559749ad962abc0bc89d3859740cd61478d4bd938d62935e346c6b98913793b40c357fb622019f54f69cf3f1082871087e584cc412b13968d1c1a545269134496b5906715b2c3fbf7bde3601558cb9e20fc45f0b7fdfe3773311fbbdb3d2474ada67e58fa4edb48c88bd9137329f5dc2dd2b6c2a25653daadebba7166cba373900332cda4d5a8b55802a57933570844514bd4cc4580be4be50b7db8fb12c23702b005b2207608e49b8eb4f00c606b210061258410a9c2ab74e3915a7521d94a06a45758a55d745035e75d5419584c9fed79d93e7b86dbb9452ca95277670013dd4fbe341b1bc2c41783608221ad60dc32d3f99ed9c65d2c40a965dc771f78a95154c6917841044f9420449f00d1cbf00aac02a8a47b3de7c12204c6b18e7f3438897c46104cb4f2dc05c9f4c0d804b6ebc70d818f3aab50e8051c3b9e300389d346c3e36370086323c8e0defcd1f3c01659f01c7267e3236df79cefcc1ea3dabd58ab562ddac56b759d99e87ae70e621cf8e0eada33d210ce9147070ec8fcf78f17bbd5858d848d327637367a0b4919d64ddaeb6baf97c674403c71e6831c6ec0116606cd88fafec8dcd406c7e5d1f384170f0d4d4e4a0d19901f2d2f31e17213b663bc88c5a3dd75acd5f36d7ecb058ac2f31a293939363c4fe3c2607904aab3f3dcf95c6d58058ce886bd2b0c9a2b111efb0304c90bfb05818e665e71ecd0ecd0e0d0d0d0dcd5918e6856525a679d9d9a1d9d9d97909729a970d6d91c640726cc43336d2b070be13529bc3cc9c1c1ad64ece75eecde8cce8ccccdcf4d1cccccc3c8786b5c39aa81c2bf1cc8e0e4b274747e7dd27a3b3c3621de7393c5e67b1786e0384e735d665f397db3c8775d93cc6e47810eb625de7ace3b02ed6630c8e7b3dab7e026e1300431e2b2fcc09eb1839763ea9868127ed0218c3afacab26bc7ce8aae979f8f00ec979cf3fc002cbf1c4dcb8ce6a8991ef608dec60e5ce7572d4767456f263c12abc117659f8c1e16dbe923105a3265dad337232ab1878de7352d435c161ab938ed59a17c0ec19c91d56472bf2bc68d9756cc2bb3272983e8ed5635cdd1c1ee7392c0e7bc3c6180b6f73f9f910fee630338c62c3387706dee0dcd8585718dedc221b7e9d7e33af3fb1c3edb000765700c3998b8e130dcfef8882678e858227adeeb011ebb011bbd888671c166225eeaf0c990b03a9e624bcd5e70560ae355acd49184f228eb96df29ec668d8acc06af59304e8eb5cb0f3f8c9e01ca6756c704e18866168b30ac3300cedcda52582aa61d4a39a63ab1835e989ce8ead38b68e7173ab93ce05f3354950cb0080e7eb64d9b4aacdcd95450b693336bf0117cbe62bad86cdd35ab4974ab8516186c7e637130560ae35da4b45e5deb867639d08cf922ffac9bcee46d4b0996178e62b3b84080bd63911168cc3ba43743c163c64759c0fd1d1e901ec394bead81d9b91e09d7b376ef4e43ce7f2e3d1638784a14d4ef8282466fda6e72cdbf350a6c7a35ecb4bdc52d6ac2ecea5cd2ca10c652843f9040eb808eb12cfaf66c3acfbbafdd56c79e7abcf7ce6f193d1394c47ac6323ded1c1394cdb443c635fce6323be6127a04ac30ccf6fac2bfccbc3dfb0aef0d65a750205ccb59663c3aab9cecd12ebb06e765894f50aefea6665f38e13795de7f1ab09729ac334456d3b372e3ae48dbc01c2e3d5f3ee93b9b93310c8e32703e4423e756cc4422c10483090efb04484bcdef3ba0e97d7c3bf80dc228d6bee1021a7f9422167fdc6b26e96f8263c6d199087af2d2382c237cfb967639b40e1f039f19b096d726c96dc7878c3e6db476373b3f362e98436629625b2f39b0f888e4bc7298e7807105b03c4d65c7e323bf7e447b3f39aebc87a78ecbce6a84f46e7cec09ec74fa6c7e5f49b456c73170b0412dcf3999dd979cdddf90eabc3ce847f62a6a1e71669bc73e52723e43a41f32067d98873ac8d8df8659ba079907b13d541015f6e4d11ba087269741e3f991b51aef38e002857ab7086f2d2f84c716fd57ac7e6735dadfe3acd1f80e49589b0e0d575ee4d619934c1a23359a14e2d64ad585f9d758b481c9efb68e45743e4693e443ebc4ba698e234d755b3f3f03b0f6fee3990af6eee81571e8ecd12e3dc78ae389ec11ccf2d238719b1396c6e5830ce67eef1d82658b0fc8cec8ca47c0ecfcc0f8d27c72eb97123e7f2393ca71f0d0fcfe337c3739cc374adcdf0372a38bc4d7856f857e3f052e737d6c6e696cd4458a698c2c6181dab736bcdba429e9be3d8dcdbb14d6c4eb6da8e8d1888943dd549c77ae45fb2569dc486d16a3496bcb51b6e9012c8b72090469bf9300162031bf04898a63e0073a5d54ef31e084c3c84e7379f800a87ce6deeddd85cf1cdcd69cb707ef3faead2ae7e3cb43b7fd925378e6363c7c2db5c9bc3cc1bcb731bcbf31dab6373789e17992e9f8ecdc3f48de5b9ae707600aca199e9f942042bf07198c78f8809ac748e7333c5384e8e1a1676b423ab556839235969338fd3e6abcf10809d93ccd1e6cc880460ae9dd18ccdcfbcd2e6cc77b0b9196cb57094abadeb01ccf94bdeeb503e6c96d8c78f7b42fcb09d4fd7fd34ac33eaba263efe8376463e563e8efa687cf878fc6684b88fb905983b23aefbe93adaab3602ce8887e7343c3ccf2da386158900dcf9cec3d79defbc0602305c75b48e66d4d53a1d74b5ce68074d5c2d5d8dea00ece9f94cec893db2be6e8dc20f9a40a11edd5a4343adeb24129cf37ace33c537bff9fc84783de79ed7a8f7cd95362707f57dab7b26940b18deb4aab5b0439963b3c439395f3d53bc62dd0362a368bc7a7de5a465451a03f9649dd680bc56abfbfaeaaf5b446220577d34400ee4f19b01f29cd3ccf8c9e4dcab2817f0d65ac3ae0073add54a6b58fd890218461ec01c1ef2391f22bfba77fa7cb079f8957d6529844de3d7ebacaf6cce5f36e7dd279373591344c8ac0ba3438a38e47b788c2f5e5134c07c0f37adba17cbc35dec8ecf2cbe101bf320f6f51aabe35e3f016dbeba79fc64640ed31e0ff6e53baccbb19d3dc60af9cb06b90e5b73691b7b2e60fd99b91ae159c5286a9951cbb267849bb44c857f08e2f19379dd73018778fc6476dc9ba8483b05d33cd81d8fb1af4b1b3167c4e3e61d8f9977c88e21763c06ef78c4f8ab4f06df19b803ef48d9b1e3d6f8eb3b86bc2e3f1f84f57000bebee37246f75e8f58c7c34f46c79d812f1dafd7e347f3ba2c976bc219dd743519db3569d89437b733b2f9ca6bd2329bdbfdac2819c0f0f13467cbd329d6547863c3708e63612e848dd8878db8c7422181b0b97382e7792c14f2871e6cee9880e7756c2ef21d3b8580e9f03f6e4d11ba3810d673ac2b7cc4affbb011f7195cbe9ab195567d6e8de6ce5c9f86ddb03106e686ad4e9ec44f06e6ce1380f2d61f5ac3a61018cf05715b8c71b46d013f6f513027c471c10d715d70449c0c381bcf5b11cbf3e60501be3501c0dc9ce099b730f09c0278dec4c0736e4f62cf1b9419cc8ccd2de55395fa3c9d14f59dfa609a241e714938da9c35a7059e0538bee186daca8b1befc1f261b8da7018862ff96a19569a8a0acd8b1b966bd2b179cee80a60ee24a31c1e3f19041ca6ab937a546b371f390252a3d0e67069e327636323eb919436af3415159a8c29acc2e75a5bad6a752286c9a767dc912cfe600bf5084301da82172677f4032e00e15ca3e0599fe0f9950c63fc7cb0f92ba99f341419e0964b2e70cb139084fb49b8ba019e1386acc3cc97cd12bfbe13ea84396178730fc746b1e1f037b66bd21975b5dc19f9e0fca6d2708a6c3e84a7383cc5e175d5845f159118e7f5a3c139cee33783f357b8a313e6acac5cad24c69939cf15dfdce03cb7f0cd639cd5da8ccddf9cfb646e6a391704e5cd4536fcba018e73734b88d75b2eedea668ae5111ce67096cd36d73523718dbb68ecc3db870f9fc3bdd0b6dcf312701dec1124313a3cb6ecf51cbefacbc686ad6e2ed23801cfe1f41342de96cf8f47cb13702f7e344b6edc2b6e5c87cbc29be50d1b3b01b9a912259a7d9eca8016d11f9fa72eb48702a142d017ea83f2d01dbae33a3e4f6b1ee4f394e6423e4f6772ecb0954887ad4b2fb65372b11dd1cc724a343417327b4dcd83e8f8cece7978eec3c78588399006bcc789fff0e13a32cfe9e19387cfcf9ccf4f9dcfcf97fc03f56959dee167f599f15f9f1988b33e3390db7ce69edfe41f542888cf532e5a96857cc7e7e950cb7290bb7c9e762144a7e7a8a48cb6754d4d999a110010008000c315000028100c868442b1701a668ae4f30114001282a8466c4e1f08c4308721859041860880000000000004c220015fad9d7d7e628f96abfeb64388945d0d924a5ad73d7b35aa3f63cc96f36772b0c6694f260cf0e074ee9182d7bf461758fc740cb77305f81fa89e09b2d14a7cb1132d21dd0a1f0b748b1dcb0fe4dc8d019ca134bd08c1d96890a76ebcb4167a4c03c8515344011d3a368c614fa9696d3ca6305a3e7106cf96b49ad05a4ba53cbd70a65e06e9516138ad0eebafa44dd4a191462c07d3255008e1ffe030ec416fb002bcda2e13d8cff3f3e640ea69f04cc1e87d30404520b3c7da8fc89f8a932a51e07438fa2103534258e7c269ef2742c4db8813fad76f0d9674475f479c4d55e2a425c83012c2774577da6fb0989c83deb724ce07cbb66abab088e4da98dd77baad62859298fa50abc3cbef58e1f53749b315ea92a970fcda90a665e8c10177f0f825d40ce5a6ec68fc6dde36813f5f6cfc6823505002c42a0dc0bb717bc6c9f62435b2552e15fc54c1e9260719872e03aad7c35a30b1d1441e7943dc6a716dde540e8351665e19b6f42909d8d57bda28b9e22c996123a4c2217c28db56785f53bfec635501849bcc5d99555ac160b4edd5c441c4f60dfb66a87b1c7ab2ca468d37238bec727f574e745cee77d0f2998ed07dfef0e507934dad560bcbbd39edc23e8b38cf88e32a075acf4fc56fa783f60ca1a596039bb16771bf85e5b6e57fde7a739d257a934f432b82cdf66c540c84cd54938a032d0c5ba260a9566673b617e758dec831e61acdd21e83067a947f5eebdaaef9f4c91b30ff480d426436aa45a6f53bba9eb3b4fef8f61cd80475cf99d04ec5ffffe95ec876b12d3ac3ba7b49226f3a559d2e4f96778fc0485f606e7da1d1bb300e24493f9f2ac66b922e4c1adbf0bf215c7dd7fb30ee44ca4765b4aa29d94fa4737a7b3ada71f89e4f9632e56dd417b541064668ca51fd8ee29f06a58bbea302d22dd8fca3148c941a502db01a6a7af4003001abfc7f50ceb81a615f73a74b3cf3899e5f020c9d78effde20d990a8b09bf9bf5599534c94fc3f301bed5617f852a90c84f668b34a9ed987e90b316ccb72018ec8a207ffb134c13ce762dc670dbd038a4965f6fb2a8661e3015d7d34ea4a98534174c79b97f0dc263063a67b4b2024594927735dac684f049e737ceea1b40e519699034642015cf4b5b9e44616f5bcde9336f09261d21b7658d0dfa04e4f3771ce2d49641f780996381de87463ae89667e0807f5e1de77450945d3ac6efb15da9098c2fa02f9a9ee88817c91ef208a9060c42c18eb449059c2b4f02fe6e40f37e62dd5428d53e2155e03e9b6b624b462c3b4469963d01c52660de5e3b32284267a5c96ad49013ea73c026a927a95fc94c4ab2a77f36b6631fb7de0e6c5e3151350d087f61842cc57d4cf4b3ae944dd27e7be2231c4ea5e6e2fc90eeab81ce3175173bfe2a4bff2fecf105c1ae95ee2a7bb9fb1b9134c2462699eb1b39e49f862f9ece8101da6ebe9e7b5bb3a3ae6e76340743ae71502635ea52fe12a3e9bd76ac19474db01b5282771690659e9898c53662adc67163b7e0834cb27a5ffdbad7d61bb40b0e40167a6613fbdb0feb6a6130978f0e053cd2aa54a6ffcb8c813afa938093f04158a14f9f9497961ccce7ee27feeaf7d15a63cb2e4a11324be67c68483f8a0959f245431ac1747a4d93da9cb70e3052607bd7a6f38f9d7044ffae948ee9cf1e830575181dd0cb2b1e0bb71b26907808d260a87ff3ccb7b2fe818517b8c60bd84757eff4cbe7191e24a187e60c277b3b2b5c1c86c7906c39fd54dafa52c6feba54ce810c735eb020a00ffa7b8e29b24db39c34ea1337eb2c64e23ff467b4b77afbabda53832ce0773b279a6766c2be0f98b0e35a5f922c7b808985628e9e719c8d8c42c2b393f8d3305b39c1540d90ac6a5e2a1eeddb5bc0dcad35edcf793ce3b464ef94e9f238cf6ce730894877e1743387295c63f44ec4883c0ba656341eba2d6c50a6d5bb9a7e0485a1ac4cdbde6effe9b57c32694b3fc4461b4322f901b23dde851f60c5b3a3d2baa587b09d261ead035bf0085bb4a8294503d4b8105abf0309e491033710ef31f82200b908636300ef57dac55b14b1621b35e1a87dc518c8496bc1d7f99f72db1c399a1d94797e22862de44331902b1b3bdcd4e114d9a0ffb99921a00e5812cffc6183a8edb53848c79f087ad57e63d222a07d224a758f7e24c429a0516575dfe5487afd3e955a258f958ca4600103d95d5019a7c7210aa46c1818723249f95816ecf99de401f3c5adc40fb2ec653a0ccffd576fdb73db0c8d0573f2e8ecdcfe7d473248458411e59d5d6233f04ed0664fb560650a00c7758ba6a05e079323df5e0d10069e4e6b05349876a6efadcb4f151d3563b0b8c695cafe412f3e24881e7c6a64b06559b74e6b7636aeeb706571388261ce472c812f55a4e99284690ada87931afb7d7f82ca5690d5ad0761aa6830515e7ce439dcd2e85c26abbff4829d095513925468c11ed82f7a95273b25d055546e524ab4db202ae3ee9d94d99dba9942520137b681f3a84ef850c8dfe3f0aea400857463e00ec681927dbe74424725b9c872100041553333f3adb57733d2a3920f7b21472563b25c4797f6461963660c034982b938c2f529526a201d88f29f3fe4c9d1047591362ff16a7191d3912f1b41891371c1262c4fb9fdb46c26eca925f20c12d9533b337e010ed2807a17982d6ac4ec934b3b8c86dd9975716eb23aea6a17c588fbb605fa5d58649e1dda58021edbd10a0252709b672a0ddfeb16c1713895ecd30be135137516d73949814dc1fa9ad60a433ceaf6fc98c7e63138cfd9b35c88e3591e1ee41c0134f6311779e35c71e7789370c0090bed4adf4a95e467fc8c9d66a2b0ba04b3afcb6c9963ac79753084c852806477910baafa592c9c0e2a532641ce61caf5f0782eca6026db762e142f6d6058d4f5ee93fd1867e99d3be1c5f5fe98522ca51f2556225406535340053eb3205ca2c6dd48cf26b6aee6ef7ad498c84f497e1a75f2c6123c8e33d2a974ffc60b32a63b2dc1b3e30c17b1a373e0981f4f039991fcadb0151f2e22e53cca95c312efc3d55ebe6055bab4ba3dc4819c2bb511ac04894614b86a1511e2718b9cccf9511928a889ee5ad23313a7971d39c5a74c6ffefa88d6d4a8f971de7f1a6052e968a02fab82a7ebaf24d0ffa0fdda65508b52799cd6e40301bfc9032066c897d04c3201c514f33bf1fa0804b9a426dddd5e2507d011dc6433210a42f780f4dd9c52940a5a21e036c596291d2f349927e961bea5087bd6b95d2358957844cc5224c006d423ac825d83817d1363bb81bed030c2968291bcdd4b2d6d87a76c7925e2244ddbcbb2c2310c2485f73d6a02fa52a528963eff0360f79f1146f6fd1652ec9bf4b2afd8388d14a8a26b8cce6cebd3c80b438f51f085359ee5687a722215e4266a82bbc3a7d87b13cb4106d23be46b1df119f8d76e39cc6de9ddae9dc22edd9b0b55b61042340ac520ed42b2454cdf5416ebf492f9df29773d636e257278ea9d53232bb6e1081544129753c9da8348161c7620fcbafcdbdbc19c6350634e51fba0debeddeb01de131b7062362fdb2d12b1cb0925a527e14ed8d1c8115e3f3a00e03092d52ca7c16cfcf83b88e9eac5e9136a39385b1545ce60912ea415bcc8406ac1e0a9524515dd172803e3301d5190f72811c4940af735000ddaa21713a412d38e74bcc1ebf96e0b593feacb8abbbd729a283ad00a8c4def79b4e0cd3fab0a201d85a9a56a1662553fbca1c1a51818a06abfc938a440993a302966ccd06014b6f8f402d8aa59bfb6a179e2bfd04d0bb69c545ff34a3f6b9281d4afdb11c7c2b22df625283f0ee22f95a99418b9cc1c39b7658755866c07b4c7bc0d100c05e91d14fa097e08e3e635aa93393928c0818732fbf898944d9260b3e9ff5e5a403870255fa9b1e4bf94ab1aec68e3b9f8bf1cdf117a03592840556c8a06a684a61c3ca774018660f8d467c8c0d0564b00ad44cbbe736da0c6fa7b8c0c2e95025a498b286cd526734ad4184a5f92552c23916cc5b86080517ef83b122b7677d071d1e3f8a30e8febf3d65cdcb3aef56a23c85cb21027cdfbef13333380fe868232bce58a3c75e36eadbcceac41eeb0bf2de8d19ea8c69c50f3b956443f78dfdfd322b13407614abefc5d134f599c9c3643f829a189d00c9a8e5b3d380e60fa33e30670b00108ed5480fc2e14ce2ce53ea4f5f764119deb9e010a97f6bf7ca188155e44466d66e0cbf3fd72eda8bb999957347db89a93e470f0a77b53a56dc859b301dc1ae7f5fa6d8d112f7c65306853d1abd82d7d05280dfc35291ddffbcff882421f2a2cba79612ca2fb3b6b09138b57625fd9f41a6d589384412678dcaf1f5680c84a28ef910a88964a7f269c6845a7665f462102f8e2728fd471e265136f15ff41f04539952bc946559f179191b4d0c80109e2907c637b6ef70a3a0505687342c0c969df36e7157b8ada0faa15b3aa5ea588bab07f8d15fbaebb7bd049aab7e4b01ae0e3d939a2f340f62a330b40bebd98ef86ccaf42e877dea870fee19714dbb7e146609de7b7d2f3348ce4a6aead093d81d6cbee11a5f38d06b1d7db5ef20e418a1d22413efb811ac1a81eeb7dbc21d0e282eb59aa8f4b4fbc65e3a8a4c5d97bb2b4196d5f24ee61f9862d652d1c80adb0162a17bbae16051cbb6d27a5df3bcfdc4f9142d941f0f2a0807b03c8fc2c13778d5401f8698020f91b7c5d2e410161ed4a9d81ec3670db791ed73a4e71404e1295a9756fa68178fdfb50865ae2da7a84fdf72aa3adca5027e47ca806aba636b86205fd87702d2124b967fd142b21934c5e87092b86f18aba5e57018525625eccc0bb1cf88cbcc155313fc44f6b5f6036b1bd8490ac7818e32332bfa635aea7ac632cae40022561060cbfa68a909d70e192117392e722e7a8e2d79afdfbf32e3e12b4d2f2cb4601a0959401dd4437d10d1af6804fec144feac26758aa207ab637f2b5acc463430067fe2a2b4e94972868cda7118544d213adcf43bca6bb3bac8db59337d4e40ed0a3683a523a95a8568dd7772428e6ccb9d2260c13d319545e6406ec13bd02ec1df89a75a5db0436355dcdd37b7b753e8cceb46e3ddbd366587a79dd9a271121785f16ef9d79b2c4558a1dfa011b6c90728b115cf6e32af9b00b99dc86c0f164702e4143f3ed77ecc963b0ce684ffb3a62a6c70d892b0320d9c6433d59f04c00d1aa4b0dccaa1d7436e8e0902ca19d3618f83c57da95c0d014a4259f37272d5e429ec8a960ec30ab87f1c412948940ccf80ca2c3187dc5a29b9e9d54e6ed3a910f5df19d95175752fdfc3f0658c02a322446af4d393f96606d2b66e01770418987bc004b061e64464c2b84b72aff977216bc050640201fe59b8d16e161f9dedb09f925dc527e0e15a01e958c609d131769725395a5616f008557c3ff945ceeb1c91abc6c411a816b45a64274fd574949b1f5f1972c58d1bd946ec74b99e4ba0fc0afa466cdf2311792704ac3d125a7072de04fb220e87aafad7e1e4f8b4e7d9de7a9026bbdec553ebfac7564a15f7546d642e9ad32af6113e277650c4e4494c5ddf26555d3cf7d73f17fe21b85ca4a051cf0a95a74f0da3b74ef6204d8db139c4ed0983360b09da9e818392960a132f02cbd0a2575e0bf4223956f71b800c2f45fd0c5e7bf8027fbc4d807161d63081ad281c8acb0decabddb3bd053eacb1be0ab3118e9efdd46887fbdc0e3726ed564f6f955a649985f4f02cc83ab9381d2d27ad57029d441d0a3a43d1393436b56464377bb2540570e70fbea4e6b7d49c54e4e52ee23cf303c75003de47dd37e830ca09d8e63def55cf275a748e25331a344a31ea3d31941e3036ca03e870b158d216e94f1aa56a7593b782f37677592641a212f1cf5a60b38d865385be0f7873a691c9cb0c5db7776adf796f8fea76ad103ea4a225fe55cb7db22f276e81dcbbb70523c0f8f859b8e5106f7e618c58326be742af6c1a517cffdc76481942c86ec44d38f349eec383913fb5af40ad6aea1a17137ebfa4d23c440f9a858d69bc13b4e410f41ccdae3d5630826b88d2dcc9f0d4ed3d001e1ccaa449cad8e02900a18b4b70139d85996aeb0aa23aed9a1b2e06f2dd2d628ac985b44bce9bd2200395f41f0ca3390780fca630967404652d90c4b27420f5e197b4a55f03132ff5cdaf9c93e3e91f2c7488094a9ffc1700e3872dc9f423fb7300c33857e56b91e537dc36f0424c95bf4751f5e7a093ee25c708742d759ff98ee293d5bee3885080c304113223138cf7e6105b997ce56b0214b8f48ee317714fcb460620c82536f12de05979d235e6f5fc79045bb9d2244c1ba2e7edc0bca0862b62fc56036ef5b10d24e0d5b61450f2d70866c9fc7be6df7be0b7328171663666d32acdf9fd1f8f4f1e494368115745bdc9943245398c3c2dc308712e98b7e4b68394d4dce8bfa9963e3d5ac83cc54125a5c9b14dceff75985f897bfa618bd30cd5437c84f88a4212a11abcaccae5943377d5407737cd6182792f7a508ceb95d228de68b49fd59e397a128dfe0032780f2f61aa6b71ded96a7d95ac4e97d84314e35a3530c1037bf2f047e1dfb0cf571db172705cf3bf685b4001751cc2bcb64d2d5a4822e90565d6ca23d52182da569c9a322925cdf209c029f7167c22ac0cb95725c5c295516a992cd5e91b2098b6c4f4161d18323e7320543008216c2270242e7b6c91a1f448b7f6d2ea39a8fafe90df4dd906899828838c2b6e6785c94730d9ae329f231930d780fb0f90cc085ee4fec4ec0c3fca7a062a3782a6692659324d0d8153c068608a9ab03cc9f46a1f3db0e8d849114be82715c2660474817d1464cdc1005bc3780dd94a155a54594b963f2f9e6896af8d2178f5b3f31005fe2d03ed60ea400a76057e2632a6fff4faf3437d6f01f1099740c35318b8918edb62a87c82a9ad80fb49ad633200d1416fbd5a4a64104290e25cb187387b2f066feae7d9a134d376db0c17e7613f0f6708700eb5cb1ddd4575ace8114d521dfbb95afc47c3269017bd77697d5ed4517ed8af7bb39cf0a067e20dd681f43738741168c66a9979e6ffceeaea4866cd484635cf8bb2cea699abee7dfb1f156a1fb6c0adf04432be4cf7265c20b843f6be4b348ec777086307bc906177205fed1883e425fd0947c47ec5cf8774b8e02873563664951e44d8350c91c2cdf2972ba0f78e5ed5aa33c05a5e0c4d15fcd539f3706b7d787cd3bfea2defefd46dbfbeee2a5f67de7ab38fb4733092b26e7883ae359921bcf74ad986a809ae831d55dafd493408d02d759d880254baa4de0b1c0ae41e8adad7535034985cd6c3bd17a61042db7d508aa467210db9968501a000f75db54e78e6d3d0ded0c6cc047ef8d67be751c822fee161d4d4a76a1461c0bdcbf3ab21a877ae655a09db5c69c6d3b27a0cf6c3fbd2532aa1a4b076b58210bca22a193315aaaed33b53488213b8ab03e226cd98b75605733d143fa160175b329e30e4d610fedc678351125b9d22d2c67335e29207eecc12307a1b081db135c008646e2b39e6f36292d68fe64bd40124d17d7b3be3257cf2884bc7f3415fd77581e8afbd4c1e7cc9feb74f7c8f6ad86eae2b3633baa70040d5c97bc4196cc1a554863fa2c67ab35e7eaafef878c2c7c2bc5f147f3ab719bcc73dcd565f25a6992302cda28971b4a265b0ab529096a19f83236705619bcd7df570571e96619bbcb0f030709e2bf85c16de7521c942a76e043806a127f679f84f7619ced2caad0c84f6662fd65d25195e4e1f89e66c7b967cbadc264e23fdfb6357ba0dd1440537b55adb8720ef6980574e5e5cb641437b49c1542461e37bf7e5936b2a4c47ee56754d326aa12d6144bbe3942a35fb4e6f44843b26794ea629b6f0cd1ee6be630acdb2cdde88f9fc5a8f6944b4d20733a24d4de5b04dae6b450e8a185923ec0e9d2ee08b04be4792acc9b6974583280ced5497e1003367048c0fab1cff0c76e79c54546f8827e7cf8baa86958c0962a576cc4805275d3994eeb9fe60a70adf60479cd0b33f6e05ad6204e1a42adf34edd857068d040db5b0aa2f5812edb675970608b0932eaff8cd0e04cb171ab41b7f79196d8ffc04676a04fdfaa0cbd5b86a0726721c2020a3e3b05ce245f23eab9b16280ed241e89a0238964be648836513b22844634135510075cc0b8b4bdaee007cdc3451be856283be1027b509232c165e6ce75d9be9092967d34157e0be5f980d2e05f60896449d47806531fb05b1705e4c3574c5163f87f13ae038294e36998e8e70f4875cca6f0501c6621336c552448f59f1ff4835dd316c9ac20d65358e1be3cb2e8928ab5ba2443132d8b25ba9c3c1d58b95691a55dad2f189fde6e7a467a16ba76faced917c2193368ab2b3e8e8201b0001438496577516d0352bdbfe0a3d23d875419b905c8daa898b6dc4aabef9a91129f6e849ea0f5897425776962945c527d28fa664572081eccb30c01b709ce6d092fbcf2209b58beda70c3cb9cc9fdf01d2fd382681a5a9173c01d1f067a76ad2e99777d1b60f2b2abd0e124dc051e1d8ebf93196c6c00a3fbeefbc6bae6c3933a6499187a4b500fd24b625a01b13579721b2452db940540eb08b8ab2ab5d8dd63b8ea5b5dcf1a4c482f7623546d904c7902bf9df3aba639a7c0bb113c3e554c1a8cffc9554eac562f0b8d1402246b113c8c42706ef9f9f78a96bf1793da63111aed63c130a229fd140c9545efa3e56d34e4fd2210ba08a9121fd4b4517a820bfe90610b222b0c347bd3347e776c93e04667cf51bf8b708e9d5a3210128485fdee04aef43d4e40d4264735df45410e8a77f0911f56b1b28d9e13523c963f2265ae538472196f0b1c2c9b5fd77d0bbdbff3447e8031bf02d5814340b1f1ae130390b382ce958984db9ec3f55d0e27d4bbceb23878d9d4ce677f2413e5f6b0afe212921af6ccc47b2e0b70396fc36866b1adf715dfd896dddef7d65310d2f695360122228743e391c6e6ac55f1a88ba5dd389c536ae9a32effff0d6c6d16e40c20d7a32ec1c1377de59eb8b662671bae1cada01d9b9e832eff1ab33ba7e511cdd321b9264bd93e9cf317041cdf2c76b616d71399616f10079e83b681e21bf832d176c98ac1da5479a7757635af3789085821f5ce18b8879f53c0dccaad33203389d292278e3b8ca1803ed3a6e34f566967086473cc6d1515ace7b5fa863d34e96acac56f49dabee516cfe4bf2c792876029ab6dcd2c6341db4c7af82f8b890f0c9dbed301c1a9fb450d104f126a0358e0cea4d2ac2d59b94563709bfce20cbc0f9de176ac03271ae3376aef0c842a491a9f46b8a938425224c8366a0c28af3c2ee78a7446992eb5d47efee5540dead393df3513e3804020c3e9f704157fd9e078b62428acc2445cd667802903f37b290bff80b7ec31dd12a66e3a32556ce684489feaa39b0fabefd7ef1b8fe72e1882c652d6c28873ce2cd4e879da43e204f2fa75dafa5c2ed9488663a7e5b3e6ecf40227e726b8576927ecaf72f02665e3c21d3597cbd1e7dacb47b14ce162322af6b01f7e5baf6e6a6fe9160ea98a6299be9b2d6e675e942a3bdc863c1a95b4314e44698d621f690441493a607bae2230bf24c83e1c4966e075ac70db2308ae0b474c814ea3143478f94ca6abe359d3bfeb36eba69e57e5a251aaaffad2ec8d174308a7344ebc8a3eea6d32a76cc95e8317288c357c0220f7f01372847740a4e19899e12c6a65b5d7b7d1d9edad3f5e1888f7b016b0996e5bc87512bcae7ee016e8d9cc0710524c3d724c8275ba6e5d839bd3670736438606b089afca9c173e8b898a21f2ae084fc2c37a79b6b65660e90a513504d5ce7e6f13dcc40afc84506e3776f3e40566aa88e8fe7caf506777d1567c895c2eb22e532de1b9a6e41bf484fc62947e6988d9186738c4b75da32f45bb4a6c3ff385dcea8afce09dfe33def8c7375d5c3fc6ff4aa87fb51bd8453df9d33dec5bdeea3f15887700d37a4f150e952148c8068b8101b47ec09331f769243b820f5b0ef5cbcc91d4782befbe93b348d84f7812fb371cd4d663d4deb245d680e5293a47dc6bac8f3ef5a211edb7b62e9e342539afb083d778901614f348222330b06522768b3bc75bbd534371f635bfb182789911c289a1e3f72835c8b80a9fd1f3f846a7383eea717b4dfdafbe2272a9ec69dfe963009a81f6616c1e613d353ac049d81c39c740240e062641188fcdb6f249f7c968f0baeeb02940cd015fdb4437a0f1e941fd5a9c7c04d3faaf3f4e447d52f849e4146a0e97c9ce0040a084d096e84172b6b212723739ba46ec66955c88940153b6d2ea247ca4509ca0cb8b34aea142783e7fb3f2352ab2901427f7747f354d818ce67dff55f679dd2739e65feebdfe2b8be738c67feed9ece7ba7bf47dc6141e64242dcf0ea8abbc168a9ed979671a695f4ae043a4d6b63535103344432b76312b404a1fa23a39079c857d7b6b195c6c652a85bd11fc25236543eb21c60147363a97f7664e882a4e42e34be010fb203d069a907cf1cfeae0fa90cc9041f8aed0425f66ded57177daefdc4704cfeeccdfe9257402ac6693358b788997c2c8c4a2ae5fb72630466c00262a7756654b8b641d7fba2441f76efea284c5d728b4338fd9642d418fdb6a0a1c5c787be9d9c136c531be26140378b5ad6d02e025694c2938936b7b7f124b0428c838c974f91b2f712aae77c4c6f8933091a40d9f182557abb7a7c9a7c389ebe24902c33e9865dbc382c725b24d63247b4365163222e6596459a2afaf34c744694ebe32c1f483de87f7a3e0ccd01ec45ce15bf5790ee5660f4fe053326eb9e0fbc4f9a65b00f4414d1404515ab8af1c4e733e91735ec17cb1c7126af232e0ea136823934a3b5cb69dbb5eb107ae37ae9552c31cffea37337581e64507c5be4450edce0ad12abbb79854ce60056a19c00e80233e66a9482ea96a208973e6a33d4ebb9595b1847374cffe084a4a4a3b8dc6c4bc283fca7caca4f501c799ef9edc5a3a53ec5325e7cc76080f27844d1caba6df3216679276b4b430ba35c68b3e02b12a7b79ee6749ac298dea70fb8ab7bd99c253ba790b89841a215fdd38438ec8d9ec9e73b9c3286956f040cfff18f7f2accfc51efad56ccc344a94e8c9019448107ff6328f85c3c6f817698f4a184e53b10c2700290c0b04a236afc6c30779fc6e9899d33711e492efdce3f7a586ecc24f38bebb38ec8ab5f0b66b7635fad755f0d5c85bc0b3784865d7082ca777049ce5264c99e0fa52df1fcb1295fd43745735ab10bc7f7c8715d80effa3fd1ce6ce3a1b645382a6b0e84338b0bc512175d1567277abc7302ddf03454dcaf44f8097e9a82159f815672553764a4c500f297c76e01da26714e351a81b9316343f8f95483354b2a54f5c21308edbc0997044f5361d7532ab9f4ad76e0a4fe5df1c7129535f28214868ac85a28307d1857b201a2d67bcf66222d7e7c06baa8b18554615349b1e266f281c143ff6f920d928626380ab4946be05aad6f063dcd3de117a262d5aaa715db6fac46d5aba95c1897012a25c491b6a4f46bf3e50b5d23e97cfb4caa8f2fbee405eaab2c3f1396a2b5f269abe8d7ffc1b5a9f37a01a177c24ac615d7f9bdfa3687175d47eb45e7e07765fe7080bce2f845afec17ff1bd77ce8af34c125d7f5775afd6a21ecfcf148a53c55a374568396e9acca6f84f4faffa951fd615f54f95b9a57170dde60cc106f1480dc00909bfc974f5f41260df020423ab06a4bfc0776b8b5b023b6ce3da8b2f183b847ad1d4651e67b2ed58453499426c420442564b88b3f1b6cfa9bee218c9821b8e77715c97bdc24e09d4c60b9bb45e01a7a886149386aa0092fda4860601c16bb1033ffc8fc28d204135ce0448da6e75930d7af9dead881d828da7ce58623e897207c1cecbcef69c3ed5acd42f960837b3377e8a550dd3c2c68caf07265c8b9d24e729a5f131ba3dfed7dfef5ad09243a32b241ad7efde6c0f2d4f3a2e7e8eb5fe1643bfacfca440b3a6963269c1d3faf2fb4de4bb8b40a2c7d8d084abd5e4fe1cfd18b1394e0c06ede6b0af23931c6344ab0a9afebfd25a02cbad4c2939bb103ede5f646d43070b0e6038545a88fd099823b39136ed60fd0fd8d95fe1d91a305e9b168d7b6ced29c99f413c7fa789b88be87939fa00cb5195e7357a120c45cc519ef8729be74c4ce4785622fe6c36466625653b74922930715f2832dd5038f3eb3042232374c06ca76b5d89abdaf3e2126a6f8bbe35e1fc86dad7b370a0dfca46b235cba69892714bee46c3244d780532ab1f1cb52fee406a764e60c21b3bdd3d09770668cd4442f400ddc2f3f1e67f1c33dc924c1cea822619b823f1c1155f2e986547ba085fea2858098b11a82fcb5aaf9065f5a5ca7d8a838a9a1f7d16da0c379fe5b12cd7e08dd06832e578436e33e329e2cab27e50709f5ea4a670ae065cbbe2b1afccd0a5c321bf023d37da8f448a114aa7f6b16d2b24cbb6b96372e5e2b5ce4b7354c7484f2b6a7ebd8d216871e1bd869e7811d8329a558dae9f1988b8ace9409c296a2ff46d70a380595c02aa6b3938181d16aa760eeaabc8467d6f0bdca01b23f1ff5f4b69cb423f8e129500b5abaeae94c6cb2d3d0c7e1c47b284e40d9df902633848097ff4c858e01d0d1cb15e6cfa4626a69ee9e8bcd8417cd50222b9855e9b1b3fe74e16d1d4849bf6f8f0829b40a9e128f800daeb714151c797c93fa950829ba5dec17f1f31c88026e98461eb6133313a49092f2a0ff9b877ea42ae004f5b94daf65f3aa0ccd1803b86eb2c96b25efac86134f823c492a98b74ca4610d1d73524754ade68f61e0119ae4cfbac9d71a0ed6824d15bb35ac927068636865583a370eb79ce5608fcdaab5b91214b0d99805240fbe174bb82411765e89b0f465fe3d53424bd8956eaedc1ac6de7ebf1eaf10afd8c4a033aeebd37c1b5d9dac8fdf315288a39d3a492e053f6ef0a1bf517b0fc4516a5d7aa6957566959ed79a310d59c438703db2f17643aa5675402b3245f9c75642369fb2f4e3dedfe53cf0f23bef430d5d68a3a395d6abd771d1935933befb3de9f56bef04ce6e6c1d955030a08d3e9987fe742e1b79690684033bd78a4e727f0d105e7d9e9a1ccef0c14453a0b7145e834d04da6c2bd5eb2f57ae0037425587e405549cf3a81def0b6b044333b763c64faec6bda0cf59260754d02b5ae0e7f6ba36906a0b0235d7501c1701008a34374bfa514dcdff51095e113dc9249ce6009908c61b339c890bfcfbf748411b757dc604651e4dccb4755f05c20a67c88dc505979b7426a5b9c21572e370705aeb040b399e7fd0f49b2962c878b40ac177da337967ad421ef5fc337aec92e0e55b79362221cc4c44d0ffca2b73e84deb28b5e3351ce184599838236e40663d4135fc782b71283d78279cd541626765000a6529e883fd9fb651ce07caaf895cd4461b0338b1421fbd3e95143e3cd652db8d9cacc251fbb2b88076bd9a9e80686f2cd110249e348310b0a89e73b20303e50afabcc384a875780f014796625156886d27eb48fa8a7ceb97ca63c7b1f8f783633e5dfe679271eece1e1513a1e29a9ed75c05dc60ed30665aec1700f6c196b70e7efdb5b444aef9496c69a907b6205d7732884e2cedef6f620a0a6732c2503f333eb2fbffa6d031bd71530991c64dfee341ec938e130aa663bb61082e5eeb12ff89773411beb8f99255cb1bef627b37b25184b9b4d3181a68474a2f5d8f433198c1acecf6fd902fd3cf4074924aa2904b688ce1b0d71189631b81b93068672387e96aefe3c641cc85bd16fed455c3f3520b253a6d8eb98b7c9130e7221acd2510903fedbca21e26f0b284a49ce32085c7c58ec6756ba25f858e785c6ba25f22497c77a47b896cd4ecb71126c564a394211ac7b567d05ed0842bb8b71f57bb27ab86040e6f5b96cac8a6d103e6572f7908275189e92afe86a582c655d869a011fd4da4d88f5bbce2239bf7c0a1d6e0ba024aa39a5840c5a497c0849e253228d61c85bd9302024b9b6e01ca903ce9b74f85cc63ef73261934f6598b5cc36ae2cadac459b21562de4b7970184c8b17c5416312cd02ddda6955e1611d02beb9b34d58c9a2e752ea8fd17ba4b8f94d4d78ce7df13a468c0f30791765321410138d3dff911648d0ef877fd61f529e9eb4939d3453f3022f0b69faf8e8d8c95cf5dafc38775cb1bf05ab1ffe9c2ce983cf3953840e4e9359fd1b9ab22de58db5ab85f033f38e96c197f312e4047e60d88270d0a95b6e81ca6b7a4a0f356bbba5a9be355f70f8286ecdd82fa6349b3e34560bf4b3e963778b12818b219a10fd5b887f88235bc3b1026c74bf5e54728db490f464b3600ddceb97db6f686fa3b638ab17201b8470e380ea21cf255ea0e0162c695cb10907d267ab4d68fe0fb6eb1dc15832287d8c3f7f5d96228c6e9d98581995e3fa9b11b5c2322dbb05ddc357aa85ca7f9481e19372a62897c656cbca80ba7025cb844bd54579985e7e3230faaf3405eb95116e2fafcd0c439aec7fce0b13deb63e1c0c04514f8a989394c360e64dcb17074e4f74f3907608ad24c9c8f6c9a194e827c910c19acdbc6ecf90aded49832fc5030eb07321b7db0697a9be36a1aefa901d3d2514268e290bf993f6289370a4f0da8a514eb9af931fa36604bf66a7586657a3bc6b931e39796718e368385a0e53e76e3ebdf925b89c1b6d8aa787dda2716793fc514feb538acc9ab244cec5cde8079ff3ba61c02eee826416a6d5a74464d40504b64647624b97f9bbe94323a029b33d6e007c139be5c693977a14385c64b079ed24c5ee81dd4b02e3c059def6c4bb51302738f5898ba8a24ed2b3a988e60f751b6008a915729bc651ca12c4e73ad52206a492997ee7f74420892c54fed485f31c06ebc5832ae625ee5f867392aa972de927eab996dae51043542c61b47193dbfc90d646c278298fae0ccf5dd0e7c2a1452f258e0beb786e42cec322e24b820730fd0b3b8634772547851a36d67775344a602aaeeef7f0b20e9d452b3107369ab7d1022a949e02b6d667ec33091eeaec0adb2542f424d88b55ac8fe1d865da570fef928dc32bde63fe4075c50a05800284f66bd9609a1ed802659811415b6e1e4e8878875846ae1766f1d5fdba5b2f5878f6c0268fdd28046ae98cc61e64d1b84361e95f22953e5fceec6aab2aa981bc05bc1f0c0b0c36403eadc86306ea0ddc8a5b5f1147298c23b1a2f15a09a07321d1de671d6f63a1c8ea785cfe2cd191086d0bc69ee247ba57b9e2c6d3c82ec19f9ed08d66da34f2c031817957379f810f6edb6a2a6dde5ef830740143bb77156fd3d224c71585594d8435c41c734c1b4f160c124e4708997e9577ba61cc837cd5230944d8c3d2159deabb75ec28cf51f771546e0e38d14d231e3b3cb8321284f20b555fbd15d089f4f345806cd7c0674106c9e85563ce0b8ac71a6acb326ca65744f9cec568ea31dcba799170736888c0b292c034c80422f0214ab3339cf7a51700deb900e92a7818c5f78a4e492243241e3aa4658dbf855bb8cc057be2b8a9d3aeb6a7be576912d828d755237ad7ca8bf2fa35aaa249288d33476ee73661d3136c0f19b52cd7ab41b9b69d22d4ddf196cd8136660d856c47b2a6560e815a8b3af9b98fb25f5a4db59a90e76100af256201950dd368c2833bbd62ba90c2a0b754462d0f74b66ec296f360cd3c9d1303db0d7fbce93539c1b2ef325036537ac83c3b48b9cc991f433db1c0d37422cdb4e0c31a70750af6085083e59b1dc6ed696bdf89ec939d76cc8311cf4c4b345954f1a0d36118178490bea1f2d3a625c96f9c6c49138e6d0309b7cb6fa784f0d3943d48441ccb2c1107eee1891e30ffa3e75745ec5c2492dfe8e87870a9773f9b1a5180440ec8fce8580fce0684c1a732767846d8384a81ffc510a349ba8235012fe3df18215d31c1e0f5f9bd7152ac7ee6600dcbce33898cc84845e94f7fbe4c101dfbc800dc7bac4bf4b7962c1a0724319048ff5b56b7655ce8531a1ee5f9b18412dc2336c3d87710c8fe4b465ff37ae2d27c567e00d7ab3874f56c694071f31624dfcce632be308c9f11b6190c95ab1769a4dc1d51dc784594096d4ed59248041b24828f4b088238cdc40703d01c6e79fa7a8021ac7147b0af56dc26216473064d990951b047fdc7555ad56ad07f1ae85a7f0f7d1dec2bd38e2be6679494e11b081de2bf5d4190ae1317655ca8f2913a6ca6d4bb0854dd5217886b1d4b0ad3c24080260d419c0877d88382d5afeb2faac8bcb8a90562b42bc22d94806d4364cc973f3e120be405da20fcb10abb8ad4825a7b749c8dc9cb44b0ca6d8fe0eaa23755b4a6a294f6ab28531080a9c9a25551c0c702442f9dd5cf3b7014cf796887308770bef06072701226e56e1cd28ce132c3c14299cc50b1e096414b1950f55aaaa72a42b1604274aa8b21dd742b6e584953fcc2493f9429212c8c1b82f9d399e72058ac1d1d7e40e4f164ae0762570f143bf0653e979c03b6ede73dafb8fd31d2a60aa162d66ad0a57511124a028225661ca0bd948f41dca14df47e5a1aef90ac71910663c406aea806b081ce3c00d15d0371c5bb25e69da0b43d360de89673961cfe92b93185fb8a963fd97ec63b10b7a2b2a969e64bc556d88901802dd271bee3f0f5f5d53c596bb1a4347af43a0698e7d79f61616398ca136435bf545eaa2b85a4b2d86165f485a9173b6c2476f44b8e4ec9f92d37dbd26673b1c87c2058711c1886c6132ed39be250465e98296074975edc8e0091067bd5a203bcb470d8598f2996f6256063a93389a9bd6ae0f0a8c8539c6930191d9d2822209f5a9f50bd3d7033ad200dfbabfe3999f2c46c760ec5e54a51c0ca983063505e9d072244753124e502b9931dd55fe987df7c8da732671af23f4b9c1ee17f30875cfa9617d5a56faeadec30f0e85d965b51b132bf83c8420dd5635139c9b49a0b7d540e2263bc2fc9435f57d4946d9ddf2179751dedfdd4656dad7351363132809989702eec2c5ddd6aca6b6f3f6d70099228ea52b805d70ff97a06bd2ff8f0c96e045c686dd098f3eb787f87718fbd8870616a138ed38ec255a95b61c3c2ade38ed131dc62741ca5e120eabeaf9c7648fbbd3359eea9f1f0b3cf2da4fb817800f020faea772ed4cb1250e9d7f54b7b14e83dc919caf086ea0b00a5a239992881762f41a87ab0f73b88530efd1ccaab93698203eeb52313f20440242a6292608ef826aeb60d49e2e6b11fc6122facfb5531714884bfa513d7b2bdff76b438c20c51ec7e6634554d9bb30e57b7621105f482a21105f60e008fce0e0a5c6d92dca4fc6a59c05db0ed71789e37827436c2bbd0c937cf3a01bd8e589a6e3ce354e1baadf7dffd520514f52e279e9d8f7c36cfd5b79e7d96faefec167489aebeaf6d16d397335d7d72b03f6423ec3f7e280afb49aa64f486fd768f0ffb47aa0ffb8f12bd1ff69393057d2ec3f4fd839c0716793c1afdec572957f5d91f041803b8d8a0fa1f6e7fcb454a235ffbed511f816a22806c647afe12fc48a6e9e96a9629c35fff00acd5eba19e8c57321debe63399a6f85b359d6e56a09333a90ca05095357d42accc36cdc1eea912786b415dfa7604e9e9b8eb1733db4e0c4a8fee20141b8c52e4083b59754b641c421f271c75268c5c96f038f9ca9976e09437f893a53b0686987fe735d366316fc0b59a333acbb4d28c69ac048197694a66a053d81c27d17cbceb5558fcb21a120245a66602a8f98fdbf73dc2e41e19e1c8dff76d1d45cecf55864435cf67612767a406fe478f4e90f3ff0e80ae5f87ce3ffbc8ec7a2daf457eeeaa15f4e2007f4a331470d5a94a461301d15f0e73c981cebc92ce3ff3179c7f605255d1ac446d1989fdf4ccbab15357168a2410997dad54aed6b127dd4c45b3d7ea28a1b48bc0c2784de99fd3c6a5b4459779ac6e3ba76a2f9455818914db5e3358873204a44b2c1f72044b9555df46c2672cfce9a2531c31cb8004b476e89507e29b7c139ec59f944971e0f6ff4af27c38b5f97dfc52ef52e0ff9a29740a55ab1b9b3c49101e7f456a8ab564f838103ad0fd0f7cf293a396ff3058ff9247d25cda7da677e1ad3a4b0e8ff23312a8a2b39fb65dc189fcc0230958c3d4c1bb42889ab5ce166a74eb0a08b3d0d47e4a9ac6a356accf0beae2e4f53a0282f363e049316d5d3f5f2cdc3f2089deff1bbbd590ea7b5be19002ed1833a79a984d2698bc6e5f2600c1be6f50bf6918afae81b0d73cc2641ac8c1ca0cb3b7793702bbd2668ab7a643751d8da868fe157d51e009371ebdd2f51c973fda31007e6b30de78fb4fde4cb2bc68a6ee30450bd1cde49b8fd5f6f3dd773e454b3711ebef52b412997b351f1251a910f946d95d6296504f8f5ead303369900688877733e07406673a961bdd5869f8c0e1495447648d17f2f7e18a6b712e1313799b1ac8cdfc4416fd898f6075514f8b5eb56d8421612775765fcc29d43f48b13425d8fb5be784f70fed537e14a526955a7dd591ee5576fe43412141de67875a371c43551e4732244ccf08b6d43373b781daeb892632f7bec6ed8d160f8e5edd9f68132a7477a703ab186e80ab226764f1aad84b003325a2e4551537edcbb96c8b0caa6262bb8d17c9764a550c25ba0a2507be55f12cb1e0144ed227807855acb07156e0f07980a44e06d888d88e5f706a241533e70f2af6e719caabbf7af0221bf8c897249ed1b1d2c8777070364ce5a2eec24c66c87221534148ea39a17e7ccb7ea050a9f4f07b8624adb1633a6d7379795e9fa0c4220ed8930441946775d0bd85c4b77d02b3203c71a2e3a60acfc00a1ab6cc81fd001643bb8107b416766add0f0eed8b4f990d08a0a8e9706e72e15190160230ec03b73f78832856ba0c714feeda5640f99381ae9c753b453f34a77c4ae005c276b2bfa05c733ede55ff33d70fe86d1a7ee5a2a8362f22da893042614440d25cf472cc429baadb4335612f0d10fcea3d50df571dd9a124a72beb7c34b4304c0825c223d4ee8a7c2d63e6c4d31cc468134447f4d08f8afc2dba23978ed553c6b322d1778b51be5b30e3e7c5a23f89b9bf5fec61c49a1fd9aff49b5cb8779b00e6f77742a5b4eef6db181c72ce9a773ecc1bd73d1751c1ac8f1466b9971c09f969c398ceb080d081a74c2f525f8f0d9fe9e0815988a8af531ea7f32160b722e4a571b1ff89f771352cb711c667a6839c79d4e0c4bdba94c970b82ba187065c67a5f8ea9a83e6b9b7c555500a8cf5d169e23f7dc84ac5ed741dd713b3bb5f257849612fd88a1607400d5aec023ae1f0772016ed7fe1f005d010c6f394f5dc31869ed454466077a97016e02a4034e51c9ec5eb5af127c1103b68447bcb42d6764d03e149cc14503ebe9f12cb01586f28e1f9127545a8497fd4265a5eedc96c4a314be8060d9642b08bfe0cd37a2f5f51d873707f68bc25db064de268cac7b9974762fe3e403c19c1f1559e12e31a26c5aaaab0071aae6309e20579851a74fe47e57a83d4ab29e91e12799b3c87b84ab523315521a97b8c913f5f345728964bdb7175bf481f1b9b0e27ce44b935c2e8797aaa8e93f45e362280b3553738d2204081e5355e1021f0e622e9dab049a1a0b082ab95a1ad501c51c6c2f8b7efc24529939da1594ee292b5a10615039f517232a0c592989d5e0f5c3d5c4c1f03f143159054d0b10e72d4877c07a0c904128e63d3bdaefb9f94681a4c123f314eb4689de2e302de501b874c4b1a4ee0bfef6621eeed8b4036aa4190730b2cc7e8afc71c9e1107fff58cbfe96ad479ff7aaa123210fb4437929169e292fc91b807875ea376a5720b3ee932c75b3d4d722d691a327675def79f85e28fc0aaa1a38a5a80d85964549a8718993a1dfc8ea672dd308f53f754211049ea90533090dfa6a80ed0ff723d0c0ed090fb1ea25f3f3f2f72cca36065d372ff6371753417b238a88c019a35296d4f8cb1b3712a875f9a55526f4fee2aa7196ed426cfc07e6bfd4537ba4e054f1f308bcdea1d0988170693213cbbb459ed7f9c94f093a2392bf0b482840582f0fa1813977b798e84659f242f79c6facfbdbc13304474d36bf0d28cc6e040191350c24188839ed9b136c48626c0c5a92ccaa5adca100c8800d29a50dd1efd50ba8eb1d1bcb95ed2ed09afaf972dc730a10926193f18586c8cf9f3a99e66bba9d48b7aa72a4bc0ff53c2b9ef364b17195d7c6f31fff6421de02eea006f464d6eef4b4d4071678f2405ab58bca687e9bebbb2e7068d306fdfd9ce991afb7300495a2f41586a3cfa6308b89fc23131825f42a62c8bebef915f6e1b18e306f7aa9b9ec51bafc7370385840c81db73928bcba672444d531e4c9f1058d174573fa07b07ba7affe79eadb59bf814711397610884de26bb7fabddec348b221e03463029f1a8fcf2e8100e4e23e6ecb03907201fc03e0cfcc6bea4421e7d22f77ab48c2b924d089e5df47478b8d763ec559967daf1afc389afca42ca08f6f03495eee5a91e6c7186240a3943ff425f7664e9c46aaeb4bf78ac2eb2328818bc78064eba5e43d28aa31e3a29ffa34d08949f5e491dcf53344b389b0efea1580a4bc208eb6e61fb0e4e952203b050067c709136cf760e194a7f479ccab9beff50e4652ff83dfee70e7480dea933e8883221fe48898bbc21e0855a36d5eedd3cfb475c5f3310206528da92cf0fef3610364f1c810e2b83505055044684df7f8b88480f3b29765146d9ddc34f44adf8c131e36f912f4f74ccb10ec588841e65de68166f36edd7feacf6cbad11937e22062e61d187a55c8623fd448264fbbf22ac9491abb269026975069aa74d858c3a703d16fc36d1e06a8b45430b438988837879cb36dcf20c0e2a84aab7075a719be5df02b2f012fdd863ddc61eab47f2df62f9aed038fa2532695d3e537e1401d0f1af3cd790a5681a0b276e746e49b69dc42efd6f135818e6a0f92106ba117317b37d92720e7c33f73de012f7ba6f003fb8aed189d9cfbc277ace3b1274d593c872721e3242c4f8973faca244a50f0eff55c203ea4ef21ca19df797447d5adf4c1d2e2e6944d0f6d9f69cc4a4f560927e921028499b44ef11ec0df22132c324eb1ef4aa8abdcbb04962e92631c42487c279edba6377e1c2244a8c2e484c422c0a0ad0769884e072beb606df3eff435476cae3a866f646f42b3ef6a63a75f948e93a4247bda680a0b29e50c1a5903adb5074aac6d2faee0d4be7640d36792811ec92847999d069ff89291c9421dec79c37735abf1a52aad9e47a6b9200ccd4922e77c9db8d58939874e7642c35c59d7c2c13040f1a2b64ade45e46c2d5457af8ebbd09abdf497497a92528b656c420794ce9dbe60b4d4453d05f08a35bf6ea8569b1b9bd989a4a91f4d44525fe59362b98101af09483f9fd55cd17b4c707b68e3a1422195c8ae8f6d90d4272d56df069391bd43f49d2593b610377b3aa5ebc761e22e12a71441cc7ef7f038333e9ec91689380f56cb75216a531d4362e5a1289909c6097918dc9171e1e63bd2a4b78d9503f5dd2473e081e72986159af7bd90dd20884c5fd318c7e0da99c6ba4c56cb98f368b3790782ea0d283e8a98b0e22848c59818bd4403b044500b990faac7650968cb0d446c5fe06c2068ee658d9d720504672eb8952481fdd6400e5dfb410ba650cadc976340f0e2d1588f96ad438b5b50ef1d1ffec3e708cd48df5848ffa63b50f4b4b556362cca6f01490e6303379d7f44f7354edf066bf165bb0b4287ccf3d96d2cec123cf468a180676ba863295e3a266512c930cb18d5068a78aac199f867428e906113a967c7b8142eec8091928b8e044203af18e715e5422e205e9908ca0eb16091e1cf4e92e5d054667b932b935a220c916f3b05519e9bea93875a3fe82907c947584f59c4065d843e18bac6b2f8ab0711bf7afee79c4265df146abecaf5f0c7cbe267b42f605fcb5f707bc550cdc7bf317b6d31400a24cce77c0841a32d813f52b3bb977891630b22eaf8002e37af5f2bf28731df075314dfccafb927130b2e2af6011c6414fd77b644468eb063031aecbaeff14c39eb9dba441bc9f513210c0e2a5b878c786523d1f6c6da47bd3f54ac8e8df3e480af4fa1b2306e9b97fdfc45087f86b3c45d632fd7b580ca2a09bfc8044687e4913c628fad9c8ff7d20639046f6fd58fa9012760ad7467725326aeed3d3b5744c7d58d8e47c141fcb169562b82cde430655627347891da810587343d59f4b1520dbc3eb3db06810081c031edef500be12c1d6c8048f9e59c858e3a8e02bc5e42a150bd8c858e5e5ddb50880c0c9d3e184b1e5b7d1e4ffbe377bac70da6c8e45e4b8779941eb15b5ddbf993be3d1eee222f5ecdcae459e90b244d2c09e857f30bf96bf97ee6f7d02824c5107d61f2b089f491465c131f201a57035f4ff856b0ba71f9096f81b3230c4daaa3a31cb090f5628d1425891263511ded31cc9daabd933cb54f1adbdc8e5000fd3e99ffaa9cfc831dfadc0c0eb620402b78a8a8840f94814038db1ef9f701bf3a7e4807704c1403334432565802a0d8a30acc5bd76d576a55d41c74f2a72de2a9cde18c41fb04c11ad8aa8b143aef3a077bf141378c9dedefe526fcafd91fd36dcf2568292daaaae228db7e82d03d3e1e2b687190872e7b83c086300b0f3d83288b89233da16475f8352aa209b2ee906b941a4a4566f5d44e0881638087399aa94d1d1e6470a91db3f23ec4eb4c0b8fd765c0008ebd50a797c85399a91830f556cc369e02fea5f638e1e13c6ae6a7406eaa64cc5405debad9affa82f416268b368099569a27e575a6a4e50ebd8edae08050081b822b7f47bc5d790ff8674f80b05561301b1865dc7c2b2b3885ecfab5fa57ad81d833d26197607e81f48a362175862790f6299a563995c6b2c87b158760859bef5582ec6b1fc81fa26638f6497bd89c82219cac6a15f02ed1f395917fed8d09faee1aea32174da11b98a4f4d048d6bc3c0b196f6d1cba460cef87801fa5a06d0bdd175d4341f81113c1181accc8554a4653c1624356538404e929a3214c4503c3b98830461a436c3c07fe21df64059ea7403800f81a18146ffbd649c4f63dc7ec2d594655486b1c711acd33fe7ef4043eb7425096b0744b09aef02ab484cbe6a131556d76a60f3ff804dd892009b7801de13b81696fcfe6b51fbd7495e4cbe7ff90706577c3790016cc270ffddf83a3f90e21399ac811178c64f67e74ed480a0a7cee6e796c99478c0bb030473998a7a450fadd7e43bf69aa36caff969dd6bb6fbbde60e5ff367f5f10012fc529ef98aefeac7832dfa8a32565f134ffb9a0d39f4ccca8d5f11a1c757534f23117e5571536153fa67b4f1851166664f205f9d36d31a590abffafa1474273e7c50de52954cb03db7510438ba6afc80e0738233eb998a45434b55afd614aab22b0ec06e380a848004ba5e8fe7dbe01432be0943cc2e025f53600bbbe778ebef92de4fb9f26f7d528814b743daf5ee40cdbf04d4e473e5e67fa339c0cb0c9c12d908f52e1ff7389a1141935f5070c70b4f936115b79643c8b93ce2f49a1a18df73363305c1613341fc35ae9047834381a20023fddd29fd3fdd3f06384cca0bd3f2c261c355764201ba980ee0c6177f4b1471206b4f616aafde1d5a8924e3f4a9cec7a19feac933191823c4e93179c8e976b25502c1d807b86f8ef0ca3c7d049f0d15ccbf2e84e90f25bf7689096ec0e26ddb6250419515395f318e13668b195ce67fac1d82ff5999cde4326346a8b24dfca2c4b8f0d394744e3f37c019a5a950d3e6b4e297f6e8649602ca74657068c873b81be8afba93d09d6e78f6a9dea236482cf700a87d0ca48a34ed9df8acd6d778c82f3befbe4665031db8be6480030de066dce6d910849b8743ee66409ff4c16f706a5654e2c9a2030ed4ccda163a3591d2f26b1b584848333278e00834d81c30bc49311c7acdea3050a4add5abf2c19e195d3f2dfe8b05a747be84a1d16ecc4f48877cb513998e47c270300f1e8deafebc167cd5a4cd35426e044ab101a68a7066cd67b038cef62527e0b8d85a8f36cee6f70e4752f26404a2c023ca3cde533b61e31e41ee5c693785ef19e7636d452681312fcbc63bd8baacc6219c19bc017306400ab269e260359841ee2a2754b568db9c7743c1221ab475305c8d358623fccd8ed4c4e4e193458d55c084d0d6ee7a0b87841114c80de66c664443745c3b6735e894044398030a07b46eb0b3f5aab0f99bd70b7104c93a398d2d52c86660ded6667c8306b6fc2c53be76d803a92d4eab7bbdb4f1a802317f2a4adb9f9c77aebb72caf1a7f064ef68cceea2e8db4137ef7fd8e4bc19f713d105908744c28948795bc7a622b7c640c60e96917a5c5b4e0121daccb2450b5c4f67c4ec900863fcac7a91ceddd0e37931597e0a946985cefb643cb61c8189c30b2f0a1cc5656c90aa21366183d6d283ec65586e915c9b73155101304a1c50ed5a4818918c805514fe42deb4fa20e14d51dd669d774b438f3b2e10786608d82fc0d8335fb766030aa4646e7c90f9bf0e29cee15329575b4822eea41903198e7dfe5dd75af850059e39e51bc164e01445fe9a424041c3eb22638f7901b5c1ba45a8f15054185b5e46963f5499db8969079182bc1543aaa7a030099e28562a64857baddc287b597abc0e13833a94c1b20afd96d32c67d73d1b6de8648bf0f082e859a3cd27b6ede9c6215293adbb54a81fa2093ea832f9a11139a6ac27646a445a800834315a79d6b4b4e20f6fa9c47f691883691718b9b631144d92eea92bcbcbe7a8d1206ca550fce427a42f993d5f90bf49ead7d01c84641014916e0fb6ce726bc79fdfe39c2b3124f08a7979778badf7a7cdb236786b2f1667aba13e16b48155cfd5cd0a3a50ad1d1f0b28ac08552404c3e9dc711936f05c0e9317240af90bab421380bfe92c6f1c4ea09303116bd0431ab4faa6f79ff704a62166079d164fd2c2bb3c274dc909fee86459021f6509390e3326bd2c91282f9a5b47e895d2f2be1de202636c9e88e584bc3aab2e4676a73a07e5542236efa3551e8ca27b1ebdddd2c6cb5eac71fabf3eb17cb6daa891f4f2a0fa28573bebb5480ae3ae4e9c58bf02b58f91fa0b12a9a08360c0504a90650564e8882a1b1478e994400f6eb6692c1e7432bdce535531eb52906d77d2a7cf458eb223560a3e283e4bb0354142f2f51b682c1f57e5e4305240125447cc565857bc31cddb5d32d772f8a8cb425e2386089a8b28d9c42886d64779ad44c5cf7743d21d3c9c7b98ebc1d9835e686d0d68bd918dbf2a1c48036a0f2141f4fb1dbfbc3b101a03ed72da059ee14450f4c2077d3c387a5d0a40ef63f7f49b6e3bb278663551d5e739b02642ed0229048cad24c438b164c2e1a1a6a37bf7268d329483173b9c7a3b2ef088f0a205a883e709435d2d51e1a9c5c7ecffa6a1a0daee2bdd24f04be068839aad2f48549935a89259a5e09e2bfd37602eb83e4352011af29615484ba13b59f7f8cdc62f7d49d89cc5df034a7eded8223a77e8c022de4dcda6e3e2953502f4b3ffc1ebcf594ea069389885a70339cc80b6b3a707c247a1e47cf155cd7d761e0ea3f5b23bc37a754336614a9d4297de13203f013e3975284bf2c904546a1a2f0aa87210fa119a16d872e7d6c9c283921bef97ae67ed9a0367b7a1495c8440ad93968a6fb3c4a495c5269b3d4551db573c1f278ec5895e0335686b5280bd69f38e7a8dcc2667930d6d70b80b5b207a3f5b267f953fb77aa76b92bd303baee60e12097cb187e185f5b055192a41ae544c265f204e6702f43f819c48776c4fe954fc2939e3b524d3173ee944944679598e644f6b2f7ae072fab334b3495a40b11147c0fdc7fb151d9919b12675c8365fdd77f220cc9eb992bdcd3f88d33c6d59570c6f6e37e46a9d3fe17701074b7e147bd4fd5988f713eb42a1faef2ebcee52243dd6e428f6d90251fc4ceac2c690618090e9491a4d809d93f472e58ede9c8510e758ffb8ea282e74a2d0426bd9dc7144148c1be8affebcf665746c3a84e9874decc456de80802bab496fe37de0d44adb1fb2a2f16a26c355eef73d54444c4505412a7a6352a50439c2f7bc435b5ad0641814331a17affa24fdc309ff4dbd22795f29b5987d72f73993795412490c741b0331befbbad556709ef7d3f48d8c4579a15f294e745caf3d358b7b6325d324cb66636957f2deac5adf850bf8ad04d8d0cb387368d2f438161ae140bf6656b1236a3c62c32ed4cf3d6c6a276f07ed0d375c972ec2e5e1d0b207463326eadac2c1fa9b58fbb42ec7173691c2d9776ee8003af84e67a0457cce48169b13d3ae2343952c67fd9526f785bf9f843a2acf11566c67cde2e522940c331e064131632d7185bde6f7a7c46126354e458737784ec9e376df723b32e9c6e3735eedbfd4601dda927e0b7da0c20e1efdb882bcf9747201596c86a1df7fe43c219a8faf271ca026378495c208935f0103b967c4dd5d7b7d2c3dbf973d891546d3dc408c03fd2cac3233bc121ac51d241357c8f847796e9233a16f138478131b49c6d061e5a44d26fa7d0cc02619813d992ed9fc50a076fb49366342b5e90c49cd368b118b3534686ae7e766d130eba5d1de1fcf8c8199b528f22e14d2ee89462faa54f555e2c6e730572aa34d20b4d39b66b3b51ee2d8df377c7d7cd0f55c4eb8a64b099bcd77990685688f0a2a94ce2711955458f2ae733d989bd3d0e60691003f93f54d61d8133bd1ca8aede66df5680a1b11206c0d8cc20a0cb67e88855c0432d6b91e95c797f613058633d5cfd2a73d1b8358fee68ba8e807751d0149c7ef630548401eb9893a7079102bedec715c1665c84cc95290a10631af49b47c4e60b298f6270faf6f952707b08c523967c5f464048226d5fc782bf9b53821a67eb5f6df3b0bf465a51c6e3daea6ca471e3c967216189971c6ae7667a70ba2932097a05c9c70e36c33e58d0b240632d1e8cd16611d14a59eb7a63a5ced8dc2b56890275370f3915a00f3f2f26ef2637e80111687f5a78081b11ea55aada3efb73657a930ce0840779ad2ca92f501f2e3f70521d12a9180f6dfe73ae493df49f3f6af769475c0f2930311b5d26668b28a78848fb3c73544fb676d648beae71b92b30fc877f02a98b5cb6d88f6c12f8b77d8ea7266d6df345660b0c3a5d71866bc9bc1225a5c8ae439a173cc5733484603717a8e96a73068857b5c5118d86a66590898614c578893a1d716c92a1df18bb3ca84c88a292e6a84a01a9c7db37646eff3742d81760862e4a16dcc118a4bfda17eba42d0ac38ed9161dfb5c3910101b3d03b2330596f903398214be0df866025921b4a42646cba869d5ad2dcab2ef8ef0897d79b9105c65dabe249316148a917836ed1135bb6930ebe481c36ec431b6c94af182160071460f10191d3fed63d0df6a69b6044caead51ef71fbbc9de99366f8c392c9a28992e6d3ce51e1383a4c1985dafd2ecec146f18e4c65d45e095800f822a365ce9433552ea91c00f9718251cd8b862fe1a50f2408d95f48d2f5a8ac7c6947e68434a3bd830a50fd868ca0ef0a886a31f07bc61031fd5eb3b9abf8f72f57dbfa1be37b86091518cde9317a4d1db06ae6cda789b1c95157478067c10e3a8dc1438b12a534249ed352f12c3031597041ca32bb450af8a99f84fd692f62d78d3d39a9eda006ebb0994303aa448aa3d4c8c39c29c014fb81b9461b180274d0e8a3f0f13f461cbc943782779e365a4f23ef17a35668c3c6150786bee187f3961f36e3a7d8776427117d544a7bcb11ba292e6bf1b14004770949298fe32b7a673bad3853c4f1282587d88bc6c4c50e815db1306e5717c0990b4f5c9800d4f92711084a7afa361c26ea54e584495ac2654bb0c7a8398b7a7137f37d1aef72070bcd2fcb5dad0f8bc3fc93a3c16a4e6e31bd4db3c35798397e736954d14d587c0425d7336d38c9c796adad1bfe98c768839834a2d2bb9bf45db24b0787b99190a446a16467da8a6f41ec68cc41a67ac80da19077c68f94733d027407c149c9d7b56b2215fe923389d6641a91d90e216e972670f5629436b5e4335f105abc41d43691b8706be2136af0e4c89b95ae544a8647753bc88855d3ef0dab5b75963d2660d7b4a55498a8e75c0512a51ed6f2f9877a0e08ec980d0b8895cd6a5ed11f3644c2b2ed6d1f19358fca107fa1fca4d31e985e4c0ce2e9f1e15b48975bc2050cc1ccda76167c95d53b256e1e6ea70afaaf34d29494d69ab89d92defd253290fd20f255a4a6fb6d8dde9ea0d0f410418e285018bc12441f03e4b6b47ed9de4eff7f40ce270b6414dc0f9d22f44d61bf6fe55cda4c9993d0d683fd6bf90f3c00c19bf8cd9c3667840670da9246f408f218129e2059129cc560af90a9ca7e979417abd6ff1b21917fa4649c4c298ffaa2785e3a0bf9a06b0f33c7eab42f30834e0514dd783c08e60e2151657b21d184c8bc16febb0939e207ca606335fef1d56004a6f9ea903d70441e4c7521915cadec22f821df4ce1f11cd8fa50592e1d114c2af3c57ef95f9ac5119b8bfd3cb59aa8c2c7dc52a26d1f3362b9fb6e983309c4ad2822461573599440b8f3d2f0f4a9e02cfe943dd33f0a172b4f521500e1aed6ab92894d5be2418d73e826c39fb119889fa34fd8680ab8c30c25ddea49653b63ad9c9666e04bcbc5cdb00835b525a314760d88af50d1ee75d5df2f99c91225d6899e3a2172ee56733b938c1f5f4668c30ae1686bcf6ee287ef20d7415798fa1315372c7bf98c0ed7396717fef48037498b319008cd6372e63cde5764082dbad73e799b766f52d8c1a445cd875e07ecb3b4615a801e69c1f15f0e90e069a9da8aa2b936fc625845192904727c76d99ac50a489526d72b290463870b6175f4951e41493dae748083fdc2364b7417734d3ef01e1f697638a8abfab753c6da7929aca03dcd36e65b8e3b9b057dd730cc022859d336503b0d96c269cb0bafa43525c58c151b1f312188953d0ba4cda8b122e2036d9e36d5c0c7290db99da32d32acd402c4a9b188598e0f91d10da02144be4bd72be9a2c2844885cefffc1c90822f0c2232d39549fced37a84cc6ff3b174d6448de446f5a34be1318e89ab5861441bb450ce143da5c48b153c1882da4856423c8d01aae828bd764307031f2983b1cd329cc373c898b8e1d8b832ee7082774de5d0f89fafc8b4dce8b101e2e5d68f4b1f3fd945c429de7344eac378e6d331306dd72af8c4929734b7701f900e1da49cc0a2c7a225f29808bac7f20e0feacb62fe805164970bf4b57fac6845b9dc50379d1b43f3204118c5dd5f056700e9215e20467a59bbec31b2b0fffeb81a002bdfd74e400c894e25767f13efc37dddb40fec5b6801b8ee228b5396309c8f834f6042e0bc2ab685bd3dd751354d16f68f3294886dd19ab7c92ad1736ff2a2ef5cb370e54b381743a705035943d77fc5fd3bb4a54b4fcb161cf1cbf6173bdcaac69f64bacd327ec522fc2139ec118bcf884e3b54b46523088b36ccf3e29c7123f20d4b20a36bca4b25bad258e30fdff5da8273592666d0cab4c9d59d1357cba87e6f2bdce42f8cbe413fa753e4d7bd31bd880b96fe9711a46f92d9c26c02b0c89b3f947ee8f34a7c8c8ece1148f7f68987138bc6ab5b8e7e6fab97efb4a13643de0c1399850280588e81bb4007691085cc18e051c64ddd006e8df18f312a4f77177f0fe3f14a4425dc6548c9b894ed10478e0b258dc709a0a7821f596aabaef0148523f15a8f5ba6ade33693962e73b59edb4c59c73d73ba5333b102f74cb73e9ac34aee326df53017ebb9ce50e75ce6d6dd736b75333fe306704675c7630493b059df4c0cc958c1aadfcc1980335c472da5e0967f7531738ff1df11868316921e6b821cfb605cf7631d33aab33a76ec944cb13a69beda0bd025a23236268a87fffd7793f1c1d360024b9276f32045482aa2b1cba2aeb0028daf5822733bb6156b21ade6ef0475d459630f0a1c2102ff80d435995c3485217f2c4003356d7ca0e25052cac6b9b425e6232558dd0b340070e3d61e81466fccdd01fd49bbf1cbdd2e98de1be7781fd2e76e1ca2f26f94e39f47597f5cf6f7ee3a3791bf03d2b13356029521cd388efd21c750a0f7a4c2a7e4e302425985491646f0f98d50fc622be54a23945d19d3901a948d59fec3c74a4569376bfe4e9ef780a55e514955728302e7e799fc55ae97fa1e9c241d8777f09e31834f192e301aa5e7803c6309a0a705c563420ab390f77bd9c7d6c48303c2089e7ba63eaee11dea67247beb6e632b46ce376dcb3dca370146953b2c91a500f365a24637dbd142949b2a2e610365584b91eff6ae488a3feaa257f37624e3a9b363ec7ddc16e3b967818b95bc3183de202e67c8d609863d8439b75f48ff2289b89d90e23f79e1ada32bd9bdd82b3162509e83397af5e16dee87426ef5e329030b39bbd7dd04ed3fd96418021f238cb41dab8e9850ea804d8152eb73761ee7d40ad2cfc5782407e18d88bfe09ae50b17aa5417e3e4bdbaf1bf106282a093e32230da81e2b9044802aa1393d4324fd8a327e9371a1ae6ef1277f9748978b282e081fb27e802917401a68300aefe27972e80df86131756c0ed42d4b0a69f9f61c7f5feaa40e2c715d0f70c84e6f69908e4c20210713d393d345805d3a151c1200b0548774218a4253cb4651078b061f97808da0ec03f3167d2960f6ac994e49f2b241bdf9d7e1c717793f24380ef70ddaaddfba0dd7c309617fb9aef4bc58776a730788e2653dd35e27d6082a74ce390321a09956eae0a83bb4623bd71001ec7553562d0e69746f003826d3bce00c4802cbc09b0a450a5ae4038291b7e1b467755db550a58cd221b7bc34d61552d39a9481741461bbad3cc8fb6b95ac569f9e5ffa4259811355493552da7f121afcedcc266060534be526d1ae0c892f6062709b8d43c438ea66ed092bd506cf59181bdd74b6f2b1afa98fffd8313eb4cd6b9722b045eb1ddb3d19f51f385968e28085c512c0519391646673b042d1c205f24683a25dbbb183688523b974c46caef13987ff7248cae6966ea97428e891c0b7c55350f2dbabe3ab75ff59765e75efd9f2042b3fbbce1347165a513f6c6b41030e911ab5ba6f25968e6fa2ec6f0878a03390de51d6924032d69773010548c923e8085206c0b43d13ce96594818a14641940802ee1a59ecd18aed883e22f11d8188466cd97e7b42b9894c9ee7747bf908876b191d46b5d9049189920e208281b5205a310455be689d3d3331412692294a540a921a56981893c99011636253d79cf29a34b50025b9751d401010b948b7219df7c013ecd8c0a0c65cd51d39c6f792bacf1880230ef8433242f50dac88a2fc0d5801a7ca62c4ea4990fd0664c2f00c371d31a2d28b8466d2b16117f9e581d94049563bf5929a6217ca0c5fe7db49dd4289cc4e78413f8c11bb1492b9506e6ffa524e4160c590074742fb9d813205e5622178c73ec590193c53e03da936d381897a4112f70e5024eb98d26507550c09c28ba86c6244342438440dd0f2d0476fa7f14c2adfee7e91da3f77a4c16c22200413f6cf85fe844bffe0c656c2bb99d8d340403e48393ae425df4b4054c63148e96694ffdd9e8802c1022e57e75974003bf9dadf54263dea1bb3ab95808e72e4089d68d31e33f974b261a11f97850b96be03960f57cf55cb17fc4107eba59ca8ed2e1a2d2e54b7b79edb4bc97af5ac7ebbd88aa4ba02c568c472fa36d7252166b3a652f978c666d6681debffab7c6065200e3ba2e605ec1e36a1f094c3b43edc6e29fb39b259b4986e02ea919b8151962d70f37c2ce59181365fe77b060340e62d264430c3d8c070c888242c93d6ba1601766682542e8178a42e985aaae53213fbd0cc44b423419e0aea1b61402505ed6b64b4bb39686eb1461dbd86a71fe74a3ef81a3d95ce1aa25aa316bbd16adced0833785de009ec600de0595a50bac5a860958afcfefcd345471909f65a255687e3770bba01338990005325a2a6b65558581a03252582d7bfb55670145efc391237ee694c1b05dea7a53dba0189ea3f5d29256acbcd79dd45db8d564c9052b2de61f4c3a73766f9ebd5788792b3630732beb29026c96095b488ac7ab3b7fabbeaf26976c42463ee65633b81c0842cb53e6224d33ecbd6145e95429023963fd3fabfe095473b5177586be92f31f122770862acb65d44db146cb642451ab705e231dc5ff8231fb63be53facaf54a16f73bb0cc2e1653acb7fab3657323f8fbdaae891ad6415eb108ce715c1db5254c346dfdfe439c5bd6b50ee1a1685bb2f73905fc7edf783d6921cb1b4aa48d495c7a59e6ecbcd34c38765d62fc914b744a9935dd9439ef4dc906a9d8ce4e5be9b361e4a9facfe006d93fc7e8358a3229b02400a9d885b4e1b7207615fc191bc9da4f090d0699ad850787fbbc8476881176e13dd19bfac485a1ca748ebd1eed94911521932e7897abfda7e0e6c9f353eb6f2bba3fd3db594a8deca539b9a4a89ab9d568a7ace2fcd95460f72bfc475ac4a4bea4cec45597147d6d64f09cd41bdd1094282b510015f06ded9f15e7cb6bbe280da581374677e57bdbc8ee0ebedc28f628d0e53a1b454634e98a15ab8ee1ba692004b48c937a929a125cfff2bbb4d3bbe0e795da948bb8b59f8eac9f4625852526aa56c405d4e246dafb417c7a97a3011a00e7981106ca6b9cc24a789a3fecd0452f2ac66488f5381c55ebc482ba823b584ab6ed593f731214042e92b6f55936e2660f16dbef73ca5b3ab5a5129ab8048a9788a12384600343f095880e4dfa60d365e06ec28e70e5b12c420689f3b3833e81b8e5a8608f7aca4ddebc1743ab1b883a7bee2e98acd27e896ae8e13cd4fd5b736f4f7575319ce2e07793d3a9adf776ac4a88869e9818e8afabf2e2247a4f1a69ed666b6d54a938aa69c0a9d49613bebe6bf55059068c09eb2cc6f3b4f7ec6a246a475b2815e703d4de032a0af79d55106067b539c0200020dc2e0420042004182824557054be93b0ea67241b0000801d2fe924ab00b75c620d3efb992650080281a48449288c244624a699d82a8fd3c7fd89a26166e6e9dbd46c6d777777f79652a624038f09b709410a8f9f49eda94da8d41ad72087dd8f812b0cae420ebb30b8f3e358ab4557a016fd60aad56a9d5ad4c1b3c92a6273bf90526ed32cd2797bf2a4acb2ab78ccfc8bff7e83e1b10f290cccf7eb5fdfa20e2c219d5fbe887579d6b38474767d119b85742db75e4829b75a3f94ef6216e9fc629efdaaffc41feab7cc229d5de6d9bfbd4c560f30dffa96d9637bf261cc1eaa27d2b924bd6989bc63d71f5c811c767d32ea4f2ad454bae6b0fb25ee2af74ddc6060ec3ad89380a690145d1eec70bccfad002c3f97e597e5934ed347e55b8fa9be344fea300b6426bbbc8bc861b34a73f9973feb8e988f995cfefd1dca1797999b2c5cde66979777f9179348e7f251220fe5bb9867679bed972dd6e9552d5f3eb822e2949d57441f7272ea438c03dea1145a9549a503cda9ef6f7a7f26f751a732bf8f7e87c33653e830f0cf3e3aa91017688d90aee5aff591c7a878acd62c5fa433cbefa8287cfe199ef0d1102e9fff5cf76288cd6b9a97c674b596294c0e0b89cdf15a8a01dca48055ba13029ae2fe6446e5a6c2c3730482232ab33b5904647f53efc056dd5611879a3e2c8fb5f6c11b6227484aadb5d569d85dc705a55d93dc9de36a15374aedd3efdebb6d1bc7517a9f76a150063dcffb8d521f3529741c90572c8535f7e90dc1d9e9cb3ac8fbd3d5a2afc849f7163b198ff215730073ff282474829acf360aa56ab4865e7a83bd2e6fb83197375cad18b611c9892118b2a480caf87f4520fea47c462c29b0d5fab3a480d6d0dcbd871de7d9d0d6ef1bdb5cb113ef2d76b20a2a8908f06ebaafe8337ac179f2f9a4905fd157340ad5cc99b4fbc2c65eaa54aa15306cdc2b168b950ac3cea2bf6227dcdb2459d46f8938d5be4bc4b13cb9bfa740f65fecc3f2e07c4554068f423e0e8d33ce05411e3bbfa2ec3e4f4e3f27a0af88d6d071c863fc5b449ccd1c8574409ea7d1e727fb5f5b410a829f38b2f4d49c5b4b23102cf51655aaf4163a488bd35b9400a4af53062d3b473be26ee95e415e31e3795eb7cdd0efc33a1ce6cd38ac39dac540385a0b90c3bce5a725e86cf949e231ff171d8fedf88b8e5fecc47e5b130947bbc9e27eff3589340ff57e3703ce58efcfd217798676de3573901d09a35ce4bcedf01dde5991fdbe73342f73db9fa52ff20ad4a2f485159cd9f24365a8409e2f2d3ff9a535a44d27f6effb93fd2ea373bc7e2000e9eb5c098199feea41af331a4e6f419e9c5090fb90b5337befbddbb6e1802ee28421adff44f39817b466e5fb54749292fb6444769b7e05990405e2ce9bc79d80ace5b3a379b8f3f82ee28c2b2b63df906342e2ce1ba53b1ce438aef3f78556fc81cbdc4f16a7174d251d0ce61376522a7132a032fe1bf51a4caf7619b421974f2628a79377a25df2b46ad2d3b3fae9c9fe2b28ab9f15d02ac8636dceb2d32c4d872c6d95c459d437e1edc1115cf58ad671e4863ca6347246421e821fe8855b27eaf0e5e69890e78996432bb779a25119bf67a9870bcafeab500739fe4ac45989b6d63abe1d394c4fd889f826fc245e01790dfea52e9f2b73f5c39980f43fd12a0dd753fd3920075be1d7eab8cd6b8df6c3ccfd7045c8433a9b9c0f47fb449c7af6704d7a85c4c1edb900d257bdf641500719c461ddddfd43384ddf04e183c74ab93f48f7101e23c4167098c9d1c16a081184c6f41735ade958af35004d40a576218538c463e4614052025be1c2ce9785254054965c22d7adfdfad6eb3b01d593eb83e0cde077b3f826890382fdfd8e4ac5179f8a336fc769c5922c81ad5369769452e659dab176a27912b9b0915a41fa875f0549852a0dea77d495adcb2873a52c4fa6c9ecbcef3c069afd3bc0afa47996e097ccee33f83df83bea0eff70f56a2db75aaf99bbc7e68c95abd27121852955083be0c28b29424350a00c09090d0d09418112040508084a501014284140403f404f9e00fdfc0001fd3c79c285174d7cb8f0e209175e3ce1c20b1f2ebc687284246a2a42cdb910d2420e22ec781088325de16268890e3437a5453deddd28f0ea7ec4a4da5a4b60afb5493c77bb57041bb76d3d58924b4cbbe8818c52afbb9fe2ce8d3b5a6545de73d43f49052069173dd0e10118b9a41d4a09c841e1799de755cff3386ff3ae673d87d59891427bd4bbef05c1f3b6ea751ee779d7b39ee75e7b9e473d0f097cb26bbf5c09acfdaedf96866e09ee46e698d828add98c5c1bb7090b004fc6db6ef5ea26e280a06d999d77398fbb9e17825e085e24f97eb0181ae3302a1305d9ef7d0d2fec6e38279ce949c8fe1d0e8622d7755c158378df736ef57800b63715c0cedf746fedd7b0eb9f1f0886d806006ad864371d41d61a3248c986929051c73844a4119108632111b00630892fc757c4c3e129d1d55a6bad5c4853c33b95c8f6ebfd1347761aba25b81b1c13db4cde8cdc7baf93ce84d5187f988dfb1500d51ed95ec6ab06bc6f03bbaedf7eedb7b5c51f36f03d1107045ba5c37c8bfda97ab50c1b14e6dfe100c4b2bf0c5a03002ae35f0396b9b8015603ac3108f318187e60088adc15afb87d0d5ad38ee43eac96c24ad37535c69dd01ae32a20416edb9edbaa09071db75d5b7d06f6ea3641c97b28ec8656a63517010aa84438cccf99cc4387021040616d9e36874ca63e3036edd315bc3fdcb50982c863e0fb37cd69c2771b217c4063de7befa063ddfb770eae59a4cb778747a569598d711feecf9269fa24e91d8ff51387f9b44d033dd92971e659ca67cb7210504b79e2ed041a03d436ed45ff907f3610f2d935a1cd2ea232ee9909f2ec205a731fd54a880d81da946717e1076dd30a028d7162f7a063f6bd7990fd3ba86d5e6d430b1aab1fd4856497324f3b26b39fe8105b3c5a5ad636aca032fedd54647f9619976227fba7880803d53b2be6d94962c8fe27930bd991b2ebb842f677f36c2ad9794821fbbb79f614b2bf58714381f616b4b5a042f6e7b2f0996757c9fe178f21fb7b1cc8fedd13d9bfad906d11e453e4a2f37ef51ed0340490bec0f62b06017e4254172af4140fa26d88b8008f4d4af64105f0de0a8235044d90bdc8c3028d31c9474d0229db96c36fa043274aa3907f522999d2294e25d3af4163a5a71f3343a61f83c6bca726b50982456d8470a1b1ef59327d54db0cd14263e3d38e88f00242b40d8f3b043522b204907682c6f8af9027f3845de1021d32c833fe6dbaff3606b2876644d53c9d36d4361dc50ecddaa68becac6d5a0a689eeedfb42844699b9ed245562ce9a2f640f629b2ff9592b14061fe3da56d6e14684d4b41658ca8b8f2d93a7d85da53b27f1f750a5a0bd97fc4bd01d13c9b04d9ffeb0f7408b27f08fe3d73f2f6ad73deffc06f3183e67973d8f01011895c2f8db997b35bad375dab2c3a88d52e15a2c2d398c9aeb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5fe140f21111ee6f6b5a9a5e5d69a5a5a318c682960b1d835b5b462318cd892384d2dad1846b41445187940cc646a69a9662a22928575e3060c109285c5c2bac1041347902c2c18203f64dcb841b2b06ec00061e20892850503e4878c1e4572901555bed04095a8328a6b51e50b8d195ea8f285461448a0ca171a33bc822871c3f1b4fa703c8da725ae0dc7d3ea6798e1785afd124d84e369f5334c223cc2cdfbc095d4077ade97c22ba037c4ba38ef033fd065b3de07aea4b0cbfbc095944b8cf7812b29ec1a623dae134555d789aaaeeb4455979768220a2470cf8009dc563802f71592c07ec5895d059cf7812b29ec1a62b7703cad7e864984c745952f3466780551a2922c2c18203f64f42892a386a9a515c3889602568411225a1b917865e5fc2ae218f155c42b192882478d77e9a85e4e27d51140625e4e3e7afca85fad7431994a2486cc7031090942e38e422cac528945892230ac52124460dbcbc06ef2f555c49921bb705022137f459c25647029a33174fd4d19d19aaeb99c32a2355bbed6de9a324a7d416b34f0fea928b4cd915f6123fe64d1e1f1274b92ec27cb4e117fb228d1f1278b2c6594324a4d4951c9f167aa96e3cf54157ba6c0c835be9afd6a5feda47a89c5628e38a95e542fb19c6b4faa97982380fc88c54eaa9758cc1139484eaa97982380fcf0d1c386d8a9d651c854badcb831030953e952badc70c2091d53e932038921346edc30952e376620e1848ea9749981c4101a42823ce086e9fa49a6fa397943dd3997eb96efb538fe540da97e684dcd2c2a28aa1f950c684d43f1feaa19b44d3ff1fe2c2cd54c893f554445fe54d1b2aba224f1a7aa2846e44f951495900ac863a52d659432f2ba732ed72ddf6b85f89303e27a684dcddc13ae87bb82d67414efcfa9a06d3ac9fb93cf4199e1b9a1ccc49fdc6c893f392207fcc9d19a784ce45ef55363406f4aaddf5b11076cf92be2c4f8fb600db7269e13718cfc83b6ab5dd7fd0e57fda87eaabde666a59c750a27a573b3a578ff4a25fb9fb596fd6b95268cfc59c1a0e1ab518de2b1afbd9ff5b82a8d466bbae6b26fd7daf333ad1a81d68cef5f8fd036add741a33760e0cfc7c09fb54aa5d11a2ffbd7281ef3de9fca94b54800327f921e95e96fe1af6df47b18031800325c4fbea136da89fed6c17d056aa33f07fb15544605d446bf068e74f8c3332d38067edcdf0436826920b110d8855fd8fb99c04b602a5362c18161b012b808ee4f0213c15de21b4948e0219806ee178283e007a870ec080c04ffc0d4613e700f4c5be11c273602f3c0fd19c045601d1d6daff66e9cd75d2b4f7fad3c95495de2b01a54a154208755997b952437eabf521c5675c0705853daedee33a221efa9b57a13eb3e17ca0df2d9b6260ef3990f39ac8f6c53f1243a358ea3e23257e2b03ecafd9476bb7badf5debb71fd1da5ddee5e6bb5d66edb76c461add34b1cc6233be2b0eee926cdc4619d4469b7bbd75aadb55488e37070d8105ed10e38388c07a572018735a5ddee5e6bb5d6761df9ea26459c300c6b38ac3b8a015c2f802d8077e04101dc44e09e006e09e03ef221b04300fb03b01fd5187f07e02a04ae0d8031002f00073153002d0145083802a2f6034d3ac08e01643ef0f4e053801f1e827698e940cba108e708871a013ae96627cb76f00cc047003f0108ba616643ab29b2e148472d29b653832c070f0e1f1aba1fea0be930720df3ec5ce35d3a29954b27fba78c5a35d54fa591797f55904a484553d556b24a5381156d5563c9583f2c1aabd692559a07bc7feba7d238e0fd5bb4b39c81460c6c868c182f1813fbf0dfc3bf14e05d78d8e15b4f2b8d0ecf7a5a6972f895aa6c61795a69f2a7763c6ae564bae1c9d22886340f7e1e8ea7e1b7fb33b8ac31fe36305963fc0180656a609a67c0278c063e6762f0a903864f3aa3b4227a446b346907e3b3653cede382cffe71e1b38366b4b38b54f8eca35ad2e93b297cba8ce7749f133efdc7837c46f3a3d36b493b555679ceeaf3934f95ea27bb766490d8903343f52d4e20ea745705e459e61c2a20fda704791c77b7eb7996c712d999a5797fffb4b3232a5ded7bef3391581eef6df64c560ff7bbbfdf797f3dcf3c73f2f56c79f286bb7653ba297ec35a9ebcc3cf1b7604ddd1ccec8ea88c3f0f48ffd24d52d4b9494357fcd82ada092854ad244a87944c29a53a98e94c3927a47f59724e865a0715e2aa20bb73a63eb5f4d2cddd2d354db2cdfa0dd6af94a45c15e439d334a6bf7c58aeb52d0e2c8bca5a6befb5302e0fde6df5ac5f815a90ac6ffd6a65d290ac15abb2b0bb60ccdbf22e2f255e619a5d5a1ec6456431ad75215d6449aeec5bd3bb58972d6d8b75bdfd3e6ab1a6cdb29e63bd8bc5fa8df525eb5b58d69a5a4ad76a654f2e0c6ad10faeac7ab5face9a56ab673d4eebefa7f0997aea3016eec7a7e9ff95fa2ffdebd46a69b12de6b9facb32ad427065f6285baafddae4f47d44a566ff65ff6de715ebe4e2f2c2e2e242babcacb4aebdf74b26d7db96b7e5db6fcb7abb7afbe0e91f63d3c505e65d2f2e2e2e2d0f63962e2f179bac1ebec7fdd2bfd9a3fc92e98efdf5c7aefc4985da85bbc57e893ba9e54940f2b6942814ea4b2b607915c6c161f6c195b045fbb6b42db61459cc1dd65a6badb5a9db47646934453334cf12d3ee5aeedaeda6a4f8978c72e9c7074bf4f5d446c994bead1d3ec71ee397be8a3df897de451ec64ea40a28caf63dfb1e2d8f2ffa875b08e5f0b999512d771f3ee8854d6bbaa760679e61f6365a0fefed9bf0198a3dd01dccec8b3c786fa9c32cf65ad933cfeecfcf1ff6f07b701f3ef8a7f82dfef867d99bc883f8e3dfb7220fdc870f8a1ed89552ef3bda7f3187eb7c8cfbeefc5c6bfd1cee78cceaf0f9f45d7732997747ec84742e22a494bf27492ca48611c6b9d168528eb62a3a4a789afc40994531a2e23926964ed448bace0dcd1fb571864872d8f510fe15bb2b76e68ec7c61e6e92b365de9d1207e479efce26f650e49b7de13f78f34072fe1c78c1a6d78e49b6bfdfd96bc7495ce706740b6e5c177218dcbaeefb420efb13b9c3358c303248451d1c8acc99489cc81deed1bd1746f672f2c9dd9d2afee07fe6642e5f518701e4ce143280dc3de879df42d93385b450eefe868a9d49a94cffcddde16eeacdd5b949ee4e27cb14262734f5803407b97af0de3f4d5e7e4c6b36df705b81cadc07dba5f5a00d1fe337ffdfa421f163fcfa76d65ff187fa43a97afdbf1ed3dce5bb684194ebb71ea4364f98e4fa0d4549ae6f3dd6bf7af33e0cfdfbad3fcb3a7b2aea5067754adbd4a3b6715be6599253f27db01eb50deb6ff7f74fcfa752c6cfd118fc2cdcb852187e0ee357bd64fc25c65fa9542aa7178db1be1f4663fffd3568ecfb4d2c0c6a41fee3d39f441f72f2bfaaccff1dfe6313e6b767c127cbf78365f90d83cfceff20090303f331503030289818a6b2144bf3fcdf30f921f88f03d78e94ca5cfb63811ce61f1560807171a7d3e9885ceafdbb241d4e2a2536a530ce3ca95010a0c8db0a0a6f3c95c677389efec2675bd85f373ffd697f4c1d3a6f3c54c6bb9d4ec761f508e4e93e3a3e6757fafb4ea5f144f3ecac799221d8a1bee29595219dcf8d87884cd61fbf846d4bf1d8498f72b7f397d624f1e91d217c21a8c272e4b377dccf0e43f68dc7455b798020197a60197a2007c28fc20b3dd07bf033bd2c2ccdc6f3ca6747cf1c67477ab9550fc9cdd92a8b148cc022fe5fb91f3c5007e4ed1e36f345c4b3b5a67d18805db2fa29b5642079d4b841473f3561350a234bbfa9a5d43477f8e0307f1d4545f45f883681d8c1070acb3a2ee0b1b3cbae630727c2c8bdabd91da14c1f14c1164735867ed791e776c44921834069c05aed66b4a6bffc8234c2764465e883b54ab35981c6d0e79cd80943a61b179228057f3ba235b9cdb3cffe0601f97948e7cd0a9486de78f9dc8eb630704ed016e413ac794799fe96290f867af209d65632ed62054932cdb48b1f107999f260c87d74b2cf93ad0af2491ab05c6c8115e4f6a0099a8a2e5630827c82b58e9c427eeebaaef3e93a376dbe3e99e6d0437906d6b220cfed683baa5d47fad88e7e00a704714dc0de84de9074e80a40b949a64fddc79f782c95e9d0159a64ea37946e471cf8600fc7b5de6a9efd45deab1cb7c5b52e001603360db0bcede90dbd2338c25f63e87bb8745879976c61a3429eddacac91b4645d9f4ad30581c6d037c28f1799fe179452d6fd8bbb19e69ae045e477b34ab3fd573101f466a6c6c0fa670a30cf3475644a7f3bfa5e8e7dbcc00fd79b21ce57d651cb5db789813cc15aa6af437db0e660158fd1f73a77474d1fafcc6d26ab29abdbec6650aaa5dd8c6302797641950634026974044ea0204d14aa2e2d40fa0a7532fd2de7e645cfb2c50aa27ffbcd3c92b34518618411467fce4d6f6210f82cb3b5d55667f170cffad764d19c4ca331b685688c7dda6969d90a798dd24d1b880ad01430d32e80bc7053a65d00cd72e9300bda1ac4c9c0023dc935d32248da0510937c86d98d50860cb4a4f1cc0937d32e8076ba69906433edc2065374774769173438fa32ed82064d303b227048f744bab3fe78b77884ecba4a33ab4df318edecf77fd43bd3b618047d5abb1a73fa8c7a11c8b367166f794688a605517af249f38868964c5610e08b2f9a4742b3f6d49c9b9c1b06d01a3386bfc3474c6b4c8f0ef8fe2d0621b28210c11741c767d5c13634415968eb77518d6105411f7cd03c423fe7c65f08ac34e18b5fbf1b69b8eacc32e745207b60e9e86417d2d1f1dedf33bb3aa331b5d2d41e7333eb2cd7fad3f91703d09249b2f0f27e5f2037d225340405ca9090d0d09010142841508080a00405418112043484c5101643580c613184c5101643580cb9000c9ad56152f3b149ec4ecf0f1014ab449634ab5501a356ab52b349ec8ed5b13a34219d99cfe3be8f732a3f3b3c8e26d5f0c163e70b91c363401071011f37ecf8d7d9915d583aac07f761487639666674963004115cdd81830ec7b10eb39dc38200a27b3827ddf7059286ad592596a74a2dc9ca6c8f6d629f8061756c50a5c2d56a54a780b4c65449aad55e2f3258585e901c614406cb06842c5169ad07bb5b0f56249478a18e9c432ad7c3325756584dfc3057349044917b3a75921e33e0530e133cb6d26532954466b84c4efc15713a0acb91a97124631e8a2268745c2dda2aad595e64f88b0c1b2a072c0776585e64184172c41236d870595e64d86004c9c6811d96171946901cb1c4068440c086ee3c9617193608e0540dcd90fca922ba5c0faaf5ca9143091d54ebd57ae5f080073a806abd94d04162488e1ca8d62b87123a1ee800aaf55242078921474e9a1c1daa5b6199b1d88f27565826cb8c4d3185921596f9e389268ac4622b2c33f6e3892994acb0cc1f4f3451440349e858b9e069854f2bbcc237a8b8b6078f1b37aa0a8a4a888a0fccd0497af0c861e2b4994ad70c22a6d255baaaa842662a5d33881861aba97411715e85cc54ba661031c2761426ee69ded3fe69b4e65efb53fea53ced8d406b32f0fe7f84b6692bde9fa4fdd153f9da5781e2cf4f7a30b0ce1b7d148f8defff1df59e842208862a588b08fa0802e3557b636c36d6e4f5847bf5bc9a741e03c8fb87af9ed7cf0b08f6e72be805e525f41a7acd5e3e1ee879ffb417cf8b87d674cdbd7868cd76adbdf5c5f32201ad29bdffab046de3f22f9e17cf8be705e5c5e4c5f3e27931f1d8f77af2e279f5bc784a2edfd3b27f0c2019c04c58818d54815b0632dc33a002b7153e80fb0a5360bf420976157800bb171dc0ce040ee05ac50eae56786028b6a860303e827463ea6396d068288ae04ca56b061123ac131dc5765ae1193a490f1e394cdc1596f9a39f68a2880692d05151ad970e12438e9c344b90d4277503350802a057d54f02ba5afbb7d69451ca68c68825498d1aa92a29a3d451caa8de1a3375e3eeddbed1e3ae890caf2aa86b8e13ad65726a72abb89d78bcef3cfd009d82a0089d7aee89879b99f1be945167edad9b77e0fb9f6427d9497602aaf5d4e4243bf19c641d58f34d8dbb71de37862652089b3a0243cf035758c8d06ba952f424eb9a93d19a2d5f6b6f3dc94e55d01ad6fb9fac681bd7ff79fa39019d824e504e4b4eb293ecb4043c3139f59c9ae493cfe9891785ebb68d1b5162b7ad4a53adf69e36db8923ca3433c3cdbace4f2defcffd39cec471341aa71c51196b236dab2799acb9ad7ed6debaf9577aff5168141a85c6297714ba639451689c8d425fe99e5a5898092375e33a71449956258e1a1e18922b2ca956f7d0e073c95318922e2f2da75086c91abfaf6ca1c62f065ed5eec4139227f28403068b09c9538bcb0b0b078e903ce1687181c584e4a9c5e58525c374008e30244f3870b4b88c425e77cee55188d66cf95e3b461985c62171241a85461ed09ad7fb8f3d689b19ef3f0e79ec1bc7a2514af6d1689c321e8d54c6da48cb3e340a55aff338ae33a94a1e07f3a95bed65d92c186012ce9b29993a1617777e4925d309cac025200fc804ec0175b8dbdc56416b6fdd1c5c79ffaff6d5be1ab864fb6a1b98e4ab7d495f0d5cd9585caf1930dc32e8195caef34a26550ae6ab38a2cad62a06be51233cb5b8bcb06498528c3654592aa17ebc94252568e0536a1c4f3158a9518a98af22098262cb6c21411e30973bceb23fed12aa745479a32e6197005242952f3f66e01b374aa8f2c6cb8f25809450e5cb8f1958091a35dc289550e58d1b2f3fc6538af5f2f194aaa7140e6be41a19329e52ac578cc781631b4f291cac176764c8fb9f523322154d15252636d6afe675e75cae5be602adb1f75a30c956f307c657a3355cf8bad03645deffabe2315004774025e69fa00c5c02f2804c4050e7abf2d5ae07e47d5de7adb84c5f37830cd556ed5d6df60907c4f97c9daf603aef4fcec7b4e2fa9313cadcd08c88a3713fddf6d5b89ede6a68edad5bc8f2fe5c0fd7c3f570431cc701713d9c0fd713b2702b185bc4c810dc33a036ac0004f715b6cefb4c2b2e958c0b8a2d2dd38507ac8ea714ebf51d252656a3842a5f7eccc04ad0a881876b69994c2d467c15715a8a182d531146602c2c926401f2038645f62822a3a24a148d195eca204abcee780ac3f167ac4e01f4396aba88bc3f795b90a8b0a5408adb8323790a4b0e3b215d3353922a4995a44a62094ad552551cf693fdef97aa25f590e3cff833028d411e9b551af28dc82e93a6a432f438afa56bcfebc61aaac4c629ad741ca64aeac6ae2b61d0ab9ed78db5d572d192cbe50a2bae3c4cfa9be2319f9177419ea95ab771258eebc8c6ae594b2c7d89e34acf611f9c0b0854c65f95a40263a5a3051710bcceb33c79740181d69844047837dfd76a354695c4f1a892b66ddbbaf139975007e922e214bdd0541d5f5e5e68d99fa3946ecf6dae28d945e4b0ee700f6ee2a72b0a916b36fefc74dd8fc7f293aae154528df1b79785a7ca58767c08ae99292925e6e0b953a6a4542d0ba425933eef3f11c73b22ab3526d49a8be630179188f31961d78c0a79a66ab3eccfa2e3b1f333ca5eab924a4a81e1b1d3473dcadd67e47598dbba9a644aa22fdd88853285b1391689e7f806801c80426a18dbc5a7e7db71dbb671dd75225ec3b8dbf77df63b5f9a37b388676bce5428601ca1a13796bb61d4c1c167a238e5b6198fad20fbbf72f0b04d71c5356ff018d7e1302fc36a81c27bdd724728110f33f7dc9f33fe9b7d0fada501350a499c4aa5d6b5691d69d36e77bfb6d62ea9f55fa24a54cbd2a6dddd4dbb9b524aadce0b06fbd6b75e57c4a15b90cd31211ba49fc803974f243acb637b32fdb302d98edc644e43bd26f1e8f4ecf8b4f591d2f5385831cd168c92ce9834d66a4c4f4feeb87c6d12afb7cce9743ba4ace4f91ece0734026960111137e3660eabb556dc01d1d73cab51bd77ab75db7af2c925753c3d341cc8e3b0987befb51bb6d9f609f254a01b73769d419feca00fc8c447f7504a296592e906327118d8243bc893248bcdc78f4a1aaef3c9ce03c56be0824a3dd94b3d5e6a52f2f1d86676df8e1b4f2472e9e77a0c14b42844445168b4285168444433a2a121a2d98c88683634848484848484848484848484848484848484848484848484848484848484848484848484d494d2a36eaf445019ff6abf8a384364fb159fafaedbfd153a8cf63f49ff020ee3d1ee3c88a032fe3974dca0363b64288db6c14146c3509b1d3c46f67fa131ee7d70c9fe658ada00d136fc4d74a4edb446025f571a0bdf7f870ef2496e91fd4f260e36d821063efc037145105d82ec6f1a22672fc8fe25a215646712a5a9005b041e16b967808321214090fb0343b44d2be910e8b0e3316bfa734794c286b4258202d4f34c2695ea2ba521e99cad8634a85948223281fdc643ee6f2c1eba5c87085922f7b8a6b778cd22d4736e3709c02452c06eb2d08166fa4992ecc040416b661229fec6ff0aa94f5f8812fd4832fd21d524d2a6108e9a94ca6c02c8e264d92f52737d9a37d3c935a9d7406fc882654d1eb8dc2f84cbf5abe9c44d4a6f74122aa463a9cca530fade4420a5e188bb779d69c69905ee411ce67e045623089197d80f82db7df1392ec5f2fd5f694ad3ca4947db70f2062fd3128c48902566e39fb4567a203cd6ed501a2b6cfcfefeb154fa2e954adc3466fc97c736f7f2f87ee4861b5a3384cab44d906fe9c7a1c48253f8020ef347e1085098ff0a66c009ffd0668fd26fef3fe44810d22c7de3d2fff8fefdde573187eece2245c2874ffac5109bb7ee7ab52492ceb9d6ab01f8ae56f9afb3b6583a9b2f812fd84c0e1d334e8576f0c169fac67decc0a1fad8016bbdb2c36af8bb7fc3ba1d34f8fbcff8d3243c16fee5e50a2f2e2e567071b98e5cad56155a2c161558abd514562ad51455594aa16c6989420b0bcb172ca994510a8582026a65e5092ba793134e269314134936812c9598501a472f46512c12c3700921082a01fcbe247c9e17c5eb3a24741c77046eab7d7f078fdd7aff87fafe3bf8fd03d47adf00ee9eeffbb0435f6abbf0e5a21290de500b725e90ded017472d0064da85cf145907b9f2a7db8efcd32bd9887f92e19f2cdf9f2d2ad79f2e36f7cf07b790cad45fc122b551ff844b1456ff62d34aae4fa25872fd7195eb8bac5c3f74e52af3992f2ad3e17c76b806fea73233fccb0b8d1717971817970be66ab566b4582c19acd52ac64aa57aa9ca12a66c69315b5858304b2af52914ea05b5b2e2b2723ab94e2653cb44922cb2545a95c651358a622986614b08822ce0f7a53e2fd7958ecbf5c46db9d69bfd4bb4c652199bfdc75a455ad31cf69cb9a6b68e4d6570ee87b4e67e6d2ad3d4474a65ce9c90f4d2c7059943e78fac29d06ddb3c14390c44a927d9718952921da7f24ad2941351762c9a7cb2e35506b7d062324949a94a763ce6110c455e68b10805876060921db76030293b6665300c2dfe9e64c7a50c8aa1c51ecf185a2a842a76b263320f3dc98ec5fc8524d9f167f0145a6c8fb263540657428beb2c3b2e33880a2d762f34f1824e76dcca204b68714b188eb26355065b684b399e39b32a53b26353cea96d5550624295da05d10bac26ef2b4d5751ff84c9a88c7dc1de1a91fe2519482f50fa18a04f2badf4cb1c34345f636aac0785d53fc31be3e1b0aefbea450f1a6b295f9641419c90ed4fa1cb42b65eb0b25aa37c65fbf6ec1f5a29b3ad03aa0a924263ed058d556b9e9e9d684014c2ff4816e6b9fd1519e0cff1d8cc9347b6df4d7d94d9e84301485f679579f7b67bc7b93f7bc78bf9a5347eef5b5ae3fd7db0d3e1beef549ade712a68aca9a0307f6fd3655426bb129751c1f5ce8ec39c46d21a73fa4e76f3f42a488c0a1dd65596029a6baca5f8eccecec70b9e5c331df222049913b72d777f6f05fa09926d7fd61f99c7ec128f5d1ed956dab6b779dba0288551bfbf05e4e96dbb96d11aefbd7662334f100f69d9914ca44f243a990897b76f7c22c95bde2a1752a7e180b8a9bfc3395c97780c13b3ca9cfa08488fd2b88cc6b8e7b2aee9eff03072e8302ac3d1487ad3b50c6789c32c185a1167db5a275feeb328c2d526b567c3d5a7fe64ffda03e4029082bbe1debffe0479ecc76374e372f71e2652730edd0b29f1f09ec9893c6cdf99a613ceac674eeebeb8753258c38aa9a883bb4c2693c9b283620ece15813c5b76565976d9128fd9fed849a4fa57d9c56448d6d08a4ed48470185a42510f1541493f310404222e80bc44954afe049943637186d6f6186aa0b987223cf981bb814fce278a3ecd01032adc4f47859cb60df7a75fafd26ae4b0b61eaef962279f518d29aa15099d64976f170e2192fbdd95fbcf3a05bfd4f48a7479fb2a54696a5147394cdbc6ad45feb98bca22cf20edea7602269033301d30580d1af3be4c5b6da38e34c67d0543fc14d638f8681bafb6d1b17dbe6d03f3c7817e91ebb3c21f28acfe47679feb7bf8a45c7dd476d2192afc3a6c02d2d7c6b325257559470d0c73985b8ee32eb6cf611e42eee5de6221f7decbdd5ab77beb67988c1cdb9a82babbdbacdd4ea793fbc61a65fa67977368e5cdb4410ef37abb4b6fa6a6a8646b5b6b7ad8a19901000000a316000028100e0984224992045126aaf614800e6ec04a60522bc9f21c466110320a21638c012220020320038301045c472259a6b3223f689a1aa8ee1b43dcbc98c174d32b4bdc73c06c95db927f6c8b5488043e796f97c0e053715b444ae665d467b78ff3bd8ed2121b805c788a45586b9aea948f39ca397c25e72784f5becfd38a2f8ea053dbe34a83d40242a6758b71c8bacb12a1c46023dcf08c5cfcb4710bc0e06ea9403b6533aae86a95033885a0c93915a1e677e76f6d1c4803726b89eadee08614cf9698d66c8f37f3104888e1f3114e64f6c5233e5bdfff40a626cf801853ebe9ed31814692d9abfdf40c07ffadc7fd5f6164548f2c21f39201c3066267b906c19bebf9eadf79770ea0c7410a5bbfd6fb6863d0f62f2122c1dee496289d698875dac7f9fd07035f1f78aeaef5be2da75aa4ff22e036bc0f52cc5c42e4776af4c4eb17fc5fd3f84586c4028c62561e6bd33f78eb51df69b2e5f24bc55c305df57ec282cd031509650db442027dfecb83386635473fb6f7303f1bfefaa40dc464368be873bea87292c9679b67ce0ea07d2e6e36637d4075c4cb8ab5414a24a6da44a0e493c5262ffb184419a1a1472f7c0924682044dd0802aa32924e2613fdb62114b69d7159371d8c9a5e778bb66a33e8b0452585ab98d3fddeaf5526130f6df104372db90aee8868168508caaf6f6ff013034ca60c4954ff229f9205bad10084ee5aa4448486aa308d4c3cecfe7159a425c7849c074dd1ac9050f48d4b5a3fed1ba0d7aa3aebb2a8958f109e25b6c2194dd70e2e25a2e730d3add7cb9b92c906fc27f35c66460848246419829fd22bb5f30418473a578f46a628ac0229280f317d6c0dcb1a963ae22e9d97e14698383b4aa2c41a543d0725082776b77f1307f76b2f6e9195368a615d82a6010bb8ccd41db614f0c9134367b3d9bfa4b48ab6a81b3bd9dca25083745359cfd494ea5772d59dcd7a37c59eaf2c68bb11928489ec7df4068c89491a4107323236be7c0cd0469ec8d49b8e72a6803e6804035d3028dffe84a20b0c790d32eaa4a1f8672c2ee6498f5f0b0d4733836655c38f1ac790fbfcf7a8cacf09c5d33194663ae1e84c660f34f429905c04a8a5b3ac1a662206f16ff290277fa6fd9287fc76cebc1871311454012c56f791362f2e5611d3c9c22ba2f74f68a61eed18824d6bdbb43341136529c872a00a3fbb841a5522062aff85639312c7e9e0bb003e08f2bd1f1cf1bb1da4f97f2ed6e0880a0847859114fcd4531fb2d0ed225b8d226fb12b4c10f4e10a8819244d5ebce205c4eb8ebfc1630e8346e355ac2b42b2d629c5cc563c17d63d6b1bc25fd7b0c0c0593fdf78e5957a98bcd5581820ee680ff98eae8ad42181b64009964e0a715a5cc7e49361d5362552421bb4d8bfa514ab94941279d2fbe6e4e0a2626804e8161709e6f32934a507b606fc1feeb39578842a2d05c88066e975140c732afb3b77c0a563e71ad471a1bd054b1d66d0bb734bf97b3427e320b327ef056e3b31b884943dc19099023803695334a083504b1ba0e73f6d6420830576ffa5e3973e4589f6e2ba0c43dca1edb844bd0ecf7b657beea31fb20cf39ebc257528ac1ad3422775b80c24ef4548d1c7994a9a50bc0c920a14e4266b83ad120c18c35d09e146421a5816cdbf65d8160b3c5c5e6a8edeac47cc79f0078a22dd33ec6de3888b7df9c154e75e4a87096789ac332a153d0a76f783b661f9aa0a0918fb9d64276eea05e434f00ca6320afdb89045f1bc3c7a70294205903012e79bcbf7f4b2d6da1b5741ad1739a40a602dad0e9f049f36e2ba970680926040aa3516ce825baecc9d2176e3deff8c2ebc7bec47a3981dd5adf3d29b41c6dbe89283c411296e744776c38bf8a00dbf8dd046225fe262a9c0b03b48ea65f6b62340e904eec77e4cd48d48e4313dddb6f818f60907cdec6cfb69accbdeaa8c13a7c9418aa3445469307014a16b7a4b72cc695fe4eb7f5093f66d227d557e57303c362bd62200df168f3c9bf55fd5fe59b194ae07a5a77c176f1e6110fe11166f5ab7f474f65ecf155d992122efdbf1175c03467bd92af37eea4addb653ed1eb06d73e529e5892a32504cffc8c6c7a78d3a242192d53dc8574d3aa8c69cad5974a4ef01f736a921a13cda98385a76532fe670ebc518eb03cb203d959efc168ef357e6f398ab27643e6079d731a72162fe04d61ce499ebed93be924b326c58195592e980871d1bba9b0d7a175c0d286f9334968abb57f998b4e10985420ff0b158245e8cc99d5b34c957b4b14786a7a75127ccdac243dc3b07171c93e71886a300b4cd831ceb7075d907442a06409b7e8b926d14ecddc8c894a1d3e34c8cde09c90578501ef4890e370c1a64e7fabbf9b16c3a0d8dbdd2c060b93c0d4082fcde6483946a570f3549bf9dd4308276375ab3c234986411d284cae3695e0fc5490efe2884a0dea55c3513d18f513387a54df325f615f8371914b2d56821c34988ecc05ae98a959b00ddb2ac36765e2afa0220722d44758fedf71d863bbd8c69017ba656b45dd6be5b9de9c548d44c151079e4f60f14260b43e1b00197639a04cff8ab019943c8e341bfb8a8ab54ae51059d4dbf69459a9da17ed839f02bac3106f12476f3f213d723156ef70afe186967d3ad86888a528162c61f031ffc1275dee2b562c203060a1a9b01e4d32a96b7c7276e29876a9fcdb27b252746030a645631b6a4c6ae2ebf6c731f9fbc5d8aa1756aec6af9cb36bdeb17174e402a919c1c0f60a0aec1fbc04c3c5c8a81652aec0ad94b36f5d1c4cde518d953c3af925eb0e9f19d445b70b4c5c5f0b808b33297987497265b4521f6ecc0b84b3b1ef81cd2492610476bf98e00db8a643157213f7a96cfa0ffb0c1aae9f943f6e4ce7fb6f59773bc87eba79730ab08f567e560a0a1ed346755f88b2f2447226f37da8d24f6773b7cc0c2bb0d9414fb6ff7781337a47c640df51b3773d8a631a8d4718695bccdef11c146bee375e5ee7a9d39ed5021d3583e3794f6f85c7df246f5c42320da11b71dc688586e99b17a50b62fe8dc4ad073b8bdbaa5e5f66e90f2eb7335b7107fc963d3457be9156c59288aad9785e65abf41c1f0322076b9de00220ede14c74c9c56565f6e3f531c687e3aa07f7297bb9e9c4b1bedf4bb640c4b3ec320738de621c26ec9a28087466f6ebba4907f2d7081af139e8463ea56634068c1bdcde5c8d4d4d5dc5c135789ba9f64c3c5aef3bd549db80aba056bc15d5dab78b679df8f4fa365ecf284e09ac88eb107cf874e84b8f674180d1b138006c56e2c66629c83b83c1c8bdd1902d584c70ebbcc4ce33c434d4d3c8293d4c892e414eb6ecf77f85977e6c23cbf1166fc0d19c43cf9cab0efca6619795111983ff00111835685d534ed6c26452cb5cd74775e5f1cf862f53c31af4bfb9d2940ebe0f63aeea8147c806f7bf310f24ad5d9fff7adae3763add38f5dc6bce5a27ef4dbc9d8d3c4785682a65168d339a05ee8c1b5055708c1fa89c3a50a97810fa137acb00cddbb8f0961ea07620602dbdca41eef019092a536e37e0f13c5f99327927a04536d0e644ff0d1e62807cb6c6c486941609b82080a6bd61e9c3cdb87b97d79a0b33fea233177adf24de0ea2665d2a874b0d7a5b27fbfd9055ded8d635612a02bf92116daaf5c85c695d1d84017a19dc06666240443e0322b5c75961c9df006527dca7dd67951e38b15e36a1bd2a8cf04137daf55c5c439dd691e7b214aa3e40542042fb92101edd3dd02b7a5ba17562751305f81725c17dd68abb7b50fa9552a9d5683f6daf7bf3a18a5f10b6aacd9c17a36b83ea6b7ee6de1f949e3c13dbcc02fa50b1bcb675b6373a481fdbc9208d4bb4b9655f549a305a73d7b5daf794d3abbc4eca897467bedb677e84838101bd7d2c446523cb1b145a1afc1f50b5ebd088829fde6e9bbd8ebb5c21a15dafed2609e0fb25e4fa5aa5541e7734fc408bc1f1b8a450714775272534283d37a3f394de700c95970904e69415518c49882b28ccc314a5a4abe786962b4f199f9c275c75cdac965b43981d596ae04c428b2feb6c924c3d72f42cc1e214aeb41908dfada78558efc6dad7d5449f46ac2481086d231472ecb6764d59e8f3f3b87d8034816aafb00a64b1923de6acf3615e6aeecf490590a27f613836dab71625bcba3d9ada34b2ed31cba815322d13e4214f586dadaca45cf09664103dc8ae108def944c88ac1091b78631c02c58537f1e19e53255dd7fb31dfa50419a6a96c6fa5b2408c368aee2adf04d012e00e90178f1762ccd32e4b202c1239b2fa1113a6ba5f015ddcba9d0c98d1f64b24aad4c900136d7c64c05b3f3d31a1d587ccb8e8930324b2d94809b5fa74628eb70d3151d35f264869b121036afae8c0196fbf64a04a9fdef91d579d99d8f9a2858aa8ce50b6cd70b3477e62afaf1865e55e77e2587d4f1b279ee61353b7c2915f299c4964446da73d4a8eafbd0e5503051988069335c912332f6b470c07000b553df7e632fde542386368852bc722ed3808157ef6bde91697cebc9511c3d78f00aa01c402d0837c849b84932819549d28922eadfafae4f692934967beae96fa12047113cb9d679c616b35fe15d154f42cc697b0ee8dc4c15568bc7fb0fa2625899fe72bef7ed9d2661fde78d958632a589b5c80e69c16f099b5842afe6065582891a2ae00ef7cd141827bb6e821c18d5ffcc8e0ce773a2473678b1c92bcb1c50e49ead9e68b24777ed1a1931b5be8d04c8d6d7468f0c6373da0668527f378471220bfd3912667d253a64639a3e846b9cbed309329085a4bc3b7b31f472ff3781db60a9c6b4a5d7ee7a8ce3721f0ea07958a3b1904fc7eeb6c62c30e2a27fbf12bc3a30cbaee5bf1304a92313da04a90ee536718ddc3e3baf8a1bebcd3e9316bca91b115dbb5948cb2242048afe3804353545f23d66f8457c48bcdc13d38f6c9eef4c58d8b99981019e5d4fb7e9a34c6e18d7264e899d04f9f4264b58675f2f7c64ca95f74efddab03d4840c4550dc0e518c22f4013edb6e95b4c287922059abb71e344f46798c933bb75068c1d2fef12cefed4615f0e26c11c8245291a28467c41899a2466ac3974c6134facb3f3cfd8e72be99aea955a8ffb458ed420fbd28ff73908e2604a8df1fad376a9e5f9b9813e99b6a750f7a14ec97c877ac708699c84770a68f523f4352b39271d45dcfd71838c4c4b58e0f0c4f3305f5670797ac85e713ee6f567db7e52474fc247ee5a4056a3908c84bf2a2a7dd4cf6efa7552fc79e47ea07cdb49a653c683e20e7243d563a3b9fc54740f7aa420d665a0c4bd5a59eef9c6fc1085c9d1fea9c2180ccfc9066d7c2e7cdb878f479b006830842b1d90630af5e99b03c85542a48e69793a9dc592552991b5dcaf64eaa37d606f6e9b5c404ee2026c511cd85687c71d1aad99b2c94efa282e6e9dc0b117883c74723edfce1faeda07892e75057d419d938aac76fb015042f2b336ce3941f90f95922545cac72c1f5a0a2bfc0f0ea785b01b7a21f66028620f048a263508be309276b2dd9acbbb8fde9ed7d6b51cc754597a6e07275646554e89036f385147847dea008095294093ab789050060e78e2848170f0069f8e5fc3970ac8a637e870358189693804d9b83f4e6252dc0460efab493859620ed04311c0f1c0fd4a96f9232fd3f3689510e4c0ee332d6ff30290dc2ec7c90d5f51b398f0490c33ad0ff5d32eebd5538d539ed1b36b50e93ec1b167481b8a2059254a052c181b5305c851470af4249e18a63e2db5374fc5d42ce3f01a64dddf58502ebfbc4173829c5c44fffd479a1143cedd30797f30538bade745836cc7b0fccf53a1fac8dc5a02b30631309185e54a0bd530135885bf501b8d1f6c665636a325542f96030d451d9a6e2a311851fc5c02f48957e05503b71742535f299b099db3f6b4c238036251109e4902077a48f2223262c8f557ff89240a6bd02381ee24ad0ac2f75cfa2e65e2479a4cf66253777825549de86144b7eb3183ebe3dda803aae8f1d65cee6414891e1610018401ff62486ec59387d8820a2cc0006755143a16c32b3d0406aef98a4032fa20cdc6355a9e8c57774165d31bba71c6eb0a21ae8f9fcce0a282fef870096cb0d5614b8179021ba7582f82a3cce2e7fc2c268414349802cb43327b1b855b39a3f7eae091c187d6eb64c2808b48f3e9eb94f5c3500b03f275a8e2698bba402110d73010feb4429a85db53f25e63a1c9994b540b8c2ec2185df0884c4042799b28bcce1c48d9cf430ae3b4ca52368b07ebc23a9262f37fd4bd347e7c54a0180a40902fc725b54eba547d31a7621f4b4df26a9ba6a50118761aa85e699ad7ae6d03abad0eb7c333c2e7f518397891085edb3233992bd100d3020e0e7ff41bfaa75d85d86e069490201896fc6fa0541437b5a42d09c422ae878e4c04c925cd300b4461968557e97560edbd08f3a6be690d9598bb5463575781d2c6ae0981bcb9e0be100ff83b7db39be26f9c35a78ac79b55fe3fa4985fcd37667ca5e68dea5d38ea0fc35ee028cb02e0b202386ab1d90d411d8ed75c087bc8be33fe59128a04a0298ad4869a84642eb5d5e2bf2193644941c0034b6e0278b01ddae8884008126a8c275f6208083b11f39537b485ff1fe185dc49fc546baf99559b202e5e7264592949b4eb84c4b6a98dfd4fc650bbc73a805bfc77938db17b7a8562b51d7584fb7e73d5f4178db2c1900b40eabf3fc4577d5b02ef5c12fea9c9e55964d5757f729b21c6ff08cf6f0940ce88e52ac751af255391dda2d90149d6a7c9ae95bbac2bb578f7b0fd66aa9979d731d6ab013ab19b7cb37b77d9bf70b2dcba57dc9c25916779299e5d311ca72fcc07b595d1e8f80ea58ee74afba2a14a53ba262dda4480c00949e8f6d318409d4487c70ebcfe5711aa8b831ea90108bef8c5e70900f4af321dd35ce7f87cfef09962f48c27b91263d26e34e3f2e156c0964d40f8b0c360d0ff409fe8f5867349919e8c86a0b623c165448395a98f04a8deefde632e022a045e096edea07f23aaf728a64299b68d5dd5134ae28faae2a855ea0de68ca88a68f15e7c6cd32476fdc25a54eeb7b64edd5e0b617492c0b6e72f0e81c91fa43a128a063ad19ea7a1a22d77ec1d94689ccd6ba0ea68fcb317028b92bd6e3ac08ccf3c3b12ede479c366ef11cc81714742aa486a80f4fd240c6798cf4ee5371b3865c84759897c29876b273a6a3f61830df7d7ecee43cec5c2d0fd12f63a11c1cf5aa2690d13b1e5d6293293315d991555d8168f0ff82d67fd82612f96d5496b6fedcad9b4edb7b1c96daec73176daa625634d1610b96cb4c784f45a6b018571571b000352bda3ab088290b9c657bab88d95feb342b6c0bf2009a2401c835ab441c4be53a9bce9b78dcd6345296e1f1c8a4064556a798e59e895cc49d6c9872392d7ddcba7d70af7a6a25d763429ce63aa86730c73c93bf3117d62c0a631d23701d8c92ac7dc1c364a4ea83a95e4c65dee603c2f6aa59ae345a97c18a6c41f20f909eb6b2fca93867b64335811efb4c731333cb09c1cf34ac6534750972334b862933619ab4646b852733518a90f2b1869bbb6a7c46eb33320bf0268ba4050b735611bc85f082f232ca9f9e1c9765dad1a4758533f1ab902de3d0e6b051b2247eecfb36f3b752ff9bb4aec2714437ec5cda0b2d9a2ca615c9f77de5adb15b98d4aa34c3b9860dcdd4ed450000db9f85a743696a5ac5e1408ca2d2ebdbe01f2991ecf3488170050900b0f7c9de5b9ebc0cd8e91e416c4742b16c64249b2c88d657016e64c4cd054e69107797b4cf5145e1833d5680204ac2223490f6c2e538a8c972c2eaa0c3654f89fe627485891ebce2ac274e7c75a72a97c8ee6fffbfa790409557b22daefb57093f21345a63ab8d1d4ed4c586b8090256cc6c723bf80ba9a09700addf0e4f5415d93e83a06bec463bea3f6f22bc70bc912b07b5b6be58c4947a1867ead7e4fd1c407bcddfe338c5f26b602abf5ca6b948e0d1137548d41f50bda8d1c034fd017683e253a20862298b4705ca730c0afab96d08748a45b46ea34fec9d62214433778783ce13516b1b8bf312548d101cdac4c8789eca0166ef7d49156bdb217d4722d4ee2ce1a245ed830297f480c7325e6f52dd63cf00a740253ba4fdd10dc6eb549173d947fa32c97223d531b25bdfc45f859abe9e9d629d22ed2a680597607fe94d234839e5bda554038b5306beb79dc0777f20c47895d1f2a2f396ceffde155d15a4e11b65945416b119fc844f51bee8c9dcdd9e54d04caa3b5949b2ce3453045e9ece608a2496259725a11b414926cf805a3c5b481d78339e6d8a2253cc056426c6c38550cb5d11ccdfa7c804d20685b03d003d380e751fe76aef3b0f721d11ad8b0f2a0dc77da6a9c1474ba67a47e52a12b1d15b61e1d0aa9c3be73c7a2b12f25ccdb93307a4b7124aca52e3d83067759890f4d67442fcdf91a3b70c256eabeaa178ab86c24cfc4e691465e7c21eee75b1a4b702c55e9ed7aa3c3e083684686f04cf8781e83ad60a01aac704cf1e6c731e035a7ed73a7dca79a4a37d4f9db79edcb960d7792b2ff04c11a001c286aa0b8cc475ecfb8062fcaf9050c21ba791449306d8db5461a622a82c63f10c4cd146baae9e3b5703049e7f2cb1fe018ee481047470a5480393ee14343d7ef669686b2a78fa91d9e1b871d16d633daca5d4b80ec5223fcc7e5906c3d8e1229e5646299db609cc488373846847a4a2ded5682a90fa959fd972cd6bc5ea87941a548ba4858439450311e8747228131eace79f6bb8fe5771174de71f765ca89e10abe3a27847aecb9344b4b42f07219d4dae1037020b19362e35713e0a8abb0a51a6d6d660b8abfdaad2a2c75d6a547268f8ba6c9e0db18d3e0718175d1726b10c2001bcfe0263714de15317c43014616cacb39fd6b16b28023a4cf255f28628063a14c58e547f7fd1da01d0d1980da4420dafecc2206efa22874723d8e95ba27152708cc0aa4ef9220f9aae1caf1ae350d52d49fb813e15683af40b0104353e50d8e3891525167587104914cca9df6145fc0dad103843c2eafd16e87b0a4b223dff68cccae0ff0529d64696af9ecd41387fe2ed90fda3fd8f40db1ae293d28d668f2a78922d45cc6a455ea81b1dff437f02c4c08a6db0ad98de2b5310bfedf9adec859edd33238a0e9534ab2506baee47dc9e4146a3b68d84de13f9c8da0acca07d251f6741254c71416a6b7933595fa4998103950456062bb30fdca5c1684a0aebca4142668bb2cd568deb59f415bf75c60f61c9178b0af11af1a4c57161cb23a83db57680a4923e36a64d26fce656c84b861dcdee423166680b2f0e0a1a9f0f277f5a28783e06d19ddcaff0c58d520107d78552c359075be1333cd3148a50d78f7893cea7bb0ce84f9affb3b63c5fd7175cf8cff3efe9a2bd26c28bd3065897dc26f981fa5a72275ddb8ffb9202361133a666b3399b39cf965b6a635234e2d3484e0a184dae059cd521bbe673542f8cba9ddfa01fe76d5304139c690fa4228d5ba9458458fc68bd80448410e8ddbafb41df56c17262f3dd07af48b975f731bdbe87914fa3af2f56371ffe133de68cd971da2fe2833a9a4bc5349b1ed9aceb65916379da31ae13d8d730a8291a47e36ad4e2b9518ac12bf0bf3982b50d19ff5a7298c1ae8c1aafa5ea1e13698d22be603c2e4d92996cad7f716ec3322aa38e63ddcc36de2d0d94a6785123d1086281a9cc0b8d77b9a26354cce3b5ed97eba3b691867f5f31cf05c460a8c2db03fec210fc31b1307dd4c4fa844b69b4c2146b1a026902a5d1b23321f3aaf77ea5ee8e1754325112b5a3f993f63188c31ecb6d2a52199f64a4591a225d9c822bbb0512b7081660dddcb766cb8ec7a72b57f3c9f9b3b5f58a100121846831ec41bcc8111948d780d5f6f5ac810c82754792e5fb06ac89f3c2c7e595f77e66c9dcfb4e878baad074bc6121295017fdeb7d6aeba2b3cff1a28b5000dbe5175ff5491d6fc5a858791803d2ee2f4a12c5366c4046758251297aab0fbf5e18f0ff36b5ae5f0b3ec514f8f25e0cf415965b8b1f722886ac9800ddda283555c71d9b0741cb4af5296c7dcef22f65cd342fcf5bf285bc55232fd5e267322f96b2c6767a9f89fcbdcf09bf8c535c204ef4937750c3c35791f1234ceb6462559278cd65741764a00ba51035eef6ead00e316e2080bdf6290320fc47fee7e29fcc874bc6bec41b9e02ed0f87116a8c506a6b6bea5da99446676cd343cd67fd88709211d5ec2b57fbbc169f18c3df2eb1dce9fe1ea101c5497efa79ad7a744aba64a9cd88fb81e27d35efddcb2ff37ec4d09eca5a234152a28b2e79e83b83519882802de16c14558cc9657cd0528292504bb50c0b344c50ba69ff2bfb0269638665128a53949aa114edf4f3cb8a8a4b6ea46c22e4bad9654b9a537982fe709c10fd774db01529c48cc1b260b50a62288bd9c0405bfd44878d2d3c3991429f89af9ebb9fa836b707994b22713786ae4d4f0cf09b3a3debc87422411815a027aa7152ff50a8c12c111b91218c5a54a45ac9c3fbfffb3a1172be1d6c67e92f16dc2875bdf064b3c08e6ba5e3785ce07b49f0f220349d686abe6935f0e9127a686d435cac11f7211d0b68f2f19331635681b073488bf45e4db91918386639a0b6544a14fb3295e0e35a4dfccd6e8dd3944ff7ec6e9c7226bde7928367f51c6f6d854cc1f480ea8d9c1f9af4ef275e6398584b08c174154c5797f4643d96964f8d1baf2509dff4a55b6f72b7bafaf40c79bd554541815fe323837c761c286697c930d4b784a2165cb1159344b5de077217a59e3d9790331e1634819214f535b1e8a5b90ef120874af95985acc887125151ec19222911b188d87db9d3bd58079c62e0946c961c5353dd66dca6f34c6aa75e77abe88b938a0c392a4f5f482d8b5aeda8eaf7d4d75b1483e28ff0894e25b6c2eed65860861e321ab3251e50fbc64ae0a24227beda4cc6ad6c05db5810420be8ba7e3b87aac42c71ae658947c29e19d4a2e845ed158e584b366e45c3ad04965f32ceed29f62cab57d1fcc38e738369ad1cd1dc2d7bfc3ccc88677c7438fad0a648bef013194a30d015e991be15ac4485f8959591f815caa1e6f46adcf2bfd48eaf9b8a6b22e72f326dc20dd671bc9fa6b5ddf23fab35805b941f16036c618e518be4a02a99cdb4bce62c64396033c59ce5e73a1a63622ecef6ab049b9cb0afe2a8900354415fabbdda34e6ceeb798d8098180560b8a6ed8dc04eb42f05b15d6ac66ac9c5bb29808fc971bdd0b9b144a7e214095d21d30e98e5f8e03c983c7ee20e1c34a0a6752c9e48d06ac4f810e5f7dce29bc464e5922657f4619e51ca520e3dc6648ec4f17d68405931197abf862b3ef0b5f8917e8692fc04beefca7f488946fdf5723ac816f884b8c07f55cad6882fd12c95f7b3e5bd68861000035fa2cad7b3d7053e1ff102df06d67f1b63dfdfe29b0022ac000214ac96953ecc2efaf93a2d1c67d98b9d786be6ce6bddb1f25445ecda3b660dc80a7402724964d900ec9c1184d8a76b027e5e0d1cfab8d2ab83651d84e67b73db9b41a14b52eb11edec739f61443b7a04cf88060b40fa2536aec091540a881d1b2c69afa954de94e1041ba0cc6ace372b84a942c81922e444bc1f5891dc7370e893e54aee71c4dcb81ffa949bb14b1b3112649ab11e90c1820c9e0907166592708cdd64a9908af3c761cfb17e927cbaca425723768537f9fa1454f38ee86b8d28b601fd67f5401cf64aec9e5cf18870bbb4f702e28a93016582c5dbbf0b865748db88075b6e6162c23760630fabbbd1c43138ec8dd14b5669ad35f0ff8badbfe003bae02c5200ae5062646e1c15827d7f0a59d851fc5252e327efad872f76e4275c04889bbd0c00af9198b3b1ba5e8d85da763e4fc9272831e47af140bdec4883e1047c411e093db9df66a3719e8ee43606e8c023614646b3382e47bd6001e15a745375ae5242fa5d1b3b7297b40278109e81f5017c4f068f8fa7238df30f983650dfd1d25550607ecf78aff2c02bc8c325dd3a4df12fb9f2fff56edd2c0d63a44caf6170341cafedb8bfa49cebc50b45199dfc7c332babe0712d5083c12014fa724f4f38bbc699799ef3b91d2df73f645fdd9bb78166bd41915a9e41b21eab3a2a6c424cbbac4b6062b7cc17bc47bd331d8987e034533ed572f22792de11f18e8b56eaa2472dede3eae530abf1fa3ec6e923caa059dc35dd15a901a831577540b4585614bfaba6d386476e68755392fc13c9cff769f6150eadbe3d2d444ab6357cd17c5e5770b6427b7640129afdae529def057693618655ac4a3bb08656808b92045f486ace26ba9bf594e4bad6e1d85522f857a3e21a2571298ff3563885564c4ce37cc333a6effc736bdf8a9d288a8d618494fd2e11ba74da89f078ffa9ca7c43cf033f1b250db47b8a931d11af8416dc41ac39a5f71bc9e8511c05f8a39cbda10c7d70fbe60d551735ed04d98f6dcf192939ee4cc34ae8884cca2f7ca33e9ce434fd67f123f726dbc81500ea9992ef39bb8d20a59b0a81d6ac19f73b14d02283c02be2d5f789c035d97e38b9e0409742d8ceead448aa25fa4c5682165ad3a40cfa215e6c2159c5e72ac1a66221c8ca9810f070dfed004d00e5de0f40074170c236324c300480e2999c4e175dd91fee312ed45b4479043612d39fde6b860cffe68f38023d424292d27cb222e8a154c74add1d915be2c00c79d4b63f5889ed7ca36f0022a05b8adfd8ce4da3910abb45c653c18b849190e4072f3a08a742bab9ae1e22484ee2a487e1743ffa2d3d9f11c60b1e2d6619a6ac85fa3200c328e0826313385bcae937404c67794c0838bded413f95573da44284bda432fdc57f1bb868ce5630169e8bf844630adfe631c6449af3362361bcef222217df4723e31bbab3d324cb32532bef31ec20c4dc8bd2f5f47774398bc0bf477fa10f1468ff88447716e824e2335ac93feeb4191e9f5a4d6a5a1e43764fee71be120255784578e21a5bb912e21640ecdc293bd26788bad08e18da595588ec125400a3de0693e18ab05db6a18667a7998a4786ba9607e7648f694cf687c7d0aa0f1979c05f9128aa484353f255885422e1e98c8c86741b1d4d880d67b4211aaa949a816fdad2aa70f5820c0d6de94cef38b11193b9501205a2dda1daa7108a8388afd169d9e164fb82e4777888207004f97a43658c7c320eb22d412d01e4553cd49ac416c6c69b1cea5ecc5261d4138a14c9b00fd9b3e4705612043454a14a2ea2b09891feaa70272263f0aefc5bc53bdcccc8fb918d004dba97a9d61d41d841888917a5eb69ef5d098f40fd53ae3006e61891df14161072aa409f2e8f15968c3ddabbb9f989877864a9125df13464977211ac4a57000e46ee73d90cd17c99a32e1db2a1d237e6ec542df9c492673956f1960813d6de24e0f449f8dd0700f7464e74af9f6442f28f4ec006181954df40be2c7270319a26c293f00d591005d4c41d4e2e22bae94f34fe078bc42d81bd2724cf16770a25665833262f0dec5aa92bba6d8e3144ac74f3159ba7e660d1305bde22295a1e6310c2661e2073ce1905740480a186624bd1e3f2cc19d1318de6ca14f6777291480fefb277fe0b6ef6c8fb78c38434e9be4c6d987b063b0831f3a2543de52d6e4e22d05101df51afe75892026518a1a04f024f344c8fb90de0f04e0c05034780c24806c140cb5670c39479671a356444d204913ec5b6ba487d35fa81b3ca68f87df7af657e1bdc33a4cf07436e5ac86540c8070f1a0597b77e2627ad6f01aafeaaec047072b91a725ea3307ddda04992d922d4611956450b3eca5833b649379c4e2ba58225a7ca9cb9e8b1a444cefbea1058e61263ec1dde1fb7d4ec9c817b9bf6f90501398fcf196c79ded14bf619fe43cc4d0c73fdd0f9213a04d6d9201e1df97da7616c4a2f60cd012fe16aecfea44d65b61cb7c77918789a34a9b58288755f9d7ae10e8f9440cb5694402d82de436e0907629051dbf2c10ab6f31b69018c017d297e8d85057102d96e3e3b45a11e9123305dd47016c57572679f8c46cf93b251b9050355689019f75effa253c517f19a1d439544480d08d1b2bc10316e813876a0dc00aac70f7e5d21166a11e6d32e2c5f396661c87f078818f113350fff736cdda30983506f9a8655cb7f84ba1eda833165af48ab516ca1b51c0151b4e2e31aee3c8bb0000a7515f4937a7342ed6367f01e846e01c3e865e6a8b4e9c18a0854e1156f9766a077b150a3699a493c95b3836c80938960a16c833290fbac97959156fac45feb4c8b606231537d23827ff981067442d67500757db26b543bbcfe4d99fb5d545cd35c3e9e898b5c91775df723d47c309f5771aa66f968e9bfa8e772880eb6c3fed304a8383506cfa316e66533cabc6b0fdc0142dfcf94ceb051020e61225e661166950cbe639a3f6ddd3b465098b66e801e096c11eaf00c2ba2051f346b92f90265e77522b93080308d13348860c19cd1bc81118fa6b455c28c24228801078030648a1213a1524da192b001083a1203a90fc212d28247897380187ccc03b44511882446094098d5200963a2afcd5cc2c9c8247c689a9d871c1d96506c0292909c649a154180f20091c8f6c3db120e964823d8fa61946c466ff2227864fa72fd128ffb5604cb2193419aee0008822617eadc41681f4d9d8a40f68786d54aaf652ff191c10158265c44386042b1f245187377e4e684800f5ed80325da31158b47bc00024883f27892762fb68212083048b720f3fa9033d130dcba4104103fd16175474eb77b24fd14884ed3e86ab10f94df1cda41889917a5eb29ef8e2a24021d1540a2315779164b81084452a44b24a709440fafd3fb62aef519c61bae861adb9d568d00495bf171f564cadadf20102f795a9e75c08739160d3831a889392803f021525071552dcc7e60d6f460c7a1e7760c78aece5f4632edb24687a05521bf7286b5861df8046286f92cc3582b2039f4013be4099828844f371156222a5056d788075df5a48378025f50228941161179df17b9a7edcafd36b99728e497a93144cb096df2a9d0895baa97c39008becf687c172fbc17fd4c0ea3c17ec06a22bd9204e827c612f3c46eb84fe689ecb2e26e28652d08b585314694897df2ebd0c97baa16e39928cc3f83c193eae913234e2c2744cc5dfb88b4a7170767f23b9036ca971baaad213d59433cd387fd3cb9336af478c654ce3a25e61023c225fb35ab64f01dd3fced1387e211852e5f4d98e256b7394236ba7e47b7969cef5138dd33920b263571d3d06c4058c32e77d16cde695e2e12560975c9b2370b04a4b8759a5edd6517f74de2ab3317ddc0362b76392bd414c915c6f8953399fada155c6a7e867af9668818ec00722f8b731119d2520b3b4fdff40c12f0db1f62197e060d24439366e4a045f95223ec16446e110766b451dbfac10ab6f31889018c016d297e8b6144527f838c878217636a854d32d47907671bebc658a3c84f571f4f63a933d28e5fba5115e40284e4f3547554b8ef00773396440927e40531418f2f37370cd37baca87670cfdc379a0c04fa2112cd07531ce5e3b38834e45114fcbdb7765e8e645181fd28cda02ef646b5cd273a0831f1a2743dedbdaf781e818eccd2d4c7901710237a54230afaa4f15454e3cb75f65e9843838e10496b1cec76511502a15585df850da788aa984c208dc9e49475b0759857df85b5f1215bc452f488bc910cbc121a2905bc15514d9cd883d7505b90cb3cdea205ce011f340157bb6b1ea061adfa93e3599257770d22554a005aab9aa866b01029ab467e55f3e4f5125a5a6f6182a2e9d796d59339bb29f19d966dcb9ce24f4b2d4c209ebf2f9c57c794acc814f312b41c0a04a20124d30b873ba8bcc2597b0a885635c23b33e795d02e61651777e6a5295afc5fd460f813d1ae8641b4acd561105dbef7f84d44126438a5959cf6428b8ae163a94b9888e0d7bcb40ea8263cab8e5c865ff587627fef598450943480cef617741f450f9eed3ff4436e28570a3f57d973e5653228800ef6f7fed36844d94070cbf1d0f0d9fc3d346d6f2344032a0d36079dd49907c212a773eb24ebb042856804a4011d2ba0587d89b66bfe0576a12c27c6019a953f4b18e2fb0e31cde628faf25e42ad84abb1e040ad40b8444c4c11dbf726701f498295c7ed3e05ec49f0b17fba802a0848c1133be3ba07be047f1bc445aca87bbaa4b5c21fed01e3d02e12dbe4eb8ca8ff453163231690c11fec3e1a512995be77ebb73f92f1db96cf59722f310b3aa0bc8f98b28187abe9067421514724f6749b24564da47fb4449d8b93f327d94027839a487b3ed13d3c31a8411d4e9dee8999af8e9c19eac01dccc47ce806e6d3aaa5a80b6790227701048141332cc13b71b79dad3dc516d51b7b08cf54a61e2cc9046e3f323bd81b7169e27fd525f844df6a87358892caa57fea2671237434144c611115d96de7420d7d858e04be48f135a55fae544e2c05ae3267987f0091d1a51c9c89791081282e0d15e070762bb5857d3c248a01a9a9c2117b97e848c6e473a75270e7123237191d191db2d8592975cacbdad9a9e887698a94750bbf737ace728008d7d7beea67850528a3285a5ba7518012d822d4611156450b3ecb5833cc460ace876ced1596a322ef86e8a2b46483f37317692098cb606f833b1fd4f68cbadbe0be861d08932c60abcc6c40d1b0b9cac3f9267f62f0c070f63ac59150e7872ab6129a7b53c24e31095f32d4ccdb88ba2ed675daa6a912456c4a906ebee0e06a64b8acc7727a9dfcebe9caee64b466e5eb37a2de59da903ab5e50f0baab668ddcff4c340fa671b6238c87db1d7429dba01dcc09fbf0b34cb35825727c3653d96ba55dc844073583f9d008c9346a8c9cc8fd878e479fd891db080ecd2ed7b5fea47ae1fd88ca2485ac85f4472cae52798f169670a2835ab6bb50cde316d80599ad13db474ce58703de6a2bcde45c983d96638bd9641b7c25ecc1b287d40549529450553cc110156edb2d4643674c5ba70a67a9c59a224e2612edcda594463d28d5115a2a8109c6b1a420e13baedc5c6236c93005a26c1cd994c996516e5693fdc76259dd21c334065ac93a23592d2b3e79ab44fe8089cccd7ad2a83774c13609737ba472d9daec79ccfc7bbe8f2286a70d32baa746b8cd3a484d2070416eab8837a2243347cf2af83cacdadd6ff43575997692a8bd0485394c4116fbc62c828f0ef86203310a26db1811308715689b95b3d880adff0f92a01833a0cf8bc689a27e8baebf38510013ed310cde2a12f132bdcfeba9f1e591032ace6782c248928c93034828de41b4d2301d8e26bff153330c6507a7a798f6739b8173ffc8773e1ea85ec06884ec7f2285ad4b037e14266ac9985df11ce6a70a11e9c58770582f3c774c46b3c074bcc23d80e310a6ea6377d2338325de6128c3fa5a2873bf33b298885ed74a3becc5e275b0fb5f02037ef4a93bbd0e3ea8e3b948b166a4dfa8c751b97db24a97dcf1beb22c45c7e4f0c6b678c023d9abebcae9c9ebb7fd427d9c310c4320e77f021d99fa647211408bf9e40679828d3d8fca614e2aefb991e668abd21123e67ac727b20a66f9627da7f2919e067430a0da6b3b191e90655650fcad1ff69f1d3f61833a291785b29832b5fc46e84e7208291b968764d9a81d793d580853f7e57480337ef455861632d60df21721de1a36753b543034580cb80371a1ba14c750e577178badc49a61419d051b6bd27d2837c6c71731a9a1690aa545bdef64b81f57e228a7b40f51c8014e14f21211f9aad99b1e7d5358e69e77158f4bb2debce12bf25384e40b3ac5412d95259d2becdca429b2de4cb38458dcdac9ef385550c44d0a9fb0a1134e50f02f9f46d1e20283fe9d9dfc0101f481ed55be65315457370a37c3e2fc97fff061208a2701e8e048366abced0b9e9c83472cac9c8ce4c1cbc19c18b4b181f7140d80d098537b258b3088545ebf3f1c99cd3b557214847490847c5229070a1ad175502b9741c0d1eaf705ce7b7c8fa3ddf5215cf8c758b547d306332679072afcad139ed53c0103cb5181812df38c2490a976707ecaeb72c36e396530fc30a39da38096df5fe27d50b5efb3d40b59b621a182f6630255a920ce03dee5e2cf71400d36b7022191485f09232c838fa221817c3f3ae51b591a27ef544c901125fbfdafe238a943ca4c48b010ae42291d2fb7b33065c865c0126349cb94bbf89246a124c6d1c66fb167a21ad1d87a93359ffcb5cf8a71dcd8e6ec57483bc70255a39f567e3dc00180ba726620f17efb2c8f50b19abfd03cb38479ec366a32e08d3bfa1b24eced026b1c0dcaff12c7ce96dc43852dba745e1a6ad208f75c8d514f4d82b7c2003efa4971ad0c968a974615b0ce1d12147a4f03daf1bb0be38bd0360e4ca8c84cda98268cbad958ebcfae20d2d29d1edbfe412310b8d68f06b89504ab0909fd930611c9ff6b6fa2837205010300734f5844e40a5d96875e28ac0144e8d4ba6a6acbf1fd5fc2b383d6c28cb31ab14b1fb38073d283122416ce6b202255817a5dbe9314163d52a05b57d62b457de7ad95e535a6ea9deb9466a1de2cc61c9adae3591ae424fca097e5ab0906c62726a9004a6883269cafd54ff68179ae169fe18096ea430d6298a05faae4054c36b357ba6df9016305ea87bad22336fe85d43eaf9420ef5910f8cda3fb37b1c8c50872be282254390c2a1688c6c21e3c9a2b4c89aae927f9b0eea5ed15c88dcdabdb15ac836c3099c7a48ed425438c019a0e3291e4ba4203bc4cde181120038cbf3a6df0a3520614b216f8f22ef26040705edc9bcbe9c6279f70b25a1f00c8ffe1e94dc12f00a574a06725c988948b7e5ba0b081915ac3c5624889ae2c86cadcbe726f6592269330e3aa142f06c15f3a935ea330673fb99ef38191c52e51bd230c0a7cf2755e0b4b661cf1e4c8ee7224e2a98639188998a47a9b911b07070b3c207c27a3e2c6fb7733e049c3fbe071fe7bf1480eb699e3b0e06e54ccf1e5010a256151342687d934d3b10560af357753a98b6a3771c86492a84344bdd999da1b63c235ac426dcf27bc205dc040136b43c6ee22cc4c8b4058945f6827e67e3f0652ec963788ab0dd7097dcea37843722a89ce7e3cc7543a850520db169909afe48cc1c10d716c6b09fc8086ecafac47c23dd2dfbba27316a64a64abab3955aabce7d72a92b1cc226ff643eb3b413ba99ea9bac3b131b3da7b3d453ef9720726eddffa92e1ab31bc81f5a04a41ad93312339e58ac328c8280d0532a337bcd0675969f62cda2e849f144d077ad87de4435742f36a1a24ae8aee9a0db52417fb1067a800ae82aea9f2b70d4cff544cfdb5d4103c5ccda8f068e39fd876d7a00355da599ae214cd7764b6f054bf74ba51b664911142ee90d4ed012a061b2e70cb8350d84061e3a507a81d06bb99c31e254033d0003ba3ed23c5b37a5cff594301a9df2d5a0e77063d7cc30889307279d9f21674baed820ee45289c4b7575f33c1d07f0bedd946a4a58658eed076740a7a257599707e8dcbf4711590fd0f758bf55afb13e8ad59d9850790bb85ff8d20aeb5e1c08e4fe2cddb9468bfd925d111974599ff09876c410169872e6a3a44d427571f5a23474d5a117cc1a5cdd05135cbdc633393a52363a70ab57689b32b782aee56e664217738f01ac4529abd18250c8215c557734480efb6d5d76996e091a7d4abb8499f463e9bd8be81bec26834592f59f7ac390314edac00aa07a38770747af6a0716d925a131cbb4997a6d88404766a4f5ef2db1c718c0af3c712522a0c6d1540ad4c826fbe0c0f34cf074a744651c987ae7dbddc81c4ab11620e32886a062ec76501b95942d2d14108e0cc22f8eb4305383d49219471118b9ffb72bde0a8ed33fb445b8350e7f5427308d1a450731c9b6c31c39dc9572ee1aa1b8e3ab3953cedb5bee506bb71f37bd0440f44a8593fe3b3035ac52ffda1adbab8e3d4715b4cf19b133879d944072ed268ee95995b6d083b3a4acd4087ce371b7703d9b3df6599195e343cb1d7232279a5e86fddca4e8fc82b61c2131ecc469373c56789b96967e835063c7d70c27a5adb5b77cb9321e5e2159f3902cc22bcb13ae4bd5abdecdab0fd079dfb0a356af3869ba38fb31bdeb105bc8de942e6d47543ec2da89f20ae1a795e31559d203175cf3262c0ee6f8239cb2dbf98a7b6a0c5e26f0fb8eb00aa2c43aa3a99e1262931197320b653c0d8c4e54a9c8a29b9511dd952cea5e8e5e445e694469d40c47000a943464d3ee4b402b7baed14fc7cfc922d73a4355e5461f8cb31301ad08d805a141d0808dbddef27fc5ae6bd8b076b59240f25a49714bd75c44e60b0121e1a32b4360c52a705543605e0bd57502e13148dad17ba722d11d080acdd53ac583c98e85bf5efdfcf58730c10b7cbf0fc99f1fe4161bc7ec9bee519d13f4289f3f35b995836ad22b409cd8ffefced8e7791b5463b3aa5c20135b1f91f3894d99ea23869a1a50772a3a494c2429ac80a16c02dc01dae1a48ea6a0b09377e8a68ac169a80233bae48baefaa7ac2a46b763fa0a223f3c6bd9c7a1d412f6af83a3c58c8cdacc950d1ef0a3f88e9caae61c3183f3847bdef9b9d89747c5ce9845e9c452b1dcd0a719826ae03c7370338303d83697d51776823a681e2f1f1cebe57730f9e0f4af1b4d3ba7c1d1833213500e56792f0c68ab0239c42eb4b63738465509309b8058ffc7f8f0dcb89304ce5f03d7720cce0e3b9e76851483c3fc9a867aa546d5ceb92038e124acd59e950d0381a85ade30aee45b7a47e0949d05c7da6fc1e5f09e57c3c1e90dbb0f07e782452719374a0a5010c14984c139ffa5f62c9f6380baf7101081ef3482984db96ef03b9cf6eb4558bce11a961bbec254a8059ca9fc61b35f10615f72705a2ef2080dd555bc3d0a4b852da4ffe401bf73204a606784031d9c032deeca5365dbe0fd0cd71d0d69dcc30021a361b940181c152b3e4a347b4b5a3c837a284973bbe05f4665edbb8c8ab60409d7f8dec396a97a94e5a18585a967bab616e285fe304b3ca9e2259970a41b5fa4b9aba45e14a6155c9612752e1a0aa9c16a175c12bcc120532c2b9613ac09e5d121750218faeca9b2190ac14b7887d4ff56c05a54eba0738a6359ee5a28da3aa480de4b02c14273925f92084e57be7c5aba999e59ee95f03a5cca46eeb45baa29d8221edb6897ea0e110f618a306221d51f7b08e40cf87aabf1de0d1447db64cce4a1f97a88bc08d65ab989103db19578c5ac16e69005e36d2f35d7fdcbbd0cbb37b1e9edb76c67e49152042531c54c97060cb4ae7cb0c898f6a056251fac080829fe3f4cad78bea421f7dcba0fccd19b667560eb42a0d401aee5db74f50d8e318c7d06c599c7639518844d757187892413576a598a084eeb75adac7b086eef8b804a1ee3f728e335468f5a43176012c520314017a31e5a145ca521127cc71b5a7d5a36ea77cfdb5bbe5850212aeb2d4bb061fef02308012b45a5606b92f77ea04866444f4eb247a14884ca30acb568f0f5387e4fc6c9b1301c00ca8f28b1f7d0169214e64f342709bf6f6f995110275875d5bea6b5f18505d096c110cebef480e3f8c1c5abb99018f9222b42caa429ba436c3dbb94891c1902f4ec200f440df581107ddad47c090743a43930d1c7c7d36382d8dd9e9c67e55cb3a29a9028fdae2602de7933bafa5f80e7b19e33512b1e01c8813c30902b5bebbfd7ba03f05271ef86e04d0c927d29ba65219bc337e5716c09e3da03a43756462854c1e4c46b63026ff4cc50fc338a902976cfafdad63a9236d69b0f29f0d93668034f59950e8a8126c725c197a5191a68b2ae0c36a25cdd17cb4eb754f901727bb490fc99ab4812328bafa2dad27726d82590a749576c02dcfa52170df930e9cb3e1a1b17e83e52b14c90bb8ea4bc78f9862ba4017a6b4150506154174c310467b293bb773ab1eaf4140c05e5be380b9c16edbfc7408aff4e1f9df024862ee967134687a14795438195c848d9644f5bba4cb3ef078fc539a38694f3df8aab2243403381135d9688d6d617c29f8590282b12fabdb341049f4a19baf876d3ba55fe0ea90838d9d499406824fd02d7210a1bbf1ce946b0a704fef4f3fb22dbd0a282f24bd50c064019133c3f58575af581a5f8ef6ff14116afc91d1a3c1650fe82d5c96fe8cca29c4133b8fb66850359d69b7160a7236bdef6c851b8cdb1d798e51d88a143bbde84f299a9aee6a52ebed49593f70d25666dc2ffaf65e6572e0e6256b126d711487400a90c546650fb9d1be67794025b4b88870b5cb716aa871fa1387ee28f1c4225fdd3f8139dc58ad2c2a06cd749d77f4182528e5125981a1d77705a2a2e61255b7de248414f643268aa8c3096bb138e5f7329547a0c1eadf90d4854e46bf5819d76b52b8500b31420468dbb30f4232fc75619a1c172c14d63a618a6dcea342a2437569ebd190e90902e8016b7f61deb8a411cc7f3397d2a3ca39d2e19d2968840c29abde534e5e146c6a94c46360481fcc6680531948024ffa9e9c24ac625d300bc6c2d62af942d6f1a441c17172268891583c5f6d1a8f5223129d8345525f3a293e64690c126266ebc4e98dec33b9f30f365fadb410d529d4fbdf87450174ae5843241adbf8c766bce2a55a1dcdc6ea3255240a65239e1c876790580522094b3fd3fb1ac52e428dbf16d7df0a817f6e05b048ec7ddb40e87dfb4b1c92ce33bab8d7c73a31ba1313df4f865723445541b961cc23a056747809193d7022fe1c611e9d021b65f09b235cbe8598437563d059ade72cba8ee56264d678ca1b1836033e8277238fd6997006a9500335bb564e077ad8a97d612e424ecf071e3a806aae6453bbdc5217c73b18b6a8e2ecd16cd9ac17edd3d75b9efcf1607ae01bb990a58c9c301045d077d869c639a630cd0a497351d9f43325f1dce8e9378d512d81ef5b865e0399118b44a56973737edd21d8414e636d25cf2531f222c92a9beabf2b22aabbbd9fc54855172c87b26186faaf10007d451641030ae3960c4a611fdc5f5259af928df211b487dd386d792744e4e2e312d166159e3231902d1b3912e800ee9ce617291a2d81cc77de48c253bba2b82eaa3f8afc4b232fc4260289eb05fbcb97d67b196bfd07bf0aa159259699f5d014c84e5b4e672ade850c87588b082c78315c2412918bd986a88989c737e81ca4c25dcea4e0523bfcdb49d2d86e480d9f00d64ce2541e5d6b477ebab8da2fefe359185a5cd9f32858e389b25db7c28336d3ff5efa2058e813383401e159fc2cdf30bed9ca29b05d9bcb81f9b3d210c40916158800b0d639a63016fdf778248893be3b41eba1290806c51e87cbe02f04c2d111883f2f61ef3d43599685f019e00528514434609079a55ddb38e86ca81de581316d4e1737c06ac5f8bf843f7a28dc8e0801acd65ff2f13fc56401839543ec2ec3f343c99dc0d960126070404e394fd93e9715c0793468edeada66d03f7ddd356dc1a6986567a3fad40bfc164fffaef9b72c512ee879b4b134dc733da5ff960d071c70ad01088b7a486db745ad047a2f2fcb550850a9dfb3624c4407f4014112240b4b0e3055f31d86aaa70bce92c32c09d6c12a42e8e931621463050cffa2f8b9366963f81090b5584115f418001449ab406934f4320b9db5a9f6f509c1173c010e03293eefa198c821d3a908de23ea46f30c25d4e39089e751e9c14e40f0771e35e38e6c67f590e2aaae803cb7f7dfbcf1eec2c62d082b15d0d8bff4724fde657756bd0866b31fb07c3b958488dd45121893af9dbde13d9a4c5d0cd1cb7689f5b968cadb977b9351389a7f364e736b78fd717fdd30fdc4d1fe19fc8e056d59d6a794a18e2cddf9047176526f56c91d534282fbb22ea02018c9265f733fb31cf79368ce1848715d87588c6f6742c6fa60a113647f160d22c21947c05b91b9a20bf6a565fde0cb16fa9d29e99f0f812829cf39aedb1a979ad7802c3b593dfdc0569edb6e4ca64d93edb52d5642f99d79ed57e662f9c71d9b1ad13ae7e86b430e6b85a231355b494cf563e4584660aeb44cf7d25b3a60a8699534e2c57fd9d71909d187102e9a2f207e7c2146603206720ae1c1b43e226af1bffadb4702cf29e7589c6d6cd507d2449f95b80ec73d2e157bd57d6275851bff0305abc81b0c53e38d358f1eb83b8792854f37e18d38fdbe0a73b11c2202861c6aa2398e0be6c275d084a4a3b8eb13ef08ca9311dca1498dbcd5424fc1d2aab841bcd3df4405ef3f92e1254486f60825f4b27d4a47b83130f8000e4d8a5e9ad5e25d853e4712b8f7543ac9154f79d6463782c20eeb08052e53a32f2fea6cba5550c519032724e6a908cdb13c035f0f3493230583c6db7b949a383d8d6b365ef78c400a629e941f1be4750ff626c59e67093db851d3e4f6b9c8f60b024f075ef7de902a872d1fb6fbcf8a77aafa2b5ea730ecec49d0c746d069e56bacfb536d9f303b34af345a62dad7dbe4dd5f04c145e31cf9bd9defaee6cbb40537f0c2b607cd71c6125435af97d5ceb6eae7d4ffb4bf6068a0bfa3527a225b179360f14146363aa3c7ee8a4e0b520fe60c8afe809f2c2629a185a651af0046d84ba1e46adacc7353d0d5499d3f78e88504afca34bda60acaf26bb451932811a810a1686d49a2438926a7015236fc63543c1a346f3db0c85a995d4a5022c6907795ee7d98883612311aadada9bbcbb8118d13fd89fe9b0c619c871038be9d61bbb1444789904eefa20c2a88718f1cb9548aeb2770a644f27de1823857649f67b5141a720a845c3b3afa543f6710d1acced9e06846de5ae00aef6708928b5a2b1ac9b28dd5128f13c0a1cd7387ba5eddb1babfeaff34fbad6ffaee344c823d24d9e853e8fb25dc22511d9cc9d8174fbaf7e0f3f301b64d68a901611467469151ee0fd2f8c9b70004d2b796be6886d441c478dd9e754a674a8018c8b91c1e6a99072f12db9a8b84afa90a45b09c0198feba5a489da4403f626a2cb40c351182c831285d2e0b7a6e347dcca1516dbce3c2779695ba804fe15856906972482fe9d5323052233ef944a07cdcaf1ea74b627792507a3aa90126657f5fdcdf1c8e99c6f59be4ae2ef8f8f698129901b2c5e9cab76bc87b675430e1128949b3fcf44a99136cbe54feef90e12e0d65acd53cad18b93a9d93457736513a19a4102ce43bc64b7165cbf066e71a84d2ff835506d48ef2a8a1c8c9b860716faeee0fb97a4a6f57a10e10b8b6147ec75448e272cc92a4322e5c49c95b67aae1a629d592d87c16b2595f309dc1a6d063c241b5f3124ff47568e13759bdd903fddd138caa87289a3c5142e1aefa37d30d4de14d4cc246f464d5fb00984f1e0ad08a1ab351ac4bbd734ed595ec08f5b92013a46e6b11a11eab001a82125dbfaf30c584f4c0d0fb03d11632f00433271c26d20212d46c66c77e2f2cae6d2acff70413b824a3b676e6ea93748a28c28656021d8d989d7002d6edcaf1cad7895a596a09666d4976781576d7cabe1609d9c7b6e249eca52e3c8adaca0cd886db0b815bbf1c770c1009e11e32866bd9c13e4e7b8c4f2666f909088dfc8bf717b50b3e69b3be8ad238238107394de1702f8371e174193b072a02466664ac7665a557c343e1c901793f0b79be0846d98bf086187bf5ac0492c8c00d31d9078b15fdf2916347422d5accefadba943dca1cdc5a4103f360812c38beb4abbd440372a75bfc7e2d2f0b22fc431494b98ee15e296b02142643af0df07ac2bc991131a639c66851655574d1eb0fd4122168df7e17cb1d5ac71c6095838f618ba552579cc32d154015dfb0715264fad77919656bbd0274b433febd79804886c0a79d64e4313e5254fbb4219cd7250cf42303ab6e2c5341160d222be02d0eb8eef6d4af03bdb4f53a9dd515b0a7da37b61fd2ccde28e20695843919ab0d5de3a86e496964f7ffc3d9fa5cb2eaeb8e269135488c2c93271e715326a0f20c5ab02e83cf694a29a59aa0289a54de711fa094b3578286a5a629503a66601beb01d17c5721ad919dabb966bfc8ea4d44f519b8ef6811e88bf2b4b79f06d8c5239d0eaa70923d09480843f414c837f53b4a02036765a0ac34761d66e0adfbafaf31a294a985a00d232b16dce5a976fee79034d8772fa633d60a8d762397bdce762b0c74aa6304dd9f2ffc753d8e06af3fc8f3109708f0536a8966c3871160ffb7e33814f1f15a30424cbbac6a71cd4dd8a871303a3ec4be15f0765834f1a1dd51ad4b00c132d2cfe8bd2adc043622ec5507152f0246086e724d194301914c5e73e18b885892783599e8ddcc15102bcef15789aeed07b79715514b74f9b50c30a3d57ad8ab3b16c800202a6aea5ed500c4e0be6a68ae9dd3e8acb975a7a5709558d6df9d3919c23c8bd47932fa2df0c10d7cc8b240c0642be04908357ff45c456bb7144e5b0c5031bbb88b9f0eac5137a85e7b822907a399c03f51cb084b07fc333c6516fdffad464d46eaa5c6d382de545310c8e7bb99cc8fd22bbf8ad4c80814c6d1f8102eee8ba006001ccc55e6bcbde4954d62fb95a9ba998e1f06aeefe6d8d0b9cd53bf4a58db1a25553a360d760a8f61580d256212ae8b7cdc2685bf2e083ab6db82c794b047bbd41a1c2bf2cc18af1a2b1b243e402d1b8d245aa13ecaa51200c5420bf8a49aaba7c7bbb4a917a7eb281d16745da9ecdab2d58023ef6023cefec350d6f4a3bb08bcc5e0132db05a1a52009d124b8009c8d40ab327fe28a7c13fbc6b3e09088781222b2c68cc8106c471467a0f97c9ad1e7b7295cbbf3e047236144a1afee0e8218a1c3ddacc4ef6b590d119d1c87c3b0aae95d819db82f45716b6adecad2cb9bf3f1e4f35214daa7e6ad945eb829b5001cf370d152717f1ce4a6f153d7860441a4653c4045adef470d58e5f72281be022c484e6914b82b7e4f26400221df4b0de2e73272b204a4f8ca523ec205b2d5a402f70762879c727cf48f7a90fa00e9ae4038eecd37ccb32cef5eb903f42b68cf88adc86f4fb901ba95002e23dfb9e22cebde286e20fd0ae14368bb856e901b40e754ea0b472395000fdae4f808d0856abe80db6ecbb9a1bee2f36533fb505e4440b15e856a493b1dc0a5ee421bf135feb7aeabafce0a12305a1f53d8f89e569107d96707e8d373b82f05ef65df8f02338aa42ad8ea5dff0bfaca3df9a05e01be8c42f30d6cc5d1ab637e3ee30c8b49db4acb6d79da08e22749f2a09da1f5fcbdfc1bbc01d059d9b8a7fd01f9c2679984df19cda5eeb81779604ab7f03e28d67f0ed432e12681332039dd22245935a6005eefe30be2b0e9f5267da3c4edb21604c47da12f7de3cdbdd91b203f1bdf881bdadadfdcbf7a03cb34fd88868e582b9ea5378d5f2cc04820b16e9090db5e0fc5087a28fde47675c54e719c0c772f0a2704ad8e0635f7c037fb4712fa282de4e9b68d4fdde208862c7dd33c1164a54720748d84b70848d53970ce6f8c15740070dde9453e41f92a3ba5a80c5887b52d0440cf64fc201483675620f9fee072bc23654fd592221b24b92a89ef4b916c10e5f5e0cd71d17e6dfb4434c5f5db3290e30ecc1e9de8c46a1bf08776e4b67d88e3cd7d7079523b8e6e05de14a1649ab65f2e4153480d45e46ea3ef278c8cb88d7b8502a2d63f209a2a4f7813ffffe92f7cad8b1772811c93104e75f600a1a7b91a7f9b396c52ffbbe2ca89e138370df32d9f6e7f2f245f3f39cd809343e3a1ffec9582b72d288701fe2c2c4b294de442f4e03f5bec442417b14d8dae82734a3ca2f9cf5b244891c9d0cffe3760ed8d83ceb4e712c0f6ebf3b81d76fea8c5b92291fc37e836481eecd28d0c25749c330df6373fbdf9594ef1be59fb250f2eb1607f5ebc437d8d4734541f11a7a7c264bed977f0c3a90bf527bbdaec214ccbb7b8076718b554df7b7d063a4007f4b3fffbb5fb0798168c0b86134ca6ca67d2047f8dcb84232c3aeb1c725fbef3107d5caed1bacfd958e31bb69d13e2d0b1b7141ba422183d86ab04c91c1792dfe0e2f60cc6f708891842b44635e56dd6085c396d24b3a5578de406749e2a099439dcab46f80ed412ab81ea6cd7bd0c61ab5405e8a68486ef8da693d4f40cb60408aee801e488676c40c806800f67eb1d87800b29e283b42918d11ca79c03b1adce81ddd6573634ab9fcee09914d15da5e53be8c7d34321f67c3cb51dea4fbd7ec028d284a2d871c5826f46f157e97d20e0dfbe4e7c883080990a2d9aa7b757e660155c2a5a320b8dbd444b47420107caae53745c44832444df8923b3c91251fb67b087da382cbbc8c1455008097b3eaf14252611a828021c1b1c2f8868399ea89c501fe0605f0d05f0dd9bb7fe10bdeb28d6fb556cc88d2cbbaf2f02e93ec9990b8117dcafe8185403b8658ea5617c2f80a1ff1e569134fae68d05d3eebe6879e050dc878d49931cbb9777feb2d8f400c2e4f0225d518ceec5bbdd34a703f6b8ace3d4f0842a0d0ad23a9a7d48aaf5c652d44736d0bb9191bc6fc424914b088cba10e10024151b57e647005c53d8d267c6e397675628176b2b08e9915da58d7670916c513e107c658098dc7985b11144c13a482be3521f6906327fb03fbcc1da83d0716be70a0f71191763d167f6b5e30a51242fea4c9331959f6dbc1bb3e2ac1ec18519c82339763a557b0ad238a4427416a61c2a06394fa231c55b8be7d383090253317099e004014e71d7d4872cc599c553b13eccd4ac91f9f4e575cd54915d656d150e679f9200a689ad9b6a4c5990344ea6a5e17cb693fc064f404d1eb4f4b2520bbf7f0e3ca7317476eff74541210812fbb150f94591b7d87dff26b14e9246f694c54dfd9f577eb44b0a5cee81371693c5728c0c83e54073a145d1567f9ad20f9c087b2b988a3a6de71bf14c73d8c130379face00279939d8c7483ee96b67e6698e01c422618467f27e5aeb5f508e3c18bdee330ee3a9f882dc7263e810c094c04eb290e899c1e9c026435aef7fce8a5735c4908fbf27b910e64570b1772c7f04fe2a1a6e299d4c39ece30e5637a800e65761bc3be72927be99a638e022aeaca1deadf4aa24e81fe88e1da4ed70324701fd06dc4ca0535da1f04bfae723e19ba75c841e69cac0225c2b2751c65ee1e827e94a79943f13ee7e1cc7d6f958bca7b8e93c8fd1659744b2df85b7672207410149bd4500fcc94ee1f72a833952ac93e01467e92204a28d53ad9a6eb5b085bd974a9aa03c700b18c07e1d448d2d9591dec1080e26621ccc906abf18d25749056adc0a5f70dac52e0827bf5807dd91833254e0e38c9275cfb066ceb97f4f66b4bb8f4550e8c2de178fe4e538f65a984d72efda30908b6ba65df4e375b9a20047fa38739b70fcc71c3bca3ecc89726a6b8ed515637818ad946cdaa2acb6d5c6d12131f9249c450d615696ab5813ca4a1d81dc3101a88b417758b9263d33ce80c31b1976e6560efafe488255bb2b31f559af3df13f80699be85250da09fd3ec909c05b399470d5e04a1c783f617e653708b0524e4277f7ce014f7beebe2d7e978b4e284fe7986d2221e57e1765fb77129a12602f08bbe4296a09e528f516943e2317a9f504acda248d0f58969a8b868c7bd7227a4ffcd364558835928964957fa12a1454f1f74254f8e8d2ddfa0bef682ab7106acc11752a7a095b8ec83c54c9af084e91fdc65c48f6a4838cbc6d392e8bbff2ec47b49a13179d64b96b7cb042d61d4c06043e620c43a5fde544e11c47c711f21b0d24456cae69fc141d455d204d2898580779d4e5245d504dddd8186b152eaa8d747c75672453efbfe301529f0970b5e3428f050188d1de5ce7ed4c8932936086e70bf3b5b637505cf967485014faacbd1e1d8c87d0155b3126ccd70691e6a73734f0334b13839b7fdcfc4120999ebfe86f4658b95b6f9674878fcbdd204aba500ea471caf8500c32877cea87e50d736023448fd802a601e165e39e10d6651f3f0dfc259ad2f4b0e9a4a910e1347ff360b919469c4c90ec36ac4d1c21445dbcb807b9df7b778521c686e0982c0cbd9cc047e63958f9807b70a42bdaa8c5ee03857160a19fd6fa7b1c8121334718116956f72a82923de09e5271dacee104364e00811927ed6910c0503fce3174a527ec85918ecfc2aec72b5669ece7c8a9f1eea8ac4680240d83f53e74fd24076788529f464336ff1f0c54cc3e04bf9d61e6858171e9a226d13116dbba48f65a5e8249d8f1ea17a87cfe638a4bb44daecec6e8d9583223157a04aab97cd51922c452628fbd47b2859292595a274a594548a924a5252094a2a41692528a914a58971f001073fc8c1071d2e93fa3234dcf4b2fc9f7fa92e0b22534515a6327e8dd23e5aed28a8175c74033a26639e5a309851513ad29e01b191d9befe3dde5c6fbf7eeb65b707124c38ae3bcf3197fb7b7425305cf51dc800c5510c3a44e80f06f00f06007bf60e3935c9aef35d34fc58a129bcde92d67b51f4afedbf8af66c9690584236217bcbbd03b009e909b70937c49ab797b6cfc823e26d18237ec3329c41ba48eb5dd1fa6dfb479a39c49145a277ed12bae855cc9f0c65d411c7aa3ef49a7ecd6f7755f18d87af4110432ce70e8a6b3ad7e01b5ded4b51971979060e247143b6ccef48202cba9c6e87ba74354b9b5b574b75b53c69de8cde90b4e7cd2b8ce19338881f8e0fe39847e860412756040c23dcc027b602026fc09e3b1de9c8391055584e5237fd33e92f340bc951978444e5a9d4554cfffa0ca21744d595e9d795b75e2faa512b283cf66d66465de5add45137d54ad5acc22696b36eeaaeb0ca5de1bf8e5f830c3bf0ac1667ad525c1fbd348323cbd4d6bfd6edd79b42d930bdf16a65acb9f57a572b1f55be7215bc825bf5a63bae9ca5d69bb0de82f5a6913aea75e57d95d5ca4d47ade09895abaec2b25d263ce2c828155cc795bfba9ec29f0fc47f760b13e0bacaeb65b880995d23ea157f3e10516fbde4328c71bd6219d755b08cc96b4d6714aee9ecc2b55dabb74cce9253aac9aaa67c846bbb52708d166f71d663748b3b169159f5b559a8778bd58275af4645e1161ebdd7d0ccc263cd4d6661f05e4cb32e8865c5630dcdac7bff50ae0da5349a513c5b43a928af610cca1b05e52cd53b21d2f4aa52bd4defdbe1c8a973adb1e271f66df5b91066e6b11ed552f94a2bf57a6736a9742d1396e9aeeaf078933b85ba32aaf7a9a9eb952bff7ab1cdcc262cd357bd431a2457a9fec574ab2ec44dee95d7db3aea8e3832ea2bd7460bcb76a1c669baaaab48d41d53bf57b963115935441e599ec2359d5597edea3a92b3aecc285766efdeb126b3fc77c49159b08b58430db829eb32f53393bcd5fa8aea8e38b2ea1feadfb7f2bea87eaa2fc318d35554afe34d5eb90c636866d930e1b3bc6b3af7595858a6751219ae376ead8c359d5b78bc99a10c17a641a3249334ed93a15e6504f122f72461f977726d9ae36a2347a461359d4f3e590eab5b28c312a9f2e47d6b9a9e1c0c634ede987261032afdf6150342a70722744a4f0410f41b26e28465ad42449dceba140b8f774d99ad9541448d37b9f54921b63ebec82c3cba5478057f726e2d6aeda0b4d2198f46555aa3503d71664c05465af9279b545ba877391a3672b5d5aaef74884ca0f92ec78916aace1aa642caf39c908695c28aa9904aea9ff765ea511f6bc5dd570819b272a9904b6918f5a6efa6b56beea01f104459bb50b862994f6eba2d84e5be2c0ff1b5df22cff710f922b3a4b2b66aad3351cee88cbe8ebaf8da9a0bc4db5a0b550571b4b5d1688bdc90403e57703f98a3b56bfe8af9c97a4a7513500b65cf4aa94c2610bd205de8a44e588274e16614f2b435eb727ae8a30dc3f7d19e817eec3890e75b465d4e0f5d058fddf7152c3b85522d7c141ec58a6d8da3c92a107df54b77dd7e76b95c47fd28c223cb1f459c5065f9a3084eb635f932ab902d3fed1a92e76b7d7783b9fed45a15db366bd76c5d7b856c99b219d439a6903964d626d0343269f68acd5e215f66d4c512e9d7bceb7d5da07d498a8513fa77fa0ecc98ad4901a02c10c439c35336eb20ed9aaf0deb99498a0d6ad77c5b20fa9a950aa1344c67edf23ed259ad9d8e76cdcfd98f77cf1a26ad4c6c616b53366738c4ce089166f9c30b64a82ea3d8bc97bf1762e582b4666be29841dae5b11676119febe564ed9a475d6ef623d28f9cac65f4353fc599da218eb6c6725b932ff5f3968805922fadcfdb2d48182b9fb75d902f2a9fb76190304c9f2ad3cdfd5697db35c7d1a90af9d29f6f996ce9ce5448bbd8a7f2bd15c8e057774ce5d56ab472bd34226203df9198b10fafc4588abe260acedd7c97c25dbb527dff167604f3686b63f784353276545420079152c9bfebfef7ca76d18248e5c612e3b40c8996e1d4ec11c4b1565a5769341c33b67d4ce1516c81b9513895511f414c85d099fc1903503665f9630c4fc8261755892021cf773bdd13edc2628b344cfe20c293a72c479e79b4405d4e9e3d8b421e3b9d3c817e1001ca63e7449ea8da9cac61638ff45c9086b1e4b9c2c972cbe48bcc2e39541f41f0d2cccc2399e5355d5ef9a7ba2dee52a961c242f490bfc63bbeb1c67e57b46bd2ea0c71ac34210dabb1dbac61dee7375ac33a709bd5d7d81a9a4726ef9b706d6320aebeeaa79cf491a3997cd6f0794a932faecf166751f9f83d41c25059f94892475a050963a5d2f27cf86f756b58ddbb495fd43f7a73b0defac7b1dc7fa582ab2b3abe2abfb7c57f598e72576e5269aec7e84d45e5275f59f9eb75e26ac1b2a2426385779c4e9888109e3c18c74d0c073d12a7772c46b7ac83342ce5f33d932faccfb79086a9e44baaf5f14b8284d1fa24e9274818a8d3d9d73536f7bd7b9fba3feaa2dc2447c790e86247d823478ec47ae0d6ef55fd3775948b7adf99c78da3e519a3576f5d9a1a1175696ac48cfac9e8e336b367b0619037ccb3ae05922df3ab6b6b56756d9176cda7ae0d922df37ded4ca42f7db4b59046e31d212028c538be2371c23d667ac8a61711a3d5bee48e2479b4b5f1cba325b5ac248f2dab95f410b3b13866ccfee298311c481cd1438c080dd0f710bb89c1ecd000fd8e10de40076e621447c7ec3d4c85ccda2573c59179caa03cba40429e1613c1e10d6c47e2d387ba6c7835ed18c4d1c55df435a76c9bc9d7fc364720863c3fd291654a887a3e4cd13d58c002167c98d0d9d1e1a3d3c48e0e1f9d267674f81cc1c7e7c72cc86c26fb21fb116416643693fd90fd0812643693fd90fd08e2e3e3e3e3e3e3e3e31364e6230bf243a7891d1d3e3e3e778a3bc59dc2c727c8cc4716e4c78e133a82f8f8f8f81c41f6c3270c3e5310274d5290d24f4a19cee8f20c48ed65c7bd93348876b38bd576d12beb8cd11c3de87673f4a8354a412179d2688dbab4983bcb6e6f65b34a69d4a567a555340e912916fdd41b4aed183ea932a6e8c440dcb6188820c7d1422eda856d70d5d11523dae807c53342f140f1a07ca0783a4abbaeeb3c97cbe5d9e0d15ac5ba537768b424f24ee50112c793209eba7312d4713c2578077dd7293ad6e3c12755461550ee99e915fd6a9a9dd95910540b221782a1a212c4d1526a69b971646fbb77edac396e0ae26867b9e61930db59bb3e991542cbf6ca39d2f964b95f473a25da8927f78987b6b59c87edb4b35c6ba702b24d90f8c8edbd9373565adb9e1037986d03e9f7d1d6c08378f4fe75f70214c8126957d780ba83df150d0b8202d1be9f8f160a43f0ddc12e34737747bad139e2d80979afa10c0fbb881428d3333477519edd475bb3b533e4becd137f34d93283fec791eccb92d24c0b621f20681f3ee80b67ab3f7448780a14923408075aea5dd21c3d46f4cbc1692214fa91d52debf08c5ab25619e9570751411d2028008136cfd08fca47f5a35533fa52d142ac92a97e5440135b3088634b460a0ad2affeb76d1ce775225147a9b53b997b27459f3fa2c71d0c65740fc1d0d7a2b5824c2ba50c47ddf250174ba3f1d07828d875740c2ba594d68ffeb3747b8cee7a205fe64b29281a8d9672eb4b77f44204c3d467f8fd4bed081d04ef98da915129251a8df65b1188b55f94ce9c1a41efdf0cefaf6f57e670e45290e7abf7fa47e7b40098290e02cc2cff5e8800b80c65047177b86cb887c79bbda3ee086614eab55d426ff9379968588d903c3f44c34479c6e60e75c9d1383e32b0429e9f3a1af644bbe408655cb041bb8470344cfac82048a53e3838384dc45e88ddc102f051a4e74af2ccd4458814aa4413aac4446c8952486a28b58c5c80df696ab81c7ea6876c53f2225f686646d9e65400f9423343b34daa5dbc5ffb5be77de088543279bfc4742a793fa512df5fb14e5052debf98e47d959516ae57e97d00d8307a3f003780ef0b0087ef7d1de48b4d6907f9621382c9179b7e215f6cc001c8179b0a43bed88808205f6c381ee48b8dd8837cb1e93247225f4cdebf7c4979eafd1ce4cbf77e0cf942df3208d9c5f598f07248d7cbe1e1986e67a4835abc29b7ab795294ae37ba9e0f8f87c7d3aef9f07a4f783a3c27668e68f2f9409443f20d4f7da6f49951f899ed33fd195a5329a5d1656c506a045ec6162981df652cd0e80b2f638980e176195bfbb6be8c1d423383328e36263fdb697a9c4191a1b131c9e26bb82c7a8c16c2ce7263118f226c73ca297894b14666660a8f3b42253c764f8cf0b883009d131f1e77acdcc6248778b431c91b1e77a8dcc624573cda98d470995e660665b499629b536edced2840017089692621763525c47fb439e4cb4c9546a0ccdb69984c4a15a470c2092c74e878e2091e1e1e3c7cf888220a19afe788140d93f1a43872c4489ef77cbc1f303034ab3e33730af67672c4ff9b429ce0e0e0e41d3e93f2191d3e93c36770f88c003ee3e233249f11c2ce32e942481f9a1df0985f6e6392533e4393a2c3c71d2e63001d72f8a8c3651090030e1f73b8cc017010c047d8656204e0e2a3cb6564b820f9f8e2320978ca69484e1f07701998a7e0207aa021fd84471b934cc26310360999f411c665683c881e8e004d21a77cace13209db9cf20b1e6514f020e8912359e494e3f0f1e532351e440f47b2c822a7e071e6197487bee69fe2e2143be935ae55c0b534ae4dc0b531d722e0da2217e6ca76a52ee31ee01ae0d21d4b8be1d195f1f892c7c063cae43de0514cc15d4e4e14392693125164adb5d65a6b794a9667647940cbf3599ea0a0a0a0a0a0a0a0a02019b72393c9242d7332994c2693a5a44a2370e376c2efdc4e4aaa3402b91d1b32b7938253b884477804b99dda56db6a5b6dab6db5adb6f5f4f4f4f4f4f46c3d5bcfd6b3e56c395bce96b3e56c395b0e8d46a3d168341a8d46a3d1782a0f0f75e1a184477184c71488c77f958707dcf5140063151c446541414141414141a9d22889f0b2bb26a3322aa3322a9b30f06873f7bce09602a86103c0f205ee1f1dd43017230d83e10e82d3b01ca60eb885e4346c073c71c07dc5ccf3b4096f2691d333a4a7a7a7a7a7a743bce18a694ff77426781437118f57428ca273a88b8ca5f0d895f0288ef098c2a32b4f9af743beccec0af1f8a770e7028fe24f787c3e098faefc770ef932c7491be969a44fb631c9a34d421e1d397224cfbc7c06fcccf799ed33a4cfd487d348c31abf18c06bb8ecf249694abf86cba9cf5ac5d3d8d43c53139a4c4a3e374c5373ca33a31c9ea6469405701a9bce33d348de5ec365179f1fa6a929c9333de4ef343560cee134e16b6ac6e113c43435a50c3b4d4d28ef701a1b2ecf4c9ffcbda6b30ea32e8d0e7e92b6d3d474f974d2e70ba6a949e5199a0780a96cf12e5bbcd370b2c57b4d9737d9e27dfe850bec5ad9e27d87dbc916ef3a5c4fb678ff6e48b678cfe17eb2c53b0e17942ddec31bca16ef02b822d9e2ddc51d5d51b67827b924d9e2fd744bb2c53be992c816efa65b225bbc9b5c936cf15e724fb2c57bbd28d9e25dbc29d9e25d7455b2c53bbd26b2c57bca5dc916efa9cb922ddefbb6ee896cf13eba28f7b2c5cb22abb0942dde05c051f7f51beed8f977f47646b0856506006e031eb70300afea69f818f2af867b0130f75f7dc31a5e322814a221ae99b986cbd0067d0df802e00bbb88af5bb30c7b864580b11e145be0e60d0771338b0baf2a5706b1465d7c98cd426fe1039db15c997da02e3246fb91b51c5b697157f533a6f2ef8548b70ea8f6227238376a668e868dddc845c66233d6d5ba2524ccfb14572061248102090bbb114cd8f7e9e12cd1820c48d77c6591e7c30ee4f9ce0446e4f9295be6730e5162f14b99863c7f0090000028358ca0869397085e2d978e8bd522042d562c20603159f9c08a4a85099554ca122928ac043edd24aee9392f41f1000ac9091227a556075a24560e96b83a62353231c244a4e2802a4c81791e417d7966710ae58985c9cbd3484997671a486c9e68c893cbf3469098fb19902fa33aca7d1bf922a279f631205fc2ceb35f235f66275f5db657b46b85624b53b938662cf47959cf3c010ef2d8d582c0208f96265f4c185b0ff7e2458fccab77391d132812684627a7db7a405d42db8b34dea14255b0ecd0ad3433ac8e58a3410d93355b46f9ea2398571fcaed743a27944169770f9d4eaf4e7e72655ecdf4c0055117199336c7e26c3dc8f328285c1075b1b49e0963abd182f2a43da0489228a5924646e9208dba589e9a48b76f825d375ff3351ba7b3f9a09ba21b8284a1b45a97adcf5006d8f5d0d77cfd4ad766e382546ed6e5e48fdce873d3c939ed40dce343c35d08095b9d7c7e031286f2f91b1306b7934ad530c552f2b0e86b1ef3d0d7f48e32fac92dbdd2d77cd7755dcda74ad1aee9ddd9f5f4743d3d5234ccf3f1aa87aa5eadedaa3585723b1248d7fcc9ed42202dcffd3cb733617439f386f9298a5309d9323ff6046ad7cce988ec083d46f71162ca535d4f4f57eb8874400d93200aec142c3b85eb28e6fe2ec3195f5fd1e9951b8dbd771cb124d038ca63d763b3e5fe0d208c77745c34c22e62b7c440cd14d7d42c92a054db4d564fb19efad86594a3b4f04f7e6f6419fafb7dbbe16768c31333fdb76dff2e08f6b6f5f710875886f7eef85d544abd53677d96238bafa5ede11d6fd8d84ebfbbdd4e013ffa97027e7410e3e8d73bc2b25d1b78e3bba91fca100133e3c7e8fa52c53535875c98007c2fbc21de1e62fc10cbe07b58e6af35356fb8a6668c6bbb50fe8b7eeb8f826afd048f28d653efd459294a53754bd55356eaa81a1457546a95c2aba356ab944945fd53a1ba1abd31c48d14a5efd3ad554f89dff01613f270c4fef618949adef5ca985c3c0d2f57932bd326576e9476ee2c7edb6e1286376483f72ee9fb05e21bd4c3d8f43609b1cdcc15cb98d0106ff2cde42240662f26f4be30ec8f2793300137333c0d432cdb55db15be82df650813e2b1a6880fcb766d339b983c0615af921975baa30f5974d31d6f944c5c23651685b77ebb31e1ebbc91e93d1cb14717755863d228c9e206d650c626def08e37396c98e81fe9dad48e48ad5d40a56f1fbb9a86d5d42c7e7e881b0d133d4cf4cbde8ac69b4c4add034f221df454218b65ba67ba271e44813da32eb356cb61e20bb56cdfdddebb76114fb55a7dff0115e7cc18f7c60fc881440f31ee3933d65dd2578c2ee580013c49d55ab7a6a30e5ed20bd19bd974673eb933a75020e8ddf4bd10276d5e6172d23db9a96b72d9301b9393c21a1e9611bd8307bd8b45d066f41ad64578ca4e610d111ebda79eba29ac118a5e12da10dd6493b3ee0c4a96595de6d19d41c9ab8bd7c3d7f1844a8ba10dd24978ce421b23f87924cc7a78e7e9e049610d151ebd8b172fb22eba7dbaed53d359867491443a8b84479617fa8238b68f6c0f8a4ef2482411ca43e1f9e3238aee9e868107472b9025b246a3110b6cb146a3110a8b3562a1843246a3566bd49976d08fa873a10dd33d3c0aa1721117da106da37b781461216e322b14893078553ed6c8421ba2772eac310a71c33a283a0b8fa088d50223a38723203a8a640944c7909cca12888e203aa4c8aa2c81e8d091c1db8314debb5e08e37de5b2795891300d10f37d203011fd898998af2762e21ee289e857dc83f4f05d58433cdd7519d638fd5e8634543f6119ef2a51140fd260b98865bcb3bcc56334c9755b47bbecfbca9837e2c863ca55dee2d200cf82c79b0cbee4d2b857e1f126df8ff03f0f24e1c7e894cbacf21bca5051b91505a384334623fc99315ed1b8077f71f3f8782ec7c1c131c24589c7a8cceb1f3e57848282e70fc992be198a07afcc5f0aa8128257f4f07823ba63cda2f05f68037c88c7119eb3c7a0a2cb3a783bac41ba0782e145e00c0c6d421ba297ae02ae84251ba48bee5d51cde1b9d08677d2c13bce0c8667fd2b5dd6ed1fedb22fcdb2fde9a58fed336b184b489d954ee24b17df228c39fdb43a5de6958dbc8a295d7555e926df64109c3299138ef14ebaf7506843f491771105afcce29539b4215e1443baf7d2fd5a843258ac95957006088a0731eba2bc74c57b7824e139a45df6e204a22f7b708640344e0d1520f3484d425e10c7cea93111a4436be2c74ec3c629cb4e346c9c43b20d6a1cea6271faf5b336ab8749aecc0c99ffbf4306c85863d93b8c935683846548f7ee819e17e35d8447217e129e3fe66c0e69d831c9ed6350945017ec556f5d9bcea77f533683cc5910ef8ee0bdf0e3771a5d64a261f62251fc48fc0c3d32baf8112a8cf12ee211bc7719efa2296b979599a483892cb3e7fd5b8126a10cd1b5e92c3ac9ce2091fd0cf1a28f040b6f6d4ec364288a3e438f886ec3bb08db745e85a12a54c98035403c67edfad12efb125ae3940e7e1af16ec1db7f2baf66952a9c41fa0c7d217a0f1111ed3ba799b0de4d4219de0cfa3462dff61febe0b59919bc7783f0ee9d7569d020c2af68b8ba37bb452b4c81cee1f703517599bd9ba8ae52a5ae0a67a452a4cf4c3a5d66d457a78be10c3d926b9ee1e9ac93e9ac7086c954f2994bf038330996215df4f943863548a7a10c110b8464d165bccbfc61fab2b73ca07f21db55c293a75d2423fa15bc63cde04977ac99f49450c678c3034ebfe21cb277201d89c7eac1d33026c4a3178392ae587bac68cc1c7ee6f0e01d6544369dc1dbf7ac69e065261d873248a45beffde10ccf137d66d1259e3eda65dfd32efb91bde84e9f2e8841ed321222228e33288fb327dbcf20d9b01d7b1e1e1e1cd7c142bca3dbd971a2bbd65017c471e664ebdd7e32d12ed20707072747cc5e7ef75e9b87efdebbe621e7b1d0bd83cd43e8de1fcaf0e40f385cf4653f314d03e4e9cb7ea60132f6bdbe085dc6faa3ab7ef53e80beecbb585b04d097fd2e0f44eedbbf873e4a59b677fbac007dd9db21e8cb7ee59daebcaf47e4f00abc8c71dff00ac42b1fb83740c6b80311f34278e5e11503faf5407cc6be09ca1cf5f432f421477fdeb6369813cd757777bb6c48b1fa9b62c7e0b3d485bea32ee0bf908b4eecbab993ad1de72c5beebb29fab20f5d79bd7b13eb7b13b3dd12a28c75efaf36ec6a9775415ff69d1262ef50171f3a87ba501ff9b2b72860827d411ea94f0cfab29c0cc4d50fdde1d6a12f6b3b27db7f3d1065ec062708012726633dac8c49158b65e86cbb995d75805383483e8a25ab8cb3bc1c3f1b13141106e9234b9630be4b2ba910d4b46e9cedbcd00786a291482a9194984ea894ca64c56a9da0bc3d1096a089117ce006d265cbf6194453d3e51c3436a9fce159d3653a462077ef8b12c2fc2829804141396985302727ad1d98568bb50a6158ac954908b35a999420f755218c89892a15c2a8542912e43e2a8449a550a71006853a89e074cadb4b421893a98424842929210141ee9742181292d207604a251289242e218a235108331a899210894230840943d0033020f821f17da10ec084425e17c2785e7744ee3a6b44b696e3000cc7e5edbd7d6c1c982d779f47e44b7551b3902f54b66c87a17462215f5ab6a460956f05d4a1efa261d3c8f6fe52c0ef85d8e58902ea9d5e0c5d3ce992a890c746c144c124b98d436a13e46e113b044ae41b46318f44bd44ee873d82dcf764d0efdedff875f7f381f89d82ff6a55d121ec46172c53b6c8bb8b8685f07893bb6fbfa10c151590bbfd767da03ff30cca6dc428d638243a9f54c911fbb263c212827033f3080d5a14692481896991f06392808a1d0065122aa2f871c46661b1b0476c16160b0f0a71da3c338fc89619dab059ca969056bc83a351921dc896791e71fc6679569c5a71c5912db3822fc4add6ea7dbba337a7e038295f4c32a517a94b7725e55eea3b87e3a867e96b57e9a9070a61499877fa4e821216fae7c2d51cb448bfe6f710f8502803fcb67ddf68d0a5455270a8b784b8f2d1301d4fac78563cbe57f9226b09494f0d595052eed67e7d1d28e9c59a697eaa5d50175417aa8013a30739926ceeae9ee8d7fc17caa078a5c30815874447c338205d487a72c5217982848784479e53c817c91473e311473bcb2349cf2aa75d313a69e248d233739229c5243db2655e74777424214c8e2346dd4a479e1fb7f7b8809de12218e8e2a0149c3cef3df41103e568d87c0a4e4a4e0a4ec3421b13ba772fc6dec3f6e34daed6ceb812c8b1f24a47c559e9a86589d3cd405ced346c24d9419e9f5fe590f040ba50204ad2b36222af74e8c75513799a41be4876205fa419aa072a8e7c1d215d6ad72532fda6043fafb3212e14512c65cbc47d2322494f1221182a0e494fc5998138ae74f43405c1a6c1a2a1e78f4702b12f3b477efe0c195277865429bbebeedb59dbb35b01153d7ade3d56f59b0cb77a3b506c0c7c01008a759d01a8d821eb4ac5113fa21548a061a7880b91299d90e51d20612860de308f22e5152b1b1ad6af7865654a45649574eac7a8430b96cbff406f87f713892eaadf4b29281a8d55ebb6f6e7b423d201d5da65a4b75046e3105bdcfe344cca9c1bd4a5c5e78718a70a72787924a5ebb13c1346887b70a9b4a56c2f95b6add471dcb6955252aecca5946de3e1e1f95e973554f0e57d011d13c48e09a2fcf491e5a50f133a268863d7017549e894203b25744ac00216b060c4d709e996d029a19b754998540281c209995ea984fc4d1e32c8f4c2c85fd3400499de01e48ff21892e9ad217f1504995e96fc6d51e48f037b2c21d38bca9fedc1854c6f8bfc75a01599dee74f76d693211a70e19b49482035b022d32b83903f491b888f2532bd2859da7479c61ec90227cfdff4ec1014794191222f2852e40637b881941b6dce49eb492d9f70dbc6e111b533926ddb861bdc78441f326ff68736b1584398cca1e05cc0ce5884b0cc2e0b8de527f7673f2c439aa5f633bb6a67dfc298f98ae7679e8d3242c1c93d79444732d9d23810473e3e320bd086059014cc9e338a0e88091a0807ac3043dd6ad5a9567c61b3e209dc294b20560cc15aa183ce8a19e454bbacd8095991c467851160156008aba8424eb56bde2a828caaf8219244318aae9425902a74904a2452153a692899b240e249a144840493490e4ea42750b225522a31a85250303151b11ae98005831689ce09386f118e4001e725421a1e84484eb56b5e204490f728272dd6ca44954261d14889af0bf2ae238157ecc9238b2727409444f0c14e1e4b52a99286bdccdc89507c3f889d251022c8daf5f1883ce2a4e96e4a4f2fab4fa6b7b4abb7521dace8a8812c0138e45a634488a28776449801912d0544f0c00c8b9f0ed73bd68c60e6b8cc85eee70371de1bc1392f6b28a3b3b91e5f00ec6ade2ebda4cdc447234f4f2f87933b9c2ce5edfcc9705e5e05d024441f10d0041101edea51becbd47bdf8786c9197b96bf3161d8f769a60bf7eda34443e7c82b6f689c02801cc6398053ee069289378220d2d4ac801f04342c6848ad561efc06df5912189f6b3ddde86b3de2a34788fd533963f30b3f54b2b294ae8ac76f563e8052fa03505a55281171bca54444e99a9d4ac3c621ea25ee0ea4140d402526502c914451092ab59dbed56c314298ed333d9cbefdc495a444308bc48cc2e328e5420709b48b8bf004644b7f93115f6f830d0fe81fba06cc9c800b1dbef725d0bd2fc56f57dc36114bd1c31186d95e3138042bbab96d559e665702f94300970ded226331120b1b5640bf6ae70371fc55522513943f46f06e88794ef09e673fe704c18fce2a41ef13eff8b0026474d8769fa31c112e5f4adac5c46a584bbae626b93b3b534a29a594a658218d2f8f327993372d678b28d82e2a5f3acb8b21d72be50dddb56b4a98ca6c9c6ff543fdfc5cad809844d4cfcb98ac576e24d9ae15c5f3f23d546021051558484105163d9952814514d9089f54994dbdeee86de5b6fa8f03eb3f0b765ee81b499a834faa8c15a733d235cb6c434ea5355ee636fa6fa3db5729a5f4d69a4a559c06eac1030a28a080020aa932eee023f765fdfaf5c4e7c4877bbddb6badb8e5e7c447b6746df919f1c8f375c4331ab5208f7686522f27404510061611e47ecb4fcb4fada39d9dd8999d6daf1bb6333bab28231f3bf8e0a838c2118a14a1f2a02876f5091bf8a8410da40e1014644b2965492a254edadd4d69addb566b28ac15cd772513c8d973ce399b76b78c9cdc5f4e9d928a4294e2705cc8c8978382321e1d3a94f2f8ea9db179497210b5229a0fa2197d858ce0e004b5abbbad6365c975352754ca5c50bbc87ed5b66ddb788288a4dcb3711c27f3d1b13ac4cc2368c4442863dbde75db486794b3715b278ef2104e9443b2eeb4f6f80805d14f46c771765664e401d97247392326463a4b88e3682727f7471ec87d271ad64d0fc8170ee409b3cde9ba2ea7c33c72df72933bcde0fb465e4d1449244cbbbbe594f3134ff14995b1e527f7e56508c3cadb6793700a431272579a9959f9eb7a88e348870ef9d2d5735c38a39537fbf114860d9ff8743cc491c5278f748c74543c69661e4f7c6876d62e169d1328c4d94121863358b97ebbac8c59745a79b6fd69f999b5898f0c5764924a2b9d386210029443a7c842dce064ba9de631c6942df2313c647a1ebe79246f772c8203b733bde34d9e4766669632f4f2f5ae60285ec5f090e579c8f4f2f248c6ab184ae56c5a797cdba5caf85cafd873ca147d4902d0a6ef205c99523c762eda2545f9147599efa8113990784c65871de6bf3e62ce8f7ae6182d4e10987c7e208e24201250c3669186d5d92ed25a6ba58bbb3d5dd5dc5ca8c6d5443c24a0dc2701ddface7297fe9868cd821d7dff3ef0a17f62d8fd1be17188ec853642bc03bcd8ae50a85fa1874297a18dae5d21fb4d34fa3ede78e1e965874722b2bd1c751fde21bac46311127ce8b25d4438c49ee7759e0db97f76de8b99b73846b6cb7bd7591b83439edfc6212a70d345ccea85eeeedebabbbb9b9ebb1bb621db258551f8cffe0bfd0bddf1460ed19038dec8df76f0ca78af17b1485fe0f7180d3e74c72e8322eee80bfcb08cf72b430888f0bf4bfa3e4319a1df71742e04011196f445c2782c227b97173dd1413cc235345f343373c8eb1e5e98796f86f7d08d99f7707867fe2ee90bc431e8d8327b5e0c0ee38d3155440d05b71a8427a49cb34e9a99fbf4dc6bc2cccd6f15cbac62e6b7cf198b6d287093392cc4f69a2d6f5888ed36a4bc6121e66bc23c67ec912347b2c85e98dfb6ee6debeddd5bd77377fef8360858cc61ba51018628f23c04eae5bfd998b9d2cc5c6d66117d539b260147f4ef8ac49beef7d92bc1db1bfebbf6e0b5f1dde2100223d263506bfaec87c7222030c2242c9e449d0a3a1584a2300c49a777a4796554377d2793e9f38e5d9e3554b67c78bc3199dea18defe0fcfeddf41854664cfd8e4398ee0ac63ebce9a3e9f2ae602e53437358433387b1493e464f2c2f7e746b6836e1158d79d1455826bcfdc432e03f111e67167d881fa6684a9c1cfa48ec1d45b7d6747b43bc59bc5d86248fd1a10c09b6c12beee2e74af4d04af479121a118eb10f1ff34d11dbd09289654c97a6abc263eaf4799250ceef0401d247e129bcab98efa77f3f8dec4b57527bc1300c2ffa41d297fde8fbfc27a9e88e436469e54757d2d3fd4ea77f10205dd2d7c46397330902f4c50212e94a1a8a7e288d6eed4517b45f7847d147f1e1bfbb12ad4c076fefaae4e2ed774f2422d1c39bee4a847f20992e8f5a8927b9e81fea9ec07b3aea8227f0f2343383f887d257e228e21f483f90b0a42ffa5a81138d336f421b8917a69447d0a912c81172e6344290118ad02b7a4e2abc50c40573066922d32c8104d1c9b41c244b20b333e43e08a448193ef9efc7ec7af044fda802aabc760f98a03c2842804e45e575c837434e096408105a4ecda02674805000b47302128894d64a741cedadd2209f2cdf75eb485082cdcec41188b2d40844693b12d8148ca0e99c52fe043f9f54f956309d473197742c69c3b49760bf6a170471fe87b9d3ae5a6b7dada95a69778f8f8a2b08e91de84045159eb8c1094210c598172267e2dee7de1c106796ac9864e554cc9629ae4089bcd830ce245f5aef548ed1b202a98a47568b8d83294451ba42262f75b03c3cbc5154c115593e0406b1673314a920489640542045be214b202a50a2039ca3a864ab75e6a9a2854cd1880002000400c314003028180e084562a148248d6455d40714800c9ab4486a481887518aa328858c318600000000000002000243845100c0bc7603142602304e8bb40142f8dc5d576737fa245c5a27c61549dbfa7b3cb4ac682a8318bfc1ad4295a00091fd2488157d7592b4582b5215587b7857085c29cec933773bf7942f20dd0f67e31c7c3dc9c831225567c72b1cdbededd97467d10baabcc4dc3f25f4ccbb52a93a08ccd44273c9ab9a7e15ae042aed595339bd2a5c04be71d010f55059b1a3f2fcfe0b1ed12b068b63a7a6e71d871d5ade9db88813f7abe932571fc4e959e9c4be1b430a20ebff960f7fbc7c71309746bcc4a035376a7313b24a2c65602d3d4dd70bcb5930a7213cfd0db43292124ab060a4cd892838954f4ad3e5f7eeccdf8f7bdc87017a6d424781f3ffb44e9f279acd49776cc7bac931c74a249dd79b09ffd30e9accfd8d9427788e4af7ea23d4b17cccca8dfa88714e1d7d270f850cc8da9cda4d5e5ded6010cf6f2bf40081ff7c48592088a9975929f2da7b4e23caef76cd7761064e377208f4dcc5e055844891b6e42717688fd11452959f2604e58531a4b27a39e5f628ddc985dd6c9d69134a25c1cb07cd20676924796c330d821f6a077d5f63c72ecb5b0a5feef6b4172e4402da646b4730edf89c00ea3ebf1b1ad1c8111c07b8f5de28ba026919489c4a2efe3fc7d57b7e10dc61dc65ed398bd22e0fd9d3846479a4e8d2fcb5d05b21e1564f13988439f2c4873557fbe7646adadba86f6ba8e311d081f2e01648d7dcdbf844a0ab88812db417f607afd200278416940ba7e074c1fb31aac00bada2c6aba3308dc2cf433e0b7c4e2ff361daab2092f9fa76c16ca3af10bbbc9fac8e65eb519d89ac1bb30723e7e0429ab1709564144087cb825b205d24d6d4b236a18365c2c9be5bf308b3ec5ca29dbcae3806b470b4a5e2e24085522d29d47664bad045af9e78506e2916052c2012213a0b2ff882076e1310e291f8ce78530c675ea24574c58fb0433ac06e7876e37417eb60474430137d347f3e677c4e73ac40fc40dea766ae8497429fdd3c74c2a2e7fd2c701dbd938deb02011fd63ac9c441fdab389c6af92c8e477f0381bb2d8769258150481ed9162138bc6f231d8dd104d6f46961d1e7568d5ecc279ab82c38fdc1706b1ef116843463155fe028fd23ad3fa1c2e0dc9ddc7bf1d8ee830c6a9807e28bd380cfbc77e483867c8a3b8a89b8498cb574bd4334cd8c69a35aff487acfbe48c7bbaf908c0f8b8f511ee38aa1ec4dee8a6f006dc0127206fc40c4ddc9e44127038b8ae80193c58d4d23fdb310d7879b934999e164023dca170f341412a5f6e27ba4b86d591553a9ab1f31c7a9a446d06f978dae6a76d26f71f897f5d6aaab9901402c97ff3737cb0a9b5aeab6d41f25a6282f8e4d29d21988d9423c1b45c031480cc79b4149ba33927746c6f6fe60d303e0c91dcc686413944677a0926853ebfe4b1c329280a2795b171d1f835a362350a869b26ff2cc94225ea9fc231d852f1037357e7b539a4e4e35a8658b2edb18282cb3660a40628d7148802834fea0da8f18272879607e10fcb0ae4a0ebf5860c32d40bdcef30219f4ab93f58c39d357cf1185311741c89c5ee3d34282bc0e3e1d3c2c3a0baaea99adfc2c6065853caa375ac9f39442e9380a098ed8e81103fbd397090c80e6ab832eca720aa7538f37aefbf171f139ddaae767ee7e17eddd7373a675437c880520ce9472a6ff19cd567d0f2c037d2d3d96f3e84a564da79278fc392aeb7522f6aa24f96b36dd8d55c0d3535e5a7b03954b792f0af137a0ad995c74e7c4a7377202003385081d6ae439145899a1b48ab4cb4797ab59eea10169ff8a54488b47551f536b51fcb326e2d35beefe122c962c08581784ef882c283b4ede2faff98fcd9f3fe5e3c6e6f1ae01f6aed1d31205065000474698bce0e9bfa4c2a55808f6344de7dfeab2c37d1c604ea8c874978ae8a2a21d41b954ab3a535b3be070d263e9fa488e627b239d28675d8cca94b45bbf3b82f52bb6ebd8e3bfb26d459a6c6644189d18ed50e2a436284389aca891107a144db49f88b2786e5be8fe6995497ffa7b7f335e0e77d54cf4bfd17551f58d069bd2144623108d6813e8293466bd8013ade0f39239940c324a25289b910c990068bb18da9f082b89de0e8b25a00279ae76794b72de10887006a129c2754d0542bb7d98145b85ef168df5aa9b0ef11c2366ee458d4c4a5356ddd335017cfe47a4c4ef0b30c7c6a3f187d2ec92351e74979e3813e74c40e876af33479048155578bd1df2baad2fbe8e7d3503304c754f46f6b6cb40fb9cba2585fb3d55fd70c9f03106389c667df27d1d2749799f28b6d63a0dc3f67722a2b3eb9bb7f90231c01e29ff0ec80992f3877aaa3adc19ef4fb6eccc380d9426c6f1385499c2b25ffd775691f42fbf3082278bf6307de1dd1cf51329c34a2a1bf349ff4e49169cc67b71203a434aeee508e71ca83215dbee6cd3c56316d9d9ef884533734080b42e52903e3f5896a5029f3d9afcd41a50263685eed1a6ba279d54d92c8ae99c3ec527ff6c80af2c51e6a356f5e0bf138ac7dce615612f72e9fa0c19c65d4f2b4ad3d2e243a8c60c58f96e488444fc0b621a7d6f905d662cd2b2f2f165a54eb81313288804a0d3db1b808546f336766e9d3b9d2cdbd5f3a90850c70e61fc562f5c487be01bc479a23c0278c368cd9444f3ab733a85e9bf19b3e19c8a5d6013a9fe623e4c6434ff04a9f63279e95bf66f70ff7d14d941f68cafff3633a032e0f6b01bb5c7258e83544a7f1ecab08cf43ea2683e286e92b11d973024902fa36b4c80160ab7b32794e4ae6aadbe15d473143b7a9469df0a1dfdad506b4410ca309dfa92f848a9bd70a605c102fb8eeecd44471f5c1e127453235b0fac08e653e290e53770ac1e6b082bbc35f0683174fafc1d539f8331f8b9b94a1b7ebfa39ce61cd4957fb8a753518e3156776d6cabc6f523e433f4019c85b90d8dce4f499c3c20b1b4bd71fc27aaa09fffb9c3e549a529d356ba6b2710bcbf55ba1ebfb44ad2147474706a7e12a1159dfdb62e3737f3d59a69aa893b8e1e431a8a2b43bccf84df262c3621108cfc66327a7d35fff0f47f89fe7e4b33d96049111840b1101c812150cc0159a3eeacebf8c0adaa29207a966c02ec974996b80839ae6ea2849b49b6b9a3386a64b0340259dadf6a5cf48be2ac60b6ddb06aaace3ece0fd0721a36697dbb6a3d89c98162155115fd1f1bd54383aeb8402c1daba8095b9025c6343d4ff8b65cd635fd278ea146ecc261849bea1d6912b8b803540d80e08a94797160aa365ee29d2dd001694d27d09b5249062f42cddd5dcda635a875cbf85656faacc9d4bdfbb1fb520a7ab7afff58d44b164dbe5273ad125bb908504f0dca8f7a2b972b4d19e2398d6c195343c5a14125372bb83c44ec4c07cfa9c9668bcebee64a1c573518ca2b93d869906343705689bec6b5e09675c667263b64ed69bde8ef6b8a0544fda8c83a809d0cea784be9cc383f49ca78b9a141f483cbd46ff51a0a42eec69921408d4613dc2e2bf05940fe5dba659f86491707a7a2f0dbb7002d58e6c6d4b4fd6319150d697903209acd9764080b431d060c87e9c630dd6ee6d1c247a5729f8ea8c9ca8095ee293a607aafcf0d2ef1aaede43f7a286030fe7558f7ed787bc0bf0486cc816d27dbfd7f8cfea1b727b4bc5f7dd35b21e906769079983a6b5c81b5d182b0dd51cc547912e88e14bea44cc9db856c391597883ebd55ac4968a5fa5b5943d10dbeff8e7c941a77747d6dee4da3df785f0b8dfe2baf4da11514f3fee33e5b814a6b0b1a979ab8f7037c39f949a2a7f83deaf498176f23bca1d71026cd7f8e9cf637bfd3dd02af87cdb44424005de0462851c82e018d340aae20a223872015a6807ccc383db519e28244f29134b7c471f4a945801d8621315d926b9c323f4ea339fc24db485d6442c570c136145871806070af336f469fb6d031983a9cd38133d5e391ac24199cef1b87abc164e62e2aaae0b862ea92d063937a6e26965b8dd80769f7e304663c85d7d05bde1dbc12203903b9c8db0a70459e03494e0276c59d00ac55238f45c4e7edf4c8aeedf48c11cfcc3d94ca28e17c0a2f7cc538c7d26f8fa8f5ac5b11d665c169396bdd7489c679090a6b580f0db2333971b5275174bb19fa49df05c632737a19bfac672ca5f5db8b233717728ea3bcedebafb65d1999333cfe6055d87edc5ac0b00b68ead595d55035fa6d09f64c58f12b6e651987fd3c1de6f2427213f359cd0ab91b50cb6edec4401f54bf8a7c2575163f6156045dfe6ec2e09bf54717f7b23439b033edb8a3b849119a078346ab34e80007312197561c3f423cfff3b0b42e79ae44e289d10f44154928d0d1df2dfd8177ea898e969f4182a007a100cf11deeba5ec6f06c62b0b6480181baa4e9530962bac79cdbe8418c71bda072e0a70c9e4af82db81a0bee7d4403f6fe2723b68cea13e37bf21283c507e2e9a1837e8e3aeb69cb07173799867e5d5c634c6cae004dc2e7f255a276d652c24c9311d76728942f8d32eb779348b184ad2a42b84ec8119d5fffc3adf2c4210f59cb8d8d746915e4002b88f6e1b4584ed28e811b4da541b68c4388de19b4d78b92e18b8f4bd1251d986cc737267d93273366ea91ad46537621917bfbe2f8689de0da1f61cddd8f284340b7c5e5bb842d87206a1220a9ed470e9e2a3b044c7de6029f4148357158c96d513906dd3e886d160a7becab11e16822d7071455264eb8f191f2ea18cedef50c15668a5975491b31c52077f08c488793b05b7a70f952b1fc080f4eb24b8020c26b7cf85a00d9f928733ebb70b92a1533185d7a91e005ec188f9f8f29e417b887e24d43e091a801a2e3103c447803fe6f331142cd603d5c1021eb06fcde08fa01201b7445becc6786f97c86d3ed82ae9cbdc59669ac35ae6f20d01475d58adf3f576ee2a12fa221cebf64aa1c2f482863e8c7cae78e7bbaf46161485a09f85fce15648779ed3e272e330bdaf3ace0da10d0d0c80468cad5f4a371c11385735167e4d6b34244ff91d9abfa1064084f1bdb8ffbf86572a35efc9c2dd44acac7e834a5367a48a2adde74dd6ff63393e21ba0aa2568f1d2d226df1e2d8ff146319c78dde5bb70d301d4f937c1f6323c2708feabfbc274d53756ecbcf592d8067e9758b90bdc7f3dc9d53deed86935ff77b48305e498154437ef4c93bbbcab40c56cebd8f7398e810581ab710cf2b83ee8db27fbda34c4096b8b2ea9decacca7eef903db982bf98e1c97e56e25b890241ed48be1515f7523932c8ac46010fed970dac9714a84c2f9b829b4c4dc58036aea006454d05bcb556c9308446cd8b5f69488b6e947b1884e77d3b145fefc086c70b8ba0177eccc66f473bfe8253f2dcb63c21b96d81c9f8034b2ce01e6ddcb6e853674bd7e473ccc9a248b02b8cee5a5d7f523b284524d2008369a09cca5538db7571128315ad16c2677dae38eb06ea2c9989fa4a47617ae9f057ac4a733a4886cfa2acbf9fa3eb55697c2f8cd00278627c1dca96e871dd092238b06a0e3a6b7a6b1ac88f6852a7cd684d52433cb2cac321a040d7e917aa46eda325d5bd8e407e0f81b51cf7689fcd4de050dd8e821883a6b75a2a76c95d3be86b06e0989115e6d35fb712baecb3fbbc26875c18d73cbcc202709c2d916293f585743259bee4dfc7c12d1a2bab29da1342257c301c98ec04d21cae243a8ac48ad62f9ccc5c0ec6f6f860b8e6a049e66e51590cb2c8feacd630372b8e902d9d4c20cc6599c919037527af6db4eb6a3cf33c2e9a2047c58b8ae5fdbb455eb1d19522711eb4fb3e427ed7bf85a134af2acf99530b49794e5f46ff8fc2066fe17fa3348413df390354983bb696813cd227a7b7d2375a56c39c1c8b652adf53335184c8dc92ad3c8895caefed7be2c053a6ab93350296eaee38b6e6fd1dec14b50d502401638b0298632224c0abaf9ccbb040f32151d315f0bff37313b1589d5b9f336b936f7003e408c2d69247a8b40cc8ed35c2d51e5b27ce901030c35c9035addd01fceac5e6d4f383e3d0a0b2e10803b050f8f3e3480d88e3713124159bd36f640477e1966cc96daa4d06edb4a49596883db537aa469cafc1a44ffa00d2191e5c8b84b0319bc721dc5a94adb261a176dd50af9d9d0c633eea82ca8c54cc081e775ebfc4d9f95db1c0d4dadbd36fb12f3162f9015e3391f5d7c4981c644f7f289dfd766be27aae9a2a5fcdca801e9bf9dfe1b85c37d474e5543f54d825d7b95b584cf8b5382c4342b9087e0fa2cb3c016627a94726f20f2d2d4a7bfe832ebbfebf1ad8edce67d42b12f3f5172bc6264afccb8f7e2a2aee28278e03b1ecfa52a4ee864d1221b3d68ca85bf2a8d2ed06f67fda2b4b4b915dbc83f74c3749cbf55e860e983d216ad42dea35946d750d442d4fac8d7a26445447f29bcb5c2617b07f37cf2ff09fe456c1c27d7fa5823a4e40fa091c19910b8850252f9cc49846f241c1dea95aeebc62f4f87f62e92c51038fb4c727fe922b068f2ab079d3b99db3c51bb2c67eabf14e9000936c00f6dec2112fe9e22a51d9ff6d13a11e173df0215a545c5a1c39bfa2a5d51b6d65f1ee2105caad7801235a754ac53b3266a7168122509027e91bbc74958fe2c960b3a2fd80339dda81985f4dd7628e7536b94c25e5617cf993a30844dcdc4253ea7816fa3ae339123768b5e5132ac4db5de567d2e614e384e2e44013e1d03cafa2edb64eb0ac868db52937e5369091b8416c076bacf58c1119f367bea099b74b8798d8efb86afc17d4349326ac8552730891bdb3305a9b495bb5957d82040e8b68e74ad869cf7371030732eb303ce847fe044fc41bab2a9d8c9b26295a27a2af48d01310a9e2a034e25b2df4eae4a8d0c84aff4971937103f585d2269850af64dc70614821133903fc6a6be4d2c671de44b841629ee8d8e821d7cef9b8659d49400fce9d1cbd63939ccb1973c4a036e8c3897eedf8e9ca20f4c87e9501b075080e7b752bc8d1a5e4dece9fcfb8899e00da1873d91a379622aa637a26e513246bae877019148b66aff0933ea50a44f2b671b3024c651cf2c429ebae70587788deb84928350e1e0bb007a2d40147386ef24cd7eb6af184d09a434215846f66c44cee3b396ea8180d6b0e817fe2b8a9ebc6ec7fd336e467454121cc0426102186289fb0386e9cda5e0ad58b935db4f9ec126c0ffa2fa544e42ec64d7642822f88e3c6a5bd84ede18e0f3271dcd4c84969c2f85885a7af97deb2ca8dfdceb8443873a14f2f64f65efd3dc4d5932224f3d35ad8835ba6267d69178b71258e9b92e2c79bb568b350717aa6221868da074a295cad08e1025d7c14080d8504f3e6d1276c5df34b59e5e01e3d1508fa5b5d6d6ee2a0d912f73ef82835020e8c1a55a44c9a6cfb40c902655ca61a67d02948352a97b89f78c99c7ed5931109ab0bdf5f0dca77825e42a55e50a697ab56325cf701b2df2d6909c56f926edb702f5498635a46b93b81c6f3ffeeff89787f8db1116680255ae6df6173f1e03a05ef54c58248d572b7a96a503754240f40c3f2532e4c75ea5ab8c8d3bb7f2dd08563f2edb5e6b7b6a75424b4f03625f28c0e01ce81299567f725d596942a76f201e0fcafc575b00017b40f5cde7e6cd8ee8c0a23d3d687f5e38038bca798cf788b834dc287dcf58649d7b9ffbd9f831b970ac32d361e954f145285fe8f80536e6d07d8a8e2a118b83bdda26973f66ad0afe7a99681105a8b20cc33600a8dbf315c2a4353053fdf3722ec0ff20ba5c092fd3555523418954cce790a71f7718f3ff17a986a63cf17237f55bca02513143c798c9e53dee50e15ffe0b65b069607e88fa98c32532c99b9e590ddf549ed22809abc98202c551ba10262f2ddc2015852010ecd54701f7d47a19c0d126df11bb70f16089a45e92c78e8ea68db4e4bde9aab10ca9683d9574a30e52f36ba900747517046f6ca3ab5fda1a637e7764469a4cdf5ad138a6062716c716a8484d23be36b2ae1a5aa68813ac7a7d6ffda058b9a875cfe90305699536a5dccd3a70274d8e489486ed9ac61e7db6d0c75b3f2e61eb62052c3d448a3faf7526e6a7e9655a87097316e0af1fd3f9677a5300e40c7d95b678c4c3e0da4d9c953e985af04d8d0a272ea24dfb42ee433804edf1b4758a9034acd39f8a82dc4d1decd04dfed6d7595768faea7a782ba9e66f4bab293988bef6d754d8b1b7b93677319a7eea412cc38421c7de5a8753991c4a294f02e091a9ae4fd12ccf791267a41d588d02f17eb43c9dd613adb2aa11416371866c5b82d0096a8588baf375ed42cef2a37cb4bde018e484291a402656cc58da433e19fb7244e51c83a82ce0c5f82d67053dc940921c3b954adff4db375aa605d632a8b9f136ca146f360063714ed1c0ae7fd4e459e41af2ae6ce27dd13af428d1704f2f9fb3736dba2753b684a4d60b81a3319dae4fe41d3a18f5c3290f471e1a54e2d97948a66c5e2a6faf03eb000424c43c1cbb2a14e9efc2809afa11f5b0caa6d6b6945d71946d221fb04ae1ae33445b2a2703887e98046f95018d446d5cd3bb21c01b870ac6889dedba6ff771ac2d314deffb68032a99d3b15168d7722004c927f85115b6e13230bf578695833077ff606e2da6bac090bf634ccef94e42202f83e1262efffd5b6fdf9a0f6066b326b8f068aa07f99d4cbfb64367ca5b309d371373b3ed2300bdd7b9dac38b33c6d81dd8adfd4d02172f35ab8ba2082ed169b336be018e5914baeda7114096fb6e1f5afc12c2ff655425db9534b8a369f25148632e317a2ce89af4cc9f022238247cf6ac7cd6a3238875b0b4c678b07b272798d2ca1144bdfd3d03de8239882b71008b664b71a2e1b73e4d4af2636b3580ffd055d6f2c8e96a97f99c542309dc979531a1144b1bcc626e2eaf1999ee1ebd674fbbe228a11c55c1728c373b843f2f4e28872ddca8802900e5f6aee07e99cc948641e56bffb8ea5c9054930a5543e81b195ac15144dde2b15e2bc24c3a8d6c5f68540ebff693fcfe9c296e44f49102e16bf7dfd77dc08276b1d146e23012570b11838fae754ea0e2c91ee297bb5b83c62e917bf1228cc3e5ffe188e38e1c26b1a370fdf62d236cbd90909bd70c0bbf3a3cbaaa81d8e6182704203b6223ea99c8bd41f75d1763022bd31bdd1bfda86887e3be666e5a0046d2bd940940206384fb1aeed3757b72b61ce416429be5b1f3c10643998d74be31ee7fc35d79a01eda1acc78dbc3be856fe219ad4351473e66a36b0cef2f89cd8c2d60be69995bf10ea4b29df5c35dbd5d4e1deadd0a10579590c8909c4bca7960990b01d149d431b73770bcaf071963fc398229e45ee125d6ad69dd128ff7a5ae308e1507217755a8a8eb91cd07dfcd28e980e49f5d4192af44a522f82a6d1d167d832ddcb8a06dc785c8e1467a8df605160dece2bf4d4ce7defbe1f97cf168a7b699a0f6b39c9e11f0aba4739a330040d5bd9c6570119c650eb61544fa907b15398265a160f7b7b41f3fbaaa6520e51174e1354b2178cf2ecba1d408ccf2ca55d699e594bd9b42886128706a8e1d117ae52d50225a7f4620deabdb2a31107540866807cd54dae29e3e39f8825e80cc347430b060b9bf28a1cf188a01ee525b4739b92f09af8aca93498971dfb18a49e41586e5241db2a09bf1f1a231314310e06425d99490224231ede77126058d3276125aa7da0d19195b5040c8f8c22c23def040dc517d44238a76793dc500d887d4c296c7a8692620f1112d2c8444558921896797edb2cb3b457f141fafd4b33000ac8e69cea57438241520c3d4b022ced30eeaaa482875d59a1ffbb182c783766b738e19d736096bddad106f96dcdc84a93543d550f4524e33795cfc65330783c9ab2017ddb93a3a52ebb2bc3396eb29e350d8e38feb0df3208d4d6c357a8bdc96c514c6b4ca2a14c245705515c21536eeb596e592f75f83308b54fc4fc615ca0b04a84070b39dcb01918c1242862bf56aa544bb6787c70402980d85c406267b5468861f5e6abd199d680ac09c1ca6e247a02be7ca6585623fc68751c7d2d182415dc4943ba665f91d9ddc6d27f51cf2dc6dbbcda2cd7f066159765c5b8e7e3f2c2119e3375241bb73f810ff8b35d90bb5b398bd342a4929e540d6f824a768b2c4f09a1ebd417bcb80c77e7eddaad9a34bd30f404961551d2d6c7a1044c668cbdc01fc162a5eea44334246afef2fef1cfc6f9132936b7b23aeded6c9bec5b31feab7c575cc3124eb8c4aa21f3aa19ea6fbc4d4c8b38ef0f9313d746ed528a03a31c74efdaeff98b4bd63bcc72b66defb77ca2c5ee5bac37daff6804480be5a93feebbfca8fb383d933fa8b4988fc97f1d92e9fdec1cd0cda3f6af929db76786362470327502c63c562116a0fc0c6dc9a8f2dc481f3a7ddb6b6d94694a8fe3e9832f7f50e41b23535ac1f824ed0f3a42452cf9ddb2ca87e5c4dfacabd957149dbb28be29722ab0d7424bfdfa14d843764fb981f1699d9261d297c5651e48bad9e5c75524837677ab2c4b63bedb74c2ad6d583c79a2e28301742ff14cb60f643d51082e5911d4bdcc7361dd9eec10902a491fd979c1c3b1316a53785b63a4bdf320f3513c771479c98378e14899b891af99e8f4a7a4987dcd1044217e37e34aa2d2d3cc5a5f513f10e5c780a51864cda1c1caaf3b572189510a253425c94f49a2d70e36e9bb86d486651e8899a58a03171f50971d83f6d076321944f95faaf14592c554a5acc96de452a6b58c4d5666b7e8badec41983cef318aae7442d0d53c3b4790057ff0884fac23624383036f40dfba3122576d1db88a8a5201ceaea54740c68cf46518e212d110229d134ada2fc183f342367d82fa65b4993e0449a520637a21e5408cb649d90419790ca6397f0c470d24266d7d54b9fa1f306d6e39c6e16eb17c6cf1ddc8f6b712fa3989c2365f46d5d6a60dfc59657be60cb0e1940d0bd9ac85fbcb3bc6627e8e71f07c5a06b77ef59eac3f1977a31ca21b8ca316ba27ab455a42522fc6d69d6c3c2446d761fb1cd7b695fa8542cf0036ca475efef79a4f390a800ae8193a5d88ea9dad330253665aeea5948a9b631abf82824a96d99557a1256a26dc21cad2ef7f6e153237851411db93bc8a1900e8f668d4265c85be7e4b8c872f6e0b848aa176bf411d38cab285194666dc090ead16ed72a83cd64c90b7382edde414d054d2a7456adbdfc3aa1cee5817f2887bb05e1f3fc05f2dd5cb23d8c1332d05e9a668ce9e8cf96638a3308472ccb5a018868be3aaa93c15d9f21edb53f8abba3a49b7fd389d216c758ca2aceb108f32a693ae40ac5930a0d746b8d090f78318d77006e87812225b01e0f4f4d3bd85efdaa84333a8405ac778e5418e52a78473445daa8abd9df405065b839f29afa81d7a34c5a85793a7ae44580c428f38d76351203932bfc4ada7219b402c5c6a7f705c3c0ed9492ff9c14f72325bb6fb07d8e864987a5b95f943070f3ac8137606688214b751d97798d59b687e4789d2cefc8c8371a2fd0b6b1f8e3ed5ac3901dd3882000232a7463098f84d631c2cdbb4c5940921fdcf5cc162f6fd55791894bf9474d406d0684af5407a28956dbb705ead6407441e419ea21e9d41627e894132d993c2412e7e90c12205df33c0c39bd06deeab70444c8cd4e8036fe6031e0dad36a665452a582bd1a417e3889cff3d5c407f7d4b31b4df09c035fbb65625cab6ec816fcb31e4941f451a9fceb7f67521d8dc4bdcdb206f3917e1ad91619fdeab7ab76c3fb8c362ac917bd421c5fbd0d435c6ea018117fbcad364ca155e96d31282f89746f8b881077147d1b27e57b44f36f439f0ba41c136cf17973ae3bac206f61d841cd50cb20b1d63427b6299fcc3ee36e33bd600bf286208a61b6c99bedcb423c4b4f39722d57ab150062746a30f4e9fb05767f82fdf4d4d353dc3a83f5be8045ab31301c1d9536d909cca1e5eec48b38b95f952e3fea0c5c9cc2c7b528d443948cd3546ac296ef240c0d8a40f0fabaabd0dcd2c46b5f820e1aafc76660f212ef11f29c61b79bb190d32dd0fcf7f5cc2db3a7bedf6371c0bb12f12317b0cd7d020f339830105aa14c08880605ba53b74f6c05da6571428ae7fae68a2e3d12bb83aa9d68d6b2f5edc750cbe8837e32272d718049513226bbd06917b8ad68f51648fde71276dc688f0697ed641aa4d06099c53227affef13b87cde80ac5394978b74a482bb8fa2c6310e2b11b8b400f71a2c19f8633cc079fbca44f44c2d6f4c8b8af6ddd3c9dadc9eb8cd3e7c0c12a2cfdd70b34b6eaf965700bdf214d426f50f52cc54ca884dfc99162b38e1ec13e39b51bc132c9724e3b1e5f33b439e88f9207598fc39762191d7e7fe2e8480eee1a30566df72c4e9ef772db452738a6d11c0a8d4460c89dee9e2845374729b4f2e761b58a76a489126687107c5cdcd51d1fd2a01d57d98895ff2d78d04068c2c37525be1016f46887c395e33d70cf39990c4b9e5f4bc99dd0aadf26ad4f4ddcfb816134d00bd72e233a15dd50b726b110918854dc487ab9654f1922b16f683d00d2684635ae9b828ec8f558a360adda1448b70e7c04e33cf2d9d834f2b23817bd7e92917eb0aacaa1878991bc103512f97e71263c6b429ce1ac386de5c840339d0d9cb6677242680455f673c9ee79c001eb057f5561a04b979ee91ef2892a23cf4492ed53c4d74f5d7c18fcc530c3a4a851103cca4f6ddab4b14679b5e718e9fcf01113661e0d052a89342fe612b334af734940b24c4d61afab3e3b2d2e941372fe4874f0f06a5d57311c00ff0c6af411ad85630f3eae6a3ba56a84bad8ff75030741ea2984f60ff7e8302c4db787068166a18377f8be0348f02a9011574a6397a0d3da55590ce029c0ac9206d2743304d56993a06587b5249c0ec551fbe91efc3e37329cb8639d05aea4179a826a8adbc568c32c0d83ad5c5ba7cf2e7f8d19a91ea2b9e8645bb3a0ff5f52af203a65a149e00962098c28afa67ed0bac99163ae7d3c482cb19eca1a6bfc94dd71bc649791e8d465599d51a1a39ff5cd87c868da5d5144559a1fb08bd6520f082f5ea621dd7c60a4e7b5420c63777f6366a73bf10a625a1de3cff377c02cbbd94ba62d59b72b82ebc94b483cbdffb477996d3707e961c05d1636bf566c0ef5cac823da5664f54fe5eda2f267704145af599e06fc6b35d0b9e6429e8dea6bf331adeca34421668e92c2b8706a14510931125f67ba81d651498f300cde80731d022748bb93cb5d23e66b85e2233f86866b5408255e59de473ce2de94dffdf0ba566bcdf050585a8846178aa63901aa1eaaeb854bdced0d7fdab321f6d46a0da413f815b2ad6156d605077458d71c3b795607129e8d4bdb2c6cf53b7047232a0b184bc7734815857519e5180663924483bd758dc05965685424c55a237925ecc4d7d59d88ef0b6baae468c200db7f68a43f1a96da1bc04f3ec4b06e83ec830618c54f297d1e3d1284d92786142fb2127aabfd5acf8349c845377db0d0c129e9a79157e1fad423102ef7897b4e2cfa31214be5c80b4091c5c90f82af87de84181c6ec5d251d342e118323afd4d156cb1ec7fe979011cf0c7c22207cca20ca7a91c3933a135bd28088840a692c33580892cb2032455f3daad977ab1e4fc71715d4325746ce3a8913b57f32a0bdc57964d7c4d02398642011fd9c349db5c03aa0373aa31824de505ebb76566a60a79e764e37334dd86cab854d515d098bce393bfe00dc3a78deab54dc9564fd4aa36862acf1434c8378140c15e2754c2f655295b9d4be5e5673370d6f66aa994fdcfc2168e2f0aa83015f4398366372c78496714033e2503dcbe51c3d4562a188062af056b88aa3fb5e72a20ee6aa851db65ced7fcd9e7c923254144616921db9e755398ec715210c159ee02cf628fdd20aee618fb1f5e1a2bbde32441319e292e5816dd08ebf1f9837ca2baa1954a2fafc4ec3362eeba06d7c7dadb11af1a51cd54725570c8c6b8b3e3353707af16517be1e53a4efaaf57a511d4bdfcc042b5cfa25f0cd70b86732faa683190ef5e2611ec2312e14cbaee9ad651e2a25a160a31d9ecd602478a16e612c40fa30c14e0a24e8c81b444e000c40a1ca58f00e40b793f722a3f13444078ca0a578de960ea8072dcb24be1b2db8a8400357246ec87572f440fce728268be8d27b141656fa041ac2bcb36f63992ab49df345e0bf358ea4bab514a7c0c99ee1d21f4c405c5a6b447a42002a7eb5af204abc87919a3d8d1371aa9dc02ceeb2e72a89a8e25a87c1667b99ad8a9d61524de762dd771cc168fed42e787713aad33bed651947315ec4aaa601c520c3dc81a0c9d730e3d69a516012bae6e85bcba945f2e865cc52550cfe84cba21d20bfddebdc855762535054429af2dbd49404a8a5fd6a50af989ca2ba46f905a10b594e80b4085fc865997c697e2a5e5390150f11c0151326f8096f076fd49bac66e0c7545d7d07dd167b8869cbd621da932b92118776a515acd148ede18ec29d653791e4e8d3fcc68d3645837f87d0e7496111eee6b0cf5a780e4077356d2a8c31586c65e43768cbdf6c2c16363a6247a1bf28085ac464acd1a5e34b86770c804dd057ff0bfde88f8e7d3e5de9a41c2d5d11f10c59b3ae72ce5a99457832971df084e261ea06f08b94c4f0bba7f4825312cab6593d740009bab8ad3e802eeb9871b9d197170a4ac91e260cd85e814c572659a8c215addd1cc5936c40162b3205f97ddc5c0ce8dba34d2bc84d5424dc7d663783a3188511d39b7b173c476ac94f62148a9f92e4df5aecaabe94a07583efa4aae4209ac7698031bfe8a1680a5eb05ca768d742c5bad2e4595ad53ed31adb2050240ac953e9470df151e2e54df9f45f63805e54660ead004c5c6a65c4fabbe3b9d23402cb4d1705edae936d52aab17620b9642861352774644c199e007c82b17dbb924a508ac627474c3cf37163db58712b1e6405407a7c72095ebe9e0a0b96da8da569e2a9f1ae221151472bf169a6a8d7da1cddf0b1230c4f846a1e49c0b38704f7bc34f1ba4caedd049dbfcc041e657375f2418956d660a969cec8c3bbd57f4648228f80f09706863974b31b5c4960e24e522024d9c8439b13941b1f948b1b950b1f9b3a7b9c86874b067b8e31f827b1d39e2374716f37cc226a5f419d87b17db28e990af0f8b78f9b5810e3a81166008ea4c203e59da4d6cc067c9dd72e52d370e0fd3ca865ad9f861f5933b5d72e0a7dc7d0c4c04284cfc29613520faa8a7c495a6db1b3661990b998db54a2a7ba816f36b607f2030b0222ff70e3053911a7c07d25e91bcbe836aabc80366011806e500b07d7211881ad25703dcaf7f125ca8e9d48a6c0d0bf5105f1e060b000164320019f45e7d322e25a6fb907369b76b5a434b9a0920ae55feaeb878c2f18f6fd00d1a1721cec861b8abd9daadd0429d6aa0f8e527cb2562d90fc5d589910f9a26189f5ca39d590085db345e6ca35d2d593e03dd03ee2a91b0ce167fd02988e60346198b1d792b8c287aa9007586b1d2e84e951085fd15e6ec28de22c16acaba8788e106d8800bbbf3d3249b445a5f496be1e5f5a08138aa74d10d782dce08f6ff1ef1d3798287ef04516bb070a2cb6e9dac0264c7186b32004b8a585f5a965cdf95095c915d1c72b11ca546b9ad4a27ea2c0ae8dd0cc4313d250d116e8e29e84c3cab33d9b669e6801a2eb5d327c1193da6063b19f34bd4b86189ef621dd67265b46494eb37b813b1e3d7d5925f0f58bc377c27b8db5b07df91f6284488178eee0d53fc6ff3ff5b6e42707ccf892439bc9f809e1abea1080f1536035ffadb8354a9f36aee713190330d7880ba97ae933f721a370e35f2d3fe685a5413f7a6b81d085ca1a9d4090d3636d7acc7cf5d9b8be243878cf559fe3722fab2a0c6bbf986f61c73b509d21fe002fb4223a2e73d40a95fb5ad650e9aefc2beb4df0d09b67897cea6f0829ea1e2e2949a63fa9de4238301c5a2676512f0654a1f52c7154fd395bbc6a0be26142afba3252f47d23f664fff1951fb464d1abf76ceabfb279e400d13025a72d5de41fa1297bd850072a04c32ea3a38d718641848cc7da962e78ce387e51cedbf88f789e8383fe5aa57d40c1431c52050f0c5eb313c14cb4d5878d8ab95a0588434abeded8566befb9db665ddbeca962ba247fae0ba2905eeb97c43cf315c62960af8b596d462edd1e5a4f265ec4dde5b77b383afac9d1595ea6edf46acbc01efc5a579962c96beeefa164846babbf1c72f960e21903b379f0110ebab5a9fc8b5e3e1e4166780453c46769cfc70f822649fd169df9edab3bff5c7ddb5e00948536029a64ad8f9d7b255c0e1528bb81d7a2af9c13aadd23239f52d42ba3e1d46ea8795819a96080c963fd8f22ad1e3d5ec93ca34bf2b02a9e95d5e3e1c903dd68289e7a0484625b806e3210fa5ceae0c1ea6ee63207a56ba8287a199586c14173037a0eb452da822510031e9c043387c954ec01f15612d4935869bf8d630193826aca98879e144ca848a651998122f89e06803d3c9b0e4578685106c6461d2015cc36e7172b3aa4e8b0513c783cdc97570fad8d22bd16bcd9cbfa55b175a3330940a3419f0055b67f55c6bd96c1184b0920d316b5dee02c04640d96b93895e450b79a7d54e555c34f156d431350a541fcb86ad8546ab0beb5513a61b9512a3ce2a75896a514fec286bb6dc515b1b31bd889d651fc43ed0571d10b0ecff84c7b9f0c1ed73e1071ae7d42f74cfca27ea98dbff719737cc773aee100b97727973c13d1f7580e960bf8406f1f236e8c8552c830b737b8f5ec92aadbec79c315d85b014425ca1e3577b0c982ed34ca3588b2eb46e87b4bca1ab252334145a42aa3ecd685cbe03a3ceedba825884687d219a6748b18fae070f94b4dd888056d1d313a01666b17b51c8c69c59f11cbab7d2f50be41b05cb9d12c70bb9ea0bcbcca4ac2eb5303c318b85e8d324ed16d9c191b16437302cf3727149dae9a771da9b235ace118273a853a125608cee89f54c6be2d637249ac802b9ca722ef8a35bcdcbb64d703a23dd14ab0fa744e78c1b688b3419a717dd90dc870d1922a2bde200300f862c6658ad7667cc4074307eec799797761094e5493b7dd2b0195256c8571ff10de32f3d87bdaf4d339fdd6b330e6a756b6ea9bf6bfffdd19d2fa9cfe76ce1491b091d45c2601f28b2791f62f52d793d0a37d8e93125939e00cce4b47b5f4515f259dd341c4314273f88f97c6b25701d2449c53dcab5e6f0820b18517a32980636551b8e352195e63e0e6688b63cd30af0764c542d52a578b56b38ba55519b5c3c5dcc7b45d5a81f82cc6c4ab2d7245296f002086b96419ea57a408b1ecd3f29f081095f6a14bfdf5085c4ad9f01b829142c006a93c1ec999b551a3a885aac442300b9bb2c307fed55c7664d6f8988073da73493661cf255cadf45019f94919aa762bff752eca2a26f3aa4fc419b877877452e87b51ed5d9a14d63decc257a9b9d950d5a0acffb5f09d678b2018081810a76e54634a41c495821b34bb0c95fd6b578e05e59cf5ce882af31e566a70c5af1eab35404ac71d72470bafd64c00820b149faf6956b67b4107652bbc7f670310ace4036b508ec1ca91b8e4e7451f679975dbb3f60588902e736f5729b5aaa2d13b3e5fb3c76d54865d4afeb629627f8a06baab41a57dd5676853f4b6c3a28ec8c7e707c127790c9f62b139f13b17b3a3decc439b1a12f108117829d2d8e40c7ecdde2d899d73744ab82d601446976efa53311ee4a1ac040134517be4967beef4da1c8c9ecc0266bd594cd13161c184ebeccc4f6d9f4739634b8bd88f66f815ab258e2460e70c35d83f78917ad3637d4cbe3f2d87eb67d26810f72e97c327bc23efa2096212051397fcecf8a3d59708d5b3229f68d1bc0af79d000b93f7ba61c70e6422034c516784eecb8e5d4aab1a55bec4b1623da823707cb59606ebb98e6f79c8fae6eb1ff8d85bef9801d3d49465c8e378dbeb85b497d23ead69100a8c66195749ee384a51f11701d1223d95fdb9b3f8d74d1c9f103f148744d764b45408b2b19d7e861dec5314c4aedb191063647a3b6baf6436bf514c321326d70f6e210a1e922b3ae2c0f5c0f9dd2cf0c6e99964616109b5cc3a091a552764ab2826ed9f57ae9460a9b0d5830c3e12b31d0c18ac99618b8e161f5df9d3da44581b14136280c1f0ee9251dfed55458cf50899c53b40b3bdf5d91f6b770a98274fc3500c40bd6c895e84d4147122965fc238b159e841ed8abbbd89ac262a2e1eb59e710ea9d04893f3f45f32604815bd49c3d91fa0fb9b63d400b9a5a637b026a6129cbe1adda803b97dd1d56464e7789e76dcaf7924701f2f284dd6216636b5d78ba1c1e873255855c5e6931f1d1e4325558a50472ea3cf3ae33bf09d49348b6d6734960bb8caae4bbccb4f29781271d7e1b79c370847609c1b5a84c426875636521a6dabd0e9595fe423e108a970cde01f654355c5218dd47a1c9949daa5637d4d17979c74e357f55966a88a10687a3a62c200386560d218a795553d804d5689d434f76c198f801be82e41157b30773d68df885c6a17066dc6679f500a30d0f7bdb3f1d7a301497a0cc199db0aa61d5c054cae65f649e061cfb4e1b236a4aad2998b02eb9b8cdfcab4a46d66dba155c36859b095dbba011b1003073babe0f084cc461287225af41713ec6a49ba1b06a5ac02db0c4e0a50622a53a5d4a93ccf38290ed62f00049af0dc0b2f6499a768dcd2a4020d81d0df79e3080cbfa5743e150a604cede35ad6f1f131f082584ea5c0e3d3174b9f215847691dcfb02d5053041f1e121f5d956f332b3af403bffe0ec748a42cfc589d528ba105a44cd917185dd5be31f3885e1c0877a0c141f8cad1ddfc97c0fdfdaf50fd9119d55fe0e2bd5ac982364fde2e3a4b3bc24ad617f1d76318d3e4ab4a0d7ed6d1986366ac4f79269b115d61bd9519af7e2940d021a6417ad5d1d549900db5b4ce5ff126c7c960a85755591e404e1e08fa162e8123f1696f2853dd1823031149cabaabc74f7a8c1fea77c04adf63dd8745dd8e79fd616509a71942d79ba82cc2e1b6228e4d6af3c730031378bda8331db495c1d1340bdec1d898147bd299fcc7f18e16ff3a28706cda66d57c3257912e1ce15a9f4422ebc9bab4313d3c5dd1ea553af3db5032bd2f53193a0791857f4ca656b2cae44d0337818e135453851feb6809bfb1b3407efeb9ea0ffa4a7682a022a26bb21ad64d5522e078ffc3f245b99ba8cf97c7d1ab92bf5ad7d75e8228a937219b4c0d2c2dd4b7cc7c99006665d1f5a2c8f605ecd4ce0ed9c6b54ebde3490a2851642af752c421d054cb9f7ffc28c66906867ad731162187efd714cd48ec02d8b4d52be3b0ff3caf84055e0db41183ca8436d3c410a733cf1c7a5cd0dc019836162e64fb4ef143f358a49e779bee1b03b301c29fe39da89be99e2a53a5d93f589483a68ba964a1dedecaa07256276fd1995846e30f69c46bd32402f5b881f611309365c16acd51feae86c8949fc855ebf0edb0b07394466c7eb8d31cbfd43f1f8cb0e650bfdfeedd33e2ef06489f222685247242b990f92d00d5138c9d8cfd416151663824c1a87623fd349e014621d8a03490d3237227bda6ce12b85e2fc451959fb6c1fe73064c7687cc19127b3646159748611087c142d252dd63ad1db40e5f420141ae3f4976702508e657b4fc08e601e4120c5cf5a13810c59a12bf48ba6fd52acc963b34c38fda5f657b7e3770a11b7dd6b7d2d12b269d3b7c4511b209c62cf59d6747c61ec91c4874003ded37343fa112cb444ab8d583dc27530babe7496903b5700c42d53e0d60d9a46b81e1ff02e8da999baa29daa3f45fd45c799a6691e69af8859024d8f5701abbf80862027410fe06806489cac3e722b0029af3575e195819f67c9fb79bb05db89d8fb5aff927a349b349257d1119fa7f72ff8854bc5fee40453a1a342ed86533615753a5de11794ea2c668a7cd0bc5ecad211dcafdd9d49950956677146f2bf9cbd6811b20d02d8c2f9e049ce619e14644f21d781ff85e83d7b35526d32218def78c521575f6da925972896b4d068a5a5b9f83c0b637248eb2b8b1e9b1b411f3c4574aeb39ca529ad0c4d2deb432e5e2b8fcbf1b99e94a8d3e134bee1269ae840b73f0069ef9c7dad6aaf2918fc8458c9f418b2c3494195cca6c951344de41818018a0e84f2f51293f8ac89ee0cb450436e597c662886cdae653e70366ee614f7db003b411fb3b26204671e4dc578bb744b356d760cb6bb149d7c135788619bf5237fa61aaced565685fddbce3adf90aa4af8e0d12a9953e481aa392ca0810648df9ed187d4a50bc2d0edf5fa8cfca59a499cfaadeacbd06ceae3cd6af0e4158040cddaee9351774011fd1bf7503e6fa479ed81c64b5d1aea20e9422673625b9a2756d8280f4aabe15a509049e8490959a4cb052768a154a91a9b955e0b333d0072bd6a5b4413ba09b4e935eb54decd110dd650143bb5f0a006b35e514aeec386be9714d40b5df413d9f42f8953f0f1dfeade3f2f3e5fa997c73e7de36d9135c6018686da91809af4b8f9cb72fc36f3df383dfd572c2e2b2a944c08a05d51b85b8545c278aa168a79287aee28ea06d072b43fb6a4ad1e1516f275821332ca2d31c7eac710f58d0cbd7221ccc1db4a5d8795ec80c97a8db84f2b8b65ca899c69378a1b4b1187091db06816936c3851b24b267dd4810aab69020c5b2521328109430d8290293f92f2f871664431ee94dc2c9f2208c6fab99310d51ce5e997c596941c6dc112ef548269d1726246d8fad1410a99e3fe42ba529941a5bc2e8ffef0fc136beef58a80a87340e5bc96a1de747310b829d8e6f6400f1cc2f25d8068771c31a3a88b3b9485287659377fb4107a0f5858107153e4b3b8e5e28d87166a92c290d32e05ac28520d3914962b00b1c948752e3e79a4300c1d97e83fa8392f4ecaf2b5ba70923b57160d0969fcfea21643c17ba9283d51ede68801c22e17958fc17232b3376a4bb9444c84d93be515e4de9bbf801241894a224137b7be210d67024594c362841bdaeeb4083cecc1026671d455096e847d8c659a290eee74cc4254163efbb704a1379accef9651c989dc312ca04d709fec986b6125fbc319770123805d40d085a7168058a4afdf387a19d4d3e4cd92550d1f4f0c6a6d092c453f66dae7875af8497aeb8da3454ed0f82533a856c8322d30aa782994a49c2c8e707c1e0ff93d13290aad74f1fac80d04f2c563e508b8205ff888cd44486e32543baf5b8e2e0327c5cf7d3d6756dd86e1a9e570c90f828aaad5b98287e7016fd304235fdc9ff8bc7799efd696c3e8e9cba5e4505a8160955e56e247e8fcbde58045876f106085c308ab014aa9882d1011d165668aae91fa935f0f4bc1b105e9bf2384841fe0811f4caf459a338d2e988af0201d96327d2bc2a4b15e6692d09f90481b2dcd9e2cb50d87e5dbc4163ab42062f99e808a5e880aed93fc4920601b69c413a0abe4b4f52f4c0e722302b0585a5b429f38901429bf3633d36242df0896dcf09969b73811e51e4b5f323a5a686e86bdf78f9e8d5570775796cdcb5f31f3f48f7346911560d1d8e0c4fd0a8d471d0fdf8464a41b4dec52b14d6a720b0312e32497710f3dc34f902e4e243a925f53aff938863235702eda0353a6b214db2dd038f3c8b7822ee038a7417bf6ac87a9e1cff9d78acbd5a3b45d0c8fab42dbbda823162a8ef43e4a849ebd2ab27685d8ad196d552fd0afbc6bf98affa129da1afd1a1c8f45dd5bd8bd6c8c6cc4251ab5c05b7ba46e1e7e888d4c83d29284706db3d8592c594f3831568cf6a23e52b7f63879cb8b0033d2d560b2618b125d2a9e4182c59fd812f9467e7bfa4954eec664cccd7c3786dbecf13c4a6842d2605e4f4a7f020e0d2941fd5450bb68d9c3dc9c5eb6cf60d1d36cc81410c84b70c7820ccba08397434f8aa45e8e9daf83151599d6a6d5900caaaa708ea556db910209c62c18585ecbea7a611e5e16efc717d81df9fc11a5399b9b16364883cd58f215ea30e459096664142033014da614583398cd46825b211aa835865b0e164dfdea00e3a8bb9e1c068e8d12c88da9d13913d8a19c740f0f8a94526b85a0626eab0b119c526d73a30fd310d52a1b373a592d7101089b446825b3915eaafe5cc5855c5f7f749c0204f622f89af4dcaa8cae2e8f1f279b9d0baca8ec1c835807c1cdf489e08fb0c96a2a1d46f31b330527e8997b6e3683808501411323f4e5c80759e33f5ec2430c0d607de683470b36c97e4119f4fd3531f2ce5ed13865fee52f9fdebbed2785cc2095e5663f3a44fd84f800f67b65e1a125ea40654b6d8980e7f7831b4937404c649826c249608b43c0cd4a64f63bb022960bdf1682472267f520088c61849b3e591af3976ff47adc3722e912b2cafc26438f571af8bb6bf0b3b62696738e9813f692da153bc7ccfb6642d14ac704cfdb40cbecb9e16fcc28078b1a5947df640745a0ced75c88ca143849b1b8817be45d11bff0f96d7b58792b93407da60941c6c352ea9e83162a23f90885cad02740e57806be3f285d3c129c2d1484af1a5b64937b3b8cf77dd7b64058f4ead94047112c7171ac3d87922d452e5d8146c06a6d58f12a1371f1147fd71962f50a02f29950beb64c7264610a6060a98d6eeddaecccdcfe288d8fcc0e0ec5578aca89d8b1911c905807936113673289bba7fc214ec97fbd0e44477fc960a6a6ef5c86b0d32a3725fb0219955a336dee958afbf281a6c8f319e3ce586cb432967cac571e87d04c80b26b5413132bb71bb670da7f36acd179d60437d2849f4f7b33d9717c433ae43bf8e8bc22123f32095f081569e3ade8a0ad903dd086e517674fb5acc97b43b58fa44a6a5791b18445e211f8dba2b3c9137b0f195a50210216b35c8c472e55c2e0145464466ab22f4bec891c9c3d4c546e9108ff1fe7b08ab3cd11e6c4e24da3e7d5f883af501ada49bde632f9ba4bb0111b66e83339808548e36646de9622cf64efcff915c7a215895a9fba2ae184630272c0756c0fafdf090b79e301d0878a0b110ce6eeaf833d2fadf4aed4e7603df61fd62597353b39546787844e6c2884ad969e583c8ef7538de147b5352bb6b081e687e85efeb93b7c3f2926564d8ce51596c059833a92e4ecb2d3d642b105b9f894f152053f2c0704e8c5469fbca31b44d78b4faf9b9a78134ddaca95ec0d608ba442f75e807bc82a749639007b29f3cc432f7a133b866f051d3aa2874ca49b7c898ec8afa20e3ad049269ab3c05528693b70a02759941baaf831f4ca46654e0124526dabd72136fe67b87192775f0525f8cf5f7b428fb1fd1fe44bd17451fe175f2bcdcd54cce756d63f2df6b3f14a995f131ab1d908924e844c64be4bbf568019d44da7ccd3dfdd5023093dd4196a6aab82af40cf1d7105553508865bcddd8ce33f677d0bee2453974c475dc17c30484f6242db68b2e7d59d6f2ceaff2601d4e56e300942de08dbb72d828c25fd261742f3a81188891ed50275c499b31cccdfe69be65aff0371261b4cae2c966acd226a1440c3cea2cc353a18b189a1b754849f51d0a2c22f0a163ca9babbf62d6a2ea0eec27cc94c9801243280a057fca350e72efcd742a10ae429e6f853b561f1f78c53e444c55cf92f84dcfb76289fc6aa97f70314543a14aca3fa6a3bf2179050d178992dd88d353ad2334aeb6635d719d27370bd5af43e69600211b9523e17303d290647366748d9002d0fd2788a3250c80d3da51811ce451c177a143f0acfe5659165a1f258dadd66651130c8a60013ca9290c1146b820b55802149cb2914f3d54b553d6b4dffb58fa2be3e6c2caf826041a194a55d68c1d1b6056c3968a3dd9fab224925a7d011ba6906c719c2822c1a33c9dc5fb1350db53151f203a733f03ec83cc2b09dcee861b948bad26d5e4c0f9a737f5ac9d84590a5714d7b3844e84453e28291be1a5e87eae333c2f667b5a2310c2ab6e0ebcfe0cfa64ff56fce3a8904689b317bada87b07b532e841c87cc3dcc8565442d671c5e5adada897b20eb8c732b38aab35a4a84ea98207e4e2a1a3279feb4bd89829b815d593ed343965fa7a3c3fdf3890702ae18a02a039caedf29c0f846e24a2c6f985853a2c905fa1324904f536b11bbb3a580449617b7a8ac7052514bf599cac250cbeca0926b4a432435cc131fd2688ca32eabd00af61d42742cc83586aafa683b8223cfc5b5e1e8315a072e444619011aa3ba96d9afc08e9ebaed365230cdfc94d0c8f73f0905690b90a5ec9ed9743ba0cd8a2aa59c5f3a09b06b008d70916bcda61892c41fd4f98b6a143ba69e34bece79ecb4168eb6df65771832c3afc0b7557dbafe63b3202da5c722776267f31daafc60940ad3e5807473f9949f012fdcf7606e88933e3633631b9b3bd5966c6b78bb4ead94998aded8a3f3761ef5896904f6fd9def1205bba766e652c576e828b80a9bf1a2f33945c0d2f5f59b1fe5217219913d08bbe468d71af1154538893cf94a7d3556b268a51e63c1bd645494272619b91757fb6929c24633d898ceb13fa3eadaaa555737588c4fba4861d761086b461f7fcc841ca4be27e0ed665ac8a2fa865c7c2505ad5ae6cef198f99efa5311539207d625aeecf31b8893143bf80a66b6aed5193b4c67282119b350f2966778afb92057753825f82e560e16c94fbc94614a287d56fb870a5c1ee1f97f02b6ffb0b5006eb470416fd7411c290c3a8b43c0f1bd738120916468301c96c514ce8bad91f126a2f24dd6b4cb8c0ce6291ba5e12c2d85e281b491a079869247ba44d2b0b947f701c907a79fa088be97c552836d94b28b1185c54843a2ea5df5b22ca28d1cc629ab7ee6033fa1a8ec3220b91356c4aa582d059ca91df7efaa14daaa94dc24c0dec1518ccfb640c6bfb0c82abbb442a94c8959b35e33c1d91f0ab97666cf88da4d21c7249ab1bc7019f05bd0596fb1ead12521069a12eadd080394c92ac466abd9c146c8c9e94529781c53f91cbe50ea27b0333aaf36c34050eae615261d04e4b22743e0b86ea875c540735fd1d8714d8f4593028051426a5dc8bb8c88867dadbead17060a8b2fd33e159df5a3863e650d99b168f37c6d660928afed3a9c0826070f3c170c1f227b2e8eafd4730a33e1436229d3950f8af3c2a4447fc601d6f95416a87799641719063aad5fed448fba8b1e8a1a84c3f62573ddea46a98675aeb93d0db55605c32495aee34c9781e68642f8e46ef42fd458b0789bdafdc45e2f4f28005ac1d73ea3d6ac1a0f83f3083b6549bd10599d82bffba2258c7222846c598190dde39d6f717d96409307f6f16fe01fee581128a1f9851ff0599bdcbaa0e54a03f8541fd4d91a140729bed65de4a9f57a85d3831576864007ff527c63fdaf8cace9ff24b9fd3f9a76c21355f7894bbd93d37b4dc2e48769188987fd4fe0e076955564caba4635a241d7e2e60f0784dc7c03944ad5d20307dcbd493adfd1ef8c1c3fd635e557a31c84c13c39205f40f042a499fa65b405a554d07d9686e3a1bd69de358cb50047f0252a11579050da508dc124e229e67384878baa0b54ca742cb25cc155e8c07ccc50d07a06eb8a7c86b60a31b63c9b263585731e6f752715897824a41255176db7bef2df796522629034c0a410aaf0a3b3c4488f0f010d9d969a205b1214db460a78916ec34d182214db420b6354144cd26840926ae5084880958ebb2fcbbeac5cc7e82eb3ffd67a411e39c2c3c2f42cb62a170e5bb76d16182091cbda3ce11401a2de77c5397fde0ee4efb0ec755f4e91577775b8bb9ac21b5bf8909dab5d85c6d1d4e9743b30c04d5bbc3d174b416c4b7a77ffd83a13bf7371ef265cb28eee3cbf6332ff6ce15ff0e4767aeb4585cc1f1b739d6c1b453163821c5dd74d411c284d72e892982dbe5743855dc6d7a997983341aad4c80513164d62084cad64a184fe7cf0c9f231fff66d13225ff3669a97d97c2276a924d3a75774abaa35e0a9352b8c44e91c223dd691ec6abcf58f528f886778171f814166918188904c8971a523e26151c5f66c02fb07cc101d3d6fc09439f9086a03e7d27a93e6de1f49d7b941569b4bcff1c43a441e3fd6718620d01bcd7a8816314c0acc215b4fc963044554b0bae82a6acd64fa49179b487ab5a5a5e004fe3e71157d1f896f7ef4a3e181a79755b68b40840d4f2386a147c433f45572a4c593c1a4f2af5287fc377a00fe686bcbaa91bb0d48fa5f6be1d66742adb140e95280e7dcd1f4a4359a3918965aef8b36013935924c4333ea7cb59c12cfe34e3bbd0073363c69d3d3e9146eac314260940004424297c5ff88a935c3573c5597325e479f447ca90310aa530088b813d7cc5e9c8c786efb1a144c594c220161c82cd95b0078bdfe0a21a1a1d6d0716d3206b44337f4c252596b260a99f18a14f0cd2e8c59b3e2f85bf5b03066160d035573cb63357fc5f601718b424afe9233f723b9106cafb3f65d11eae0a9fc5cafb7728f846d428214a17e2169f82812c4230530bdcfde0b278940f7f05b3f8aef4c1847975597cfc6058bc8b8758ea14961aa5e4db6146b3c82828d975b4202f853dfdf826954ae14ed76870fe4c1765b5e60a0864af97c29cee48bc14debc14b63a45e4a5b0a653de3e46f914ce34c53d90a021eb0882a569a0289ffa94ef4c3e9894bcba00c052675cca295cb50ad672a6a60366dc036cf90d19f4a2157a387fe68a9de2ee9bfa27798f6f4ebedf5d8ef63fc120c6b42605832c0fbd480365cbf901595477252f8527c5f367aef8674c5973e5b1e9c7553e57f4530fb2bea31864c9df602b95e78faba41e69e91d71d5e8c755537b29ec292c4f5eeae6e453f044c1f308ea64622ad9cf1ea5e90783aadb9fe64f98b3c39fb7fb5e90a59d869b3f5a4c8b593d43311a84cfd42c083a33839033a620e48c836434a18b2a9b4547599aaeb2ce920fc09887fe9665591186db8cc618e9f676ab9ad6a2d1d3b6e6bb5c5996fc805c9966949907220cffb96956661bed216db671f5a7115ff1df38ee83e13e988e52eea9f6e3210b5684e19a4f0a8eab360b9676978dabe82be587abb6a4ae1e78d6f78a690f5fa93d3cf4ead12b4eb1f1154f711dc1b24a2e577920ae4a39259bd2abf443974a4bc860977260525a1ebae8b3417f66467c68f861c1da7ed3c0a287abfc59b058b458b06eeadb4a92ffa6d64c665aaca6b82cab94635939b8bb949352e3aa5df2816e9594882bcda7941369a414a153527c6807435cf1df251ded5ff241a411a5bf0686b80a81f6992bcb8a2b42c415eda12a6204da65a63e5a5a29eeb62cdb8a3458292e119472525ca51c29dc4d59a51c1aa3ccdb6341324217553a90ce0d052901d28176900df4e4ba23b4735528f9cd19d1beb923da77d703acd1fde6b6a09d67faccaf7997f4bd221116408ce10fe205f80e07c0214c8259300442bc4399555d0c3dfe7422aa22e867b3e8b8af29b5dfeb54717f3a86447ab44502846acc8f73ce495b1de8fbbeff6634e7a36707da90703707922cb356bd431a25e80657e4850dee858718c6351020ae8a9508c3bfcfdc97c308c3b53371a93ff58f710bd3e723188ade41308a82a80241e15dc621eac4203ac2a2904800fadb8601ec1b34cb0bfdbdd22e80e99a6bae40b158689681f50202fb127a10dc9792b72098ab341d0fa1882a8d08a5d85c71b17715a5f150455110437f5aa3b9348d62f902e21bfa13dfb4ec0bfd6e87d5dd8742dffa9792122d84415f8836f88b308808880783c61043ff8a41564421827a9c0059ee311f04a61724a68834765c22b2c6977758fd5111555f90ab1ed9fb83ca10698056c80120b1c36621e280c40e13480b91c6f7dd87421fbaf9120d67ae2c28e62111a20ab48418fa7be678b8d85c817c402db7eb48484848de7a48f2f1eb5e4238be54ec5a62ab3d7c53f2227cd3237b9a37c993780883c0f4127a8a5bf6a58710e015579481f5527213caad7f0981c0bed02fc12dd30bcd428470cbbe84662ce64e68f9fea025086969908f8ff61fc144f9263479220cd0c894fa2dc44108794584b16d8c366c3000fbbb618ac02e08e95cc90840dc90538e46307eb5fc6cf88cce9e77237b19d5aaa2424d26fadd98d9bd95d2fadd70dd0561cb2e08d75f638999cf1b52dff09f58fb6cd8cd3f7e369ccacc892ec695a8817ae78afc21e6673f047d4c738c36c4ef64006cd833f1457e31de106fd83cf48e3c4cedfe93bebcda638c2bf187b03fe90f3133ad56fbb9e3fb679987ab5dfbf3a03f2512fe3347bcab8e18009ace485a7b645c5cf22628d4eb388d7ed7473deaf47b133d4ac7e9b7476d7857d18d10a35c323dea5dbc54aa3fcaa5fc73656e1f4aa5512e914619b4e5eda2eb7726383f493f57a09fdf95c4dc04116328ff29d4a9a40324287fc237a6076112ca93e0ad3d0a4aee4c7f429d8288b17f4181204ad3bebe89fb1297f70534374af9fffcd157a43f79d4475fa5dee4a3af4c7faa4fb239ef8befe76dd2a247f91494bc4df547267d6232c9fba670f4959a516fc2d15750795b5d4b38fa4acddb07cde53883a3778e18dbc08b3a9db84781267f4f0f7ecc09853a3deaf4a7acc324df8860f44390b2ef48d186d08fb27c1991c2b93247a111b64fb8fbf5fc9f1fced568441a7dde0f517ad00f61faee8718bdf74390befbf92d2b2c24a21fe1191c1f74fd10d6f0bec076d135ef1c31a663c08f7a0341d1ce9529671074c67ea33174d10177feb61bc6e343d3b7933e8d40473fca97913946cf00b163be0ef932b3561d9aae38b4ccac6fe5151a88a7335aa332b6a3f1afc77247774628ab165fe26cca9f5a96c996963ba614da69902ecab8d3eedcc8041098d6d1ee5b8e34fbedbf8fdb3e7b6b5fa6da1c53bffb193da3e3cb8d4f4c8147ef68858a0641fb1353d0d1fe32a1ded2c728b378dbff32bc63fb0cfc8e8714bdc5786fb58bd797e93e7b1ddb7715cb74598716e37dd433fa0add61af7b6e7bf941509b370e88fa52db2abfebb07daebefc5db9ef7a789dc35535a3b68f9acb9109203bd536e17aef1f4c96edeb82463b06d17ea7b8bbe5000bf81d61ffb2a31020746c9f7d96756060466f1965c36acffb193da3a37f3072c399cd281dbecbdb7740589b75687a57efebbaa8b70ef4f635ddfd0e50d6a17df43b89b727e5c76d1ff771ef612032fb1cd67e47a635edd3a1e9faf6bb91bdcd3e631d1ad86e709f5176c31b65ada5a1230341d0cfb6a7dbc78f4371af43d3199771d88fbadbbe03c2ddf29ea1f43b49c3e1d0a283d5dc5bcd71bf3d473f98560b4a07abb7b77afb16982def1b51eb68d1f56dde91ed98ba3a488288d0c5284107411aeb266176c8126c2c37fe9effb26435079d0da93d93d9c70fe67a989ddcfa71aea06c482df3bed98d9f1f41c77de1a2dc90dad445959db9b477b2624d4f1f3eeeac99341efef01275fc6e68bae26c43c1ddf4451361f809ee769d7a846be7ca5f3cf6e81d774014986db8063f42c1841058cb87f69f3a5388af62127ce611ae8a3012f4d0ae336b4860a3bd268ef4e83d83d017b04e1d21b02131558957a2755ee89dfaa1015208d26f1902ed2f59b286fc91d180ab40a8df32274a1e443903edee1ffdb7fc80f5ec8e3b71e727cd8face13a4388306084e1bfc954923a2579084ca8d1de57d2579cbda7b989b7a7a78b579cc3d3a37771cd8710699441bbac218fcc1e3473e52c7944d67020304296039135fc888ce1ef2ce1bfe994b7e99ae47d4db99449ae236b4c23620c7f27b010a407084f123b282883cc9366a3b9b3559267d605203ca10aa039ed648193357dec4933694c70f7a4b152679ed77dde574c3588bb9f1fd8000f7d2bc1057ffea4a179c00f1efef0e900661ac31963384130fbbb8efcefa5ce1efc8dd2df771f6ec00f2a2d5fa5e57f2d78f1b71f8ef9326fd446691dbf991de63a9366d2b88e07f1157d71aa7be24af4f97228e2e7aa7228e28a1846bd4bfafbf2eaa236106bdabbf80eaed2be53555168aa2aa02bca3fcc15ff90b524f776599665d755daff0072d06f130ff53d0c7a9ad52cdb3e4e9bf7eb8a636646813f3fa3c09c4304f39e3432f577485dbff37e7a239a99692c4d9677e6a233a09962755165d74023835b6db53ab81b8cc5220dab3be97595661b17aa7cad32aa4531e2a1a3f8a0fcfc46a121880e0d301a746ee6cc5e7e966570d497b5beddea676fa7cab532b4bf07744a6b5f8a8107b47fe7df8d93520cb47f4a5b576d2d46b58ce2a3e3a33d1661388a8fe735702b80b184ec10193284c8ce0e11223b4386c48608113224161b32242644084c48902042603021426041825c01e40a9d26ae08d2c415419ab842a7892b8068dfc9afabf846d41a90bb65aa8eaf7dcbadd27485dcf82e5df27e6de31fc0b3ece2a14f71f7d509592c4b4cf36944bc230f1d355f86de21359d49d90a782f6874912fa96679cdbdcb01dc6a432ef761feaae189dfbecb9cdb5b0dd3e73c703721ae0fa196342c0fe878848a691ae1ee6b8366944d7928672cce58112c0fe838c49df937a9251141e9f78ee4fba5f27d1209c311a9059cafabdadbdf2c8eef108041c0fce286807eefbd2c33b70c7d61ad16330266522e4ebd1ee6e7ebc979334df6bb18a3697ef632e6fd367b1db38fd1725bde56e77d57e20721be8b61a399c9b3a8e10601c8d071860b1d61a8e898a2a3c944c2592ba9d0fea11a48585cd02415fa52bbf3321057301063d8a8848cc6558c37e850d6192da98734c7506f3323422c69b9f44e35a1051abd4db604dd0e573ef5788f40e341015be288ec07af1917077f9a5b640e2d4cadd965ca39e70ff2fd795c2ae333f2449e074c297398bf43cd61fa20e5e4d10f6899c06cc93e78385fe61ce4eade2694f8519d20b706f49c5b037a3efd60e8cb68ff467d9ba38733dac7bfa17dccd1353ca351f35138ead3bf5169c6417ffe0d9a6396d51a7150edf9c6c5adefe25125cb3157faa03d902b68e2078b3661832240cc8f71c639890045956f5ffceb0723f3ea5a5d658faf38ebc787da38ae9e25be36aecc4bc510a394b566b566b5fa16dc6e5607e66272950b1d3f156948ec928387d39b38014cc726898faedf795e7762389d1055b38a18d6af6fe78afb5a8448ad75cf9efa72092e1d26e336082701dbcb96412f2edcfa1bf492d15fb5eb5bdb72005f5d9e11ce66d15527063657571c4cba7a92c447c7192a103ad4024cdebecd3cec9ba0e068f9166b5cb8b193928a6c443406b787e9e59bf2963c5c30da534ac19f517726984704030ba4c07ab12fbf1b59d316cfdd229714b9ba2d728114c7a45ea65ec337a637c15dcbc5381c5f60f2e8f75444a12f297dc98332d2df474d9e98512579cfa8d34fd4e9f7e4419d328ed383a9a75fc9974a5e87d1d73f9de83fc9d73f6114cd38fceb93e499378f779927bc4f9f493fca39260f26fda4f931cd31a49f39e63be11c93a79232f510f41a2a4b7d20ef66a5f74a5f52fa92524949d54a6aa9e4bd929abd9250490ebd578243794b5de24fb3f79d0ade31531e4a77158faaa87cfd70a8bcaba87c89684824f92d75eae72479c7a21f8d44a7ecd334ad9e462492ec2422c931a29fa23c9ff4f947b8e2e922da01b994fe16b9469f9fe2bc436a921ce33aa47ebefc70e0d0ea1e6599a973e0a0e7cf30494e4f370f570f5a9d2422d2cff0247807a1278f1abdc127e51c93474f118e7a6251ea4b70d42a386a4f03391afc0cce9f2dfc624a7de5e1d2243f89b8aae4aa779c69eff874cabb87a8477312f190f6503f45fa5adf65661bfc1c9347a752a954f7027e206d9d76a2e9734c1e7fc737261eaea9736b758a734c1eed55c9e3465791fca98a21fa54450ce5ef9904edfbd4e393a733e11ed5f4204e995ef4a3df261b57e598a0c87573f215cb4c0d7382633402eb8de93ddfb4fec5d4e9505d79680fabe73964c4439f48437bf971a3d8404f1bc450fe249974f2650977877c7c07a1a549e94bc0f6d2651317ee0ef9c8e8209277719f518e306a0e19d956936612f416b9ac86a1485460f2581d3f773b792a307974c808dd219f904fc808e823833b445cf53c40b8db84e39a2e53aa73ee662379233feea71f0f4bbe9351f2dc92979f02e20b6dcd15495348a4512a4cc2d3147ce5dcdde998dee43d059b9e9a40d0c664f2f43ffa2e9e007f7150cb2fb5a8d0db746ac54f01db0be8329940176db9483fb8c4c2a556a9080fa5c8d53357287ff2db9a9c7abe07c524b3b2c8250212695ce192fc0997886ca0e58f4878975a78a260939f7a3c94fed4baffc9c89105f0902c38d203afe2461a242d5ff48a34bc44335724e8ea4c18e51d7bda43463c94a29f904fc8c7f4ae720dd2d90feea6ad4ec78b5c51cbb3888585bb452ead87b63225ee16b13cb3b9bbd371d3bb3fcb5c9dbcb77414e02f287fd3cfbcd4aaf5cc95ce7160c2c39ad016e812b95cc89d3e73455296875213e1ec524bcbc7b9fbd413350882134b3b5726acee13814e3da58f7105ba484e42fef567aeb4d04ef79eb43f9d344e1b9dec07733a715a0a057a25520988a3be295448041abd9c8cb82a7bf9a79fb9da5e9e8c78284f3ff60ad7f53ef5683da06b6ba29f9d100f3b9d2e88f49c01dddb8c5a807dd39b328f1a46d881ce8bfd991791c845b1088b581e4af79315a0cd10f7c4d29ee6530f8bc572d5ecd1027d3073de7dcae02b9f7ca070b7c87572a97e8858211f57b9268d483e736542452ed16bae4c0fba744017a967ae48d38b5c6e84bb69cbf42e4efa9938b8bbd3e9765cb5a2e57744220d5961aea2a10769e6ca94452e1a4de412bd3c9422974623fd5ed7fc43dc2d326ddab211fd90a24ccadb928cb2dd9d102d2f6d51ec72ed90cf7c16f7227a4d0eef3b31952297965bebd12e918d28092dffd42377a7a3e5ac5f5fd332e8cab22cb3239beba1045d913a4846180ebadc3568e32a29b53f2dc2c3e9798b585d1011cd5c81aeb822ffd413572428aad1f1246269998214e8530f0a8e8e33ccd420e6cc0cc2673c6d5380079a68410f488467273bce6cc3f5fcffc155abf8040e0484c406b82a3a318621da7f479e9fec8929b4a68c3e380c5d81b0c4dd2c2c93443b9e35f7013f78b882bb93536338244e10c1c70c279c70492386a084145c3b30f1c3379dd884a2c7891afc70c2a6676a4ec4c0470a9981f3fc70c2c523728286b5c5b6d816db625b6c8b6db12de68410349e1682e828825d6187c58db47b7123ed62dc4883c07474604182c06041747480e8e4e4e80001a2a303242727891c1c9c9c2492c8c9490207e707ceeb85f3e3070ece8fd70b7605970dec0a2fd8155eb02bd8c0aee08a2a1be463674cefe0ac3c0ed7f770e66d3f3f1c59d6e9185d9cd32982376d9a739a36cce909d36860d90fd6583f9ad3d1fe3bfb81c1b43fa7133fbae169335c41345e6b687ca48f8f2be163051f1f8f0a49c8f1717d3d3d1d902e07773a1e82ef813d9a7bdf40578f157c7c3c2a2421c7c7f5e5f8d0f4e86905ed56f0f1a890041f2ae8ad25c10a5d8ee682bb41578e8febcba1c93e7adeefa3cd68e64a8ff541e1c156479a1e2bb73969967dd4c515b0bd84be8bd1c55b3f53fce4d86a7a94e8b15644d3a3bb58d31dcf5c81b1b9327f5a9e29c4d337db83311d3d3fa6e7dfbcaf46d9d1f337183bf56c4468751ecdf78140a0cdf336afe5e600495a3f53fc90b4dceb227185649ca05b29a5f57e141da145341e927892e77621afe5928c90429f0fa49eb922f221aab1da776f42413410b487f784a6909d174e8e8e08274707c6791757eb7d1fccb5f67ea0ce03d91e54df0f06f41d89d772414f629fe483b120900d918442a1538f4b4707167b659de75d3cf5867b2021f2e137cc97a21a3d332078abed453eac88464453c47a17bbdeeec35a7a7e0989749ff4c1dcac8508639e341b642de8d9a9b8aefbf9590ba51a305672e9f9243056ea99ffca81c5765e3820ef62a94b3540f43e1939f5cc95f9129f7cb41bd0a0e09315be42b39501e8b787c23357db8b607a7639be325fc7c2f48ce9d9ede839e76f91e6693057892b7ff69c7c3c9c272b3c2c517cea19c2dd283c7ace47f171d52ed5a058e1a3bd224e808d07a5a7541369c40782ce17d174375e0baa4f71f404e59d22a2e77f788b303cdcb4f999d581d535db0863d29d65a622834d67c3c1a6b3c4124b2cb1c4124bc0aa28e2f45d881b7fbefcac735597bb2cebbab7bacb281d70d4cf70c4513f467ea603d4dbefeea387d965f7f4764f3f1cddcb2c35ef6a4aa37bfa5d96653059943119ca46269f003a7b29b39f5b7b19a96b16a58c30689cbae6af54480256854d240173b068caa2817d350b8b13d1032b7c50448336c718f288554faded701c94c572997be8800e94a56506427b19fbd998d1f42d0f756af6a7b659c7d4daa4d9ce687282a0d376787a7c7e58add7ebf57abd5e1768b91fb2f0bc7c5a64f6c2c9d181c56a6a6a6a6a6a6a5eafd7ebf57a5dc0c75d2faf35353535353535afd7ebf57abd7a668e0e2cb6c3535353535353532379248fe49138351df56a6a6a6a6a6a6a7e587cc29ee731ed5cd387f65ed38736ce49336ba66bbe70664b27b613e389f5c47c623fb11873578ca7c7e787e52d1a9e9a1c1d586c47f2c41f169fb0e7794c3b37164dd3f433d471b63c265fd16aebd2c5111616161616169627b8fbbb4f772a85f69bbe6b39244d0e49a35540d2c0e42024cd0b1239248de75080f1f068173ac27892d0197d9f3926fbfafec1fcfcd3b43d643986bed31b3252fbab6ab6b2caccb7543b0e7ff78fd111b367b437c11351bdd5bc65cff6dad783f675cb5ec6b575ed7d86b72ca2b32ccbeca354abde675f79b0ef759f675bb286fdac6a5aae5b664a22ea77dc7783a3af69eda966b5ec75f73f19654bf6842411b28624f1bc50debe5ddbcef3b2acde6f4f7b97b9ba9dacf213651daaf6546a19257ffbec7fae58c0bf51b664115944e4fd267ab0fe5632d234ad7e49de546fdfc922f4f69208d1367d4829bdedb3ef86f6dcdfb98aa1968c517fc3f45da696fdc4203aad9e19ccdb769a666df7516b7fd374d8e877966654f7f5b367992b17f037d5d997bd6f3d789bf660067d996aef7df6d94b22648da865111dbb4c7794d2d7a4278990352a47737839bc1c5e0e2f7774bea643f6b6082d8990316aa6d7572227aa813de1882ee4e86d378cc746fbdbf727baf0d239a83042c5b532462890708485020940281242800421269d9308d58ed4288ed0852308398215363246ebc35e214c772a7ee004aa0318153795522a8ea859ad302a484005cb6ada143e5314a19962486c8a2076b35683591fd6cbd9b86d834df1e23a8ea34e9480043f5914b7a4236c0a233aafeb341d615310310508b487c1fb3c8fb2a8142629a6f081becf470a22540a2b451040200824050e78ac142ef082a014342ec5072e8c0818b489244442b22dc193360b2122215128b4e90823b20418111dd14824f292f0ae8e30223696880f22248045616454322a89a288132ea8819e741e1185103d4d3a4601240a1c0d8be255422a29814551038bc247844541f3a323a412896445574516053d42c933954af2082e084b123fb4bcb0271c017b820f6d9f10029389c944da82c9c9c4a484c809753ac19c20e40b82c43027fc48c1b8a2c371e5c76ec3c1b6448c524a77d7e68e142847835b5f7a9aa6596bb70f867e91ca795609b7eb3a5b2bb8c4f548bc6de9a495f3e101bd7c34fd6c7c5a7ea886d422edb88b27011ba9b5856a784a786aaacc1c4fa806f442799137f62b06bdb69ebb4335a11a9ab91ac93969a5b52e7137e8f5653d9a8bd4c2a42248349a8b4eca3d05bde6ca56520b466ad9d0e4a88eadb138543357422e526b0349ad18697cf266fb8a492d4c2ac257f607e865723a9d421c2a954a8d5e35ae8ed6930f667e87e2a1a030416abd7e7888c3d9dc1daa79b96a935aa11a57858e08b94236a4d60fd2cba1b83b54f3aaa133721d0a111d18bd10c310b9a0633492051d3f7a8c538845748c54442948feea928f8f1255a1173d69f49b85888ebf92a3caa8860544d57dd0efb8133f01088835463c44d5f7d154041ddf00d1fb1861380eb246aa0051057e0b8be94b99ca1a33286d31c18100d23464c68d18d3f148da32393c67d7edeeeb2c914a4658149a79472768e7e8e65efbd8e5cd7d0534d54874ccfcee5db6cf02249593f4e5e680a657d678159448a3860843cb33680b975fc81a381080250aedbfe5194ad0feda8c9818fa83f8c6e71d41fbb7d8883062a22a462e7b0b557555775dde547b97c9e10dc818d68f1cc86a4cf401e7b5d9318054d194be584de9901ffa44912d00f9a145382dad9463801f45b61bd8f81344d8d8ccbc580b8b418f85a9e0076de28a13c08c884958097c006107083ed01144e9f09582daead63ff9d34823eaf92a2adaf1ae5ace77140ed7fe3b24b067a28e1f0e7f8aa3aae8f974e6388390e9effac9acd3b6a79acdb0e7a1b6aba7a3fc487f67afbdf7403f53d115c7cf307d4da339028969121da1000244cb6f5bc18db92da856cc17a4c4934e1b832606b9a14009cfa11f55f66db952db9bf9740133e7db0309f71be2df2987e86024b042a86bfd96abdd20002bc3cef05c7830aecaa56174b2536a60b14d26522805d6df96d2a021c2a8bfa79542d7aff56b6482ae5f231274fd5aa31074fd4a43d7dff192507fd7fab57e8c18d6cfbefa5efdae3e57ebdb5a03a0ebd7fab57ead5fe73bced5dfbe7f36dc466dde64e0add447634117555a2eddfcb3ed35f755f733efed3bc73d90a880a7bdd1357928a58aab72781f82dec332ae6140d353f11599c3db2697df311215f0f4fcae6ed3ab803744e5c170b7d5b2be8bbb2a3d3d3d3d3d3d3d4f8ca08685c69d2f3f34596122a2a98e50bc8a686709c226e14e2948410a3356e9ac5298d65a6bed8c13cb4a2badd4e25a69cf898d8cf1043e9e38410f23f409238a4c77238698fce009237e3c6144cd1346b4322dcb9ea0f9a14fd018e9beabee79191256d3715fbd7d9d8087321e7634c7d640bd40e51161742fe524c19def3dfcfc199729f10eaaf705b4a7a7fc7ae05ece39e7cce237a7fd60bc0f6124ecd3a7b66a9966747e309ee833fab3521146cddcf282831295c8f5b721ed679e7caae51ca814ae6329c4433967b866f150fe473d19a37df4f296d1debf263f1db2160f650e8fa2e6475d310e36a46e39727dc8395028d08cc32af453ead0fc50f49b3b7430d61b629f7ed5b4fbae7bddfd56d1ddd31cea10d7bb2ef4b0f3bc1e0ea0831733a510107f2f33b5e7ddff7e92e01d3cbc79011e76ef8387dd47fde11c3cec7e52208028906be3eb4c290fbb77325c170fbbff728b875de7ed16dd7d5e0e87b8afbb6fe9f60b1c5cd57dd73dcb0bdd7dd7fd0f71d51257baefba16ddbd4b71abde1106f3c243f95d8e91ae4b0220fe36cab844b034b52c0d9b420f7f7911774c2d65a69633cb4cfddd98336a9f3e72957c23ba38e37e383a7377ab65ebe17c18dc48030054349d7d3d1204a6b3df5688ce623a1ba2b3203a63a93c0d2a52ab7cd77257c2936e7a9ec7b9f80def4fcf89348da26890d4a3eebdf73e8f4b5d99e8d334144e610abb71113b8ba310d73eeae377c3660f8539edc6456efd4b0b171f41aefbf08d0badc58b300d42753c8459aa430010d017172ffa6cc4615ffb9efb707cafb5f8f8d9b869f1dc6b1f0c273f1b9ce8c64546715f7a4e6b41756810edcaa03655b8f56792bc0b71593cf73c2ea53a54e7d3a1affb5bed71ef6f363246f6a4ee331b57d9c022b5a88617af8c533eba2af5b50977d79fd0c7b86f65c23579d3cbc0372dbeabacec853557f555324ddf0d16bc596496a73dd306bca5b6e1290f2d6243fa2cc3c836dae6f5027d2f9be768868c3fefff54de212aef30673f220c6d96e0d65665dded5be0e82bddbc5cf6b89537c140501dc24050bcb32374f6a0cc083afb12d601093f3cbc80de2b0f6294d52c56fe84c5afbc93c192e4bc89ea4fc692c24dfd7b58e32627efddb6fbdd3cf9ed9ee0d84e277b469fb4ec395ac4c3ac87f278983d8cd76ed69a2b19ce5cc5d902f3b81587c7adafeceb07c3659146d45908e43a62531e9dd578487b60bcf636ae02e51814e8493e6a96cf3e7bb92a946350a0d0476dc3679ffd8834b8afb01a3ec6c7f8e263fc8f7155597325fbd1c7f9a12ee84b9ec3d98f08237b1b70c682339bd18c31f24ed1a3af21ef943c43dea6d1e3bcefe794bcad45c9dba2f2be2653dea627e5fd7987ba96e0c2c834531d0f2709ec831f17b258e05fbcb507df3d704fee07733f5c61b113ee48919e92e93e87b5e7b87b9fcb372d3e8477e8e40404d21e74f2e07716efe0bcee83b1b6e441d6520dfa927845c983be84fb70d893e741f4dfd572e94b1fbf93a849a88d87592953174735e5287d79983da5c24d3de9778684cebebba4138dbb5f0ff7bd93efa8e7cdd0b188b67f318b8ce1fd898b739a0c19c39be1a1f720962163800f7e087f3021f0e307033efe4fe1ba4e6b9cf7ee81ab65cf43cf7b1e97c23c8cffe294faa37140502d43758ac56f6770a17d09e64a4ade656a3fc3e726ae20d24503dcefb9cf5ff25d0ade52a77cf4550bedb5bc65a84e79fc1d86d11effd3f86f3f1cff9ff22e0edab616a74e6a9bb667e8bdf570f3fdede4e437c96b5a0601b927799364bb9dbcf71cc61b64b9fb2cb286f7f737dd3233bcec75df0d920f81cf1265cc7015f8dc8f3e188e3bc1dbdbe7f06691354eb416bd4dde93216bd8f738540fa53c437b26d9e22df5c96b0ffa2de3f1d3c17b2ebb3828a3ec6f7fbfebb8bc7168cf3df7d27b1659837b2f5f6ecfd0dbe4b7df33bcef06e8b91cc3bdf71d08cb9031b66d02e24cb62daf385c2d96fae4e4e4e4e4ad0c1963cbdc9f601619e3e45da609df2f61d293e078e20ed261cb32640cee41a8ed4f9efb933f753f283dc96faa2f494c29839e7e3d785a7b19b286c6fdfd7b5ff4c1dc6ecbf4c669af3719a03fe9b4073d9749b4e734e86486de27bfe13da3bb78ff86f737df9fd1dcc59bfb13d0671932c6c99384fe04835d94216b440d8666e80fe54718450711d70273d443ee4b66f8141c35f8e25d3cbfc82d7e86fc7807d5da771563aaebb7c38cd6b20cbda1bd8e689520725399a5b52aeeae3f91c6a633cd652d9d6545e8ec5fef0aab3f5cf5dadc7fafe52de3ddf6e1ed4f5cc331edbdb69d7c96b134edbdecbdf65e96917a7beec321f5b6fdf79df6e1e0fee35e7b0fc770af7d573f1bf6495ec3dee6c1e6bcb9df21b5f7274fa2e1ef3dfc3d577f78989de0935c5f1ece18bc74ec2aeb48c6cada73f751367b1e97961e65b30da9ed477df2635fb2cf2cae3fb81ef1307b0f1fb95a86c225d97a509bcbe50acb3a4ede85b8d643efa387df7315a6435e67bd90673d309f641d7b466be0535fb57830ef93ef340c6eedbfcf31a1077378dafb40edb9ef7728c7d8d79e7bff7a0071053c0dfe87ab900abb7177fd09d523da4775f6e3aaa8b978d005f8e087037c0dcc31da83cf83f6e06b1f8ed0832110d43e1c5ae8c14c014f6f3fa3351d31f6b9075b60ea2b27df4dcf8b5cd06fefdff71bae20fcc37dda8f4e7e7b0f9f7827787bdab3f18172fc6cc89ce0d19bf03ef9d16f27a32f6938ebe161f616dfb4780ee7fa3357386b238f8edf973396875955c1ad2d0f432ac5257919ad79f7e7cde1e992e7484e3caf3ae1eefa73f2f588af5a7cf6f5c755de67dfb5b8b105c7719c165be0ee0777cb50d07fd8fb0db7c03d407aceefc67d1d31467b0e23b18372545319aab7a7df8dedf38d0bf73aee6219aa3917dfc205976f5affd2e2df054671b9febcb4c8f588af645f77aecd35e661f627b9c23c1ce2c23ccc847898fd7cc1e5befebcea1157edca62b96a539eac87ab5cb57d87f2d497aba2abec675f85cc9e227cc5c71147d8d8fcf89144123288de99d94f9ee9337fb2a7acb932616545b80361e9c865ade561f65ab85f77e6aafe54565cc9fe841b612795849885fd361a00a0e23e7c455d467c4575b61791f7d5f8b71ff1bfa51529bfa5912d8fc8247c557f288f8caf2a912142824820328993dff2873cc2872cc20a23f1c8027c5559337c5561a3ecfb1d89c4214270d833f68bd448ebcc4653d75c790f5f913f43de36bbfc082d1fe76dca9eeac8b742cbffbcadfc94bcaf7c141d9d7dfd992b691357e4ffb0a9bcaf7c54dea6d38f49de99cb94331c9d3de5914fa23c259467947974f6f5355710a8acb93a405c917f444b235a7e28ef4bf2ba795bb0b2e483583afb4fc55776e68aca19fabed0f2b90ad359cae67d7de7c351990ed0421755f6c67517d0f4522c43758d787b14e7f0743cb2cd56d67171abe2fa6fbfb1b6598db84afbf8b20ef195b388b48a5861a41e79f5701b1ceb4978e89e0324beff14117346e36115321ff3dd713c94336735190d166efc9dd1d0643df89e60b18c98e1c4912466fca382a8e46c34e6999e656a46440000007314000028140e880483b148204c546db50f14800a8cae4a6c4e1b0883204c711462c81860000130000044006444081b002f88143d4bac84f4a4d6a3ba0ff4bad4afce631f722d717a0ad3ddc88842837f390db25abd4acb2746090bc33f6f2e5d766cca438223b29fc218da0b0ab2b1cfaad5b724414a1a9c1d8cc692d0fd2b8d992f6dc46abbb1dbf4c9d5c5bae65080ad36fcdc9143b56c232aff190a5cdd574257fdb7be3a224024745524f629bdf637847b83eca5037c6728b87a382e77f717552c1145d52634156f72e446a3342a92548a5b27c9adab3241c65344fbd3f555e998c2b21ff1580fa60e5b3cfa9ca8c183fb2760d78f4ea4c875c10f387c2c7588f6798c8aa2678abe9667888c0f2409844f49fa8f56805599c632bdc92ec49bc197bc652b69d99254bcbbb0fbf785c725a2298e22238635bc1ea3bc1f4cf3235769c4532cdfc551376c6febd7a230fb25576f2c20e5ce28031ba70a802107dd502ef53dd18fa5d2e8d75c632920d2cad18bfe22f6081cfb0224eab5806282ffc6859bc8216b1ae1f3e461b3eca1ee69fab8972701d246e7a9a168bc9b2826dc0c634e6354f6594323bb104fe443d2b1a3f227cbc79302f7c34d620084f3cff4e00fb571b8f062dcf5949ebe71d168bb5c42924961470a46b56fdc33571061762876239df857c9dcaecc2b6f1d565feacfee9872185f7ef69f611d8ff4930f6deeb259f0705cb643156f0550e8d077565ba233acb022dd1f9520d48b9451f1eacb0a28f0caf86f2cebc471b47b20980e1675fb89dfb7dd90e198a8be46d3d6c248258f5578b0f2c27b84f37b2ba20e834dad907fc83fb3ae778feedaf9a90a1b42d6fab47b5b6809158a208568b24d882df9496bfdf6d38dc1262e67af737e4f5e717adc8137e857a29ce3dadcf0381d7080848b6bddb219243d04165ae3c506085360737fc82a1d3a93826f1b2aea63be4c23d05900c8f7ab354888a06f555e0d98d97626e9bac0cee768861bf5cb4bb161b30a1c4409e979b5a82b7f95e6e26b9b7a0d944a38e4b9915e2f204df4fd64b5bdf384cd0e2f8c5ea81a6a852c6e85bc34e45f2496664b6ece706b7a2754908884fcb23da9d265492da51d077945bbfa33f0289b7f3b610b5d595c88e9119dd455dca15725fd4dd8a3bccffab7972da5ad9908e17e4684ff36f9d0532a541ca1f43a4820a5100d4681ce8418c06da014a962a1b47aea70ce484f07f8199f4fd14c61976aa09c20b0f8e1969ad62ff9404571939ed95af9a031591fa99dd4b9a10f7c0fd4c8b88488129892b8abab8800e104bc879a37d00c5a6c03fbf7e34185952e7978485bb51ed64cb097a3a26214e4714134c292d41f9dad47c42c1cd8aad21e1fe18ad878ffaac6d6c296f4cb2a2f69a851fbed1d6b0c2581f88bcd446cbe6bdf30d629a918b0880841c2f8c31e44c1eb44cbb4a405f597e30e69465d3cf08af9d541e2e83b06aff0bdd148b8c990220e4b4f534d43326bdc9e288b8da09a8412574726005f1586df7ad066ce8143b863096ecc397cf5e1936337a54310e24841c6f1ff3bf804c4aba187c3ed6344193da016b2044bbd44b116bddbf4a919a2d271c763ef04f3e099f6aae72bc3d9d9471e0ee87a2577824dc933161b021509fc048a3d2f346fc0c849a28ed509a9f40263539538a5cf0064be022f59f19096f8a2065bce53092aec1fa9eda41b794868377a1636ed59302fc4a91221f0652103fc225b73266470d9cace3af626512c9730004feb9e744f2e94011c98345cedd79801c3e3906a6eb2f2816a798e095efcc64a83415aaf0ef3bedf1e06bd1204bba914a341c1c536f999ca516954b095536d2095bcb91af9fb15369f98ee90ef701750b22dd377265eadf4e5770c84f868ff9816c090d1a3c099913a726e3b59efc1b02a7c557a018f3b94be47545dc858a827bd8851fa4b42c64cb3764daf76c3a5d22b3ecdf66b5d8cbe03ac1b4b0adf34c2459d13969222a1a1c050629f9a2668dcf407dad1b8413e85bd7356461a857a3eec3fd8688d3a5b0f71b2232ed486366590c369cc6bcc4f3b0d415350391deb13b0d71b32d7eaab3a0792396082c92b96e840c7db4420ce9699fa363c029866623b103c0f7c91b76e906168cd0879aef572437c0167555bca990d01611d6c8aced6b4a0ba8710958d8450376e296cb036935382b0dad772cf2fe61defb081df7dc77bd4eda35ae18074c934a8f8badafe17884cc0c43b30f7918cff24a34aaccf7e08b0c9546c9d857454e0d55959103b9db5ce71d6933c51d01e31c97e469b206f3856d766375877a8478981e373896d0b83ab8218285986615ae31415889e33465e6d627eee010f435a088b2345f8026f30f305ce684b00fb090f9e6b1e7de87fae824c8fe16faf621e47a2056964fe335839e356251867f44ee152ff02d87e0c15bcb238a14341a2a4750dd7ff3b27b49c064e611e78c37b36cfabb4ed915e985e1db2edff5a6a764801d5d5965b2b55e683f407b4421d0da6346e0ded0a392f8d91dbd68d6fedc837f14e9b9a809211880dc0f9accb73bf52acffa965da5decce142de2b424614b559f479fe0a2e5f747a1bcb238510df95d371e1f818337fdffe7575d709aeb8d1da262f17ee97447379613da7ff2b13e22d995ec9e8c4fbba393c99c4e29d82b4ec8463d557a4ba621d3fc1fa1d84278f20bd8a1fdc7ffb2dc82cd08fae0a4e76a5464925725f3ee60b570e2437bf2491a18092c9661d61b31f92fd0af265e5a5ae12bb0d693687d8e8abdc27d3ae53958b26751ab0b777e2f2d98cf04669d5eca17d689f33ad1b9da082cb2bd36b6d7390cfe81181e3d772e00b3b57e4f088cedaf2653d414d3498d4c380f6f9d4434f317ed5ab342a7eac04bb6fb67ddf4c9b9f45acd3b85ee28b5840b0f0619e3bcce2b5c01fa9efe47f41b5aab1ec87ff1fb828688a160daf1020cb9fb060167f3b1db8f26b78a721e82f638826ec6c909e3e950a16c26969bc56cb316d03708808541cef011803290cfa514ccd98fd4cc76e0087caca1ee07438f88c9a42b2d63808378ce458e0949dc72fb167e277905bf2f0f6bf2a5cd7cec128588f5f277fc33631ad74788564d15271b11b9bb5cbf08412abe38f8ec446d628ae5e115375598624fb10433461595c381618a560b62f0bd90dbd5b2821a7e51ba3402a4d6c5f1e458036206abcdce0638121b96d24652b26ed7c423c08d4d11fdc7599a15af24fbd1d5dc02f4a62543d13932847e96a2fcca93431a28bba2e4ba14685c6af12c90de551f9ef8941fb7a664572e4dfe187f471c130ef3170c3e4584939bb9d4260caab097a72395324d755537b0833e31bde72011690eba24c7d7779aac8dc5c954c22e29e9eb06c3ce851fe2f4af3edfc6cde0eb380bc1165dac9a24443098d826931132d332a9b09e1b183b653e2a15b523accff893fbec101af02b089671aa6c782ef707097928ceccd132e551480f5b1fcd71b1d682d566e8c79d05c786772f714c38e8540b872047a3e4b881094065b36935d53e816b9cc32bc652958eeeeb480aa98e7d4796cfe5e38926b0764100a734672ee2b10d011da2ea3ba465dc2f0e0240c6b928f46c7f6bf736f0b558c522a8860f9a75847e5f08ca6e8d9f27cb19f2f6166611a87ed71763ba1ac15d010202e8c4578555e16b7a318291165868a15f905ef841f5fbdbfe732c006210461a84d960ca2f787a2ae5c283866f02d13702c701349060f243db420580f6aa5440b20c51113f12ba574fcf1b9775be738147ddf7b44cfd94748c40cfd0d5e4ab537b0b344319dd06cefa8056a9c87de0a0088df5d16b5c1d0d30ff68a4671c05698d5b973f6220439ac21b0436100896cfeea1961f258834bb032ca9dc1dc07e388fa850e0fb607825159c46b899999a9474397f93ab804e9d7a04b4520dd03015a131c11b04f9b1493921941e7b59d5fd578c7eff204df600328424717e3f9dd49a81158db111654c6410e06b2440b167521ae3bfe12d3a81cdf4d24190dfc949ca4daba41f99d440c6bc580c29326740135aa17c54d7e4f4016973905e98b63e2cb28fef44e4de3c80acedf31f6b0caa833433e22e021810d369b122c5304b0425bd8ffd1230b7547d81bea6c6f1e7fb05dba0841d7caf969e212b960ea4753d6a476b1e3a0993badfbe0388530e1a4452dd593566d3297ca05604284e8a00191607c9b8287593f158c6018d6ff10f5f6e22c9c001aa62cb7a9a482f29683446a04e49ee4f719f185c7afb71809725c9e5b1be8bcf29608654b0b0ef6c811e3c873f3e23cfe6039c00bcecd464a18394fd3a3536e759c6748594a60aa54bf1d19d3f1c74611f1fefc58221049068eca52580d87fd35a5402577c1664f3a460326b0b4b41311ac69a225a7b7c6877c31bfcc92399e24564e966c0dac7e7a4815467b920bc15ee3c32c5b0d3a621457c28d74297165c3e9dceb2180a6a42a752eed589c6ad62ead7a10480da5c42fc498b8f09e990d787797762e74c940c6bcf0d394781e090a074a0d3175dc35cbe8028cacc53cdd47137e75eead05c282720e311cbce197e4d4fe4b96e04caefc0ccd0da11f81052e8fad6a06542681e1714a5994e9c455a4f8ee6fe80725a1c156f05ff54cf5b1ae7bb6eb0a99c52a67c6b1a415f3d1115d2cbbd16cf7db780d2a12671fa9489d106e2a4c09f142e8b1670cfd6988d678f952bd8670be8c28b2a3ebb85f20555ad6b405326d1b48f3483d06e891c7ca2d73947fc80019c46a5d339ba7e325a9b0c8f7b570a68d61eb31734d1a170b074c8d6558ca42714c166d75410ea628512ba83ca9e6c34369962fb0f2364be55fe2d2ba41071c513a7738f68b1012ef32201d248ac927cdce890f12042845be9490796317ef3b9f59298a397f76679779e4c4b0e0cf1b34f521144331dc6327824b22b31ada83164c05a3e8c933373db54580f510f5a3b821eea6942d0f320f9eb9fc4e844feffa95e9771d993df456fbd7ea3ffbdca267ae63a841429812c035d534f0c7feecdff0a6b66176dfdf5c1922d86510d3f733eb7fbba75249da3f392c2875ba9a0f94cb8413dd1b07f93077e5e070c9dfec5e7c20acef6d1ccffab0013e990f7707f29f8ef484817f3516fa0c8cf662d82fb77de1728a88aea258d4cae77d44e1d932186c4c91a75c536c08073f04eee465da4a87b53fb5476f88920c167abb853ff77be9800dfe23e8f48dfd89a044627246d45930bbadebd11534da28f3494990170048b68d0835af7b3430314bed1dc6505eb56bc4b1f3d12a4c02cf6c0a568acce71b7e3b2eb7f6c409638049716bd95272600263afce0c57eb976c2187f51117e6ff6312129a2dc86466af1df1c96c4360d74afe86ab63ab9055394477fec90024b0ac9a9047812b1b0521b3f02d31bba47800364a7e906b547fbb4db734a75224169310c83d2a492d81e39d7dc4e9a2a39784d4454febb3ce112c7f6a726e8351b25a4a1c4a845649712849d92f81a23689c19283ca0130715142dc0218dade9e1be4da3c03685b741e74026a41b5be551f061b766fbb2079ce5e233d171e09e08bf4d61c2462981fc56b726def85959940df503711c8f451ca0924c16458b242d851bc88d472ce59e823e5cb9d450d519ce37f759c3036532d9a2fc661ae5cd7df2f94c55cad44e1f8103e6ad853e166cedd55384e46d10e3f7c0fdec58a879cf26a6207e4a16748c7e0514fb2cde9d6e7cc956d2d5570c30d263a876787d5503c84a8be382431e034bb4e7be742df8fa9e3602e1e9e9d28a2a23377f9d36aaef54efa126c2126335d6a11fe1a8b2c7b654050243b901e803c8eee672e7d35f5b466cafe33adef5f269e7bae6e8944256234f0a0de575b964d820bf00d73713e62c1930b300ab19fed78648cdbe7dcdc7bb904daf53653f0df8a73e13c7bfd95cb2ab7eec9de224490769c638d0c41e11ec78d0656d22ec7136065ade6c386d202a04f52540300822b65e82bbc24a406fa88e8595982b624a120617a9aad8a4def566a483829b2f14f6c473afd080c25e51dd40a1b0877e178ffc5a9e7cf5ffb152ddca86bbe24ae0aad5ee44f7b73611d7fc9a72f8e2bc4e7f7c26212ef14d277725a07eb6ae4e1c6112088c43a73c9531ca92e2455f1a6f8aa440e8395e59bf5b6d3d8fb4dacc2086370b097e917303dda30e3d74993aeaa05fee0586dd2adc2ff98c91ff307d7f1d2551fed00a0a0b0b313f496695c0439a9e7b46ca47364a676d5e29265d649a21fc17cdaa95dfb73016b20c70ca8bb0b382b5c10d45cea3bd6c49b38d395c9fe4a6243283a705a40fbedcc64bee1bb14a3e56ef45beff2154bacf1a50ea169910cbc38759d25823673aa2f93eb0a6db81296a7fa27193f0fd25c882522c6acad3fe6205ded827eaf29da2ca82177ac9b094d6c20b6e58c1b740b4f8e0aa7d3f8a0e83699fc3423596eb1983f44060f1190466a85ac66495673f8f523d67765a16bcdd955b4e9f0c2111f74ba3c7737ebd2982d00c45353ba597d61a40cbb7b3216cade653ea002c6a81cd00cb974777f6696eb3d426dac7827b8318bdb449b355c257ac3b46eb2e4fb6ca666eed9e9e8dad217ccce02be000ecde0430c66c4a824067a60f932f85eba59955300861992e52b1c6c9b6b4ebf5c01ba671e9408934eed8a03aa1aca9bcceb54d5f3c86be8e80f11ec8a4ffc710335e8dcdd9fca694b234979ba3056dd9e71e2f89da361d9bc5f4a2cba9f202a419aa6901d65886148d729087f86b141c620c41535bbfaca1ebf82e0d0f7149cd86cd72f520f7b04a0136ec3d60d6ba15d053cb3882ff68a9a3c55b45e261bb7ea37a1c96ca31cc48e8ae176416788f459402b574a03b24b6a06b3886d3d692ba8f38861c44acaf08cda49ce274773d53660bdcec081934e2cd99e148001d266c571849b319f3ec0baab1b16240148e4aa374c9faffe4f101e20f4f309d0fd1cf97d95693e7ec9360cc2ea63c39b76e93c680d4570d7cde34bf20640e36131713fa27b8cc66648b7639335520f75d7815c7ce6970772a247bb2df100c2e9d04e64f76a77595af9f500bdc751a9fb5fecf61dcd24a43176ee9f459c2c07f062b357eddf7787e51047199a4a327864fc50f6af27e571445583671f4c9e1a8f8039a58de11c58896491c6572782afac026d677a238e265c9479908075710d02113b8364c70c17311f5e541992e115862cab6842408940175198a216b9f0d37da00ba705dd005a0bccf541d90ef33bc8abb8dfc2324ab578532647a7e9a76e1bdc328fa9d63ee9060d429a912990806cafb5f7a1a56e882575ce635cf7987fcbebf4315a721343f415c3e5ae5d8bad6ef9391c0d99ae89127b11cb2d59c6820db617b76619ec931446847f90ceb202d8029ebe9812c13ba3b2d213326acd8344e1fc8331e402d57bb09f70ec809f0398fc20871d6ab82482b1855be97a4076335fcb353fe9283d9ba2a708f494934b7dd2a798ed509b5848802651746b059b736216f6c5d04dfa9d74f9e259e778c3f234a0c96b2571d024d6caa3081f1ae6cb82a7601007b78050448c8b5c29937d123573b49ac65bd1d55f8780a482d0bc996f66838e87c000078baf57e072e482336d7214b73b878ff73ff316366d1f1294b81630080d37e95ddbafdc1c8e54e9b7b396df265f1db27c9aff9ab714e390080553fb25d9101571c13ca2db4f2b22a6694d301caec6dd1704a55104f1b74052321515957cd1acbe11e6df5edaa9fe2e1f7313d2f3c99e6b7b1045db586a23c1bb17bdb34f1f3727c4f9a6b2d5f74ef5c180e463ebe2758f62d008b2745da677c1d7da8554dd8c62bd5ded7e453352880397b6859d5183278b9e21995c4071c6a94b5485ae82ef22b1759d30acc6ddc4957651c7f7036f392658d197cf6a387c8fb65792cd6c0b2d5aa4a23121b94dd3198a74e3ab50d798380630c59b87d366316359a214ff05cf18efa7493923dfddcf81e39a007241dd04435ddf85c5d9c0401b9dc5e1d27ef7c34179bd5e0fa1bbec3191c10cc119163f5ce693a13d64dc826e0f8058aee1cb86b06f6f70cd2c0d3cc85dd24627abedf1637d08b1f66b727474f5032740e1579f4ef38e58f3e4a0e344d25ee4d4d5b0a335243aa808b800a2ea5b8e2a16590901a40fa1ae0d030c00d64e3d9696a492d1233e3d4a910e9c60313aef330781afe9e485dd3f48fa67af56233df02538be34ed85ae4f59c2c34c275dee5b81fa80e08213f7a499296b4fa5f147dacc3dbc9d075ed4bd3897933041c11ad990784ae63e2735158d1697e72af30d2943e0f3e1c0864e4a63bd6c468e659bbb161a51e783484eef7bc8c3be126d5c1dbd76ad0d9191ed0c15b4664c4a0d0431ac7b94de160cccd728b5023c68f4288bb6e1ae859b77d9a26066b38b9a879efbfbfd67ff9163153000609503d01dcefd23eb681b0c5d79d3c93e3d98d9b3fd0376014a26a73c400a75eade0853c3a314679b8a76f3056d14916f024648b38966890b3825168deafcb7f9b3fc725e17216feff78c6e9cd3fd2100bf1f5d5743e240802888f3bf5c78f4e81bbfcaf428bee793230e33039f0c52543d184bacbb78190cef15ee97a607a15be763ae48a9012e408805d96dd45873319c9f6e9f1539612de18999a232d613923e9cdd46e4dddde0c8d73ec56d5d1a4d45788d2869212de350e8d69d0b782578091e33e810a0ab4144dc784ad47aee7cc6ced27f245b2adb133725ad84a2e1ba78bc50a9846fed88701a543dc8280fec05a49cf58197a47a0de19a8ecb73003740478802147f322d033caa0d8e4fc420f6cf04c4a9b58d865f74b50bc9912ecae2b2cbbbf17c9c535b51fb682805c9b4a65479fc1b7b6882c9ee08164f857cdfacd8b7e0f24c3b65005fa4d8e78ae55a54a2b4dbdaaa5899141ae13227a9cfebe1290467967109a171ba6061189213b6bf7d2beb97e5d35cba1303b73506ed9e3b91b5eefdd8bc298fdd446955e886559087b9370f0276e2c7e57ab9ae83569416b1a58518db4aa34829ef1eb45e6a8acf4727ec29d6b173708f54add23dc0fe8bdd4a78e631fd5e1393d578a75b910ce91c6181d66cb349067294ddd0494521829bf140af6827954dbfbcec47d2981638d78cef5ce87f2ce3bfda9661ef084fa5398343935ff06a60a6ce62b307dc4fbdbb3e2dce458b3c16cf4765ddd6b458048c33dc9a71410d199a9a24829a0a172437677d8b629793c28b12dcba33a7aeae7cc9fd2050e209003afb082bf0dce60c4651db0b1bf88f2573115ad3c812bffaf7cd3920373667eaefcde1d8d86cd66e9cbf1eb23f580c0f28972a272efc44bc7c2b9e068b8e3958f21c4ad2dae3b465bb28827ed2e689c4b224a21c2209675af48604338062e7e9df8d6dbd870651055016fc13a90aa87857c21a60d19c2a345708154e308d7aeb8e9688aeca1ca48cef1020f7f4e7bc844d9f602f5a7927a83ba374209e2abdca88a97742a724da1ff4b060d2d544c880a4117348a8ba9c55ab4343d998dd3779479525faf4188d4325d422e71d48a2988fcf329d856b6ca683f1cc596a19022a4a03b5f0bc2f2c0a1d2779fa95e63e1e28e3b48dd867829b43d690e781ac8a8a1cae43ff29b84d89c8313c0e6f0eb9fd279bd6bd1f26ed529d79dc5e44f9f1852476c0118b6f1e39999261b07f8b3a25130e8d0a27e6e30fb72728677426ecbc3bc48ebd756e251d0ff07a4854ac75007ce1ff3c7c2eb21d2e2e07e5c26d2cc92846995c11d8200c4cf224e3e0c72f01e80a48ef73386ddc2ddb19f0039e6b22dd64b692318f11ce3e1395286777c9fea202b4b87da727bbf1fc3419af79d3d7d47cda97768ce5e7bd1a052c1fa273a6b4da49f9b266f0ee06ec833e283cb4b3de9f1e07a5ca6696795b09f0048178c97041daff18e35c8b3958c8e98317a63ac66a4cd3ab3107114d1b2d83856f49a27486caa7acee6136a6d4a6d6ff3501144a26ee5d88e06900fcdad066e6d3ac7f901fe193fce8ff02d4c2bcbf1fc2d9168f475493c6cdf618f5f43062c4c4e130bbaa6bef3745385c95f190e9ec0b8fcd9a6df81c574e58a6b8640c46e34be5b1aa32b904972fc941d4f56b3e4b03fab10b37320a73e59b12a7c1e6bcca78f3599d69004de0fbbbcab2a3ef1f43a37b12789753df535f7b6fa55de3d96f974b3420167db25c2486f621524f0a1f8e6d0032af658b5ee2f27ab206b68af414877f95b94f529eba9a3dcc1f009e6cdf3e1ff3234b1303979bdd6afbe847b173c9d0e56909c66960f8098ee34ba3b8de85a91643611c95c9df2c6c6484fb5c38b1bab74d328782a306365bd1e9d54ba0ab539fb9c3ab79e3688ad6903e92872d26d027382bad4c0d46b2f75d3d111a2ccfac8905a590f5ed6ada3616ade4b7f851cb58176a3d1b649ba34857b9d8655c65cf93d38ac0ba7c922f68862d22f8fcabe87f9ac0c3da3cef190f1b889bb03840f99dcfa0ad1753fc6a61ccefc5fca6fed3fc8ebc00edbeb337a902df6147fd620ce8719eaf11f6ec4a729dc4bddc6b2e998e5c101d85e1b7bdc59ac03eeb1a4a428fb20fb0b0d0fcf7da5d95bc18a98c17a18c64e58c2704c6153f8982e6dc3c84c4348d3dcc239eae4790179bf2f2d72c995b7d87480d0f8ad0cae6fef03d979226b4167b898515d9a201eb790d934ca3e6812e2306f4fa246afe35158a828b9c66a115d3a61461e9ef318868d03f41de2a0e6741f77c126572738314b0db324e566e144beff247bb8e96125d9f3b5d90ff4eb21b03d44833d13b6f5f0b0e736886df4628f9fbed18e33d818fedc338418ec344f890d1d56026e9c7ae60b1544d2619a0cccd7efacdb0b3cf079630c4f44666e63a1b1af2d66f62fac22197f19cf85c565052bea2d8771b65a011674cef4d2bb614e682fd9f9f964f6fce33960fdd666b6bbb7810d2b30000b967fd2baa08bff7dd1cc328fd2d838e77bd1685101222d85af0c7e06ddc0b2a2ba7cf880acfbffea1cf036dd163f006419e1338e2a1792d10ca7cbfc315718955fc0ad7cba7876dbc95f84033fdd144993626835dba4c0c684616d96c2e12f3f2e4290adbdbfc11d1b70ed7d426d7c7c52829a5733c18c1a2dfc21fb223ab02f8372643e5f4275383627014e57eaa80427ca4b8015bc1c5cf6deead08e31a2376c9f0817bf59213ca288824aaf5a0a6d97907ff93d29876826e266152765bd37077bba9860f6407f739de28f0945ba4cb2e4f24d0d9098c8042330324f62a5288e86c1acfb65108ae2d0630a06691304ce9b51cc28ac0054d2e2562db302acc404a520b80fda8b04823754324522c0a42d59ae95f3ac578aea91cb7177afd88c7b279780aa4e65e5c499b22cf81044c37eeebdc69f15029d49767b75cabdd3f63a9c9740b23bf970f4967b17ad0644b225e70be001f1f7878d63087f2a2865755a20ce1f2d99282e11f56177791456cf06102d5e3ddea64acacf96a674a3fa227d3aba7e5bda171060dd7b73d3c33519cddb9ff19dd7bd4f25b762f44261c42bcd994f7b619e8ef1d3ce2c2f1ed7e77bef385e6273a6638d27da1fc6546f357c97f72e37833f482528bd8c306ef3dec18a06aedbcb63fc12f7d02dcc6d40d24d7b274237abc7bc0b4e47d165a3dbd6eee17466ab4f09dd595a4b011d1c050e0857cb9ee342f44cc4b11687d5b9881b41ee2d48450244b043249de75083331522cbbe4757a4a4b6c4f693ef01469b81370dc4d2d1a8392129236560666463e2c4778e1991ef4b20f647c3968d8d66970384ef34cd6ca0c769460427cec53e261b84584dff3a40d589fff4fbd03bc88e4c050efc314d20284d061a4c65fb2a62427dfa2df331e46d3d2319f7829db437c6197039088db73f602638cc2fa8946badee01f47a50c7bdbc338885c8f7aa8d223f7651c5fd0a96044987e2ebc701ee5659392c6ede9e7c45363a751ca36cd75f6e3d83ae823c82e49e76b67adfbbb38a9e675780e85b05bf86572565682515952bedad0104f7a2c313e0c9c0bd787539ea22fc90c915238b064b3cb6a5f7c668b6fb6953074552a58c3e6be6ac9139e6690f1c69bdcb78bcc681f5e7f160933cb8d71b1fe8e0418f4760074bfcc771a0a8fb94c627b9cf72a580adddf683f9f258c3eb3181b7202e23bf049f6e3effed3a8934048f5b3565ed94487fea87975822a0211d3e74c6b53eb37e38842c8749371bd2f8c3b0b9ebe50722960cac403f67b7b44b7aa685815ad429a4c6bca03adc2116e849cc90ade0bd23c7a075c82fcd0e5160de9127164db4acf3895a07560c13adc484f6c986b79e62055ec504dbd67d2ffbbff8746e26603519180b267446f8442c2e59ed772913fef238f77d5ebaeef1fd0424c664929022fd1d8a0a7cc8d79f1fae75e9410913da035bee842c8a8cf87e6c496900f0a9f69e572270514e24f140c6369a7c05472cf82d125bfaf3eed9b94651dc643fe24347314c6647f56e2ce9be908eab970bfab08a1cfd82c2c7135154c9181e541966990f9f8d6100357570bf194e53611fbe4d40114346e85905b8122a25480b7023bfc68a153d3002be4c441143febbcbb0b17cae31983b8d2be537297f539601b85a0d9f68055e3713596204f6fb152887fd371a07f6e2ab6381d432ba9a80a29dfc5fb3312fa3d45ee0b4168c22c25215be9e98c481bcf7d57bc7bec1a9f08c7c08083a8a4fd2be3537f96a44420926130b6001170c329daf2d814007d21e1c8c699bbe22c9e2648acf01eca52d9528da7a24e99d246bc5353985f70d917c3981c402d1a655d028823bd82758bc9e6b5b03d9c32c2093aa08268028207bf7bf581bbec1f1de0a3d97defff1213f2016f4a613cba2c41248f82e3cb1e9483474fc76aa7b4ec402fa6287114c0d488f9e949822c11a589d39b7b606b1ac81b599724b30b583a075783dc6f1adfd0434baffda3f2a5fe2176a309bf82923e225174a9a48012210f1d7d2610b0b2499b56b6a96d242e4439da2f890dd9f3b4832ca64516b2084573acf68605ac7e2a5141af6038f0ba7ae3434bae9ffe21fab28a8c0741630681245620da00fce5ee086233ef1d532adb3a68b2e662698b81be36d61568d27d564aef6d90e9be9f31ed41a95be760da6d060181346759f81367f8774c366dacf7897288328fc93f3f00c3addb220cba820e419e005c9f9f583a110461b7b603999b99ea781e6c601c5f3a5635ef20c8e0a0f3df4bc57d6a263faf58f3c9e61c6e76ffd9426a511c463fb78861280f38c97d57ad56791b5c028110eb074a8dae5d63b0fc4ae52d51da7882fdd383f1ddd81cdffb8ca0e242cb4dbf36005c9e941c1978c3d7c03e9be9ebc0d879d8c75387903ef3fa71383dca7bd670ef6f28d132b21bb5e47c41ccbdf986d665b2a0ba7fef1c67360aa1154dce79667c26a59e2ca444506e41c2340fbfc437f8c405f7d7f8c99fc491ee4484934815cb77e3fb1e139d17a237af7d1f8b9bec09ff9cda018bde467402850ca474e9c492ae15ba67d714178daabe380f215157955ccef9be5fe327c98662ceae1b5f6053e9cf337bbbb349cf10bbccff4bd654bfe1417cca7f9fa8b9a72b8f96cc0803d9d673a47eb01369ad39fcdf8dea685b8498bed51191c2e7c4d705a765117bbbbbb000de6526e05f7f1a6be7611b1aedb138679d09a69777e2f23d924953c6920e7edf3c631b4eeec663b9b9e8a40d1ccfa7abfaa86efb6e7ca38caf093d25b4b3d1e49dc57878734f579ac673cfd80e1c7c9e2cd908c99c78c535079a583c3c6bb221a6f0658f91756a8d95f3a06a07910186447f219009e28f7bc0210e4bb95f547318c3743458b23c42f6c55de636c8bb0b592e53ea283dcea40bc198912d07b5ed0d036f9dfb30dc98c1b6b81bec292e626d22625468dffed3f464e284b1ba0c9c0d42c79388f63987e8d1db12911e5372f54bd8a6b10bbcda4ac09acd93996e577780f7237ef9e7513c7e9a629373c8a97e6874a9bc28f243334688cc04858645292d3f51ab55744ff8732fa15a0f19f763447f1d14d018398dc7407eca70d6bde9488e764ca3b62ec890b7b6f8118e9212271aeac8307faec46d5ba274ea4c1b2637b1a430d934cf52a1819c10c58c5ee195a98aac85bf6af2c0d10a91829440601b6ff2abeaa1785b01a930b601d4e04b1ea0d036aec73e15e44230a18a8a2fb3eb2d0b6b468c8a216f255831fba329e5ab4b5146a1018c3491fdd916cd2c394de2e261786c368f76092816b0410c32cc80745e641fcbd9b3848633ab3999f8d51619baafe5fbe6370844fa30803318303d17f153bca67be0a795dfb6e1176d36caa7f5a84bbb43dff35d745f5661bf911d2c759187eb515c2450fd2551e427e079be84106ca80b45f56216a0287df7352063cd94b013e2d89019e4e4bdc6bf0a72e4993f20c49de66e61298f0f92a0a42f5475bfc26532b51de63d34f2a4c9f79f03154e0935888974314c39e19808c1da825868a5b71cc321bf4bb8f25f2438de07c4f0f55139addd3c513efa28c1d4059be45c766ce36d8580e92df93f73748f86f2151eb0cb96e3151815af7d7c32d6356de77c117d99651680b50ad95b38a32bc36a366ab05c0b6d532f86598c563b868571f1ca6a94f529d3b64d3370a99db995332a3ae237f0d85263cf8a52938534b17ec73a7eed77aaa6859c8ba6ef1ca117ff9d530ab8cf85d2eb1393fe322649823336f02b8a53e7043d4827f958cf711fa87d895ce642fcd6d6e09ed84652af0bfb5bf4cc527dd081987413939ead8bbb0186de45f8366947ad06e02888a427432cc26158fb59c7e61c467904f3e1e3bb9f7513cac7f27ef14f49957a93daa9202423f156139c981dac9dc4d2f2a71aacb9476b36ab761ae7a37294d78dcaa78c219bf8ebd61f635bba6fa6872c450d7da3817a69c8861692094cbeb5afbe5af53de93c2095da3589a7e6b3c615b80f6629138e94c355989a7511aa3a59e3d8391b5923cc0317769b1fba29de3dc094dc02b137023587494badbe4e90138c3799f62e6612b2613aee6e1909fd94ddbff0675e4933ce9e846badc899507578fe62929410c6d143c9879cb046862392cc2bff5c76c1ed857390d1fb7f0c4d1a35c1b6b535e2a03a2118037cf1278d13462a0c954ef1982c1b6d0476ffe2d5d4aab7f59aad31d2a2634a94a0053247721d919b98c6cfa3b7320ca65f799ed9cf46770928f4683cbc65cc2a4fa2ae1eeeba026da37d4b5220ba2659bca20a9cb7ce3d227e1ba3037128079a73f15f0db741bdd6071ba7ad544ab490bb4d2c08a6aa4a94a13f48d5f5f644665a537d7a721b6289ea12d5ea3f31d86d60ed3cfd1657454bb1b5aec423eddd2b6a66d4085ee58960a922d6eaec5401e2909794343fc5a70816dea4e5a7ab0e720d946838d39984794de660eb054827adfb969291c84874fb3ddeb74b9002233fadf113cffd17e1568a0506b8981a6053c34e1137f067430f4aeab69054cf7156922fd20a96351d3376194b37c003f5180d2209e1d542be0407b98dad97d94cb8a057810f4780f15ef513ed8061d57832be5c1c272062065d15731d1a236821911458e267a290292e447ad8a22315e00cc9cac240f2d8fa2bbd00c34518bdadd2272718c269391c285b27348467a20c1b7d4dcd2822be6e82c9690f65ef116e55cc2869a54cf6cd410b610a12e341fcc91c6f382cbc811859d829e3a413cf66fd0248dc7f13c30b68bd005af91f790663b0979816705057297c57882f7b9b731bd8dc7eaf5786666702a2daed6318f48149d79b84e082b379ce7818be58c810a9eb810569588e27c7c431d74f4729cc89b304f350fa0957a9805f489492f8f63929b28fb488ceef2885eada19f5fccf12f80e417d77baa8cc3d0b8e3290109aa10924cc19e886b662b0843c090cac59eb90dfd0316eb9372cb0f956413bcfb40457a6337328d3223f989a28dfe00cdae251baabadeed8bd39bcf1a92fb5a7172b9239fadda450a30fb8cd07299a08dfc551899d0d9e70e73273d3aa995f51977e59ed8181872fa289313b115c3a089660ecacac42ac8a63d181a0e173a699311f5d51f76247cc961fd4a0265eac3ee4241638aeaedb3cafe09f01a78c82d394b36694e612fe403a83f7eb21f61e1bb5266e96699eb1b09fafa1846eab298363b09ef2d832bf2de9393bf7042b912267d28008e142e36ae59088a4e51712502c602d66647fc4d6b122d055721dae946a79b94e062519503e7cb7006e869d278b8df06f62eab9551c52ee41ebfb7b65e85643ee3e689c03c3746b238b3b12f7da6c6a020f5a735a9db23ad767d4f245b4603a45b1a9bd9ca935bd36523eb030a2e8cbe8a52b176acaece02a6edd06ae32af5ca6e962f4bf3eb8b29b8a6ffdda1be9620535dda9fda4ca55f026e739498ae7998c2de60e59541dbca1ef08d8163b109b52870c9ee51e5247455e1135dbec10ba229b2ae0a326cd5cce106e927549c126ecb9f2bb533ef08d469bd8f9fc2aa5b55eeef0e3b48b4c7d830e028d3ca569b181d86776963e987fd0edee5c1081a3e8861330774be82f7db0563bc9225b7607ea5e96653a34fdea7c551fc0285b679a9a0685159e0d90cf7dd606614647c30c3abe0ba994dbaf1aaa78b2fc0345192381adc203cdea2b3caa0c92479be7d51af788102bcd952e65a1ad14447488f3b8cd5ab5fc90ceaf6ce81eaf6a5754c3a1260138d6944e33ab6172d8ba4b96ef557a1b49cfd79074bfe886b898856c0e3af3c0e2b9c62ab3850e8de707032e11806507a83768b66948240573475b7d31dbc46694083e1e5eeaa31c06c7279188a9396be542e1c5f3369227b1c70fdc904466637afa5b29f659ff44dea8b1425748b7f4ddfe247660171f847a45f0795adfd93d2127a2aed9a2829820f26846b17555fe8a4a157a693ca5f30277aeae85766d0a35e2039c39bf4b57e3431d0bc325e915d9e67269484407b2b075bc1e12aab385480d3e7852391d961fa17ffbdcb5f70e5a33d28d33dde16f340c8c8e2dd00a4e37b551eba83480bdee255603c1df7208d409276283f4cbe913472c37dcc3a42ab91a45262b153d715e0fe4cdd28e86878448aed02bde51b2addd30dd34ff82c13a7116d0f90d5b29f2e7fab1be0cacfbd5ee028d8c7adb09ebd124abb352f0c9fe3b4d9d464e928e4f1c52577847a6c12232bddba97e320a3cb3dfb8e2076cfa74b62a839e39458e45eb4e2a84676536a9dcf67570e263b352cd6677d09c9c17f4c854a688bf94fe1059646af0482cd793566010fb5a39bae7e66d2f5b60a14e03264003f967e40cbfd2fc8ba9c939c7e9cc5e3c65b4cb5f8ba93112f30ec97614867fe5203d497c4c4b07a0a0eea10e11054e072c14b45d4a21cc8f94310e48050f4ed23c505be64fd9767a13b5d004b35f2df8328a338a8bdb3daf41405808c93bd9c46f7618ea52439be7039b862f645314a255b7acea4b536b3367115aae25959fbb8643a1a9238b1a5b1b3c825c904c0f7dcf23edc5846e9d9a2a27fe2f0c69e61a0e9c50fa68c4bb9980c9c8436086d0bc6360d19a5e0c7fded53374ca06198e7b61fe14c5820747585b00912848d282c5a85d0497fdefb732b9c645e03f3f0422cf022daed96bbe959f4f0852869f974c0458939f9bf70dc478b5688d4c2a909d9c9febd210f741fd1329f7b7f0cf7ac7975b108e78222d083697e4acdcea3242a3f5f2178bb3ba59e190c19eac084f98d5b7955aa83560fe756479366d0a1061b93a496e2357a6f580c92b83dcfc296faadcb5cc4ac16065ad4d366ec3cb4734e7881875ad475c8a63e1cd5d07dbc4a0edcb5735fe7c3b8b207a967452c96062ceda12d71791e0a260b9703b0b4cdef8aea9ce3038c9ae13b93a429fdb83e457b9efe680ab304d1018eb874c70fdd975db8a21a9336b7a4d6f589e7816b373e8e495ca61240be935a52c84890dfac466b8677d4d4a31c64351a1d669fbe2ed33b77c33fc9399a9e95f14edd26c7ad24b1101dd6cdf8744713a073c5f63731d6f377b03d68e47a8e08e0aeb0034f5edb19c48b932f1e2532f82beac013d77682f8e264e5478900e70afa0d2013016e4f2037571cc166708d825aa0f2e067089c23848ba5db8c53a0c934b6400fc7cf586ab06a9467d22fda297b66b2447e5c3e451c12b291938de4413c4789dda62f38d5bbf2bb5a15d597ce9127ca4708ef941f8c813761c16a0b60df0889f8557198ee292f69157298ef415e1be90e050acfb25d821bb406413d0ba1c7fba50b9900269a8fac0d5162b8b356ad1a62ab46a0af9bc36dc2c3322c1adc1e498172f35550039f4b9a941afae2c7eaadb358f576ed279c71d2b8a1233bc130ba84b2d4be9bd428b3f9922ecda5b3305580121b0275f8d8a80bfa2b801bf512a4e325f4bfa13758a9a7b1c57c11f0b0b628d2fa7110ebb10bf1607a29a5e2f4ece0b075caebf42f524fe95e35de318569445ef2536268038cec082dc1c5d5b5bf82e64ece33b259c960a03ba058d62ac5495cf3df8157a3accac908eb11dcaa45c03f867b678dd95f188fe2befd342b457906c2268471e140ee84550f524c190030e31e6bbdf134448b5480d718d0f872ae649ae860e493a7ac3960db8bb07bac810126da3bd322c8d4589dd8a56b645842a2d4f4656cda4c6cc16ba1df1d53895c4a08572a7dbae28adb3872b767f66e49eb8855528f2d2fdbad0a1deeb2f65e3529da117167a9d1acc2bd89a8683ad0974a4f83e5c3acc0eca95e864470a32667a51127b770f5159107632ebd91dc18b4ed498839ffe3a23bf076901ad9076321cde015a6b6e16944bca208c637be7f81e4ce42d013efc2344e9b073273947ff44746b136bb07d96b6adc82d54874116d4e168a17cbe6425015f01bf8d689fe41b8904f17328346036e9aca236e3d8a5d05708a2259ad9cfb4b2a8944ad92137510869afba4083dfa4ba12226d28507447919c805507a0202a5d357e94b707b13a74dc89c28ec917dd2dc9e5efae88bc0b7b9ee9e1b205c14ad3dc828f3dfb1cb9ccd382522e557aa1fe04f54b6aaaa7a5d318a4127cb8854d1bcbf48df9b1373e6b1ad31e4abfc2a36d0e697f63bdb50dce5a54b19bb886454c314eee70b98f03cee7fd945e7caf68ae34ace887a3bbddad79b65c80ac1cc7322e8f2971558a48998892bd3130ba4884bcbc2fbc0e9b25606a45d181159631415089560b2ad0622fc4f6fe8f70462d369a7f9b1037026c760d857bae9f707a536a3c0a7b36fe175144a95d1a7e003c5ea2bd990608efe2bb694d8f7288d832dbd2154019e60253ae935f3d5929524f76be6ad8856120b6225decdf08bfda9a7d521fc6b5f486d4bacd66c0136a1d5cd9cd7aff121c0cb58004547f46b3625cb1e43c0e5a8c96c91213837422d85e51924cc8e21ad3eea3d91e6c24e8a316479ad99c744e8d3e2c405fb846248f81d1bd3dd6b3d208db6ca24116cce45e4513809eb516679f4270aa1f702eb817ab3a6f5fcc37bc8a740f3ae24931b3f27c323b1d94e6d27f383fbb4e515fb79e0a24a363a9ee181e4251854f11c92368d551f3603391924d2b1a541ffeebc3a90f438f704aee9ca2174394cd3ea1fe26d365e2e531cc65b4eb61ebc7d463207f42424d43d90cd6016ab72d76a69096951149a6b318968d1adbab6781dbe19c19bb85d2a062377bc383c4a08730ee1d3ed49e09001c4ffb36c163baf6ddb5a7ff680bbb1f3488dee5356ead06565be37ee65142c007a8b313ab78189ee088fc783ceca81708cc33fba2146751c916ed95881c48779dce0233ed5927ba6ed35240d6932388d506c2771c28f512be94a829d432ae61cabd1983bf90cece23a56f4c437bd11593db4eb0d2aabbcdc1b56d416c5d13cea1f5599d096023b6ba1629361e1c1a63175adfc84b6f9377aa5602bb38f988a67358465bbe93ab206130dddbe140eb8f894fe97967dbb84fb60d72e5cde44dc63c8e721f9c8cc66dea27429f741e875597a5e8251104d29f65792866f45df2b1a0f0cbcc05b8760f74526c3abed62f44c1e2393f806d94936dde4d7e1ea9ac150cef5179d6bfb78b6d2edc64bfa3b9fbaa9ff10769b6c7ac6f7646dad8e2908b7ada3046256c092e4591f5c53b2a4780b04a4e1d8626f7121fde0d5e4ae82b687d8c95da8dd9c99de0a6f47e87a5fd5ecac3839f7083f1b72b0cf0dbf2ac838cbb64b5f0f915b853ac31c50922143000ce1e96230289906d02f1569d6b88216b6c4d727c04867cea06c98488d4f54eff012774883d56e9a895b0f6d99b8afd173caf64482add899282544ed49067240f427f6df0c22c8216475374848651ffb3c738963a41681ae75571113b1c9f29196814af839a680393840baf0d856438a798b7abdc573e39e0d852aec85eecb3580a730fd864704c664b1301186adaa7a69ad2d82e71b6e819b12c0e28a73e285980f0bc768ae556b9c9a20041d297991a02b55db6d4dd133e66da126db5e4958a3bdd0abb8becaf0be851ce18147442f05c539f8b4e555c190b9fb30ad1c326e50e6a8c194c9287c96ef7596b40b23b25c5f81b24e90c02621b430563fa2fa4d0d1f3628377ef00c0c1adf4efb4c57526ea9e89b0392f77878a97d8be5fafa0e8b1f3e39e282a2ae7d24f068c0d231f9df45a1099ee309129da3270a1476ba4c5151160d291b1687625744e3845675cc3c4d8795ca21c066aaf1b2044d56b67a1f128dcff529f13f56a4f57c24169ef8391211ea92568d565b0f19aba5c29b5e2cc8da72449fb030ab51de803dc82cb4cd3c8182119efdd9f534cb8714656e853dd8ad6b348b5e2f96a28b3c3448a42e6216de7121814be4f066e2b6b9fa73d6601e0234b6ccef3fd644f5e8ab840e1df39f3e8ac3df980982e83fffbd2d3643c074d154b32af00169ea2a204591d39b07c0bbc3847714a6f9c21f09f739cbec84101ccb029e8e543713347d0efa53a9ffbdd1098cc7bb7d694231d18ed15e759cacee827e2fcfb6771e2b2e62666344ceebbaf0bb1bc66176c12ede2af0a307b76281ad71988480b5b91c0b95f92a6214d8a9bb9597b0410b1650750907852e21e9f6451efda4bd300b5dbac9c91eec821a2d81e26b3dcfb40be535c29e0cb193d364ca85ae340a7b3facd15f402aba9a96e05063326a21354667c21a18d57d5e4c4ddb721572750ce89dee27a497ccfb853d555f08edee05cb855ed83d3023ca8c90ca2c811cee22ebf20191f32be6cbf9ee4a454895c26f86145830648990f45caa6ac61e4bbc06e6db004555190f0c057364e639a109904760921dd3ee11bff03ec8cea332b62c9328b40d532e0e7cff5c26b628d88a3f22800458bff8319650211b574943a898c98341cfadaa0405635a675919b467cddc0e11c42732d19c7828e76ec5732c711e76b90f066c506fecc61defb104828005f4dd34e53282ca7d37622458ea9be69c76c97e91b1840417c22e0d84d057f99482100a2f8d7280fcb3eac06281ac183648575b7266d94162e352f8a44a097b377a426251e043bee01188f261c5160d5a45098f320ae88496f298ab0b32d112552a8264480632709e9a4af237ab3236c362d31481de4fe0c479e9ef3c5142c4f69647962a5bd27583164a8cb18ae496b1537f05afaea99a45a184e34dbdda31ad9da43d1c2451070c9450955f5942250d646e6e5c2dc3a20078101e54172cc68d699cd15461ba66deb344205e362a28f1f6f581c4a49d4b33417219b50a4e56c64eece7bbea057500241fa3a2da64a63529d94105dec4eceb7aba991a0418ff4c254a6ed5a2f64e0759f2a954e1a1ba4842ded796b54415fa498e0e5bc819aa544ef27f545f8b52efd3a5482e47ef2f06681459830898f99c92f832c12a2b016f4909cf5c82cdac9feacf9e242cda1c4a53612315007c411b84ac0705cf443dd1e2939534e4faaf12c511671d196d2d2adb2548c5955995d216971e36d29cc286b5ce076c88e5368c1b477fbad3905eb59dc1e3c17d1f2cc340682e0f03ee4fe0e6fe11f2c1048b439e1ad93326c42a2eacc5ba21fa79ec4c0114a1ea845102dc9b4c7a2b074206962a6306058ff5aa02786ed13d66ec749c87a2b831006a000dea0a9634c68daacf0c861eacc2d032cc8b554811f5b231c5770231468d02b18720c6fc727be806d14fbd446ced22f7b81b5bc1af22b7bd0e3e3718546dcab6691fb56f10ccdbc2943568d45407f30c754d44568edbea260444ad2ebac59bb6497e4061814c27f72d2dfd51261e5a07c5fc30dd2e62257a2ddbd25e5b9a65661b84f253c94479f1b36149ce61ae7b0ff9c461b0e1b351cbb24cd094fce4a87d6fa4b7225d6d4a00910968e48a7669e9a96d207b4090c84a618647951f40e169f84e66e0eebd155f09535c380166f86144ee3e0f2ae002872c833d1aa4800abfb5451d8c1164c132a068d08e8394a7dba3ff673f573a7c8339f2b91e0b580737dd7b290c42ca2b0db43e0125c18cfb00b8ded8526e72d8bde56c3273d690e978ba8444c6e29f50b1a01d3185e7bec3580e9be84c014c72b4d1bc0948fac863043f32781c5e8b83dd39a2506184ce63dca33dfca5f37b50f17281758bdf9cc5839a9b756aa770e3b69cdf9db6ff21a75ce951b3071bc1da0176d4240321b2e5633aa713c73f0329ac7a3294ee6de0c9a930fbc8bce57b4d478e64603d0277ada33efcbc3fccf0df76f0db58e0ccf3200dd5512c52b6533b4873b2d03b32b39df3e28b5e26ca655d2a76a0a18457b063696236ef8da0406f9368e27718834c1732fd1b427b3a198e0bf0c10cdc83892452b5eb0e5ec3b19939bb7d3f169dfacd2e9cf58853e16d12b8000dcf4b872a14b8568d5a7fa807e39f7d256ba3c02d03c566dbeb2791ddf06ce3dca5316478b866d6a56fc1607b7b719277d5c3dec444fd7239dcadcb40df8073f2072cfb4481d5ea7ed6de253172bc2b76fd8ea5c5455685ad54b7636b6d41405890fd774f339bcc3d80917a9cff5638f2f2ff14b61a99a9cc0f70fb5c133aa2648721a9eeaba8b782a62728db0d00c3e8315e9af530481743d521286274aeb305967221e466822198164d8404794a0b8da361193281cdbb4589f2db7531c8d7c51d8a47b6972e0b1c78e9cad1903dd9b89efb7c3574ac38dabae0e2c2699171e80b686696a0e3bd1b700fbfcccaad35dfb16e0dd7961ff331d56f29bf5c9a63c9d674784d083983e10e6d375a9c572f79c9109fe7a7cc477012bf1b6b8796d829236a4f44221e4445aa0d60eef89aa237c0a586a21e5c53c93538f8710a9cda844f32e9a9ca4fa4764e9c11786e8a6e24da113a4ede1ce1ba216362038e16a5a59b9fa07d0308a181848b1b8054e727cd7af6d8a36131b99539944e4e1a81d1446f244ef926ebfb2bb87dc8ddb4119fa0d4cd587cd1b0cd3cf6729014807c6e0e0b84bdd8fada1488816f18578709d60e7006a48c5b4141625cd293356c64c301c46574e85f126c51be4a69bebe042e28f0176dd7e36f189aa1c58000c66bb44fb84df0be063043db4f18022acdf55fdfebb3e1b7e190a009aef66c3f863b4e81ce64b469bffd6152180788971d8374c7df9423d14c34ae5ef2f0f62593b17fb6f9efbaff21176dc86adab4722827b648c90d279d53323a0d669f0c20e293d73eccb3e62d38d5b0cf090bb7846fb0561cfe25a029e573f171279d68a76190a9f940fdede8c19b243d041929d1d8b03af575b1ddc44c0743a1aa5d55b404d3b068656ce3c82708cb4ee9a62c8fbcdc62efbc03cf3d97e4516a89c1ef193d9ee0107f80386995aae6c357ecebcc0337af2d85b32757ed832ee844c29a93f5e7c3f12d84143fa888bb36ef50e3193e4f8d462ff5271faea7f4b27eb91469abf1094af8c4d62115350662c939222ec1647fe508389556189d9a2f2aa98376d087c6736d49286c5c1dfb8b285a495fdc5088e2ab42b2c5489111d6584f79fd6f8e508356f98a3257f0e4649f82201770c5967a32d3e113f2418cc454c2af2928cb0f4ab3115625313858797905fad73672c3e544b516f4d522494dbadb307b52e71b7cafa117f7efe89d62bc77bf5d6838f4bd1bfa00baa443361ce1f1c9cea35a8f655dbd82a7cf8105749ce6990f3c2f8add60fdd3d70f8577fbe83f0452b2857ba5f3ccd1265addf80f3d42f6fb2fb72a0272ea27b3dc1d15dab6234d918bc9fde649902fb31ae56957b204616bac87e3227bc82d14344274b4c846c2ab0a7bc4d84c6f5df58a7e8e63e56192d08bd778a8ba22865b6faf770608501ce2df1437dbd3e8dc659b3b1f01446c1a1f00c04c18d416756cf60e41b051e3e358920378a73151d93707c31fde99b71f7ecdb3a8264402f89186a2f83d74d33986a43e365c78a8bd3f251d4015bc9abc94437dd80ca70373473f4b07869e2668e79f5d94a0aaeb4d47b74d295888905cf3cf5a7aaa5cb9c938706f11661834253a30c46ab23c99784b54b9543dba05082b24ac08e9bd4208b7d8f82ebb345c29bfb454cbb1d4d17c5b3ad5afcc14c68fd772cd38fb56a8d15222f5fd68374b83ba2648be8f4c008c3012dd31f6ff33da1d32f6dedca4714b85800fa08c7b9b8303f48fa8af0ec84989c02246b64c08814b09b8cbd0085e0aadd8ad39ae89b588301e737a63b96da0d32cc5ed3ab4ccbb56d8a4e0e5af649288687383a3b1056590c52080661a5e0ba99d0a20125e9791cb7928237e3f5d3a20be11e284d569d2f36c7dc52721bd59f21644d01ee50d4824d4cd79fb91bcddc1c99253088352909330b828cdd2be68261f3b514265b76d2874600452889067416911fdaf6f3a81f1ee118d8dc3382f9641214fb1b6080bcb07835e442bb34ec7042e4fd91941cbfac8cb0c2b9be7a482a9da3aa61060f1545a896b995525e7cbef4588f970f5c612384edfdec9ed9852b4b100ed4b8bc435dca58f64370255cd3e2dfa6efd79189ba4dc7d38cd002815f7e4f1bfefbe0721423bffe1f7011039bd2fa06c619a4087defa5b7f337e8d7afdb6b7fdd47f2db1ea12cc6072ac6fd56728fd3f0729e8186947d4570c1654cf7b37ffd3a5f41eed3af4cb1067c08ed5604d4bc1215243999672dfbba1add39e149f86831cc6a6b18bf31e075cdc0fba6b0d46d55f53a25773734d5a5bbe1212cebd50e5638055e2fc7860f6dac5200faef5074815b5340f000264d0a32144b939f1893d41b3a981065e5a9ef6ac5a2d4e73a113005fd8e26597fdd18d6d0216bae8b194ae209c4c9ef4374a900032cebad8af45c27fc22430cd9ff38e1452d3293e942848e448cbbc0ccd8d9d1f15b5e5a8f75748c47972ae201ac322ddc64f11266b81826dc1f43b38a8dadd629f62618f0b2a5346c36c4f5c5de4d5e632f0bc630997737c034cb2388921ec014b4dd4ad35f23113c686af1f1321e28aa2b376fcb808299a4db10979a91279ad641cae914301d549cd9f74c19df8a4e52ad2c8fa9f97fce9cc1873d82dd5c3f252669edca76095afad4b5d40ddd62ee2f284e4427c8fc26ad5b9bbd568f14a454840d52a436b4eac2c40b2c7112f2e675002ed80858b432c0f4d19513dd9850e705374c3aa60df54338d53a1dc123c56e84995e4e15fec9085b30dfb2f6db522c4d13f5cb3034b2f73dcac7105e031db1636081af694a2f6b18ccb0f84ade9c0b2af71c6ee8d2e74cb7401c9943f3668bbfe63a00170d6d4ec309213f6ba99a5d045a33cae35951f14337af48f351b09ff6f9b0652449d5ace4640726d551cd729ed1ca734ac524084ea9fe7e7f91ae034b90652cc4d74bb704d6aba5bfed6ae62cd085663301efa01ab57e2ba136201da61e9282759ed032484a570fd15e40fb1ccbb090655587a2f41ff825696be2a01be61ea37f32329ae052f47a618ee38c83a3a46bd6e37c4aa4c22bf8f260bfecb3f74a07a4293bf0e8047f237e66c3bd26afb5318ef6a560fd86381417e70e51defe6efbf5ece211891054a397ad12034038bed6f93d54c28f9dd79483726cc850330fd1d909386d9f936029ab34600a18a4fb8c0302d044ba425016d214225456bc265ea057e38d1c3749f393ccf8273df0d4db0ff812c9ed7937f3ddd85c4183079e886e05a5b150f2cd0e0c1889f443407663d0207ed9d88723013496075d8df3b595c7f8a850e90ebb5c9ec934a2161f1b480bf05fd257d24a7c7e4f021dfc205d2f7564e047e2d66e35272be19080125a084a972acfd5550ffcfd1a5685b0c3465f1af8bcc9215c66b944ccee2f598f36894f491e3d7f103ecf0c0d21c92aaaf47e4047f044159702a818830a45422c23e488501c58228aaf0b6a87da84c7e1921523e5856614a2c8a0c5c09ee3ba4e954cdf11f3eec89bc9d18ec9fd4fb4d9975a743bd6d83e71591dca30a0d905b69c50adea91baca29448f2df5fce2a895385140ec1a4d83cca93ed1b73a87bf003086e696068578f721070881298ff891830894217b731bf05f41cd17ce71f7b4eab5e9f4a0321df6cbaae29058dc247720e7d579816a31b64f1cb77122e43bfa874e7240ce35667e45b612955000b920431b4cd5379d9a6fa6747282f8ae577976f9c7e95ab4d6f0dafcf607de532b13802106ba5d4453e33654422a708a58ad4d12566b8fb031d8d68f9c372de864dbf9fed404c0a73fb487847e83eb79dd219be6cd08ed71b2ed6cfc8db75120cbbdc2b44190adc0adbb2c82c303b2f47da9c2f8ae084bcaad0db776a2ac6cd6456847d7991a09d5218262069b042d77c699ab6ae8ee406d194de45c0c0168a08c80746cea8de36e380664acf08de8a383b6eb2b003fd8982ae3103ae7fd7c95e6fa8c4cb1a076ef2265f480f00691cedb6ab425224ee16e842c250ace98b2c1f9806bd7b1144a3dddb55631c2f9c9ea40a1741da5bf17c680066f5740cd4643ad98f576e6c54abc81d6f69e41def023be0099b9d6e3f142edcc14823f79e38709c0430d452094f4ed1b4b1cb35f0f0e39eb18a5b8deff696eb3f33896d00492688b3d767a9213f22771b170b121d536e8f52b15ef79bfa350e47c6002ef4c0abae283b52411a1a3b1410509701ca594cc1ddd352e59593b250439fb9b335140c1d3ab603868bbb693235b77aea2da9c554a9103ab0d4372a753417a82d84f98736cf8df641b4c51488b639e79ebf38e8aa55c916398a295c016a6def2786a1a59b9037244c6812458860a09a9c01e941b03523f925f140775ccd8e28bc0e835bc33882602cfedf4286b31472548a3aba594af5f73b03d3f53a223f5513aee6b23680af8ea17033d58130102a4bf5972fe36555f13bc99f2a2b72b97f6f3d22e69acacfe633e7dd781fc74c9cb3ff2fe1da9cc540cd826f189e043cb78525e1350f16b0115797d37af3fc5d3e78da6a7ca47d5e027ac9819de916f65ec9fae64821935666b6239c9908a3e41b96d2a92e8e6de5ce1ecee041def54ad908af5458a369bd2bb5bb10344c74a590d4b2587da8ace64a0169655e35743d11359e91d77a3a6fa5105467a648c80ca055bff4f769dd925ba9f5340fae2e53e6f2f74f34fd4190a54ab5c4d6100d89fbcc205aa995f29a05180eb3903b71adfe4396d6759412b5862b0a53416ba53872768821f19738cdd05b4383304bee01b4ec9097879ae4e255cc120369aa41c548607885a540c77a22e1258443b69d7d739b1245d870811c0295bb77576af8e7d8a169afa5acbf986587e2008bd74af97d58fc811d629baab55210bc4cd69aae5a2988c9963c83d792efb356aa599af6be6e3a262c574840924d34dc62f2abbb4d4b055f53a9ff292be3aea88d55751608e177d1d2162c399dccd306a96f9aad6d165bfea7a2d92c987198cd06dce1c1ebda257656ca0a0db24f7a7f8698c80fdea335893b0bc3a91221f39f99956e201975354ea9f36e2eaf12a8c29bac54f090406b8391d73327af5297651d5093d83c5f429607a23471a0e363ef0474a42f9cd48429d5a81bb14865e55ed76582d124abc6779389cf6371f8034e71cf0ae5d8c299ea0bda6d8506fd262f62d6478d6a5740011833e868306824a38c0b0c6eaa5b64509870d4c4f7835a82d3c8da2b8ad53f6bb0832b55b1b163d57fd879e2d8de6b5ad5e4e835fb62a50c39606da717412619ab185974c13af822dc930a9e51eac0341cf16912abfef282c9c0d0e1559d43d5e902327c6c64f5cc2092871a212f3bdcc4261359899198d4e9fec2fe974033b45e79df4276bf844b3f8dae801a689df26117ed96738f0911a81ae7eadc5bab558d2462b1f1434972d09b3043672394e7b598b9ca337050537fa39b0e8d8859f29b8be30a6712a88e5bb711ff40218c99de9b7eb713cb87581da9ac951e66f43d6df70006388eaf4ede3e6d68d36a2768e6ff1a02e97415d13338d1f4bc04970ecac8e9413f2cf3891a4f18c1cac82ac3dd88d6a0618e5256ac507880c2c830543e981d260ded16d544f61109176feba48ae36dfc713b44c85bab40ad64fc950b038adc1b8e9a3cc3a29dd6036fe8e6a9828edb167797d9c0e5bdc40152242d4723a400add4bc26fc3ae0376d1b7a1556ff0055b47f43657587921e517b459155ba1ade23968d1077714164a0fef8eeecaccd8822b5bea392cf4d163cf943be27d539828023f7967f1a42b1c3edb13d5edafbb6990373fa917078a8758958610270857610a4038e39d45273803f1283c7bb7a6b4b4ea283c632e23a0490de7502b4e4a7d5ec51ae78405830c1c14af384acc5a090e98ce8645dc17ca8fbffbb425ab6349b9c4628c64238540487901f4670e4801034b8df242a7061d89cc7bd9c55d64e77b8da911c680ee0b0f946d6f237bce6a3846b9631e04c4195ce1bd771b47a9c13d693568048d33295e3e870bba7c3b590e9dfa0507100ad8ba24347a307a8969d8eb8ef11c978dead1b01fff1e1de340ce982c96266a2ddce6e94e2e664a081eff169d2aceac2ab08fa2ba02b558e7984162c24825714e149fee95a2b1d5c86591a71888fbf3f70d087168a44196c0106b1c067b61e72a7ce763cdb8d0ebdea5764e1a44afa2e2cf9890ec555ddb82403fb4ddcad1cdc6a69ac8fd55043aefd65a644f9bce47596a566ff692e9e817d29d177bd152d606ee8971f28c56cc170a53c2de8c64769cd7817ef57e71457f63c27fd7c50d608be9be70c3343ba78acbb53545a1c0c1817ef9940d1b9e15517612fafcc6e7721eef8bd86373686d81b73d16d83e599dbcc43203ce2a5ed1371fad1c9a5ad123efa21bc702cf98885c7544bb90e838a66aa3c9e11a19bc9a572b758226087e595a5e9e1d793cc9f4c0e550aaf6df44115beabd59534031ca30a87d7d7a6d6559d57d01cbe23b2bcc158124ce54590cf6814bec5f620ab0d486e0e7dbf513a636804827d10b9429ff9a67ffe520eb9583cdf14df6b560099366eaa415593264ac4c78489c9a6bb36211780ebbae5870f7463679082a1dfc9cee2dd3568dc56220f60d907b310674d4cfd29245d9065934eb952c4bc321157b580bbc67739102bfbbfb85e25f55670eec80aa40f67983df1bf0e7391b52bfc8bc5abbed3e9fa0b5c4f330c71a40d738a822180a65b4b3b2b987f0162f133cf23a3f26e224389cca7d17aa28661739c2de48398f89249d0225501bba98e4d9f92d3491466b8d84c45018cac75f7ec44332ccc2dc6d09e26cf082401e08a7490f52f94b741d82316f50627a884bc335171fc1804bd4dd6280cc602e931f170d8c306abb37b82f9a8d2132836d1499828ac87cf76701345082892e0791843a71b30add6725c7870160e090fd0e0ff1f4a06917e9f37811e0f90f0f7edcb44bd17fc968350dabeab449fc34e3ce0caed8e34afde505ca3bfc0b7f7b9b4242686a84daeab4438769f62d00ff016437ea2b950655986a1e2ec1ddc01c9268be31720f8da44dbd8bd0241d92f635290c30d67504ed68658e040200300b4bda92d58eec060c340a84924fc52fc74f1f0df6754b4f507ab6a6a878ced5f9944df0efa3db8939c2d475029f7b30f7241d82abb8136d63ace56ce785bf14882899b3b7010216453c9a49dda3577b065b0e9b499ba53ad2e1a3577c07c50261950452e3552b8a56646b093b3c066860f07977cbbc6e9880716d07ec52df7ec3572acc85d3ed4a611dc9ebe8382d65a5ff422affec55539b4831c5fe66a4866d7fb58614d4f505eb9b70de75ed4b737c495848d740bc8b29959ddaff1453b374da8e4cb8335b99fd389ee8cf972cf55d27967ddb624ed805334e86b908924bd681fa55448c2fe4103696dd08704c0842c4e800d20b1514d605466c2310ed8f4e0892fc2c5239bc1690b5ff993e6693af0f5b2c30c3550b3bf28dd0412ad71f2f0e3c0c3033725e2649dcf37fd907c3ad8ac61fad3ba0d358dc84428022baf9f29fbdfad9fe9a0ca7c3ac8a0ca3f835ce9804473b55cb83e15a421371de4a69510b29b4cfc4de84d78a1390a7775d5c4fa3ed0cc647dc731b756f4275b098e4445189a444d97a700a6e15abba468c15adea626cb12f8d66ddfe13c21cbf5c7d2464004e9bd6a60b6407f66633371f4ff6fdfe71a6c53aa3850f3bb3030bf45f7f02a3d5339c43c07cb9de83e0855b07bec66231808b0585752223d5c17c775a8ab73ce8b0c64890a8a6948e6559c20224bf1ac81dfb14987c05b72188accd46e2a28954789a8146efc875c31f1be6e849e001b90aa20cb9201c1fecbb06db7ae5aede8fdc78616fd362e2841b069f17305b5f7c96a6d7d528a43df83cb991e67d507e9004da23aaf4688f0e937246fa824220f061dd21db02ea568102329b9c92642cd65d758e29da0b8711702d99ae3a44b911672c9c1440ea20b1c9c3553170049b9295c76c08bbef0877ddca3b3caa790b2ba3f1926f666a1e8e1aa0b8c46ff0007d547cc5fb51628b43702daa6a0d84223d4073db9caa4d780a016345eefd4fa9e91225517f22c949ec0959a5b908bea9cc2d29bea03b40f8ef448b89c0b6a923ce43e40fb1ac6add7c51051992db3847f4a721aed92ea50aac051913f08cdbef4517a821371946eddb78ef948e13b33f5147586cc0e42816a71ff178c2de0f026b41be4dd955350d21e11bc12bb37876541f912bfefed5fe1fd346604d7f238d274fc0566931213b048bf7e99b6b94e9085f592d5b5c5f102926a28f76ace51410645b9e8d4d9e4c7f38e0f3db549b279a2000c206ad4e676fecee88906d081462b815e903472bff4b3e8bb46006e870d91758a278587a5f9c4634e636b33fd9329bdcce92c50b747d7a8c0afb13744ea9a6dddbc05b9f6e99aa4c6beb2225c5bbfffbfcb144fd0a6acae4eaa7c9d67103b1ef8f04d71687a88b7a2f93b9be71605b30b4be316b20fe6c033c592a4947271d1181adab1f6e1abcd567a0e1b6c847fd06c98d136caa3ab36284f82b147076349178cfe489fca833a231b2ad5e3b5cd721ba0496ac2dc8445edea96313c5ebae22a20e8e0ca5ccf5806f90cde9603396f8ea427b224d93c2ad214fd9f986504b861c1c3ee7cddfab15ef0932f41a9c9c9d39a11bdf7f62519c3fc3cbebda9780b030c029b9c2799b1edb869a91b399fe7f84d9c1acabd10e62195dff421deef8f19e60a0702e54053de6b5a0ef4eee1b562c80f0912f426d92925ca7e2eee5fc3f1d8265be4fceb988e421113bb41ecfbbf6da81a42d67ef44f9deedbf3b2ca1d70cbc31b7b75b37a1afbcbda7ce8f04b33b85f605e055643d0d0858dab727c0bb3639a555f084387236e4ab67c36b6cd94765309ea710ead2e23f807a0c900dd52c55cbb96dc2f1100049d0a1eece6fcbc31bd7284881794294da26dad14b195b3cef39c4f04fa6e3fac57305c19a7034d4852485b481bb5ebd56ab5e98589cca9d5ee522267cd2dc5c5cc972dc758608c460a13a9a5cbfb626160072b44749019b73adcd249fed6789b20e14a9c76c82560728cea111f85b4bde5de724b29654a321f0b9d0a7d0a2fba455c7ecbe1d50553211d9812bdbfecf8cf76a56f500e60ff8d0d3f2f9c391576ce08f67f2c6a8e112346423f7afa468c805ef42ddf1c0ed789ba51f7d2f2684034a2eed1b0e81ecd4bf768ba86a480fadc03a9977b202e9752dac2b5bc0dcdf6399c06d6968ed4b40385287dd0ffa00ffa7e10e843370910bdf408201a03d124faa421e8873ef45cab7f5afb813750079ae06a72385c2bd3b69fcaad68bddd5a59378496bd761f34cd3abbbcb572cdf1d730d7955db55a1c8e2c816dadb823d210b448e8e9879eb6748f867614079a60152cd772d4f451bf3babc2b576906b714ba6607f8ec751543c05e3868342ca13ec1c0ef62736f802cedc0e76d0cd9212e0cc4dc11e61d71e47e5ed075771140dbcfd382a6b9ace9ba1e93c1b5407a672b0bf6b07e482a9fa9efd4038ca81d9cfbcdc4a634193cfe05a47628c114208598e7437d7e268c0d5a05395eac0fe8008d87b602aeba18e27ce0f4c55bae281298d663c190fb606bbb538ade35a2fdcd3ab56616b6fb46dc6c27eafb19fefdb8f57c1667893391f1c0f6ca269f8cb0b4bf066f8d739b99ac9d5c4b70f3b964964c3dd2c0f3b211bee16f625d188cd130a4e87bbac4371a9186c9e2eecb309f687a41e8da70a576ed3563055735ac334a8d5154c6d2d6ab7164cd51c68f2b737f4f1b6b07fa6a1ed07746bd7345bc7e170ad977d98e4c348f6dab3e0c6a4fefa3634f57f705f43cf7ddf1f1ba8c6871123a1cbbd11d0e55e5cb743ea07bd0d0d0fa9b7feed26c1a4ef8fed41d795844e0ef6c72d807ec0c2d7f1308de2cdf0faf2eba53897e6bc192a5c650836733eb5c74b5c154f693f9c15eccff5380a526aed68f47fc3b566aa78c97f608ae370b82b3f968eec8f4a5cab046fb8991f78036f582d9c1c0c5d50073bd78226af3e3ddc8ecd35a7072be0d1d4da537f608a6b3d530f4c693f5c4bfb99933573fc29ad39d1354dd3b4a6a06c83270e4f4e0ba61e0d8dfff6c3ed703ad8b98be558f93407079a9c86def9747a85839d5bd284cd1287338325cd7f2f4945f6384aa6860eced1a3c817965a90587834fcbb93af1d9bb91676ae95432a61c6e5456de6e4b106aa63bb350dc21f6031272fb546bb7d93122be5d8871f963fb0a16b3ff436343634940a2b5ffac036ce2519d20ffba10fdd2460e480c9ca4563df8606c70862b0f2c40b4f34b903011d08834a0a35ec8000c3309677c10505136023555331821ad4b0821b583a4fb6e00518845c3c5b119e500514397c6a73622b6984261c61a1c14e138a80734f694c7b5c0fa7f26822179bc01b2a2e64a724241febe463980b8c454d93424e587bd9d1f85b7bdc24176ba55b733a5afededcf87e28b4614d73c19a067281b519fa08c4d4a2e693873b682a09bd76356eea90177b2dcbaf424e350fd6984e7b52f730f71189a362beff927e7639e2399f7badabb243c29d8a975cb81aa9c37b242763c478f831209cf20527567015d305d11ee39cf4f235d28dcebdcad23d3cb99aca7548ba7c0282e563b07481a57cd1532e274c3716ae46762b461572c2a0aff5c7094b292be863744a56bc5c213fe2182f3f860bc703f4f2464e07e8b977e9200ba65cbe5d6e1f69b142bba315f741974bbaddaa62335ced803d1e4a36e0a1b46f9d05340afb276eea1e7407e1350e5e69c7e6df303e3b76913d3bbe01c6bbf8f7ffe25ff73774ab37edc295079e8d2733e4582470c2b2d66d3bb19cb05f88e46ef4760f775dee1df40f703f8c2eb79323309c9fce83c2abc2119189045c6029a3fc2cf419e7a2c505862dd705c21544e28dc34b7d67e08d943d2a18818635a1fa14010a54601a3cd23734ea03bb4367e68810f0ebd154ac25a0f8b800ca11b4e772c9a0092865f8c1b29b0fbc88900517ec602f5e3b34ee7c80634161c20650a2d02271a09844785d010a15af62e944210d50d0c0c5174e8e4f1178b4e0af0a5219a104dc6479c1c7450616b4606b7939713901634db1829d1a70dd8e12497d545c90e2ea82111f54ead280131a10c145e5c449155c4b6892e5a897115e585434a113e1cebc7922039f9d174c1125d462270aecc60911b8300515380d47c50473e95051859e6c47dee8ece8688155057db9912cd7185caf273c5798020d99cfebc90cac30594f9418d980841347073e4fa8d88207ac1415e708ae29a420fa3414ae273d4748e228f88454b9a45843153752b061891648ce05552a880186a9e20d0ab0970f6a60637644700211cc60044beccd0d9430b061bb812206123041cb588dc3049d2e7401e79e92836118a6bd5e4d042c94c1f5e40623680cb29cd020c817eb084e78a6ea084388a273ac4047f50ba9b66b1c68ea6ecd50675f76daedd612abfd106cee96fceeef2a8ee2a0cb8a6ff130dfdf3ca26f7979d0d716edb46a5ade3b39393880544e426085919310e06c1efb450569235d201c937a07d57805ee4733c5be9e3829dba2671f587befb20c96438cc01ab7b5e85c3c537c98eef44cf1471d0e16359ee0f82eddf64cf157741d7da5f85c175f2996e2cb7bfcd5ad99268e6adc3fd3479c0ad72384b3017e44006f44f096e1ec0e49026fdb8549bcd4dacb67c251dab712e76a9484be36d66e2f719366bbd0e78079d43bb95fb45b4bec63695352523a8f70031f0fe07ee8819f986c1a08051be535c194295f5bb2e2a6a170d43b82931cdcff7a821be7d6c1ed4570019e82fba7265f8ff7f48d878ab87f47df900f8017f581cd7de408864d282058c191d5118f47783d1628a2e7f500d9d1b1250a968ada01ae045b0baa0f88008d10754251382a643db48a29d02037603d1053009f902dc062e08a5203323001fb01f683bef1a4135714273cd6bfd537deeac8e83e6182063b6f1e61ae172c318393b42eccce602184ac67ea1cdc334f0a11e4f0d181a6e7afeed16014e8aea60ac1baaa50e1c7e9981893420452832c9804b6bc546aa7e2567067c89a81ac245fc4633fe726841bc548b1450871d46f5d33e11ce8651c351d3b276f1fb1df2dc89a812c57b75ad0053c83fbabcc8988cab978aa5b50eb7703bb4710b1984647d5d79e3a6a7bed3747394a484c9d9d046230e8b56e7e33e12550d737da833ef791248e12120359b0055913a4c5d03001bdf6a0a8bd7f0ef75773d853accb1acbb7720a89c13d96b0a4a18b82644371424f152a54aaf4f454a9d243850a949b292f283754a0dc508172f382723325377602e47003ecb839244e43bf41b097b383642f3f139138484669571ef233adcb8f354de36a9e96e9679fbd4ec6d8c18efec0f63f6c2823d8c932d83d13837deed79221b24153619212eee76f8f0063781ab388721cbc92fc9657c1f22d1d070fe543f01c199862b9f26632ddf63e04d0cbf79c9b3b2cf363b9bdd350cc75db3f4e0192ea401a75a014eb58fc2c83a5a665594629d541828d8f059b5d07cbf724e83c1b2d58be4779369c3e014baf02965bc0f23595c434505f4cd666aaab46ee822484b21e9b4798b6000d40e0534782cda391dfe0f8474479251af11b9f488cdc80eb8cd56e9cf052d4565e2a456d098e5963e19b26383e75c2534d1393e0f8da124765ed86e5a83c8f24715408c7d76e1ca539e1a94713bbec8888f344925d7ae3a50803370f6cd68ee0185f3ba2313157384e2762fc796432e128efe48f97e4cf740118f00adc2c0ee0f7cf7a29bebc191934224c9f12173a506b7d0e5f09e6b4bfdf7bddf5e0ec4fc4f1f4ec0d82d749efa682dd097c24fa03c1cb36546a6a9e4d2bd13613c215649b57ba29d0cd3e46cc126faecfedc0e6e70ab1fc496606a640ef5fb903d8e0ed639769de70ad42b014c7e7e2af781b5c8940dcc21961b94cb4af23473dee9d7bcb8dbce4da7341b4af1f3fd4552058edb9ed2bccaad8124c8db4a8659a86695a8d2737650b60ed29768189812733402309001499a1c4e9d9d8deb72ecb01c83d601ea88b1ed44bfdfe990b322ff46454f4bc7a322f645478cf4b2f881887641bf8be457e573034d23a3eb7eac65142de151cbf6fe6bb025f46481fcb09ef4129af8b97e2cb2491a9109991973a213298d297400891a93e7003c1f2fb878c10199cc9fbc34bd187ec74d82c836b384ac826e3a89ec132117b083f7be857021b969fa3c413fbc96199f552d68ddc850b0206eeee24a559a63d4d8b38bf1dec437235f287971eee01b17c97357e6bb43b7c10d6c06000e4faf82cf376a28f1f1f539af75d5cbc4837948c8c8c8c8c126d0361ddf1f7c78214ecbf42070b4ff0e3fa3577eff45e7a3ceabbbfa623e45dc1ee358cbc2b29b03926053647ec425e115e7a55b87c7e548c3e3f2ce0f740de7bdb3af7476471f192f6a51c499678e9695266ace8e54696577cafbc546fb3845002af78ef72c7645f1feb8874ee0efbea1cf8ec3eb8c3f5c2263e9ca67d7db05d0908ae600a7429b576a5f366f46b28b0d6756ae8330ccdb5b79de684ddbe714beb78a9bbd8529ac7de8ee2a5cd7d3848433ae0ab99e8b9cec7c727c3c05b8673eb1cd1d88545b957547388b9bfe6cd7a9686f98a15a41e997bb7e236ab63f1f5dd9042c4931b5288b06f8a1f3cc1f5fdcd70056b0f045b5fd6c46a28b07e02ff0c572297ef9214cd09ebff70862ecd043643d71347d5ea9e6d19c743461604fba25f21d1fe61153c1bd86bdff733643d1b8d5bd3585e576c2e5cf6b56eb57bb8a188dbbec2d4688d43d825c3aacbf6c265bf71351ad658cdb29a89b2fad96d24f531acb2d85eb89aad669febf76ae528ec37dfc1db67872b476170d53d28de9ee26dc4f1c07edb6e23c1b6af0f6e5c8d46656073af567dc33580bb7e86bd6037438c44e37a493c94b804c19e486b5d10fffa75e3e15f8784b820fceb90c658638c099807541d85fdc8c715a1b704699fc38b10f26cbc47bbbad33a188b0b2f71efa19fbed1569a4697f50ef5d121c04befe5730e38cb5fc4b74e477936b8ef872bb85a6119cfe45172c0f9f51801fb0f3eccd011f9878010e128ad099b5be77deb3c1ba2ce6ec499689ddc527037125e4fd156aa504982bb75425da57fca159c61607fd14be580a6c6de43d514e8fdfef0d27bdabd4763e69570e4c0d11900a68828c1d40ef76fb9d9b2509e1dad7baf94dd1ced33397d25ff1c30357a11e81bfd68f8cbc0c77eb31019fc1e9520fcb5dcd8fbaa75afcb36b80736c381df6bf769d7ebfb92a34842308c048c79df061c672c10bcf9c0db56bbecb7ae88fa7548ad9113027bafdf6dcf5da7ffb0b675fe43e8671b4c2f056e7defb69be3eb721117d6b0f7a79f7547489cdbb12ecf281f3fff782ae1b7d3dceca16ff0fc8d42d3fcf740e6e340623355e1f9f3fb48abda88a3dc0847f9cf27e228f8f32dd00385001eef468da6317ffe8e6703fbf97aec687eb6738ebe467e52c0fd3f323eb33fa3f09c0284cebe8928a82fa6ca7fcf86c77f91851370fc3c22c02bc5a74f0a8e3a3c1b037833e2c72ff50d1c4d237efc99506681410518306e98c20d37bc90c28b172e785cb8204581446a0185162d609e00033392321a899c2012b168020b162f4c787971e928e3774719bf3bcaf8dd51c6ef8e327e7794f1bb23f766c8f88de33fd951c6ef8e327e7794f1bba38cdf1d65fcee28e377c7e7044789e33f19238e4f8067034288e30fe0d9f09ef9417e7c1c355de9c64d0ca38fd292ac1d4b137b18167178293e9e396149ac4cf40dd88f251cbf74f2540c4d8cc18fe94605c7b72eaf36770069c5e6191c6728b516cee0f85e2029dcdd63de89dd11e38357a60c6dc07006b409495a2c562b4992562b09ab0cac32acca80a40cac32b0ca80a40cab9e9686d9dbefaddabba1f41c8151a8af07ac318d50768452664f33ec312ceb6b10c0944cceea06523cc1832658a1f129d56d3084f3cdf7f273c00641d3f08fdd0afac709f729018a149c90383854bcbfdb7083ab205073e8d6a0ec209950582a1858c130f09b02064dc08f05088edfafb3ee3bd861b3248152774909183d051da0d2811c5c5fa6069ba9fc7dbc12df7b74079ab89ac75db1993efd7114c8522b8ef28b8424c24b0d4487657924feac5eb1b0bc7c967e9fc3e90edda13b4f764ae63f6ac55353889b30f57114bc566e115f9097f41ef635c40ec4f8220439f63b04f6a8608706b83f07bd7a333a0555881df0772a76be9e1448c1f9f13c9d66c1d4fc1618cc7ff921b4a7b7087ded5f6e11263fe86b5fe4a5d297f7427ad11759f12f3f848894e90ec91ffbf94364fff236f3e9ff98dabfdc2458bcf649d09f6f43535950aa3dc99fbe0d0dc92f49012f2ffe49acf897f7fb43447ad1dbd0b0f8c1e269f62e3f475f492b6c68482d1e26d31d92ff7bf855d4bd287afd182960b4e2b187dd0f974bf2ec250744e31715965831034ba5a221fd684422753634a397d732dd79d0d4c2860646f4f3453b53644333494334cdfc224c7e8c5ef48fa6087d163f048ba7cfe226910413920f16bf8047c3e20e317f50f00516b04047a5a239e2342c5e09157d136c12021e2841095458dc0dcccf238dee40930d8d46773a92029a469b3f45c0823499eeec40533fed280fdd21f9a03634596743f3381d8d7bf5831117cda3699a920c343505816d81c1bffb6e1353b43fe8f6e15e7584578993257ab00c7e4e96c8c115367408825d3c72043ec8f1a01812e1a5de81800ba58929140b56e2972912170c8be8d58b521feaf36c347cff7984c4424af87929d31d2f959634eb0436f7aa0868f24992062bff3da4281e4781be9f52a15370bf70bf778e77a4f078a9d44ee04c7d564896e0fe76c25199ee501f2b3b523cf56840fd4a2d12b7bc05ed60b908388335809772e844f93b1020ddefe33a221c08cfdfc74367b0b5c0a920f1db2b20cfd420266004b20b5cbfce585b6b15e202d72a6ca63bb87760aa88fa232f752b988a6eaadfffeac75a1ffe5572e41b899bfa7b3586c7f3e40f2ce9c7f6db93869845b09fd8dbd060dd932c737be1fa381db52301513f475cff49f104159c036e5db6c143ba9b1d6908adc87c6d5ed28f49aaff68b09f9754af029a66fea3a1da6d165cadba57bd82a67e3d2b203beee319f5d3c96ca812d246c61a54b8bc501c0e5ea93b1c502c3c93bf0e34e558f80f3b8f8df89268bff719bd5ef2d5c40e32dd2c95af9b4743eb2aecf2086749bc04239c52b6131f275190c857bb9c4459e25346f97214c9e22cab607f9bc4519ebdd651eaca3a9a43a24f2fc571c114dd68a63e2e1738539f4c7da80b7ba92443ad1d8dfeb396a7b4d2896e9eca92f8ca05ce59125fc5da1385934d8591a065dc6ffd40b2a70f44fbfadb4f6fb788f6f5fd16c9dc91adc5a960aa487dedfdb71fafaf7d118e7ef640e87dd0f440ea1dfd0d6cf6da2fc11aa1cfbd9122db57ae05535a46ff0777494d2fa9ef0fa17dfd4adf86a608e8b7a75d11263f40bf7d91d03f1f98ca92c8944affa3519684fa6449289c628b30815f84fbd017d99ed43f04f7a11f627b10a9af02b80ffd0fee430f7b1c159f6b65aee5f2a2d3ff2ec7e372b9565dd15547e94b7d36fcfd4471c449ae3748d07e7290399e1756b5d41fec2fda6eb615fcda6d2a68aa3ddbaadb5cbaead3f54cb10fbf7b7eb0f7f860d0733d514e6c74b996c8b65c799fde92cbd6da5a8f06e7b9ead6e3d303538f66f381777b6d3c1b0fa52d8e0657b079fbf91e154cbdf8c094cbfb6f2b78f3973696fd6ec1e65a2f2f2f3b1f2fd78891d0d737027a174a694b7dfa3fead3d0d78ff7870be85dde86c63e1af7c0e892e0d7787fb4bccb4d4274497008eeeb2dc2e487cb6f5fa43ef7436c2f0a309f472d48930473bb71a24429740a9edf72716c178de86c1ded4439aa9cc5fb8e8b1c55be737354b580354f3146b8d480ad7ff35f1eb6e012474595113b602a1a71d37c96e7c3dd6cb12bba773e86d1a8da6e8e4d5c6e8eae97ab6ab91a4b556955f4f561dc20c25ecc0e213750f0f415d613ef6102470afc8948587035140897dfdedf05c9e55d6e9016961b6f1090d6715f03076604cf2ef4a315b605c5fe398a621a75eaee8efda87b34d2d20c8a5ea4897e48088b1e832d374d6a47a3a7337bf92d79491c8fec66d1674fbfc545a2b176b367bf61a2cff405c7835e9167d77f4808fb7d4f1d95e9c36f51e5568229c85202ad8839dc3e6c8d5ad8d53efb57917ded6b0894cd1f755a47bd5467c9c2c0aa74f807c9e88d2cd1486c82677c82e7fc7a33a5f2666bedcda39176f3df5c8ad921e4060a9ebec27ae23d4ce048813f11c9b3e1187b125783b5e084d02cad7f4484e178886e7679e7dee5fd5b585874dc73441a6bb8a3e8ec38cadefe799b6ba07f447dc54b47fcc64d1becb417d9cf4475bea873293d1fb6663f13fdf951f56c643f1f068685857ecee8bfa8ca4262b02a4345238e6aeccac99e85e391bdbcd169963d2f4dd1833821b2a75f75d8b00e62295faca942b0f65f46bd448934cee85675d8b26864d44537c517d1ae646729fbf3707a63e311308175c06f0a11bc70e47458ce5f5ebe391da4218db3a73f2484e97d16cfc209a13de66fe945a27176b37f0b8beebd5c520f976f79228d59dee506b1bf22877792968e76d14bf3e777cb51f61a91d1e7baec030e9c1f1a887829cf1801a74f7fe82fb60441a96a7106acb69b15fde222081349f2c5848175344616a3cda8a54d06e7a01d42274b6279d1026345e712e32586450ea219231d604a2d7620c970e12fb6e828d3bf86b1c54ecd781efa3fa71d5c66de931734f50f34c9d2bfaf333a93e97578ff1a63e24c9fc373b8e96b8c2d3a0a066e3a743b7cc581abd9e1a6ec0e5d63397f070c9e4ea713cc9f4ea7d3e9e1e9743a9d5efce9743a9d60fce9743a9dba3f9d0c702ac089e614e34f277cca7122c029e64fa7019c7e38e138e5f0a7d38d938d93004e33fe749a39a54ea8930e7f3a05e054e3e4c3e92473e2e1d4c3a9f4a71dfe949d0070a2713ad513770a9d4ea713cb69c5e9e5743a894e27d39f4ea797c1d59c0c50001a9c830003f801c70d1b029849a17ca811801e7890a10180ac722196152fa286c95cae1524c7302d2fb88d638101a373fcc2762c9625142346e7b803c5bcb8bc7039e4d0398ed966c08c6028a594524a29ad3a905a901ccfd04a2f5cbcc876d8a1735ca2588c1b639a64482923cc01871c4c9de31ab3cd581e3270f49284712b758ebd537267742f98aa2e68a274054d485cd957beaaac24f5256774fe3bf48f943ffdf383a58c877fc2e16b0e5c0d2c758dbd7b18723abce602ab0487cfe18f88587ea98b38b23c55690be32071d48a2b9eaa2e5734027f208fa76a8f140885a72a6d629f60f81007de784aa32bcb7ab5302455f194bbfc4a013e43233d8e7aa1e3297f65dfc1303b0fce016124f11454655f82a143817ff8ec4d30ec1ebeab3c05597ee4c6c798e229e86a2a18ce4018f3f03bc753f0d52e1f5090871e209cf1b0f400a0f1b95532f08df054643d2ad94797901d21190c5d30dc52f1054d728787f0e1e7c0d5b8b0bb604aa33537536b809b6d016e1ec98cd2dc4c2dbefec212aa602a63514a00d500543fa870dc4c6fb06cb0a8006ea676e6669bba7924b1970aa630164c4d147cf9005f35ee2800378f6c0f375b1e5454e6666a69dc6c01105d303559f10553f2c58226f9a3cc35ca232b65ec5b5faf170e2b3615f6f2372398cbe5922fe325a399e3159de35a592c160bcb8f1155adaaaaaaaab0fc1830dc06e3b86aafd74bfe258540afb1604a73b934964b63b93496cbe592dfbd60b12c8e499de3ec05539a96699996699aa63d8c152d393c63c154e672652c57c672652c97cb05a37b7179710ca3734c5f309551aa7abd3255a6ca54990acbbf218688450ea72c98a22e1765b928cb45592e974bfe8b1898d1c7748e63748eb1174c511534c9a7d45ad58baaa88aaaa80acb773183d40263c114e672b15c18cb85b15c2ef9a4d20b172f1ccfe81ccf174c61aa97eaa57a612a4c85a95ac88071038ccfe1930553d3e59a2cd764b926cbe572b9b07c18efbe732ca3732c5f303555aad76baa5e53355553257fb4438cd4fd189fc3250ba6a40b9ae4536a2dcb0553964a970bcb177140f4a98bda0b6cfc5c7d555f8e92f1f22b1547f94bf9524a29e373f8a973bc43e718cad741be497ecd618b8ef2eed980113a264111874e96623a79bbe7a6ae93ff1d8c4efe0ddd73d30b92fc16f261e48fba074d2229ffc50a96efd2c916f92cf606cb0f75f2419d7c4efe26bfe2c8cfe453f998fc1905cbaf3a6c31b0f07d83a144db400803899efa6232a6c233fa461fd287f421f68ebd63ef59254315ef86c36f95cf0fd658b6dfc7e07dc37fc226780601cfd75c60e1679f611c6204ce3ee384a00f9fe301a193e1a5e87335400ebcc013ea68dcedb1e7663ea5d0da9797387964e75638201abb4f0bacfc3c7df07c187d78e6e7b98a1da554d36e8e8f86639f6118d52a7631ad6e0fc3d22f45dd3bad09cbbd57f152149a7cfca1061efcc07c14431ff7ceadb0c072177b4aa70a5a71d36cce1f875de8a3cdaff3ddc7ad38eae7d9a03f1d0d787ec5ee8b91ce093331d584a0313cc57982fd37174f06fbbf20537460479bc28811ff8952433568c8676c8ca04e421450e07e4f82650dc2bfbfbed7f2e7947e921f44be7f7f97e31dd218de20a1937bdf539378c2b199881c158c49c1d9cf283017faf8b1583eb60ffcdc2f086262cfc292f5ca511243acc32076ea10f052fd58dea389ddb1716060bf49662c1702855cbe8ff0f0c76edfb8b87c9df3057bda11694c3bfa7572427418bbdec427b6549623d35730b5ddd681a6f8945a3b6a1d1458d18acf30f06c691f688a3f5f24bf47a25ed551c7e26b6ff145a2db11ebd85259564c0ca31c4bb74f365fb8cfa6fb9c4fb97973e3dd9cd4e5a3cb4f97e7381e2e2e2e2e774e4a678459b1652cad9dc0721fb78fd15d9a09acbbfc89a3749e3faf48bc14b9cd574790382ad2e9f463f648279d37d16160b6165cf6956bf8829330424d5764b145466b8b8dc46519e8c651f4468a6159e6d123cb67cff222cb2e4669d758d74cb8d8485c8d0c713573def4114ae34eebac1cd5471c89b31cb5a2374819e9958fdd74cdb1c4f7f88ea499e81b12866134883f7d4aa546595e8063b7e255629178cadee7a6f9f17b45b30d6d5ba6387291de4bdf8cd83f9b4efa987cae79a3ef5019a305211cc137e03745107ab013b87f4661056b3fa7c8c1c136f09bc2075630114f6aa81ffe7b33e667edb509678c91dbb6a97141e413698c9dbcd4cf7ded372306cfee7d77da739c16faec43dabbc0444618f44422ae9fe76f5fa1c03409a64f3f731ddccf0775f52bc7f25af77e76dcd7def2b73cfd875bba6c83e9b3d82e748f4022e27731ad7b8811f8bd19990b626acd05315f7b8ed36cf09cdd7bf4b3d782f4cfd7248ffe4979f48cf16bffc94bef89ccae4fa79f8f1da1fd7b33b8e72ef792abe15e6edccbdc83be6231462e066fdd7baeab0fe24e6fc6d3e6f77d79fe0b32ffb1c77e62ff90682cfb6d8370e2c3f83008fcf8997bdbc33277fcf9725ec805814463bf34e70c5530fc188a5762e0bd01b9c4e3f3e303bcf4f042f3a21a611616b3a0d8f5cf5355b48348247a2cc751a5772046a6910e23150e3032603698116e61710b8a5bb4780a054bfaeeba5a9d3c27388b9f05203ff3d0e3b309019fbb20520910e273e6e37367afbd8fae9fa95f882e015d7f10dd7b2604743d4c9887caddcfbadb49e039c1dc5bae46ebcea778e9760f6bdc73d3090d13015ca7e282a96de6669abad9a22ea7823edc4c6bdc6c7df8005c9a7ff000378f9ec7cd3bae4a878ac6cd33385715c7aa2f98e25c9b4ae6e6110f375b00dc19378f66fce9667bfa1d9c9a6eb640dc3cc2359de7d0398f97e06faccda5e1c05455e170f308879771b38db9996203dc6c0b4073f1ed2a10ecf6767b9bebe0f8fe1fbeb270353fd4de7ee81af327dec44bdcdd6addb401347d1c9f03721d012e1211e3b05ccd006ecae2f8d7398e970680e387eee189e3c64f4ec78d1bd7739cc0df5ef01dbe8d9b297c01dc6ce1cf6c2af8a99b29ea660bdf07f8356ea6f00370b36d82e1f770f3083e0cf82f38167c1e6ea6f0656eb6f069dc3cf2e75cdc0b3e00ae0b3b847f72ed7033d5e1be4c378f70a903a9602ac6412c988acf0473b879041f07157c19aa989b473140ac7b59f6bbdbcff25df73e07fcce3e8c2eff0d5d2ebd78ae3c83f373794f8b2e079b92b12b9922c1fe2cba4c9b643a256748b0ff8a2e674db07f4b87e5585962af045c1e0cc1251146b742c3040405f69fadec76f9edd8e0e0f7b5cb6f07672c077bd23233259992e59ea9bf3f6339cdd5bcedb99bed7625007ab5594ae2474ebbbd7aef3d6eae3ca76f44157608bfbbdfed1c1722831bf68df7998f001f3171f68973b3e01a6cc672b01cea240853266908f9f1e525c117e5d02421caa12902a69c06c3d8c59a68395ef27f399beb6168f21b98f29caa82292cc757d8bdd4575cb8849f146a586129aee0e027451a7ef00cfca448830ef69c67238ad703c3d44bad2d619f146970c57831cf336339588e0ff6c79a788e37f128d8932ab6272b07a6bc89633939d9176c9e2cffc972947768dad428e1361e7f68c29db02e318d844984dddda9bce43ef877c79803c26e0a89c1afe77ac2e656b513ab1b0c5b05534d238180064b7af349fdaf6f5af54cfe58dfb46af352f6447d3d58b953d271617f1965e4e224a54c9c99e33ef857e8730326fdefc2253cb0d00690066fc66c1c28668ea3e085ad37c3df71e3ecc78eb0154cc5872d480369dcdd5938a3175b3ad81d075be1e8f8e78963ad4bc496a8f1dd4c7143df28c430a3f4f2c01e5600e27983c820f15ef727442d091f8d46a3da8d65ddda67da8d58967d7cae283b3803d6df8493b0fd6c70a31902264001839c5bfd861d841db6d52e138118befc1b1ca789c18e8dbce4ef3fa2febc95c4cf3a228e6b2e91c6f0e995c0865bb68b515f25f1615cc1280c15ca083ca0490102c2e6e40913909603eb9f470e9f1839aac71296c838e44cd02fda3ebf8a564ed89f8aa3de7bbfbe55dfafaea9748fc7c066daee42f66c4385b1a00a44e36a1f5659ec8bf5c5e4cc452357437b60350cc3b0ab7d971d6bef23b7eb7fe33859cecc70588e4ae2a8d66461f5467b0a573247aeb023d0249360fbf364e13759103e95570978036f70f4d2bb5c0dcd5c526a21db296e54d8bfad1841a48df41516388163f08382c407d7500f1c2aeec3c356faa7adf495fee755dc8af7bc70093f284872f0e3e06b378853b020fca6e0818f4c5f1f242d9c037e5090a8707d94c73e284ff8cc9b1edc343e8f4c2678f00df841792207b72285a625d82388582cd5808647c31fca132aec023f282bc002ae756eef753906db2636313ae9a4d9cc66a64d6dd6cae998574e900e083fcb1fed0676aae48f0d6c7f9c8275c18f085758e1da5ccd7bdd96d351ca0db92a048b3ddc22a7e37989d3c1e9c0aee4a08cf04dd07c1f7fdef766f4cdefb5d756605f7925103426364383952f73ac7f3f26c194fc993774decc1b2aedef650c6cee955ff8f0f38dfc7933fcb31f9bbde7d5ef5100a4a9b79f0fa4ede3251f6d899d509e58e1ecfea03c51c57db4ae71f4d15ebe7e159495c08dbbc33ecebee2e303538fa67f54d08f78cf54cdcc0c36bf578f114ee4c77b84c01b9c6549f860f8dd039b7b056feefb0e7bd8098137983e2b7f7c7cbc0af579df0fe177777777773fec84c4e0885defd16ce03f3d6e05fb57f118d82c7fe6cd8da39c78d5eb48fd7eb2327f3185fa943081df1433b8826be037c50ca4981304ed8b7913d8e13ef8c7ce87fbe02fa5b099523bfa92cccc73d1d837050990e04cf3e3d131828a98044c60ffcd050f383f29d87b508982e106e19b201ad81cde495cabbb6a801fee41e5c912fc70f57ede83ca8ea348f01bc3fb5eb0079a124d8926036d069a0cb419d080065ff8c2174680c41f7e945a3b1a7d2ec94013fc17dfb34124be28594e70f0c30fe7e0d8c2f485b0c2f45f0f4304f066c088c51bbb1a3d1af7db60e9ce05d1953ae48290184679c8c036edf1d5f019ec1f8b7d83db890ac7cf7c70fc17a6efdac10c888f5d790c780ea882e9cfb86d9c8e7efaf2e1cf84b820627ac4f470dac5b88cf25b4ac9b50c86b1658bf08a382144dbec72f6f32b17c4ec20b28f5fc34bb06b7809e2dc5f9f48ecc73ef7cbd7b8205ac620fce3d74a3f887eac9b8f2387972e0f199d9588f0e51dd2328eea1b1f420c21123084ff0480e1f6ec43c58796ab990d23d69213223efdc8f180d962e732677d83cca7cf83e3319fbe1cf29a0b6c10fffe20b271bc9065043e38b6df4861ca02f0fb46ef8ce2eb782cdf0270a76fc4348d38b2f0663bdf4fdfecaf34b198f9308e88f08c213cdf8cc1310f35dfbff45012252557e3150856fe9c52cad7acc4e0f7e3efa77dbab6c2020b5ffefcdc3bbd1363cf35b4ffc31cf743e8e724b0ffcd271c64fb9297defbd7e79ea5d65a59b2a797bb540af63df6977bee1fb7e3e1edfa1d42b7e736fadb733107f40d045b3820462f7a33721298e527e961bec593bec2745962988ee55d10815960481d8b6f21840cccc2e55b742f0fd3651f98e51f376219c2f250d4bd192cba77e9646424202e82e5ebb77443583edb60967faf7708fd1cb7f72e6f438880be76da6f2c9785e552c0862e12303803ddf74a597bee6eda1d925d251f881f9f5e2c79c82f0940a009fa802638059bdf8e0f9882a9b7848526f8f1bed112ef013025ef1d41d383b702c18a94701b8715a7e6eecfb1c62e06639df6997c2c6a2fff7cec3feb1c16a1be982c5578fe142b6554a3645f14ecd24a2ea088d66e0863a49948f434a30f6f44a19afc2c23620aa6efda632c4fbffe36635dab9a68c66e2be8dd5cb3efeb0d51e5ef5b3558a7399f0b077ef35fbc957105cf97c1f19081897869b2b4c8311cb66dd431c1a81dddfb300ecc8f1a08819e455d2a0e1b5c025ba21613ff9285b0055bbef1b05a3b4d45383838f08a432b0eab402ab00aade3a6f9f00aee38c32925291f65f4a4894328f0fcd6a139761c0fedfd656c16a61aa7757e1ac7fec89fda3a3a9125baa8c877904081e7d7f9d202814be8a5975e5a0388e9534f4515fd7e3760ab69cca71489d8c519e2b13b31475704428e51644a2d36ff391e996ae346dcb75cdcddddddddddddbdc66b2d6da52cb64ecc5ac0c85a5832d786c38a5aa7c64927151dbe7080326c556df31d988aaa9266314addddddddddddddbdc6a3ca5137641986029bb97f373bc2bdfdf9a01095a010c8c21410989f0f04a61ae706a62fa8b46c35c6514d19a2190100007314002030140c874462d158309ac8ba681f14800b8caa586a5819684190c220839031c018008001000000000090c1c20060b497a924279dea5dbb9e934a20d4fa0321c68209b19525f1defc020f506f3895323c25d857864150af4d043410f583ccb27b3c63ed5c0fc375127ab287855ce44afc9fe99a16341d9b4cb1c3759694bb737cd121085fb268e59238415d3d07824e2dd359318ac13b378bf74cf617e818c9f1c9d6010dde9fe8588a72221b48c4e22b6aa4a45ec0b6603925f711b34306a544da1940f731ad087c7df7b098ece1bad9f89a642bba8cd2c007b9dd33f94cdd0991e5141d061e9a4f023ca16c2b8d208c931c86d40074982323291a564c55fa8e4f43ef1d48648bdfc12502b4caef488777063bbd0b37403cc45aedfa64b4c5519a036178845c5d047daa559aac24a4a60e38944e784f8390def0084a64ba5c77a4d5eed6816a418a0c005e258d60b5c447f061c548e692b5e721ccd51862f82b7c44bc562be201602f36a2e272472520a12e87fd643649b20f04b09f0d04666477d46eb5aa1eddbf36456d80ec15bd86106622ede2231f82d830f1d41f8cec38049f6368c67ecf6f79148b8c3d1ff17b51a87ee49b12021edb63a309612a9db93e5874733d211c3259bab497cfca42bcf1419b30ec1d1616942925e03d8fe0e484ba0769c26a7a8507584100a12e1c8835b19e1b6c63aca019b52df4515981a101441bc97f32f3da8d090ae0a47fa3b0ce28e27872fc88c65c9fa7a01af52c09a2f494c504253d8552a399f414bccd6632494aa5a7384670ac4584a5c29a7fc5efa4a7e471b71e7ac8647a0a7156e05ace624c4f09be44f5511e57a6a7d41a75a6a08baaf814f7d0a7ccc2522d21c11bb5b84f39895567e54977f5acdda7fc5b99b3bc2f545dbb4ff972a44d3667a6c19a08c9877e9e0821fcbcbc6c24c9e051de6eddd83badab0825559e8dca3475f54c37ea608852890c435ca567a957bad79cb4ba13bdf0053b23af84ae20f832963643b31a9576d30b1e894e7e2fe430201d6308cde915e262c04d0a58a60aefade85ddbf9705b229205ab0b87fddccdc8bb55919d04954edc8a5584639fd90e0ad87537f76283669f56683933a01ce1e0065bcc40c3cd5efc3de9c3e9c09c4d87bdc03933cb0401026380588e6cd7d55c6f04ea3f9f7353005c9dba09b2390d9250abb696ec7c903bb17c4792bcb98c81309d8f16a59364a84c6ad60ff3ee36a2481ef89894338b68e1dbed94d35a2a3f892649763ed8cc1a21311d2c5c6b3e487cab30eae4c54716c80d41e803fdbf80a77776243cf5857fd6eceebf99b2a7c7b00c771f83d833d7338a8b5a7495db239a9421b865a024ce9cb5aaadac66d198b1cddc9fad5e8a9078065c2f31540c569019f2573cafc2279cd2867716374364ddb78402315c8322f49c7e37c8c01f616924c0e9a7cef68da9c7c99ba68d070140e9d760dce2d8cd1db48202d0294c6ec392634f724d91eb6f94c75852679c6d2cbf76631d4a62a4a465497f1cc72deb2cc8d85cef2f71b21334f78e716aaeec68874d709aad49ba925eba2034d8caa2f127c03955231eb168f05840640c6e2ff1477784bb43a25126c413bc1b76c539fd64680b8d544575c48f23f2cf29f3505a741e849b88457d7923d7b3a8ab9261acf66a7b8a6863f1414e03f12f4edb2ecdf5651ffe27bf23b165220545f7e4e584f40875c3f8ec2ed6a988155ec20a2051e391f7c725a6762b288b607eee1928eac9f246f9b78ca08ba14a4b4c234381826cec921922369cd0f8526210a76b035a5e6cf737f48110ff5c1903549b381f2e2072d1aa43c0c7ee9c8beb22285c9085e68c1eb2b8653018fad4e800997b5b304b942a0921204b2976832807289a212993cff5ef2360265ff9a6619815124d1f784016724b75fbbc281f460fa90e778f396988ac052ed267696279a5bb4d44c77fd2173f3c4e770785759d275c37ff03521d13eae7099588dd524d4cd23a221fe87a4e6a8526d8d76abaa4d3e9f56c96a21e3ad5c3451c2fed54f91dc9853ff94eeeae543121896af9cf32ee9ac6d390c0d3d7a5e9cc75bb1fa4b86eaaf3720e5eb229b7b21328721fb53d403098472ec5bbbb7e68fadd94b80b38e5c022abe30104de9f1c0464ff3446a03f8c68bf12f9112e88b60c42f9a582c1e1998c219ca83ef2115e75233ae84480ece357576f735f70989b1d9f68b23ba6de7703e1da56ab5cbbc56dc207b1fa062e89447800d3474fac4f5fac61f6bbafee09bc399281aa2388780308493f7219297b041e09d624bbafe3e44d206f27680b16685aaf8dedbba681c501105270321d5de7ab88da641dc8f74f39391ff46c7a0e33575e6edea4fc35ff98ba1f9e22da75a516e2ecf6e6b5367b9e309750a305bb53f5afc41f6437c82bbe708b6284b712fe6828d82d073a13fbb34577caa3acab69590ccd9b61d648148571ab887a75a5c7402748ac104133f4689e60b3271457ba1b4477af9d9f134e0702d11c52aca9bdd1e88d1d1d3a3abbde37078911f0ab2ec2837a41eba1429bf9f6aed334b637e429d1c39c1b4f6f2ef3e2ca24ebf0b556d442e7edda1505d0cc0671b6b62900babbd0b12a20291c4a7ac88239ab4ff2df46d849fe08957bac5d73a002da25b9edae6ec357296c6b5a1f62b219a3fba483188ceeb51e0f1eecacbb830398f6182397f03ae7eb78cc01d8527d7554fe6c8e4736b93549124281c7b5f43750ba5927199e8e9762120294d10027c1f4c262c3c62cc80652690003d2a0627dd446bc9d2ce88c44bc885d129f0c3e6d7f311d2180ba674dd4009c607e163957dde7040859bfc75f4b605160b522f1ecc3a0cc9c3e54896a9c39fad3be3372d8107c5e0a33e267f58dc5b0e8839b97c27030f52d3c67ba1623c3fe79a54a0a4f1c556ed13f45cbc7077a292b1bc6c905c8220d9f67b2b213c95856adfeb159ac95102d278615ed606f48e0836758dcf1e41d8c19cad6fb935ac3d4f390652cc356152810f1f5997a921766e4ee9b5d0df001972d3463ab4407685575751e1632ca7e119acea6b197eb07965bd2f006513e584e807942ee9c1139189a4ae80e851ca67a949710e2957a6c94a076aac28f9134cd6f208ffa901faa570cef95e75ac1ada972612f046a0c183aeccd0fed97d0e1e91008c31a0c1e59a161652ea958911763af5e362697030f3e123f204cd5eb64731510afc00161f7dec1b76740ffeaa5539a151b0996162d51f59021fde0e994cfd3e959a1f7b9c9300f329e49abbba7f4d2b38ead79fb6690e4cd7e954334cf1a3513249887a54a1f1347f06d37d6e0d854c74b796543bec362a3b872bfbe7277bee7725a8e400f419d0f8b9a9a93699316cbbe93ba828a9ef21f64a58e8c3aec5e0ec7f1d7b798dfb921be0ffc0b5532d2ba16f09472483d491f40834e0ecf366dd0622a1b093460a30d2ad8964c3bcd04c9e414de3d41a51e7b4b6cf491d3d3499d501a514e3e1cfb9663ee419af15ed8bf50060929da467effa804b765330005ae6cce48614a3b9502cb95cb0c5de6b8fa98bf10fffbce6b4b50552fc81f1cb8864872798cad1cf9450a752cb6cb0ce1d7fd486e7f6f4cfd2d4ed098cac61503c9a062b4948ef92bf23ce37d14a58a5a3bdb715fee8d3bc839be13b9b5ba8a1f17d7a95c8147adb1e5ccb6d7b091234e6af30f7cdb1463330f490486cf91d276de2cf1c2bd442a2109d5fc90f0765b7ac5c9a3fdd4170532517598354ce0cd4124d547259d07877d5abf145443cc65dff5c6a69d95974768ca86729f94514a70096c8594bb50b481ff16a4270271e71da587f4e788f6432a48ba5f4c6fb927509bd33d683046aea65a1c3865ffe252a23d574ba032aa445e87ab94940ac8c4b36611287c957836867688a5ba7eea24036643088593cbb8666aa823116061f5a03cd435a1228f9c2fb338e9245a3251c8b04836cdfe858c1979a133a4812d881ce60cc90d213b6a279c166008f30c6314961aa499b8645b6d8f037486b7dc1a48ad61de684acdeca9e1b945a9f598eb47150fe7ec0b6b606c7706a94ba4d6a2e576f0e3d6bc108f76968748d87f5daa8d9c517310f177d8428c88ede116314b22fe0a36deff728a2e5e45b44429c04fda6f5b57cea90e160c37a12da69944930dd4be90be208594ddb70548cabdda72e6fbe8923551a8312e66297d25f4f36a927db42ecab379330ee49faf04fa333859cef983f1ea01a18b6d458516532011d384da9a86f932b31dbe20aa7b57bd471449cfa9412c34112789f7ab76a78095e769db670eae4befd4cbf10e467429952bc5a90991c54654f212cb3a0519df2291375021d9aa6025bd4ae6dafb3d0d78cbc9802586cad47cde174105d8769601f1a51d2382d0d9542d53b47633a3455068fe81a61016461403c563e0ad5b7abb692560f965988a3aa1cd65cbe4d67b67e6a220c213315b562a408df310a823184f0d621d1e1843a0603cd2c331b2c0003cbda6523d298d0472a4ca7e8e684e2689fc1007dbfb7664ff88bc78bb272047e4bd01e02a41ea07f04274ae7e80db77b78d7d25aed74e6881d2f441b4450a211302df354ee3a6719e63ce9915f9a0c3c6318470595507d3af454955d1757614cb4e4e8e9861964e8c2e0f5a6874fab69d0aab5b83155e47ae3ce0e9da5f8f5cd3afcc117d568659a5c97716f3ae19c3202e0280fb24b0552ab179e6505d588c5444fc5121c19d5e4c77827e38b144be498c0ddc25bd78509d1dddde3559fb53f13211cf1c23b158c3db1d0a38ee6ea297492036d7876a3b702d8409f798cbe0816b0b5f02def852e0d0adcd15c278af30d04aaf9d79ab3872963cbf929bb08dd90394efe0a8b3b613e95e7a5bf2d15afcec2b34923e0d7d7580cee48f7f7b845b0b64b6a9ce109e81eccf761c04f44f12b2a04d8855a07de40ba458bb4b5e46d60f0a335d603e31ea61126ad0f0176eedd65b1b9a0242de273b4d32636f969ccb9fabafe0dcde275d31eccce352e671bbc4dd29ed444fad11e78946c767001f358b86bb894b35bfe2d04e2164bbed27099cbe9d0067c0ed0b2ba81f1c16818ed19f26017208f1fee02204f64b64458015e08a3a9959af687f774b8dea3561dde86e086c56a7f652fdfba2ea3dc44032456113088063d7e6e876c3453b68d95566cc25a7ee0ce1bac079568462e6ee57df25c3016bfd000beec8735b207eedf82ef649497996ab607fc003a9b055c971490ce688f6f64f28122050cdb1c907ea5710cc91338d4a3feec3703afc5e7dd77875c652e80c193220e1dbe006f8f2aaf7be6b277e67aeb4feda608e82dd896f5123533d483490ebc38e3b4a811197877e32d2fcbf757b43898248383f06f1d8780942c2e78e6cfda4e915f2323255095976760bd736578db905514a6de9fdced6e1e937d8e7eb44ae01ca001c902487bc7727a52ecd8235114e9b6ec4cfa03a08de1aee0ea40ae6a809068b816860980cd54980ca62b071b60d40b2c5f8600a3b0f4d048057f6cc025beffc31daf1428113e1db5d8719c6af1b5eebbc41f7a4a2d5b21e77d4f737810402cc0a673538b9fd7283319335254cbe0960ded204d7a63ab08fa3e1327def354c411bd711717f78d92595d0e316efe73937e3702f2bb509959303a20c2caf99cd25003e49c4bc1140cf3b03f2bd88ebab12b5f236fce32bdfe57ad6f8568cbaa3b2fc1a0c5b6b86bd5ecbb5f9357efb73c849746cfc315b091b31dc5228f987eb9622c2719991b3c429154499f6c4a4a84571788311a185ed084df5af29109bbbee8bad597d29cea7c80b8909829dcc3b40c143f3340339ea2c58482d85aff7831c69c385dafd77d1f386cc7d2e1b17ba0a16e3a9c8440be4e1a80f8f0bdadf739d118e6b23ef14f44908782a54868d944beda0440d5b3ef97fe8547ad69391e3c6bd501fb59c3e83a56079b5272243439aa763b4faec5f988aae383b260897235934392b698fde9a8bfe046d2acac51697588f0cf59211577ca5940b8c905dd814cc35fa89f49e18e1419d4b31ab205edb3fe691e63ca45a9c253cc52529634d116c45ca6504e324183626f6d431f8a1e89d62f3872fc97724bafc0d0edcee9c72c6e296a5aa8ca526e9d1415b65f4a6a38c54f5847fb9afc126e8d37a4dbdda4a0f9fd09bf34282ac0e8a745ce8bee504176331846bac3a6bcfaa40be23842b7d98e2b5471f98aba5cb9db298d8f01b7306b8bc0f27fea4adb97bee0efad07729f00ac3d4836b788e10db787a06ba76ac1b1a7f9bfac290050d7b72bc75415aae162619a7a73164c558ad1f6390deb80eafc846edd1cca6e283e6f5750b755c2935af67339bf440372ed1a2dddd9f8c79b6c24537d01a2fb094bbb7ecc8562ddf9d07d4b91457e1a5ca122e0f868a85444511764c33d777fb42407e0590b2992b9f03a4df078c8d96c4e5c2409f7e94e97d82261716a5091cc6661c107d8700079638a916defd4d2eb65eb8b5d537630f68d543e3d3bff27aae16ebf2ade4aeb56008b6cc1d2ae3ac7bb332f33ada5a5784351a23c17f487b1e4e38cc1372ce62951333bb1d4502826e9c59bb4ee777927e54dc9583bd3b260d72c941fad093bb63a3042c13c2ab9131dc580d43da8dedba7ebe23577f566519bd511a108128650a4a8c2ecfeccebea65c0608069c019960708b17611f2a428cb798e250e973960055dd5bb82ae6e700ee6144617c3b4ef9d80b667ef679b525bd5ea6f1c764236eb9606d8657c09667576f08fb0d728cb40b8eef63475a2ec0630586897e5dba469e9f494daa16af98fa288f77460c262c5b4e2db27197261eafb370ea9f4b3fd9012599d65d52eb980bb7f2f5bd1b00dcfac4f96c73adc032275ec05b5e0680a0449730e03ddbf8ab5140f31e68b378c6251e82dfe27734d9527399cc7bbf3949356fd2cba9bd521c604787eb248de0aeb73e29d0aba2abc5b63efce6346efa155580960c1ee87992a5b220a71915498add5291189d4e699481d6e6d20aa624859108813069a15c6c195ab41868fdd80e7b7bc2b7c221bbdc1ef1a972e520d0a0e182797f963f13c01596d9cf93c008522f872c4ff7cbf3d8792485d4e4ca67095a83f838a7251dc2a8be6acfc29db4087cbc26398fb2df1258b16f3eadf2c632e47d5f21a32868e36fae3f2ad6232bf41076fc94d292df5dc9a4e9acd6f58a30369dbb86fde310b854e239668e3931723bfe7df08f48b513b089ef247d9126a29d6d939812093474753413ab4f91e741b4331b38126e88008b1a1342202d133cb7f6a23a672bb47c480c04e4d5c6c123c43c1d64a951d081955046efccf146049178636d5111d5cb1aea8aa9f39ebe1ed27b8679ac500be5b414d1cfa18c99c9650ccf47b89536beb39c9e4b3ec36a7d4f31fbf7841bf7b3aa52945b942fe484e80006360216c982c086bd3d5a3f0f2246103d7b05752e903f5cc1f96052e6cd7603dc59889803cc0b3b4687819652ae61df3353e7092ff74cf1ecd43e210026c2147554fb399b32f614d308aaaaf7928f647eac1602fa7955c1e3530c469fa4a13aa9f37e742aed38ce8fd952e0298021da8b8bfc60326b8e2363b99b9be3a6ae3d5d45ab7869e523bb0fd04a25dd482955d37072ef28e2a2111ef5da0b86f58f7a7c94a0728fb534a7eac4a0844886768482095c4d162e20e087fb7ee911a133d823dd6e50b68c71d40a5d6a72ac3d388efc6ad99101c24686191e0e31b841017080f843101c6ad8d6c08256809ef8afc0bf243a894df4dbd112f655670ca106c84f9f76a2b8b4d355ec3942708ee2cdb2693e746718541012dbca5fd61ca73a66fbe32c77a08d3f1d6a15efd7a700916f6dbd054c94923a13f19b0ed5b821673af308358f3de9b483e39d6da8aba0a545f1ab167c070310fdb1f368608fb5ddb16cdb2c207456b58a1b7f0bf303369332c19db45a0fa0c270c270ec6e32fa5350073accab917fe8077d411d4364a08018dec318633615bcf162789a5c6d72de600496c08b6f2db8ab5604606cb5a9ab44e575953a3515f28d30af1dfd8568b276b910a6a3b90642b6041d57193ae7ae07cb7d9493905b9392c2887d2cf4398704dd050ce49d634b106d5405d6a8e8b702e449cdcff8e00526690b20eb42acde861af9b86e6a9084c084b51670358f6e9384326cfec7eed732fd10695fd5e8bbd1228ee392843591e75f2aa4dfa0aca060223950fbf4cb60561ddb1e423e8644d2c5b2b84b49fe909e1d35b1d6ee2c46514708e8770c667b8903c36f05bfe041ce8eed6652c5823fb52166168bf20f6451c1d27d56fd2cb16d07132bacb11fc39e1339ce6953993e5f62a250a78b611fb3279d2aed41dfebd7e1894a42b4a09be5fe97119603c26c47ac53f605fe3285daa9a4df898def86a8401e9e40288a9b8cf3d208605d942d5d482e94d6aa890b4b7829b3f948b18ee3f9d4cddc6babd938d1a1ed46f2ad14c6252422447523fd6405b97f24c95d81321ea7a380783f2019cc9d7a095841db0d840be9535410136167ec0c0ef2685217a00378d3b6450067aad8ebd8ea058619a27cfcb2eb2d873b79c326a613527b78c38bd460ad652a016f97162fb632a6c3fcf52d1833aa0d6724fbcb60970c0f2c12fb332ab8cec4e211f8eea1be8e1a42d6b6569c58c7829fe89c9a1e6d84a1d53dae16d2a501005fe45efadcc28541c01cd9987a9ff325762016a184dec29d1a42b350a70a3d7fe0a62ee9763437993ac18285b8ae033177b151bab2db98c9a0ecfc904d41def587da1edd95a1b7b5e6ed27fa82c378cece9311a1e9abe1d30dd99e05f40695727c33f95a101a1b0e2746d2de5ef3d6ac3dece7fea69488a972b38dc603808685b48a1289b87f9eed0f678257d705cfa562bc2389e95b787a009ef312ee31d7d538244f69618d26081b7a1a0505cc49241a3418304935c6f8816c308ea64fc9ecdc873730462f5c0f9a823369fe22c6d0b6305bf5f417fd310f76c44d3b717ed45fd9101307026b1b8cada9da9524fc3a7bb08c53decd1907f8d0d6e390460a08653f9d88b7f2769a9ab4ff73f52918400e0d55437247f8ff94572a8ba486ba7da78505a2ae4aacf6434d9c23afcc80589c05e660647681c482c8d175d917db53c78fe3ccaa411e37e40f747ae084817d0a145995d067496444db2a7a58f697a8e4625319db772fb33fac543cb892682972355755e47d28bfd0d64c3d80d2ddd88431a257727678e9e5ce798199d683863fe65bbfbb481938161dc0b61299d30c20caa5289ad6f20b6711a355a45b81b81112861465299af1e9d4c8a9c3e7c1818a912d059f09ace03de2ca4d098618f2e337c17c8a44e5612271c2580d7209d6aa1f29fce3d4b84385c01ac11116a5825672ae2194087aae8fedaa08bb7de768ba42a921af452a6e7de668d32fd0a92dfc90ac249b8722b0973cb6f1f126ac314655d1ad0de1b5a75bc17501ab1bb2be7184e352c1492f3b56efb9e6db79639741ba5fc3a39d70f87c932c97eb5ba83946391940b9fcf89f03cd103afd19d8da48e8c60563d03bbce62f2593f06afbb0e9b254083c478b557c754eb5c383ea780b3e3ab86491744bfba190aef9961298678b9fdb4ac886946e20cd0c8a2d9edbbe0b41c7ea6141baedbd4a72d68cfaa6abae1fa21011b7e3f256023064fce14bf3b025ba38b273e45a6eb7ebf7bb4075755abce73795d2b508e1ee273478995e4c37c964eb16fd67c134d9e9976beca324139730a5b8204c6a5b0d95b0590a496460f7309791d81d3fa52835b70a2daebc080341959bf6679c1083d630521ef239088e411ae9a8119d3e68c34769d62d7d1723760d6a189b376ed56c49b762b46e4f57df0b0b12f6893bedbed38e77eebc594168d4a360cd2f8542f5aefc45b6e3f71ce537902f2e72449e2ec3dc6348cb11950356567b3a39d86a05b28170c933bdd44c0c5ebb8b485b611c9e462a42e2c11c64232f365480170c191b4771c370299145b118406bcd68414d22dd8c6b6e7906d2408a047e59644dc228ab601afef4c576385487c7c22f8d7691de4a83ce49d1c990baa0c19d2deb4138b0a9f01ee01166d692f5fa49fd66b87b40b15143c74e3ff1e5d7e06d372081edf90694efc6b599d0f523df66bb49b8fb08446d615ec741cd1a6df1f1252a197a84fe87cca891f0c680781be29dd792099fbf7468502d695f07692c8b0bd2e249ed4003afcd5270dcc6db129a982763009826748001b643037a550b0927733e9be269a7183b40a0e612ffc15414e2740d3c92bb1de09dd40ffc2ae6751f7be41e124989d541a58e4d5545e8673f756bcd7bd38df6255e60e61965115a93f6d721e17bd83ddccee933716f3e67a0b5972ec4e13aa2f584dae7d214efdb88c65cfd17d263344b35cbbd95c15943f11a5ce87cac10a1a49c6b1bceb26807df9480a9f0a9b837c6acf9bff707b81d91d18a9a9b00bb7ffcfa30d6d8675bd8007f74c13f92ee6262817e42f0fe49f78f1d0167a5237d11507fe988505b44324b278c4f4c2ea65ffa08a59149fe5d61eb6b710c871288436287c7f4a5f470a538d8a1c1b7b99d1cd629365b0b02cec7840f6dc3ffe850afaa8d7d38203f3318f82bcef3533aeaedace18171d84341ee799d39d753b6272b1d2e6023c54f76f8c323cb0015cfd82d21994ae3022a45ce7852d2fda4e38f25cf54c1e616e7eb4e75465216e6417518254ce9b1638f790817a68f08264da13bdac06e66e7f4b8921261bc8a814c10a52eefad5daff4fafd3a5219fee818f7faa600659d03302ccb0fb8806b660b2c724b5eaca2324f62696e3a86897f3ca0b9dcf56ebfe1e401102acd67020b32b921641ab3707497adaf960b5126b0be2e13c22662217316444d6751487ed8a7270f87e6ff7f1deed5d5503d3d65fd5341648a53d78c1704d42b9fdfe3c27c019e66ebefc6fbebb02b717369f78a7167cad8badcde54bc08f027e6cf090446b7bef799c5dfe88eb508009ce013b11c88fa11fb006595833eb8830ffe400773e00795d50f7c400739e8833bf8e00f28ab39f0831dfcc00774d04077c0ddd135d503c8e95e7705f143c7ac7d718135a62117339358c4fef798928d0d775f57010e456bc8c1d9ff1ed2603172f3795d5b0c605a6d1e9e4f0ae67736187ff8bceead04b8569b87ffa336e66a5b9eef757338e2994e5e30b315ffbb3e86f1b0d26cde9748628277fad40968d106e30f9fd7bd9100d66af3f07dd4176206efa75e4d92652cf6f4baab82a9a47928ab3f2c74bf117e747704ec613a58798fc8a3c4cc26fce68fe7524bfe6e3e3792d56b5e9da16acdc09e6ed31454d4ec988d20aa90a59e3bcb079779967c3c427e77a97fe3f9190e24391d37cd3f1dfe21ce8a3ecc54e88ff9d1369860281c7eb4288fd1c4fd0aae3697ee048ae92c6a57083acf342f9d2f824d305ef332ca04261b26599a62cad1a58c4bf827f362271f27a7fd9a7989744d9d0da373490177e4e83178f099725821f008896407d16694c79b01ea6993a92a1c95b0769222ad9d7feafb4f4c86fb04c61b13306a014d624a5fd9fd894405162466c4124b6f975d7a0b24cecd4f9ed7e38c47e341bc3d11bad68e9379e2c1b476a21dc0f97a7d03273772aac0d2b54f59dc37ebbf8d632f32064a7a42f99da1c5cbba6080c91142352caac6173ef0b3cd9102a812ecca114c33da237e589548643e4d09181714237489c3082b97b3ddb34ed522a36a3030f48bec9a13b142fa160577d7e408a01c8758394f78019c3b6a5f57e66726c0484b25f55d811154a7abe2c0be89070baceb7f9ac9151ee6a9acb06860757560eb9e49b575704f277ad31262be709164d2f6487b16dc23608d9b57e88c0f4ce53d9cf21df2ac5935a13a8127052659a5731c59dd3053ee6d90c9793b8978b8b8c2dc6a44bcae8ca570be9c8dcc1549289137ed0e2b7372370dc6e69c203d9acd60114a86838540f38e776f981b2105e8beca6188e0e0c1787db23371c6ece2f6c474d80f4071553d4ec7d7411616c64d454720094af6b93d113a329635972ecb3d6d5c40a5ee6c73e0eeaf32306396c9ec23e291b96fb18c9234719ffeaeddf42332403ecf3b4a744d01cc1f5a2cfc81434621f51d01f260410d230c6d7c9bfca7d4f1c812c97793fe468d47a57fbe3de5a13caf11e2019c7678f3ed928149d7de88d73d65972d5f72e4675d39c7e895f3bd82ceeae2613e4acbfca815ea9763acc7ddb99add6aa4610002360dedd2ad7adce5acc174ba1e55c19d147b6f3601e3d479eb963f9508981b8063f1fe41f8e5cf905df62101a1340e1a80784de301fb0393ab6bdb6aa403b29d4bdd7af8d79923bab1aa876bcb366bff33dd6bebc8bfddda38c6a5b465290e04d0faf54afe48bfd6b85cadb5621bedefd5d380a884cfb4e64e3e655dfcba43c21a24df1b1c8570935dba0c3e66c8d68e19c0c7765002e0cd5f1d5c5f55291d5a1bdbec32a97415b79ed7732bc6798b30bf773702ee2135b0334a0021d6fc4e82993fc8697d944ef8dfada1582e38ad57836d764199adc0e528a723aeb385061d2b1dec15788e277e7fba36deadad629b34e9325872b01623e0b776d1cdc00ffcbbd015c53f44fde1bc570edaeabe1abc5b006ce752f5a6edf2beb0cb723e93fa9febc1c19aabd8a8c95c9732a35a74a11648ff134ea8d1e9888f3ab20f7784ff97a81258ecd244148ca7ebf23797d404b57add763a5a3504c253e8bf6b4635b52b8542595b049bf869961ed7c13d7ced017e77a3c698ef62935d465a41972f9fa60ca450713bb02912657f7eff748d9ee91e10096b65a2a58a96c6bb01f8d2b9c1542a5fbc3a4e0512881817e14386771dd872df241d74b3434e622271ff0611a453f73b0c7d1a6e1f5c653750db6436ce80a2571aaf8379bd7e3f5725d98a66cff31b6123547a03bc87ae95ea21f1c33c421ddbc644c1f8b30ea79df4e8e66aa62ec47650e744ca62e68818214b8f41cc5a2e6fa2a86f6e8f131d25e341d00e7d451fa7c77fe1cd1caaa1dfa800270dd42f0de78a50b054d1f0592587235041bd73150d1b699c092206772cba7e260fee84609ccf8f2da60753edbb47b534e2c0b941ef2d0cffc84ec3ffd2d78981ddbca36ebf96f57d59603bab81ad1915ead491e0f89748a6b0e43fc4197b053fe8ed670b5ceaefd1ccf20b114cf77f7b5a3e44a0bf2bd9a38cabd70dabd0bca8e53cf7b626fc41ce6f4c3d1a9afa233014f77a1f5af4f67aa854113514292f1dfab59b5e28d491ef53b10591a992d7bc00e204331f4c93e31a7197d4541782f318c5b110fb809501bf1914e86548fc58ae3189c2fb50c35d41f46be17ff75df0540e92ae662cc88f3db3bfce6e614907b013758c3472c2910d00cc56052fe0ca4e9668984f0e266e81629cba282cd72574b489ae3b348a57211350b84afe1c780b9f0b87f3666abacd773a4b944724c346851b2b189ff9f850a02be439a625ebdd2c56c3f87e815770b0dfd46498737ebde2c74e396c4d3fa44894f5a8bb7448f80da9c50f579306a5dccefe94d53b073b60e027019efb3a877eefa7309bfe4ef952979476e5f83d607cc15b345bb55820632eb30e0fb51824372830fc9705123b2e81c4f4eefd9f1abca354017265ff1332e1c08856cd90056eabc03addc934cc7f0265121a3bd579131bfcad72ffbde3e34f34b1099a5c7461995d09dcc41af792ace202e29b0f4685b90a7ae51c25f94b8161e23d217654be66c12008f02ba62ef2225285301797d6738eb3562e76304c0616f962c6b9e91fad39b12affb9deda1573cb873fd35bbc5d1a041817adb7683e20e63a0882ab202f3f22cd649a598f14821a11b2a555aad4448d7c29a531b55203e5922f011decb66b825db6f3cda9e21ab0256d21b146e62755b9a6eeced7c65605f68e4bc749f193f4bc33544c7b36ef64d49b6a489a272a09379258b3be696fe2ed7b6be4af0d16bb3e7e1a7b16207a88e59db504cd3fc582f384f030f94711577292098f54d0e08a7678f612569c0e2f133d542b00177dc271554c1c5f309a9d61a86ef2ee0a52ffc68225406aec7f5325cfd36182de07d3ed13f031331a0ee19f63f9708f3f49e47e2c4989a93b2b73bd4c0e2d48ca9c68fcedc81b35de45af627f29a86014f629aa6b8ab4f9e1dedc1aa0c00e4fee397e21a613ef24729318a5df313f007f438d9459b751ca33a494940c889e09f7d58c68187c1106f0aa220e2e3675f063e808621cea39d1cacf6b955908d7c8b8376e242f361f9a0a6442690bdb4e79264d36e770377338debdb3f3aaccbed9f510b3cd692dbe9093e0809ab5a8c90b7730a137217cfd605cb9781e06178942ab355326edb8ca0c09f0f938598328a86a57101661283c33b1f8e0a1dac09f7c67c903c97e6c44062a025d6d0306d584206bf13d0a53ff82731f248f5815ff8e58ed1f8155d2037c79300ea242823e3875ef6f119ea8fab033e46aa2c2dedbf6f3d5c887bb5c09f129ec94cb48c6d4553f89450947abc6737fc4515a66756682514f5e95b16101e4b4a26a4551d42d6f0aea8f702b1410b4f1d8ddb603de692503d5ad19c78e448499ec3eb5ba8563bbf680b1e92125d96bf3331f2abed65d106ce6a2b543a21db4b5a083c0760f6a69011ec95c84e7dbe8cbe7c3b5f860e9c8953a70fae20aa41f8ab29abce6c242496390b9a013240085edb1fc4c24a647f05a23d8620a9a00f94703eccfee9e4fc6879501c7b7e088a54310bfab91cb08f183f024d4b0bb0bb802906ff9f974c5e346944f44352e9d88a7230247bc680aa814805fc0452ccf1270460823385dffa5138ba2715f2f9ac74b1d1cc88b42fd1b85f220491472933cbaa09fb2262fece672fce35baee2c7adfd9897bce86b811061908bd2b5a692fda1571f1c50b515943e1dcd2e638b79d7bb55a547f202327048f2c2aa50107dfb1397e5e04e0441d8811a6c3c70d48970eb404ff262ae4b38842e3022e65a86f1305584b57144790149034d1adae394a9de5b5f5e24e283ce44baed909831d5f622b13fa78292c3a6449010c4371c7a039767e7cca558d530a00caaea1d268ab2f785eb204d4ff2646037a9a68a31a68d0dc0936735aa4e6e8923a5be99157b2ecb5236f89d52ad3d4d84af3d0ed3f0c1f8fac8541481a77ec082a0004b440133c14b0d56c8896a018f4154eb5d983461379a58315265a35dc480a52ca1c8e5146ff6538a33522f89682244721dfd78275b34c11671ca2aeb882f6966e0a62402dc471c073626564288c36689a73c26aea6f336bed15e68923e6a4c027f1e8c89777fd1a3bc04f2c4ef4bee6373aec5fc3cafcfbf3118b0736521eac92c97e1d56ecc64f02cba19f002c24b4e271a3bb8d6051b51f3f60446037560406bac6e187ff69c3c26d220951e1b9f26a5be9254ccd0c73609cdccf74d72f3b9301f13398c05a286dd4bf4695dd98d43f5172ea5ed511c3e564fb02cca294f89bceb108ec447f3ada2932e361aafa2d8a451fc6c67a12babcf838408669b633d89fdd2a10b7f8168ee98f89815133859a7bb334c9f12163392a033267aa093bd76c77bce983016e2baf0204a987d661254485375893ec934eccf08c07c496c64f631d10f5a2f2a0c0d7fedd9f52e46c9354f3f26786366e7f0dc59f96eb873e3ffabdc74a7eb27d212288770e8d248a07e72c5f0c39b281e46ad6ad155ccf093f1914c24865a56423e23a5d947289380671c599d93355591a228b19b3da3e65770c1a48b4ec564f3483fd50ea9cbb98bb5065252f516883f11f1a334db66008bdc26dc022627109661931b70597e4a621473c0a53fe4e600ad4b2c2f136ea12887cc416c8c49032146cbd8630d5c06cc9bcb7d7ffa6cd1dc291c1b410bb405a5317d5a21bc7f969820413faa27f3417dca9b4896bfd175028615bbc258cca70881724d4593fdaf89036438c8d7521206d310cbff1803cbd548bf5a3e9c31a8fd540a0c4531a9fa5441019c5efc21d3ce8c3cc0c000111575d286147a5add4f2564001a95e0d46b48161f0146cf961816ac75320bd0cb8197e732495fcb629a4db7b52cc5ede1b0961dc268276b3aa9a3bab5c8a40834bd03f4f59deeb83f82846634e25b26fa8ca9027c41cc2b500149e09aad4a59009ea806c1c8063e50f157b58cf22b2df8a42b29544d0a88b2da1b695bc0dee142082a5697ed264ae94e308fc629b0215f1e8dc69798eca2338d6120e4fbe51f04e6e04a1f06469ad71b51f2bcf069011fae30a75974ffac0122abeca225339584baf86f665bb89c05fe7b305db4d9cf3a6e1438d2e176cb83beb64b6883255403303575531cce5de4e1af900ae3c0c17a74c879d26e5610b6185c922edc225bada0515b7493f8293e5308ca17e245c11fc8553d4fa8394f4817138926ae0ec260b45f395d53b156f028326ba11202d64f4db65747b7f20d610ff36e9fc553e08a31d14c5c3356f1a8281a803877b756773b750c616e717f1b23451f7629b737cf3483db86cb26c1902d0f66d5817a18a6d52d3deec63a746aa62e0f754057efe5b32bca4ea0d82351a9be8f167ce12f1ca748e65b66b0caf81378f4656cb53644c52cf583e8cec8a3e38be40ecbd802aab281884500ab753b97b9bc2e303f33c96589fc00184ac5ecdf6edee2d04e660a0be02aa49685a6edd1877b80045be188c8ac0a60b9724a9995eba0664ef948a88863935b5886fc97ae382c107ab627b407f4321f28e1b1831d829c5a453c16a307534ca8ee4182e608d41e38e44cee60e9997f0493b0106ed5b3e95868949a26c334353a1d6acca74afe21e643ccca924a43f3d5b00452f7eca04398e6c1b72b328228e170472d95945a89127fb985eee2964ac6fe7c59a2c9f2497071e2a42debd4b63381362f78464088b64e312dd2310439e2f01517a94868634fe4456ae8d0a421ae89ef876d465ce70fe18b027c66146ab87d04635938d5fd4c293598e904449d7160a0a588edf868aa6aa4d411c3c8aa555e0d46e015e6a8a68274cb62a4445c72e5314031743ecf21645cf205b0d9d9990f6e02c79396ade3cfd23819882fd81ed1e6c064107b0b9fe4a202402d84f66c93d640f8ce04aa4e8f3163fceb096b33fe62edb450eaa63b8e3aea3c0a4931854502f13e9915e50ee42421fc5de17fba64c4d527afb5e51b004cbf994c0f1a15db3d45b9744cab214a14cea646f9e42807e13275df05be1843df9820e1503ba6089c02a4399c18f1c66b700abe537fc0ba98b9f847024c47aaef00b51822194bd36c0cf46158c8a2f9dec88710b9a13e4260284f76d6da61d82c42e68254013e41a342370904a78226c2518ba969611da1fa0d735e6115b47a6931817161585c4a759c32218153617dbe7862eb032879fb5c8372dd56f004ee4fb5d1620e63799d4144b90bb1a64dab1b65642f8e404157a1bc21f20c6a3ba506bfe91fc8d58cb5f8b464dc2657ec5e4fbe8debe03d89f6e49f3e9e8cc8294a42f8e977adc3e1e5cfee07a5a709755bb782a5e21c44392e61ea32d46faa37b26a323886eb8cfdaba79eab09b2204151359145e1f51f167ca5a09b847796d2d74a28a7dbb1f943851ae106c4dc621d28f027dc8381461905a0a2bbe741cb180f2c3056572a06bd1beb6a81b42eb2e51a61b9982df5352dbc57fad7fe5ca4a008e9e931af66ffcf6b0ed02dd3b1892fa6ffc9653007bfe06a1ae355ad8098fe0c68201cb1688ee385afeb8bf05062454984cc97564be04e23f43b63ad99dc4b08e6b105d6d737de9b9981e6d2fc974016be2b028d9ade7339931650b5379d530270b125952c38b9640711d09dda8397216aaaad34e2fd08902b61d5e6750be55da840265de5455d8a4b6f3fc50bd01b76f7c67b9f97485863d84de0c3a112531740e3e29fedfdde01c3017903e26a7dec5e9b9778d233f2908e11d6fec6e3c821900fbb59ed5ae54a55ca5e06ddad94340036000ff8e097608959c7899bf41de9ed3ae25bc5b9e82a537045c526076c2547bf1c5cd8a961b5f82ba0718f4a5d4b16f693937d2d9a122debc67a51bc17d01eb1e46329950936b33e4f12fdb3f151459a583bddd00eddb409e89c8d564b0d4d2a56fb01045b8f8a5185869e5eb0dab659c9a8396fa3bea067430540d03e949741c0301c6e556aa70fe941bffe3da06abdd7e260fcdd4e50026a6ab72ceab2d9baeaae0aa88c8033bf3b1cb7a8e64ae19f9a14b667cf2b3c8b0a23e907a1c821a4acdac450386e63af460f1438c443f21bb9651305c8663fe2f7506fe0dfb00f53674f7e0f8041f93761e6a71a545a125f10f0afb35f298d7fd508085857f23883bdc100bd9c32abc4c5589116869ecd24825b296d9b5373bb5efc2bd0e889a4a065820156ebc217edb501e8790dad8547edc55398eb04aa4c78ed070a92e285fb23d98a62b84c046ed79d39f71bd5ef9b2d486d9f759bcb5b01a98a4e8d15096b566aa4fa23759dfc8ec27944b4c3831bc5bbce7f18d8131f5d57dbc3f29f38be2fe9c8b4c664a25d2975d0337daa1efd532d92398b97ee854019502161d0baa549ee83a5ea074c0c9c2feb186ca0b2f6d2b230a81e0fb7d0c749ce79b4b24e4a0e5044254d81eea3b2e3a2f97bd77007c6c701604b27dee6fa40d2d1bd0bc0f3d8c09a441e0dc4e16b21770a500b563483a97719ca2c6648d9b1f990854dbf64d6a4cdceb92cfeebca6317dc93a249751251a87fd4fa94b9f8ffe4918ca71d7108b0aabe2c00076bc93061ef4303c118b294bc0971d61defea036b9a30a2691df7da03e9a9e7033e2f02ea000aa9e03f547813437fe1af7426f1bac05cceca5e580133b97987a89de2090f67479affd812baad05e83264f981fdeec4e00b2ceeb485a4908a0247dada8bdbd27d035bbec9c870b561963a3f6695ec9a85ab62fab31850a7562fe986e13be88012380e83548f14eb6ead6cdcca0b38f931e61d9cdd71246031b197e272460ae6a9ba1125b44f1b1a6b5aacbf06551abd9a08501b552e5f8a84e567e468a71e325d9c28e69c99442d65951dfa0a9855e395641225b56827aceab53f098b3c204087384b20708520605a6c6480046cfb025157e335e8710da0e8321f2b6d944b086c4af7efa041794f8755c234f156c7f5c36d560e23cb66f6019ce80d392d3fe93da8f40d08b2633da8dac91e14883ce8cdaa240863b38998d88a9b29f30341a1485e4c743334f0425008f03c398098c1cdab3bc076355f7904114551937540ca3fcd4e04536a9d8628a6f93c2303cad3540df4f3f4dadece3aa0b0faaf3a4407b17f16282fe6b6baa2dc2a5e984a18025c19301722b53e2c14b1b05986b39226c14ac19caf75165d62a4a62c6d26da04b3fc54873445dc1db0e32b85843b973d8c949d51118f84aa1ab06a76be6ca40f965b0b293a40baa52396ba54d2566e0b56464d26a0577c114f844d9abcfd09b02ee147b2d00bb8fe394bf43864fd5115c8e26ae92fa268afa3f7c3c0da158c2872ef1a5080cd0947e05524095b9b0288838c2b5329187e281cd5c45e489d67c73a1e2e0adc0d1207cb26bf64716bd3ab3648da450b70a79a9200a96415d244be08547035106a9198fc6066be470d0324e45a0409b9e4ceb9ab1d8fb71ec6dabdbba251718a68464dd1ec37507cd736f9b774fc5daaaa289f629fa1393856b53204e11ac6907deec698fa82e97e407d0ee2087efba3ccdeaec550984076c13147f5db43b61281c0d4785d8023aac30904d65f2288bfbe7d76f303e6388dfc8b29ef82ce738d81a4c6749e4277a7a77388e8b38daa938174410461a62179cc53d825439e0d71f997d55b26a58573be88b12146fa1cc3547114baa349d0cc4242a226d97adfb6e6aa108e0e45ee93ea4f7f5a917d5d2409ed911de619a51ca894b20e56ebe6c2d6e8361f50abdf89013c3ffc8a86da268c8cc5aac14ae1d935b789e45ed4354b609e11221a1c8d148e4569dc12193f0e1e180a161d18b08312766c94e19bdbaa8ea68eeb97cec83176c67f6cf56d5851e3de60b5fc897162abe6df57609ded5497e684f566f16f5a3bc5b2ce7288c7e9cf7a16570f39d72c9201429daf7479ea9857227d919a2791faf20c25c148fa896d083f347686f6f18555b0254f22ac0f32d2da4f3c940e3317faeffef34b54d4417495b22bffbaa6004103f2e72e2527ae23acb7a496faf574e132192db06230a3695c74a6fe5e224d0f507db477b08eb4ebd179ef6724f0310186b01d1259d4d947153bc6550fec1eb6baac6360df9f27fc0647721242be7bd38a47cad1b2cfe6a11724035f28bdb3bb2ba9b30daf963a42f16de04f4bff047733ebae9971bdef02341b6feeb3c58f7b7134d8997e4be1761b8b771861bf496fd79987e4f29f4273a9ba06fcaf5bcb199ecc614fc746819b0a0d05b61340edcd7d4a32c0ecfd1662b97e1f6990be74f925cdfbcb885d038e4ad03b97cc95c4aecd662bb692920410326c4af7c22f04acc8a953ec2c104d98a1e92b0e8a188792fbea95012f6dba8c2cbf97f720378f108e72c1fe4ea55ab3f3e60fae650e05d7ed3504a171b17759a0d7a1d87f7c0b4ef00f8745a6a4ce681cf8c82178133e18f7d9fb0d65300318dc70c370d21ee1a4dee12d7888db2c2ce2de37999c20ec33d02c1ee63ef4c3b67c794eb98a8c23822dc0c1beb6898a4f06019439a64642143ff76320304ca096b484283a27017cc4b2d2295a50dc2980c67d411ff30f229f41d5c6e784b50120339e296a620399460c547a8a3104604d9b894dfda7dc91053347a0ce4f63d9d8b12f9b2b044e538c633f1f0c5871a9bd1a27eb6897f5b18b4b237058010d338058fb27ff222dda7211e20b6858e6cc0013a38e0b2daf2f84979f943465a19902918b1ca0b673f449603a3b49f1ab15bc7294140ffc8cd0e50165e9aa35dc2149478881febd499482feb08817208b4eeefc1c7de1254ff7333d962f6d9f218a3bdbdf44de3666d69a0abfb7fe0261007cc4275570db867385a721e007e85f55824367808cc0214dd24b797dde979802ad6cad52bec1265ab05846bcdcebbd033e9a7c68b163d8e521a53b18f1eec81efc393e936d0c2dd4f976309c6428911319289509465cea1f2c38f4740f5d2592476152efb3311393e71d91a38be3a0de5c65593c0c7c49adb8b9b21ff8f80fd55313338369b8cccb2c9f3d275bb98d3e61b6846ada3b3e61db22729401280dbafd0ff65e49667ba7d36ffc93ec458850a8f488f4b8272d5bf0ef321d72a721af5687727627d72b9fbf80d5c582e2f24e7ed25cc5eaa98f70a9255c4a1d82c095571ff320ac9657f2a4d1e3838468c1ed22e2c1a476fc6435a43ceb96639dd98d52ad953ab23c859bf6b8e97f6abd1f9f1e976e9a699d5e9569551ceb1fc2516c2f79229fcd6ddf596d7b51fa6c4708cae0c29b811a4a371c57e8bb666e34772263b45450001a88372cbdc6a4cac90b994401d26003597719d229ddb63c9d478d932f74c9fbefceb67eeb312185ed90427944f0891b4a9660cd446165cb92e9c86ed59170edadec5a6b193cabef1d66cc4387fdec6abc9fbec6f47abf370aa3b9da2c13dc6045ed54dc64448cd62f13f86a4920add1601359bfcf8ddcdb41c789113ee3348a244bcd4488e3d5ac9646b1e9a3fc2c36cd40f3d08e0b661a0495e312d9ef367afeee72c0b7b55409fc418a67a25dc6050c2b10f15d2feabf4adf17d9ea2640f62405879b9e4212ef7080c57d53fe7186834a06e29fa482446104ce54942e2527351bc8aa0e44ce4d26b97f3995e80fb1d92f1e92afe329dd2ed55fdd1516d443074ec6ff73ba7853191ee5f8379b03b94e4b1bd27f6d767faed7384950ce2a5a8a92b6b925f9463992bf1fc782795c8248aee00f0b59c3bf712480ebfa0fd94441f859efcb2743dff1c50499c46b56de2e4331dcbc27b8c06920f3c824d513ae48ac35deab57405d1ef36d43976165a6fbc47683f352b3def5a5da50f1f89d89ead153c82ed6745db3e0c2ad25bd7f5c7657387d2ba2194051bcd5b5b5efc11a04f648bf2d7496231cd28f327f18ec7521062d92a4e2827562f2740e52777526db93ff9564e927bfcda7d0d37f81bc7322cd9e476893421f17fe1808c611d1eabc4385a11a6488239ff292819afdb860b954f262243f01dd8b83f9f7f22d994689adc0a1e93e243156f61caf89718ca7ae5aafb2a12e43c267214ca98023fe68ba463d3ff69a8856e41c4be08cf8393e2046b38fb230a23e4fb3a831f073a8a2dd19c51499eff42946e1685e74298c354a5f79c1df6d66ef2c110ed9b243e25e20f1222fc458bbace694278cdf108d188e2f25d408c4e4759296a209b5fcc2c2b4804057de045153dfb2a252707dc0091cc30f8de509ddaa006b8321c40c5b195fa30d09a13040c1a70e68eafe9c0b74dd80142f2c13e2873f50ea1f6fe1185b418d5f9c3808260a82f24a4bdb32cec749b5e3670208a5f79b840a5db2ea4b16e338bc2a08fb65683240ef3a47b940ede261488376a32d7547708f2d668b56653b05a41a19bb883045540500194bc130c5245f33e614c9e5fbf44e9d7d3af20a539f07403fc5c5e35c0d365b7a05659dd300ea434de5cfb2ac45c2a8bc30113f1712d29ecf2cebc614396f0c3c241301c814f295ca5221047fd1be9a3bc98356af03408784ffa4ff7d1725d0745db23a426562c4e9d919c4441f87eee223689e8fd03fd5fe72856e48f2744c54f1ce8c437311fedc072114a521347ed68ea672e45d3607a6b18109dd911b6e4816d70b33ec7dd122e76187f5fdf66234a2adc2e1dfb7a1e5657f33ad9de08782c71e06c462ef6b49fa1cd6e6b7240f77f03b4914ea20bb6d6022f0df69371d8209e1a60d61d09cedd50a39b216a63c3a224803548c43ff5d74a30cd64694020ac0553017f854fd99b94badd541b56163e93e9b0ea7e4f67dd0f125b346c171cf0e9069df1e63106b8c07d425bf4161a07295d83e5d3dd14ba2638459a7ecb776169b0a917d500e9118afe073f922396760fcae1f8eaaf3fbac937bf149322a9c88a38d3efd8bd222337dba06bf4855c09beca5eb6a2472d8c2fdb0b882e9c823daa571d8d78395859bb88251c834f941258f45b2668b3014088a230cfd0b6ddf48e682ea2608ea89ba43bd67fcec3a8812b9bec17fff81661fbfd856a748001eefb94d7740dcbb609fefdd23ef01cf96e7314c9c547cb53953a37f2aff3f87394e312b919f1dd215271e41571c326c20f43068255d4170c9c921c47afbb3a76d782f80e03d21764110c7298a25744cfa8e14d95122ea06d8328f2f005a692ed63b58cf2b9ed2d11b9e29e5a8436482faa0d14b05ec71b1b47ed06934dd21e6f531e1fafd26dfb94e6e2a610b8dd7d67ac322ef679baca5e2dce93dd40362b90aa0dbe38876ab0c01340d0116a037eebecc9e309ded13b7c9567587438b5ef97e5ef34fad3c756cd99463af2e084839fbfec6ce32b79a432e7b50b217030cd6dd6e2af70205e67fa7875e6d35a5f0ee6a2a81c39514159294896fa516cbd2084f33d508ff390921ceee04a592a50e3e03a4ee217a3070d6f48bfc55c8facdf48ddeaca1ac994fa938b5f5b86bcf4762c3b3dd4fb1e0903896df616d13ef0f5988a615c6ef85dd1320904dfd4bacc42fbadd0b23e6e589b54ebe778790171b953d5330b038bc231b80489ea3c05680d8c90ad7d12d4edd6fb8058048dfa52393ac8c1448930f0ac3beaabe092ebd4c64f1abf4e3df9c43cebdbe513242e29019af14e1f93fc84ee616fc9b677987c2a0367da5ddfda75d806497a49e4b79a864b2e06334ba99bf5da61d6dbbcd36af9e7cee04a2708721eeeb765e5762441236510286c8958df5c6a16029d89913efa12b33f9791ac5b28e468ce47e8fef3d550225816185c74414fc9a95115a8f6228ca411ef95ed1f5840652ce383e681ef5520cd336735ab811090330d1fee50d37dafad7699e769971de07a1a6e33e2f2ddc7e02abc4419cd82a0074c1b0660131002d1c902db9a1f0f6571d9912be8ecbaba9b356b37acbca9eb7d0129a9fc35f519cc27344eae902a534daeba453230d19d5b2f392f673a408894f3184f44ad919ee533a6e1304d5638149cee96a5c05d666efbafa792e4f747751f518da6d2c8ed006581433ef50ed8c26e3cf35ff975a969425156fe6619b161e8150898c6e749d25d0bb0001276ad5c44779a53bd6121dd5dcb70e7827af320a0348f4ee66fe47c06806f63ecfed8d5f89e4fc195ba4b4855f05b77ff8e445b8966166e1b007ef0d6689f47d21b03f142041902a78ae15dc6d0979f8dad524dc9119b51385988ea0c36879014016d5f172e880879af363759ce9285cf84431d4c2120d5c7a050bc64f71e301420b20f2613acbf05294af4712452cea3fcdc1afb0946d1f9f90d15a69a16d71299bc9127f2eb2f48a64299437a4f6b0143263f610e55931742a3f11a5f0e3f1a6f87b8609b33780ef547fcde86a9cfc176dfe987d96c33210e4802d1b4e4af3b1811b04a324e75171be028d929d3aa62f3c737856fe5e16f554258c5e6f229e84f7272ee2994604bc6d50c415d0b094e1efa983c5d902683da5dfe8f18a997a09e114f66710958f1b613be595a8a0c0adf2a6b52d5a181dfd2ada8bf41032f13e059d039d856fa68a5ef0945ca2c9c8575b0a143a0bd30604173dd7660726275b62628415e6280c3f5193332e357dc20c575c3659ac53541acc575a3d6b52a1ab0fe789a56811271571f0b1acbf20ae810f1c2415610a3fafbb73f15603aab6d1c45bd7f9aaeae73cf3e34567fadc24ee9555274e8b424f2b387c8594957387c1c4feb1eff92054eb627a84643faf82003bfab833358aac46e6b79fa73e88fc9ca48758a857561cabb14fa89460b2d9f44a25f30ae64bc3ed548f41ab6eee690d5b427d4328fdf9aa158645865f184cfefd5d270556bfba8efa30d96d4ef5185b0cf1be1d759b08b098084ee36b51bc4e6dc29e9fe8e926db9a144e8ceaaffff4d443704af7f4a9aff8eded0896b6ec570d93b62f184b0c1d979aa41f8dede000b52f5c626fe78c87455e43d308c6bac3c8ebd24db012fd94fe485b594c9073e7e9a5a5d5f9177adc59d71f08553494bec3647d284c7b19ba0f2825bc1e59f4c5fa065489588b602c687acb5e2a2c6880ed883f16c69c9bbe52306750ca2da25f9ecd49dcb5b0d245ba5f0f9746850e81b1a0536a405056cc8a0482bda51219068ed8459ef3bf94b18beb39e87265faedae03ce9291e8c25c6ed225c63d4aa6bdd180b033a7546d2d30a08f643d4484cf26f6c03f248750d2800ea53366ce47becb89b2b5fadc8ac1aff74d3f85a01756a6ee1de15fb700d0181ba5a8f2803cb3bb05cd19a9426c14f37d9592844b5c8596477161e13b3194c787a310342c328d2c5ba2006baea785d7fde25ffa5240bf821a65db32b1ddfeaf473286dd22852464f620b7efd0551b900b3bf74f9162add4cd1f13d40a05c3422bae63606b11dc7d9e7fbf6097ee55e3580a052556ea39879fc3523614c653fe2beb2c24c8c173fdb4b3ddfb4b6c03bb961e4cb7f06c41992f814b510dec72ad8689e901f9e1cea523d75149244c190284a9e365bd8331f9dcecaba3afa32101f40d650e40c1319c3edcd34ab44f7b6a0907bf80421f4a6b4162439e9259a5d3749fddb73468b455e09f1f008a33ab3923b93c2b855da89b4362ebd4f3da00216baf3b0ae43232470d685f463095be5c31945351af1b6590e59ee0ad9f94b35aa2c9a21d7578890fef9061ba969cd77d2ea77e088e762c0975e601c8e674d2a532d2892571d6b5681c96abc0136eb9192e4eab1f8d2dd5ac31b9e9ee49bfe8877e5fc6db72a1146c0aad987f18f98837bf53a9854883663d2cd542d06b43774e8971210d62ed77eb96a52694c5b08798790da5769ca5523eb8ee9f80894fc7e2e559e585dbffcf29eb90ed0689ba32bacb9fc3f5d22743231713d81fb277f456accf4272a309cec1c553c12030e458968590605d5d1c1b363fd1253c67472d45c205b951c09c454ee5596f07e15394f1e9341d089cb9bc35139729994124920fe03b748c092370ca071320427189b3e11ff277cb5121c9fdad08f87e771d79d469d3d7a862bf41fda10eed6eff9252016baa66fa35d37ed7ab332c91fee8af1d76dfddff0610baef4ee84ff9e4459ab50d9dbebe088fe8fcb9ecfb862b3487db61ab56399146bef7a493408d4f35312b5998972417760be644c317e495ef1caed001ef759a1b41396bfcf872859cb686a0dea5ac6113183349e48ee1ffc67d75ed64cc3a6bac290abc56ecd109b1cb858770ce6a08b81fb90789d8634f27933b1745222d8f0a1d09e149ee84e11ff0443a6a9973dc0bdf78ed5978380282daf7066b0cee606b3fdc58103a142edd7769d0aaeb875efb9437d1112a1335c13473abe17e8a0621863fcedd49c8e5638198088eef5ffbab30549de45a3339bd9bb2b4614338432f16a0354ef92b4f50380dcb5076842511983257c74222b17c1e673077c7ce05f2d3b3ae4573a249f7dcb9cc81757a5dac88e97b3d5453b6c5e2e088f25c94d803a97000e90d150820c4fae1b0e3ed23315a475b44c84016f4e53ba434a9c55361934ed83221fc6e934b9a1bedfe4cb3c4cad8731b434e2de259d00a1442c0018334a1babcfa852e709e276ba230550078e8ef0ef00b4375c0ef09c2fd0cd4e75af81b144c2ee1d350f187e95b00699677bcde0e70ef3cf4af42026d33d6b9b58ab3ffdc21d958bce85004feb339a4bd7fea2f180273990b643cec187908abe4388ee9711e941c88509f123a5d8895784c8d829ee1014896d7fec294cd1c590fbf811f373e6488c2f90394d70eea1e657bb93f5b9c71ff453618fc3e4d73f21271a5fefe35d466564cb40a82037ca442c92f480389f18468eba0f5ec7fcfa77aab90300e134287c5afccf3006cf1441bb9e0f8efc9e4b9907ffd4eccb17cb1558292a8eaff2eb8dac0902b4ce5ffd34fb1fcfda654a3ab255692f7c5cf3d3c77ad80c584370b0da9bea3c08fefaeb22e8811bcab2771fcaeb72e35496fe0f8c96b490b6975133a0f62f7f867bc2a9104014d8fad285a1d400caa1e749a46ac27ad0d4e6e502922260cb17d0b0d90d9b1d6c43c4d8f0ebbad6b73059cba7e835965bfa2239911e595733d8d27d967b1983a8b870f2423d3f5cd33d6b8f4edf770bd1045961a97d49f383b387a9b099b72a75aa2512f42ee3c389e9d203457e4d6cf48f58ec29c7bdd9775ecc8792e7d201b330a1553515cb678c6aa78b10c5554c8e09f50fbb57cc312efa56682948212ca60e0100dbd71ab5c4b0049a9a048fa615ae9529df5f83180c76b4caf403b5eb38d9ad1ef31340f7f413aa56219757b2913ba48768f55a1b40a836de7d577ddb95966e16ea59db2ed3a3a84475340450b180272cefc5951dfbf6a3af87f48ee2215ed22edbc2ec2e1e8314c2af63b7ee66a200f4555a35f73810a8149ed6a66fb0d2ffaadae32d5f013c74b0dcf09e0d054dbb982d9e6d8ce55ce9bea70aea4b3fac4230ae74ef7090b0b1e713ffdab6b16152217a8b0cd7c46013f6d9e753b7d64976960fcf756548308d5264a1653ccc2686b0b8e305341492de8524786c7d5bc20dcd43877b86df116ce6c86a131b6260f77a22c6c89225df46b88705a116922eb1ea3342b610a3a972dd77aacac3df86791815c0abb2c460017d44a431e3c01eb32b24df5b5589132841e67fba6a682220424d887429efd526bb0470bbfce43003a098cc600f1364f08bb9986135059f4430beeb673848691e66527f8e90ae97462449cd5056535d3eca8b56ab1e1536d85aca3217bfa93cd4a5ccf4bdab44a46c1c0c07add208b8dcce7b774b58e60b5534c94b64605a6dc4a704478e4ab8035d9d87d2dbc8b24bef6aa426f6522a01648630314345903fd0b282a453e3506caa5bdb7a92cd29b46e55fb0668891b84eae356194af624fa17ef5aca97c7a05cce3e2c5a376d564325f01d5c542c68a2f123ff302cf0cdcd962d2841c83d16714d02061e814a39fc02f3efbe98a723f22434eeb8d64cf2b35be10e6068b99dfaf18f6b23ae346a10a717693e0499e8958959188c3993960843a8a935c2052f3e70af722300fbe094f2526f044de6959e8cf34057b3ba62ba2710e30734ab0fe15b107ac34335174969db4a15d3003d20726d001d7563fd03aa92c5d36b674f8ac38e9e3888b26bcfc135fc14fca1cf87e85d83578ee075b3f74400cba76300240dcd064c45c034329257a5c8b3d6942428cc40babcd40d7e19e2e1defeac3f44ee08d4f014bcbea2189a9c5d988f1ffc84c15a6367d520e7717d3652c104add8394cf40983c50346f49324955ae6103a06ae06e7a9a230544186d01bc9fa46c288960d0093d5f0a4c1e572bc702511a4b258baf41abb6316a07af894b3a7fc21be450d0bbcbf82348d88f9edfa7c4f61cb28c3fb1b1145da2aad0fd6501bb1ff3bf1cb6a212a2b7c93422101a1161d11f58377a98df95c663296033dceef1981261c2db22cb5d8ba0a8d8ea689ce47a54ae017715a2ef14fa04ee7e9763d264c07c6a5bca45cb1ab09a03982001c8820c3698a9dd2ea758c6ed640e52cdd3fad583548b06701cc2c27c27ba70041a72b9e1417fa6718d2ee28639769918fc3702a91ba9594063434e3543ea7662aee4da74e2d74707ff82fdb80530638b5907939583e61be25df1a643b96046c67d3c31f120c22c2dbb110765b8c9c0e73d4edc5f8478d4f261ab9a6f876c7f82990af5383d8d2cdf8658ee547299bc3a159e20dd9d5a98b52fa66ed10a4678b78c35527e788f1ee9b4514cb97d8be3d47111f0035e399d2c79f28382b63906c9dc3ce70289977beb6ae7ddeb6cfe41c2e7fbb74b9040be26aed3e63c4f5b2b690af02f07324b0ed141b55a48999ecfac154833b5be0f42c66c3d198fc9c2030065134620294f6302d988c2a3a71feeb425d118461cdda331df5161fda6686877531e8b379bdd387739cebf49f318b6176be894f9a1d81d071b3603d6519e00843803d5e4c87d3018b899a9d643d4a907aff996d378bbc6c15c2302397e71a39a9158adb08fc21af4f46526574e1301d4e9c8302a40e3a8e5f51d16dd3cdea72db4ad8304b341a69349bbebe874f5286364674ca733945067e3a0f915ae2be71e8fa9ba9465620a8d732ccafdcdc3109b01c5ce331a0da6a0619c826109e2931e8e149c912c157b14c48c89777bde4705c8bfde3903ea09719a1e7c1ac9a9188a898fea0ec67bc33aa8ea4350a2f37294bbeefd726e28098219c316a4f8c100b4d1e38aaec22aa88e7be72ee5d4d42ba49cb516aa15cc6737143883a9855e81c0f273ef7b615a6e585669a1782f696481e1553f0c62a456bd1df6e1a47c1f18a4a05300ac4c4c50784ad50dbc865502626844416e0ae78351ba8c963b6a85fe017947814035d0c339021b25c0d4dcac8321e0dc26608c62b210f6a11a6c568cbb22545623cc5c47258d320a51eaae2fadb402b3b5f4f4f382c1c83750a37ff377c696039266cb20151fd514643b6792cc2ae5085fe459f623a92a2d3b4d5ce79a39e1b8a56cb8f21d4addd4bfc3b745a9a82c9fd16ca90c8d670afae453a26f1fa73f9026913128d9afbe511fe794e03a99ac2bc15eea954204e6a7f1105316e1be0afa38d80cad3f8e4cc349017489085878056ba1afce6a1e85d4b41d9c2aa16030b4e08388d0ba460f5f203914fa0dcc7c70d7a49532f6c9148dc173b273b60c517c083bfa89020a0a11bec186d187c6260d67e2b9815c5fbd14a190ac4647b528d8521a9251f571dc2ba5c236e96b67768ce198bad64c296864814d1817d600a081e015326706dd80cf2541ffc163e6c62672be343a49a901637cdc35d886a9fe212800a3d00315bb1cffcda306581d8b961a286ca69bfa46ef1c08981b419a81c1208ce286a8c595d083ac055a4dec3cdf10339fbc1822616d5485d50a9df3cc11e8efb55e1b6eadac6635f52f02021a87a0a2c6164b10ff8414454eacdaf6b2d12d0466104252687b8e4e56a07ab6b5c65a56b05b2c9696b93b98f1e5b8ef191c00e13499eacb706aeec8f3596e28994368c247240883149ca288dedc3957510e0944261736290e8df659cc9d86f98ff601d6c2cc6389b876c12275b9e0e578dbd847a956e9449b953fa9e80b2eba9fc11bca0ab1bb6c816a851e856b29ffca5945c472bf13d2c27d405da7fbd875ed327c6402da75b2276962ff686d511a98a833972b80cc1e37c257b6f158c592b5412000332995490cd97de1ff6ac90ef3c4d08eb3fb9e8a5901f0d03806d74ea8bfe0b4e67f72c18e54fae44ff1aed41583ca116c4c241953a44f7ea8b516eacae4c3f1b0e526f088713b9cea6611e3c9a066136fa32b42aeb1bae6e1f4e12b8b261d913c3fb23c2f1aa4ce8bc849e1ed82ad618e75e43e95efff0c27addf9198541d1e82a3189a14ff3914a814798e747e23682797604727a95574415702b57153c32351a9c0a7e909b60558e81a44527f9271252a0d6908bb97c7e3548f9c8a16fdd1f80efac5c258099a28bc2fff28706bc7adfd69b360e59bb13004098042041c0814c664e38f506870ca9fe379149f37e186947938df492dc453e03296cc527f3ae5d2bf25ffe6321af98bc3d40090ec2e656032523d3ea87bc17a6ce3a196ad0afa2d46a9ae47e34fe134516ed8e80fe7fa32fdeb0d827ea1918b0679bc690ff0167f590a6cba4e9b50e22a37a32ceec7bcb2011b86a368903a0cebb0d50cfcb929f301f1107abb2e0e26cc334d0b8a1c487f18c8acf0186aba1c07aae1f35f724f9d78da4471ba968b3a999da47923f56405087cb3e7f7c45aae154b8f5138cf9d8d16f93dc7970cb020f88d8233e47e42a8653cd87c8f56b1f6f8c87908851c2382fce229fb3be3d02f826581ae5ccf9178b6c0d64505b2988aaf7c8106b138138dfb3459f6042e731f751a7f1048e42421d22e1c14b5373ff71b126e6766ee7795a04adefee96604f11ba69d030417999e530c58c275fc2f40d60f2eaca21cae748022d1772c84784f1f66612571c5ec07588c62e58f892144ce83ef9e3671ee1888c23e71cb2fc63d2622e2ebb71ca6d86ecc5fc32f2ced0116851eb310c1675da99526268690d746118502e0f5aa70ac923384da3bf06d6387c78149dba7567749e94126db0a1963c1b5d17b6071551e39845a8a9bdc5d6904d05842bb0cf8758d93c48df983b1c44d5a253a15182e00e26e44ee8551167acc42440e51512bc448c0673310dcf865ef8c123d853c270009772c0478dffc4e612571c1fc45fcf0a53044f7bfec9141a44b717c53ba45c8ff1805ba17385e00f92604e69d51a25bc8f30214ee23e07e46327d450c3f60e9772c04395fe34172710731fbc020d355ccb901497710f23f8692fe02c70740be0d817f334af429f09c0024dcb110daf937b2560f2974b00a76381276bd881b16029ecfa1e9c8b8e62ccaac7a28fe8259ee01042f1e06ed96224c3f7ffa44f161f59fa15d63cf48612424c7f236d4dc55196a2626d0f72bc549659de3eee95b006068abe2fabf7a22126f5f4994888509f5ae20f85b72a97da33662feb06f54db4d88873cd94d219627654d0fa97d5798c33648bdd3cba6862655a5699dfe7a78757f9b47993bc689e0ef2eba49793707533c7d7075cb42c4155033dc331c2251e2a754dbdd893ad77a6aad70a8047d2dd1e21e18ba8a81c92189d0b791adb27ddd3598d274205dfd51312b381d6e64c6e98650db5a6592ed012493cc053fb68d83d2082f71aab8ed0a7694dde5ec47d61814d6763929d72e4768f025efc2aa9a71dfd2014e765f8abddcec7cb2f3d22d0fc50df19b305d4c1aaa4197bcabed1ad4fe09e8838c1d0a8722aee06f8683a0f60fea22c06445938c625b754c0a8a837a213f79f22bdc257870f0c45d14516ae09e9a3238fe6aff4ccbf07e532f6df9dde72e903675ab14de4625201b9a597e3d6068de27685a316d029c2dcc2352f4fac03a241ceb6435f6d33243c958d587fd5d12fb439688e1e17d0a5ba830e1b061e79bebd4c6c53b70151bb7e20136436214fcf455b3f97899bb8d3355cb65e7ca651154ffe617229757acb8967e8b964896cea0faced33895f2d610105e365979fc9ee7a93ca77e67310bea21d4e7e6644ea7d536eb0e63496076984daebf1063723a6f022961711727e81c4e87613dd597728ce27c16f6c298c908fa4b2cd00c18dbd45d37c87930683ca5c57035af50519308db3897fef4bcdef89f60e71bc04151e0b4bf73847c21e0d9d15157145c889f39b13d1a93cb7672013f2b13880406e2fca75e0ffec90eff897b2c81a405f2cc408a31f3af8a1fbf5dcc1b2ad2d8d8f393b8f0dda3d8fbabfe9cc74e39a822acccbc846a8f3cf339dda8563baef1a5c21c03cfed2914ba7324ec607fa2c790e468b65840a921034c714bcbf636cf89f8204f035fbab22f1334097052e72d8844c410b08fbd0406037daf2b8791724c7f5419ed67d773a88ebc6893e7d9d49d5ecd03f95923a426720b49b5264cca0ca0a0f20abde4e597f2384776ded52b66357013d0fe632da74913ed9c4c080b06825903fb3210b74460524aad9ac6bc9eb06422e868a041731bea4e202475619e838e7968d5bd5ca08a059bacc093aba3b30a8bf01f9db1c0b30eee0cadc81d4aad9300a86a2faa26a5881a9df27835e47d65da488afff7255ee3689824ab1f8ceceab64033f53a5fdb75d9248e971c7740d9e4c1d339c2cada22352649ad26c802cc0bf1dcc6ac6a7fb5ae34a694717fd569ab1b5ee22d91dcd7377a628031539680fb0a4bb101dffdafab53e09edd7d0228eac64c40c1bb985d3a55a69b04df8bde711477f24812381b6356eeaf72d1637c7dbbdd36988da2581660f54e078fd419c0907941d05485d61f41a4d90692d8aa50aad90a244922e019a3f1b224d0ba7007f1569629a5dbeda2184fe9a776c7915cd748bfebcb815a1d76c9ecf144c3c7411da85c09b14d2c573da608c05ba89c107d7f00c75ac15b61f4a1025643a63c9a771fdb644cd043f9f01a41b6d285e9e09178b6f40f126a8139cb91b618276ad15a1b59d400c8d3eda2ec1f2819c5c7d0f67a62584563b7be750fe92999102121a0af334eed76e475ef298651f32323afeac30fbd42ef2465eb5ba2de8444b0ed5e844bc9f95a3fb899f1c51c8ebd99c851eb105ab29ae3f6cc2277513675bc78a319b8cec9ae17f80bbd3215da7072216fb7684df71eff3e66297d2bfadfc27c21d6cd9a2f8d8f8fa4306479240c075502beb73beb3bae1405ca8dcc11973ca4a567222079a78d2059e7ad5d176eeff021e54d262f9ef7f6aa0598edea61d715bfdb92088f3d17dc0e52a1ff9e2ad140da1c37f6f8f42d7f0536bef62a8a16d9e20ef3f7c595bd0ea8c89633b8e1a915ae04051a15b89801089393d734831e3e701db50716ccb82da364596d9cc004b86296feb820fb7f01b17a48f7e720fde14eb24483f3b1224a097cbaa7fd6ff42086e917b08966f77a7ddd835b36771f8b631fcdee11523c099f54613057f52c5151a8d1d00599e458653dea6f6609420298cea254fbc0355410e076e34ffa862ec5441bf65a642c39a80c0f3898fb976cdc4132e57e1de81a285c756f6d0810b8fa5d32b01ae9f0cbb8f584b2b898bb5a246c173e70808d11bc210f335552f123511a4fd32b8198308b3e981c70b98b050a093c009fedfcd155442e2cab646b621604e738c8fad41d772e5a36532d1683ec5c2431721546cae7307922f0d7a692cb12502cf13c66e080e95960f54907707a5b42b769d3a4e83a985e47c20b5a8d294687b0bef1e135436d3c2560d2a321ecf9906282156658291a8369038cd453a093ae8f347cbfdd2f3d9638702b23874d4c585c3568ffb90d7018757ef8063c62b00b4aec0707dfc294f2fbb41ffbdfbf7dc1fe7815c61f806d934968d6630ca3b702f25d22c276f3bf3eca8e76df586917c5b239df4cb6b0b5024e6fd2840e80c90167c233f958cdd61275dbd24ca0ac69db642a7150ab6b33acb6f058de231715d5a4ba53baf431abffe9d3f6e17f44dc4c7ad4a9b87cc827c41d81a4f70eb04ff7a51a02bc43053e0fc4b60c55202015a903096578139d869b0cdf71b7b48a701ed5ff30ef6dd2701843d345dd1e8bc5c781425ddfe36e202611550554c09fc6b1534afcd8e1d8911345d01917fe08a5520f5a90519821ac257b9790bdf79629c914820cca0c9c0cf4b2e85346f390d35e47a6b5408b4bed8f1617c59e781fce3773d77f38ee02692048bbfd23d378338e5635fa79cb277128184715b59a03ea3f9c49ab9348cf59a7e13f1c977e1a8c7fe987e3d2d5f799d7dc5ddfff87037a4dc973628a6cf0944dfefca480c912d4aa0593d077d881df31da13891c0dfd99734efba1baa7f53b1044a9beff3eac2a1b3daf5755ddcf5b24f4a0fbc4993978d3303eca5d2866b58be69266fd80612c510d3335899a3f287735457d7de379c8480a6c1d5d35d9dd9cf427ad285f823fff0d782e4b7183da14bf9f0f633475cb8707b2fb6abee86e97f9a27f927c78f588102e891d3cc8d9dc0bf57d95bbc597493feb0c67a3eb3831c78d22fe245b0465512af605b7a6105c44ed8167ac3efcd09fd8b26fb9ba1d7a3f923c3bfa18ef3ec68398a1847a643ed8de64ee4e2b84bb9d3575ffb4a371bec99b8132c6496df9bdda96a85ac71a3a95006dccbb1ad903b99b3b6373c854d2b626bb7b9a6caefcaa550f6952b5b236faae28ca4de3d88446dad5a2318f089aac28bbade462b77d49b782b8cd0d895dee3971a2883569d324acc97f96e7666161b9dd6ef2737d287fd4e71f859aefb49d269b27a7490e0d19b92fbf92d2e84f497f4a0a54d21b0de27c5abadb6334a7a433e65434674d7f6acb4f65bfbedb9af57de30a5b8ea8168fb98dc596ff2b5ba23e4b6db3b8f0b9e76dfa57016b9b8ef5906ea946cff7a6a1a8fed3a4ad499f261ba5faf95c48611ca5758b5d3a3c319b282ecaa5b2db744673a84f9fdb9f92838305dda44007660305911c19e4dcd4e527d441264aad78fbf69f777897203dae0f7faeae9ed6b2470e96ff3e7ccea953a7fe59165bf6e8f1be6af9985ecd70269477ff9afa15a95ffdb4aaef5ff5bdeab338f8faaf6a49ff64002dffb570cf3dbfe9a998a3e5ddfa68f9cffaa8331c676993f6b9fec9bbd492de7f1775a0e4a8969bb4b65479ffdfc1d226df962a3fc523567cea593c62a656a456a4668a7fa6f8fde78a542a35532a5bce9b7a7e9a7a9507515588cf264db6ccfcdb0c7a6a837a956f4a51de13f5290ee5555685f22ad5731cdb9224e698afe270a53eccbfda5ff1cc2ef07f5551acfa14d662573645c8bc6c7d70affa1675a0bc4af520e85eaa1e0335ce2012c6afaae7b85a3a7155cfe26767b8abfaf2e75d4191dd931ef7e43de684cc1bfe283f6bd9e3ceffea307acc2d4f7e86bb281705e563fae46745f99028836269acc9fe9346324a612cdd16924ab7dd26d37236b771cf3e6f6e7bb1ba4c66775b58fd8839dfff865b2042d8e85c0afb9a2b32c258d2695539f8b9e7afb9fd42a62a890f5927740861a373fddd167122648ff81fe123de1fd3dce5ea124b703f5f95a32f3f5f216c746e5b958ecbb6bcc117c82f21848dce9d564592b2eb0f43863a5cb7456030f043ef8410363a2f18f82acfd2cc970a019e6755dff3cb4340e841ab42c07c813f5fa0a53962007e7de06142d8e8bc4256a5e375645a150c0c183189908c988f69500a389cb563c711158f2597012f157d7e85e6ad87123f3c8168808ab1a4307ae3ae79731bb3fa6ff46bb7dd2ec2d83e9ec3fee33666a73559ebfed6b75114840983d90ca130b7d11b0aa33634e636b739cd73dc87bbb9bc434dca09e782e801bfb033b94b9504f7a20a01e2736bd5fce4d82e164972543f67cd17ebe7acd0870f8a7e8437b42e2eab5593de7b197af0455f2782c318b2e3a5933ae904bbfd44881809dd61fc22a2896a46c23b45b4397d8a6244b40ff0cb4bebc4f08ce93011ad5b3921a011640ebb108742cbc40cf5b136ee74ab7317f7a598b33e258e48cfee4a89b96b34f2a56c6942a9906ce972cb7136ce5266a3cd614f61366339ca11fd419fed80149a6c9eac07330f0ab74d364fe6ed783b1e126fc7d37198db78483ce6b0f674bc1dd1eb19f9f01a59d7e8c37558b75ab4e42d1d9662c9937903faa9b9d7d32d66c29124943c25de17d6d09d40849f155aa8e3042230b939a108313a4252f3518e174e51c6d63eb8bd0526db09d1eb882a7c5e72474f7d76615e70cfc16d27629a1191b9c9646bd2f4539a3c22dd6a8fa2c9f6664d45d6654e846634d94cb426c57e4f94113d59b74aa7cdfee4dd961e0f109fd83f350c35065d77ebbe73bbe6e550b02d3da7e635aaa3a8122ded163f81084a6ea360bcd304c9ed5b7aec86085fb8a5cf6eeb10210eb7f41cbfb92d527fb75f1ac6119226b9767b5e0f306d66661ed14a3177a520f1661eea945a4aadbfe693995380448f3d7618911675284426737ecf5fd735b36a876abee86b5e7c0d50f3e2bee6c559d5b44c24c1bdc8d28ccfbd01f825fa77567fcd58c78a729697735b877bceaa102082a910305f273f5f27cfbdc81e59825f54186d29a7ef141e1d67a5a4d44a8f32fee94dcfbd4dca8b5ee57ffa9ad758c7f1fdc793a549b15ea331597616f7352f5054b94aaafcc7af79d1b8177d12dc8bde5f64698eb84d42f4a3a58179cc65b09788ff06dfd28945094a897d74ec50a1ff52c6594fccf3723c9927f36464086804dff3786e7f929d26fb91dc1e756e1d6b4d76b02bbad341c02f2f7a157e8c02bb434627e2e9906c4bb0ee73db751e8a321d12fcee827d4f33d26ef1d3573f183edb114e8a125501e6cbf9f28c29b6949e26c7596836ce663111f7fc6ae203dc8f4f335a1502444dbc68b81f4737fce2ec28e6ac598fa860607048a41f8bf463917eccd59a57d7e4369326c39425b73d52ca0f083cc03478bef38ce91e7010f04bbf5b87f14bbb4db708f98a5f7c76985784d1fb124a90b34c3667f59b6ca30df56f236da69969669a9966a69969669a7dd0371a45541714f48d4611d57988e72b7de388f252c8ab8da5c3ca124e8d47e13376d86761decc5d35af7e8fd6adc9c333a6e9969e6c04735683b61cd182de93d980ab4703af9e2cd6a488c60d61645187a7759b5a43464a8fbb1cc62c778d3366f5f70eeb0f94713fcebeb17f44344f4671dcc6630ee3c6597729987d5f8a683093ad4b01bb52389e41bb177434b8dde5a0961273574a4fb3fabfd1536229b12bfe5c9dea2f70862956e0942966ca173805a85da29fc59cc53a630f78e7f6fb114621dcfe142a94d085722c42167804c2ad02cf1879c02f3d93c66864bee867c218908c295af87ed66f9c75ebb3f3bb92df7b7ef97ac6f2ab7944bc9927fb625ecd9db449b726db38bb2da2793210c759a5c926a2cd904e6e37cdfa4db66e95a69969663262f2e1e74b99992b77fd04f36a386f013d5fce5a0aaa781718e08fcf2ea5df98e0d496750c2b03043f429af19b1f7e183ebbcf9fe91b9ab1f9826dc87e3531fe2f1818b7a787ef1fd60e6ab2b98a5008dce6998cb316d441ee9a61183e577ed20ecf6802cf087d7f080863d9389fbb50801c8884c3a320251c21c965252401c9b59795900417dcafffc458ceda0d3119798a32b309fcd2a202501efc904500cd2c03ed353ef82a6eb2bf256337ced72f068d2139c821f65f4321765638bb1f5526a8f80c3e681bc76788c918ea9a6c77777777f7c7199bec194514ccfd43717be254d141dd4de7797e63de0e0a9961d6ba0aaf839c993bdb411de4b02a460772206762f2db4cc9c065ce7cb70c99c6f8e5bce34f5b7eef91407ac1e91ded51ed3bf2482723eee4e4519ef463656266bce3830f7ea4b01bf1c928e4bba1651eabb3ab1bfc51e5ae08fe1481a09d9de813e57071a1b7abccb1cbebc8386a03c8408caf7f99de34fe68df7ec8ab35a9d331fabd828da4756cd79aec2f3d9d6999a0d76d88c958c2f4ed64de8f8eac86436faef7ec2e6f7a61498d5cef29cd5d36dceb78ef69ad5ba8f7523c95f74ede539e6e0df11e4d72bda73ddd2a7d8d2fa992eb3db5752b7ccf07a89b3f659dac9180e0e6d528b825cded76ac538341a263a49bd09a18d2b36e62246712b1a167f0e3fa837ba66cce76d0af7c87105f45b43a6a74c8432126c9985c255f883d06884ea97c3b99bb3cb07b0e64155b1b7dd9bb493769974863251c61c9edee66d23cb77d7aa8a33ef12f1d53479db38ed12fd62923d2318ce4746da7729343f4d7a861bfa800f3e53618cb4e76eb766e0761146d497e312332223f51dccc1da0263c6e877cb0b609aae2e6830a4d26e40a45bf24b92f5fc7972897113f87f8f92b3f4b2fc47b3577196141980e7b6267a5441cfa59817e40f04b3a44ca1560a4d08417e2cec903b3bcda28d68e016dc94fe3197c1bf48296f2cb248932a11aa6e792bba6ba0403dd1a2f32d51a40af232b366c5234aa9c449f1a89365e5f7afb25547d7d4a2d655caf666bf903e6ae1ee6d6ba25c4cb2e0173e783a329c4ac4d98d791959d3a4d8ede9635f7bfc98f6e72eb933e04d4ad2198748b885bb76834e9961041a12aba5503d6ad189b58b7c2ef170de996ccb70fdf2f82a25b38ddb2df2f8aa25b01f8a639ab1fe5a2884adf2d8db784baa59ff19a50d724e3c69730383e3f2c86c84f4ce21b51df3b15e3d8cd9f27616084cabf323ac6367f66cd9bf38787ad61de5e7806908118737e76dc8034b9fd33314528a9e27b7689d1ef551c1de30624a6086f3109ef1b9d45c5f88152f06064ec68b65dbec1b8e6947cb79c30948d070b7c6e3f03be70b5c49bb4ae47c7e019edb639e97c79cf637497f749f08c86d1ae0430abff0bed82d12e7ed5d8b99c84475706e671843e382d039ac5d9eb6d612c27eccee725d77930cb5d53c6b6e993f65d61d62a49b276fb5bcc8c349259d37ae6d2b36e1901696d234d764fdb334ad97baf1e5b327cbea08c914793316d4493383a4e097eb0ab4198b9ef6a106666a63f99693562368d34ab5f9482b124bb3b02d308c324b410fa07b37bc0bd036e8950a4a6a81fc9699b8da81105eb5993ad33964eeb5ab7463603dcf5c13fe9f798e1ae55cd2f225ad5ab4517c6b267cf60cd5de49c31abedec193967fcd3bb75c02fedb486cdd96cd220e70b1df4f374171a139cd6a116c2edfffa080d6b20dc6e1ef0cba4d1481a16843b67fe3da31cbf0bcfe0ab9ab31cdf9d0f3a0a0cc6ef6301ecf6879c4ecb508de2794bf2e54c86c12763932a4ec5591b7d399c8e82af2b8546c4d63a9da4671ccf1c7e432b184ba775142d6b1c87cd1a52c1587e97f31a8713c1abe63ab763ce6aee1a763be6aecffb1aa7c99679146f184b6e8633c1f9b4f66b8a327e2be7736e7dcc77d008e37cae9f7d053cc2387fbe98635aca1969b2fc6ecb9c7503233a9777682e6c0114403d315caa22dcf3f7ea9f5ce5fabda008303d5fe00145121c46f878e7dd2cfdb9ff415e1c46eca03fc8ebb448f71e8e4d76e330a20819353eb2fb69048e378c94e72a8199edf23761a0a168d7d465817f62a03072fb8b007f850251b725a0448f10a024a0447712606656a2499d1e126020282c61724bfe4179ad8f06733f01260d3a5fb4ba1b4ce31bc06cb1a83f66d20805c0ad49639c2f668ff9a23f86eb397f044010e30afe0b8349ee81c5eddfe1b6f00b0f3f2b68ac58d132a3a58525002c2c2b19ab95caa552adb4565652315229140c144a250815951310a7530a0052524c302653e945a984e20205e5e4e5e4646c318ea41f48a4118bd148648962488621e803088a7a1089423c84429fcbf7793b785e67bb8eabb79fe7a3e80a9ee1eeb7512ceeee7c1b8101b4398272faaffa4faf2b9f4281290b82e07f7cddcb9a0f84b95e4195ffacdd09744bcf75e6dc18f72a0451a6b3df17ca7c7f42a9dc245b194dce5019d7ed2ce7974a25b08604140208d6992304b054621e61d4bb52e7a72adf5a0d04eb14c27ce1df730ddfebc79dff9cdd0e10781d627a94020a9bdb4f412f89441b2073e949203fa96467fa7e09be5b9452c99630d77db43e4a2fbedb12c596a09de93bed15df49b384712729a5a4a3f4e2977332f85cde12e69660dc9205ed148948801fdf4f08b3d6adefc54a3aa9a95fa9454c8faa25ea25b713c92d510ffe7c945729bdafbcf82c2271522a674d7cdaaed38b1665e54bf145bb627d94be84b9e011e04f6b45ab4279d2f31139fca7ff047fe64c1af341ab7ad28f2ff2315ffc908804937e0534c258a2be84295576855ed2a750b684b9e1ef03f4dc4924a00bcecacd5b2a954aa5471149767ea9ce9cf942fc1857a9fc2975f4a76afa719c25ff419ae397fc51be9ce9b2f42ca6581d28f349a4177fbe58fa32a51cbfa4a64a9b35b2658a75f146e97da0d8b254e2671906e77566eed24b2a5def3fc2f9e5bb8bf94f7efc9245e2e479d66e29fea896355d7af69ffe5cb99aec088eb354b22a1de097fe06f8255bfa9a3b6b49f9497ff2283577a6ef899d42982fc41f49b56c7145f1633c7cb1f2ac5d3a86913e68cbd1fbafef7caf327ba79a9669b3c86fb20a23b53fdd5bb1031898dbed8751e3f677ac4381f80c453d6d2cbfd5d35a84fbb05d1c8c66b1d5410523215b9826fbb9108c3a93c2605c810f5313fd11366ad5238e26291a461a0390618ca2d0b34b59694d10699e53c6d8df3eede3eeeeee3d29a594524aa7ad41e0dfb39e731603e221d144a926a9209bba35996ae2f4e79368a45a93241a29875473b0c8589ec0d3ad5ba32f32962ab018a9b602dbb9fda49c6ed1bb62434272dba74aeccbe6f1b6a9e038ab7d2ef84bb40f29c743ed73bd498b7ced23f29e73a482435562dd2abd9e29de701b523a8e489454776e99ba5d2fb42a317d023a01a978ed7341afdd2a3077ad72564862b7596796245ae922d19015cf2a49cf1dbf24d152a95bea16aa3b77544bafe7867bb5eb633d0575abacb353936e8d6c4999f4109f55d1fe13d049453fa74952ad49b261dd2abda0dba9262b36258916d42dd2ed27d148390dd2198c25cced50f83260b82843ffab309a05d3a40a8e57eb96e8e77b48eeb43fbc07bd867609afc71fa65bd492722e89464addc22f49a926a95b2a2875f3ef679df12b333df438ee3a8116e7b61724fa1390bb546027a0216349a28d7eac24124d05e6ae142c753342eda66e6318cbd4adbb03774e26c12b3ee8e1fb25bb755b904df684d12d18199fa8c8f722f1f396f07abc6e926c81eafea66e3c7317899652d15199b580c82d533712add23aff610dfdd3ad92754acec6d95610c5ede77c809854c12de15c38daed1cd9bde1a088c1713396acc3841b7269123a844912233ec487fbe16c74760b47939c8db37111931bd22deec65ddd7796f36956733a1c8d9b959c8c5bc231e19a54d17536dc0d21c296b335d9b3fbd6401c19c6f99c8dc3b91c4764c6d9b81bce87fbb14dcb4caaa6cd09ae86b6981323576073fb4312f7ec1272f5b3c138b9c09da495dce6d1991fca9d3ebd696a2466c9ed2f6234b97012eebb8f11432766d23b6360c8ee1e0f03c8408cb76e95a89d1d492ce926244abbfd23a9f2e8183cc38677453f658c356260c034d9dcc265d5643f1010936e71149ea8a20ab21647810449bac76d3c76dba318d9672fe9da925672ba65fbc8be96896ccbc2308a3e7c239a6c1c5fc4e3b4d7d073bb4aeeb9e971d7386d40b7a0fe76710fb9cd21eb412a300d3fea1a7f0f773510b350b68146618d6e75ef227dc93b2d6e3fc976cd7eee5e67e8158dc49abb1a08d564272186fdc3404c6e4d82dae636d08e1245cbf94da45b25cd9ddf2d5b519ad827363041cf65298620b92e2e4b6102d9e5671767400f1e4dae7830806d3ca6f7f03469c4c793a427383f5005e3f7598069d4a8004f60d28881c07c00d32882c7a481430135d2c040a19f913ee8a10f81c263dd8a8533ac3169f8b7f3cc176ed57079c7a3c03c960d491e00da9ec570861d5c8630dc28f00c07f00bcfa4c180f9820953a164851cd8666b15c878f4ebc68a152d7168696181030bcb2a68b552bd41a55a71c3ca4aaa0da914aa090aa5c2061595d31a4ea71435a4a4986e2653290da5120a1a50504ece707232321947921948a451194623910ca218028521380610148941240a51110a7d4bbecf0b83e77560e8badb3c7ad207f00ce7e180f6e7d180e6c100b763124625dcf5f17c7d7d44e90ca7490ea4679712fcb91dd33d77764b2afbfcac3f9cc63d286374ef5bf774d9b79e497be79b0be9ff2e4d6a5a7ed799e84b33f608890f06bbdd7fdf620e52fdaa100f000c19d7fd9ff677737e384dca9aa4f365327332412f677f38ed525629b94b3124c9a5efb425b26b9fb62176037079870ad8e55912bb405ce609c3152e68c3b9dd62295410c5bbc0f888dc66f1068c3b6d5a5c2fc11fae3f8b6980347e51af97a9ebfe21767d386ecb1fef7524fb59079fbf88673fd146973eace5f803c67519b74554fefc2a5595bf5581772c0042aa85d7eaca7fb66c71bf49afd3789c75f3e18c3207ba01c1803c167356cf671b7fbc793e1c6735ce2843cd9ec6cd6e41b0194f0f8f8de787078802d1806a3a148827e6acd8c489c97ce6acdb379bb072c6d867e45ee5789cd5af049564f4188c1aae97d097a61fbe5cb5f8d2e57a8b1e5e2a48fba1b2fbcc799cc76603e26c0ec4d91c28e62e2e28168bddf70fe79fe4ca0f87870e07678633c399f1b8ababd5786a3cb5ce66a340360a64ebe762eeea823c1caf1614eb826238338f9ba1501e177397c743f37f146a1c63df378eaaf0537de82b411a12f6a9aa87244a7aa8397af8d18baa8af5a21fe934d9229e204709ba1c4e77b5ef1bc712753bdbe9bf6f1c4fb6ef1b470fe7723310a4f17cdf38a25036146a1c9bb37ddf38a250ff240973e7cbb8f3bf2882b81d3e880bdae177d8e157dfc3b3aa0ed18f5890af62616df465f1acafd1ad77d1b9a9db1f836389166e12437c5c20ac45b79867090e0b1659752cd9f1c1874a7b60f9f145d5079096ff5ff1dc1746d27f384d626174f992ebc248bf24fdea3d51a6e5b99f98c8a799344f9324b0069e61fc46a391fd6aea1df53cd4528668c9fd2ace0f039566b7fc702650d9b16b55be7e55e958f12d5665fa79f9b254958ef1e74febc3ad6ab4aa2a7fd1cfabaae1833f2f088622d169ea576c493f6555dd93be7b54557d4ffaef55aaea0353ea124efba26812a749d9fdd33beda6bc48bef7e0fa29e553ec124ebbfe31ed01dd7dcb0ba092756cb2fb57edfeba30cb67678a9d2eec6ae959d418222a088010316ff72cba27bb0f8259dd0761cb8fb4e5c8c2beecb77863be8bfadd0a88047ccbc27efc025af039d206996010f0e7734fa3223d4dcd4bf44d887ebe3c0ea4df2f52d5419f653140c49d229148f4d316118944a0874454d10f515dbc1095f4352aeb6954f26b5eb3b90bb4d960886c36182cac8267b098f1cc34c09cf9a24bd4ff8736a001d3607d7fa8a45b41f00c12f9b46eb9f81d1a46c7e85608a602a002512bebc5533067d208c19d33c05a006a325cb605da62d876f8202a3719c2800865dd0259008079413f0e9435f9ac77316397249d080aba20a50f12296b2ed3ff78c68f7903ce583c08ca98657dd067f1dc73fd316f2e8bfb925a1fac6796916eb1b04b583742298dc5ff9837979fa33466316fe8b30f7efafc94c5531694328b6761cb79a9b5c08c5df06b2e7f101facf7a72417acca17fc011ae916db25e6cd95f92c4594e15cd4cfd6a4cf49f4277136c13444367ed13f9e01d58606b02b94b5e69ccf009ef1f23df0e0f2955d944663d10010803bb9c0ac36b50bb439abff07a7f143abc54ff2e4c70751aa10cf8dc8f8cc671c1294f1434179153107caa3bc5416a1ecfbb89a8f230af54ff2d083ebbaa84cd255f992746d96bbbd5128140af5e00c5b54f07fa81cc80576d99c59f0923b9f233df71f1053717fbac573409de103faf8653e693e172243315bb24e8866fb6da89e91270603d5629c21dafd9e9d35ed676bb2dd7e3fa49d4f87f4fd8c79612cb99aed76f963c62ebf4eb72887e4d3f9743e1f7c78afa5134197daafe65d15df876aeaa196303cd49274a9a56b07d0c6c4aca1ac94f1612d790eb70c65a58c5bbacf4cb594912a298da3820761a68a7ff225e98f478837e381e39c5f8fe8cb8f07e5c1933aef18ba73b42e8ee9aff621f1b80e9714bb3dd3b9edb3f904a73385b19c37608aab39abe65c6d56f14995ed0c77c2a12f4755884773288dd62e579b5f52f19dab7135a75648777f648578e337ce7877fe484289ec7fdf0a5b0c4284ac564302e4430fb743694a381ddb0f13a7d15ab74a9fd19c16a585329e41eff559b778c70c69b82de322c1b688e87d14d980aa00f3f53dcd7cc536107ecd6bbe58e7b2a880d0d2d4bc3e5e323ea5713577f98cd27a28cd671d1d6e4969b35076d9965f28e36aceea0fe5602c3b1d51a539cdea10fbacc916892c87c41fa4a24cc872b52e8ca5cf425909e4761ffd9088066ee785b26ef1fc50d664fffc1a1271378544c63294c988b89191078413b3668a2e90049cdd8c735ef7c5f867a329bd5eed2a1d7db86d6fce38b84bd9ddb82a38da78736714e88309c1585235f00bbdf3c633ba75aaa283955d142dcfe4743a9deabcedb726e7d039ee9a4d82b85b93d3e7766b326d4d360c0ccf9855f0cb7c5134706a500215ded37bfd819a32c669a4c9955ba54093c3e188b4ab07196dc2d9d01b17e36eb828681077e34186bbf10cf7fbfdcd140db7c116d80339abfffb50fe25055afda90af16e5903bb6c67bc3b9a2de58c7747204b15c24d234dfa6ad2db64ffd164b1423899d56a7463f4a31ff19d22e79e5cde994276dbc114d7a44911770bbaccdd522cdf37c5fcf3d9cecc9bfa4fcc9162f9d5c7f47fc9dd26c7e0b8d2bb5cc95dee6b659ee1c88ca35fcd0bbb287deb20e7beb9bbf3e8a51377f431ede160f439e319ccd767dc8d67307be0fa9773c2aedb183f5526e62db9db1cddd18f2ae941238ce58c7757a90a3e4be57e24919e24de2091f8a6aa10efb258d738bf3b8a37c027fde87d7061aa824fe2ea0e3f733812bd539409a738c5076d8c9ff2a4aa4afd0deeae3cb843e5073b0c8528b9ebdf979ef3fbf7ee2a214a743fbd83de8c934e3e671ccfa7e10eb5ae5ccc11fa19aef48b47044b5eb004e442d137909823f4733ecb4f1109969f0fb2547fb0c51ca177fe95f567db3f4d32399d6c39432fc924a7fba7974ccb4b58fefbf9527d4c8ffe4beeceffd2bbf3e77f3c798807c12ac4bbf3b9ea4c78087b10e73390dfbc0b7240a0e7249739fa982eb91bbff7bfe2ff2ddb96bae2573c4ad83fdd0af2edac7286de20a1e75ffd0a1fa1f7671a158bd5717a0c1071f9696a5edf37f1d9278e0421e29ebe5ff3a5fabe27e255f3fa1e6cd146910d7ccfb648074250b3e37b9a7ea9fe34c50278afb2a71ae3ab10cb87be593ea6512a3734704fb6d4c03db90d52ce6b4bdb40e5775b1e5cbdf511fa965ffdace0872b4499d097f37df5e5cafa60f979843fcb83cda45b2db6df4e237356270da8e5cb3963d2ad19fa017d4bad628ef9d3c7fcd0b7d4f9a1504b2844c51cf343b654e5087dcbb7d80cf83dbd0f96f70ff59e9ab69f6f03756bf5fd2b5166a5528937e6a75e0805543aface9bfa9a0b86c40278bf52b90b864251b5f95edf7fffa9bec93da1377ee95755aa06a6409532a1414d36004cff55e6204aff8960f41ee54b0a944ad9b6a16af7b412cac4c77cf61c219187f7ec3e6349813a88d6a45be58c5ffed3f7d3dbb7986bd7bc949af25e4b0ddc934da92148df40db70fb512aada27ba775bc2f1b06e3bc7ccbbe14880810932a72a668007e71d372fc136566100c6d429934d9404dfef00b733766eed6ad2654e88cb4cb871eae8a6ef10e9319d090dbddcded8e48e7b37f7a8871cb90f20c8e8b4d1abfcc9aecf1b33421a87971e0fb263af0fd13f3f5bd679be840f74fcc57f79d55f1e72c1ac4dd66dc6d76b72906e105178c269724d5aba8b1c9ef1f506bbd93a3d5fbaf96a30b6a50c4a8435a20f458b2a3c919d3e4e41d1818efc244891e3e3c7670121c313564c0b4207f3586777a60f46e509337ca6db8f3060683d1e055f292f93de6cfab9fbde63aced3f3b4aa64fe8e29ebe11c47e633bfe19df93113a64383601ebb31cc0fcd6d3f403d2e2deefcafe9f0d04ad35ddd2984de254d3237b979b51542713e19f7ec76d8add9fd5cd6e1f2bb3592b174dbe57c84dd6e7f786b62c39ff5e13fbfd0d96d18c24c3fe831a1c8efa2ee939df77db6fc46ee1bc7311c67ef882eddeeef2cf7deb9f7ce3af7a1919d655d1434b68bcf86c1a4e57ce3cd583a57afcffcce98a374c6daed76eba639eb43fd8cb6bee91b98f9ddee67735b4e9e5be733b3dfc4400c5fb865df4a008525dc6ed93d4d1365612cbfbe61661661612c3fca96cbbef90d145fb88a429471b7e1ec11ff29f2fb4db74a7ffad6873f7f3fad0e8537dd3a146edd3a4908e3f7e8743a81a75ace7bf21e775a3fd579477d4f29d4b76a796769f992f72595ffafd3539efb597bdcf053c0a7e29b9e0bc790b9c705adc9963d2e1796e1affc9c35a54b499d7eaa94dee3c04addaac47f95f8df378e54255afa29b50c7f44bb17bb6953a2f5a1f2f3c33ac3755425f42eea38fdfc1673a84c5bbea54d86ec11de974a5f3a714b0f4e31c79c5ef2927ba5ff4ad3bf9ff15b6ab165cd2dd996ff4ab554faefc15515e2334d7e4034d0e45cadbe7ff5d33fc8ac83ffea3d31c7ea7db5fa12cbe95b6ccb9fbea5854ecfe1dfb2f25e6965a12cce0aa9acf0c0946746a92795d98ea3155742da72fa969639dd5b1e0393d690d6966716f1552d62cba8e5b254be2d95e54f5fe2fba946bf52cb1e77f48d7a47f9e94feff5abc3386d39af8fbe4f276ac153e54c6168fa593f502ca588a71fc9841e9ca11f550928710b3d0744034048339c8dd0072182fbd0e9395bbaffc9c7e949240c8c0e6b0c45c348bf4499425e5579cfb75b49f972f41ab801690192db3f43aa42b8eb3faa3340eee8c30fe9e9fd4fef5608bde1bb98c31f2cc1cf0077674ca798c48f7117c2c9a458d7288a26b1542a01f944d193ee284f477a42a92dfd478f7232fa8b21c90ae1eec8bac6f08e9cbbe0bb7803fc2044a8dc0269b251f70bbf141ddc926fa424b7e49fd104a4074ce9721470a8c0ad3003c8408c2495414189b4702943b22e16d6ee8676b16e0d993f3844264eb7ca10ce6d18b78bc5ba21dd4ebb4cb20e8a9deea69b75b40e498773bdddbd21dd4d17eb6e0d76b19bbbfa356f7b463cda6d8e06d62d1b9c7034e138ab3b76b92077354e176bb26f7038ce76436eb82ec6dddc3057be1cfe94ddb8abfbe61d67c6dc4561f486bbe182822a07bba577b3a4631fa267cb5ec8dddd1ff409b60d7551783637e60db9dd4131832e46b952194a053b18c112c040231264bb9c86cb3b6f00e2099af1b8dd664d7018e1530527e391829bf0b01ac81e363876f0d000904e1450dc1768859e69fba4e0d6340393fd13a849b7618604e0e844ff4012581ed30a245bb24f4fb712806364bb337462e8639e9b99bb726861f6059d9ee9e018ddc0081c3cce3c373c49502ac6108ecef2340f0c4f12f4394b335fd4cae8ef9b1bcf8dacb9d11038e85ce6b9bc13049443448916dcd0f97d44c6597315f7fca2a207bf274f5bd590a02df0b499360fdcf6eb56892d70ab024cf6f370567fe8bb333848829a7fe123434d0db3e62e7e7d359f3d5e8801cd0a3647e6ab94a033072641f00942162ecace000c4d21083a4d5600ec8ac0831a842df84e100411489153c5453549450440be5c1ac6fe296ac3afcc18a5a025b9a5cb6d9414b49de9325b019897290380df4b5790ef0f42ba3b4b843f42ee273791f89e0a905d6cb863344833d20e4cfa4d4bee721ae8d3e728a51ca5d4863f9d3092d865a46f12bd612c3feebf90ab45e6fc98a673c200ec91e338aeacb9357322e0bf6fd60a80fcec5275fce5f47ee31806e0521d19d05cddad3294710dc07480830e6c800631c8000e4d5efc9d844dd226fd6b725a1d19d8e0528b6a92754a00baf38bd771d4fbc74ed756c2e4e97500234b4104e796215b2988c466cf96c2064162b081121a03907572bc70512b5393ed2e3a6b49732757698e24c13db534f439cbdc83491883f0cff5e717778c72be975fbfe86499c1142e7be0ce70775a1699612cc7eb44d7b4370e3aaf88f8def3b72de710a2a539327a9a23dd8b0f7a0f8e421da1d0b328fa0b9248efa327591ffda3effc47f6d595eff733ad837e28e4cefb3aca337dbd67bf9d2d277d7fda3e85929dcb52d02067bc2c050d88dcd0331434b0415d964296e482247617cde72c67112776e2119cf5d13435af4fe4269940800d3ff12f273e0488ece7ac46827bb6e5e8c3d42423c1bd0f8fb3dfa4467093ee04b07b0eb4a0f72d22d13d57fa83b5c8d83d8bf4473263e55ad6d0dcd1d270c7e09e667c27b863909edfc523f8bb6ff188d18bdf7355f45d437f521de442e648a3e7264720fdb0d2d0dc929b74cafdc7de731db556741a9b01933b69cff4ed771aaed23ad374004112d3393f6a33dda7bbbbbbbbbbfb9cb33bb4ec37686e1c51cf1b8101f4209079f605d969f85561fcaa30765de87d1f38fafe1f5d6703010db711c732e517ff1f233f210db05b86b7dfebe1383b2fef9c610cd7f92716caeec6038765c090dd6ee3198c6387cf8f8dea8c60ec82e0d0dd9cf5b7eec63c36aa63e3d8d0cda4c0893135753bdfdfd3a7f1fac19eb3bd398cdedd9cd50575f54735dffb9a17d0ed493f898ee6c8b449d0f76c4fa7d3d978ba9ab35edf0846b6dd0dbe9d0f5efce26c3773d6aba130ba2da9bd714e0de37c7ef6babb2948f276fb5bfcdc1d1d83a700f3c5bd121c3e6fa68dc894353979ce9d594eda55d2ade93379a6cedc99b46f4e1a190a59b259fdfe356b06807f6020668b0a410412cca258e042eb05b3150860c4c857586186152b5acad0d2c24206169615d06aa51a834ab5228695951415a9146a090aa51206159513184ea7942fa4a4987e4ca692174a25942ea0a09c70e1e464f4c1c12c86a028f4791d477120818300388ec0618453d20d26cc0d89e6d3e951da85eed14eb4e1948a36a88b36e8fbc3c05cefe73722cde991aae75118ef4153b77ec08c2f603a1fd49f724b46b2b6758c9ffedaac75361f761981e399098f817fb470b9f90b2edc059115ba20e234a5a498547aa6ade2e86c1df71258939f0e72980fe9d86db71b366d3c83d28ba35b3efa704603a36a0302d218ca5864fe639ad622317e545b3fda27fe35fa56db463fc5f0c18efecc8db0c86804845f98087fe6bbdd075deef79866563dd71f2ed79f479f1d0e95aae41ed58f2a6596ea690d9954a942cbfca27a100c43ae9ca5133764c05df91d382838d62333c9e4993dd346ea966a854e5b91717c929883b9c8f87c03188e542a95726e9e505df7b3fd397fea3f7987e472dd96d53fc6c7ba02c6c42c6b6af787cbe5cb6cabcd1196c78962f5a54b03b54f71c3ea774e7e6f1b99148e542d321aa5de3f15a27586dc35328b5be1de7fa5ce4a6bc824f7b47e4c96738a942dfbc7edbcb11a557e85322f50c6d8b203870b7a6ebf116d6b1f26f579b8ff608c3a3e1015e583a8a78751fd5b554c31f3c7cc1c3e338ba20c7369342a3d7f2964301465280d6d9131f564f5f7a19ebe878af261482a227eaa16193de88531eaf8ad2ac6fe2576a1228ce5e47979940ac49f6a10ef15c68b75f46175148b5c5d3d9297ba7aaf3ec6e8beacb90ec3fceeee5c7fc0dc23dc8de3899fd24bd94f4ceda9c8f85dfdd8c4280e99c54d7ec17d0fcc0028ff72bfe2189c17ea18e9198711358966f5c3a841d41e5502204a38c51b2f7faa65e86c6792c9d3a4129ff9336d36b12661fcd2df8d28cf2d506a8bf5a48e5ccf692a19c2584e9eeffc6b9b6df40d9bb61b8ce5b4c14a309e41a251f9f710d2bbe8188822a144236a2ec9864d72dcef4072c1b920edf0526dac5e2af7a9eae2857d00fc0ecf4ce3e5cbbff6879b7a977f61ddd403a0a61ea6a6fe454d3d4a4dfdf7f14b2ae522f5893652cf303748ea4f4f9f46e5e33731fe7c9dd0d4f39fec38bf5f5e75cc2f590c10717d1cc7f17d1cc74ad3af9347d522a20146b3c59f4c502c37cbc537ea7dacdc2c12cb05aa964faaa5690ced4753287ed40f2d5abcf8cb8e9bb2e58e9b5af992bca5f2e4bacd59fe3349b7b8c50966f634d9e0e4e916aa43591ffe2e7ec05c54d995d4fa407d8752d22d17760998ebd4b64d93b0988b2f1bd6d1ce452d72f2eeafb23e3a1747742ede5db87f620e550e7f17efc202305d101fa8af19ab2db4e2273b3fc67f402981e1993d2fb574fb03e6fafff029a20c6d51e70f75d64e23bf736a87eb5f9946c3f8856b6451a3fc36a1bae5c3fbaf7a881ede9f4f3458efb6fce172ff550fb2d4255c8c4085291c3b9a64515196d1fb287c6779949883e5ddb27883e51f44316a7caef44f755e16f55955c877dd87ca4df65053dce91860d69aec1e39f5eff8bbd1bb7f612cdb56fe80b9dd4f9b4f37653cf0f05ccb1d775ad3f3505b566ad96fb0d7fe0eb5445d6b1bd662fae76964b2d4255cee0f97abf2a657a9ca79d94eda38d671fcf21b3db74ba5fab60de127b66d23bff82b24caa8ac6b74b9a36da203a37f62be461fd31367fc263a30fe13f3355a9af9b2111fe5dd1da659fdfee1d8ae93f70f318d22f845bfc35c203c63f2086e4f13dc7e0c04611a2de68bfefff9442b24fa1254a9253bcfe97a6ae54b7a1dc64f80cc17222ffdfa4a652653f5f27327977ff2a4c08c2e7b97995fe5f2536bf93b4b7aafa647a990fe64cbf924172370f0f8a47c9bfac7b6c3f522e373caa7d8255c42e38746eb84cbeb0877ff2ea309b532dda6588132465291131e20abf9a20587cc4f1a45e0ccd9ac15815f6624bfc4caafb0f205658c610945fc22268dc9335f4c1a30f30590f9a2083c634ec12ffdd3365ff4efc0e0dc3ea936a33de2b66db60ec8a86d3470f91bd6adaeb30d0b9fdb260cc3b06d3ee6e1e9c9d35e60b2fb0cb7495019c270a7e019dd057ee96f9ff9a2bfa9b875efb5eb6ce9cf95f3678d8d3a75192d81a20348c17b904467ec865ee47994561f93d669dd415a417f30f475f4ddf68c7539613376798ae07a9cf85c187e4c871e536fc65e4738bbc48c5d1fd4e78dc789000467f7dc9d5450524a23e9c41b8d46a847192de9e45128a348a4724a31956060f4808151d6dcf165748b3b41f9f2e443dcd3f1494f1fe5c4724f1a6bcd25556ac58f715014e23e3bbf24d43824b729974434e26aa2cae98460a4f18cd9d5ba359979324f9c1fa829635253b9dddd59834c9a53a3cd94f88c0e81460d9ac33384781ae1e50273818959933199c6d1001d8f4ed9e9945cade46adfe9586f87670851e3fb3922308d1a348290ea4007d89df92e376f8df14b4fe78e3febc7e4383e8d3a0a61995fc6af463f244da21421e2c1194eb1640a256238126558c7bcccd5bf737eae0a215db6fd8432fe12f4ff28b3ed9ebffb1346f999ef7294d6efb349f9d996fea3cf68e7c43d797fae0af92e4a0dc9146f943e948535a883cfe8cf97f1e98c3ca6d59d2e7772cb7f8ecc55d11658646b52f4a04f932d03dac09fcb81b690c8f85f28e3463ea3e293c1ccccd998524a9932a5a22d70cbd6adc964f7fd94ce9bf22591489419ed783c9e0e680b65a1ac5b44c29ed0a75d3dc842239d4e8824d409794225210db4f174ab752e68e319d35d1c57d3b932c6d083e2e97de8cf87bd338529d4c4dff77ddfc7404ec527a359ddf87df722f73ed3c864f75ce50f05e16316bfe8defd760fd65010d8c5d3cad0ffc298cae2c14ae3b95ae3891862a5faca9115fa50a81637498a39ab69fc0fb5068d0bec0a058185f880dc157261495b8e2c1b8ab92b7473568b70584fb2e58331ceb2a576d2e6877adc2582e971d143867a6e7fe8e62e910dc759b67cd138da42378be3e018ca184751661465187ce6f79f221224d6d3dab32610248bca0de197fe1a95899951544b7d2ac5a21a0502bff8805ff40b51298d5ffa69544a44a54354aad3643f08537dafacaca050e3a87a9088ac4923b11a916e05615b825e41224dce266824086309cac85600e8e1602c7d8683b10c6547d067cd449546457ab0ab2e9eace0832c78068b275f00379ea5fcdcf5fa12d5ad20befccb52c4979f8c8d2f5177d5fdea6f5419ceeade46ed5ea6765f44ed5e97c7bbf04bd4fd727c7df9dd96e7ae98a8f4ccb4a6512c19a20100000000c313000030100c874382d170482857354d3e14000b8ec0527e5619874110530819420800010000000000004098300005289615fc3cb8fdf02a1ad16f620d56e952ea8febf4dcf39814707f275333454753b22f8626fa7b04732c15cd5a9152e455413bd382a809ac98d8227c05439d81c3cce9a3ede86078769ecabffc17653b22ad7eadc36a39948ff230aae1889e6a4c981c3251caff34fbec0a492a82bf641b9ed1428274244bbcada69d79d396bbb5ac9e5ab9e63a27430bf64c85baa8ba25e2632cb7321e926e4efd13ecf1fe60c87347c84d49706b406093021c76da72b76c741c8ba86c75f7d43b8b053c4e67ff5e99dfce4be2fae9257ea8f350807fae631cc7769294499c5d9d611634d13869c6243e76c68c751c7cf4fe88b14adff412e10468b51324a638f29857ddbb68f3396baf0ac22cc4a8903d0114b41772575c488b00778d243869c1f00b475e02615f722117537b5d3582d4bb2d30630e3868b1dac5ff491f6462fc2fe9cc959a3112619f1d5d259dc38410c88bb8b544c5c7b028989854e14413049e8aabd38181f07943ecfc93db8f58aad6065eed9dc3f5b31c9a266c442baf13dc7b46bb392e88c93a6641314f0b102d95f0ddc77367e6657c05ce20331fba6db31e390501dc0cf60c7588fe5f4cd32657c8652c35b7ed7a322b350ca508a99b5730c26280dec313ee98c0ef18c6386211bb8d4488a1438185af4ebee85aea649d3cd3a438b0661bf12b87fbb970f77a02c1a044841a4232b035475952f4c9327a0b487a6dc7cc19bdfcb187369fb11e5a87f848a355cde16d91722bdf04031bcdfbe3500e5e9f83d8e5b39622e9b6b4b35225ca3ceef063524a1374e354357e2090bad18193ef3ee7b771e8e68b71acf461c5a46fdacb152d29487a1d900019983e71c7434d2929b617d502345218411d8877be83ea2a4d4516f722a05715ed48adfe622f4346d58729865b392b792557e6ade83276c67d1529f4d77bd0fb230ae91ffcab8db9ef382742985f86ca58a6b0a03e9430f0eec402501e00c7fe0729c093378c176b0a0cfb17e981c1010fd44336d30189071fbd0ac80e07e8f923e6fb137cedb2d15029c0fb60156ab38e35800eb2e51c1e847321c6a26e6e2a88d24b41efd4c2db8f4cbefea6325b7b49ab4f16f3e0f045166b27a0728741999753323975c1705ef954358ccd99712775dd7e65c578526212a8af0252094da6e3648e25c8e3cd6b765c272e6b9f93c92082c1894666b6ed450be896c864d578ead566cd7177d7cc6b515fe778e13a32e82d37978279ef2bf42d5055cc950f055900108088e9a042e704fe46361eb8fd1273c044ff48edb5ae362ea23adaeaabd4b92f4077d4de742cd529d2a99a364745e973fc1ad1f7b8d65f44d6db60c9d0400772942743aec7c6bba42254041c67737d97865b6a6d7cdd38740e536826085cfd63cce96fe3d7b6add9b7fa743c7327da86a40cbfa3801b951458515da6f08dfec47b3c75f3ba11b0258a6586c0aa1dabf24e0cebda71035398dcc0b29df1a9e5fbfef07e3d8062b742c228ccc8ccea7cce23eccd2aabb2b5985a28b32332e199a3b2c65384ce0862609393c4f541a98e1a464181f974d0770c51440e834b06da644a1dcd07e8cadb50601580d471546e8423917718a937da4e42ccf10717ecb969e6f158dff8440e7bb87205e3de2f96010d1db95c73e9ed788e1b065e3fff0a2cf1807325036add0f963ed0ed6173a52ccd1333a67a2d7b8470e5bf0ef97aa45b0b814ef2138a28f8eb004ab7070dcdafef017017ef15ced1331c1b1ae674acf14c50a9f5b94c4fac0dbeeb445574bcf9907978e5b575ce6defd005614c0293924f4194b88fcb7abf1c2b1b335beb7f3a57d4ecf42a0f7830cd59d98785e095dfa7f188ea5358534526d7adc5c2cc0c753f7c7de1572e37592bcf679080e8c331a574bdc59865aaf671b4b720a7dea35a24197ff431c5fc19d5d71beca5c876f1b05a13eff0a2a1585c80242ace9febceb5826b21816db68ca983e83c63f40ce5f0b4f07a4086563b9bc24554cd8cd6c806514dab26c6de2d831c8b41d91a567d245b10e058a8514a745417fa87e6413562dc6827396b90263beb07651eca3d2897128a3be67ed58ec8b286edf1659bfe5b8ffcf8d2168d7afe0c14454fa19c3267926458c7d9758aaf700f3dd79c71da8530c73a88036cebc9d4f13a728eda700f8ba916a0b4870cf0c0d3ae6fca448188c1f949675c5be68be21e16dc5f1328ac40650377e541f27da9916d2ca7161b91bc71e8084bcc6f58951f05f2ce92379a481805903cc2ccdb6e7fd0510a444b8783a4ad95489cd820887d3f073b73c710bb04dca270d4ffd54008a30cc93897b116b667197a1faa89b96e6840c54d7de53ec6aa737ca05c3ed8683dd4a841a745900217cd01456af36c74e9150b76f991320bb9cb9e562ea690b422538133ece8fca43504a34a19e657b5443539605f4f9e20c2ca634a0e6400df7df0cd57287123ca8ac317622298cfbf799998a3d5efb7ea99be9ab1d8fcf9925ea40eb7023de9e8dfbc765eadac076c67b6eeadcc5bcc3364838156abbdd6dc73a444590172b05718415570b4b0a0b0464069d4a76a3cd43736715a6e65eaac7df5a2b33e056e44b1d241528240640a2ce097f94258c84ab620fbbd48fc8a74787e97a46b4216f7359fd88adf7c43d50eacb0e6d516bab7bf99602e86d24755ef18e3553916a32a532a0300228aa40b7b86986a029a73dc59ef4a42750eb1bd73279c2ee2ef88300645b00854b7eda3f336b7ed16d3812f258e2be7c5b616881343d17688d320988edd4a796b9b665a30dda17469ba9fa5f17dbfe02619bcbedc2ad4395b9a8c49a908a71a142ed88510168959eb91cc14221817d61cadbda54c20ca6ef1a72a8d198f252dc175c7078d5af299c55c6ad282798b8b89b86270aba4fdc9a717ba605c166ef697a7174cdf0831c242bc3038ad2e3109c093a47b2c4f082327415ff595a50053dd0d29d918ef777ee5f2dc420eaaf9a7c5c45f8f94f08b69936818b826ad6bfff3c75051cfc93c2c89bfbc5dc8244b979fe92fbb39462c292fcc9805df10ec72dd08427fc938e82f16bf83edaf824768cef3c782546e98eca8aef40a9dd03e64da71ce8c5eaa81e4c0b8f96d23bfc39e6f4ba0605e6b12a849343ed8c6cbc2590b49e0603451e8b9c4fcbb34c156a2d0ce09cd6c917e036810ed3d5dc5a81f4ac114ba14fee75d4557cabfef5ddacfc9edce0ccdbff49ff8584deedf4e69cccabe462f562920263305960c9b93e75266fc52c6a9419e30f2087c0c6a8bd4c7ef32b270ce9ad5ee1bd0e879adea39ce46eb984f577ccfd5343fdfe1abd7399ae2731e5de67c4fab7c9ed7d9de966d94c773a67924a0f7e902f5ec549d73eb670aa4f3f4c0881dc1a78f99bfeee9214380ece960c8b6f57449a4c3f47430e7af79fae44963793a78b24d3c5d12f9089e1e2ca5670a34f61ad2e1ba6b5f99f54e0751971c70605c84a060ec89b51d8f74313d7acb61f110b08cc72dc3083d19b2f94e1517955f15e5b60d5bdb3776fb3e7ab856a3e4ec7992d06c2c74b1ca2e840da2cb085feac5d9bf53951aae7eb8c1dc9853c7ce9b52a8c54d6b4e6c9006c5a6bdd49d98b035d498aecfd601ea978ddc45f7fc61609abc9dc977aebce11acb8f302dc79ba15f55d0f1461112d16f63d55effaae56894c25c1a22bb1e21aee66a5bfd32450eedf5925bd06aef5e7ce3b69ac317b81a679ea30a987124e0b85361d21ff88c9246dbad368a7bc1d21aa7b7139b94d38a9a277693342767fe47d708d1023ce002765124ff91b10a8c735aadfb7167d942de25cb5217b42f08a11282aacb2ad8f222967e0c9dfd4955081f19611bff3256b8fb5d77502f2ace21d3d1b28885d630b9e5c1d4b90094fe31ba2eab6ac99204d4a778712084a8a0a1f2f877503119b24a5eaf3e0b64d8a2fc271d19a1606debc6505a1a8d4560e10a5498f588aba3a78cf36e5977963aabb6e5db475791cb850f47fc3c732b6c8b20d0dddd25b25e8a6d0fbda01282b6ed49b005ca7e2c471937243ad08ecaf5148598b54dbe6156f0db829f09cf13d5ebaf02c58cc0d6f385ce993369206bae5c19bf9962b8d24d54376fc9d83a02fe54615997a36b00bd8b66d47d093033da23e8ec348001591f887e140d850d7696c0d574db13ab5492cb4d2aea7bd8c7c2cd03fee949f686d69ada9524a8f94be1ff5021af07acadeb82ce67a384c821cbb22da4e20f6897a244bbd9b43b8b6833b247b0a233d6a0eccfa6023b6731c8c2c386e405bd11143e1ccaf970d99672cf788b7faa25c57f805a6c5323eb4d1c09a2ee506543aa9597a2f2d13a5185e59f6c3b6dc6aff294f52527b09afb483c001a09212b42758312ca545e2e6cd588e43454038b90651a56083fa3740dcdd29b104d8d889c68e6278ab1c23aa2a882687eddcefded98dc2146149176a8d0e67451a97b05707e885da90a1ea94f3ecb704ff5a0cc995e0bb25fe0850ae12b6fedc1e7dcf5156fa22ad4fd0b89fd97654226f583b7ed22950fda972bbb4f825a65c3b0a7bb3db70659b5994bc5417f20f18cadd88a8843ffb4fba61936c18e95538225e4df54318c46a10b8228ecd102af357613a7ecdb92ae06e9b96da8a7c3784541da20d7435bfab09f6d6b8474d7de3bdc31b5318f41f0d135da6a4b9e4ad6b3670c0bebba29b1f89cbc45a9ea7fbe8afbab20c4d7841c5033da5b112e918afc1eb0c99c89c275fbe52e5951e733fb4e99dffb0cc78838ae2e052694c6fbb338012355dd5d031764f52b1000f4417ff14a2a91c23f26a4c1df1c7adb98628f19bbb626b3be6e421524e654f97d128cd5f5fcd08d148f9cc00796500c2200518d4ce87d1e9afa8b9982efcdc49f44bd561b547c9c5248210f4a15e60e1b0b00b8b38cea0e0b6cf237fc47ca118ce64ca21d39ba1b1734b5700af57bc659046a591daaef4962baefa1f7aef14eba841acd1013d24d0c11a8db0070aa7fb92a719e2350808045bef0cbeabba12d652879596ee0d116fb02db0b051a21297183ef01fea2b35a43ec4474ab62feae94e0dbfad7cb5eb9a88a4bf9d067b9c234262553ddda0f0040847c5031538f76c18684c3a4f539390fb1e39907ae8b610e1173a17952c3aee594990b2a278e5806acbd973bc68c732a801b3761c203bd800c92ba79d2ac21006ec916ff9a6574bfce7ac2b0793a206f1d70314a43bde5d570233fc08d3a6fa7c748c4242a1cf470912b075a1d3870f9259111a988e254cbf6c114c0aca59ff9b855997bde29a776fa4da7988fbaffa302b35d79a779f6325e815cd8f4f273aa93d3153a4ce9105148f43d70ec2b803a728842393c747de0f9476b8525a2c5aab4b25fd0b6a8db61b2cc46d3529a85e49a6990c29d6dceba1a96e589be08d536a90e3a26349116d0968359dac8d79b5d4477ee72b435bd2b742681eb7600a74dc78671208c65f48fac9315a25ca46450867cc143478d15b8623997348e69126fe00f5445094729daef0e3acd50e7f0de9f9cf5b7c9503b9f667beefa15c0f07d8e10d0910a170f525271e85d6df15fa08853ad6af32bdf85d36eb4eb6b4ead682e4e508392704a736c54fa2ad5da8baed0e0803f16de3a18e8f075746544d46ae955c6c1263b541a6da2b63cbc879c4cd789c13796cdce7f6057498e19f4d054455795167ff7d37365b6e356f5bc4706504361908db3ab86f09cd2bbdcb40811a01b322972313b5856704e771879aa1809a17a4262573144a88d602ed0381b74761870ccbb275b287d874908fa32bbf9309d51ce386e5326f7d7b96a143d03ae446702f0220d321f0ee43d8b6b378136a9efc3821338e82401b98df5c10de15366cdca6be01ace6bfedbc228063a2406b3f7febd5f1eb33789d89e566f36de2c7a548804d3121e812fc25ff0f59594ec68ab53abcdb925c48edd0137420438dd74fc8eb7b5f0c670b5a97d1560d1a6fe597af4805bfa7bc59aec3e38b061fa5390eb6fbcdbfbd6c9209ac609db714029b52a514020e5624bddce3c4da13c2ba95eff8694f3bde493e4e6691c37312802ebc5dc6bba83fd9a503272cf55a2865a30cc5db9b18f694846b3cb4db7a5163bc0c0e7838deb77db7ce72e2196b002c60688c64914fea0d87b8eda938a6753f2e2d2f7107627e8c75ed4156f31159ee8dc5882cdb8f32e29567f58e6868ec5a60bee076cbcecaf23598efb70a6cb50255d0b4b23d28cf06c962eced645913b6fc6afb896eb83080c330a4fa3cdbc0f3a5f84ed432306860b561718ba987f88d7a813344cb285027126bd10d3aa932d5b4742eaf6b63ac5087a31e0dd886451c7dd25d9f6c42e0cbae02fac000860f74174823b6b568f20851d8e124f93421badaed945741fcd20a38f4d4f78847d3ae82e6d6704467d09c0096b3dedf230fbc9d15e75640ea783221887673943cda4697e535dff1a4df23fae4b2b96fd3a6951af86098994154d85fb61c09595493c406aca5e54b1316c4ec5a5a28b5fa3fbe7b4abf78d539b78a425af438feceeccb44cc8c22930d04abda7492fefef3d7bc533ba8d0fbc00c343423558c13732640d69295b66b893fda541b8eb0c0769ce73b9d3d598ebb928c0d467984ffaf58ed4645e2adf894610980cf250df484a8a650670178b57cb20f1806a834b29572fcccef200d8daadd7944611f61b80e8eb9ebf7cc16543a11c2840a80cd878d737d19b21abaf9d3f6ff7010789800e31392692ed1e53c7e3fa0a9ff74ee3ec01fc2b0041970968c6fc559760409029cbf2165de5c2695cf63a050d702762637e978f48619094710664f331ee0ecdeda6e7e148eb43eddd93d1f876f9eca4ee79f7ea62cf35e365f8fe035ffb9bad3fbe08ece2d8cd20deae355b732a5f406eab59c545798fb41192a8822a9155c179d413323d4e11300be743eb5ecfb83675b2eafb2afba42465d75ae81678f20da849ce0b994db9b15ec3222c60fe6dbc18098392620231a3c47083e482e50e886b72855ecf4eb02185734ad407f3d3f7b14d147796dfe7eb54be8a3c5fae85fea4b1a84c50fd719d49a14374b02dd815940ec42c818163f70e4f6798b877a78e87fbd6c7deb66172675b50bea8c3fc2aa78371a1fabb841e568c107aacf44da4741b50931c28f569fcf83be790bf7aa0f1161f06687901b6b99be8a99e32f98363d0c89742c5d303d18be3009750ef443e09c4e1f3af0312bd9da89cf155141dc66d8aab7fe7dd3582485b6cfacb1724a669f4d39fea1fc24e1380754170d11cf54ed37f082908b96284f92f87148e81d9f893b01c70ca105e3341710dea272891fcc14bab8db2ef4d732ad1fb89f66942c600ec5d3bdee7f2082f39b4f4eeb2e34fd3173943f8e041d138bc2be3d46a83d16821cf3facd2676306087f40609a39da18e87887e6e3845465105fe36e7f1886b6f923ea01c19bba673e9608e283ecfae07a3e3fdb34bff078a9a101605f2ae03601b464b5e78242d93ff9d8a8e3e953256f68a88deaa0f7373b43d8618720127edc0e9786869fa7120308466abb95430ff2fd568d2087f6d327064415371b39c855b2159a839c9badbce8a0fd98973b183638d0b65c43f2346ba613339be1a58f61441878364956a0edc137f346cb4dd9bf76eec3418e7efb39ae4ec0087cce9714d59e2e103879749ad453f70dce4c2b0b6d2756ee4747492627d28cd774e6b64b2fc5a73529c9e40276523438c2a58d20e76e1afbd5b51f4ce2a71ffb2512ceceb58bcd0eda963abd4a483282c255fa9009610f251ffa3abf4e75ba50026afba832360d7d8fad5c4b234facea7e1adc2f6787bac3f4d7bf39ed45d22b0a042a030b105e4024635d2cd8f267877a4a0b5310c9a4317cd9ded24e3cbaff86e94ccec768746a4bb0c918640e39851553282b448e954e6fa09c08edfc68f44b2a00cc5d09b6e063abf064148db700e6202cd2a46100b5ef33c892aa14a5a33d518b522ce130e4f8a67f1a286ee5aa536c01b3119f54828851563d4edcd9d6115857e4d0c494438e8a83e168533fcb5717cec5a358769cbb3a88cc400006010a62604a207320e4857451985d95a2b22ba6e18018f246f4861a4ed4feb03215455b61d0c138fa9e1fc101cfc45681b540ca119b70d552513f30bccd0a0e3d7bc9d8a1cc6adb375a362b557957ce291ff025362059a6c2c57bd6e164ff422cb2314fb75c8479c28e4da3d0d7ef1d2834e8bfffa269edeee785cfa29f58142b87af54bdf5c91aab378ab694c024f724eac99a3d676c664fa687ca4df3c53ba25bb4bc531eeda7a6a4ac350942033e3896a075e2a0d3ccbbd371561cfda47860522f287acda811ea52fbe2a4d93f822afbb0bcc1070a8fb0c11fc1d43424a26d5f071316bc961614e91af7034657d784893f70b7e9ab84a9949830d23d8a3b8e4fb763cd70cdf9a23cf1e9ba81202db5ea89db92b04670549f34f7d63b63b3e20c30791f37fd9fff4fba5d623dea726576489eec4776bb1a01b16da758a3888c8c35784903eaddd64ab32d07df46a11c6ecdcf8572f0653006b0f5fb823ae85a385a9e12b9e0ab09b9547caddb75edab91fdfa42926804b05573b5ed08f89423be5aa36b1b9b30ed67c8ac4d72bbfddb379e18f6aeeb47dc253fc969b85d7aa130e0eb3aff2b8e34e3030d31beabeb94cdf1c729192c3397e84ed0757234764e012a5722d8d129349344e9accedb4d63ad2d9b5893af6cd0d4f425e9ea349659c54c3a688920ed56a84eda1316c23a77322c194149d9f8580ae9692c3ae997ea2ed79e3a2339d48b4178742732021fb1ece0f4f6a56c213194c6ee536f1f3a968e77503e5d4ae014b0a13fc01989713db7af0240f57965828d3999d934f507d2a78f0c2cd59bc6e738ecfb887bbc61c432f9179b495ff061363d1f46fc1f0ae6756ed92f7c294b6a41e734da20d8b06e2bc3c07a6b60f5d3d78d64070cdcbc18951f81333bd8e030ea5e617a6183eb98cc6db19c70e4eab21ef40f98ac1e96ecd5f4106f7938245364100869674b449fcd72032ec9250469d173455fd8d185b18bc719db9c15836d1f89163061d86a4ec7044f741a5483a554ad0d9634edc6836f4fd76df770f705127dfb5dfb74052a018cfdf97972b406a22d0702c2d750b683dfecd5963812b4247539c2f6b3958bc6c3ccbd800093ffbab4be309ca884cf176e2c40a4232cc39f02331eed2f12e9fb5e5a7440be766d23d7d7ade9f1414af9a6c06cd9f3b11e76d7fac8790a637f23873ddd6a2948486ba1eb96afd1461a30ed6edacbf335239fe8b1b66108a8af5b62a1b2d2260cd62a5fa792b40ee76b898e62db19ebf57afa3179463f38e9e3bae8fbee94a71833619433c87ffc95d6632781b7272bf824c4a3b11899cf5cf509bbd1a27c2c04210da6193459803bedfd33eff2503c5ad4ed083197321fa5be879922ad7734f9108b9a2d8bfb28c02e074d0f49ff83bf23827406d61ad55414b66fae0cafcd8dd58fb0c8ac8ed91e83a57a77053d2e3ce3496d2c8d526a878bcfbdbcf39fc9a4332d9a35a814388dc89fd822bb4b54ee6d54781f2c8f8cb43bf4760b906c83caa7fb7bc0f01a4f340c56bed7f6073a0b7f22798a763b1ba8dcfa6b10fabe15cf70e4dfb219fc90f70f97ac8b43449f84a9e64837217f9e14380d6a7a518e44e0113ba2790ff2a48f6e654c74d0983d97a304a8940be25a4a4b4b615894a08a8bab1e0bbf62406168f0d20515b8d42df205228cd98ca8475228b6bee9d1790cabc9b0d4d1e52e384d18b5609e81b5cb29ea2627ae673e90adb2b3c05d2663694a5f411a8e9ae6261cd590585b73791c34e63ba105f69f272a1d70e1839415db17e626e081d352b73a5101a838366e08ee334cc530297f586f97905edd82569721c4041af32595e0fcfd51a1235fffa386bd27810c64275020f46e6e5ffc358fec2684f7baf49e18036409df6f904e3eda8007369ee5e2ee8f771fa5103394bad994c69306031450cb19c27e93827f29a6d06a6f605ff6cd6ca182470732ec257e97086d1f1667e19d079f1ea19bc916fa180d617284208349541859a732c07e871421ebc69c3fb40efb56a8327599cd714011bb15f3aba0652d42f495dcbf91e3cc655e4878b997108e43815802e38d108a6ea91fc921613f58af4be6f47b8083bbe7b5a8b7c1b778e2b2b9a686da325f0f145a000923ee840c7048d89709f80b595b6664e023a3d64ca692c6f65b7705bbe21301cceac16dd06885c4320a11a0d13e763d27a995c2ed938e4ddc0a6b72f316d0bd34a0c571cb9522629dc6991f2fbf33db996e1f1dc161fffe09c44fa66f45c2bfba0bd13a794bd5270d5fc7891c7e813d6a982eb279ece4b544f6124ad071a3360e0d9c2ac20d1e6393e50780a0fcef65ea60be04a2417630d443fdcb3486b79556108f0fc27db21dd2704a40b1ee80bd0329c047393fc48cbf26dfebf7cb18626922868fe401f0d6eb5877d349ed90f7fc8f230e55e850c50d0bfffeaa5c7b5609497cd3f43c5a2b43160ecb4bc3c29b067addc111837bea9f070d59101639d4f126686a14dc7539d94b2c30cc97586d6f2f42008279fb00291220991b403312d86e0b744488130cc38e048311562776964052c48a48cc822a5e2fcd25c04d41655235f533e94c6814848a41ce332972344591e9de5b607ea29e3a7b23643896774282b522eaca306bde122cf432802ec19a87565851df5895fee00375ca24f0cf0ea68f4874b59c0f1c0da2ac43c38f50bbe3e2513631ac086cf5f40af2f8721506710805f14fd97c9514a07083921e7e94ac3a461e0de7872c315965cf2c9408f2b94d752d92edfb9237039d090b945f2fdd88894bff2cc30782941fa79f33505138cf2ce458e5bac01553210377671a759937102335513ecfd9a5b92f731315274605fa9fe52f5f7ee9153adbe74d3e10b06f7ae4565df4ac5b4724cd0489a38640d72fcbf76de58010d4b7c7224b5ddc132b447f0e282448360c7e1e9cf40995b964560958343f09c8f22fc6dd97538791e0643f6a2cb09c7476170d74c3784ae906357d022a75792a5156e4128989d8a0fc1011f94e9ebccb9c446d41332c116eefca9485a3c7fce647d1e399d64304242ff008bb53d50714e8a4dfeadadb6b7e0003b327444f119a649ed8a76e7e2780e641ac921f3c1b60083ebf5a344d53fce9f2df2cbc5f32975fa56a455bb810830a147a076c9a887c48b9afcef38c3fdda11bb5f8d317a3ac2e25a0e5b31fc6fcbe6cb276337fd46bb95a096dd893fb7a1c00fe7878e1ed68bb388eaf5a8b26a383e27a14e11d1b4247b887bb781c40406ec49c3435c2d204e69e5707088838e032fef1a90f7d8f073cf12d61026c6073cb32080a15b183bf7dfc941144af341ed4f11887e89abf37713ce84bc53754a81598f714394a18c25cfe7aa0eacb0ef4cec8d36afab037839ab11417e0faf976500670d1e75377d74d9a0904c740fc69545c2f737b28adff70b6a0b9457dcbfbe480489fd6270a535fe571f3c11a02f8849c282942f694fbb308a276f2524b6830e328b7897725c5003d03088398a59e5fa94a7202c6abb0281e282f886d8b8ffad9287b3f72ab69dd9b782661494c68fe159c8ca33834254fcae83fdf0b3f34c4240f9da77e128164c96b43be10d055177f3be4819b255e92078d33d4e13a9c09041fdff79654c1189d24de54042736df5fcebab2f62e0574fda8d6842a03ba16d3342d21ade1802ef14137d566bc65a4afa20ceec908c8625be8f1f0bde681a09d342c4453ca37b40bc7c15cc9bded5305cb4115484333096084a20e96d4b7aa058a057b61ef2c72baa12af3b8248eae7a9cc4657eb4258e43dd83b127a938ae731b3b8468c86cae9ca0ab9aacb64b8ea842457129fd313e5cbe7038bd35466fd8e45b4c9e6297631043fc9de94ac428b743a09734ae7dc76ff17061c1c3604447151ce9ef25dc6a7f1e1d8af2170d479626fee8858fa6e396ed2fe2496645a3492c02e90b80f9fbc06b51b9e0e004de4b2617898630e8e8523ab93dbbac20589697b171eb3924367b7a1be1dd484dd24267c39662923d0423618dfcab988b54a8963648c224bcebcbecda1941fbfc579a381227ac31cce10759ac5f4f96f1c95354f39de3ac564f4b0de00b7f9ced28a70c2935b827548255d5c8046a2eddb261bc3477588d95eabad300df071724d166084e0f2516638bfd2e69f2c054f59c4568ef1b1c4c2430d165f6d3d22dc561f54f3bb8839c294d859016f28ec83a1adf0a32746ff38c59a030841958893dacd9dda81fdf07f473471eae959c3de7cbf59326072cd6c7e6cac50782b4597fb6628c956cc9d8f6d97e2165c8c6f4b43ff06af0679c8ecd50672edb9720a415fa35854f5da9ecbf31bcb79d47fa8bfe41ac76d153cf3e9ef2cf188d2616f07d767343c7097cdfd8d52b029deca7c9ed815743f8ee29b52e5210375129461d787ef023400c1987b51790061ed09f6cc1bb7d07cca870ac3fcd2730c08663a56882c4d704f59eda9c5bef1ca8f99e06fc1495bbc7192ff4f1afe60160f0b4956b1ef9cbd09dd0f5ee05a47d684fb94dfe6766b5b4d28def9c8632b9e8e80998813e650d15bd14290efaa132420bbe0a6c879bf65ebc43b219b3fcbdcc828d12fd31a812c57f5b86a0d345a756985b08bac194cf9b9cde25e049fbc4e48d8142238201ed8ce93ccb285c7934ff46c2620231e4bb60818a4685ac5afdbd01d0af6d4b0c3cd05e45d7cd0198c1ad2e43336ab74d17ad0459a7e2633409811a0c78a98875ddbb8ae5dc09aaa69403eb70876a9c4d13586a5c242d8a51db31b3c5d64728f813c25d6584ca756877a7db5a264dd0618251c44de03aeae30a6261b9ba29ef07d8f7ccaece61859a766c7ec6f09bf02c1df7996e0a0d47670fcc31c75e7aa3dbdb1133e260060f4017b955ae85bd70f72a511deca4380587be7e14199c130961d45be20ec485b16c1887722fea89d22aaf076a51ff0bfc220789f22d7d6e778878db1e5f8c7bef584512791107bc6c0867f6fb1523206ad07973687d52b1b5cccf8509c3cc76741e54c80f27e86f403b420f3274c791120c40142a5e1fd120cbd23fd12bf65383f240e1d493c6f58d21dcfa02383df9bb834539d78466b7121377e3cd330f472fb7aa91685182ec26cce19f5d45a7c64e1b83c98ed9d9be882cf8349cbcd4af3afc396f22e3085877c16b0f1f6336c324e6f2b3bff66d9998bc015965145f3b5041b05eeafabe2ba20e5c2c01446bdf539fdf27c74b298baed3cb18dfb8b0f7b71fce83fb8cc597bf7dbe41c60aa21e1b66ad24985986490b4591c22939a9f40743cb730c56a905105b49c45363dba1b2b601eda8ad8ee1337d42f6a95165e6dfe21c376d9dfa469a8ddb202fd5b0d7e3cc331f7e602c6ed54dabe14c5220e2348579ab74c9521877cf7178a2cb0caf7966be6a1d37433adfa4de768b8843625add91af3fc2f56446d5237cd6289771c6922189c1683c3e445e18ae0113998e90c3ac2a189d1ba1c310ebb4d1f4257e0e9435c52c3afcd3749ef68a49f7cb371e949b49987c015514019828dea4c23e2c5a99687f9936736efb789f17ed104a611dd0ab9525a020b74dd885c96ee394bc4e6ba950b4b15e4f452b9b6e0e34fa33d46dd338569cb399fb0016f0020bfee20fe0cf02e4797fd1a7e0a7221825df365ecee7fe5ad43e0b1bc8be4f3e4bb930b84434940a4b7e186af75722cc660b1f26af1eab0968c04e6a7ec8e903134410c4a08f9148065847d5e71039ab3623dcd38f99d30e80dbddc777f6b815195597faee1d87e3620f7dc744c4824ae226564a9e4679acbee7035a645a4e6c37801e0fb8c08c020f9f7cbd89c47214ec6996924b2eb8088c41843d7c5a2941456d253f0f8a1d35755a1fcb4f084226deae7703f9dbd74e8ee0e3b68afe4d01982e49e5291308a919e71714b7b828b266115635f9eccd4b8e18fbd4b573e3b1b8dbde75e1204de36ef099494bd09195d25c9a0212f8f4443d15e1e0260bd03f2345bbfcdba6f0b193f5e92d44e6acd76d7b52385d2ea901246b916fae961ba8ed04f9bc736950a332798900e4b95e1eec8fcca66c9958db8de8c29ec02690df73f90d9c973ba818fd159678b514585a72ff15526928aa60db7b55234709e73ed4c0fb0f1560ef3076190540705aefd78f6ffe3e98303262bbff3438b90656bbe8f5bb355cff955fd63c9607726b25c771ac6e658fde6884eaa1e13026d0d76201d282d2c64fc1098a6d7d0ac9b5a11633c85975406b85e37801a9ef7efc267d4fba33431e3fefc2f51ab2dbaa360102bd1f61fb6416cbcd1f049a0ab28cbe1b8fc91e10f4135c8718566a47cf6403a3c1e88a601c0deb3428d517eaa1474d95e6bab0544b2e0ecf3a8f75b78ed75d0799908b8c14245a62654d65c98936c03244190a14bd1a6d2e031748a35ebe43e9966544d0f1173db5260e5a6ffa5554dde5d1c2dcbfd8f236289bc06090fad87a3c308cc9c5a6d4e01bccb0790bc968c48f6fa75e83595f7d7a0e942d5e8577e9e98336a80563d59a36d97df3e7e10b5623d7a7d1dde9800e897f55cb29f99ec23eb2c7d1d4119d128098929a1c961153a47a4c9574c2419c0cd197e641d0fd9f60f53c35d52548b4b4df41a1c4525029f1a8c3b4cbc270241a44d0ccc80c11d4ecdba88c37786c5d201693bc0f0dab312010e468f663f7b28910fdfd2e2debf3ef4e3bc6b1245c64e87eddfecf2cefe38b0ea57323b52c59605265ba84bcbb83020786e8014c030403fde79a8ff7365c6b80b1ccc3a18ebfc1feb5e493007d585e5cbae6698d56462b03bfdbe0421bca082cee768806d768b6746e2718b117d48a5dddd39ebc29f9f1d132c6b30d7b8b3816950b92f9d8f62185c5618393caf7d6a78ebff50da171045b269a7f2f1226ac6f0ac383d18bbf1461d74c1ceb06f2a8dd676eaad7c4841fdce9d84bc4aa8a50d74fce003ce35b3ed6c6bfcb01fb1618790a5172fcef4b2bca0d4988a211942d3dfe9491a122e5e3249df7023dbec0a521471ee112eb8ff31b3142207c7f95b3b1a1e19b7993edf9dbafe4a99eb924f0ea059d7c5d7c65fcf0426448af0372e61a6ad33badfc63a48c5184ba2800ee773b725bf47a4931c7a9844229b9cdfff787b577d0e310f8e5dd5e8d45cb8d70f41772b9c2843032aac59c59677a021550b88d052de1a27337a838666af3f1eb1fafe425718bbe773e983887b1accf5f7afbd0bec2827c5285d1547994361fd5d66f73a556bd952d8b30e538c3d0ad964316cea370bd00ef4a0d94983fd1d4d504fd3d706737fed00812752027698a05ee112e8d60157553d73fde13073e9db694967cb409331fd4a495c822ca368fc0b977c6804920474180915f83305cd700e0aa6aa13290aa655d4632cc75a99a3be45f7caaff754e8a0cf4b18c4fe4f5ad880026bbd476e20b8aa3c7033d57571fc64f511e9c5be8733c73611c63aa018f5d2a9794f02a30c93a7d83e5aaddaa496cfa58711f15e1c732c89cbe8c73e10a0a3337004aaacc0af5aa0ea6eef50c74c04cdf332a564ee0a5ef607f63043fdf7c3fd79f0efd59bb054bbb3a7ef29f1f3b81f2ef740173e2e7cb6e7471900b902903aaf0c96ebccc1252cff7c4c79a650faa3bdc311a68393592d0b5f1df89fa2f31394481bb7ec9188c15b12b41b20f2b4e6e812d6b2a564bd67061ba7cc83f887be24fb184e2a9561371c034caf29a72eac10688f7b64dd18a4c722d1262ea83f8f97e46119fe86da447970554835f052f013856b9f2a34aac777700789e84b2501dfb7fc38caa1f2df1db50a9c6fa7b48c95e04dbf45ecc8efae39be2ff237ec5425be511651cf3c6fd3a303a4a15eeead853018ab81466f51312cd60f122c4646cb135aefdb30ac7fe72e93b6d5ad94c347b604dd4e78f8d81fab36cc36577a662563204c58920e39f3b90f80ad77a30eb5ccb6602914479e41f38e82dd4809eb8791061d23ae8de0d6edd40c6f7b79abf95d827003839c810dd54b65046eee2cc7334900ce17d7e526af1c876c68d0bc6874c3e3050e96800d83a100c4105be5dd77403f003b3db04e17eb81f95505a2b25be568c9828a04b6a60c435756244d6044e30d413e80e5c3139404618e422f5f5b14d1e82871d48bc3211e2253049041fb9c19006038eede990e21c697fa6027d9d6fc85ad955b4f2f3f8ebce90202e143eb57f035eb2c260b02de6590ce67a6fa36dc030cab4ef55c1e919857926dfc259e1805870de27b8b2361d02336b78824f424e1e890c102ebcc4f208d9ffb2c542b23378abcb7c5b54af8b05ca4127412ce445e8a4fc332effa5a9290f192395afe9bd8af48b24047a9f6abd72a3b8d7f61eb651c80b05cc01309e888ba884c12eb5f8a253989e7a41322ca3aa5ace1b879cb5450d2f6a34a6464a407aed05b97e492408e67b278ddfa955e46e54014d073b8de9d9087289be3c0c89ed807922ecf0a4c13ed96532de07edc3c386bc62045ed7ce02fef2834aebb41a9b55888d13152f5f946cae37befc1451ee4a6d6c86a7a62e5d0108d74e1a88d395cba0747b145fefe1880369f3f6271756f1a8cb6bf837381ae135474544c1b733e0482f87b7985cdc2f2096c57200c6b0d21b1b8f1269bcad1f278845deeccf2b86ed89c2de733be69b42980c7b9fb1aedf1a40c0547a37014903712a18545ddfda093c5df6b6f6992840dee49fe467307da2fcf49f04f017226a96b010c70dadef1f40a45f3bf2296f8ca9d325e45b4e2fc670a177ba9d47282284314435ec56e0aab2b05352ee2bff35ee153f981bd4ee38be94ca34d2b3f5d5184bfe4cf41a39f53c2727571e2f0df17087436df1a9661c129bf9277f6d9685e313068dfcb535d19b4b1b64e1d4e09c48823b54c27a9e899fc9b1a07225f1830ab9d2f5be82447e8fe17cb542aa7d5334e48d3d8ec90dceed0b589c31ec76a0dae819107746a69a61316e7cdc0d4cf6602e0875fa87922f40366a6aec0250b1174ebbfa6b8b9df1459fa75a93a2fc4bc88063f72ac1617109b856df285ef4e6d1c0881b766de1a09c025c0caaffc392e01cad562c5d70318a9f95cbc815d17c56c8bca8620f6abc83c8e55f176ed4df53eac51604aa9cd094da05cf8055d93cad510a2c9ee990f71d772e43eb9273d6e14a875ebf7a72487b4a11a835403ba63fce783a03fbed8eaa1f10e47d68c258c6972e75988b546d6b1411e431c561929e179761cf80cffd96f8c5f54b1f698fce9a4afdd2566dbf87d7f45f43cec256f2fcab39d094fc67b02886d760d8eaf565ec3b083b57f39c96523550412694e4c1e53f892464c6a3d552a5b9cdef81203588692cc4612ef30f8beb4f1fa6b67e4f8a133f1471f410bec5e608143394c3898f285e0141bc41e31f84d10f10256da9ed8dcf11ed87969cba46087fd854b86be94c228c900b2de0be368e6df19146070c7f5b4db5ce88a602c89a398c228f30936eb602f6608b1ff2668ba1b267f5cc786265f588eb787179c581aef116424f178a299298c0206e13d3b4f05174707c44b3efdb5690d9993a872901d4152bef72c7228f29e5bd0eac1efd1b452aee4786cdc492fac300f34274b42f355cd1553b1360670b92a2622e556d7759bc794dc086b31161e0a2d10e076b5154d887822fd43806fba54e52f6ab9d0dc62b0fa64c641813a3365f2e8b623356ff36fd705bec100bdfbb77ee0a79901c05f5e094aa32fa8f3f5672366a7c2a3aae3686c9adaf069175d14d42fc55b47749d3d1b487f54971cb8ae5775f36e43c0e5b9024cc0ed12882fc50d2f48d0de1e4af298e2daba713f65c5346f5e9e3704d6b6318ac04c1b0b91f0063cd35451e23114884215cbaa3135debf6b7272311f2790497b354a676e4de1b08e345f599087c17e4a71a56cadc25b9a6f66917539c744f91cc19ef351b58dbc61ccc421b636a2193013cc021514757738762e152a100cb283e05b47385856251f45c3e3475fafaf6c035a547b744ef6e5282499facfed5e223f51a78ac4792b8e51178acb8c16329e48ba850d21664058e78ff10be9ea927ebf60af71bb220915db6b81685b6354f1d5648177201f238d87fd1e0b1053d2f23321fd15a8913cb71714622097ffaf61d024a5a922a2977712f0baebe6faa24551ff30f521d72eeb069e1e0312249a4440f49a8d1808e8da29add2814fd915eec31604593ec3589249bfa856cb79c29bf77896cafc376ecc0bec896fdc8a6793a45538b5d9fc2e402a1b07679a07144322b2fd9f41ee475abbe64a58efb3127627c59f5600c1dc463035c7fe50bade1b429bf6b8bfd3857393d36db5940b506f2b756be86569fb685464ab02f149a3bb04d0aa1ad338751a587b36b25a232c7258c7cebe116366c0e90f3853d657dd173daf498f5926835d2a6c4720c0892b716316145da947b68147549456375f25d670fa23950899075e2e118633159fa91c359871c5d9636a5b2b4786207ca57a7e9ec38fc964d2d1a5d0be497ee1e7395fa96194d98bea6b5174b550530ab70367d3842409c4de180cc0e7c16089f5ab8df4f568d7838c0b1e71e51efeeb074c5d2ffce7c87cdd2d11599f37ccb40bb13b0cc41ed3c52fde91570d03062dbf50d36caa402f685dd218029b3f1e615b2fc329bac1beb0544ced457c62b233283f92a8f4cdfb7216e28eab8fae0a7c8554601866970e2c7708428bca5380048633cabdd02ef6bf8f1988cf41c75f9980d51a1e03fc54c914217e1dca6485d48898cf319620bce8d89b4489a2407f51f17863d18f238105a24d561860062a0444f0f32ca3ec32295831382f6d55fb3d854844b11da65629b338a844101c0d640c37b6106e94ebd445c7f4e876b55345886f5005b5e161e63c5d96073af0534d5c07125c22665edfdc94825ce60de300564658ddcd9bebdff82d50011808d6ba815afccb9aab01ff0ef440442d55a749275dcf1342d3df3823b022a8a0ac54d7824e1093d7a1e15c02a057fb2e6df4b1b7ce19722cc7794526554e4b3a6cce9bb427a000d60baf89923de57ce574c2c4efc55596e6fc6b9e4bc9d7a2b7c726bcab3a470a8e286dae8bab366c22d4a76ba1a210eb5bbdbd5a46504edf2f1a6339650e7d5a6d7a724cd296c5d6369df26165ad72a984c0bec4403e6370373a8976c4943237ba2e82e528aabab3aa5c52bfc48c501d3f27956ec2586e434452f07aec416843aa9e2bc84098746910e578dbe40bb95dc5c822bf613ff930f7e179c237b0462093a8503f7c96fa3ef7410bd4e7ab79c5cd0ce0b46ae3b2ff33146fb884f53916d87fb4ba132216e6f4bb18f982af4a0aec448598273cebb0cb178eb310e3a5f26c024e49f7a8c4d1ed3e682cda8c648cafb858fd57bcab05e0ebbbcd4141977e6912bc79de099edc87044f17aeaaf779049a87639701912f66c8b5da59309e9067e009af38b3e536ff7eaf69e9ede4418a86401b6d8f38e7b47efdacebea9c25952e1c4135d9b3f0734738bc5a6758a57bb588dc8b7cd28b7ae1b3ff2c0cc026fcbe7465a2221b9faf7f6ecbf61c00126f52ce10737a9011f14221491315f8447b645d16794f7c6d4ff68990878bd1e8eec279365129c5a7579262fa3bdb81b5b69528ecc0943afeb3b7cb20758a67b75406f6e7c9d60ac5ece6dc233cdcd2c8c56524960562048717a3b248a46b22b4e783ccf52323c3cbec3027f6107116ef0214e10ece9402195f11c3395fb352aaad2d62dc2617526b6ee0f9e29b41b2ce52c9e124641aad1d3c4288fc2f1843c982099117ee23ac463aedfb52f2b8f61801e73c2c27d44a3618b21c4a4e530d9e8ab3bae4ddd143688066a6a4d7adf9f520f39b5993a8d94a3a89e43d6324cf655b6b4d8509a5176729764f877cf1ffea69ccf0fd6815ddfae4cbd29e9103d8bd30beb6136ce00a1665fdf3be55e49912366a32399a5efaab6c587554763b8d4379c8b70b2c07580cfc0974e96d3616f00fa2ad94c070ffc9dbaec0177fa23f52759ce0e87672fcf170b7e30ef5ab8e2a42da4509988ca299d47314080eff57ee0f101183c15860e08a8066e9776ee32e92bf0010e0f3740bec780bae907728217e95bbf1284c0ccb59978c903814a63519cc7af7e04910eab9d98fbc4d646c26d824f1a8e1af4f718b19f560ec1e016141224e2a8b4d2dfc52f9380a80870c1d404b8929fd9b1405451278f7c9d77ef12a0cf2369a0be12903c8ff66c8b4f0b438c49c176eb2aa7af97736a1ef2ef294c26247d0d196e308208d29756b4d3a35c8a510039b40e09a3ccac0efbafc27ce837d4e1bfec66f0cde0e6b99f23f8130b5d0a5751fb5411d6d1d397c42efe47050b8f190068639163fa5264015660078c93c9c9c3f5e56925d114eca5b57fa67a6c926fd82f88656f4b35a5c3da076069127caf6ca95f77044ef9ec07a85e3ab6aac754b9ed6966c66ccc71a243a652b7c66bde02414f53f7b528c9b9f01a785994e727ff05a3809da7ffd1c6c3c6d4b583bc26d70004561223c7af879968ac85df7c93b1e53ee52029cf901c6e14e5d3a52aa2996049383d037d2d07126ccf9becfd2308b32c35467bd18e1617409970b72b880150fba4076f71786ea3b4ce40eba869fd6088ab53b7fdc96449c177990b5a9c1decd7053a837d8c87a0bb49a6293acb463a5cce388b2e38075c314eaa0061a8020d44240caca186f9315662682411b1577f7ce2fcd43a80f33b4576d04c05e4a16fb7be45956d7246e4d10132853544dfaf09a71e25c18a0d5d4c835d5655abefad1714f4cb10125ab457d9cc12032c1e92485a1241c32ca587c50b7ed5116b69a08b770f35a902816d741339dc9c031b443d127784e07323aa1da309118e4e9b2c3660bcc0fe7913988e55c539564a7f699daddbc727252ead6386486c1a9bef6b00f18428d6c5608e3dedecaedac8086ab36429ba041d460e10231e49651c9742abc345a6107bc69504e84462354bea10a6d9de6c024772a8e08f431c6771df412bb06859db227cb280b89f17af8b8740a6edb45eb650096caf03664696748ab3a0700b4b5a8b4ccdc283c21a08ea67066b23b643447b71104d88efcf3693e77efe8f04d780fb097bf16aac0a23acce442bfdc824f1646275a8dda968758e48e90cd0af592fc37a825a7609505ee05010732340b10d13348c5a421f81103aef5c335aa721a1db64c0beeb42b1fe5f438f5d9949930e05e2a40557aba9f5d3abdabcc463012c89607ab720302f8153709de5957e285f8e9422ae8e30028909160c20cd8cec2dd8b4014a95781a294b0fcc0d142b54857124c32698a3bfff7f965056be2311e53a16cb6e8c233fbf5a2bc66dcb5326c07da0edf78b1874f19b736f53e9410068961533550788cfc87c8724e38f7a25bbe171c588f3898d81c36261c4581b7228d98511fbe39a3b64927c36481243e52fb0da70e585307ad78876ca76b5ba759900849e0474fc4b594df437a61e9151623766d2918a1be4f1f74c75a1b5f58d35600a21bab3ddb745e4b4c39db785dd9903828ae80be23dfeae537e5e19a4dc0acfd2d6887e7e4d933ba3608d6a3a24479ad9b11047d6b5c5d153bdcb972ce0e1641f35220fa5f7e0f8a436a260e16500c76cb00fca76b80dd80ac4196b6b3f554b8f6ca0b565a45c983d9c9121633755b777c2cffbd56367647028b34281c09f9b5df33671867f9aec06854df44dcac1a33294b82041f4183256c6a4a0a8df27d84cbc44cbb3aa8041cfb8fe52304867adeb19871bb82eccaff4b6717c958e3504414780f553da3f8f4b33ec5d51181cf388c35d15ab5febd4fdb4db4c4b37437c06fab506ac7ca34b185da30c4b001d9d5771937f12f9383d51394b14f56bad0b0478ecd7958d956f34b7bb0c65528757750bb88b22c0043232e888e574ad8b1224ca9a19956c2b99e07d4462dec6bf4df5fecdb83f3ea0bfade4ce641ed727b557c7ac401eca065a180868ca57db9c019801f9afb6b1e20271d3c1feafedcbd898659ceed50d199f6e471b1cb6ad903fa5a1c55202dfac7cfa9e140854e2ef5a7f0144a8a9cbf93874e40fb3032e5b2b33d9d3e78bef89190679c484826fe062aa72cadafaf44e8369481da0b0a44ca19de851b209507d29c767bb51494a01e0803176535ec891168e95b816746df80243b7b49c75f7ab2555afb1d2d889f8a051beb17f7d474dd43b10245928daf6cba7087a1b781fff1dec965a94a44938b574ec19a75bd64141f71a74bbc433317674c4c64ecd1d9729362fb04f306d04c6386057b3f227a00271d95505acfc170782517069f8922f13816fcf0f263e010256785bdaae22b22bea105704d6b6796044fcdabc16d050accdeb59206a0b0a92a0f151e86bfed5b1ee8aa68c75f3406b584c0a3542175b1562bc8ea36034ce33e1a6509caa22ba7f04e7a850f412c8b23e1cba57366a2e40e3e80719b129a61a2efc007200b620019e701c1dc78247a105cfef16a755854ba1eb517200b2c1e4a8fe2903734e1cf6d004b9a5faf95e37d49930b903c0c54d9bc809baf209500a60f6868f28925820b1e7e5876e6841400ade5a9fe4d7892ed7e8104d8cfff1ed3d5f0c62db63c71a8321a5f2bd6dd7c04ecc4174d70186f3d5631bb2a8475bbe1608d210cf6fb03427a2e6a3ea63b35dad82cc2ffa7fd8201d66cb5577b6abcf0549c6b6b698be4acd76655d6b5998f89fb5fab1ab75cee96e52f8ad63dee21d249486e3d119e5813dc9df9ace9587b067d100a469031984d4e273240febc645dda2e2ba6674d12be7bad928bb3981f1edadc2343b1960454944ed5a054ba03808c93b6778ae93de728ad4a91730b2c5d991fa23db650e580797c3d673f2be260207b21fa040ab9faebacf61f08d25ccca7311f6538108dd6ce3f5fee06cde546cefd9aa7b63c487c512f78216f2d20c704af28a7c46215b300a4812d8053a04455da874b4b351b00bd442edbfa2b75ca9efecdbc284bd85b19bd44884d9f237eaf85f4d5bb5f81a58af206a629fff6c292e67ae78dbe306cbff3c0acedb597e27210afc927d474c07a2d60fbf2ad05329f08ae42323e56057a9a2da303685c49d65eb100e6bacad794149ebf04ca5d93707493ec9727a1874213c56cf3f410bff8806d42f087222720602272d133dc9439a217c9a56c75740761b70867597def24d2776c52fd2060b9d453bdc5db07c4ea3d42e0f7802c7b2e6554b4ba7434a6cadbe26d74a0798ba00c2679188177b1f1aac9b545e854caffc4063be12d25c7dcda2530078af437523696f5d200dda549c2bc8038856acb96136bf322d6cd4c4487c9f565b8352de8e05b301ce6c2a98ece2c81fa0171b728115f6f0cd592447069c980eb94c0ac175042ec5b155d85a4cf0bbde51ef0a48ae6bdd73b936acd638fffec5b94b141bf6af11e31509cfc63e4b9184ca36b15a8cf86f753b21d08216457a21b3e8b0fe55ff44378a1f86248e475c91a9a91de2a149a1e96a03fc258bb75814336661a699d202d82c6d057981c52d6675803b89f20608f9b530ecbad3dd106c000cedd5ef69dd420590e40d5124f988bccb677b822b5d86bdace746d98a49ef213e4d1a7e05853861ef1f80e7c057cf721dd9e9325a3d8073f5c81039c2073cddd3619ad78a1703a34f0c8ec713a8c2d43508ddea23c0cf3faa40fdac49fd9d6ce4ffdb7642cea4bf1f5dfebbb539d080aaf18677236afae2df47a58d1d26ea264e60cd114328132cc5e2d3d95d512fa50bdb376f810877d6887aa23603c13d368ea9dc00b3cba0b131492879b8021deb84cdc896b854d085b68f5cf0b2c43b5485199a24f8da657b6e830f8e2838b1d40d5a440dbb9779c1d56c4dc01e4a577d45a82c2367375d1385ac1156a7e1a72d719272f8b65507aba63bcea918b399134be404ded7fc6eedc27d6bbf312a5e54ed1bd02caeccf768a2df4e97720080c44b7e0f0018143f2f0bb7a82112241abfd812469f2090a442f92edaa76ef6e54b3f318860cbb8c02fd19b91003f4d9506b0f1f45258511baebcf91f3bc4633046b25e37f4857e84ac4ecfac1307299fc2f1131a2d566b2ef1bc3359cdd64319fccb7cb1398bc0b82cc9045d452f85870962491227caa7f35b0c7647fc54012f3ddc97cdd3c214ab8b1e8bce89f214e60a89566d7abe705cf770684c2354c6ce7b7ad871704de6db38cf6043a4b25d7297a192013adf136b58a698d7f96616b25fbcc225a1cd3d81efebf5810af97cbd011ce67a968f691f3f9bd724fa40b801e45f3925bd41dfd290e1255b3841b35c8414c0b7ebdda2dfcd0bba1d61f77113091f4616985264e2a9f41c1bb613a6cb31066f957eafb88bdf04d7a29758ca4828c780a2f7418d04fb6585acf8370cacd56f4c1863906576a617e1494e914b8b8aae5bb30bcdab544f71622dd53586cfc0c071751f18fbfb678dd75d49daaf112eb45a383f732a725e808022f25c6ebe394556c74d05cd4a13802e72c7c2ec944903ab45d2f7166a7e8528fefe29731c12ac4ea11ba3a1f2e8e91cb4d641f2d2a324e1ce2070b8185483c740015f3319b80d019833a6f6816a1480200bf3a9c0b7e84fcc9ce3a570613291ec665f80eb22877813459bcf886f02b0566c3462ec19de62888a1525a6aee3d62408a8ca75192f0ab23942f44a954704ab139480adc4103db8780e95a4574cb7ac60fc58758a78c6494474ded7104b44c5a8f3f5299c0e623b53efc1144948443aa408f2fd0c904cf292a1be54efa122d652cab40ef71837b8e74e36a29456b06c41f094f9ae818e4eee11f07feb9644c68dec00574ebda37d50014e880a7985f1761115c7520a2e22f3d5399619816330c54f69308215439cce3abf28d0f27e1a849e8cb168100e476c6ec753dc87350a846a4af45d9c4e63286b6c91546123f0f29c978aa30ef8701746d3f799da89c87a1e20bc08dec9e806648ef9b75b29f756f00c520612f31a3fc5cf3d093ad707203da89014accf2a61d42011f17a0253428c175e37a15577b81596590406d0b5dba90a852e8e51b6aead060ccf00560d6afddcc68d6b2d8faaa5ed75c57632be5f6900c7aee3bc74fdc6a0155014911cb38f9bdc27fd96798eb6f60d671808d8146edb865b15e9192e06eb31e3e55464a84c727596f32580a21ef823c15015aa929c8cd547a907c3e3e0fbf26f3bc765cb44f59aa525b3c1178dbc16e6363e084c29c6d803414473945ad7d21dd8114d5aef5d70cf8d2c19930320b9305cb3edda07795340ddcebda2e82fb05d348ad5e9de627f35a9ded2b2d1e834b79930de3d3a6794e0297ee5cfddce9d99310d2965e969d7c25e275ad0f022e55c6071bd16977157db00466f9d67e8354d7debd100e02c971f5feb087d3b0775b2056d50c3cbd011d6530b14e0c64af518272df8460be93fd639b7e0cdbabc1db45f66542a4d96afe7467bbaad53f1effb63d4501917d62acb144bf12b1a090654007194887a993d33d73ed22ca8b7bb1df346ad92a52f3294b93456783de982356534be4aa145fc2314ce73b2ef35dd37ce3a17d37bcd1b739f4ad54604d7db24b06f6ae580c97d50aff477a05044efc7815dc4ad65ef74a04e7fa1e375c098530799cec9fb0182089023ba76ddef5a22ab1617ca6edf04619747f7327f512ffde5c8bf57c38712fedf2259fc9c9647872ef3a6b4400b13c8df11b705c7a853790674669f8e62c0b6088c8db410386079c8b44f5913bb70d785ea4460e153b8683749d8eca9810cb1b964d025464212c830ef7f22059815b907dca5cee8b06c8453d93d4df21a0db735bef49e7f3cb6af3b01cec2b02410d1b3b05c0c509daffeac3ffce8728a77706cbb595c88ec0390dc1e089d0708205d510e69ca3eb7aa27006b8e1d29b48ac297e03792eb0c3b73a45ed2a639c3f23e68e00353a9e64dd204f5c3da13d292b8fde175cb944ab1a77c1385ae11c305c547cca9776374ddf7daadb1acb1b137acf4ade9496ff03c2477d6638dbdc68ebd71a5b7863ee836bdff920f9df2fd3ba503597c48bc406e6260b35089b69587076c86a67f2757d8fb00d8006719031f54ea0bf0b7c426a3fc00a1e0bf6d015ac0fddf467aa46740c88b173ee96dc6bfa0a880407f765e261d383c10f2d19dbacc129002deb50e99d9b48607f5cce7ba1044d66158029d940c11476887b618a1d45814adae7bb38a1df9d207d276b5a0c858647a8c6466ff9de20cca481f57858f1429b540465888477cec1ce9f2e093fc2931213a50691615c0a268b5f622c64095a26a6821ea3408faf44f153495f68b8da02453232129409304b0f484e873277d8f447ff65d1269efc79ffb302f44f48ee342136b725c92bd98ac8db7027a19184d666865afc0fe0836f983a3608ad8ce568a1cb819d71ad7159b222eb0d4be1d1085adb9ed5ea371aeb92832db1402ccc46736e88faf6b142798cf79a0ea93eb8ca2e3b41674fe8245d272ed751b33a99f58bffb7ccacbc0f5b545bec146e72ecb512a6e76aa6cce5050b916a0b2fd7394b2ec94919ada6f04a79361f98852692075eb310f2cdacb84ec04385033e1fe3c00b753ff66b171677df3a2e633d0ba98964d707b01d173d81e898afba032c79e66bfe269ea8f932124526c4bae8369fe2be4ca1e39404817461755a228b1aa85c48251f1d53c3f0742712e5fd01524ff0531c988046a5021088110c2069565544dd0df7d6867151cf6e75e13225a6c64c46c0632d40bd21c979af21909dedf15001eaa66727330799d74253eaf86637c1e9d918649150ebf0b97ea905db40e46d98b588942f0e1d730179ad2aff7afe41ba07e3304efb75c7662bc348c1fb7dee1ef2fbcb45737b500536eb18cc10c44c12c1e18ae07c08439686deb451b03e9a70796a230db4b6bf017eb716bb19f75ce0fc7ebf26f8cd4ab960253312542b4c9834792820c2f42aa19bb419dc623e4b1d22a4c3bbf3ce3698c9421a8de4595c4a4e620e9ef76a10cc3c721cc858c4f0e70114e18fa20c018ed998fdbbecd9d0d4538c330f106db98f66239ef37b845e830a639594eb947a2e1d57d0e9aaac420adea9dc2137a48e87e3666a06c31c8a22d9549d1ae5fab4f1d30c843538490ccb78dad8b4aa75d440a43283d8a0629614b3531bb01c51339151290a3e16ade94bbfe8fa7187a3e1ea07a1f93aab294cd6efa3d1612d8d3a82941681170068d8264e9f54b2c8af9d45320ebbacb1ed952f00a57969e645ee07614ef1420ce1bcb5d3a965a6551cb0165df98c606692cc5a405b5fb104c24842e4072ba260f3480121467fcf1915c83014f581d6420de9e9725e4761ef502d166b30a2f086945b8cd9399044a4ba36e83b895f5b0901fad6d7281dc0535801f6611bc814c2106211c23ae32d221a8d35ea3f39a5526c4733f08d7de0ab1e95dd3ba85e702ae4e3a483e785a8999454e24f7730c15976d3b5270ae03e18d0cd6a10e83b6cf363e446c0a9c211d90a32d25fc86534ab2e83763e30b3b66772475a14d2abd94b1a90432bec57d8bfeec9a1384045aeb52d7aa0ee02d8a4a48aa0bd1127fd99ac6e0d7cde979b88e37d28d00d3d39e3f89a16d0df82ba5b1a5bde5d3ff204814dab4e97f4bd12267aa5044d3aad45c9520b2649daf6a5c5a5b5ad0080732c04e8747e41e8346f807fe8ebe8962980928e837806c9a47bc59140803e6e8190a85693bcf3d2b01a8f02ea9dd90c444f67f7cf1deb060a862c850266bd0ff7b07e250146f4d056a92a891cb66a2952d270157b10a9f1a593e902056018063cfbbbb35c2892938d9ec00c8cfb8a3c94d88a98b1eddc3c81246de0b657845b73b2aaa001ca2651308224128d36619c83294c3ac3eb8712b4a69f8705681d85f96bdf8288d8ea933d6a75920ef1b1b70e236cc2cfe314a49d95755e2b87cff3359e8c61bb38bc950fe2624663cd3919ce67e605f29ac8a1afa9b82d94776e9a8278fdc07b27add6c3c885b54c28359514108e22623d1e80765a889683f040f2866ac05765ccafd7639749ada3687c0752acdc7bc554d03ff14a17a218f0878ff8750ab743a2e4f0c551acbc52fd4acfb5e8994686fc418bed81cadeb3bd70e2a4f844164ed1c1bb589984759c4eb11863e6f7e3d7982b7d5b2673e748b6b2be6b1aba39bb7339f6dd4a52cf5e6a1ce4d37dfc25d80732bbf65295da4c19345c0273f30ca3e3593e65d20bb47ca1db30267920ad7fac15d8b9d22f661b6cb465b7e7114844df3ded5a402bc7ccfb669b6b764dfa2b0bbf67813d06e7546486b79770f78786899fa2c6bffd61d544074460e430265dcf02c979fcca000f617c0abab82c0c7cd1efce75a9b4aa84081915a699f4282651d0420f9fa1c4270e4b11c14c22f6e515fba1ea4d02177e72805d27db1a76988995a4d6f51dd4b078143e349885070206f4103f500ac961cccbd5d0d8003af1c82e8b72e2de0f8fd0e723db041bbe7ecd4327edba82e35ca6c8399a8c9d850f2482a3a90ebe497eb7b8c38a3573376d5a282595eb2334e8d597dba3e1a8f203a2dc23cb118319b3c475efd536dd5c53faa9939e78a256885747d6b9f70288488bc48a1e0edfa34b7a56c72a1e7cecad3c74a42cc3a63ea1ff099282f12b5e068c5f5b7e8a85b4eeb23c77437fd9229f3b6ab5d50241eac154589c12eeb4f9011e37103357a08745c649542ec02874bf50c09d2184f8dac7674d804802458fb94d50cb64b55777985c0102e83d3979edf2e4aa9046b7c59e14842810972e81e885f10770824bf0f1aaba8ee9f4c744a553f9f5ebcdd9ea2b09cb8bd0ebd6df3497d707e864b9cd0c4268773b2d62e0c7c777188ba75651615e15201bb559dea50144c3dbca89fae2c6326e64b7492e145aae83c64f95b36043be092a4ee88d33d74256103472a9eca72804f9e6aedf1925173043b1999ed40199aa284d2bdbd30c56c82ab6c35c7e86a6632d7e6499badd121f5da5e87d85d6a5f8a3c625b2516c4c37e01bd33c94ebea8f0b42db1a8187da01769321c0cda90360f888070a7390c88a5f2ab001141666f19aac3aaef438464b601802633044f7c480b9b6eae5d1d146d8fc1c702320ef6f93511539b80d02d20810908c73fa767e3adcdc13ec7d11ded28f1fe6d1bd063deaec2d1aa52f13d641b1efee4c6bf4f230911f75a8692a4cf10de301ba022f36c28a0f04283fade53a041faf2afc48c85c201f5da12a22a327bd8a41e8118d8771c07a5898615d965197dac3f5abd6f1b561f0e89a1deafefbdc42d6abe35af0a6fdd192824a5f8c7e2cb3e657059be3b8a7ee51d2200b3aeba496bcf1d8365f7a1a99583c88432e95259687d5e224aa1053ab1626831c7d9649fce48beeda9435bd3d2861d9c239fda7f3dd902d6707bef9c6dbedf38e58c5a3bc719ea3993100d382bfc2b69ae4ff22a1b8d935ec4c76fc0ff6ded9edd898ac97af8efb6bd52532f867cce7eeb572dafc4213500b1d5f3f6a76a3e286757812a877d5f8571cdd1146ec2050d6924b69f5e1b71d39268b9661426bde027d7926cda738dc2c66c8acf393aedf1bd2cfa795ea7bdaeb3511dee6934dff13ad5e775f8e6bbaea6788e4f4b78dfd135aff374b6afb35be5718e4e797c3e837faeb7af3b4abd277dde06afaa764e9525d0cc66c8850815cdfa0c9f91d4bd4e650945617f9b14e0390936c76973ed3f450c8260623d2c8c59e346f7ae703bfaaf4e250fe0b7893f7bda258ca9a548cb7e553d5a07a126408fb9d7b3bdb5c21d44b2bdf6973981f8a743e5b5c9390f02f49e45c4fac611d50c1ad8e6c63d932794381fc1fde98d1a3ba89bb2fe86bec18d8b1148517f3f67d70baeacf95f2822a516fa6d98d4a9ca5d59a0298c8c7d7b9d641f0546de6d7ef76e5691b0847c9cfb3f34b04fac830a71366fb0609940b4b5d2e81bfc8ee55c111a0f61531d956e5f46fc75c4c6841f91fc84e1c4a63a46273d8d5f52691b891609c5f60a9d20d6eb98c73cfb6871e951fefc095c9032cdf6faeea68163b17556717470c59187cb0eb310bb8b6288b81ab978584c48011507f351f4849fb3adc36724c980176b61b62466bce817f6bf50f21b2313f9e0eaa52fa8f8a797fc08b102772460397c634926015f01d86b53ca344dc2cacb1029df2924aa7b9e429ee768dc230703a43b9b164064610d2cffa3730ea7907b5e530631286e84b5819c4d5cd0953897156e83b52fb0d3cdf2fe2d0578912caf5d86322a45324f102095c94c423737f99e89a984029b4f9bd21924e2a1248bac6156fc2e4df569309faad396b616088d593b8787401e62be46237bedf5e2b26df8058e504407012bb384206b9105cb2f5c63e82ea77122950e284f7d6d649480237c0efa190ed910fb51fb57070e3a78459580a118a5b98b002dbbb9aa7e7ba4f3d4a7cd0161c87e837fe04d61ae64836338d461353ba9e2656d9f9d56f0e1c5550ff7a1354d31858982b80d85786d61924031ecadd978e59bbfd6fbd6b1dbb33b30d032296e7b533c26f1ae8e6fb6684a140a85951d9130c93a335b2fee997c1497b0ce52a8eeac2af11c540a444534869c81da2148fe9e8a12bec30cb323cacb232047b5840b29e011322eb1f19166715520a9380fb0a0117675273096039d8adf2119f2704487686a8f644b1df6ee46bdd5f5418c222b435249ab5d5410a12ef2bf568c6880585ded574bc85f3d986e7540afe30507999ac00475a2d7b7f8ad609ddf034e2221458d0e0c84053066c68818d0b4f95b4780fc664efe6fcd56989391267cf6593bb67566c39265c9b03b8e9ca8dc8a4be2663434bdfd6444de70345f4ac6e829a2075718bb3ea7d90e366d5b410da5cfcc4355daeeffe5659540b41ecc43461717dd9d36972e5b93257be7e158c85b8663c8283cf2854990020203e950f29941fc43aca4cb681973c11f9100e32508138150dd6a22393282f0f1b465b42d6d7bc2214ac306ed27542c8f7e00ad29219a4024af34965e045f2a65a608ad53bbc8a473ef3e5512b1babe14b55e7c74e2e4118a1b92a7c7e8cc29a0ca6e64c44302bdafcd26595ede8007755183d020ec405f3b64057cfc5a05aa40d21628afb886feda0606da5db3d8d4ec8dc8041d47ab2ec7942b5e209bff2a98a67a215ba014da10296eafbbf495b8277efc79ae1204335280f2565eb95dc735c875ef2594bb94ffd5ece6bf8d2a98afc81d4e4bf95fca12f97911a2e558651ab49b386d3f9ac8054d34e15e14c29248c8216043edb653dc19393cc5697651eef047ea0bb6cc6db3827ff2130b70ae15d63ae1c6c56499cb40ea4f554698597ba2ddae1f36be52cbdd3d9934c6ad640a0cf0ba560784639bbbd5e0a209b04e3d3372c1c10266e467bfab136567f323cdedc42ad40eab8e69dd791da003936b3258f3312eb66ec8a6dd7f041666ebee7423e0d1e147f56c53b8ce4951dd3070a5e03bb94696f0e6d9ae454bd032793450b4d42d26acce229b023da549f646039c5e5e5b047623070b2861937f1e99126bd2879aa6bd47721f8fc8887b0e570c6bad865ba963ac4ba84063160be260d4855deff614d2ad30557cf1c85ea6302d21a0d54da37ab60673696c6065147546152c080eb82a15600d1c54ed9b59b35e6f2532c12c69cff3dd79073e6c8b4a0e4983375066681de116a93277cba91b98209c808610a251997bc189088bea683d0749d1728b078fe2e5bfbb8ba64d4c0561595dd095919522d51031c1efe012116d481dee74cf72b479b183ee443175c81868efc9a54acc17835a1d09a288b5be7b5e00d7ae588d2a977e4a8857eb5c51a8e562de2e0252751e0a8bf787e002091bbf739b67eac852d8f44264b5b720c26802bf634b847af926e2ccfa1b441df1d94cfa05d4140937e58753bb35baaa05d926da32a84b20459b409bbd1fbcbe38fbb798f2f45124502d33bacf06ade9f2d82ec5f3da45aa0613a106f76231673f11394fa346b95380a9ffc790370a0e1bc46faacd06050ffe0dd464f3c5f629640cb17232430b5af3573b4e16fa6e7fd1094a5ac91a973466803aa2447a32aa4c7c9270159a3b9567b5fd7dfd6f32e19d9dda88c97988a74e57b8cce8b9f2dbb13c4d96f9f3edbebf45bd2f15470da46c0b660e8b030e228d483dc08b43d251a2fad6ba0e9cc6f3e746552827aa10b1e85ae3146fb61cc15a17cc8b43158c1f3c2d7d345b0c6a624f54ad6b2e9ec20c4dcdfcd41b07a82dd8c3d3b6df2070b76d18bc72625fdcfa62449f2c9b9915e24eaa5d03ea3e0aed02e928d3adf7d6e8d0a12937a97ebaddb74146535ae5b268859da870cde762fdc09d5b3309603d31a3944361f815a96c91a98718d1e807f2a5e2b04c07e209663a68a2a6ff64ef0c78829c406c67496a6ab2dc10105419a72e3ee97a393c454507c200679c63974e997580d99e6929aa1200f708f93182fe061592002d04fa81b3509eae1565774f9f46fa6f6c0771021a1eaab22edc46cb78d3d082a0dd6dbeb6cd7174f40425093de41b4f3a8c0d6aa5445b3dd875c5169c3e558518162b34e479e3d43fb9cee751dec0b30121fe221a72f4baf0bf44af72f415ef1ed6965cf8c9e1d2cdf4ef4f3c50c81a1bbb6fc9b66e0c5aaa99b08d9d22459ceda297a230df294451565652f22127d2c144600c21598aa8c2696772f19b70a1af95a140a16438678a53a0592e2db4bf2a84909d4328e4319723f32101872d01c2dbfde726683520f1541ab81151cac2e9be00c25e0bc5c2b37246e23681d1f3847dbf3abee123402308f4f19df891a73740f344afa20ec6bae1713b140612503f62917645e80ef0d8d1d996705ba80507e93df258ab3d3edb6a7c2803adb0199ebfde53dd59a38a0ae07c2b0cc67bfc3352eae248a87e824e31483b5b0b850f0bf9c6d25df5b1edadf19e201e24c5f70d7fa58e6a54d6d2ca9f2d7857e3f2dfb1d0e0143048c62b2a61450db359b349fa357d974d38fbbb518885313ee31d34ffceeb9a8c377948ca04eab626d5c1e4c7f508003c0c42f0473263de6d756da964786fc41ee4a6ad1762ebf77546ddb7f6d00eba8cda8ff66ab90679d4905ce000bf67e362d18cab987d150738f0efe08ef383536e37c3418d29fe34e81e801d42325e1f53e8fba091bb4a09da46d693f862201e313abe19d948f05673b4656e156e2f93fd2a721e150e89f02f692f37e176e9e4a42141e4513f1c156a9369412ee433a43f7aac8e91a7620fe770598f6a548a9ae10ffdf60380f2af9a74af2b8d487bc8bda6b4e3dced1fedf25a3a411e7ec8d56211a82e7f584491cea05ecb15fa5c1a53e4118e4331ae0ddd3fc7e31d1c2166f6f174a6a31c42ddc87bea2ec43bb6d83b9538fa4e46a1596ac995c2efc350533d17ea7a371dc73935e2534f7185dc60ca68200ae5ef1a7e4c247c19fb9f16146526c87834eb4a3a27796026a8dcc46223a4334ac2455ab2a5a083b985bc9214ee3e5d6fc7a082920ecc76876a85f81e919f817e153cb27fc4c6d34a400f65a0bd009c2b1b6125cc9a9b4de1d23ba414337806e40f8264fad15e8b9bb3d7127e6e4cb898edbda6050f9fb7256cd9180f3d466b611d2a60f5f665ca5f25cbdf25d2d6ad99f9e05395ee23d2f4c3e715400df8a33c31b56a47cfb78008c96b7e082395f2fe8662259ace94479382c6cdfc66957a153178ccc2f2ddccb5f03405065f6453b76f0f1b2d4e84107bc25c2ba0fbbe4cda14fcfdaac71d3a8f61a4335610cba88b1e70c4475d20c9cbf742544e0345bdac8d57dba0c73a74d3d5c861cdd7747ffb953bf60f087f3949b83de55085ca19214b5b4dccb306bcffe2e32b6de42a4587ffe4b2484977678a7b5716fc4d02e2cf864fc4aea171229ec599cc4e53e8b36dabb7564501000d761deae6e7284e64e99699466c641da4a8895c1139d639b6e3ca3759462c85c596bdb2bbf8b80bb1570ae31d173d810d5d0028edd81bd9c4cef9c71f08b9ee951f58f265003a18ee716fc08eca27ac7059bd0d514c22c3438163d8cb766a91e1e6721174ddc1559fb3be56c6305c24801b5eb372ecb63488bc325802ae583dd2120dd152bc746da678d9e5362020cecd8b1f2a68bfa96adb1e1fe0255ae53c2c8dfbfc401c3473809cc5f49a92d2d8915587a84de5ef395d0520cecfd5424416253fa95d4a2d90998da824b1e7558d4d7b0e6d7feebb9229a7e6d9ee7c4fbd8afb8b9f11887815eb302d2e3c1d56a0df2e94b0167731bed347e2dc5a4e046008d2d9c7524ad844d8a9b800c157d46fb9092bb987ea48e18c1c52cc8d7505619a772006afe7dc07b9b3dcedf10e98a1611ad9fe76154031de9e72daffcea6aaae41b25304e497f6b95251bf757af0f8a67b887c14e033a987f81bf9e98279c8daf77937953c07f60a0ceb51f6e81227131404af5dd5687e3ed761bbb5b940258e57923454d11748cd08819bb724ba8ffc7d79815af6fbf6d88b56407a0303b2a6464aab3441290503df63a52d401f57beb7a77ec4689f339454e89ba2c71f3066563555ae093f02c9c46f1da2d848f6645777af530243fbc712fecaf5166e49ce9e6ad6780f2b94278c3ee0367468f541365c9a47dc85af57ef4640b965530efaf125f4b53c51f59cc800d1cdb757a4fbd94eeeb1a8f5e0a006813a1e2592930c4b7e35592ee4ed415e873431e57ceeed57db7170e7b3d5eacdfb527c09012566da4af2b60c12772c02642313d8e71ae5e1fd3a193e814bda214c98a1943456623c6441c8e610562d8cf4b4202d0cb9b655fd6738d6575b8f5730c989e4442d3d4f0bbb9e3dd8ce1c0028b6a6f68c6bde7db3cfe0b7ff2df64b05ab14dd47edd89f41e20d3e9cd84bd48111b20b82875dc82fa24c58582f7fa9ab3a9a3f4f968e14edcd8f8b3de15611e2f7430b52d4311a0b2d3cbeb1fa7fe9f513068620419cf98887a16e1ddd287d2bb68df63746fbc3dfaf44e9ebd67bd54d7a792c27988d923a0b9da5b79f3199851766ffb5721834ec3e1c5e8491ce3035beaace6f8db0eb6bbacf749ff734ec954458c842c6a5586ca466102870bd26c0b305620bffa01cedf6aad7aeb1ccec89f5a01aa7143c1a6275f6193d7905b7eb6c6267f978bc8c27f4bc74b8a330b42ae15641c9b6d4b4581f642fcaa68c6dcd2352bc4e9f0a22c7a8f061dc9e9e33f055b034c3e5d8f00778e70f5dabdbe1aa39af1b7755eb34cbc8fca7974d7a3e7e90d24b02ef9c2c9c3f8f09afd874ae442b70f12990d468fa33a829c4724136a0e5a4d1d077528a1e65b9c122ef3894e034d69a08ac438f3bf42cd16feae5ac0c0a67aeebcef61da8ed9b65c52bd0e5d5fa7dc98beac6b7dc28db02cb93a6cc0b31d499e37d8a5aa9ee69928a00905fe4c68a2f5fefd6ec52df31815eb5c448a6bff54df501182d0e9451b6c6b398afb9a5b8e76987183cf32628e147a86447f1ea5cf3ea2a47f18c8dd56fdcef606b0c9b29512606327df3a2c41c6bd9b1d9b5cafd69568b8c4b96e1db58a77d8917bc88ade1267b197c780f212a02e1ad1428c6957dcceebad31c60086a3906671bd616027943885e97d296eef2ac6c34891902a245c657abb305c306ccb133379d36c5c606799a7fe47b0b0eb2332399265148c99a3062ca2701fda35c444c11d2b275939936fe5202dfba10a0a528d87efabcc46e0afec265d554735162433811a1ed32321d4a9cf952d5e44b6a0e4cd5b9e28bedb5722c6b7d1ccbbf54e711ec2cb853329b761e707d07afc74248be4491842aef35904d529c2ee323ff65bec2fcdbb0c353ef00c1fd27ac0887c9e08de3d5f541a2f40d3203eb962207716343dc9e95aed2a3c6c1e5f7b259b99ce438aa9e07e67120b24ecb4c29315d432d8fbeebc8ffa0c4f488a8db2c8a2d7cf3a6a8e85648a1b8c4c13904b5eaf917f7f6165fd15026a759fabb9ef8d8c31eced98152ad569bc973264ccc9e153baab4833b76419fcbea4fcbdeb35f3c3116eda1bba9848b339cca1e39521f6a6c471db1d56872ec41e948a24886a25a336cbe82bbc7f335fd25159b8e300662c4747cbbf01380dd26f502e7c1dc1fdfd7ebf9485f03e4e104e3e627384e8e0061f1472f0c237474f86520055d03c10f2d9c786a529943c25041485138a27367c10b0106cdb25e518e0edf929e2f4d9fd3faedad69552f9374b22cb2769c12d4525099ed2c63a9f068dbcfcc426cc8e8ffbfbf0b3bc989c6d74c0a106dd061a4321147cdb3a4abb388f52dab593feda1c2e2aa39fcd93869278fda708bb429b4cd0093532a828b72eccf316daf949af8d9c1d8b22ad41c40c43ca18eb4af4a475eaa5b823063db15f3750747acc742a1e98faf0f0465525f4939472680a5b8eaa908a3a998e5cfd089c64b38d90cae7605cdaec63798b983fd49ea39281bb1b31a450880cbe30940d3338e29f7bbed08ed05186007fed8f602ba733761f88bd65bbe27e3dd042ec6ed63957165b1f7411720070be5cb4c898841a98834b65e650197e7db48665992dd7961d61b39376a8828768200b62a5b23f37d61d15ddc456fb533fb7597c01d8c92d5e46ea23fcb9845f8143531dcc4de8243e11af46d06431f5cd4d5896e981b2c33eae8af34b6e7f785e25637b66e3a31dddb67cf52edcb1092c143b0efd6171cfeb23a882546127c583790cba9745e22dab16e51e72047713db551663c2c0953ad8ed8465fa46d05fa6bd7270f0b14b18386be4712f0b461fc1614d1e6c155ec8304e23c319cbac602c1ac2b70dcc7d674b70e4be1abd36575cc11db6b562b0f79bac4fea77e58c5261451d50fdb2ac18abf0a68009358cc078b49aeec6533871a4d4f12eb95ec8f1aff02abd5d4664407ef45b8df3b95218c3a4a003cf27353b7ed47abe04161138efe7e6339363dbc337796a14e619de8b42585861ae58efa02a8977d882a6fc993cc43d615a58f3f5d156858766cb90bebc6f001b51607dc0c24c62bb2527daa6073baef840884aec26cd4725127c49eef0aa26e63bd01529b40c0211a9c1881140ee8ac49fd727e011dde90247e14229e7ef965ae081f4060b3c2b5daeb7e1720036a168b6146e353a907fc1bcc57db2c9095101b695c1f729219734e0e72e366b1dd092739798efb4213e463a206c48f37bf92ddc40be211413751b5058a519974d008ae231fc3c6cf1cf0cb6aae63dd7291a45aecfff8665d2cbbd45b0e0cc4c84baa37f23d9341a665f10d21552977cf16111140314f22682b80858244115eb6f408caefffbca255e149b942abacd162d550a1f0e5cc866b480e4b4b20fae002246ae3337c12bbbe3db7e53d601f68b42154dfeb74f9c5928bd648e1a6a6e6c537eee9807069d62b81beb89c6aaa5d164ad8a63541d0e54198292cfc76dcc3ae6880244b43548874674fe6d2bda921a628f74081a94e67bd673a871b01437889b403a6c3d58fbc9d09e07bd1c5957d3b8c2547a4686075b3769964ba398bd2fcd6e39d06d9eea61e2f0a10bc3295b632591ea02df9db23e08f77a4b1a88da1824b1faec5fed44569f109d279f63fef17184d52920499204e90ee95afc24d7e55e9d89dfa31810ac3fb78888d4e73028a4d25ca47b1171e22f18142b6e8610ca6a2c933d87b623be4d8620df2bcac0ea517b18b01c9bc664b2dc283eb37afdd355dc939bcf672b7381714f21c08292876a5a7ca2111152f81b86c29bb4b975e289592ac86d141d0836c160f1c9615d7cd21dc51768ccaabea8257c8516b136d3caa4882a36a1d1c252b932409204efcc6e2f0e4755ad683dfb77df3d3e56868595588ef9506dd7cf3bf86e5c0147c1179d151927783b7166da66703be13df2a7b1446d1e95786ee9f0eaa7194ec114d94ca9573c5d15d422ce2998916674b326cff8babaeab3f51215e3f4ce8ea10e02ecf59466bfbd48401f1c260d4dccc689541616c5ba09f581587ec1810134df02f778e827e517bdc0536b9470c4a0e5f67b4ab9aa01e28d14cacb21b8120847e2a6340191aebbc2614ac1d726a4218e298ad19f97fe04899ce3c918cd1ba8c98ce77dad5ac015e18e38431c270455d3421e824952d2e943a627b68c10c01b25007e3d9ad627bee1ee424b613b2a22b3f14cb47b435894023143a8b00ff05b8d0f60b4ff3166059f57b86c5a1a13d2f1a622079d14b794e04530f6e4a3e50245124e1ffd033d2150f1500b3cfff836441e38ec950d3868017db5f9bd1178818a5f59535efa482e073078403c2e2e51d77d63fb617d5d7051de0dc2c6e00f9077dfc3a662a4da37253b7c22e75af4206040389a67cac02a664702cfd697ccd0caf16bfae1ea60e188974ad3a303c906d96c90e421a8f5c04ce57a50b48aa3d0d3540b620572c7d1e5d637af464194d663ec59e734f03d98d9eef466b5bde11a1dab70325485e9b0ffa61922a598880d5b84e4ef308b825aaba5d5ed8140023ce25cdf6288889cd449491b0599d66ee018326be60f7d0ca5d463b486736c72cfeec2d704dd952ee1bb8696b49f7eb0a877a1c2bc299e91fb3d45fb3fe5707046cc7a20abc44db0c6cea7dc8cca0c99fea6288bbffb401bb9547a01d99447f64121d6b9234147b71fb28d7873cb74598406491e7f23d05756e00dbaef003565a1350776aaec052f7553d6995efe2c193f683fc8b1f4e935687faef2382494b1df562fb83d8e17808a82641ef3c230649906182bf4be3b6214fbb306556a4dd3160f7642d71715f59a5bebc2f94edb9524a496e5fb4e3197d6332c8158a890ca12e5acc8497f73e9ae03a1ad49691a861736a82880bd524df6ae2a67e6c0c0eeaa94c19e55f4fa6efbf14511f673a3766194ad9264dedab29e78cde6df081a49d952ffac620871839a83c644b89bcc17c772f13d5a491d05bca32e9f9eac2ded25597e3c823f8472ed552cdbe8a7a18f081b5d1081d43a80542e5a9c4d44f65559697b1890d96cc1068771a0f99324499352670ce94a1e6900d8728539ba4e8099511e50ecdd868feb33638e678d2ca74564541fbec10d8c18ea2369d9b69a6f021f2189ec2533669feebbd9b513ed2f4ebc14671171b028f58b2195718f5e0e01c4949795f4d585a3570e74ea66c8884337a3b4daa3e2b80df8bbe2b2c745ed8691c811920fd7bf44fd64808739ac3058fee4a30663ee54eb6dad770588d69dec87298651cdb1cba4353c9aa3236fc63b24518d50a3b60182784ce09f2359fc311ca5d20861648f6fbe9fc88404596fe84d143126895ac40ad8c54ee554b3e15f90226e1d0cfd5e68dd94a28d1a2dea06888dff210d065393c674784d6c35b26ffb0dc20bb58028c6df4fccc2113bec3e970c6d1c45aaa71af45ab3d8e4c20010a8269c47854ddb7160964917e3b857ce52421d014fb3838a8debcd20c82a498b88e1204d729e5b2a4a09966dff61e7029b3172e933800166d3026917c9d5e92143bdbc3bcba5f31ae9458e4a1a96e8ea1055b37f822a9a15e7d9973980240d2f0f150163e9a3873fd8ffb3f57dc711bfe0ddd8ac9dfbe0c47456c7ff95b33a5e3dab7c4bd0ff09d44fe8aa70070d357443f9db2ac1f552ec3792292a9a8104b70c38c34f39edefd32d6205a79be5cf65f4e896e8da917e5a142e57b1644fd5d7f75b1db668cb8a4946ada81d0fc3d5de79eace3f77d930ea5741164c6b563b2653ada2cfdc45bd62d7966c728f862de6dfdd0c637b1cb5bed9199d2024234ed69a18c37dc99fdd943d8654f796b2ee27491fd742909833f9da5307666dd90b0519ffe184b9a2e1dace9a9786c8bcd000c41ab2ffdc6fad7c561da57aabc97718cdaf945a0d6681a4206e94cde91d3775c5c0f5d5e423b00255784574db5385b346e1d63600c36ae6efd95b65202d03c45569bc43fe8b3a7ba6fa46cc64f6426127e86cea22aaf0a93be83ca759f14d3b0989c7781cfcaada4b1e0e2eb6435e58428d5f31a54fec14ee441b4215879e5d1233855d95dc2a1d575a39a118504a5be9ceb6da65c6f4717483a00d7ca7ad0d1123d85bc6684361908269ab63f2ea03501c401099ef6f003092f0b38ef7a41b449addf73b5781d81cc5b855270408347de51b687ab8a28174a5429dcfb67d84418813e92924efa34d17a8f808e14e91d823fe07f9847faf02d0a7f22ad1286be8a8aba834e74cc606823ba1df05677a0c37cf11dba7a02e14be9b726e73fd767abb58b06ffa8b6e27913c4a4d117ad55f3512169148a01b4a61e21cdc7ccb2e73015fbbc09c3a9855daa32c65b993fe2161047746119ac8c8fe35c75742903118e1470ae6052eb23b643b255a8fa9593a1d0d889ac6766c5a1035b868e1aca5c38f27da90207146c11cefd398defb6605e74fb8c46531c1fb286ee420d541c6cccc6dc1d032741a9bdaf177b737e3d4520cdd51df1d9adae9e957b58e6910ca8690a68ea5d6b0ac1eb6f164ee4c1dbdf30b35397887b52913c23f477dc73476cf7319d78cc540c927a630902833f177bb70e4a50a94dfb53b1d08412ab71f7091eda1135ab67faf6ddccc2d0b691e6038d3bb9b85be885c59f8676dcc41877f7081d823ef87f26d147fc612e77df69cf9013f8b97aee13d9b754912928d7808721cc07a4a16bc561a09c89166c707815475338d1ab3bc9c083add22e0aa8cf38a5942284f7772721c8a9c7d53a7eeff4cdbb5bee2647a02f6c1f32f72a12a970592f19ede6f190894ab874228e1b1c18c3f725c98d592f38384f9845923d3bb634d649c1c1b247a2c13d97c5c5dc14ea3456bd70e7b039faa9bbf7975b1436828ac91d0982f9d4adadcfc7106a232356b0d3ceaa3e909fdd5a1fb84d4fa9aee6291ea26ed35d42d5a9b79242e0652127447921ea6170118d9f177cf712a26d7925fc6604feed91506da9b19878783f44eec0666310a93ae2500a21eb97d5d19d2798052356a7b8d42c59a769a50c1b83d35b30f527986fb3fd3866516a0a62d475d331eaeba767552a68f4a3e02baa5995ce16280b94913dfa8ec28ce03c6b6e0006829082762b2943f5c1f3f6869c0234f211b040ce0264199d3e443a0986f0f1c0dc1d0820ed3c401751a2d611fce618083ad45f5086ce8b69a7be6764f974bbb39b256a116e0f9158f35b793496bd69cd6827cc4b80105fc6602f53f7915b80fb823ff0e626003037512a0c775a400b292a7556861f6c343a87509e6ad5c9d393b616f9ef76f91d81c60e8f3488bcd96f9fe5401865a80b8a64c5529c5300c0feb6e1c5a6cd7fd467010859a6557f955da5ad3f323a5124ab0968e98f9e49256bbca4b5c464b3c081ba2be0f940b3ab1c3772a05cd2e9d1b1f070203967f81d2e95abe0fa420d69467deb640ed3cef4e84d72b448037f93f2129d4e71260384dc4fcab24e975ebcfd73de654f93d5c98dc390bfd3905b9205db914c76250611db4d1fe5e3362d9b0dafc8cd58deb1c0373df5feaeaeecd53f9e8d648293f26eddfc7696c6f1c0debea5f3855b4daa1d656e914039efd7966176c04fc256ca56470a57114a9bf011acb01192ae426ba31c9d4491412acbc293896329c023c45abf9bde31898fd236532cc5bb8f122eadbc433c28174f58660e832cce97384ac6392cd76ca752897a52b6d27dd72c2b72355f8f6b5b336a5901a004df1f28e800ad5ea80876d21abf93336f8836c3a1ecdfdea793ac1d73d2163f1b0e30d6f6b455769955b947e654e5fe4600fb100be8537381a946b40a592656cf2739053328b162a5dccc30c81002a07df65348d650a1daa8509cfe4bd75355faeff7c48febec451432918635ce313479531b8897edc7b8f5e2731ab4622601b653103eff85e036adb794b44e836c34883d2a800d5612bbe8658f4a1aa612decd0454c0e3ed71698e192437fd2b4ce11524034a73462c319205b4bb02b0a5f128322185a055e80e293f15554485bc022a012b9725e9674a4339ed31ea8f3d095dda3762c91641030fe99d59f634193591980b3d4905008b7896a97fa7a202de73c96776a263919c9aafe3eccf1bae54155cfc941adbe1f003abc7fa839d2c8ddca56b47c31595c629b74d086ce24723c11da9a32ab90ad0c8380c985d8e082e2037df405671e560ed6471c099a8a9dbb44c33def8c95361e7432aa0afee32f7aaf04cf5e9ffa120f002962b8166efbf0fc08a901da31aacf05b8ba82104ec4429979173b6332250abbe7e5b2519cdf6462a652cacb647c05336c9413372e064015b50db0cde05d3ef41f701b299b08bc47a182bedf69b5110b4e9cdcee525d53b96520b30dae41c7e93f3e64666e18adf76584309fc89d8304d2175df2954e1a710ae4910b8612d9fbad0ff2b03c1512b64b83f21247c43a564bd689a2a9462049e8084540f5710300b8b3ad98be4048a1b58a4e5b51e3980c68ac4e5076df9ecc75152fc34defef0f6e3e55394338168a59b896c0efd9234b99b12827af979ffac13a23d407a09a8f30131192b672cd543e91bd2fe4fb66684ecbd650af50e6d0fff0e443f887c10051101110919221a1a1a121a0a320464e8c7908fa1a021a021214244424342424241848008fd10f221142404242424085190a120424182040112e447101f418282000511028408c81010212041800001f203880f204140808008f941f463e887d08f203f80fcf8f1c3c78fa01f403f84f820f231e443c847101f407cfcf0e1c347900f201f428288828682848282040109fa11e4232828082848081011d010901050102020403f807c0005010101bd467770f7af51ecdb7fd3a71accbbe7e5dfc1ecee46442edcfdbd1495703ff10606d7351fb97b1124bce6fdb455bc35aad56caa4ac20dfc21a94b76ce4e1b27d198eae2a5134d2f95aab46624bc9cd7261527d9680ad4afdb57e7e2b1c04b11887b7a59473a5eda353e64c55a4559155ce0a5fde2ee33bcb45b549c7ed1e3dd9f6930fbf4f7bc4679de0a9f2afa982afff09a03de2a6d622a1b77920b0b44a7052778ee4ec34bdbe47ab59df9f7b37f3cbc66f3674848101ed0e92348280890209e1020bc21f306e12120210c0424c82412f261621f18080f01fd985b07d71fbddaf68fe7a291bbd7f0d2b9b83b1177b7ee375ff3bae257ef9f585d831bafaf6674dfade21f4e813ff4377ad7fd3d15ddfbfed6ccfbebee43dcbdc8dd3d20dd2b70b725b83b085e7a18bdda4c4c95abbaeb8fb9ea1f33a7e9fd11ae77dda1a9bbb3dcc51aee9ec34b2f655a84917998e110e7a34c8b2f6453c8b72fee5c519942d2a6d829d6933b34479232da0f6ae24fd92cf3b7e30bf900e5fad847b9a2f246ac285152107ffc14ec939f02ec5fefb428515280d158dfa2a5d0fa978b96428bc6a2b1e09f42cbaa2faf018192fcf145dfc12a62b96cb6235a23f15bb4a1f896fcd8cb64a238db913d49ee5c912fca665276a614311a3fb67345c51a8d3fa58811f932d7ac655f3b57afa7f246b16fed5cc5dec268c3f1610fa3a190c2f831da70fcd8c7685753de68f66ed304a78cd98b361cdf2684f1c5d9ec61b1a7628d5e4fda84e046af97ed5cc97ef6760705d85bd8db4721f6a22c86c3f5457053e3ef2014df4b185fb43b28a4307e8b361cdfbe7dd14826f3196c878a35b246af8fed5c4d2962047b2ad628f63b3842207ff6258c2ffbd6ced5ebc98d626f1f05d8a3107bfb46c65639f6b01eb6e37a6b5406ce459bda4128fe0e42b26c129f65832304f2c5871adfbe255b3dc85ee39028ee5021afa890341fa01499e2039422b82923bb43c507284570e38b1e0637a660ed0867c638d30518fe1e4426232a472dfc4c93bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb7b1119332db871467281538313d3b88f88650c9c4c561b3aad4645e419915aee233e8985c4a24514f2578d0a2925e5c62cf6e44bbdb4c47eb6437e6ca776657f662449eecc6633da0c38f1f5432985a3658bf8af1d19cdf5646dcab370fce6b31612e5eced10473eeb453e4c0a2eb653bbc2911b867bd17c679c6941e266145bb02b7126da3c0c662363fd78236e98cc8626b561e2d7a6d4a6d4a6d4a68836763c23ab0d6b57352ab561edaa76a546a5464506a6dc1b0693916062b40dc3c15a2e9ac8539b52e33524ade490646d58bbaa5d216b546a546a536a536a4351e88aac5d21cb1a15dc0dec5d392fb5611b7653d2a4368cfcda94da94da94da147268491bae68312fe40c6667b00c9453b19796204a2912cb4bcb4b0b89e5a585c4326281fd8b8b2834ebe2e5358428f405b6337bfdab76258bc56ac318ad36a5367ccdf0c2f2caf2c2f29ae195c50b10a4162eb529b52bb157965606b80051badec25e280b8903b9450b97da14fb23a3c5622f2d2f2daf2d24167206724b6d4a8c56bbaa0d492cb529301c0cf7620d719626b5612496da943166652f8831598bc5b261bd8d7dc15a2c574cf6b2d9c360b2b7f99e3168464698ec61331b9c87d1a4b6d863c87a9cf26f72fe0667b4c1f99c9d1b19eb471bd8cf64a22c067bd1a45c34da28de8864135faae052c5500dce07ce93a0028ccb0beee65d3f7a8f214e0aeeb5d3b3a6670ceb81f8a38fbf451c09a6942271522dd78c99c8e30f7bd74eec61e2cbca6f893649a6449a947589223906379a914a47994c76f33937b29b9795b47434838373239bedd0368973d160b4b1468c6431608a315368a1a20b15432bacc05919709e44156370321c727c1ce2bb934425aba4494991b23d37b3bfb13dae5e1f2b69523d8638d6c392f490613d909282bbc1f9d9ece6cb9266649ceddc3c4ea9f333da16713d86b0d7c9c9a149e9d06ec8c0cc3ee7757ec68ecebe494733b07749bdabc499fd4dec5d8f7363636d8c26d57a988b369ec1115954585689cc7669ed387933b337af176377663e94aed7abf4342e32a290cdbf7ebcb1e28c4b0b5128cdce10f7af779b997d29fbb20fa3599a4b8c2b8c6b8cc833becc15c6254614728d11855c5d58767496ed21c3fed81e5738a9d6bbc688291950ba3e4c4b8d28f412837c298b93ea21c3fed8d0682d0da8c1498d69c6779111853c090da4c18def2a230a91b8f1c734e38f5c8c63f490617f683d63d81f168ed603028983329651460f19d6034b63bd603f06c7fad10cee4593d252aca549bda4c6342e99195915b027ca1c418e2349662913e68bb7582e17ca7829a325cb4880323184c0ba43418668ed88c48b04e2288a2c305c5b40d101924592509cc1d9171464a04002273e09c517d71628ae88d68ef1841a7114c527ce947942cc1343902c92f5c49627b4d4786206568bc57ae28a45460d275c506c19eee3a4fb38cd8933e3e80419278cc0ed70028cebe57239d1c5092d2fd8ebe5041627aee0c88c41460dece66608994c0717dd8eb419b419220f8c03e31a91468ee399d19e19c7711cc771b467467b661cc77114df92e3b8c60a198ebb55221ff649c887bd149c28264981d924215fa489524827a52419ad285a5aeb590fd57a96ab2c5d364958d6ba8fbf14dc6893842467b058b21d3b72e480d9241969341c50ad67bd534bd66ac5683649c6960d924873d98cb424e293efb251129f7c98cd283ef9a4f38c341c4afee227711a398e2fcec6590cf6125b9684dd883f8e34310552ca38c68632160eeb6538acd9a8e695268df849586349be5c5270320a94248ec57a97abc572b9fbc0682e9abb4feb8d88e28f0ff512690178d1ce48217f3c836bd176109f45db416cbdeb45d28645da318bb5d65aebf41245511445d1c965348a5c442e6ad48ca353cb68b46aac1a92245946e3972f2c16d96ab59c46978f2903c7a2398946e3cb5e33d68e2c871266e3648d5acf92bd583b8c3496cbe2461b2517cd6d584e6e34beb8e3463e9a197bfc8d88a3196b349236579f84851b4b9c944d4286606d928cb8f1653848acf3d8b7cee34fda241103c06a89d692214bc2c4172b5acb041726b4883a2ca1c56b092bc85719eb560c182b5ab18b6b8b388ae312332c71652447728cd6085e499411e36ab5ac104933b498099418332a1146092fa3125b68e30692d04266c6be5e30582c268aa27d29fb23a9e044da949532da2156c07270bc00c01a2e5470e39b91d120a381061a6890d1f072b558e428c2744ad8cb150343565a6b45519c59dbe4638fb5b12d4aa9310c8bc56ab55aaf352e576c8b52aa7cbd5e3372580336aac1d98f6d514abdc294b217cece6c906c6644a5fbdbd820f90c92f6364c49fa0c1cb76ecbb2ccc9b16e756c909c459224f92cd2bab534d1458696f3c50a255e24c05259c36a40860a74724a9c1b9b992c067b9920030c74e4c071c3468d0b685830a3029d9c12e7c666268bc15e5064295d4158f72fe21019d8324a21f31d52358638d94e6c069571a4f9cb7644a319545eaf1954c8195478c8b27c9ee138f47abdcab286682493ed8846ee37eb341ac5fe254a952ffb9abdb8e062b40acc8c3dc3d1d2a41e36bec61917dc0c2a3f838a28047b11c90cf71adfcea052c1199cf82c24355e628b0b19161f7bcc885ad2582f6b3c0cce0eda8e782325dc60e733186fa44ee020030c74e4206fa400c023078e1b366ab06ea4a2f0d4b8808605332a68dd48a1d053814e4e897363e3ba914aa1c7eb46d6418f1bfbd69255ec195144ca8144d6106716d76ab946974bb4ee72c1c63056c80264be631422fad9efa3bf83f57ba07cd08f17eec7ed85bba92f55e26eefe3509127427b1f8736f81d1cf0a4bff441520853ffb4f336031d385eb4b8f771e8c81fbd8f43481ee96d981a3492bc957ae198de994a1c93178ec9788649efcf57094f82ade06d0e8ecdff38347b1b7b8d434ede3ef9a8dc9b70935e6559a3c63f909095c8233e009cc76ff8fd4545937a95419a545963d3a46abca6493dcf0a85260584b364c61e91cca845cc34a997a8d2a44afbfad1a45e6918b1446952a58f26f678454411071b9c8787c7061ab08c8c5b9c2707e7c1c243e5bf9046786707a591cc78c4a8c4cee7a881c1e80495e4c65b60e3a5ca0b463046319cc78b17d108efec50c2fbc6a1f14c9a520707d206e7a9e06fac11ded9c1c9eb9248bcb3c3ee935c701ef1ed15e799bd6b0c199711ded961e893c621213e5efca67108a8acbd548d1e0f001712c5701e110ce711c7514c4306cbd843c59e2163d78c66ec1adca8468b1771cc3864a98c69b46029492a59c6b8abf582ddec80776038f1cc380424c88b2faa1987865e7c71cd3824e43df8a2215fe4452346471ec9271987945e04e1952c697ad1e9a1bec98b4f52198744f811c6a1129cfc93cfdddfbdf9e268eeec765e638f9b71325134291f53c28e8f3d24d046d8f151841d1f2d13da13cd69c7c79e10684d3b568b5df3014d4a69c7c79e249a944d83b39f64e78c172e4468453b3ef678b0e363cf8d262586c1d917b2e3630f114d6acc82b33fb4e3638f104d6ac4320ec730a39691cbe865ece9a1498d5fc61e1e3429310d6eecd9419312d5e0ec6bb0e3630f8db6b33314a98858c42c38fb37766ad0685276064dca9ad1c929716e6cec93158ca3288aa2288640a3f2ba31624caad27ad7dbb455bc629faaa483a9a92addf5369d78bdbe277dd7dbb4068f54b487ae4bb48a5e9f79d7db245c315536357ae4024ff5ae49d26ba26bde1a4dd24b80a84f6f15ff84b749ab7785d2d8546f7a8d3436d1535502feeed6f88742e1dd357a728272770aa16989bb3329a9b9fb92f330dea167f0aa3d7def7a816afea1787777ea5d7b3a0c39b063f8da5173b70252d259a2c9ddf38a4f785efe356b940a3dffaef8c4370d9ae935813fbcf775f7a00e3e3eb379d7dbf437abe7c5beafc2eae35e77a2b9bb5ea0ee6dfa021ff7b4130771300435a3dbc4696073e29d99ce8b93aa3093bb1379a9c19013a7c113fbcc277cdeb5173c2f4e02e2a5063cdc13c8049ff9680ced4b972db42c586851b68e3682ced30cda11254723a0362547233c2f3fd5075fa34b9e443dfe6573073366f2a7d293a83ff18a06a1e0f56b3d1555d1fbc3ebd74ed4675ebcbebe55a77a7dff24aab6d56036bf76d70b7c27516f7bbcfb3445abfef12f3ffd33297f86ced30ef71353a1d8c44e5ac9f7f0bf1c216627de3a787d564822ec587707f2f29dd8a980c98977d0c45648362f776eacb8c9895526393ed0b09354fe187747f224171994119341171c2f33c0e14a940cd2a80c92dcdd3320ca002803abfbd317f86a555e7b2beead37fdb73ad173bd55c0e00f6f14535d1f0ee2209407fe828f7d5b47940e1f4a1d37fc78a9a389520719eecef32fdca87981d7e4f91eca53b3f9c2dd467f2b06be7a7d7bcd3f8daa411e4dc4c70abf9ad5bf9ff76f15ebd7e8f3fc823fd4eafe720fab3cfff804547f7a77de9f62f5c4fba21bed65ac62d30a57fdfd6f52e294f4d877aa58e3f801070a7240b9bb065ee6082a716451e668e2e3658e0110b182bb077999230c8e2beefec254cdafd11c94dff94334ee5dadf12f77aeb74aadca67eec45a6333afc09a70037f380425476e44b941a6bcd100139f3a407812557312f5b634c555afefd77a2abaf58af29e9795de76a2a7304d833c5b56dfd4d867ee0bd4e8f9bcfc7f5f457f78a38fd39e8aeac77d69a3c87f782b9536aedc4fbc710afce5a31d5edeb071f7265eda80000a4587012fbc55259fb9af910d203676d8c861633686bb7b0d2edcdd6b58e1b8a75ea7d3b635eef582fab7af87fe1e03855bdf5ff1ee17547fcacce9eeb16fd79e4439897aecdbbf606fbdbefd7867a6b77d1566aaa181bb3f797901191d2862b83f5561a60b2ef8e2ee5e5ed0c5f6246ae754d74e159d7212f5368d7dfaa6faf1be269a0283e78937aa33109f5bc554f835ea837adbcea9fe1e13e5a126066a9f5345a778fe54efeb726a46b5c65a8781c0eb7bdda9a253ba573115dae3e53ff15e3310af9f5fbdafd1c72bf641fd0553eecee4e5053adc9d899734c684e10be3746caa98c75b42c34b49430b8d2c5ba34bc227511beb9c93283405026f15667a1bd0b6be8af1eef5f5fdc6fa85f7b78ad73578f41698f113ff821a3bb93b0f2f69b8fb8975f036b9bb90973478d078e2ae31bad135fb7610578599c8b8bcb4604c180bbe7871772f2de0e2ee6e4116f71d2106c144d35db0e94940828464f4bf5f2eb7719a5ea09087f1ee7673f70cbc9c2102f7289ff7eb13f7d4eb3381f9715045b79acdcffb4f8caefb839984df3c548df3a951df7e9f89faaabed6bb29efa14eac831fcc24e44c80b9bb0ce58c252aa3bb93ee3e430133aae8d5867779dd1ac80664f3e1a3a2e98a7f3f3f7c109958c8ee1422c4879069e2209f5f366dbba06fa33de1ba35dac3abfbdc7d042f2b8872f76103b2055121192d71827ad259b75cacbb7fa0e4ee49ee9ee4367cd9e15085616ce83e1cba38f471e82e0cdd8a15f798c3dc9d8a7b95a1c3864315865686eec361151faee0eeeeee8ecf6cde2c0feeaef33267699b785db3f93bab8fd7fb7afb7a28ae7afc43b71a5c9f87fe89b7898156f835fa8f7d50ef812eb7e69cee7d1badfa13fb34aaa2bc37d2ab4d6ff487a63fbcb5d0dddef69a7dfa73de3e7d7d7fc37ac554787dbdda7cfafa7e7e8460203f84f0807e827c5ca0a11f2690f3c70f20444078c807efbb6ebd0bea1fbd8379cac43ef367a3bd9fdc5baf69fbd92bdee5f547af5833f9f1e9ebbbddf69a81c0a0cee1df5d79393444ebb75c8e6989d2931352931c14d2d212ae2997bbed8030707fcd5e15943eeb011712f4447e5d83668f27b15a8c87078547c1dd91b83b92bb1f89d5dcfdc8dd8ddc1de7eea4fb2d0680ffda03e0f56a5b7de60fff7ebc8421f46ad32b3e5334b8fbd93f9efb8f1d77f78173e5eeffff5fe3c1e336820e9aa5124a1c12fcf7fd134f99a87a813ba8a42aaf6b36fa9b4ef7b7584da7fbdbe6e1f43fa6ebd9be1ebafe6f1e4e79747f3b718a5e9ebeee3e7a89e39a797983821b10b8bb0d2f6fc8b80f19a2d1d77d4f4555ecabfa9e1f52f43c438a5e457b78a757dbddf7ccb98be00e82bbbb9aa1ce5d3f9793ee72568e75398e65d1b037f6e5831cf27106120397f87ab1c8d15a17dd864016b1eef280e5a25b6b4731c95a9715ad1d5b278856b42e918693b52deb72d1dad846b1d5e289bd254591c462496bc5981d816861ceb2a438626ba5446bc51713118768c51629da1088d6b6441b82bdc0da517c5d8035ba6e2c0d6b2d788d568b6d89d68a63ce8a640c06449c59222fcbda31228922193412e108592f321b44275d5c8025471e9225dad15904b01cb02e7a59966edd9256b45ed897d8c35a91258aa3b53fec8f7dd999288a62ebc8f2104552b440a34d66e3c581b5d1b921d66059a20d4bdad1bad8247ecc922ea22d7f9d7d61f49d0b5867d95b06c4d1b62ce9b23676cc228aafdb6889462b8ae48b33188f6559eb02228be4005931d67a89d65aebb2f66645b18ab16561223952599a5835fa58984cb42f97158d8818883a461da38f6e716c4b14ad0d598ea468431445dbb224cfc27658194bb42c7b338443fca025838976f79ab9441b827d593b8a96b44956872844cc21ca4497c8b2a315ad28135da41d59a3103b5a1e0bb3336bad0716033136baec8bb4a2b5376b5b34c41996142d8bb44244991d450cec388a222992568828da1b62ccc2ec8b14adb537ab438cb9464bbe486bedd05b9caab103961d2dcc92352c0c769339c18181d580b4a2d8125dd8961600c992ac15ad68adf5719703ddc9dd79bcbca93129c2aa6162f387ca220d19a81c38c0c5d3cd0228842cce78d30e15be240b27f0921d300660ca212f61ba526a3ec801833090dc1c4042766afc106571c380a16bb34328879815ba360541ce947180205ac8709f3328c0a076868b58d3e9903bd002d4a383af7d81c1999f61a0e5021dd752c113d7b164f02759701fdd4f15effbba8c5120c6c5f56ac3e9ee6e155d813ff8cc26aa065b57b10d9218f6b86c4698cb6503e6628da30533281598682f9e56ec4544ce66cc5c24ccf66833dabcccb070c3b07523ba6064cd4607d10fc35893d949d66e541081e06031216dabc802c3214b47725810c918b9d433c5d003605937a00a227963f48962d84153002cc0310ac09844851686366022cc66dc30447281fad231120c7503285db0d1863545ba7045851799330665a042091200eb21c5d56b4d0d37a28c6524c7258404013bf1b242052c9e189218073a91ece112b242047248b2821331fc5c81a92266280bf20ac0828d0f1c0b81a10d2115622e21add8eb661c524a32ea882171a92044c7d32b09071292182c69f67416851996644d28e61252814d2b2643a299a0c330f64ac2606765c81a4b966d85d08ab13c68f5c0159105613c5e49ad98cbc6cd110e062413ec8219399af478f1303971a042ec6573fdb0f931a4d4e49a91ae1bacdb28049b913cde880be68a913f2c10482223968563dc61d10082bdcc514896e12b460336a40296a1950179f1903bc81dad1e863d6ec823ac0e5818c07690397082461d2b0c6d3f76e48d3ee4c80200cd840164550921103f9009e305881eb654918282959ee2615367425409233461f2d4b4f441d28de8070f071b68f06406305084c806b41b365c5a965062071d42402a72d361c14cd6120386081fb8ecb0450139683100131e1e05b86157c2175ee4b200624079443c88b9b8c8806508a601333c70b90911ba60862cf672e5c001810744e17309d3074a48900e00830b2de89c093201207ee8418a084d86846acc209d2013461322438460ae16020e708018963011f180c7cca2403c816802710da9e6bd10d38859b0ce582ac42944296051ccca884e8860c4a951caee78e960e5b0b1215e205a6067e454c0d211736c49de8832564c84bd5e2269476b5bee7ec30667c431526048be3024975a3d78acca9f0a390b18b25833170754a840e610445e30dbc280569521b904a311cb518385218c04b2841103d96ecd5e485e44add848d42389e1ebcb7046940ab0a1f185abd1c68b191643561943d6ec8614c3d9f6116208ab7123ba3c60fdb066a06281cc460d2b905786383be58f3e393faf1a3965acc0eae045e42a1a71c6a2d71e7dc8a5223bad58abcb7094b56e903559d068c919598b216175e022a175a3156b49cd66cc66c02e9059e022614cc10aad1ba397155863861b4891bfcf6da083bccd705a39a41d7dc623b2c9c60297e812c155b25aae9cf1c6b2e0c6b664238b9c8de3288eaef135c26239c8d1c5c4a583d314cb71b55c76749140c81fd2be6c8c6786329e200c18de745121a745e2781d5981c462055aeebd0c323ea001334e9039624cb0f7540619326041322a326428ab5f78f1c3a3c479b99c94b084a90c262a1026831880b2d460e4062ca668c288222000c40e3f360e723f3404770c7a1d01186aac88a20c061c20250513a24a186109531224196070018d13809100103fa480424e478eac66807383c515507e36c332c8280109a29c5c4023670a233250812220f080206280c1859c092488b08449a9092632b0c404b224554145134c1881812228a0c3162b0160010c355344510405c034e06a884f25a41c1b351dd0028b233020012286e0418617f0298212524f8e4d134c1c618002c870854f133e504282e4c1edc686f40e68d1041348644002440c11040f0280e1eac9074a433cb80d0109ead1c921bd8c0e6871051247640003122022081e0420030c2f5c71c001b92751457e6c63a06009049c9b0de8c881e58a951144004ac00b5684563e78ccdd37f032b63aac8c910c32052c148827783180ec41e441dcc1fa108346206b93f988b5b183f16964607588395c37461b620dd6059606ac021d9db124716c6e4a9b19331bb21cb11cd8ebd5728dad168b35da5f505defd6a415eed8dd7178497ae16eb3b9bbe825f9c575cfcbdff31a6fe18ee71f9fa856d1d7e86ff43d10ae77bd3ef3efefacbe467f0b772d2f491edcfde5259983bb73e02509801b5e79b373f71b2f6fa0727268baa17277999724d09fd86c3627efdb3d15a7cfcb8f4d34d5bf66dea9e2c73df5aeee4ef3724ce3eea597a31977214288840c09111212440810213f84f8101224044888102222a2212221a2204440027817cc28155e93de96757abf765ebc6e15c5a68aea3fb11a7c61ba51134d7f78a36fcbe9e3ddba511ebab3fad90aab5bcd26aad305a5743a9fc62bde2afabc8c37e699afa23f8daad767e2dff75474cabcebeedd1553e1f4f34653d367fb7a68faba2aa7694f45cd9c9ae8d6a88902716fdb1a4d5f4784085491d66d1353fded51b1c62b10af3c6fa2c0bcffbe8a71d5c6bbab84975f877f57353150eb7cfc08ead4e7a1df73f23cd6e945f2369d0eafbefd5a456fd67fe2aae7a18f832bd6d7077c35a3298cb9be2629b832852da43cf9f8c124439d527470f728324f5562a2ef52a9421737942a2451e1a61c4e60880e8f484181bb7b80480f8f890233d40a3eee2b686005165670e2ee1df0e99b74bb41159d6b36b1d35631155291899bac200277d782051b0b1fb8fb142c5c71773477df232c54e1ee1cf0e99b3465e6d4e8ca5e85e0ee599c4757dadda328af7270f73344eebe4794dcddc37849818b0b0b48218b8e0b56604961a8830025650a3e4f419742530a443a31f4d2a06006050874d9824216170a808295af44e188951d453514de053150a811a60a46a144c1ab9c60d7a48962264a0d40f46a883284774975aa9076cb0cae836629ca95152951a2444975ac384539dda340b90e9aa528359b53033045772b6ecad980c14f539487fb9ced092909ae29d784434afabc83de270810105b900d78b1ef358fade29f9a57944ac52f4c773fac356e874510a629a642b5faaf51dded666af477bb653407d4bad7697a4d9ed7f53cf12cd1fd2da75e53b8512bddd3d1d377f03f45afc1dbd234c87b8de2756f159f2a06e2f335fa4747473a7c66f385eafd9e8ae6f331ba426d8d7be891ff1a4657a8a3270af2611bea09e259f2597f4da909f7ba53f71a6b267fd3f5729a0b32791eaff9753d415757611c4c6f13a1203dba9e209e253a9eafd26dfcf44484188422133741bfc7130dfdb0f9bc9a41d069219ed2e994742028e582be03a6bf69bcd15584f779ed000b7cd3f778203f886c407f13e1b1be46eff3369ce2d3e7753a5ed635e99a8429de770d9ae6fd5cf5c15d30f879ffced909af8f45f81e3d6e48504b987af4789b104ffd4d531082dee76dbbb77bbc625fd5eb7a763c4b36fac37faa174f5d25af6ea186016ea0084480ae3243a0ccbeac01f0062b5e803340a9012c0318069800284c3938b2400102c50150688002054a1328534079c2dd7dc5625eb156adb872b5008a16eb122b119a8c3e410359bbd864ec1e728d8dc3fe408fa053a0d1047d8238045908028341394449c1216aa0619dd560138c40b08cbb7b19aca2a4d2804a878a45b5ca29a1fe4fcd06bc64c9a5f98df03392132355632657469a4547233592f2e87ca6d290d10571779fe282457734554e01754aeeee4ea2f49f6b5e57a4234fa2324f45bfb6e675c54ea2def62aee6d3adddb4edb898117af4fa29c44bd8afb27513e7d7db9a9d549d4db7cd4fcea12df181d20822776f2a5c041406bb857612674085d42aba029688d4d33f814c68b8f8b161f162a39510c7d51b6bbbbcfa7f335f98c10f9807caf06f3110f3be51597a06626fcbb4c26063ee98b575355ca50fac498c9c4c027a76dde755b21652824bf7cb4d3e0e5e1236a6662b9e02c15ca2b84bbebf87e57bf461f9f998967df476a7d8047e4b7bfe5aceeef6b7fbbad185dd7bb7bad2f50afb61f9f9f69f5f333adf4edb6e69f6995bbdd7ea6551607c029c851c013c6c2f5c6fa6d6f5b334fbf9a1fef207067aa7f1b9570f7bb40fd42f5fe3e67a83f81dcfd77814f27763f6d3823708ae15bc5a8a9e2700dfcb4ef7e3a72f29c35ced21cc314c38adb16b38c09c61ca2344d7059eea78e0777c7e28a0d58e1ee4ff80d78b1ef26dc687af79a956854631527b1829a32b1ef6807b30f6fa552511fde4a85c4a9894fdf24244e4df46adbe9d5760683b75b2ea7571bf077fefc007fe77abbe572b93445791af72e3007bcd897db58ebdc0e667c6633b7b1ce6174dd39bdb1b642797805e6d2149dcaf9365a959b5aef0fafee5e85bbdb1b94f720bdfbf21eabf96f66f0cc2bf0853a784dbcfb5caea7a240605e4f1fb4cce1e480402a181d23bab8e3f54ff5567d4dc557a34a6fd34a4d381e484a704e4830deea5d6ff0fcad5e74bd54afc36a66d23dd61bf5fd8aa9b0fa1bd5a539ef747f5f98621e0f13e9e1d13dc63e11de042b1394ca275f3c19c2dda37872f564eba049bac28127dd6e504577df2377dfd3a6ef6ef72ad24769890223aa8ba82c51c3230be8a19d6a9067fe0881b45d0f1ef3f1bee80acc2b10785fc5e9746fd31d492f8a94aae8dd2b367febfc4befd3db84f767a25a45d76d85b3d555f24e92dc9d0a27563851c1dd35e0648dbb9b39959c180172f24e4a2726b84a50e3ee5e42598219d741b3540219357fe6a94a6fd327ba5b3356d1df8a373ecf35bf8a6a54a3e779ffbcbecbfbacff57f43e2f631f14baee14bd54f7b7d58aa7ccbb42bdbbf7f092042f49e8e1ee5390700409dbdda528e1c6dda32042042a56c4fb1ad3949953a3db0dea6b44a08a784bbe762add6e504599a72a9d6a10c91a1d2b46a839e33a6896fc0526239009e33a689674542ceeee2e0471771fe18b8fc0c575d02c8da0b3a5d11a222b5e31ca43574c75aa18784ddb4fb8c33bf4f7d52afeda1accc2cffba7cc9cfe7d4de409dd695049d112db8975500d6e9ceeee567adba9ae986ac53c1b3eefeff5ad7a55cda8cebeaabfe9b2af4af73e6fdb58e3f535fa7aa35bf3a8617d95dea6cb6d7d53dd6b1e6b7e0f74a78a75ff379ff7e03ef6ed1cc62b2ff7d8b77be8eee4e5f7790f36fa3e7fc3ba77535ead878af640f2b6da9a792f3cefd754f457ecdb28b65d1b56b350bdffcb2befd5abefeffbba8dfed0252dc420e8b0086fd3697af37e9c02d19d0685f7f76a9057d36a46b789ae5be335efc7c12327be6b36d17d7f7907716f4bd37b9dde06f451d157efaf99879e48b615eba04dcd687ad58c6e603e716fc31abdebe7159fe0a3d64eacf6d027159dca4dbf44044bca34f1caa61e4d0d7077779d1f6a7a40530842b84019c20921e04a2824a05e800a80bb477909d5f3b481271f9e10503e81f0a4819316a593150da724615a3a16e031c96122868904725e28a3c90b4d82944ca868a24413313a1bdc2ad0e4013a1a80a0490f3a3b729aeca0a3c10f69c800b3c52805579644d925478e604b8a6c96cc601ac3027777a67de408071310255c1c69a044092545473eee38bdfa5ff764cd77f7698a4e3dde7d56b7104ffd99a23ef3574c951fffb2de6fc336f46b2710fba05eab37a79fa638246ffbc7be8deeee67e1ba3ad1bd0deb9ed472b5ecab72a27b1b2eef1e2f9552cf50273e4f9c12016c9ce41f56a234063d913e80e978f9d9695063a71335c2e9a9dea40f92b8fbe9ee435e7e80a629ee032e3ed0e2b4dea612849e2a2c82bb0bf112841f0e1a7482f0f98941d0c1cfa353094a69490988128fd22bd5502a953c494d9a242bca8c49fa92b40587a419ae24ed245f922e6904ff33cd423c856f78df54ab77ddc0fbfbf901dedfedb6e67d57ace2deed867b77cd5b236142a2df877fcdbc9e8a6a8d2a2991aafc825acd265291fba90655266bf0c4eb79f169e2fe86f6f2d2113147c6f0156f15db560c7c6caaf9c4ffb613535dfdd8b77d17b80b6af3488d63a3330de623bcef899eea3d3a828fe0f88a8f4071772d54af929ca18ed21c91390a73d4e568cb1115139f6a9087d78d9e38fff02f779e174f65a03ed52012f7124a210610ae980aff89cf606aaaa83e2ff6e933c5286fa34636f56af47130bd5439abfbd3fd0f8dd37b62acfebe78ed2de1cdbbaf7fbc8a7d7bb7f54d83bcc778f75b077fe64eeda117f8bbe90ed52ad678dfb32aa7bc1553dd2a9d12ddd77ec11faaa2bfaa9c5659e153dd6a30ff6e9a5ef3359aaf9a815a457b78677ed55d4fdfbefae2f4d7fc27ba7bcde3358a4f15ffc6c2eb53d13ff19ab7c62bf05714fd35ff4d5374eb17a6e945b78a776e7adbf979bf0dafc17dd51eaadfa6d1cf3ffcfb139f28555e813addabe8ab419ef0a6f87c244e4dd6e0f927aeca697a5f333d112877adf1dacb6b93aa24bc293ec25b9b1059c1ddb146af531566529584e7c56b8a23b205f7d6bb943354fe612544c49444a670c75469d61a3d92a184e7c54e3b88974582b8ce4c6511a913339d6a104959c4cabae4448d8a98714c856e1387f5c54b4630301282bb77e0a591a0fb8aa99618d1e2274602de23231870f7d38806d2f4fe9e72865233ba833b74dd6a3ec2cdc075e0ee2a52898b52917656d57b54e27e28712770bc661e36ba4ba5511077c76b700791a84aeb45923394d109b749553a33bae2a6ad57140991252244448088e4203283c88b889b6b866831c48a214a8819f2c5cb102d59ae5ce91c0145c951800a7b4814d490242343807886cc98e9a001c010524d9a223364caa22f5e8a66b852042cf2954550ee65dcfd097787c2dd9fd0abede707cde9bb5ee0ed06bcddccdb4dcdbf5f3673b99dcf3b9566a0bb5b2e09e0a1a902098c1972775b44004e966071c10060dcdd8ed0c4135e6a6011850cee6ebdccaa40e100620b2577b756429041cfca2a6280bb5b0b8c52a0f8a0cc093e77175bd0600602d06c804412ee3e8ea00b131ad005033674e1ee76c88f48026a106b40b8bbb88454a4035678582981bb8f16c440c68b1ab28079c2dd593710608d2d7323c388bb5b2d46204394316a4033e4ee6301742e1b7c49486131640ba2f2f1116e74bdc06c6633af44593478818868683a41c6ddbd09263840e264092592707747e208dc1837c233e0ee8e815b08622e60810a44c009776ff2307ebd08a7c004745aa8b906178cbbbb049c080e7ab8d322c081065f30707f08708023830738c0dd7d082138b800830604c1814b8717207ef0a14bc9819883013df0c0650713e0d061015b149000306ee4a00501eeee0730401a1b3814e0862adcbd865fbfa28b366ca0c405596aa081006368cc30000c5820800d2c3043062c10f00a62b80e83bbfb0b5774ee0c567ac8a9e2c20607285b98e2ee1e001970eebdda600a0b7705576103a1cd06e8ec8a201b4a490185283965082006807b82d0aac9dd615ee5d7a93cb8758858f3ba1789eb5ebd12716f391407bae859dd0088bbb3fcfe4417d30d6853ee52eea8bbcf7beeee1bdc701f9de7d84f37771b54707562ce3788f9138f72275ec2062d27c1477011bc8933d9c09b7ee60842abbc3609379aa29bc98a7b57bd4ad6bcef89a6b709efe2a5f5a744c8c3d868fd29c967f069c540e05d45c867f049ef9c3ea937a767555e8f82b8f53a69bc83408d1ec93c5509f85b93803f26c0df91159f80a617dd681888cd575115ef80f9f3466d5bd5f8e9c525f1861cb18b9cb148ce1843ce888614ca21adb06a39241439ac2039ac2a392c33ad1b2d5e4ecb0139ad0de4b886725c2cb8a8c879e9e4bc84725e06c8799990f30ae275260776838305200776448c95132b7362b99cd895d8979c581739b21d32a71c99558eac871c1907726617e4cc8484198f74d154d40515100488b52e8c1077749146cce14529cef062489c79d1640c2fb4185678f142192fb628e1c504c478d10130768be3f0450e1cbe1072e50ba7ab2fd22854ecfe02079b7e41448e8dfa8209a8f40b2cec929a973da2865664772cc9a1e6da1963a8d162946a60e02255a383166ac458a1268b326a52a0041815880183071830860c8103184a6600c3842b60545d795a8231005d555675baf4e21357ddaa9f32af094e1374b0668dbb4fa1d79c21e33a6896d68479dbc67a0dd19a9ebb47b166e86e67ee6e957e782b09d7ad221599b809d09aaf4286d758f3720184355e023565098610c24ddca40aabb6dbf424d091800512084960848b1bd2254d1b3f695f0f4dca190aa7a6cac4a68578eaf5b96633fbb6195cb77ee17a7fe80a7c8c7b1bba06d59b75fe6d1e7a12210a1699b8892ebdc1cdcb78bdb89e9ad1a9bf697a57fc0baa482f4604c4e88941148618ee8ee654511084467a0415b8bb1445266eb273fa148472814b4e150561044fdc3d0a9c02834ab71b944ed1bbf19153498721268c21b48491250c2a6150b1442bba8411461835c2908541ded094c7cb379f1f9a53335ea932f0bcd8875753e5e572b9f36eacb1a9dead33f077813a67757fc19cc33f74e784bbdccea9ce55659fce6535b7b1f6ed13adca619fa9de75e772be9d577cc2a5ca2b1078733805feaecee53478e65f8eb752e5721beb1c3651aa15eb1cf017cc6dacd3bd735be32014bce6540cccb9ad6214889a7855d19c4eb1ba8339f70baa39abfbcb017f2b0e7651c3ab30531765176e65d8028c232e4c772b8bc1ec0ba7a61a5c6dfa76d3408dfa34567d7c07bfbc5e2a749b179f780ba22d6a6c81c316288c39b38583800904694040060466ce76ae28f6edda99e60c08acbb4b6166cc1919d28449e3c575d02c6170460ad61b6f71c7473e8004ce0827c6e10357513eb03f60eb397b30159a3ecf6f1eaa46dfb7716fdbfaa66acefab3ee40980ea8f100d0031d78a00a0fd890e60cf1a8343956674e11990e7c91e2890e789142035aa4f080bb7b07b0482102f735ff8937144f68753ebd6dc53b4579af79a0fb027fd954d1d7389bc63d9ca254287a4d8db770b7b36a13a6b5347d9bd0ea7929d67f9ef71f0d10344c68584073049a0e6861d362a7c5b0d680d60e3139826862461055cc82d0020df9c518419480036204e183eac75cb50faa9f6995fb5baeb6e6fef6a38329700dea5c7a77de7fdbe8895733a7a2b99f6995bbdd7ea695912ca8883893455416306401759e38a70cb5629d81796db2ed9edabe3c7f7b1beea95555c175ebdea651fd5bf3f3f2d336d6b49e1435d15f56b389d353bdbf15ef57519e34eb743e232c11e1f18aabf0eff55e33af478f234a58945790e00a2d5810000b22eed6e54a1b6391012cb670f728ced870f728ce7ce06e5b45e715c31c57ec2baeb862e90a11571cb902488e921a2b41bfa276450e2b6bfc8a1957901b3853c5cc06cc941b18e33a689636d0c5059fbe4556d9c8e6db79f73c251e56abf20bf1d49957e09fd9b7f19a51aaebc33b8dfe7ef03be572b9adf1ceb6735e5fb85397bc4ddf15ef4c0504041474e2de9a7df0fa0ba679abf87d3dd477d37dadb08af670efbcbd176e5cd311269c5392c7be2da442880b0d2440034f3460819924cc5c51a12407b702ae28c70809728c34a00a1e2a40400503a8f0e5e098c8c115e1ee5ec52d0777c5cc92991c3c5394c921e2530c31c555ce101cd49c9f7286ca5468100a924d671e5ec627a05af71a557959d7c3a3e2d4d6c383cf6caad8d6c1fbf8a1537313de5a0da6c0f7f1e3bc7787d7eb837fe8160ad27d9a7dffc31bc53e281f2221a070f3bccea76f92ee6bba53f7ea3d4f6c4261058a20507819284e00c50fee962c03556601ee96158503a278124559260b774b4a41258550142270b724d6d7e8cc13649e18e289199eb87a223da1929e30523e01e43a68969ed8e1c4185c3861c6892f4e7071228b9a6b79ffb95e2dc4533cba892b773b92f1268070b7620f11ababe4636ae6e12345266e72629ea626a2349136c162620d134c309199f0b956f38adf86d3dd55b1c65368aa5bb14d63ccc3ab1ac46a3e9f875665dfd784bbcf2a930ffa9e8a2af9db92234ba08417f879d750bcc33a08fc6016be2ef878e511cc4295c9db7a743e73dfdded16b4f56c98e76b8f43ad70cad3e91e53a15a6be1ad4a2ff6e9abd369b44aa33e8d57dedf57ab2ef0e96d3d4d3cbf629d4ea7e84592db5658f73efaeade0748f7c2747777796d7a9bbec0bc57dd8a37feddf50275bacfafd3fd7ded7455144db1ef852aee7bf4d0a8c6b81e3dfe96844989c90927c2dbd4aa0bd4bc9ccba5e9cdfa1ae9d6bccd8b64abf8a77b5ede6abeba26abab449799de96577c82461f88fab49acdacf57de14d75df53d1f3fe7cb4ba06f756f1effaf44d4ad37b6413a6ef63bb552fecd1e9785eafa89a7b4e9edfb8b7defdf785bb57f23622e9c5ab4d5f5fd3fbfc6eb8f7f91b2fdbf0ee54efd3df74e69a79bcfcbcf4faf0eed59ca6e9c5ab4ef3689dee7dbd605e7dfb048d6af5ead2f49aba9fc098304b8489210c52115c145144055aa80050052a28825744912238a8c00c1778e102482e305a800216d816c851012a2ad00a93820c18b133b0830127308005034562d2889980189e9811c4b02e308501a218d133e21a814410485421d174040a8ec0521e4184668c9831c031388c28a3082380499890c40b092a94e891c499241c70c4088ec861091d25965002004844610413234028c20892026050200b05a06888800e53a6400f05722ce1e4ee355c87a907261d8a6040110528a2860918017306882e607460802420012f4030218117116680c88208a2088401020411787d09034409dcddbf00ddddbdf8971a5e6e20e005023e2f37dcdd1fa0e6015cbc68e0244a986ef349542efbaabee624ea6d42abbcde600fddfdae464fe1ee6be9c5ab93a88b8142a82751c28b81c29dab61fcb535efdbc3293e9d449d8f7b21ae70f008a1046e88030ce1e42f801bc201ee1e458828219a84480212628710b30670d1002b1a5006d8005e8a9f329350bd4a8219c9ce4c42abbc36edcc84d3dd5599a0bf153765a65365a2319abbb95b6bbd0c3272b95cee47084ccffcebe5f46a5b73b79b5e6d3f3f5be7f0ceea795e216a9557a00ee69f50cdeac55bc5bf6d6229bc9ed8548359556f4e689557607a8350f00f6fa5dff541e974d95cf3912ebd26127edb899a68f0e96d27eead41e00af4e1cc0fb61f7af841fda10b208800f164a607f3810ccf4be9c317de05b8f0cef89085778214b8fb18ee8e02773fc11a772f81bbbfdc49e0eedb8675ba5efc3943d97822bcedf74dc22a9aaaf9f7c5bbbd5eec7bb5876af34eadb96a63154997b28bcf51d9057771d245862e553c74c180bb5e6d3feb0606d9807cd8807c4c4cb5d19df3c0009f67e0a76950c59ac773b1013964f8dc7d04ee2e86bb87a1deb4870add2736d54b75be4657bc6f550f493d50f5b0440f111081ceb88562abd8c4ab70f7534041bf3330f89877f5dfd0cbfbad5e15fd01010105f900e95f50dfd0ccdb58ef825a37adf8bc79d51ad5e55ea367de40e0fdf1706fd3e1359bb91503735af7c21d7abefe1eff7fd3b96a3fd6bcac7d6a78cd664f85dac11d0f7d618aae77cdc01fde8f77afde2374dd2ad2db841b4d51ac2e791b1050901ff24041bec703057d4d98eeee79b1eff65454bde60fbda959f53e13ad55e534cd3caa15eb5dd619b806511df441bdada7867b77eb3f014daf8af278feaae9557ba815de6aceeb038379ed5565df3359d75f3681c19f7377d1dd9f5845ef56ad4ef5de8cde961fef305e79ef63fef9c2340154650e25c8614b0ea9bb8ba0876a8dc36b3e22c14b059c40015b14b0948012940980618b145b78d8f2a4830e3afc7418d201830530e1ee3ebc5c000ee50282b83b18444e8c0283a6b904afb9c8c44d76586187213a94c0ddd5fcd09b1e9d17afbe7dd7db84022e05e0f202171f3b1499b8490e39e4a05345082d695cb86374ae78400b152b2d513a55c06829d252d352a34a130420a0448095d88a79787d9c064fa17a9f877e2dd56beea959a327cedab779a0baa0efe0cf34fb345e7d3b875574abf704e14e5785791aeffc53d1efa9ef03c41a7895a8984a5d3155eebd70f777b7533a55f46b3b5d85d50dc4a6a9629f086fbb4f6f53f10979e5bd46ff06286e90e1862337b87b01c22880050a800b90f3bbc0271c068083110e20308094017ab8b5e18c0d63a820c2062d583c831b365c6d1b521ba26c30c2126d20b281278562c30c5fc23be824ea6da8ee49546dcdbf669e4fdf24dd93a8bb5ea09328dddb80a889f27841ada227fea15bddfafa2ede5a4581f957dc5373fa59d52a7a7bf7851b5db3d4fdad1818d46ffe0e12600b027021c049801d7bc554d889062434c87c07979cf88742d1b0001aa040918f6838538306349c27de0420c798410c2dac984109305d7098618619ae66d84b9028217915fdf5da7a36a4b799682fa77fd15bf5fafe78e8a7d9577573aab379a299ea7e5e2f50a37adf9c53bc855867e06b1e1bfd9b70bd688a5a05efab17d5e7cda9f002b389f59fea35710a0ceeb7f9f609a8be476fd327a04f6fd3e113d0a7f7ed6d5e2b8cb5cfdb84eb56f1eb747f75ba13aff8d4e913eb545dcf5d2f9007fff293ee794a6a30afe9ee6edcfb34c5bd3286196260a18c6187bb4781450a8b8e18a670772904000c438700762e200396c1070b1858b4b8fb173d3e7e04bfe6e34790079f803e0d20cb000030001d02a880bb7b41a40807a1e023c29bfa183070a153a5080631300ce1020f0c51302cc16004c30b63bcc0c50b50bc10e6aee7795f43f528e149d2bdcf5551e14df16aa453d7fcbe9bcea7a6ebe951c293f435a3af9d17fb72547805f2e8fef69b52d1f47de6457a9bcfbcf82804258fb312859517ac3c59096225a7ca1877d7e7c5495762eede059122a52355b054d9b64a5a25aa4a50951c4c2018d9fea639f8b7dd13abc115f85be333cd3c0fc478eaf74ade86a732958981bbbbefa979a8e8c649deb6557ca2af6ef479194fdd5f30efee576575eaf5c54e6f53d19b9af87ce15e3130afc0a7edfb5b3312a2205ad3cc9b02f11a84e8e9e94f8c4f2a3b5a3053b650a5059dbb73d14414e4e9898a11770f0195ebee5bec8e505180bb8380ca1a774fb3e402cddd3fa0750b443cae83668949012de4686146d902e93a6896c4f840142eac701d344b53949822064c17d741b334058719ae5c07cdd2943ce574779f12554e59721d344b5388a6d4fc88d2af370d9ae8cea88aea5a2fefdf41e0eb34bd3dafa23c506fd3187895bcade7ee7be6fd9a07f0fe78eebee7ebb7e9b0ee853b5ba18ba8c42cf0a90335eb944223333002000004331400303824180d86e321b12c8b99990114800863a450663e521dc9e57194418819630c22c6001001180080110d181000181244ce6233d772a92d58d59a4830f83d6b767ea61861f73f627245557da68d8f314be9c83f4843b3d822241be5b45ef1d12264da9d19f7032605b0a7528eee0e5d7459f480cfb47db10b8b9ebb8f8f0678589c4649ffd90dc592e3e6c6f4d34b303d9cd354417454626ad3b100b112ae0a8e233d8ef59b4c32e96994338723a4c9cb09539faf11e7dda5f4a4d0687aaaf089f8b9cd40baa9e40a3094e07e9a0f41e72f8e1b9e8aa9713f61764eb4e5eed07d747d1b6dc8b158d87750abaf48a3b5dc0277233ceaea7664e9b221b444d90f3fd70e94cfcecb004980d74bedef023c97301eede0ec60423ba4cf9dafcc25323806009cc165e3b93c0cf61a3192debc187b73f50c63c4f8589294f13233af27b82f061bc0bd612ebcf610d90b78b8d3793b7f2bcfa04beccaec0a7b7c7a93ef3a5a9f2ff9d517c200ab655cbb3a2e9feb222c362146d5f7aa10e97ecd8dcdb2574e0fe900d78239c8abfa82e9e226da3f7ed823da983fd8cc1e7d6cdb53c27c691eba751dc09d0cec2fa142edcc33f07d86943eac8f5bc2970357c9fcc696f052acf1f39b6ecf73cfc25d7d40143fa2fdf9be762fd536a8cfe4dad6fce3d29367bf8a7fe5378fffc191a0dbd0f8e0af2cdf23b13ffd4740a5b0287c63eaf240ea7fc20323897adda036157e637384c4465b78758ff3b74db037039c20bfab6fbddabcfa5dc3bd81f001738768b84f7a2dff435e7d58b9a11c31cf547228cf3877e165a7d7d49cd90433dd9902615d986e481a0efccffe4fc7c88c2e8e96f836b6952d26bd797b607762068befd7ce5c66d8c1593edf0f3f4e9826e6d862ca3e844d8a7b30df3af6989b9537514c6b6b17821f54a61a39999203e9cc1defe42faadcd661882cb66c436e470ef82e91d0bd773e5d6dc43a7f88577e50231c146b7d476bd366fd23f49555f18ece4f37414db782e75893b57eb0483003c88a27fd3a8292fb22d3068c7b72d87ba77eea3da5c9d77f6702fcaf7267e4aa51d81d7b0c42b30fb876f555aafb1e6cfc74252703cfb1dc6570b1cd5b47bff6f77f1a1c1cebb1deb1b58dc1c03261220b91b6285e7c757552c49f25fc5f483799a1b043ce0f3199d33e60184538bfca64ec59f440d596029c5ea146ce6ac2742a81326c9542d9d415d7c551f202b64ad399f1d87869eb528a4d0c8ae15ae091b9c8a9a0f4585d4d259be1be0e987700d18cccb3903e97490e50f1f5a2f555fa5e956e2266656b6c59f0bd80793bec9c1f040aef6ae0ef897482552f4bca9f66275fa5a7679e76c13d9d4757ee580e4dac194e0c2462771328820416793d719f91751c57766eeab6303ab60a241bc26a5bb1d04f5f32e74fe75ebfdbae4aee6e654695ed693a5e1f257a69e18be9ae068ed73c41f5875c4da18b096c0c84ff388cf9694a0052a12fd7fbfe1bd1873f631acb167c64d9a667a9c636e00823d52782ef4ef5ee24a42e5ee036a543749e08cc2e200373dc486823efd18343df82831b83e341686d39033535852849934ec82acee4da5a14130457d983223abd52ba96281c1865610473e49b7a732cccaea63d2e953011df24a32132d1eb6c0e0740eb8e0333b05ffb42c1eca2ac6c6efe0fd72f5fcd1c6118633031edf112a0e42875e3245be49a9c127e7343ffcc4eb2751b5820ddf22ff0f1d6b50ac4282bc2b931f5780a68feb0d5291d344f96a19ccc4aa4135fc03257322e9de1030632ebb86c18cd8888726fa82a795b6016f26764875d690f8f86b4bc5935d2823aa92d8bff6009fe28e551e7cf975d07a4a9db86ea7f49125ce98aaf37c0dd4f8cc59d9f308d4b831acb327e700c7c5f2538d6b4d9f840eeb5d8670404cf5df8bbf61b4575f13a63cc60a542168bb21273fadf4b134dba8e1d30dfc7c1cec50cefc5aa738d8525c5d094ac279ccb17bd4f489bf14fe27e32f78a4fe912c64a83bcccc8c10d71bcff1c01aa3cf768721129e840b2f9df5176202454e690b1986feec077cfeb3f92ad4224df439ff619b07e914c4e741ba265525b1f5e995b5f78c8e4dd181890976d3c48e2d238d14d86cd7c57704fa2aa25c2f063af600c2c7e745fac12c2ade4ad81e34f285e8b3b19ed5f47315a9adf90f7540e14e9cf40904cdcf9b94bb17aec5332802d6fdb89786b906994235eabe17836d3a26fa1c12b1c01b927d231fdaa5a71f9fae2d555da623efafacd393c71f8c181633ff0e58fbfa7cd39e0ec198eeb17662261f7975033090bdd11c4d4b4f30f47cf1209b9095a6c7ecbf94cb228a8a4e10958a6fd5fbee9c01519ab51e8d27bd22984193b28d7fec239d0c21ff53b919cfe96e20b8af24f75bebb221695e6365cf98d7a08a12e1e59bc1e38c3fa301c655eac7a7edded4bde25808d6ee4de4373b93b81e2fbc0db1547e7b873fbe27401d80409acef94021072df2e25c1df71cf093d2c9629a047d6360e019b5fcbc6a8f206cad486afe669bd87fd2cd0513cd0de6b5a595b426f17e5c2ef693bf40f08f9c7ea719c8836b92c950a24d7e1085b74fccdebbfa47581e66851074a398c35f404e56338330e662a3b83e011803f3994f7e9628be3920333e10839099d6d9ef5b670519dafe76289fce7e767bcf4823f681b10f1cadfbaac706d41f147d50ede549eec8314f1340ed7802f9e9e678f03f99fb8d95cafebfa115ac2727561f51bee318e39da51473cffe7968dd85e32c66a2e266bfcc8a3dd9e4c0b662aff083939eef95410043c90dba7bf5f62de0c11d9707b9fc1d2d71e1fefcba992da1283892fc3ec09086c453e1c866ecb076ac318da67d110f53ec6f3b26233e1460ce4b6b39a1b71d7ed873ce3e4b62f780f657c1b72f87aaca6f02d816c3577d362d89d85a73a1a44d7c2e393cbc660ccafca1648a463e6ae2c6d2613f26dbc0d21c034310793eb23f1bdc70af11eab15959c0ab71d64cbb265c6d8082e922f3eeacf1e7584dc468a98026c8c0d2eb040cb6540e6db936a63243a4bf29fc909e9552c2d4f370a9c8a2118367de77ddd7bf1d64d592cef06cf8813d39f73f1e10a33bc571a21a6ec6b35624a6073bd08dee4ff5cdec08507857546b3a76f1b2eab35af8b3a1e36e182df12035d384ee8c1bb8b5dc8c44e51b37e6aba6ada02bf89eb8947ff87b5b1f154831159c9ed2151b89f9d262df3a3ea3ea6616afab114d2bbbf907d74927b7d7b5d0b3a97fcf3a858b6770fe915b1416d21e489c8c05b9a5bcea5a8ee0d03ea204273a1c54d522e021e477a44ad754758117bf2425b894e6528e4480c3ee03d7717ae1dda61f68b8694c7a18c2fa8cd2d709fcb1ab296a210a809d395553c6d2e94ca40c1a813238e4132e8c9e2fbec2ac605b1176ed8b18400e2e87dfed2dfbbe11ffc435718a516167572c50c8eff0d9b1b589a5afb001db9313872e67c2a821319f39ad9f5ecb20e1aecfdf90f10c16a80a5a84831b33cb93dc464b267fe85b7c9e4b60ad68211a228d9e016a2ede3d4436d30576ea875968e84acd1a7de65337097deb4056ff1fc5e76076df609c636e171812187401a46de95d97f6297d4b107f31b250347efd24a2e11d91f2b7dc796f91342fb41ff6eb353dce67ca1bfeddcf1009d10b1261d58c37c1e9ffbb5fe5cdfd76776b2e7858039694f7009883442829239fefe10482d5b1f9dc8c5a49954782d3563f41c43e1ef4541590b5d29f520743f64d4f24d31129a607e4410951fc51e0425c991450f4f3f10bbc4e5106d63224abc98ca30869becdbe4544033bbb0fc21f540b7c9f9c61aa639273b65a0c8c88a669b6a7be69d34c4ca03591c13b9737ccbace50e05ca0b29fbcfa43c6e8dd9d3c1f27d9220806564083ef04c355677bf16110596e609997a8edf924536ba7db4b1e789d40a6f04a9e34751a965358b9e4e690ed280370ada5ebb53dcf47a38520d9ad6f9e5b79cae7b28608d009260fc908222c42651f27850e77cc884fef1e562cef70e8817ed4db65c40e8d8b7b6bf04d5835b59fe9862d9e8922f9f4766c3b3400d2d53eed545343df8718fd17887d2abd4bf7fc8a1e0f771be48e23a68d492fc7654ffdb676638a51ba393bf8bf1b36e61e062e890594ff513c5e2cb050ea6e1bc173f482a6f30e59e9c98e7323e39d8159eb78dfcab48b89d00f708e75eb78a81b293ea114fe4cc286f559fb4fe41f70651ccd66ba08b69b8b58980378af56b8af3d45fd4971bbf9030bfdd09c2ff0c98e6be53bfdaaeafa1d0319a550a72f3cb994dacdbc1b48d9e7707462f66e7476070b6bbda45a1f8ff4336874be5522c624b0a78bf1919b4f7638780845173f9b56dd8cad6045b04c73ee713fbea7df4104b6c828e6538a093b82eb9642e3dc5e70d58b082d126e8b160fe2b72edf14d33adc014c17faa248f3317df07782178cffa78cad0a27088c6c7ab1616677ca11dc9ad7546842b12a7238977e0b94caf3b66a247e89ab038cc68d9f45571c4f1a71720699945be34d56f99a3d95071f4b518e96913a71e3acd78ec84263eb234fcdf008ebaba20fa3fb7b854f9141289dc952dc8aeb43aeee9decac37d1f0c7451c04bee46df39d719f1116f691f56a0b70a442d80da55af00f8862f9d61f0090c35f06d57a9012d1b796cc87526aaff0779a20a2e600727b21624feaadbb1e5ebc728649015ffd8918c20a55a2c37076041326d37c9029839347447ad8691aaedb2b6b02d6b8d0c834728fe18e81f0495e4546b20bc710cdf3f0450d865a293586f8d21bad8d98b8b5380c025729690690790267412f48119b1c141aac6a8904d43df8cc169c783c84799d9ad2a7aa3dc83fa78153d531de720477e51d0b154989b24a5dc647c56b39d6af6dcd1f85f14286677ea4b9aeb6374ccfa843804cee2045460b86215ec1d4db205f0f6228ed411ad8bb33ab8c087f4aaafd017294630586277012fc3204addd2320cd66f1bdee077b141e928b93bbe4acdcef854442208b2e9c1d40d475b5e43fba76fef2b84cffb3e84edc640b31963aaecb15f0efe3d100467f69b4a4065d60b2704a825dc447b0616a2f874dcd833931abd1e74f40dcec9bde2adb042e38509deddbb9baf96ecaba80469640045e512b173cf42cf56a937a0f0252d02f7992240dc25a07968d675305513f61424dee3bc8e3502c1ffa6499a5216684f94944c9c6a0352169ba753920c0e00dc46b1049d1e4720e9e2512560b9295c6fd880c4340c3a4cc31d000d42133e58884a7b1042bbe047374105d01eb9ed63ed36d767cb9012eb53e4d818e18592a163bceeccdaff49379b60ff82aa8d2e1f9819e9ea6387a0ccbde54e0c0103ebdb1e553d1e9a94a10c3a4318000c777a27c9174ca6e09eb85413bda2b51727c4c4dc14a1e7baf46899e32727b2baf306280d2babdbac81d8c43aefcf1156774829732155410654f847da06f0889d02a9f2303c613990a9b844a5a6a661add33dc629d93255dfc17493004d41206f16a7bcf53ea2949a29350aaa70a74589cc637c884225cf8e5292058f1a3f010ea2832b7f7b7d50799ddec37bda4ff11236bfccfd77bcb9c27946906a87415405d6efce45d46be3c126d8f0311bb0bd6edc68483d21417c227184778da787330af2890b9f6ec3d1b8e4c0763b604495fc206845e60b62bf6a124f00fbb6e7ebb5abb07e85cdcb6094c08db56f7ee09dcd5a6c77119d9a62a981aa8b12b2af6d1fd6187521b918b7ec04daec377c171e98026a20ad22e032a51b602e8ca27fac6a12c58b3390cde26cc02761852c3fd6924cc713a45ea901d222504f652f2ee5c1a21bf65a6539e523cafcbe93a091cc4111ecd603d9a0766871e06ebfa634e83e719dbe861d16bf86d382a8576a40bbfd37a472831f34c27e4c79e8cdceca67885a8475536eaba2ab3ccb8011673b3de3e496cbd61cbfcc58a983f6611ec3063ed0348cc79cfdd9d05f42d88f3c6103caf30ab76e613feb9f2192e0a68b5987ea0bba36d17867eb8d03f172ecb6e04680650135532de50c842fc1ab399277bcdeec14e32921efe7b48f908a676ac34fa6707919ee5bfa37c2bbe8e500e3328378fd8d85fca546320f9870a986d0b75cbdfb7e5b98c7361e7adc0f3e14c7ddc6b1a24f8dfe4215ef45faebafb792baed7acb8bf2546f3b5867f0db6aa4dd9c5d02969efb3fd47e4a6376437be5e4a25518d08b2d1ec3cc0d99006d11e03d159cfa96294eb4fd3302e8104e600f63d16f48846635e2cd716971e812191f56d191a8cfcf63886b8ecc1b62d92a3263313d0b898fffcf442b8675aa493c2f551da62434c51f9bf8bf03ffea06abe31e68413cdb3f50610f80de41b5b3879cf3083da79dde21159f07a8150fc8311ee6c276ea77cc78bb63dd3fa886ac53b8b1612c11a3cf1ecca87d3d089754e2151822700f19d61bcd1bfc03ec2412e577166f4cceb8a3624df131e6ee8238498cf8edf6bd17094b3e61104d15d7c6476ab6988f60e4557d56ae22195886dde8466d69078437102fc4e22f53cde6f5b46a61d164b96dd4bda1534bf67c7c7c86c26dafaf90faa4d8cae4c8ff51c95e81616755651fd62414bb8b8f05f2c91569ffdb4276987098cb6a269c9f4045e0915e4d26cfd28f66f23f5b37fc5f13fd53fb6fb38156c903e44839f14749049d13c6c3ddf906033601da01e8f9908de877f9bd8f52c93f3d4546d443d3038e90257f9ea1c4f614f8cfd43546de3fe9f2c143ed68e9a2986195c8fd22e870b86d3aff24b69821fef26b273f918dc23de799ac3c76686f8fc6d6956589e1c5d393580b16eea58f64e461ae0207acb27149aa172f5d17b9c3759f0518f0f63f0836acd1720ebd5f9d535cfd42b59efb83756d48449a8e7de2fca8a89eeed04f002128a7b8f5720038bfc9e1f90d2b2a03825d6274ee3ef4921893a1eb6e5a33c8d2c1f940550d3cbd8c9dc843584146b4e82b5638ec51653cbb3eb7198f2aab1f8b97949f7f570e22e51f18474bb9355d2e5cda5d85d3f23cbff4aa31037ed1147b9cd09ac511091897358d8e75f1e877bc7c6d075e8c59c1903bc065c3c602d8126104e9725effa51ba2112651775b372e484d9a7357e96f76a0bd78b3ccca75123a479f9f7a9bcff79c808fd5f37cc79cf4e12b7f4b894bffddd217cb6db2731e6bdf8dfb4249dae7196e0f926145950a9d0fb4f8a9971c6e73dc10047a9c24ae207c52599b87a2dedd6a8d1f1cfa2f99fe8a9be9240026b3c991beaf1461642edff7dfce24cb321f8a4baf3c917f5ad9ef126dc67781f6d5f3cd4dfa82cce001230937911fba68bf4c68f7355f3a0a38cd31ed1737fc4b451395ce464158578c7ec7c25cff0b494b58c1013bf5c01a753a44ab2a3135cd7c3a1cdb8ebd655b5f7972c590cb147007881de7c274700766c7bf63eda37353dc17a48bd6377672317dabc6bc66941d96fc575bce0bd66d0d044c340c9d68f9fc164443140d8f256ecd107d73f871bb6e8329d3b2759d696ff0b1352131a008f84d52d5d18385ad7eaf937f22c9b264fc408c83ccfe14464793423f46c8d5bfc267c3b1ddf8669e6fb0573fb7fbd158712682bfb6913bf46a91a275067fa10db856f0d8cd62b8c705af75132d6b2420ad4a5bc06c984a54fb3198816fbdc08895ce5c107e7542113fc0e5d2e0e30e6b5a29794e4f08f7a2227165283436de836bbe2d83d4404b6852acc402ee899228d5c2de5270ef235f757aae447c21a7927a87e419be94e898458e742eabe93b3a505a93423af06827678b46d2ae4e1493a2266dc3413c45af5e25954dad2626835288806402d1baca9e828ca3556127647fc6079d8a3de9f51881b2f9cb43093748f643fd0e6ffb495fe66db70ca92640601c867a3e0920ff111cee6db46124e83d720c5024fc535f0e9a6445892a3506ba68623c5fd3adc59dc18c0a1e3f2f720428494d1ecaa4dd12918742800fd55cdf144fa889e83f866d7f1313036607f157d83254d072832e490a92f42fdb8bc4fa01f4c96a2134f25a3917e58b621c4bef512e80c34842f851e141be4ebedc224c7505dc3518b38adb659b70385f64fd47a3068dc26d92e609a11ce2266bd10788cf7da317641c9e0e5cfda072f7dde70b70c2dc5027e247d4f355079c71433640400198ee6f9a6e79f7d7792311c355239b1e0a76b8c5d9f2571211de1fa558e576f5c0956945a1b9939ec3822cd11f35f8587c7e0536bcd2c5af353071062ab27c0adf98a03a9a6c5ca0a1042064ff6554d83abfb33b336ac7d5ee634fca55432b0ac1d9b705afd37f99af25b522751ccbc2bf43842e152f0afb83e9719927d3989371ea4f9ccd79903a27382e80367f7a6455cc798e71ac729e0488de47fadef0dff79d90276ad9863673b8179952ec85ca2f73af4bf2f6d2f9df58bd0794ab4a60cbb14de82781cb7f45b81199e3ff9cfefab1f55bd832a58ce84cb3b0f641ad1725d8da72af2011c72134ce6814adca38df05b590458b21151f1b0f805b1ea907ff258664a57421776bfc74df3687890eff0db6227beb89289b8a6f3bd00d09956025b00cce406b8fd146c88157b59b2345f91b81dd26f27619ea446af06dc4b631cba8e227579e26ff5bf204a162c1d861a3a3caa4781ab3e15dc0e2163b5f0f3bdc03af9b2a467055ff379c94e73c83b5e812e08a3211710a761ecbbd8fc810f273b60c81eefbb73096a8afb5e1563b2385f4757aa19a6480367fcdd4fde04c3ceaf48c90280d140883464ecf50b1eadbd689cb29065ccc5937e4d27ce2726321cc6e8b1a0b507ecd8512768152b9587722247572ca58c74f4a395029a1da51cd4c14781137588a81997808d96331989639b7a4c172563cdb31bc21f9a4b6e96d98dff103b5c41218c4e44d879f72e8342331fe0954e6a67aba46c5bfd3ad91ac15e902b53ef1ead6a125df487e58035e9383e107f737715f56a49fc5f7c23c1cddd0772abc897af4ddefc1b26e7b82ce34a76d137c3ec09abe353f98bea84f30b45c601703ffbf389f3e39faf04ef38203fed1e09b5fcd032006e59a6ae10eb10a44d1284343b64f2a0cfcb84e259fff283fae770d60642f14dbb8f6ae39217812e0b0031f8121fbbb104a0f5918f38b69ab12b3b49cda865c687f49cc784ce27cd4609be872a5612a170ad0bf0c8d11cdaaf88d96c8d61354e85c4aa73c6949972f94b42627b5c6f22d0bf6893cbb2faaa71e7a5b8d88072caab5f0f6cd8c55f657dddc7c218521bbf2ebfbc0dbdbd4d0a14ac1b16549209967f67ef053747acf52899d8b867880b5790bc8efa28832536cda2336046798d83419ee75e832fdcf82efadf8df3906fab5d9c9d15b3bd2f18558955699942307d294da36a727a7a30817b9bdf0f8fe78c7938edda4b430f14795c1a7f3ef3ef0c270f1f8a3b9e59b2ac637ceb5ee0decf0950977f8b0c9e7918bcd11d7ca65e221770a74fea160e626c04629ec2d1a66a7be92020c6136b0bf89abce0d0acdef9edb8f4ab707540227ec9b50db4dbda5c597ba64f505787451f0964a2afac21327fcc61ff93f82d15c000c829c48690f025bf9d91a8ba082ed1370aa413980dde3b41da7b16a65da10abaf0635f7365c696c67ecedf5c3ddcf0a1637247e807f4b9588845f0d125f4f13bbbcca85ad43d0d7875e6f946d4d5fbf7c3eb2b65555d7a622f1bea54a25c6faf09be0fe422de5170b70a8f9288a2aba663492aefc96081e02bbef8aabf673c1c31c3068af81be65765738a04eed9f737f5fb61bbb1d0c1740ad37620bfcb388de6e4bd1ceda72f46cb35c29b8ec9a3af121dc0b346022d2a8c7927e2362654799b94dff0b1fea0247377268459e192b0bdbe3b68e6be6dc72cb14f1cf6a0696b9f8b056e79cf9a3ff80f83b1afae8199a5de7392cbd44279b4f1e7e89945e979fbcb692d803ee6710b8a5bedbb43257fdd3996804f415b4453962decbc3bbaf6fe3db077d012561e6624ae0d81569c125a0b4244a64c8fe1ddf919f935771c059dc0efe98c033eb80800d575c1da819d9b6478b79b2cb92a071f779d48f0faaf685fb2788b1fb604587ba1c9985dc7318dd33d8b7924e92f19df99235f669a26f16ec02e311429d144d0c847b84451112747dcdc9b9ac07085ff341d5b1c126f050756e6714ffac2703c4a9311b41616431011a9d10cb4bd0065792e36510af8bf19e8ca53d69811e8a594d9966d5901b68ffa50784ca61fce3c952eff3c17ce71e24005ca566dba7f68d4d40ae431a38c9fb19301d1fe9a38def74f895464da6cda3d8f3eee601d86427c1e48f2f6798fa31642c8fcbe5a87f323815f24f593763c9f738988cc67a7fd91847b6e17186c857f4b1d0d33c030d04a484848a2277afae71ca4e316cfc5b35e47268ef3e8ff9f84341f9c61d33bb65dc34f96edb749106d71d8be849e15f612669d3e93b1c79bcb4e8f55e04d76ca010c8ddbddd034e16a60ff1700015ecef8912222bbd91008ad4cf7c86a479f783546b80ebfcf3077b249d446471c361e0216db9bd8a6d8a0fee55f4da7157d0a9b655ead9f6bf0494dfefa8701761a461ff832460e82f146e39affc11ebd1c20374e9fa54f6961af6b2c8cff47c122f7c9ed03df9cda670798f1a95bd883aa485c1a6ecbcb3eeaffb6da3ed9ae8af6c6cef9912bbd89327f677f0ed4b36c9cfce62ca71e08bdbd212ceeaed69e159625dfd8ea2e5f954adadc223786278c48e8e1861d104d4770331323da690960cc2eba558722eeb875910ed60b30d752140038797aa52f3ec3af7333a4618c4a0399f3fa32289307b87a221d067bb57dc71a3376dc04e81b28bf0d639cf77e29a4b6748dc2c8b8c5c6ca317cef377266e3b92a4bc0a52a6f6a97c4f374fbe61892c5c0ba3bb0c42a07566850e4e41391915b930604760dab728997a52fce0c18556f060b8a928a8af96e01809dd1fc862639d42bbd5abb2f7e3bdec4ae1c5e9b4f2d43f751a9fa45d995a335d7024a3fb84a5c35a1b45739618a4b0e5ccfd1961cd69314a016fd7f075aaf28d27fa90516ac599a40a8925126ae54ad27322e5c68124f1df264bed10b3f034e5d4a35041f86ab68baeb75fb2531eb7436043d5734a8457a1765cfa5f94450f57a31bf5e81761a174b0dac42710469803e11b067c6b9e158ec85b73b2ba20bd8d1adf41240af409950bb14ede8b193448a967fb790e378619500558bece01618be041f8dd08059dea351b631ee8657c120ffd5a10a425e5cd79b050e7b87946723b77bb0b654bde1ff0acc003639196a8b5f90190e7c08340f0a145fe013bfdfcadf35ca3dd7e68dc27cb47748a306053a6b6fbf8b67bdea5ed281331fa4c8b4d468ee38331cbfff4353cbb61b3c57b3da353ca8e8d9a5f9957089401135187ff69183a761701b40f133a37b92759907eb639e4805649db37c91dfa4a2f06282ffd5ab6c06c8dd824efb861c91f5fa5de799247f080d61986463b6ed95e77b3f782bc6ed57ebb94730fb64189577ae47378d0da9098c359fbb4ef852680a5bc84cd72c6e3d57b09b8571c3903794b1e96692b5fdbd331232cadb8fb6d9ac746e6aafb517dfda9ef06e9e0f523603e119f480d1aa6fe3c9df955acb3cdcc60ca3c290379244ee8e8eadf0533bbe8820731dc17fe409e0458be6fa69d5bfefe4224c9170d243bcd8cc3a1a38bc3e2401aa1447e032c025b6c5c7b06e01984b6aa50e6296874b514976cf91a4c99d3f1915bcdf3e2df19b09f6f453af5a4b1f3e8ed632fa4d00c696566bdeadf37dfe9fe0662ef071d883537ab52c9d9dc94b22b709c7c60f2f72c4ffcb72301f3025e55cac47ca3ecd865e337897c465bc191f5d0018fbe456c6f88dd3ae3ed22c897ca471d5c949f65c16e0c7dc872ccb3eb8db76936963a7f46c260d1e15b355835918ed8b35fda1f65a0a9979c17e42b6d494aa6900c9587568cad49a59907f67c95c2272fc4beea967a7b53f8d2817e1a340a0b52935d58266088293d8107e0194d44d0d43eb7719a1e8e3c5a2f43aecbabc9964384ca6098c169cd3178c03639eb4a10a20ba6326cb343ac650403ae37cf5faa3a1811fd27a6fe60233546ffcd06ccc3b2e21705c26d01d22fbc0c90b3e73735889f0e333772e1b6a050302ea20dc671a1fa5d080b8869d41a2865c99e81d15aad30c34e6c3d1f19ba0f51696225e92c68794816fbe72c08aaf7531b04de00b6bde7f9f72e918b44d056f42440d6f2bb58c00feef4c7b85f77a44a0bfa126a9bb6b52493359094511a08f4323fcbf93aef918060fe32104b4d1985ba114678540f84192e996e45430265a1a5635c99f764e8ce677fa0e0ebaf39344d327865226060d7f48df44b10afbcd7e7f319122fa2578842d86583048946d462a45e032be026f2a97859e77ce29cd1b8189b668aa29784383638eb189545bdbff27851c9f6377c05fb4b229a51b954cc73e3d681406fcddd83bec0866d58f89ea51877b780fff7ddd5a7dadfe9a8dde25d3a36a981e789369139ca2ce48142beb9e0abf63b64e9402e3a01f0dab5640ef97b2936db96272ff01e3dc7fdff92cd8f7db50c037f43d06d179b35dd6cf0dd55d79de021a05fbcfc3af1bdf1c3f07bf33871795396d50b723b7c1d4bb7d1a947feb507564f6ddc90277c1ac25bf132da4ccfc8016421800f3ef779b29ad14df91f11aff3259e3f0d7d387fefc9697057ed7ac936fbd4eb991eec197db3b4e7db0aaef9bd551f16a6b658fcf977ec89efaefbff41de062ca53b40fdcd07a7f18baf2dc797fd90a29a1cc27e284b317d7ef895efeef1433320d2bb30059a45e43d0e6e14598f7eef166a594b412ea302739943d97630d801ed0fcd1a7507219ca844d4caa31c9528e5eb436493815778ff7fcff78dc9eeb9e87511b08d304af6bc05b0ac991c418c370febdfe5e6ebb14ecce830784fd5dcb09ab17e696fb383865bb51052a720bfe7f7ff36976baaf67c2bbe63f37b128d374ccb14e19ceb3d0fd7fc76818632dff7770cac47db8b0ad57e4fc0cfc1f5dc337849357bc89dec3cbbfb857fc83ec8227665888bb2426df11a01e09eeca96b1759c96a091202ff66fdaca7bd98ca3bb55b5316f48168a1710b267744d4a2661eac92f067ebd938c74127a56dea2c1005b90838e642063a6af3ed7787d30fcdba73329d0ee2419a41733bbc14cb13b44673378f59d98566d131eb12100e60d5ddefd763ba6779d0fe213f1620c88fbf45e363e443ee872b199434b2ed65ec9cc06c144a73939514ed6a1a2ffbf2f01bb7c6d1d30a6dcbe9f5c1174d804b06c9fcc0fd930f43b2f31529ab88fec911a3d5d731c45fd965818bb6fcf966bc6904165f745852f86e0adc41a9ac7cee4e2fe94c23bc9b935e47c168773f00a49f7eb4f12017dcfe24c93535882a107b656cc812950b517d07099e0423c9e4edd50bfcad9f7eec594ad30f671dc47b7eefac7b61cd7ce2bce7e67b47ffd06b5d35a7a29d47d48bd307d27ae2de0709dce60a982f2827b730078ccd523a11847bcb46af4ddf61152abfc47434f2b8929ef06ea7641aa820a971bdf65afb98ed9d07dc9dd96795f6ba9e9119ca5ecb23f672ac6993962749af12a0dd2bc93cf493b05cfea6913fb83a60d2cccf2daad9c3477505ca5c900f9fda054bf79f6559df33224df0b75bae61f3ac2c0d5a5c39f670e68759e66e039d6e8c2a091f06d6bd8cf233fa5ef6e0cbc23906b716cf4900c655b5b75c737f81d63f91df2770d697f839078076dd3e1b337a37a299a5ac5dbca7c1f1786ee31286daeee303827c0007f3528e1d543767dd8f9f9d8b0ff5b735bca30ab67fa4fb01b119b7cd9a6df8b2ecca8e371b73fe38490b209c122b483f4909685de0c367f8f075b0e6521c4959e3112dc3db1fd081d42343aed372ded6d6eb73e15603092465da4338e10b333227ec1241f7d9d239aa9f2d0187cf1b5ff0ceec1f2a5231efb029235ef549367aff89703becaa8d67c1eb8dfc23dbf61186fdbcde31478cbfbfd7029bef80a05d3cfbdee4aa75651d62ca82518e0b16243bc802bce272c51b39710198ad9de5461e340e58c409f89cffee432a5d6e56089de53f83aad294030b55015d2c4d9a420852abe74c829e310c5d36c721ae1f2ea8355e9e78913e258be5628faee5038767df9a359bd7a03b332070c126868ce778d8f8ade871eedf3c647f8e3625f7d2f02de55456af687cead21fcb88eebf3f0064ffcaa7e5a1cc65cf721a7ac0037ebf3861d6dcbfd3cfdc2a2e78eec427499ace518a3788d3772e37eaf0805491b3892a80b73f93f31205ddff55017e2224755e6fd8ce524555d99d098d7723a96670e72b1396e3edbd943b8a8bb110916aedac4481f72eaec3d496945922a342c858c1112a214c46609fe7692d7ecf56a6b17b4f7310fe50f9601260c96329da05a6e25e38fbcf64c08e1a60306a8a2c2f78e820ebc84f81cd868adc34489f899cdc1591e00f36d2a181c361044935dd37157f0b78507c9456e6865ab0a79ae4f1025aaeb13702a293f28f900b3d65b2a9084ca1f8c67524288c896567673cfce1bcfffcc0000d68b95cca3afe84f083687ecf387ff98540cea387ec43808041972becb4922d783c7c7070b4c40085cdbd6af9e31f0631a1cd3682a490553412c58d1d8c089ccd7248a0b54230c0dce80535ba6a4b8be1c59deab5292d59a63d95543218b9b60b7ceb441c9a12d800447e0bd10b10f9f8ae3d12c26268b58288c43b231b848816615a41dcd4b8730df7693e2a2aeda79962b9bd7277caa0019108673ccedc751da830e050f2c5b8f92e7a21dfaa914436a099c9c81b3ea307669f311494be71fb52e1c55479503d249879b430f2ccb227b6eea4bfa46159b265b3f8e4e8713c244773267edea00f04d4ded23982d682b5bf0d9d0db3389edda5fcabea454d581390fbde415edc61e5e69398a685071dda60be1f19c6e744ceb73dbf5d4516cc1818d615ff7351cd73d81743c655d004efc8253bbc984e06d7a32ea1e7d426a433c44db9dc70c61aaa711d989839e9dd6020fcc88b855ffba2c306796ed2fe0ed6fb6be0621f7426f8f4737b2ebf2972fbe67780e7bbb69c3fbcc9b776c3a43cbbf408b82120f497d3cc3bc1783fdce3a584f837fa690273c8dc4f21dd18bd42367076447a3a2ee0a31e4e983d1f135bc6745eeb46f448e5df1a1eb8287426f451556e8e69b005f4110e3136b26256a6cf5c18f2a85e2d585b096562feef7750c5744dd6bb9f07a9f04dac1d80cda852cfaea92f2871058d3e8d5603e28d6585c3774827fa88f138a90a14b175ddff92c75041700e0abaf72f9d6b4e54a4adfb8abcdc2ae59a58ced761c2f45290ae3da0d7107a5f2f069840f4dba7294487b5f22dfcc32112829bc51f09e9cb26f02a2b9b6196a317e9fd1b05a1265e683404dd2ff8afafd297636d3643698cfb13b7ad6c081df2d3e3b207e3c574d9e8f9966897dc106633e2107c2962bb1133d01bbf2f4f09afffeef4feafdec03c15bf3e7b0e49fa6e3a7cc3f97b3f44b4b07d4b7dbcee16f4da69de3a48ce076bad76ca25cec54b6554a6105280a60ddb7d5e81b43b34c7b158dea94c18bb93b3f1a954a7f01271be2e6aa42f54eb0677305a9be9700de3e142ef3a56e1049f71362b430f883b78fcdc1ea0ceed57bd65e26e777752778256c28196e6264bfd8e54c99c4af722983096f06422c1abf22af8e611eeca0b42cc00c36a3406118f2806983eb241e0f7bd8b284bca78679b4dc3c3cb38dd76e379a5e2173d799b25b2b5eea51b98ecb1aa521552fd296c66423abf05effe367e45e4cc221eccfc94a0576198fa97140db874e336abf21e5861971a48fe0edd5e016445b20354a8fd5d28dce3809d55979a13bd20ec5b4f034186245a348d0309b4752e6c2955e9f9a7b514e61a39c463754b61c88a0c209cbb21310bf8d645cc02749a24a4a75b78dab66a49cc33ac61a904df4a263453f35e552df48de8300d6d971f196a83d69276a705504a9ce2b7ea57c190cb9081c685b6b471a7bd12e88e401f4fe2cd9688680de460c07d8c542ed29510f63856cd97f5bee8a539e63aac4e3f77aeaecead71c56d578663379ae026fe2a4710f201b22cf220f9fd7589af24a1c41b95538626e6ccd185ad2c201f5a9b7b858cbba3420d11ae0edb0ed8771bacff413f939e5e3bb02f44489ba711e486c9c26cb16c5b33112a168a2d7171aa39b57d3482a8d9186e044d2e428f2c224ed7a6798ff777107efdb34ee61b50fefd359b7ff169edc396db9e640c071916cb1cdf29d8728d9461f648eab4d70bb2f76fa36586973c029f7acf139e246877bab8d7fd8428493ad7fd39370b45b8414714114fdcde382eec3653c85458642efdaf4e7e5ce05fcaeb3b835dc90cf6284f7bd7fcfd7fd9bdc0056c0aee3fd6d38d0b5bebeb5c02e5ecd08f0953d974ff7ec683d89fe309cec3cf9305f3c0cbf04921f81dcc23187c1eb803f4103eaa8aaff23165617bd1433296b69f4eaff76fa547bf63cc1fd05a5e372bcee7077ec41453f1276023329deca8d67d2c575028d3201692528ab1393fd8f0c8327b8066693a81155a9ebef2b1849d8ff93498f1542ed78c350ac1f7ca199bcda82b49063e6af908a42a616b92b9104f233499c0303630cf8e2fd695c71c7630f5485dc3d010768104e63c0144261da1d5adfed0a18f9bced780e78c875eea6945368259356f3ec6c70e27cbfb0063abea6753bca32d9ee9e14c8b41f5363d2c9cb83ace3caa4ed0f06bee2e7ea4a1f74a044b21e9b959f19894ad64ac31cb188f475b61546b909e1fd371326714d1b40c3e6c182769c91e8538e39a1d14fd47e60c63e823e3c294f9515c92f0a20203c23d87f06a282704c81684422d4cc95fd2d3f2a3b1f934cf72af36183b136156538e0c05251e97ec7a05907c45b135ec8c1b7e1ba59dd797b9a27603fd7fa376a149679277643bd4efc0852855c2e3b58edfa8dba99d657567de71c5738055f1e37bee36f8cc56efd6767320b2f11339ef789ac270c2c48f4850f936795eec5a11e919efea5085381312e8261d85d5a4958b7d85e17334d802c64a83a80c27da87b9f68b9859bbe52bc6e11c1590eb9a78b462923941c36cfd4decc6325ef6d23363a6115000ce947df9cea8b82c92998489f014c6fd5ca86242ec65d309120ce31954aa509c1250de78ea6d3f090d8418e3fdd6a67207c0f93b424b277a264841451f9c0e64c2a837e1fdf4506c0ebb49fdc86baaf4c9c3d07f80b5d1c0f1cd22b2ac283f8c9ff109b8406e6613a98e07ef9e0832e771abab450aff85467d9a574f9210e649624e27c5d55f2532f4f73545f9f6941803fcf5bbe96caec0b5edf59117916b331040ee9e7f9436c3f190fd515f44a1fd4758bf81a8d19c616d4296e725a0aa5740060b5adaa51ee9ef4c3b47472b5d39022ff7b1bf615c359df44e4a1260bb0ada6ce51e93a3508ac1f54a48e3b549a3f5263324e24955541bc306a42b7f01c68e9dd7fbe83908e3c2560a9e95a2e7468154b9e896f673b99ff0e9c68a660dde4c4277ef3fa6e673d2e80753eb56fcc2ec4dafa3621f16eb99818d1d248f7ea6dbfee87161d64257642434dacf04b5124d075e3b7be7de20e37f7c2c47517b8652d596cc66bb2fa0ab3aed75fa235ecf59244a165ee041baf24bf3c70213e7eedf8d00672dd7c29ebd1d040fe171cf5afe1c855173eb6a37dfff6fd53614469c5f84cc13c9ea3e610fa14e47bcb2046d6a7f53e979980f44771a7c04465eb49fc1a5671dd013e4b902e6012e556fc812abbc89f17ddd7a3af6d765ae838a631f265500a8f8d8302ddd41a7b07bd00f2c53c10dc5c06dc1baa72cd74c6065c734135bdcf00e1f3bcf50b8de4d1d14d8df7971deac78976e584106a0af63a41dd140d970373930ce7f200f753a0952df8584b158c18df7aea0c44288a177f2af50db7d92f63b6c80e1bd716c1682445b8207e33eba3c667d0bb0dfc07f9be3cbc66d9df1f756f712343741cadcb0e8d2b6211c5fc278d86e7b1b4f7a0efd09f43186de95e7816e44fbe3196af7d8607e743f8734f59b08be999773791b1af72cf4063946a8c042ef703c6cdd1eb5d8921a92872871ff11da5df6b8911cd578e78b22ffd2193d08ca639d8677ecf4375062a21b5ec9a0ce94eae11a753fcaf3b9c23123a32c2338211eeecb513b17875eaf6e0f93a103ca34f89d933354838d6f3c4de8cd7e9b7def5b4e279f900f11eb0efc742226feee7b6f02f962c385b62c5ebd82cafa681c8341df8c43e3f6ba4443072ab11d15ac93266e4e64603abed7edcf72c440b2dcebb46276600c1a4f8883b672732eb29149f89620b8e97642bf851955c60be7c1b4ef4b55a07398133f55f079a09f871341bd32b75473a1f258f186747511edcaf33bf93958ba0ff444e1739f1d1802f1bdb3d0e0ce11cf1ef6cd63606ed8819bc3d357cbbf64ff78ca231c3e099c7e5085584068defbbe9b509ca11561fb2e50bdcb4157605d46bfd5def244aa8f1f6c2a54d4615a21b383baa66e2c3f8d5a39698041309d195e5ff8bcfd34554da974f60030b1f65c3da79c95c744f14faeacf64d2de2370b2e7e810214d3e84a58310be44c962ec78a3d1e01b7a8c38c63eeff441a7b6f5771aedc947a01f8713b5c7462fe164fa532e5f2eff7855e7f3a41f277ec983cbd4647c383deb2eeb502bc5375d865a9669e5d10228998c30e13fb7ac1842d978eb4454f64d47f29173bdcd1903adc732e81e761759134a534623bc94b096acdb3de3b780c4ac7132d30527946e5f798426f5408ef170aed07c4f6ba40ef0f8b22d96715f7f7bfbc09c3eff4e89d5c29fb8661c5b250d9d5a7aa434dee50ac1cdfe19eeaa093d45fc46182f5e949ee3fd2436093c09a4b7d27ccef73c7cc2e1a0ec0b3b112f0a0351b768ab834884f3b17070fe77091b8490c62ceb8e3fd581d7443e4c31577b7861a4833fc59d6f08764faee21c9dc00387c4ed139c6a7703420d2fcc10e5f60cf3c7da2c7d31153ad83f951c2ad62a1c2a31dd7e8cbcee82b9f7b3582c006eec495893c4559ca17c32bd8b23cd9807f8e7afc0737bf2cfeffd84c5885f487cca09f53406d3383ce33d6f86926e34ac7423f9240760c5648a301d7f5829a3d0b56251eac8b0bf3ad4e1395e334804434ef6690e9bed0a655b9f15733b66af718fef8e346918b95bbff54400e73baaa681f446741c3b116a178e19e851d911a10b811fde93a2910dc81635d872651af43323058508a6600bd234b2a2b93aeb9b894b82753f873441e598fb82dda5f0488742a8057b69c031561a671345d06d9f4a2e3d93dc5a0ec590d999c189c5df40a8b84aaeed9e9948aac2fe4e629de7aa3af14d938ab520e28ccce46df016b3f91749f9618b8029b1b62932dfba4d695635017a85b4f1aba1c50107642969f3e502cfe4885bf7993bab7d3b6f68e3d443ba86878dd35a54416c216622d27cc92a3e3fc4df7ca680ae1648ab586f2b4f4a8a5f01b497ca959b66a14e80814f8c98051325e5e71dec17552e7fcd43dd709328dbd93b5db3462f5bcdee730e83365e5e969d5cf7e048dc8edfe07d04ae92bbd9a30ac405088c5ed865debab11ec472cb06c972acb05e5760c311b1442d0807af3e9174afebc3a0c376b2f026d1dd7ad1f376b7d11816c1a3570b2697be8cba1d240f730097c2914515453a1d9ab265e48e9ca2fa56c08d208527a4f2727de4bd53c5658368da41f98d62d9741bcb69bb5bebf5b9f04e4a0a439d85181db7a5136357e09d267749855e55f90e25696e896835057b29a5ff86419ee6678454bb56e3224ba72b5ba4ca7101045c5ca0910178f6b30cea54a821d8501282a564e805c3aaae1382e5710ec280c40a9542911e2f2410dc771b982b093102045e50a8910970f6a1ca7a58a829d0500292a5748425a3aace1381712126c6e104222d4d830b340a313525861318952e023e38086818f159e4d1a274683cb0f0c031d0f1c2929554c8470172c5614ee2004a2a4583119c2e2618dc7615949a8a3203005c58ac9109647351ac7c5ca021d058129282b25415c3caec1382e5616e81402a2a8583901e2e2710dc6594a44b0b1710022c1e60699224d4e4841e5058914831f18831a053e547e68e238321b583e310a74387c4051b17202845db45451b0b3002045e50a49484b87351ce7858a829d058094942a26425e38ace1382f540a751204a4ac503111f2c2b146e3544c48b8a16110328166a34c428d4e4c01c585c914824f8c021b063f507c6cf238300d2d3d320c7630784859a13209425db85859a0a320300565a524888bc73518c7c5ca029d424014152b27405c3caec1384b890836360e4024d8dc2053a4c90929a8bc209162f0036350a3c087ca0f4d1c476603cb2746810e870f282a564e80b08b962a0a761600a4a85c210969e9b086e35c4848b0b94108895063c3cc028d4e486185c5244a818f8c031a063e567836699c180d2e3f300c743c70a4a4543111c25d504c48b8a13104896063e30c428d4e4c01e5a2248a81cf0c021b063f503e35698cc6c1161e2f8a15583e5d52389cfc876b0c2c0c218444d411621802c1c6c679d048f9937aa6eebbc47a45f47e64e584acb754cc4e65fe45d0cf7a6710b5e54216ecee9374f0745af2cdbe80a8508e7dd46337ed42fd7701287e9d3796cf53980a026e81d71a32581d02bfb65cc0b696306245237b1642137df2a8f9b6f202c8b86700bd669324cbbfcba1a4f067b146cb592cb0fb7f70f30cb79902aa59b9b68f089859b472ce156c3319e46262e668cf19af289a485d9a62aecffba4be2e0d7897325af98d0b0185857ea976a2dfb8f560a7cb51470b0b80f0da4e87bae7b562440a13979baff72996fe808c884c1e30e6ce30e00755ea2e2c32d93ed416b7f823cd55bbb3a7c1b4ec318d19a78d5e0b39b5fad8ae17ef856037732f36f52a16c0a1db8cbcf52b20c708758360a87a314f200a880c9887a2803e161ffe96be9cae217cced28019003a7a97ad01229f92878d9268003d73ac67af57aeca11990cc1b9011c2820384310e3e515aff38651c423e77e58b0405d247762f69b738bc4dbfde51c4d5830fa1c726f2022052fe893bc81228d6e1d020006486d2e039ad43ef5a3d40412a07685b6b817bb3958ae41f6822e1557e663e020672f702a90d0db3d20645306a11605025e0c97d394dd15b0d2671ebdaab77bf14bbc278cc5ca9d22fae42b22af1a1df58ed468fa7c29e90b3a44c963740085c84c89fc91ddba5f06ea9a853cb77b42a4826c5c17c23f1b5a0ad22a078bde7dfa1642fc2a275a66945c234ae681a2d7a27509e1cb96eed82f8eb693657929fd2342c3f08ac6350a736b5d631439357bcd4deab3f961c46683c5b6b246618c90643d3ccaeaa69339bd963a6a6d29e2cccba6f20b05ecfd4047e18bf500a6189d92ebcf353891680f6c9d95b594eb5aca9057e12897d601c5b8ce2e8a9dc80de7799e6f6ad3eb25492aceb5e64179379dee2d8f3d9c7f5759266e28939188761b7e20a1c33bc796962fa27718038d750410a90b1fafd5175069295d4beba72e3d4dcd95591c2d6523a87836435d41f8d4cfd337f1c3ee7d00025b9b96daa9ccecbe2de53f27c53abb252dcd99488b17cc34b5ffcc14766c409f26b60e26f150e1b1a5536c49e606bbc990abe2126bd0234af94a58a53062de3b9b5725a061257228170929cd1d41f3b8b3804ac1a790e40654ee4af25cc52003e4b5291925cffada54c39734f8f3da874d084fd8b4980f8b2c4bec3e30575849e45a45fa8ffe36b5c4e749a9edeb3b46a22a55976a83d425a5e29998564cf485cef4e0486c449bbead8f3e79ac8490819d0139ff739e07cb44c940389454c35cf948d94b247f81fbc035896ea1b484529d4e39024597d6a2413550e75b48fb2054702eb8df5adcd597312d5f60f8e4e2817ab752e5b6d8ab399b436ae5d983061ef1676f521f2ee834b18d0a90d2369b07bae88488d825a9606e0d9a65703b190d9c99a58d5862b229f05968260a9a1894ae5ced9673557a504e5ca5fde1ae475dbde833137616a5bb07a7b1c4f17d7644899096b5b74667a7171fd8cd52ce22a1d6b00bcebda0bb287771dc6c16c7fb3f2d2f1c5ad47fda87cc63a364048964791cf3a857d927c1da787a9648cc8fb973c875c58ba8a81df1cfe30554902aa2324afb3c768ffea1e99c1e89eadbc2309e01394cca3b9e1efe8e35b7f979315c7785b0880e610076d2018e4bf4dac02a248af542840e5e7cf3a1d469f7339e02c184e949014c7f176c08aadb466dc88dd5d80f1a8f29f4ff7e07d29e32d2bcd932089cb6c2a653f1c37aca09dddb314e9a4d576cb944b683de0c609af6eaaaa85bc6f6fa20b4db6fb484f607df3cfa552fc320da15b15c645ed8a2cc4092656237c44de4c49b2f1d0e487b91348c9e1dfa3e2a4d84bd584618a888972c37ee0e6c5c59c57449a7dcd34e4569a9993da936d72e45b1eb5118dee692d27e0a3b8892110c62b5f5db391b31b54ab6e4f1eec64438b10ac59e6d9946cd1994f3b6e4e56c69816d43364a48ee3e5054d304d3d52ea2ac3087346611e80a9923cca421e452ae1e958d0a64aef8ed47e07d54cc653f4546105e820db0d7b10dc318ea018246288ea7c559be999addda14291ac22ddd5500e7183c4408451c6f8c9c6fa224f226862406b078e411dc600788ce02e6ae5bc37e6b4b2e523d65e276c5e3d579e53c1208a00341cc0cbffa99bdc260e65ca10fcf12aec3f68770382e469bd273984cbc67bc38368b21516051d71422765e96eb57240602f4cec5849180caa63666a51155288af94544cc06d6269dea0ca64b012787a9929a5b328ae5b4a4fa890049887e84c2f7e2c35baadb7583ca7db450351b76dd893872d716db630998196e6b8accbc4f35b560701794c75aa82ac26b998d12c0b6ef309656734b51c4f7614377cecedeff2dfa6b1d4675947775ef870c702c759a40e1b3c802a4b825ef7b30e310254bdb88466fd3b3bb01aff0a9bc92bfcf9871a41b4838e64fa1a222fad4081703b7f07c9cf8665ddaf14326d90740678045e4fc2faba9b217e4c473cb83730141d013212637d44b5196b16c819219d2a68fafba5fc7e7552da0ca526ed97d6d7becb7b98c1da5c397373147383316e8805ef9833d79e06823d0049b0121de1c9618e9cfd16bfe8c467551589ebdef4cf7633912dab1537001c42229109944248aea79082dd3609d33049c562d0df76b7ada03dc65ff1fa13d32ed2d16785fcab7e2109c96857f802ec8e2d695cfeda0e03de95104fc014a23b868cf7d26e5e6f5718aefbb7b603c7be4aea4fc054aa4aa248084820ce1d786490f3dc3ba2040f6abb57114558ab6118b3f6f9f39b8f019e8fabdddd2327569e08d37d35ac1c384e073a3754cc29a3c280dde7b93d2c300e077d87190e2ec7cd5a6510af494f8328c406ad39d4b0df28f707567dcec4e5be4be37cd81055bf7025178413cfe002df2dbda8437d6f67acdbecfe45a97921b66c13c89ffeb307214addb4e7afd0081369b1fe13c9c7225203889f606eb9510440dba57c68efbb431e4272858bed622583a7877f35999f3b79a2fc8d488ff8056648b51ef78d1cc5f11677104086394dfc6288c576db51b8cd2d7f19bb37bd34a6b4f088f806b05ed16e9cd4b0e6f285651bad7ade0ed5d59af8a48907ce8d2e0b418173443ed4ec0e89855165454934505a2eae7961b6999ca53c46d186bfa4ad3f64d90a776832ef371c1082460082e29ac933e8b6a0f7fac1b7ea062104a8344014b449b52a210b6f8489260e09c3705ce79796e494b276974e1d68e80535397176c5c4f1a7ac33e1660eaa1151bcf69064d841e5bc5270b975f14e8537431bd95d3f05e832cb32b04666343c9f25b0a6e14096552576c5c5c25163244cb3e1645e32560e2dcf37cabfd6fbcadf7bff1bbbe5a6f6b3949ce963ef8a38fd06da87c82cf54915242d36bcc0d227a1901c863e988878e4bfdb4bd1def06e5d0382159d4434426531c52ddd9697a01721027f0d1f7f64771499e8f3d01ea7d0f6ffe1cd362d47c42f1f48036e9c74fae8f326007f20b7caf010073897a56433af74271837d960dff0928957e16e09323f5eaf4f7b13de49e1f65cfebaa27d46af8bc4b3a9302c35e427932ff4447265fe0c758fab900766d4aad7da2039c708041d77afe89be9ddac434c7359f1b9fa7298822ac237bd05b27b1d46f19277d47645b47bd895934536d185a3cea517c0bb1bf2bbe5eec2bba3b6612e62d12521397a7cd3248c77a574c685e0e11ad289ee26560876f4360f58664ebd94ebe25f974e68253319749d8e109951ed89f28a0607ae58da68acfb8f272002c0180937786af9bcd2cfe3df01dd12644e8404da459750e3bc74dcd1bc24237b06a1698575d7725720f340180bbcf9c4e1ee507bd859bc5628a80ea96d04f370092ea5b941520efe6dd27ca5fb117ebad57e9c74138d308f2431660630ec339b2d1f37c3c60b14c5446d3c9d0f3402f1346fea22e13e17f13639cdefc55bc8eeaaa4e5ff7012166e135c8f55e781cadab0c993a8cb721049221ea74a8783de80ba9fe63f80858212e19c2224d32a69d18af1722bc044bbaad62c52fa063acc468b9a46e0b17f61cc7b341c9a9311ff2d6fd9e67fad34f3f5705be238c36f043708a3aa6d1f8e8c3363c1d6f03c59b0b77d7e8c95dfa12608ee6b6e83fea75942d16586ad6d7cc9b486cce2a42eeb0fdf50408e9fa332562a534ffc8b3163113258387162d68c546b238e706f45e5d2c0c126036aa66b381d14765090125b0065a159b6817590f12a1887adca895c5d24b6d82926fe8bb478a0a45b711f1b0cb8a3e37327a108bccd0a783301382142deb528f3e74dc7a8f2674d37751b6b3449f785120a0be2b160bf4b73d054732ecd9301fa32428c12e29efa3d805d9de84ddb895436ec4b4bfc45f40cda91f32c777121ca416f327c6edb95ce772e599532a2343fd291db5dd0d3a6c44f47fb5c79618db4eb8191e01a7313f8b2e07c31fc8ee1dfff3a8ef2416c8ecddff0b31358fb35800db5bcbcc7a09ffc66201da7ad7784483efd5ab56e70c6433019a9660645fc2786daf7fe4edc858135fae98f2aee85e936591cd2f44d1c738d6bf506886a9721c336ceb3984d50104a9cc7095ed866d53530301cd60477df3fa5d06621be8b668f27d10e175eb7238098aff660ecd84b97515d7e5a3bd57880bf68b947e97d226cacdcf1078a3e8d3d503dfe6e11cf80fa35abb216b7a355cee9546b58319d7d19e09bae4b0ed298ef34ba88cfaec83a6ad50989bb3223ad200fbc8d181370b27f045434a4b30e657988dd338b999a20f94f95b8e7a88f559af29466ef6fa651f5009c19772d3ab8fe585b6272325014f6358c62aa8f9166eb0f4fdf4c8da1ff77f45e8cdaba8421eeccde34b2cfc441e669023e4a2c9f46c1a312a5f9e707dccd05f1ddac1286299ba0ae6ed7b0e753f873fb4a69a110cf189cb0046d6348d6497c97bb2aa341b00eb67ae98089b7493cd65b8aa386728aba0542379839573be40950664887ae90ecf6b53ca57dfa0b035ced05cb1a0175a984dda919f25a51d8b16a4ba7219e76d632212daf188a81b2a6a022c40bd72d0751f49bda2a6deefc0946d99095c4cffc6d9b3f4f9d24b673fa55fc4bf944708d12ac4e56b0e7a49c0eb3e591205e3e2e03b7f9136f4721933ff05c2d373e5aa3f43bdda6080531a8504475fe1963f222fb66b9397edc3f6d781ab13a81a711ff7be668b57d0963287f75010fc076071a61b1fa884a126f6b2bd4e1d00332f1ba0aad8ee5e04a9ead0b452438ec6e170a3bb2be55610035e291292cfa94e63c31bc5d1306996e23913357a85312a2213f39284586ba9d7d83d14b3da14c7045f1776cac0b4951d509507b7bb8d877731dbaa246236a5548ee85c956df042303d126edd6ad3440ed39bbc8adc58f8eaf361328485dbe3216e702bce8219ca55bf0faea2a984b8cee89e01a34b0bc247adb9aea3ac93a374cb8c31cbdc4eadd7e59418ed12886c8e13b7af35a68ad519da301ac6473a751122c01c97a08cd8bc4df3daec2d7695d1cb168a8d33aa8ffd1ca3fa8721aed21e9e384a7b58e22bcde1c44353b5f509b4a1c418e3addde395c699398086d33f914618f3086c4f31d4f01c8a584a7948622bc52189a9d4872056a90e454ca53c343194f290c4568a4389c7666aab532803c931e64bbb9b973130360b46694cd7a1ccc63b5ba31abf00c5c794a976e0bbca3842862dba4b85745f40b0314df8b19cb349f7ea8525103e0712c3bca8524c25093167f7edb04ce15ccacabdfee61d27a252da5258c1b33bbcad2590a7d0839ec917ac0dc9265e6286c9f776b2f2c5e949eee6f63798cede9e3ad3e04f33f87a19b85f282deec0175f5f7d99ecf8fff0cfa2437562db64e386042fb54efcc3e6195335899ce52ca789900d0642ec2be7d29af38694e68ae7d2c475cbcddbd2a74d7433bc5b9dda18cb5c80f2f6efcb4bbed79bcc2a3637332c6c8d2f89fec8876ed6f5072d39f62f058e5f1b84075a08560d9c4db70e558e5d25add81781b6925886f9cf668d905fd0c64a68c3fe984b19e6d8960d4e58e4d789480e47d2db15dcd9efdd77a300fa76ee5e37bb0de8bac77d8114c34261a29f53113dc57d2dc83bd3b8674a04ada04b64f3613a00816db12081d276947687f3e2aa71906b22142d33b8b9fba144d70ccc0f12974c269a91fc5eaa13478a065565965462ad1e27e5c92f15f1c51d76176f3ec5d8bed81d85c0385782635ed650e6be54b8c5a291c35341986e98064af4a853c54a8e887aeb9be960703494a61c8a94bd2bff510fdf0ece1c51326fcfd9e352c466c0034b74d5dcbac09106c9c0452a943503c191fa818174101ea63d23f30db71016c4f91b158b3a4a8c419392b2a706921fe1f419b1fa8ab1ce609cc7badca262d1e57cd02d07cb83438bc6074b541636b7c3583f6d50776216db6b5fd95567d1406955155951a5cf13f24174803319e805dc3ad66bbe4e4b3703e55d1b7d58a6d045542c784ac05858254dce49f601180ba13fbd266315d9a2f860a552a15c51b53c50d62040fd1a9194fb432660e576d1285a2c807cb82d700dbe122a79d20ddab795e3177f11a4cae0219dc66c149f35aa4d126bda0acc09fcd9a8ab182ab609a369ff0e2daa7c413a621ece9c6a2a8108337ff9739fa281a60a1f8b28a15d16ea464c8a8c87107a8cfb020bb4b174c62f2fa5e67cf464af6e694d04cd6b9e72ebfdacacf854825a1dfe3d76059b728e2d44880f247719d67a934680204e1c37a4c55f10706718fd3441602f13dd9b78dba1731d4c4bc19d3edfac4ad6021c812f45a9ac0d7afe16b9a7ff034cecc85f2b1fe43415214aeb06d67106c3e468cc2c4aaf9763a2e5ec71f2e71e1bf8f8a5a7c392a37954a4481aaf846210ffd59baaa4ef1f39e4a7633f73878e6a36e5ca7654db5dd51e42a7d1e68911d3ce10cabd372349b564262928cc0c75ee1ab3ff684d5cfae3135536fc820c45a8f726c17efac24a853636b086da0958732d541703335c869b3b0f7dd435a2753b000c6e96e1235e3a98eb680f02a57b2cf7e5bfa1243ea2a0003e8063c18cf95632848edf6e8a969bda40f184dc3d110fd7dfd98665d189f1c1a6261fb2039f83b287ae8fddd348ad89a7ca981f278186211d7f018234b2fa3e4e93899080646847e534e2c0116b13b0cc896104143370285148de039741ebe6c8d797893d1b693e366988691810dc0e4c3831a69cda0fd7989bf3e19d71f3b7dff15bb43dcd0671bff5c5200331200af1584acbca51c90603d293d785edd19e8bd1c747559b7b2d0ccbfa6dc71b6d2a320310dc81d3c0b91df7dd5f0eea80b34ec641d74863ae46190da05d9f76a19e2e98a4602496b71dc0289683d90d4a2a071e0c9ded5cad89b31afceea0cd4560483d6f87f2426e902a9421a76d067cf6fcfa0847fe4daf411c30e6ce18b5b0bcb22474f65d624e38cd3030cf59b4ab04bc8ce3ab0c36ef6f589829016f174be04d076b5b0c7af7435aa9012273a80e219c6c4f6ecc0660eb5859e728854bab84c2a0e9836f753b6c07c0dba5f6b198ccf3fedf881700dee2dd2ac301cf73d26bdc5fe83eb5b2aeae7b0b773e4c570829c33ce8d2016b2c332ce89fddefd6199f00c96dfa5a88002e319fc01cfd04c220be2ca1312a6e09154c5ff9dda89d92aab0d3d0705c1ecae9c1a0b6c4d92e1640dad5c142166a0b1368b1e68791a18dc9e8ee163f4bd8b2cb7db7bb73f9591e1465a50109ea7d7c768ab945aa7db61ce6ad73bd662446c1ef768b1338e02db0ecfc1a975639a2ab39be84341bdd74116d10c2864607146505eac7fbcf5510300b6b73d8077c1c9686cf12fce3f45029b7fdfaa13aa07b8c8b63d48dbe2bd0edb0bb0a145493fdde4ade225eafb4a5244262f85706a8e7ffdf09d1ff370aefffff6f365d75b73a64e658eb13a29e0a59594b018d0c6d0de00cb07f5d9250a832ea828242b553d4a21b84c16e5997a6c5174909430f309030ec80e18aab517bfe130c5a741003148f8101eee843c5f005019c08e0e8ce4ae84e8d0850c5c9c765121fb141e50b2a637a901103f5030c971e5ca864b142e5b45199a2e24405a9c799fa3d353d3d1dbd40c69d15e46bdada8af65b5dd382e77f95695ab09a166735895f57f36f554ecd697bc75b3e7ea27a6597c8bf593ce58aefa7294dd8379a1286d7f0754100eefe56d71c3aff95b8407377e196e4820deefe94432f79d328d70528dc6b4caa4c41a79853c2a92947a6fc4c810999b2634a8e16deb469014d0b665a18e3d78eaf2dbee87eb29269de64ce2925871423524e290690c2841477f2b141821b2743d814e17077cf91e124c7dddd0ed574dfa17a855e3d91c3e0452b02114019bf02d579fb0d2e9c55468fdfe0e9c218c16f7481235d48a3fbbb6d8b0b72f71f2f256bdcefaa9ca3b6f6cc8ba6e645d3efb3bac27b53dcfba67b977f43bf16da37c3972b7cfd366de9427f87fb76d153234137b6b7872a6dd5397bdb76ac3bcd6f9298d4b6f6ba861669a87a359ccdfa3a47ed164a85de68ed35b60236923bab849428687c26563beebe82b7d22e5a292e15a185a241afb87b9abd63bb5e73a5bdb4b4962b1aa0e0997ae48ba939e25daf695a1b3ada9a33c53bea5cde1a7e9b54a37889d214c5a34ce03ca3824de7b33e9a2b62ededdab3bef8e5d54fde32ce99f9fce1ceaa42419f8b82c667f28f24479da03b8b847f248fe6885a67ebcc61e433b94c6e227b198125825e12b2e5862d545a9947ce71258dbbbb8756a96a54856ee314f9df97c3979271d452d154885e7cbfefbc69a4b0626b5af371356d3079aade7842bc1d0fcaf34c346611b7a79896d6edbc25e0f6c4ed04fa071e62934383aa90564555095121cb0f1584e0a142190da4b4b4546053858305342d273772b0fd64dddaabdddb2de27e69d9c4707730d090f14e8d12152fee675a95b36973f7342f3367b1c26c61cbe66483d984fc4e2bbe358cbd6e7a5d625cfec4fc1ac9cbf525ec0bc3dff7d633c7f2fd42dce357ecb50b44737eda3a156f179b6fcb2892fada3587b4ff5467444635564da91a9ba5b758f5c2bad17b3baa1ebe61886b77c4379fb622a92dbb00bb644bb0168446840c08a3c8d70882518ad698244a4044404b7422e2782cad5742ae41fa40e2ca334a25ca1ec434ca25ad12c867613360b5b0513c12568a3d471e5ab5195ab5a656cd45da403234275ae08f15d0bc905bc1882605142f50d017707077a75a4365866685fb7e918f53d743a1ca369c51d2507d22c32f253f2900f9af913c99e2899427ae27203cd1e0098e369cb871c2c6c9174ecae0c7f6a6df897c3433fd96c249fa4b3433fd998220781bafc04ca616ddff68c6b5a217071bd5a1ea9d69f53c8ccbe4148f29d9949229aa29ec7ea6d8be5984e2290f4c619952c3ddb7d5d649851c47f7bd3a42f1fe6c64b575d2a087cc148e1e306dbc29326ad2a689184dccac29c93409d3e44b13b26abc5accbb667208cd457fbb287adebe86638dd559e8aae11892db8a387badae46cd2b5af1ee178f888688442b45462a06a9a1a813448d7167fdb8dda82326372638526ddc59214469e9604dd41935d58a42f24e8d522bea47e659bb6be49bb88cab62f8e6316673da6efd56a4add8feceb6f1ea9dc2ae7ebca6989eaf6dbeeb757d9cb799c78c667dd6f1da4eab6b193d737ac45785a1255467dbde69bee335eded53b3c4d7146fb656752ea39a986a1494d4523a3e540d3204c58fc9173d26595833fa7bdf1137552f448a4ac274a40446311d2d25398202999a92a28aa49ea2a0989a8ac0a7232326a950d718bacb323f69355abd9cadcafa6b8fe26b6f359dcb98fef3655db94f61e10b4d4f34cdb6a23838932e6b9e35a7ed8bfb4cebe36bc2c83fcf5bb5f1dd50d57b6d5d337a5d3577668d6233e7f39b844cb3185378eedfa4f937f7e4dd689a3f5d52bd33ade463fbe668c933dbf3567119a97adb56bcc3d0346d99e69cabc2d0ab5752410a4d28418012234a50947a2841d352a200032cf9286d40890c251adc1d0d26dc62722da969bac15485bba7793167979a92dc9d0341e333c1f9e25ca49fc4524e669c6a706a52e334a4e903ee6ec45b4d45b49a6e70772f9c2ce004822537dc3dcd13069eb83479ea96a0692dc9618995d61227ee2c1ff896496c9fbecffc2aad33b68dbb42ed1614cf8766130a4a87d78b500ff852031a296c49c14a0a670d486c52a8ad14765061259d99c206143c294c97a42c1848b29274d54a8292a49484e38dac0d0d4eaca981012e86191b6a409a6222455db9a19491826048ae1a268054917678a746a995840d0d4b9290b101772730f7554242fa49fba0a7bf7cdb98ee5728f5a1aba237a3e7d5e37ea3ab67f2d0cfe1c7d89ae752f51e6750e7b15ad3a9a200060529145ce80b0a6550a802c4d63cc1230cb0474868a120c6900240212b42a71095d08f9611325a46c29cd7b66f0cf98d28f4d6d0346f555875aee1575934c4d5223790701ef1bd7a0d6ee0b838b54feef4ac40abb6319f5fc14f886633f41be30debe5d02fedb66dabc79d9eb496b716f9db45c76a9a166771f8f54e4f5af7cde6f662f8e69876cc17bf6889be287727bc3e2d2d2dd1da41e2ee6dfd56e966f500e1030f3a70772e2aa800dd8f5aa5eabdf65b59d7db5022a35a964df5cf974b3fc6b73e2d2dbd693e2d2d91190361d0fa19f3c3c5ddd3909909a8c79d85c14e4f0a24ba7b194242494175db1a15f433c5fc21a9947e90f4cf91d68fec07041bdcdc6e4f4b4b15ca93fd5617bdb7ab4f50df6edeed61d3d301f774aea6b579a2156f3c80c7a8c52386e787ad3d1c98c974df6e604e0e183b41f05f972fe55f97dfc64946b6319f479f6794c474bb75e3a0f7adae797fd7dc2ba9ee9ec45b332ead999a164d070dc7dd7b788bd6a4a5c50107ae708046150eaa98d2e2600b77f719cac112210c15d34c567cb5c5799c63393156961907678d5e9de43454f7ad5e89efffcd19552fbc7ad288e7edbfa6b647614ea3b84ce28bcb1aaab67278c859ca11e2cee2b15b392370772f5a3208c842998fbb774126798e066d786e2ef0d8786478676c18e235d1f2be785a6860d9c0aac15940ee59ec6dd3b5866fad66c5ad3d7dbbe978b2580c5f1b7bb34aff2d26568deed63d6cc19a3873bc6d0573b9b3387077d6d782d5166c8779ad466b466dadbd69de240bcb99f8c670c668c6e868cbfaf8753e6368f9e6befb0e413f37a496493fe23cbe69dab26e9d5d75ff7d61ebaa5b5b24d5abe5bee6b6a1379b29f9cab9f65025f2438b08929b215c5a43f2900f5e2068bd7268bd9ab8d268b9c0b87b172fd776c15c3fbc53a3d4c251a38dbbf65013c519ad1637d6104d331856747c8c739a42f5b669616452b5da3ad9378b72a27edbcd84d9dc1eaa5e466b9a7ebaf7addbe2ccb4fc9deaa8da3a0185d609414c4063420c2d137e4ed89d0a66b47080b44e90800b38371c2b2400384f9cf030c13d3880bbbb10364c943ce8e2ee2ea48c10a7960761a0804f421006c2348cbce093b07a501bc7e6769a714196041102840b20555a41bc84e0833bee9980903b40604280fc00a2c1b67dd5b9a21be7c98b6e10e7f0ebbe24911a86b9af22a18bbba7a93032e9cf5c54ee95b8dc1dc75b2494d1aaaf5605803baba3e9a4fb1ad52baa953babf5dab9575282927a02774f5302eaee5e948083bb77b1c58a776a945a24a02d0ed670124c2aefd42891a0f400372d1276481042420e36d8b4462843668426be8cb065842c235019a13582d91a81ca030ab8bbefdc57c15eac579f15c5e530ac1f796beeab4258b873af04bd7aa6b0c2c2b2894cfa3669ff4934babae5cbb5c90be6beeafb76ee957c5f54b8876aaddefe33f715d558f5cc8be2d495fbaa1cf621ebf1a6471410bef0a14208b8109842e85a3d14d0f27182568fa0568f00f850a2e5a38510826885c0e5770b842b777710ccd6076d7c60e603327e9464e8a9290a0a04bf1ade3bf74a480fd8f8064dd382dabe39825f0edb5b252dd1d65ed5f8b67c377ef4eabfcf831870e8b0766c20002f1b25793a6bfdad0e48f70e6670f71abea4b659c44d6866b2da3a5175e0d40152ab831dafa8adb9af02515b5fb0dc57b9d04ce1e1c52b005b3c845a3cae7077fd18d7947b253bf74a3253662293863253ee9590b9cce5f78120886fcea8d702e3ee2478ab75811609ba1ead2ea73bd2eaac171164b0c6115aacb8b2c61655d608a335650d362d740d36c26d73e6de8fa27603361b582177943b84786b070e57b6a00d907e3610d25d1159ad0d7eb436d0a0bbd2f472e9a8e2ee697438e1ced281ee3cc56ce9a0d211d5d261d4d2517dd4f065d2e454afeceda5dc2b7babb18aa66795fdb3a2349dd4fbab7359d19dcfbfddd952f576baf16f9c471caeb5eaf3d46f6b0d97903c31c9d55e3d9679e3fdfa9e575fd1fdf8cfbc141d9b0eba0e367077ef3aa7146081a1b7cc75a876ad5698ae85bab37e724eada8ae65e49d1aa596ac55f5a3e5d0874f35bbf78f8fab868d2999b5c555fbe43549f2de6cb53497b8a1aa5c370e7a2dd3f795650ec3327fa7638d4e4718a1a8203249006327001c774f6343d3210110a0dbd1007757e2dd8e27dd0e1ddd066aba0d7cd8c0a9db00834e0028e804c084bb7bd145070e3aaae84049efd428e978d271a4d3f1d3e970e9e04183100dc6741a80e1e1ee0ef57d424ee739b46d0561e186855be7a39c2325e117be94b89ac210bc7aef8ff09be0f65cb52a39aa44aa920c9cc800880ca0ba0c70ba0c70006002eeae82770040bb0c4e904108ba0c2e0000588e36525000276f48260d85b73c66ec41a1fa2754380fd50e0336397cfc9bfe96a1723439997312d31cea7254c97185bb93f1050666301823060330186c2183eaf7aa9fabd60f4afd2e10e382311788f19c588e252ff9bb16f1ce8237dd0539ee2c0ca02e506ab3064d678118203a0bc0741670b1e00a7945f3476c47ef5641e108c271026b8c92fc28b34ae4d6a0ca42588b84504e4e4a7e23ec665d707ce14e0daa3714e28a6dda2bb41464c5e8557c4fbc2fd9b1a640d3269235821b1d10774733d30d2077ef6e387537a27813ac2f5d585aaeb0a85c91544847602c21ac1d9e4679121cdf2a67fb8d292968e3cef2e9e1e1e2f13571d32d09fd0dc67274807a68403db31c1f6b8168a30e4dfc9d1e998fcc2716fb1a79b518cb95ffe0ed82628481aae1699ce08cecb4e8be5df404f50420a001c3cb9c71b5b0d7e268cfaad19ad5a6dfa9862f9a66fdd79638370cb539c65eeb2f5f9fa6f822cfabdfe9b85312702181064a2096a05582164a40a6046a4cd081094613543101152640a38db38d0fda08411b3d6809420457569862a241e04c18c81ba882e8212a0807046184511024080ae20b181924f8110408746833962c052f7c811536e50ab59d0a538d86e4dff4548581ae30dc61d568b51daf55c651e8c5a3d450958ddaf7fb76aedc17b531cfab614b1e5598d351f872aab0245758c31d2685a15318ab2fd1553d7cebcbbaaaf75ed29fdbfc9cfbe2e7552c8edbeeab1f4d73f86dd4da9ad40fe78bee8dedb54bd54d0e1a5ba0810034aad0e8e08c2fdcbd0b2132c96aeb86053728b87b17e74d23151d9d378da446176a24408d19d430410d0fd248020db09586998690347ab8b1c2ddbbd83829042e35dcb87b9a1d8224422083fb6e72de34d29bf44dcbddd3fccee61a205823cb1a3be74d2389800d11ec2082235d048dcfe4cd06de283102d93e6f1ac9dd5967743923cb19f80caa3394ce083aa36b99910233d89841c58cd38ca92366c8cc10d232030433bcd5c64d7745016d9a68f3a54d96ab36536d8eb4da0861b5e1e19d1aa5361d0d5440d0020108847077106471bfe93d3e0b62baabdd7bc76ab873d9d6ea65b3b417a755a739b76fdacada6ceae5cc47ed25ff76bb75db7197e1538606654829e38b561946a801819a21d458353ed6b8b086c91a5f6384bbfb9a35d634c1012f381003078c6ce0031bc86103336c4087036f38908136612061260c2c34e0250c323450c50cc38d06a23410d412e306196dc8f022860f28e4ef7c8650fe6caa64520885bc202c278e41460464062a203f034f19e0311fffd93406cc186368a932c6394638c69131605ebfadbd17452b6260050c5471df3817f98d1df7dff8dad16fe874e9f09ff97736f7fed10b238b3b2b278c303cbdc914cdf9e915e21e87ae4a260d6da8ef131a2f6a51a8baadd2f745057932990c269b5522356ce2aa4446e4d758eeab1e8c1c5f88d916cc647a011c60a4000c21fc02625ce0880b8c61ec201fa7603c81f1815102183d2ed0c1fe82ea0bd81742bc40e3c5182fc478417ab1e3c58f2ecc7421a68b30ee5e95339ac974d7a134e750f26d237a711b0a95fe4ca6fb09d5e36cb487329942a5e121cd05c84ba65057672b4d162b64c25ca5b1912994b7dfcafc7ddb57665a319b35fce7b663c5f77146c9df796773ac1540e3398be302877301235f0a96fa9dcd222e6270e7c2cc4d7371067afe380e5900c702d99f2ce0c50252389a0cdc5fca85cafa9da0d17134a41765fd4ed054713442b87b54d179d348f8cfa60a98a900980a78a980950a50a9005901aa0a04ed5460470572b45953e6cc1467ba6c3933053da374c6e88c90333fb660c3cd1668b630d3da02cc165eb6b8e2c558b028a639dba9aba2faea6bcffa0ac36ad5c343abb4afb2a6e8edf46e9c336a54bd7dbbe9c7d55de69d6651a357e7abeda5e9a4212ee3aac7ed2c7edc3d4dcda2505af0c8a2892c40771691a09772a12acca5450e5af854d84e4feada5a34e1ee69b42081191acccc26d064468d96992fdcdd8bd3eaa80924c09d3564ffd59f2e990011ee2c0c5a59c85a59d42c1080851b2cc8c0624b68e50a0b2a2c908ec8829061e1fac101588080450eaf0c9b325f9431e364c494d1a14c9656192bad325749ee42423b74a142a92e785e0b15e682e7b5904b89ea93fa6d74fcb2fc0a6b21ac151fd50fdd4f2ee5c6a8ead5dba317fc2feb7f694f9cd2746a9945d76caad6f0f5f23c17cc459b0aeb8b357ccb7cda310c4d32d77f2456e7b2765fbf551612324d5bf47d423b0715741ba7bc5c87fc2def2115b54570be285a3f3704cd78c850bdd60c6bfb16e260e60bed50c4e9ed96c78c5e1d55a11abe4b45532fe6ec0d5b71a968ca56f4a182ae3291b75fbc7adc68d51eaadeebbb9f7c5cad3953db8cd69c9fbe9d5608303d8182272cf004159c42a04c0b02b91cb8c74860cc0e6388a0c081c203282c00059727d64071050aa028864401c21812dc6fe31528c51952e020c514294c68458145145144c142143c31a329805871b3a2871519b4aaf832051253282183854c12322758f1441537b4aa2042059a1615271526b4a6b8c28a948c1a64c0883d895907cd47aff00bccc6e090f8f7134e4fc89ed8c186135f3811c6892d4e4c7142c9891f4ee468224cab092a9d0c23686207134c3021636209374bb4196fe3554eeefc3ef3a80abd5c41281eaa5e4e5b580d5f0b85aa8268cefc9f140a150c869ae9d7c854245f1c3d0d85aa86af0a738515cdd8da6a91d0346d517885a0505518ce677af5a3d6ac16966b35672e554f7f0d5b124df3df2efa620dd7b62bd524f9682a56285495bcb587878604850a66dbd6765a8d560b7b42b5978aa65ebcfb364e41a1aa641214aa6a945473fad32815f684aa7a75a9682acd35a3b992bf49227244282102077737af45b2b40511470cf1860834a272607060901031023018009303981114212b82554453114adc9d8c2a62c45f65a35a4718196186113b188154c49b227e089313868323a038a20c43a59f4442843011081385cce31b21310689f20156b41e40c3037e90c800aadfaa298744511237892e890c48313a926893841631f508253169c40c408c8b882fffa4440662d4502246c614287e2825c096123b4adcdc7d08cd106486f862e51c826a88a021840ca18103da70c01a3362bc38e08a031ce000980378b4f982e60b192e5fac7cb17d89827dc121c41b346384102384962a4208a1244490102e2176b0d1800688d100340d28e32e8a164bbd4ecd6b9190f8a1c847f2a668b1947e2b9c846626a31c7ade8e74b68dd8fed3467fef214b445a229caf984265a6faa1fb49fc7beb0f62c93db4aa61d854bdd70f19526de3ad154b136874e1a10c7001b42e6974f980bb6732dd64bacf9bb689e3552ce7365e41e1aca679b399278b615cd6a26d5bdbf88352352254eb0780a11f7efc90c37defdc998bb6f6489b4d0b8e146015e0c40d21eeeec43b1d1e6d7c60e3ee22b05e1ed4d65eadb43e647747af48f368b1f1c93cc6deb4e3466a7139dd48508a5ef176d1fd95ac6866c2b907237796ab0732ee6ec45b3dcce0ce72f5600277164e0f41b01e6a0f3b7ae0818d160f2d1e367a711a556124949799aab7718fad6aae5b32b0650a77d608ff04b50306eeac1332d861851d64eeac13aac6ac5465bfc9ae1ab3d20e55ec20843bcb041e3a7796902d5fb66cd972b5c5b6e5c7161e5b70bcd1010a1d9ad0a14b161d703ad87498f24e8d920e4aeeee06f8717b22a39a714ee31bab2f98abe6ab2dfe715774eb8cabb01e4fc7c7e27695ceb81a82218953d3a23b35fabea8f009c43d0671fe3edc546bf572e8bdb2a908623b82e153f56acdb892d8ea58f51eaaa2e9892f6c63a30cc309ff91841af7f85f9720ee71986db810369b793c3af5bb4a7a783c1f5afd6af8c662db1625a139ebb0eefb230e5d18f7f815269916cd51a1aba67bdfed5df25f2309ed68cf5b2ef2aa8e552f670dabdb1ed5977eab5cf1755574ff6cc79bf19cf66d4535e605316fa8cd73f2be34e74c0002aa9e85123ef99b85aa416aad1ebaf5dd38fa77fafa357335d5d8eb538dba6aad19ad57b5dab1c2b6b5d56a9a160cb1fda1faed274328cf1bd1afb00ddbfa73d8e6447bbe3ed39cabb0b751d5d3b05758f1ce610bea8be2af360861c3940d2650a006293504a1a104346041431334943408c08a125656b0f2c306310608e10a9a2b63aec47065c91520573a1ba26819000c190c20c5002718800459806401001634b09081250b2c3b60c961516a61d1e08608dc50e586a01b3ec8e294050901385adc68f9418b0b5a8eccc8010139d81c3cc0a10a1c8ec0a10b0e5038c40e80e600371cc01ee04716345970c84275030e30aac4b2cca06506f205273368f0425900310aa0a500386418f3c20c55c4a8026667134d73c5d64c2b0e4dc5a18742156e863033c349468c776a9486d83243d90dd10d31c40c4e42b7ab71aeb8c7a49967e5767a3d7ab5ab29acb0f0b5143ae11ed79029469af963aa44aad3dd577629c469bee3c5f589aa87cf6bc321e2140b972a915a85842a51d954f17d6aca894f47485149474446b3dc5781df5736ed6b4468d36623b65a7c95af905683aaabde30245fcc66ce625d5a72357d596d85aa1ed6d64cab977316e7ac90d0d689d55738730a5d356c5e1b2e872dcd892874d5ad5363b5bec2d7ec6f573b851516be96ea17eea5d05537adc66afd888c6a8ce6f4357bbbafcf1ace9c9ecc636ce9457eecbf8cb942229a532552674e95485daa442a914ec31d219a4e1af47d650643d2be0ec90f2b91ea9144c6a6ea916f752dee6139738f7fbbfadc386f9c459bad1ecd563b9b392b9d2bccd65a36c186d45dbf3d645fd99b931369773e87d40ff630a3aa03d6e189930e207409b8a24b400212f0d3f960021733b818804b12971e3d70a087263c98c183968e87d90e60ec4065871e355b92d8126ec94087257cb03e28e900c40f1628000c05244001413e78c0872b7cb0f203121f7a80e002082080c040ec2ce0040ba0c0026c5840b880205dd6e8a244175c97a31e8ce821edd2a34b053f3ca0fb21cb0f4b80e8001063fcb013849a206208a24917840f1fce0e0813fc20e4ee2e840d420035e0040de8c2a5a801b9230dc080016af4b0c4000730208a01421d0338f07285972b5ebece4b8f2f3bbe602044088438630a3142a84100029a90018d162d36193a90031b398491a10d0e5fe090c50d0e4770d821c3019c0e90430614b8bba39949ced4f628e7a86dc90b7cc1854766810587138fc502cb084b4fd00d5e7ceb2fda2c23671df977da57691bed9d7b255f5aa8a16d91727edafbf1a356894cba3aeae65e092e33a1a566b273b9d18722afd1d533a1d9847a9d8bd0ab67b28df93cb26d8b64436f1312a7f909bd7a26fc4aa639f4e67975d4977663a99d7b2543fb2fbaaf52d9b4ff9249af91a057cfb473afc49da5026bcadd716c77561327dc3339b9b398b8b3a4a2dc9d8bfd7255dc33bd5cdbaabe5cb5d6f0453393b2699b76063233d0e05e6485836e860dccc085bbff8833d35b813112cca11744ff1fcd56a605f7256518238398246a40c940458445825b1971bfd1f3565924abb33a50e54d953555bef80d2514f6df366cc4b95dcb6c0190c1b7f7f761f18e00629c45b4d39ad1bc59476e0e16c30efe5b510ca93beb290620ae9ec431c062f811c30530b0210386331d0c3d743058810106188a60e0e960a8fe3a1709a167853d090770c4078083bb0fe08a01886000340ce074a29f01d4016830001c2fbcc0e685322fc0401744e0eede36c2a669cd18f937f492f7eeacefdf72d8d6ed64b5ddfacffab76b65da0ab3911687537ddac68b5a30ac4684ac5192d5f6ac59d2ea6f5114b971f6ae1adf46c672adda8ab3aef65ae9bd5f2e7b7bdc1daa9ed5993473d6fadaeaa176db7dd3b9d47fd67c516cd1ea4109c3271543099f40099f541894307c52377a3708da8cfed2edf29f6cdb22e588365ad343565b27a9cde5eac9dda13e5b0368940ed562d5752913a94d8950364f564158a570b504c7066e077787e21d2ec80a8dbba731eddb867292ab5a8e855ceb4a02ee9ea685fb819424a45c4901a1cb8571f72e82c667224ed9d14214eeac25bff44b533a30050b99846eebd45ddd30850d174c70f7342e2cb97b9afde6981bbfbc2e4cd156ae3a6d921768a3200dd339b4476113a5cc2b4a18030045b145998a62d445819d6bd09c64ce305b4e2b7e9e61772a9dddd9e5365722c04243267bd992af72d8e5a81c9461f9839c233b7683d990710657d161311d06d3612e2500718fadb9ade7d570cebbe6f02553a75a8251f65052956c6ab2da941a0338503ba3561a1d3151061d6151ee7c9b2331d688397a303f05898e8cee3ce254d78cea3fc737ee2c273447a4df09b546e412d2047756d3d8468cb1ccd88d2397979777cd3057f57070cedec41ceeee45275ed18956ac63e7ee694e8b8312dd8d1177777bc6da1dec153bc59e78a882618de554f2863566516b44da47f2f66b6b9454c5747f95454d98077b699c1c2e97585f204032bee94763359ccd8aed58f3cee98cda9b869df656f769715b3c2d2e67a237e7271b0ae59d16b7abced5b4d6fb9d1a25fddba2ac8ecafc48728c8c926a8ecee313556fa80609523d6c47d896aa5e98433ec6e5a4a45aa7523005662ac87ad784024d70131f4cde742afca0c2132aa1276c9e6c7972a473e20127593a274d4e40a022bda322a2a3ba4e40d11d9422280158c1c31e536b806574e094a91e3a90b6421a2b30a05b019dcae956e05901078b2b2b90c001932a497430219348bd912293c4042930495e5264549b243a5153a276920cb93b140fa81c4f6c744f5644abc6b715795042f4ea71f8c436dab1ccb52eb9a25bd2c59dc554be59a57f29087da8ab675ad22de996d89084572732eeac25a7314e609cb6b8bb9749b030c4c1f62d1df51dab69daaaa6b0065d6522d3b463cf2cf5c47483e4c368b3214eb5bb6720b86d587fa7af98989235cdb934e75c38dbca246c6d25ff750e6732fd7d56f2bda25791ab29344d5bf4db127d5f6ddb3327d6edaa9eb6fb964916fd5bbdae1a8220f91f8a2dba2b9a71d6b7b7a1b78c5ab14be12a8520a6596b69ccd2b8d452d280920d9d1294534e53184d3234fd3095a1d4754a32a064864ec94f0a64a44045c754851392535192199d243269470701eeee485c90aae800619ab6a87e24be55e8d61e88eab7c279ec927c20c916ee7e5a1ce8915fffcce3ae5b7be35b81e48355f671df87c40448bc78fbb647330633ae258160173b475d3c09dd29cef7627b2b8d92ba22304e82de1569c05dc96aeb6474c4681b7d3192c2dd8dc0403393911a471b3c998b8e70d0cc74d47474f352b4a5284b5195a22945a85944151554e4aa3cba220d88da206243448694bb87aa5873cd6d3215d17bee27ebf848d5cb99b7d767516daade892d7ac518ced8555fde887e85c1ace862929daab76b2d159f3c6f793451fc79e8cd545f92cc63674403777f32171931f2f3a6918c48d977a9332285bbef5308831abe234eea8484dcddb458888abb6d44ed6ddf25dbb64816b546385fa107b83b9a993aa109380a18380a30773fd3ac93a010e53809bd44580a051f1cbd42210a14bc40218d2321b87e523701b9bbcea835cd5c74e4ff3512abadd3910760a923631c71e3eebb6c42d3a6ab27f1d0063a6329dd34347a0d67ddc4088e20364164049909221304c64bd095a02a41641055909251902ba806691084a3c89b365f143953648c98225cb414b92a725a0153c466654b68a5c85411a322414560458414c1d1c6c7868cafcc145c3e2adfd547e2abd37cf7cdee4ec4bb1e311c0377f7c9294b9f26eeded4f9f880660c182f3d5aae4ce9417b4877772ba6db9da5a4248524247dbb8139391704b7354d0bd68f7c2631f4126dedddd3e68c6fd5e9601252908214ec5b366756df679eb70bded3ee99d5f7ddd3c6aadc6d1dad8619ba085039f951cc6b6d5b7b3939546e8a99aa3783cd88845cf066f603030cbc3863842be1a27b0d555d185372c46875483ded089266ae468cd497ebb4a3579abf95b092f808488ed0af1a2f7abbd62cba3a87d087d20f0545e2b434727720fbbface14b9a19e9ad6eedeaa8e8cade58446fa4ed9b453aa3357c77368bdc07feb309f74cac2174e71b885ad09d75e4cf1c0aa2a3d5711bafd0fda400dc59285c907cf259425259a3af77996b102335cca96158bd8cb28ca0d984d2efb4dd59415fc3f609cd264c46e48d3bab08ecdd59df1a2267888421b2c5ca142244884cd9b2e65d8190f881947ba739ad5d587ec5c474bbbc70566335acfbcaeabe2fe542418931597d1bba714e7bab7f5465339794cee5ea70ceb87b9a978ece4585bba7790dbd50f01ae2a5c22b04d7102977779c2670bee0e8d0e164c1a182d3040709a776383bba13daf438610d10a13487a1878385843c5c256f58631676f5244653336f517f2d33ce190d6bec55e6c43f6f79ace10b334a8a89e90ec57493af377989ae1e4d6ff5b53daddde47d6c5133bddd9dcd97cb7a4545b5fa741584202d047101f1a203a205089013ba12b828418912c0ae840d6a13b588ea44c88d201908924510288484d1093940272448c809262c3181565d0d0e2612a890900307d508648c100607083b534dda3d445ef14958bd27c92b8650f01d2f0ec5190a0c465edc50bd7a3284f224acde696f613ded6d5b1cce471b9d8f2ee8efb26c6a1242d985a0e30379897ec4dc1dc7bb1f1774217c19f70f262cd5fd68f3630711868c8043842844a80ae1873bf959a8f8387d849d8f1f1f301f3cdae8c1860c313daef49842f650ea11e4e68b56a743b5e67df5aa74c6e1749a55a8de4e51abed79da3a6448b6b827ea3ec04001ba0f723a0fc47067017930c6030f3c148c3cd821c43b0f8cb83bcb831c5d076c78a746c906341db899b284cbd80bd1dfa0febe6b14d632bb5edbb4e843e1a6b096d955c3d72c278ad6f655d90a5f1e60f028c323f300d2a6e3208c8e831a3a0ea2ba0e055d2449eaf8cc7a7a66969cf5d8b1d4f1c69f717c1d9e1fa05949fe3c907d241148a6c3232377461e9f9e1f20d98ef87da6f9e391a5ed584b02c97666403c3359cfac27c828fc11818064b399cf0f8df4f1799e11d4a1895646fb1dd1678767569633dbf7813e2bfcf83c4da7e78746a3fdd080c4278d401981645fee8ca2483e8f0c68c70e51d164338fc623ebd9794b923d3bb39294912fe5eea5273c40a48cb43d40403d7667ec117b6c4e764a3bfb01a201c9c4526756923eb6effb3e12fcdbdb4eab6bdf9744859f1fd2e7878704ead1791f71a71c836853cf6365341dd18a3eef6377c451e88a4c0afa1ab64fdf17944213598f38923c3b3b3c3d40b371c7ead0988c3b3fa48ed5197f682fbe0ecf8e27f5b3a3d333b33be3d36832518767b47d1f2c0a48f6a333d280c8f181de879489b6efc36f820f7e1f0a50341f9ef1653a5687e74bb21c816cdf57f454ce7c643252e7e7751e48c633fbb17d9f69758d4491f02ce1f121797e4ad9a8439bc94a1dd905ffcca1df2794c343df97c33668e644e28bc329d86af2f121817e7c1e68d623eed0767a5210bd95394ca328dab73b3f33a0994ef9d3e363cbdff7236ec248beeffb36d0d2934fce66228da6a3b343032aad4677d04c89471465f68736f3e199f1d0642250d4094132253e3f3b5626a3f9d0fe679cc9683eb6effb3ea014807cdef6904022e923f2e8fc00d95a2abed1f7054925e9c864329a8ecfcfa8f333da9f1969fbbe5d65ff04d1af7ddff7812028568d28209596d62393cdc6997d1f990e8f2c4909442b653ee5ec7768b471c6e363fb3e19921fdaff903da28e257f6456042acb0c0e1df9f0f8c8481aed7f7c68e2d8338e463b40345bca64a338925f8a2f132af2e1e1799ef2693e3b3c25cfcc9631a29e9f9f97f500d17466f687676794d984683aa979ee6b649eb71bf47de7ed7edf2dc54c433b3a0f44cec6128847872c653fe3f77d9fd010ecfbc6b72a3ab2339240e24ef953fef4903ffa9036147cca1d9e1d998fec79683c3ea39dd9be4f5bdb5844c8a70788a70768ec218176de02f1fcd8be4fa31b146a529b5434bd9d10f41999cd74643c3a3a3c63a9d323becfccf67de0e38cc1efd309227f762c5049a3f18c332bf32149dbf781bba7888e0fd00f8f4c242d8fa595b21d1ddbf73d7a352ec807349bedfc8c6767a7146932da0e69fbbeef436fe5f7990054ce685647244b9e1d1d20b11447dbf7fdebf2e8a7b43b658f385a71c7c7c7fec87a6edfb74b10ddd906629dc4a76747667b4a5939ce807c44a0f16ddf87cbbae6f5f4f8bc38b33fa20e8f0f50b9d333dabeaf866fd5f7bdcee38b87e6b33303a2fdf4f48c3a40b41f99b57d1ff87d3b3bb79c73e8f000edccececc7a71c7f7ec7ca746cdff77d3ab45bce604d83608e19b8530d823e6438393d3c1fb121301f444618d2e3b57fb85c383420278460021021e48f202f20b3df20901284d4ed22c13502892df8da9eb7bc2342de417ecc808450a2a9083eaede0682e3beb71eb71140007546ed8f0f767a44f0e02ae3d0113aa8b2e3f8553c7a786895831fdaac86af6d5b5bed506d519c162dc80e5cbbbb840d662e01e86d820eda2d8fe0eb59550f0fed1c7ffb6800ba02102403a0190f0f8d340100a0dde4f86046cf9c1e83e4c0c10076410dc7029034af6d7ce130dfea4df0cade48a8a0964d309b3d6e80e8d557d60ccd5983600f0f0d44af7e8807608a1c3cf4c0fa9bc53872f0e0c5b7062c253c00aec59a3243ee3bba1c01702dd64c31e426d8dacb611da55146eba3b0862fd769350ea7dfb6a1e793a75dfad75144f5dbda7bd4d6ae95a57233268d10d2389272205b7b9ba5e4e6c79d35c38d1ceeac02a076575914fceaf7a1b9b6b5f77db7f10a8d2fd020f36dc0dd020b9c91c59fccd8821e2e602a184cc8487d5d91d78596aff43de926b47ca55a6bc5542dd42bf2825f231fbc31314301705800f718c70f679816e0908c08956f82a4992d486224a812a9f84d1024cdcc0202bf3956a0c52f106293d588913a6a1c27381a5915722137b319f1be46febf4645aa0f847115a2928a869c868a6a50bd226f91b96fed954c3b5e6c1b3fea08bd58cab477bc649a823b0b97c343f66677aa04ddf695d0218de4c79b99dc327ef296b1b545bdce4bee2c19cc6b2bca99b8c99d85cbbd12256612774f815525f755325aee95b8083b3d04a0e9b8b362d0309057a7a6530551702ce9e18e8309c7d208ee388c70f4e0f0c1a2b24d3365c25222bc3080b2c93487dc592fb8b35c604d415f8f3817a1630b527a663977d6d54ece6a3d8413b3e9ceb232c55bc32992342ddd59a8b33619363cf4ef54ff99424131ddc6a9d3eaa8acb114aaf3998eff749473146966a437458b6626a2cf4cfb1f099a999e6c63ba947314a9ed489ab789bb8bf0c432a55ca86d893e4799668a44a358caa96cc2f91ea1e397e51196221f4b35b15e2f973b0b4a55933b4b8332d61865b471f79d7d8bdc2a6ad133e73f7336370b9529f637f371d596e6ef903504c5d4941455c42495023835b4947105b7f62e6aa6b79c9915aba501d39d15c5dd739c3e533d533c533b533a53b4a9d9d4ebfc33e5ce22d2f9ba7b0aeeae030477bf4187cfe00528801760081eaab6f69ecc29b82bc980cddd674b0c00564013aaa7edf166b1f1ad4cd3deb609c608dd3d031870976a3ab2940137ee9e00df8201d2dd995c4b0e2df70308555d1deee19ba278b111318e782d42ab2654fca6ac1a29a1e237dd934632e3ab513ff23833b9b3cc5b8692cafa9de488903c2e9b4ff4d78834d3dc2433b1708eda3a33d5f07dd2ac9bbba7b0c432ab862c91de9a4967adff5a5d233c84879a705a5fdbbf246af1ad51f8a5645da2a9c8628165933271d12da33b7de1a45b6da8be62b536af626ba6dbbe68cd216f17c9e1ad3dab3f67bc2ab87b9577694c9f9cd5dae2a01103d5591caade579db5fed0bc80260796773911dcdb9eac2f16e0e2ee3bd8e27bbb7adc97acb7147fbd6d8bdb19696b6f9be7ed8eb68cf9161d175ff88d0970e10a99c26f42b26a357cdd59a545ad11f9a845e2ee291c110d11a54d3809c91393172d5104ba336bdcdd865edcd61eb859fa59b8ac1658e48b35678a164d6f4a7698c185f8a1cdd2ad3d14dfb476c56e0b12e8821c77bf794781ab336f50ffc91ae38a3fb419b8f59fe6dbc68bfecd865e6d737e68b3f49666ba5d51bc9bc01ae3587362b5bab7d75b7bfa86087e8104ccbc016bf8ea141809aae4bd553353dc9d04ff4b3342dc73892f686687bb836c98a0165fe4b420e3ae05182d5a5cb9fbce7d951653beff6a61e47ef5580b99bb6b0182836db87b166bce6bdb601653b83b98851577f266717a16519e13c12c76dcb3d06004a3dc48367289c59a8d85197710ecb0f002ea5c82574f6261825828b93bce97d47f62e172b71d161aec37eefaab74c68165ca80f1adc577992bf732a1836590cafc94a9ee5e26873b698970901210430223900029012d012a09448d09aa80cacb05eeebe5be0aace15b42fdce9c39746b6f6695e30de848d2e2322eaa7afb77eeab2a8ed00be6fa3efd55dadebe8f443778c26e19c5d6e654c98841860d77cfdd6ea9d115389e7b2557245d810507b5af8880bb93116039f9243984c60c193263be90e1a2854c9529644c322499a9f199c0ce6bdbe8be5755bc71f7345688e0ee5d54d1a60a31aa405305191b8e2487d027494b92a7c541852469439c85bcb009fdfd4fdf17157b7ddec24a628b3eeeb187628b5e7d2d6f8585b8c74ed5abb9af0aff76c328ca4471861420480101295e9002690a027453d8a6e8a628a2a36284977753ac31c51554d8a810dddda9c0424515156050f144981d516c61228428ce28a68444f11345f5dcdda160038a324c1409c3041228b6404185092877f7a5cce4c5721aadf5d15a7a13c9bf1aedf168344f1613c9d85f8db2507787e21d04aeb8ffd539bc126c69c364d2e005003f405e3fccce70d0a306af82731b094181052b320491c30248acd19d25e654d492e67da20977960ddd9d8b1b4414d8807b50aa507d72bb2426ffba9182092c4fc8f004cc97aaced80dc74a6d550301b27e2966796d7b6b0f1d577042aa49d7841b99ce0ab4dc4d5b27dbf7655c65e052c6b5ed18136edc9d24adbeba92b796607736c350ac4a6451e20a254ab0c4b7440b4b7059228925c82cf1c5126c583143092a58725758ae287162e162f3126259620a8b154e58268084450c258e8cd101576041a1c2f9d662d556ed59f0431267126224b14512424994f1bab597936382bb9320891c3b6581b475a87adbdaa2b0b64d5eae1a6ebb33fe9cabe64cd3a2d52a27be6cdbda5cb73a548be00c852ae30adb9fabb0b46ef4667b8f7072048e2372ee4798398203618c38194687a942fe101246c28c208c129909126890208344940764f0460c23d09031428c172d57a618711a111a31658493113f3b8cc851849b22ce1451c696b0eabd5cb5eed37c1b1151ee9e868822dcbd0b224ce0ee5ed07452303adc3dcda3990998cf9df504cccd9de564bb52d0133c768478e003ac1f446830830a4478aea1a8d4d187da394a199a11008000001311002038241a8d06c311b1703a67e70214800355ac4e98566417ca3331881442c49001000100011000000400fd9e0c49d626c9b49471036d5862af47563328cc4a4224a761eb1d1c1070a28d38308158b6b60f64617ab9a3510514deb4fca6b251255f0d8513a8404265830326c7151c3cd0d1ec85eda560cfa5c0efdbeb267ed97790c8332c3833fa43427d704f872f3a230858b3b00648954919fb2c30031ae157c117fc439a4988219deffd4ec39356cc3d03741bfed21a7981b4a44a30e1ce196adc0ce1e5bebab7b172021e31b2fe89731d0ae4e06ee93ba4ed374d90d71c910968c86eab0569590da1d353866b0ede51f066a49eeebfc8fcfb66a468b52395229e0f791be056e3816a48b7d18fa87be8bd89036e572f16f9e7072e71bee4aec58026be15ffddd97b38cfaf7f07ed40fe1c1207534e1130856a5aa8b2137ef418141ee29ae5a7feead7e34c8d37f4dd1836e1a7841e10faa497d73d330eb92a3cd709e2a2a5a3aac4f374eaa2ed24e6f269193ac73558e54f1ed8b701f64d87e57d24d8c521a41d6765d9be74c0f7fbf8fb8b228a4b4782b2f185cfe55d0d58224fb4bfafea2772235d2bed5678ecb9d4d195eec52b3c7ae331738b916cf19b61ec7b3d7e890fbf4805a45cf709b5e48b34d42b41d52e4e6ea46eb8cb77e784398176bfac774bdf456c6bac72b8ba97a016e20af8a66d00df14030d2bebdd11bbaac16401ad81d9bff126af60332c93807e17a1a4d0f2cccfc4c377f0304c998ad9f62ca25e6a325c4e001cc94a68124139d756261bd0f14088b40b6ac61882835d40b11b4ca99c2ed4dcf31c805474ba396500d3295d3e7d6f137f1cf5ec8f401bcd884f0e29b90d2b0bb77dc970bcd46ae501e6ae6b72acf690fd4179d7cfc18dcf058ab30f08feb0c30db3f9d41fccb7e5450cc8af0f10a027aa63b8d7b8d8dd16188025861f42c69f20b1dfe54e589ef5f633f01aaa890a4fc8f3348e80090da32095cdcd3d57b4faf301447f2eaab4dad74926660d381915994fc111a25021b0e5c15c76c21b06105c69bd1bc08baf13a51273d69071bc44532ecd7d9f1d3b92d91eeb56681082b7817aa928a3ca59bd6a1515e31136f69d56322fcb462624b8d3b2982a2a31cfa0504feaf3e8ec289b79e2d4e54fc00180c48c81dcb8d2b847e535c96a3015f7a7e5e87800c4ee9840632865127d414bdfb9ee6cf862383c7e2ebc1d72f7633deb4b1925f378f97ffc413b892d0535463877597c3ae4c6d1e4bb16076fb74dbaa6f07586d1532c0882b4105ea766c79b22c87e3cb8a03fd29dfdfbcfe3f30ee1b90e9cdefd12efb48e9f8eea8ccb6a21049e5a719c26525eab1a1063e2f7699f1a0394183c905fe46a962360b35941e659bd1879939a4e13ccd72d5816d37eaad8213cfa7714133f1dae21770c0883fb50b2939119348f2fe9e797fc1b862bb5729386c069e13fdf545ffc9fa86e8c17562768fc7fba3590c5694c0bd36bc2b09da978c5376973c4c69abd56fceaa20dc63d852bc169fcb37fa8e3b2d5dd79f6ff521f23333eb5e390059edc181b0f3b0cbf98b38f7060fcda298107828c13708a3f8c457bbd17f05d2a02e9adf238c351cf0dd1ca6e3116f3110a36c104610eed21f5daf26c8835d1dfeb8101a3aa38123b1bdadcd90dfc313b37b33db19f7a353cb0bda05c2326487055156841b13add4b29137ece8d3f327576847f87e3da83693a0d5bf4c629b5ccd423b8917f45c772036bb9c5faed2215adda285da4ccb51d166af0e68f0f12ab93e63111c573117fec036a03861755fa71274396bce455981294b523cf82c9e695cbff1b43934fecfc3efda8067750fd3d8a8adc49f299a3a846836e923f940fb43aafd1ec83ccbaac68dad4726f407500d453b54bf52a7c24277e138e1c23a8fd89a1fe27647f0b5d6ab082c66ecd27a99397f379a13dda6535f6b90b001fe1fb5bdf5160e6578fd387d825bfdeb9422a91cd4785f0d043bebafd793032370aaf8ae3b3de4ee338d4ed3c6adf2206120f7333c818e7df900da0e84c4fdadd43206038f6d197a96a15cb6f721da550cf8f0570d2839bb3fc03cb28ae96c8ce628117b94c4fe4edb6e9c316c3ade395fe1886828a39624d49ad9318485a6c1096a5e36259ab311234746bfc3b046143aa957267f1d18c03970854249cc340813e86daf75a7064fc39ab52591df858fdeeaab553d693b64febe8adc6bcda295c509ea65b6aab3c3b19744c8ca74154b5f7e1c609a051134652721392108c4012c934ddb30cd22df492ee9ac1889d882022ac4c870f5728831d6251bf0500da930b00277264bde64de9072b60ecb4976dc227eab9a742ba3d278f0e4dfdedccb2b6a789e3ff890671011719b077c6a0898c0e39e5064ed9a47b94b517484407a17cacaa543cd903d389c30fb74b0c8a96e545c4d9e843bd62155babe68acad4c607544ed47186a6b6d44eea13b3f50075dd2615b9a308db216fb7430e1e17b7dc4f7eaf5948b3f0492f491cd20a4a537757f1b71ad4399ced1fe8f3f30a238bdefb00ed75aa036ffadb1e8ecf6cf82c2522348a6cbe5dc458d84b210e135aaa6d11fb366694371a2de5e53c0a87447b49733cd64ee829e086831dceab8ee14367e6b4acf149b1c5e0ffd7fa66d41bec4858e7e6cafd600b6e63821ae58c712f7ae7f575c5bb3e42b5ed4df7e48e4fb1de91f0d34d89a23135aa3514112dfe4a886e75a87b3d72927a5be34fcd586b797f758eb592df20f64af113ac93391ac5745822fbfe8272a9ee2896c158f7ea78a168e7b09dff7f3c287ee45d3b71f1d7299f82721afe4f0dc48788e660313b84a20c16622f4bebfe3cc40e37977292fc087c1256dddb349fa2c404f82dd0899cbdfa9cf39ef9bf466c31430c2dcb9b39d0ea490b2421b3c4ddfccdd0a2365feebfe62b2785508de913225db93c9b2ab9788760772e3bdcda62105f7afe1cbe1244b32458c972bc6a452c3943cf68a4a531648a41eeefc109acb4f3a1af55baecc07e048864d7d1a937bb22bdd4bb0ee3f0de3c27b56cd1fde32e97fb0f1827691c694d3bd8a7f300325f2d1f1e2f8a5c43d9604e270152c80a137e85b032e4ba88982eba8c0d35dde4f038a93802078c4f303590b43c858b5211c1db4bcd10fe364e45c9e4fe2f1a84380276269fc4e0726ebb2025731c81b6d9dab5f235e42bf3442e271c45cce51da2c16ef221a9b29b1f369c906ffc44315d0fbebad97b212c1a6cee2a91fbece07f6ad1e346f99fc64db31bbb8b7f911aa3647c9dde6b1a3dca62af2163282e1edab1a85b4ffef904625b8b6109023c41aa088c90acb964ed760d830f01aad00dc2ad8f2f95da597a4be46fe4440ccbbf936cf7dfdf520168b2f3d872e45b496c52a0689d552a261ff3d5f9aae609a95124602c7fa195b499a056c6cd2fba9c56c3461b5d265c106f8db8756deb0ab12eed07e1a4f1649a2ab06c25139c8aafbac773fa2b258b62d0be8ab3cdb704d31c1b0d110c04135050c14080d01bf0f70622ddcf84029742fc932919c7b0a2f7480f86450b1d5c6f45b88cea329c9e9a9782e6edd6d57f60974d04bbb3ac0570f87bee8b5adcb51f916d32baaeede591a0af08d1ddf6093ac769fb050b1749fd29c92786a92d411a52fc156e5d6bff603f5390777632d21c2dfaa0daf1fd0f91e570361e912093db916fb89ba643578a804da84484547cd88c288dafdcdf5e66d39f0b66f7d9e93fd2da899edbebdf8bd433db4b6e288c2e2a264d67a89d84f839f6eb8c23f29792475f8a1527897b709dd444f7d2c872892056c87d6ddc2b40d1a82168f50a27a6893cf8f339b074d0105fb8874adfa904a9b90678d81195ade18801c27992bcfd775061f3b35540b7fd1d213ded1b5aca1adc60e48ef528b3b25d0e3dd6e90a5f15ec7d9cad5c329d673c864dc4368000201c32b349983773a4526d423a1a31b2bc8cdc635bfd265c29fdbf6f2a7e5227477c25c7941a9e219a0e14678d5078f7bd6d20103b3e561640c9fbd7c20891d0ac52c79609050299b6d5730a5f136eae29b7a4049f5186be8f940928b9b6584712b6ea9ee7af92c2ba4983ce327a044e6bd172030c33bfac4bbfd0acfddfb6f4a49d67aa943ee1b2bc689279f043ea77aa160f307378706074ad89300ea20577f72e43eae12f6ff95e90e451bef1f5dc3c7dbbfae2c98cc341821bd3ad8feffdcb76fe0a3c061e2f2f3ef105fd7338899d19e5851f7bf8fe8100c94cab4e2a00d73727393f3268a203d75f45b4a89e8cb6ff9b0bd9ffe1b9d2e13cd8fb4a7a47dcffdb52118977352422f53a2a9e67c74524b12463ec9cf0f8e067fc0828a32eed84a3c2148356bead2357ebaf08f93254ba3509a741df36774deefa2dfd779fdd8d19799c016ace7ae2d5bdc66c679843e9eb787bd6e6ea06a6e8ce47ad04f9d10f53cc56f60189db4a1416ac683b0a1c90330cd877707f33b1b1d8754bd1f4af71b87a38dd61560eec228f1fae1cae667007df4f335d8f5f4f5f708c0ba14dcfb4b81ae2403ce2720f72f96c61f59e2c9667a311c094333dfdc3ebc7a63afdfc7b7ebe3ce4af41e4f3c938172b331937268f73811977c9cd7d1ba5a2aef299708de8d37ce1f816bad314f808d592641a0d777308fe9447ff9aaea4eb2cd1824665b8f6d9d4a7919a7e1383e60fef1bbdc32f97ae9c1cf0465c962b78ae47ce76436493bd60c328c5931de1e0748786644902205530160d9fd20585391d35caabb91bde659e0fcadab1ec71e4e88678c867a1045f2444004760523923b1604ab1bb13b2b8cb097d59b955d267d78da31243a31f2bb661a676579232e8474935a7c46714bdfb5aafc26a073b19ba0e52712e0ae84dc267d583af27ade35b12c11fdc771df715d45065cd240614dfb12ea28fe41a8396a58e3a67b22d3743fe9d2f065277bed5e89717632328c0e6ddb585b4911a10634083dc8ed9b8e7da8a397df0877774efff375bcff694da0cdaec02ce8aeb5a98b76ecd89831e94ce78d5f84d952e30ce29e30ee0e733b178a76e8aebfd396047ba867653ebc2288977d36d05f47fd21b3504f00f670aed1276b0c582803c317b37d18a294f85d48a5d17feb3ee8c6c135f400aceac0469d026d4b5bb26e69b6c3b5aaac6891df04529bf46677209da04440104ffe9af4d84c12338f3ff7295f091dd86548dbb57c0b60bc13a66094a32fd5f56534f774d14c8be2974259730425459979a6166d749bf008c6cf8fd4354ad3ba0ec4f4893574996ed0d63d891010ddc82212e76339c291f99df9ae801361172e1d24c5c76fbbb3ba31c7c1b667fd834c9b9a1361657705d61c2954d76822f28d00d51a38e36d1dc17d58ae515de24f1a739c28cc7ca5113ecbf400dd2a98714ba7f5eb9ba8ec07121b1fa111a3e8b2b7801987bf7ea6aca7ca0552b0cc5e0a85e95d7fe23917d3cce002fcc67310da4471b63279599944f407f95892dd20050f3e4323e5ef6a8ce5bdcf8467f3c26ffc2e96b7f67bfc90c560a3d8ca1bbbb759956b40edb9c20fa1503d9a0f2e386cb3c433a448e956913aafbd43a1e0f248c524b8c99b0f3696d96076484570ea2712bf12856aa1d7e9960b4f31e70a0a12f4609a32ed1fb9dcd78b6720f926af323b976b8f5f0f7b2478098c13739de99f813c92832c6a6b6edd93fcd43706964c2d20684759554d00af9ec48f471e766de7db9c51c9e6c5fec6e1b02b4ae6fc2131c4a3bd4433d4be14dc5191bb052919f83757a480fdb32bb198c5acfba45039e8bc43e6990a3f83798d74f3de1b051ca7e6d13a6d7d596310ecdf355412df3a67c42ba7959b6085d52e5212d2e08e792520281dc24a09ff44b23565a52f8d4d6c528ef2f9fe0c12b8ebe4e776595360e8df8330994c082134bad7f533a165366851e4c770093cb72afd55d4d84f37a82f67e742e1893577ece81a62a9e542203d6a5881965e75205b2cdf9673a369f113dfb029f3996e9d37f1b6217a9f8cc1532e806344a8aa3d660a834ca4c3e3e974a7d467d3faea0672668327d432a7f1075a4a2a2d5ddb2fc20a8560ea7176d7ec764e8dff96c8254c2a1989b37dce9767e8fbba01e10eecee3a90e463c23a64773f106b9de7eef9be03a2b941b4b802385c580f61ff1e48500bd5fcd27d2ee3fcf2f1c7fea2de8a04e7eaaaf6d4d3ee50d912e9efdefc3bf67c8a6c6cdc4df1e0846944bd68c86e6cf07bfd6b53ad01cfdccf53f2774000c843bad530a2c56a8d7cf04da2107e50d057ba13a62978fe6f16e790e8f126ef195974d19eab68f5078799c7f4e4f28328dcb6edd0c981d7ab2bcc1b7af382ad9caba037a0b54fdb2d766794c1943b2e48a68aa20827d26b406ff4afeaece53a8a20cafbcaa4965b082c4657e11a40512502509f7d386df740b2bf6c68600f49dcb4f2cb2bad086fc937a8f5e9145b65d9e021c69c23aa376f989bbbd6e49a7b2af4ab35889b7f10bb024f49e5919dd2a0d78a12f63c316807b8ae24dd96e1fdef155bda5c97d60f9e2b1872999f73b7814eacc9e15688dfb6ba52b7fe4288b7b0e6ecf050dd0d53758015b8b5ab6e5e7f3ff409654068c0fe67b1a4197b4085c96b26f287ce9819e10b3fb944ab1d6d3718272cda322e8080c5a91fda4f4991d7ab10f8dc2a06f109785aa52338ad79557d49eea61c2fde910f2259bf027ea44e58ff9bff9ebe0fd4f0da78148830b6e826d5c65c37de623d636031eec33aabb83b7275d634adbc54dfc4ce22ca434ca24a3fae56fd9ca91229daa2f704bf1e7e39756604afb3637cd286aa6d6458a9bd91b8557c4048b36cd3d7916cfad6fbe4a1c051ede63617c96d8e74bea1caf1e293190366980067b6e883034776d0271096feebb71d5e1dac4e1fa7c35bd98058ef827e55c82a5bef52a2acc80f9fc08a8d225853b71135b583e6ee14bb45d156ef4cadef7e0522c016f188b1ec2932e4f88ee5b506bb10b5d3b5ea9567360b9f1c202b2f6fd38c3b8c1fbc322f399fe7b24997dc5c9f2c26c86ebad2a3c95a44d3429e79a9eb4bb1843985994d6b176eef6175994f53198c3564b4e997e5149799e1bc3fa1dea90696d1327a3f2997e9adcbe0ddbc4b10d3776d7244423712c0466358b2ec6c5c396b1357a00036b8c60e73ebbef1e6c10313ce986037cd405a3272c77ece00c33abf958da332106492f06951671c26a097d851e50c5f2a224bb81b7a7e188d37fe8b41bba48f12c28255ab584c06a4c0a707d1a80f6b426add5ec6b8fa2016e5c7fd5cc082379cbd933d2231005df235f4453b990a36d64d1cfa26335c6c5ad3c0197e7ddc5302d8283fb566c191c3ce4b7bb84232e2175b2f9e73c78dc41e6805320def189a962438ed2e89c1024b374339ef3c2813875cf1c0353032b24736a1de287494cf60fd7412657f85500bdd8c0619430080b1bd289c0d7e8a64073c2964b50b8a118e198d690e3d11278c5ccf0691045235a0998b85a0dda5eb494d657b1380622d2ee533e3d76a695f3a3c5aff4407e2020ef9027922948453c5874993491fb36800ea05cfaf1f40cf2c83e3bbab1c8520ed73c96f245f7ab62d1eeace3bf20f578ad1682333adf517562496458427be7ed077d8f9cecc2b4518c54c716e084344ecfabca01195c75b5a6a1a2867ec89376b835219dcebf61eb85ae957b1c374eec02251d6c3f53840f402129e9534a8932265ff95cd3bffa8568a31dda829cf85330cc9ccdba5113ca9a2b88b8eeda94f719917aebe84733ca4d5c00c0949a18d01f4b469a49bece61dd7ea8713ec23a6d01202ccaa23f08f6b5264a298b96a46ff71a43a5b5a8de53e954d61975d34d23446cee21c7ea5acc52118246e90e82cf5f67eb836886546517e56f5c821d0a20fda7b560a136f71e70c33c92381fb5235b8a7992b5f8d1211ffd2933f241edc06436ae1e335952bc0d965e0a6f908e14e4232462538170c353683d1c920247da8d4bf1f7b23d17d1d445c02d3e0e1559f862f11a755f88a3ab0c66d1e78231d93d0a10d888d21e1498b0fed21cfdac026bee14c592635ad8c1967a0a4d16a5e1db7716565430e22867e526574f673eb2b2eb1f598448b7f537f5c00e60096b52db9b5c7439deb663c381d392460952ca029ba8c8fcbf496b36d10e1a3d0109cddfe3670fed5c39fe11debc22a4ef9354e526ecbad4484aa6c301821e37fabd9ea3e27213553e01f0541e090646f0e8a1931512bd2054fc7036c3e13b42ab5fdc121b201b077b18242d7a399f89f834ad114f98ac100656738962a089ca8b7b134e638b905e228f7838873de75db6040e0adb5b7a19f689fc77aba89498766bd0d1840f4e4f15ba293edc118ef7d0476328308f727d8225740066f141ed168078a2fae8cb7f317d4df6188ea87394e8b2c5ee18b711362b9b5abad5e87f5b4e09a4c17926106eac7035635a023830f8e23a68df11531149afd90540841ae9ff838a7f2409fdf3b23693c7bb5630ce32bdc155efc437d27b331329cccfc1f4401115c817b0d53870602ccddb5e9b202f5ce4c14db6ea2f3d34f8053ee277cec0a32fef36ddcbdfa4670a802921ae76cb935f0d3869caa4317f014849f2729ee377e6a245862f769b486a820875367f9cf62b1a92b63fe9b19b98212a520b53b3f99a902e332078219425d82c3c5f0a6958e44c529d7b4af50adff83af52b1d61adc8234ce111bad0307f030384847e139167f0bf510e13707002f5ae5e81834569c30be82ed5080c9fda83d800890aa73a2faa440d3cba88c8b2a8dc5006267cdfb5ef85eeb155d459fde6258279dbcb1129d29850290adefda4c453c97ca772b1a081be68e5fb30ea50df1a53a1e7bcbd53ddab11eca2b6c9ccb5fb4c487ef78e3995982e7b88e6bcb1e5bffc004b556365f5ce723a24a0495eb132eac0b88a46636b5dcfa5da5a0bb2393dfc02ee7ac375b7509ebea604d98931f1c6589b8b9e9f33e3530d187ca7fab91877bbd956f0ca9df9ec25846e543b77dc0aedcac1b0e4bbd72d1f5647efc29371a9686a2c438f05608f34b2313846939f13cf1f877bec9337c97571bee3069d91403fac3557f93158b82b9853291f0d968e11ae3dcdce6c7aafe9f24aa7673412faf288cc3643ce4563ab9641483bf7b29b3defa519b4816e99e0a5c6bf80bde181ca0d22d70e12e72129be281ed830fa2cc23d98fa169287c2ce3d584753bfa1f12d7a8c00f0598f5e8529fc0105f954cb1f6c50dbe1f06128eb6d9afd4fe63f71790a2e9e67df8a652c34e509b5c710a51dcdf8b0ca4f0f193d8072ad4d6ca35eeb88e27b1244f5cbd810e616ec6f396603dc77b6858f39e01616e995bd1e5b93bfccf7ee4254aec58a768ccdbd753f27449c945cef5a6b52d1acc5547d9f6380e733abe1ed3c76aa1fa01bd89fff97c944109d39d3fbe9d446245a1e0be43d9271e858976823f95da9dd11ad88e658920e008cfc68b432001ea9fcbee9d845273e736ec2506f76b4190fc15fa3a95caf0ebb494b2b9df48d9c282daf94c07f461f28d95c7d734e23421f6b22e5c6cba26640329b4f2e25b9c36a19fb3b9dbc15b5eae49f89fd7e75445b172f67fa83e708ff021bd92621a93d5e4b2c10198a1c874460dedbfc97e6576f0a4fb8fc0dc0dbc5388e839e50c760d2a9eb0e0f383b7dc95d93584648ab05d91401aa837c02615cc46432832593b1d88322fe5477992ac6788419be6354165a61ca560160a3584d528ddb43614c5ff962823062dea01845eebb2ee2a911e26566baf92eb0d88c80708488d4425742052ee019cb8406056a063a5d8f683c3e3602bcf554c6824a270164b669109fa0aa392ce46b1a1e0fe569f8bf3e40ece2b9e62e6b2ae7deb1d38304f24f4b6700b18c1d3d0129e6c45324ee08d22186b6b2c9a37b931e36ebd601a73fc154f86b83f2f6bbcfc01181b12137f2864e81dec0bb05053510dc7786f1ebeeea131648d013230979aa14d691f9441f2287683ec08d02cf813b40e3ba2e878fa1bc1b318b5315eb8f0fc8583e5113d94abfc564f42206b6b06ff760e6b21653ed54052ecab33891c23e6d11cc5e71079bda7f8a2507ce0587bc4a477a4364c29cdd7087bd89eb3fa394ec70ae83892fcf91a25e397669e5c91a2fd4d9336145755d08f4aa67c3ad3e0e55293c14185312f29fe85f139cab9bac490cb729971f6c2e93deb11e4e737b743e88fd4f2b54312bf24e1755661933cc83cff5e345166afc65e30c98284e4e497c54ab87a9cbcd5d1dd5473f94f3ec05c347b329abbf335662324ea39a65649ebba77d361650c2ecdf9eb345a8e8ed809ead90f6f08c4401f6b6d4a225afbb359eabaf151ecfcea28660aa10f13de8d248086be5ecf6879db978ec91de5148a9a11bd7c8bea9177f2389e704ca06741c44849bde10bd5126dc1515dcd8761b5d0b951e565b401a1635d727b27c4ba077dc708242a63fd456402b9a66bb28ae7c59056852dffd26578441915649c481e416453fe84ee7656fc2cf9d73ee27b2f63c925e7762aea36e78c804da0389ccc1f1cd1a420fe76b3c83444c440d767936a6911cdf7a94135fadb1dd491583a8bdd43743a52ef47c4c74b86603033db68609144c7d9a5a84650c179fb8ea9c6f66eaa40b4bd020abe2bc7b940f8426815ae21e3ffdf69727c78724376f24c25c9a1dc3782abe3d88802de9a8839978ee924a7c8c3740fdf8c5d48076cb1a046f20400fc83c379d9584058adf4f55cc870478efaff8c12e776161f49902cef1fe67e11c01ce6465ef10f23f2fce77b6a91ddee7b397e6710cff53fb4536c4f89a3ac728a6ee4307081685e17ee91097bd643e9014a4215d8b92f887748c721c19a226d094f0a487796d62f85b1942367c913ac85f122bb61a94a8cf4673dcaf57a0bc290fc395cb4fd3e339ce11fcaebd105f81332297a78fdc43651f878ebe81313ebe70abf0f3aa99dbf9b96d135c33dfb8686133d074050b5feb24d795f907c6798ad291f05904cb8ed0e7c153fe5dc5231e846372c7bd20d29780bbae2c967d8597f58a951081614a7d5e16378b9ea15e45aac3ada4f65675108e2cf528961591a4f13def662792bd5772bd1c7931d661eec20c10e9b6141f01f7ec119b9fbc58a57a3b258ec0caa5199adc53d7e59cc0add17b3226b5b005be14af30509eeb0e6f550d615b8e12323e9cd0eea9dac0558e61dd7d9275b26136e338b97bcc1732c85700b0915afe37dd8ba6cc80e63c0de3c1262f59bb34411db6e89512c6339ece0d035fc1a81f94d5d766b8404731b5f57869e467a60eb65449e73000522f760de7cf51f9f3cdf6c03972bddd8ae11c1d07e32396b0fe95220480f95ae86ab5a2154986b457799c76c4e877bbe8326e5d0d351d3bf7164607cce22b084782f21ce1d66b12b821efd9808471022b3bbc113fd27bcb78a85b1659a69bf69a08bf196d8211e34da0b73a5b31fa2131d9fba95e7db705a3856218e2bf050fbed047ee28d1d69fd41951129694d005b8a1e5c0e13881bfd9ca590364fc8fb821886509af444a5f5614cc074693e6d830f11c876dc39b69cafcc1f5f40094f711278d74deb39a018d15353624485cb117520324a9940acc2f8e87e10f51b0d2bd0a6996c34c256b9f1263be6166c641c5e1e88752708800a5ee5bb4391d1b14315bd6bd36ef18b7852e21c1c1333009d16546f25f654e701c59836cdf9449a77cd82d5e5b2f73f0f35f5ddec9720942e6479b12589d9492b923d1b925b38ecca267163b8d748dd644572c70a3537b20ba7e14c6e70afe71daacb6ce950e857347310732f620ce5428cc824b938459c0c0e0c7c3482aff29c878e5ab72dd8291871117c8475ab53088d76085c40a714d8aff7cdb399faf376d6b08b7de7e7bcd52fd819408d64867e8cb30686d4e8a95808f4ca90697c66cd62af40ceead559009f97210adf51158819eaa5a4abdad3b6ab49e7143dbc3187e7a43768f5cc1099a9289c5856eaf1eee104b797552976dde96ab2109a01ec9100831fe12b12753e6f706e6863e4f01b587d2faac69a17f2d0feff8e7c35e93fd2e1ed67bf43e114aeece2cec08b6b930a327386ed53fd2cd829d6eae5fdfa650372f5b3520cf5af971b6bb09d7dbfee07a3a42b2ddde79b6bb135eabdcc747a0f9f833d0766b311a513bf0e9a1ff46cd6e7c3ebdc1798c9c10570a263fe3b9860e67d55a1056bc1b877da1e18ccc4e4d77c34a8e145a3a83dd65d051f9de72e6555c1f51b4b4192f898ff9072a222ccfeea7820743e8405071fd3cb91d3abe4c8e6249fa5668d932131e1c387a61cfc34cc71f2dd21fcf7772fa59074bdd0c0712e046e6ebb89da6be9fbc485b7c50f721b5792634b86538b809a55edd02f40abf223f34b68623fb7fb8cf60670ab18f57d1e269f1d94de8639ef15d35bc58cdbb3275483d72317f76bf1bfb648d9b4c26ba82ac43c3929134fc5f31491929bce2d753d84ae8fae1c13a97eb299ffd36644a6b4103fdf39f926810556eb246fa1f562448256432d0408f6326e57ebf70ac0df131727a79cb325c0aec456c66493fa64bef421e7f56ff3f6f1eec637486e807098d50b285d2c468f4237a0e095af3d0f883adc9a5f81b38aafcfbf11d9c01f95220076adcfc05659c0e5a72efec4e42503390d2d7c0c77871ccd87f10659871eb61fa4f95f1f807638a319e1f1b9c3f7b3800c7ce3d24fcf8a36a47368e150dee7c46a15732869319ed9f41c720508cfe7e6ffc24ac1f728952d81f6e015a0ad083396ad0733d4267af602d879a6c67e741a6848d9b675fee07001a57c93318fe20d1ffc04b275e8641de380f6002beb9813404b7b2a8f0c86df23d033b3d437ffdfb3359d6b8dff6bb3872879ea34c2f02f100631821be30be0a516ba7f08612bc1724293f45ffc56086e4bf05791380966924d8f9f2009242307eca78bdf2d7e37753b671e4f167d6670842afd83a39a9c1215f2aedbd8595f4a8caf0e5dca3dc4a598f5bed3e623279d42448f40dbbe7fc8e57bff3eb39b48c2fdaedd1bbfa5c628a34adc56c1b20d2dd9255f17f8123ce2528692c6735f2b1f7e0dce43397637a33cd6e46cfe9766d1f9eceb8cd53001e6d2517b883413bf68246f1fed5e0709f09c57ee2fa245960e6f85eed7417eabe874723b7f1c764e99f27ce42f3009b1dd767a20f78f0506d66e4ad3bbf793f154df8ceb7f49a1418f67bf3656dc250fb240e34a1d4797c2c46893a6222f60b16e7dc42e068e86e9da03fa1ff20be5afe351f7fd1f42f3e6256d433e8d12f37ea4f8258199e2ca1f29eae8915eb2aff1b57184b3c05849e90d0ac2d9b1e6925c6a140a8e12bff4b4182d8c8d90a2376cebfdb0c437dcf00ba8da53d939b6b829a0ca9601a3e7b3b798316e548d8a1e296bc3145aeb90348410c915165977316cbec6914debc54fbf6f5281cdf3291b792276945755ecfb37a436799f124e8c5b39dc7e5d629cff507d06dd4f7c2648de1b98f4bfdd04664e16e0a38c7cf8a89cb7bad3f0fc9ef540b7c49be9d90114531df7239a927ed1e88ef051d2f5aff43f692dd0df0b19c4db5e7e65bacabbf6fa970125f93a1ffe47283e627b5ab6b48b26f33a22582f1922a6ec6448ae27ae40713c20618e8dbbee738308272a5053b38581a096cc9b87481e006ba65440478d07e262b83b66c1330a57e3f9a53d7c0f7d437012aa24d6f3b41bcb0e39bccbaa53aea8f543892950d7efc09cb660bf64696caef046e057662f999c7674e820542649244eb4a208af04bd38e557578f825b4b0a02dbb6f36cc3f62e88c07fba51f38898b1410ec3fa7fc8d5e4b86ec3e238c4584f7dacf9017031290c2be7a99303ded017714fe659fef111cfa9f65d317d6a1e28b4d702353aa756183bd9e9705b8684fbd1af075a96df137f8cd9bf169f09aad33892bc0a518a89486185b77c6364f9ba1ba62f08de71fd33e3b46f322e108a038f19f4661e60cdad4557c3cd85d37eb7f8c0e709f9a6fab0d9b891b3d15a9e386cd8a1dad94e0ba63468a9b3c65dd31abcb6fb1d3a0a895fb4c7982b314aefd5a33cb2a3480031961dfb4695b930a7eb02a6b5934fd609fe826863204442465588c1531e3ead9b032e7ee74e0f2bd5e930bb61d261e461c0efdf5fe8524a58da3784d54f7526e2604b6faae6099f8de32b0a994d2f8be3e430fddbe175660ad1f5d737fe59ffa9f91150740372cc9dd911abdddb717a92b1f7968f1e020e278464b2b46e6f95c18521cbea12a3589666e3b172d05ee8342c0f8b6bdf298ab9b92193002d42a42959834e9ce2dbd47f48b0ec1ba794b11d77703709f440bcf7b6b5c8ab894b153c17f783ab73e68fae093630ab89b3dc852530fb681ceaeb68c22a8ba47257719718d26197e890939df820e93204310712bcef69691a3f988e5b72aab94c58fa4a481f69fc25d232fcc1dc08a2a6901e8f221a30bf46480661a1133f7ac2f6e7d01c506da67c2f156fd326e1b57143e867daec5d686f5618c158cfe163744c0bce0e8561caaf653362fade9ad0af1c5967e06798b33ea885a19db76f59eb5beaad91ccd53379cb9760cd831a809a590cbf7bd1ae0258c35a269e74fffa52f5f7cc3fce10176f1aa15b3848e6e39b87ecff0f5a5ff79e6f5d16636a6a161882ce512fddda3fb7d70fcd2d2f1fc6a99488f2b9867a4d9dd1feb6fd36599dfb9c58c34afa9bf85b8f4731a67caed15899bb4261f1aaff3408188e08c58708477ad5441e27f0fbf7d85afd025bcf99ae64b7de91ffbef6227007009dc46c77491bd603bdb83a2c5830cf747ea08cdca606e29d1a813fe52ca13c015c2cfa8f3b37923271d8ffa6b86d6c100ef28f555a0cbe3ac54bdf792121a25e705c1862afc5840419ead770e1b7579d4cbb86c5ae8057b823dab6708463db5340f4a350b4fa21750ea055efef88969bef6762d0b667fd7cbd4c512349717ba6410d74bb70ec3b961514d0d4b6cfbaaa8652240944af304eb446ca8b8c323a46fe8a23b64263d628a8633801bda85c3736067a77108617e434447bf78f819e285b51f020cc85b75fe88532c239a5b2fada3b4e86a23dc5e7070491ba5ed32f6088a7ce74861a46f3e152718ada29d21c8a9ac80689bb170821eec0339b4bc88e536e7ada8fad709002fa8a49a481e398c3d075541a605bb5c7130230d35a4064b48890cd189678514882750b8667823e2e3bc069d23388606c7c2dd5e64c5eb1dc3e15a20be414105d4402ca1ceeb22362bd051ccfc12065dbc22697848e67947553d225603695d958d955cd9518d4562a0ece78bb31b8d2bf6a1a85f0e51348a99e77642478364527f78c70e1bcda58b6083995065c005b024520cf6990be500cf9a280789da116637501857711cfb39af6b3f31778ff686685b6317ef19c1691b1fd61d82bff36ba8ed4355aa27e49b93d51e0b742a4965a087e5a8060d8aa84142fdf25849e8f361b92c619e81fea42c5ffa9eabdc8a1db5eeadbee3899f2c904f02e585c2eb319e580c3ee1e06c9f573b11fad91cc91d987301e478422fda057341ba5efaa9b45166bf1896940b4907e1f594580f083f98f8e229138563e1f6580b2c83a4f7ed217147282afecd4570390eb752b813caa18983274ab5d81aed2eb996d674c230da92ddd4a07604d3d1ef811b474cc54a5c8acfb950fc55093c5b9de770623077f1346fe56c8e7d948538ffd163deeadaf33508b96833ceecf92ef94ae6f97e3facc3b167bab15b31f5917b7fd7ad23fc2064f48a2ed95aca0177197b0096460fa7986deb426aff447af5592e07496b34d5e6cb8caf819e0f237f7bf4f333d282f0e1db94bbfd25532038efc3e366f6e9ea40ff7e78d6c59bbaba33d3939799f9c080e309d7e3637699458f194c10edc4b9f0e82d4a450fe155797cc65b0a9df0f33b4526d700606b74fc606a54876102e94266fad57e7e60905ca051ca229b9a02a69af113fe462ba35f6eb319a95ed5ba3db2894b36b272fe09421446d2d44e4f9075020ee922e1159eb1063ce6f13e60bec3bf5f8ac0646c469d4c21f825f658a252d60aca59b2a1f49b760208eb605e3963085090e66467c8e48207ee342b1834d5651d022e699202956d01e0525a12aec03cf026ee6623d8ad11db099320142567fffe79bdfd3bc1b68e5492ced274f7625c8066f1daba26f7b7afb0c4c0eb5b62205da3b21a181cacba8460e2953ea035bc947885a1c9b09f26b30a49bdbd2da0fe685d8ec301e4f9605dc975bd053d4bf67b2f3a11f4197d5ef83b81fab971ee215ad98702643f4bba4d40d1e9fe5ce4692820b17756f9a13789809e1cc754e936c618ab496285115c5957fa798213eb08e557b6d5d760fc2b54a017be55037a94ff16d2c39cacc03a5dda9d81e6ac30cc6461f232b6dcc4fd3273262449b1c1309e4a025a01bb92e6866169011b5294c1ed71611358131f5c80c22e2f74ecd03210359205aa984dc257f12d3c97685891c34102f2664f0cf9a77697dc7c4bf275117de522dfa765684e4828ebb2c90f914ef4af3fcfacd4818d4d4b1a94f846003adae470fd8b003a5a95e48ac764fc8bae49024e8bf829009c97ebf2694628c2a23e261b6368dd7ac0e102eb7e78037e24f51fefcce99249bc1ef9b7756a4633ab1382e25d61e43cbdba68e4cfe2d196f6467bcd79fdf6ad309f0a2273bca7b95b218b583e354ea06e68c2909113c190445c5398c2fb479d88c70ae091799c30990c84bd2e876c8e0c8b9205de92373598c33d00b29b3532c4d840e236f9eea76680fd77fbb1ca360d95f43606707d9f3527c9a730999cee50143d81bb25ce4d97ccf4b1931df739c92cdf2592e58116d2826895e6df55a03f23317afcd14fcf9e243dccbeee9f720b9157f2fa8f5c5030204f30a7cc736c1d293c1ce87f1ff936048287e7bb34d2d7a55954a74c4bd7469bd6c75ef8725207a0556ee23682a6f6d3c13eb42d27f713599cc307f87eacaae865b5659db8eba23cff05de9744ac47d7bb3ae32e6ffb92b82bed612e64854d843a872c5f28de2b4ec61d1f7ce77c992be43d81eaab4403f3528d3c43b93d7f48b02f5a9a9a8d5692a46ba253f80b96b87de39217f124e3613d0722310c64363e1b7a45ddde5fce3db59fd31f1bb5ceb4f702d6fcc959803cdd6ed3fbe8ea17b3ac56dfe46229023eb5409f8a21d68eaaf7ca44abb7a2a1bc380efad937ddffa7dbd2e3e6c72d46f08d39844b7b59fca3a5f4a967d4b6b1ffe1eee2ba18a921253e11e7dd6cd7ffc8b0c202fc6ab7e875e04b6c533b156f70de917bf65958fd643b4f317b561542ebec0453c013c4b191082cd550c808a4b2363e848d81905e50df6535c4a822b6ff81cb942ee1f4e63a258b305dbb9925b7d2fb952b1905664f8f649ab53cd3a1614b76bc8ef4555104885ce273be26ec8d5a31f7a067af6fb71e13da1e591981379a2f82f7b401bb46fdc9d14e844c3dee6198daef5af55c499719bb03f46285fc4d252618a20e88a79ae234a1a9fd7f046ee1a326c007332814050cbdaace31655f785a0e0434f86eac78582dba228fd93da7dab4a58704a661d3833d4946516d9183385119ae7f2f4569caf19347c3ec851aadce378464522099c3415e0f474c5f0633dd395c233218cffc2f6d3831a42c3e3e8c21cc0c70ba896216ee65f6f154befa0a25e26763e0c9541ef4893d72e815a17d77ffb7efbd357810e524a71a734fef17379c1579fc3a47f056b09e0fe8db85c6d9a0a717714fbb9b58982686c167af34a1b22d72dab66499ec000778baece62957ff36f1fb762c70dd0bcf354bca91cdc77bd5c1a03ce14ba5d6cdffa8f266a20f2a3cb4129c0b66d9eff2f21b41f44d194fbca63cf91a6eff8d81d6a35fe07049ceef8332cc02a2131904f30aac8611bb3de0fdfae3de3f8305e8107ee4f02c04c53f0960598e9132ec7a84595cd8520d683a5eb828b85142dc660a1e0dd7a8e60adbd72f71ead05839cf95af9bfa4216a2c252254ec3718764152ab3f1fb2716194d67785d172175006cc52d6dc43936efb65ef04f399d2d94ad2396a267033bb2fcec2037d3cb44ba532ce5851a2f0de68d0fa25c8757193bb6548ec6634b4c9277e88f9ae0cea73eff4c88435e591e63c9de0347247247c15713ad0f7be379f80aff8b16c9f6d29ad5671f67975dd0a6a437f7cc6bd4c8b50b22eaee01e82e62f5dddef147eb588340a1a1a4d0be0005ad0a1074d9cc4b75ed1ff13c6d3615093b4fceed545d048d635f828f2de60804d05ac0cd4c44efbf8a0ad54f9961cb57a71bb296ef938396bfacb903d44f766fde9293a677942e73467d7d517aeef99824474af04391506a7f2629bc767685c985028f940d80f556fa45bd83ef0b9feddb418a41c7f8acb2053e2368d9d6be78e6e93a6bcde7379fe20ee39c6b7956cf90e022d7ced5dff0048fa05855abde2d7def598b66169b6c1202dfc628a2bac5540cbb5e993af8f88513a5eac0c04585f34afcf9107a83e1922b99020029876f98e933f3d82c23ad03af39b4337981a56c83b7d0f2f98510cf0d7babb88a1daa97848b9560d6ecd8c50a19190a8fb667110340a925be7a430eb96438f32c17d43c40081099a7958e3a6c66b6aa2068f22f504a8380f76c02f98332921fc57dfe46c371c21b5f55698e459cf615144de150315e5f217bcef4f761e9f05892b13722debc659a7be85b816325823302dd977c956308cdbec4e5e7604a9f5bc7a45ebdf4de0b4e8db67987b3beea357910d0fdfbfeb9c86bddede12916d0c83ecad6722adf58860ac80ef219910b9edafa03b7bbd62f847b8d8c897f8884d71bc3081e478b1a3c4ec03226cff5298e695f7fb6a3b4179a63b715a2ad0bcbd55d3a66fe61883cfc261e168f8361ad113c265be51d386b1e32950512d16eac4521743d7c5433deb6defd9f86d486e468d3197fdf1b85ca549adf03a76c0854e5183caec694afbbbff57685c0cce8060d85b509adeb7224d058653ce453b90200116267d0b9a8e46551df90a9513e4dfbc3af6e7a0fcb56405746da3d928487aea26fff20aff88baa8e9384fade30b547b4873d06205ac55337fd72f69f35812b9043a58f119b7ac99e0513a4982ed0baa9d0ffca356ad0e29940f7fa15c3086400c18a79b482af85809b79d3939d52c495c6f2468c0f6c6133933c8bd71627d502aa1502fb7aeb8c3039807300ca5ddb85cc098c1867d604204c2efac9e483bf5c58e499672b00e60dcbcd1a465d0a575828e6462702278ea60ecef2c92afdd6704689272d3ea9fa937502a99c4c9089a5d384cb7baeed05fbb836940863aa73e1bb5831e0ef139c6367d92cec88a2bce8a90762e2575183c76c56e2197821dbcbb8fe2521a4aac79e61a194e719c66efa6cb510f50cd279659fad116c1d906c96c7a06eb24e15def1aba029a115a7e719f3ed3a13ee148dd76245df348710cbd695cfddcfa27badeb67b23fc6611dcfd9c3af22fd209731e1c7e7e8e65dfdfe36fdfe80c2e431eb3f477becf13c8a66764281ab64679cd23c0f54b3f39c3f477dc3eaf3923facc5ade67827985eca567aa59189f3d9f4ce5bfd5276a53d5b7440a79befca188dd503b7bedfeef93663072ef17f265d462cadc52c691bc8816c9dffd18f9e207242f81b2721704830e7ee693101b83898ed2d8bee9a6925e6edf1af86f383cbf9f6968d07e521f1f938259ce5d799decad9edc13fea4e2987969cae521bdb8d809a08bc81549086285dff8d8fa900dedc741515c37166f05909bed9a7c9fc5cf83cff45a2454b195a97897d71baf4296cd97eade3e16545d575b8302cdced287786c656ccafad109ddf7105746aff49bf9f25c62fdc83a09225ea2e3420a8a043b482051f25e041616a81644fd1f90d5e684f357c3d078cc1f94ac6bd571445d2a2478dfdbdd51c2b6f75f8d1e77743022f25d43d6e5910e8e7ae612f091889fd8bf90fcfb14c2eeb063e1d064c4327d486f69eae930ca68c586b03b87ef34ede947745ef60b4bd934c0d3bc9a43e8883f168cb1fd75e0650a3ee5e64ee55fb1f2ab0d71e5c6f9a287fd98e4efcc676fdc9be53b74c28db9cfbf1d606afece748e4c13355dceee21453da931938ff31a84e31939ceb1ce10273bc9d1e116616c23dba5df3befa7c9262d3bbb25310402a57233bce7448467878477d4c1796567150c52157784f17e84fe624aa08d52e1a91ac6d98724ee29d9b4456934fe0a55acbe4cb001f6ee6ff81b14b8453e92d876d7120c7ed0f22cca75253dd78ed62684418771a926547fa1da520e5761061c5ece1e8bd0f0d7f5af6012ed73510ce9ab214b42ec17ad474261cb2cd6c11b894fcee9f65100142d07f82fbd18edad9c45fdde238fa314c812e4da20747654fdb62ee1698d9d55682cff2a065df79760f4892451c9c479b5ac6c0ddaf94bb9f755f90cd729fb70a353f491821b10a768b40c9d3edbe0d9930fb831305eb9b3852e093aceb271f88f85225d4ac78a1d222587acf63371e1404725b8c6102c2009b03d9abd9e21087dc6e696d4f5d478b6c38b26777c9946c34fa8b336fb05d49ad10eb2e586bef24af5c98924a6d0396751824008357cd4045e4b78d4bda5d98e0f692bef359fe94800d6fd21dda80ff53b765929af073978637c6f6c2cbc4749ed16370c18a40d78abc2fb27e4e1b8f5ed0a67130b33da73af03b44b7d6e31f09b74cda22f28223ac7bfb445fba3864f4f7f35a316931f0baac50173cff8384d295dc2db2b1dfcdcbc6e92687848349a8b09fab99d6b4cdb3837a55fbc0e104d9848f5b888934192ec860b3e8a404d880b1e83fc576d89c68d05679dc7f1bc02e4cfde7b326d96ff6eec6e67019791559d9a0ac43cd3c6501b8a6f4a8bfdd42515cbdfcd85afd6e09f5cebfe7c3a3fda48bda2944c9bf7c4019c293755b47a549d1b450846b6d3c8d45e646f5d36d350905cfdfa8e21c4474780027feaf21973d25509166ec01f4b908069f0326726c75796ccdc092d2c851a5d5ca2c3305a8e89da6f4ec3bae3ee753944e8c21f0be905dff8a355fbc06360c0a57399a3947266aa8f59b687894246010234c487d98644ff41466b5f77bda3b5ef7d773a771d96d1281c2c69db855acf59b83920a1dccb7728e879449804fd09790ee3b00d27eeac53912080be71e3165f8a38d4de431c055960434daab2bef8107a277a2dbb15d79919b65b1ccab8ebff43256deeddd2e5463e497cf99635a178fd765b1cee248ccb544bab2b0534616c00f43a1d5ca422b8b87f65942b7b26dfce1413cc3d8fb11f7e4d0da1749de97bb95f944cb63f4759535b2eb6e27748a7cacd8ede65633483f7f2edaab6c04cf9fc5f3fe5b9ad01c3c90a4d21756a783d73c1c593886f6ca278e5f6bb46a5c04ed8bafa467b7fbf265cf3d88a76eef4b195f21d0bfa387455bed0e6c4730cf19909a569a0c3f2a49defb0e06a237100f9ca886d8d9368eec30d0c490b656c7db2a0e797504e1fecc2084eaf01f33b9011e8fa692827d6de89f563fb23bbe6931c7254c4eb21956b2c500be9a8abc4f80600098ef025c43f8c435f87c1d5e1a92194d1fe0b285c1bc89ef7ffa12bc848a3d03c61b1955822aa05d93b70f36799e559741667bc8a8a9a24885e2db27b30eebbeb7d6f55480d4d11954140745e799b368b6ebed85316a036928a2b7d1dfd9c8d40c4b8df36e607b17c4d65958c09acc676fe347dfbe104823edfcdf23cefffb7156ff13de820478aeedc0c3ce911e13aa79a75801583a4a0e14b538b4382c923fa46d4fc63182f6b9b721d135168b58c9bef82b307ba09f1e709c572c1e1b4ad9c48355d4bd29389ce92c4090eef75de8ef741b8cce7e3dd7e8e8e1c71686940ccc8bbcab79822ad4bf2ac67cb3f5d5331f4cd55dd6dba1b38ef74d7f749ef3b83ec3f45e813a36c28e88ec2a4f2d886fc8d140371d99f5a8075ac67d11e6e07bc9396c66bec9768db00754d72b2b561c0fef6f6ced6e4e985f89ccc7fc7ec39fd6f73ecbbf05081d6604cf4603e6b56b42bd301e53632d0c50b6bcbfe6a995cea9377505643970061c7ef4041db3c4838e7284ad587e917d3a3985f7da1641d80a05def0ab83dba8aae2d59aa9d422bfb2b8384ddf10ed4315f5661e8405d4143736cc244430d1b59e27420ebb9dbc990f7bc2627093223bea23bb5da11639844c4e61244795e6a63ca3bfa0e837069d798a5743bf9347df85142d9a9152e157ee4fe63f6ab36abcaf0bdf1fc78b927d0f57401f97ffa1e8ffafa1ed7856e93b3ad2237a3a2fd8eb9fe90bd826ce7de0cb9fb67057647b533fa76fccaaf9d7297d379fd7bdae728fce38075e38097cffa31780e5812449f620a6ae33b523700f00d6bc8b0827fbf77f9ec5bbd1d950e751e5d33f84378e188d6ea6021178e19a7fb8756ac66b6e4771e3e799d45e8783663845e17e1302aae045aba5588692e26e49137cd8dd081134e40444780ace294319a1f9f56beca23c33f3eb5c56642b9ce575eb83bb2027ed7527c1df82d226b865a022c3beecb793b0d9cd7f86ce62eb7a60629d3c6fc003a1ef0ab93c14dd7a3cd6633cacb4966ed0c0a7a6f481ac096e9e722e1a1d625318f80f276c6ceab1284063910046989740c3a7ae2d1b076d61a089c5838081562caa63172f93378a7c0a29515f0ec4977e517a1041456577cd84fc12e559b7aba82cfd8ba18e78ea287c1ba95c7cd9593bde29073c6f646b64d0ff75ce6c6a290a30dad753a2fbe35b3900e8925cf19e2c96de94de0e76e904ebb25fbe84632c7df82912de3d7849a9aa28d9888fdebfe7486f086fd12dd114f9ca249654b8cd66a89b8c724ab4f66161ecc9f9b893fc1db29cb512e37fc989706e3a348ed0fb39c00a883409db9e47b76a85ee74207557ba451e62ca0a21ce8752882829489f4b012bb68037927257a7c06c6a21cc13c19d3f944b6ed283ba87227ef9f48a1c2b1a8ccb277a2708af6ad27e10fcdc025f75f1886836cfaa75f5dc96afd33a2e05837f295bfb5ac5bb8f774a9a7fee6cab1a3a6f34e5d1f6ab7cd5ebecbecb714076f7f203687f83af9e807b3b1e42b00dacf276eadcb52bdd545f6c008f32b1f3269b90c9d0509710c2fc76d66bab59d3a87f05922c842769cde96495897ecb46f67b966554cb0c064572643e3f4384db1ffc4e28323a94cb52be704c0f7a54075c98a844038c18ddec48ff06843288a1f524390924e5047b7e3a9a9d13117a2ece60516b9913d9f0e31721fe48de1e967b9c81c3a071a7e5b3e003c19c8c763d660795b09070ece38295531522a05e71ef0c53002399ce100c69014480ab2e106def219961753f24665e75c91f071a3e6e2238a6f147bfc0d7b24002bb4411c3fbc16eb2a38aebf2d3a208da3c903a01ccae88739ed8a72210d8eb3b42828c356824fb43d045195e58b433b341e323a1757b4060bc5cf4ba2ae7edb6cf756357665b3b93216bd099bdd3bc0d449de7d07ba1e6a8bf62934341dfb39783a0c2fa0d3e32f67d5ee6b00e3c7c8a833c2c26f9e8fc0d0f2dacb7402489b01f89c4509a6ce66047c1626ff64d9fc033964c0664c4d323b58279a13162178ba36c445002faebf5838b02422cdbbf72c852829b12c5269d5665dd2555ec16e8631a306ecd87cf5da9158765c2292a01591b7f6955b4197efad18a6020b229a9293dd4cb257e9dd572e756e5504b66ebcbe33ba48af7cdb082d7fd2d9846daae551b834c7f8fdd49ae7cf6f53a83571ac3ec3fe83ea2647db73dc5dd5f523bfde595a4138b743783b7ac29462d315f4bac5c72cbcf86b6a425a91b613447afd53d55394bbee77d825b1650e875fcd010e1969968d19d85a6962fc2802ca9aa836cef093941af1e336a2b1e1aeedf891b08eda9a335399534bb709907108bd08563a57df6003d72a1c663c46ec96a3ab13caee4564d3e265d874d685e866512b57d92c146d1086bb569ab4ecc5721ff9bd885c04233fff8308ddeff71e7f34e74f39b21673b35d922c3e1a39e4ba21f7a8cc37711ffd1016e70c6d214a9a950a86bcedba549c7812a617b2efe89518f5b5fa33efc3a0f8a67bbaa1b333d79895686a9bffc714a4c30cb94a55ff87f9d7ac58802db16e34757f08adf0bb5c68100ccd13026a886d7ea65eaa43e1d750401fe36287ce466d70e41dd6a118da3a17da26e1f8173935e657ca0fcd038331c8d5d29f1e9664ad2d06f49be43527dd0723082e7061ebecc444648e28c81e7a611181bc37619fa29f2db323606a6100bf2a0c01f266336cda421cbb6dd41ad7a1b70ee6ae218391b461c0f3b30b11f32d8a6873328b395ade1cc7f8b76e4ab0df6d82be14f53b9c7fdfa421491be3008e985cfde8a90fb142637b11a793a14be63e74a836802ddd0566f41c6fe411acab22dd0c2f18e596722d6ae86b71fdb18a507f2a62717473b47e59ef0a6c4ad8752ae0e8006e455b4641fa712e0fb8072d6babd61cf33899c281a761b03130b7bd43dbea68f088aa2f4774dbb10c771b0a191315b420c170aefb42baf724c2453defebd7a0bc829e1f188381123c670fea2cd062a32bc29d5186c98fca1258b08e71a602153456d0b803a317220f14fda9d01122e48d81ce71f2a269224112b7cb6499e21401b6ed03dad19d6c4764c13205c88c7c98e4728ddea3d402671c767e08bdc289d5a50c3c4a7b22005f36b6fbe1f92f12293c050e5130a05fa22c8479d5b8a4762b9804c5d17b58c44da7b6646eec88d6ea23bbc1d90d2a0f2021ec1e54d087f489ca93fdc4a6c9338d51854fbd01ef6d744e2303a13d12296047f852ef9002e89af051a3cc48a70e1b2926440ad6e34c8f485d51ded11abedd1be47749b2ed5ac0cf1b397b561dde06fd89b8767d850cc09ddc290d24b9a23fdcc897de0fce3b579df2df1140583f1c31d1be00340beec246ee7ec06280c11fc77b9fe7781760fe0b58fe9bd55fc6b8adf66e4f7c13639098aa26b099985939a6d1bf5c70194a7f34c866db5a23d2cb7a6fc0bc3d6cafcefb6d9d5cdf0654b7937cf067efe62ac748bec9bb9f4bce6a797b08e7464f2854bb26faa6dc12cf8f08e62ab4c5bf624cf7c05f500a9cccf14f764af4ca8bfe459dc1db247aa10c196825aa2a4a6e44fd02c154b613315ce5842f4c972e1ac2d8e38e09ae2e9847af5b0f7b00c07d7a4b0856832e4546613c2b6f13f4dbf4fbd1a2fa83ee8ddfe517af0821de3badd5c15f76f17c5ceb5ca0de7e4898588503180a733d9967167c01913466a6f1113f2cd3d55d65efd2718c06797fbbf98fbacc3ed2e37e767e3f3f1ec657ffdda3fd13c8d33934d1c02ff1c318e65f04539ebe12737c16f53f9a4a2034c7dfd32cced107f5f96cabd31967fe6aea4a56089e18aec6c18ab7f0dc547005a06c7f8a07b7fed3b42d0f2530a87e4e01cbd82814cf81f9ee220fbbbcd589f8e5d7eb42dd6f47ebf83782851f51a39909a4bd6e21b92831d2789e0c88de97c8528970789a39e45bc727c7009310ded3ce14c54e928b9982aa06e4f168be14e56f431f43faf69338f7fd60bf4a71747644aeb2265f5d3ca2f6f8803879d5df0a5836f4c371eb194e514666b10965d421a694676132d697e7065214cb0a2f2eb9794f67be2a63d46dcb803e59e8608e22ff0483698a689cbe7d0fddb80f26c8acd48a1955aadbb7fbb37878f03f2d18302e3c99b7ac3bccf0747f7f3577c62336de6eb89f3be7e66e0b771551377bcc7c3af9f95887dc32a1099f3bf891b29a7be68af72ed447457ab299bdfad83b4fc3b1932604c18c85b36cd055747df5b84e2ae8dfcfe4d1fbfe3ebbecc3e9c8fe4c1f3c65af872e5fb03bdd39cbd354f6eb27e617eb2eddb9dd3e773cedb537d847a5a624c6f20b7486503f628464488b3a8b43db5214bfea60dab53d58a329c5261ac6afb96ce20bb511bff7ad8a354eaaf3d416b8c15b6f6d633c91ea84b6d39f658838c8b68991659e198cbaf18db28dc0c7af010eba2e0bd060a70aac11048f32baa43a06fe02c10b8ffe11d7a5eecd868d4c193457bfb013735ee9905908ba7098cc0d1d9dfe5333faf0d8e42b5da1393542367d934324ace83017d22fe632ab444dfa610d059deed03cf83f0a16041a9eb4db027fe9c2c6554374b3288f2a2bfdf99d19eb52505b02fb9359ee331cbe4379cd650d63e7b0522fd26f4901c625f8813670da26cbaf3469b1695bf0399be6b69ce31b529e85842b228a299d4493b89fc816c455c8893e2cb6c9c54b6501d4957048bb48fdea38790e211eef3ed3b86dfc32f47598f48f3e95ee3afefec2d6d9d0fd1a7f915888367f61d1464c2fdf9f89645c8726ced32da3f72524eda13c5bc4e39814194530a9e0b437ed2c60d9d913846ce35294fe4af60717b6c258d39fa53b15d241a7ecab164b651cca7c297940ebf7019d7398f2e790bbfaa99c7c0fa75270d66070da932cec2c8470ae17db369eb56673ae89153fc57b3e4ba34cb17b280ba9514b95590ffd14e1528eebfbfc6d5ebf0f10976fd7d8728499fe12300c2ffb373b04f666c386ee64bfcbb3de0c7434f262361094f4aa7f0ea11c278b3a8010b035f932f2bdc6b5b41a55247fc00f2e3d0cd0a8f555220b71609ef20d2ec82ef889574c89611021fdd0f80fbe297ae88415f14666dc288bfbfd5f824bd921c79669d67d68c9985045ee06db0e621ce04844c035775b5d87d9b3adf7d73cc6d380400a9ac2b36792e1922300c405a0ad52f868428d45aeac031d1941cc94331f66b71fb0371ad909b89b2be2115d871a4a1fe5d61b5829b54b4f1f61b295cbc48407b74de3db27f1638c03855ac9c9cf167e121a9b950f5442edaf128b799460150514175cf3b05f5a63d917ac00d179c6ce43d07350477e2c6ed2c7cad316004ddd88c8765e912f407fd629f469a82754c8f8ef1454b8dd884495f1b1125ecc18778e0ccb1453eeb9a5eaf9f601f0c79ccfb3a0ee5889d3845cf2ac746ba9100badb4933f395e52f3af538404c423d57c29b128812c6e08fbd07dd305b184442fd177d0eed13077d1876d4d21ff137f144ae728dfe210884bcc73722fbcfa6dba1dac6005750c2bf17caf79a58c07c2c32f51302717c86aa469f0ef5e0de3107df33ce33e8d8084cad900cfc54426ceed123096a4b27859b340547737fc49480681ff2b8dfd9c7c4a94bbea5527e433f206f4c62d842f3e08cf22ea16998b962ce99023d3bac8e38ea6f32925a90fabc98e190233286fefae231d8cb59671f533dbbd7a62d64e6c7df2d757f6ca764ad596bc9bab0c05df6d8ba12e8046fb5b83706d2a2e40175f4cde6b207be743d3c125e9f77d94390b6831d2cb827e9a3e7d70fb39964abf319b1bc93295751a4bcb734949772d55aeeb92c9a2c07e65f8fb9e4603f42edb185947b844dd0ffb44d6408df031b1b8a4f6584ee66ae6be4aed0457c74d624d07db8b2e81eeb3265ffb8a20d66d6beeba430387bdc907a4d66c6e87d35271ea93d9c2eb0e360d942c63bbbe2a81870ffbca22a01ac4ddd0b014946e40455f67c84d7d23d541e52cbbb09911e7a23b6066997ae17b7bcef7d4890277721d0e31c74e3e65d71bbeef7bc70c3c7e219560e602304742472e81725a7ff89e7265aa645f73df35d95c357bc37630298b435c41dea9ff7da411ecbb2318b4f822ea2d9633ee80e4232aaace5b9f28d9d1d3f75410445bd53018338235a9af6a2f4e06e1e88ddf49f80616923ce119db7451757c3c78b2a35164cd7675cbc84c7b67dff7f4ab9c79cfadccd5f259e2ea82f0025923c00830a7d7b544efb4d2c483bdef0804c2c904a5024105f51ebf00b28e5778e9fccb97c465e82618667fca65156237f29b521496e9b1b4bcf819f1167b77f5744feca73512513659ea32676a595114dd4888481579f396d1a1a6bdcb387c306f05a1d54e98b7f7411c473161f848233194a0025615176479ad977cfd203f494a04d7c14eaf703cd4de3c880af6ab9b8c7d7ce2b4e5e7b2efb6ff6474cd78f27fe6648d7c6d7aecf23edcde800a0338d9253161b70402c96d8631203aac841101c1df1d1814a352ab2d2dace9f8fed7d2a03c40774aa573b69fccefe08b684c28facdc429d53cee798cb4519838a5b1af1a4ab21db04c2510f707ffb9e88c88e54e548913b10f3ed3453ffef7e0cc19222b555ee92e9db495d75b5ca33c7f446b8036511a9c3d64dc82595da534ecb997f4ee0cb59f1169052bd714f83325b71fd7f2b59685f1e39ad9ce771398692bdaa31640971414c3f9021c42ace3529b4ed805856875dfc534a1e167d142e656507da968e4de89eb255fddf4a9759c4c3d7ae093664179117cf27e1f238a775bfcdee94cb1f375feff303a43d94efe7cfabaedcc2cb1e0cc9f0b4456de8525c48fe7d76cd55dc7e54bb72ac375dbd15161ecba79a27fe7104c381da39fdc096a77f5f822e872064160fbb48badbbbfd3be79dbc8f5717de427aa25da4ee7cae9cbd40fa3126d6bd7ace1bfdbc66ae63fa11245eeffb6edb218b18ef9dbfd6a9481f497cff35070ba39c3d60a639d49ed6071e2d2f066c9f9668e50b8390ea417b99eddc7897fd48570c337b245f73e0aca7e493a1f0f07b791d7f33ae1f8805aec289e7d74abfe387ea1fadd1e85cc00fd7703676e6a2d1c5c7ea613dfaf3ddd2b714a79568844dce86b64eecb53b1b24e879977ced4e5d6a7c941a658704ff8591fe2e4ad307ee21f1a75337c29128f629d01c7ca28330b449546fea54321c1acb260c86a23d901324a6d4aa821adef2952a480ea3917283fed0d397ea417ecf1d71d2632597ed7d787f3309661a61ef741513091bbf9c2176f53222619ddfd7319b2cc4c0c563d71a465e5a4e350b693e37f0fd304f0d055cb0b0208b8270634a24f8afbf7f3ccfda888ace210b9bc1c30c7c04e84c6076273df619e4a7a4c3c14e4c99ee0d2d52d24c940f64d8fe5e0ae9c5cd240f7e9be160f855042c49795830e371a61e3bf883b18325f0af099079c06cc9f035e3ec92cc400af0a4267938ad80023fd307619f2973e9efbad64590378f138562c67e65c71ff290bc318d1381c8f03ab8342838e7f1b3bc3fc0119454a9804a8556904e021d0ff9647be136c40619e1d58c4844722c035a27b37ab227b1bfad825958ca13635b98a55e685036d4493ab6d3dab0032ea47c05e35f3f210b4e0007fc5412107666a2caca2bc34393eb7f1985698d43f8a1e9d30705d626747e58b781ed1aa12dbbd3cd307021ec21d03d0cc30b8cba40e9a4c99e903e06b34ab4fe6139e31a315cf79995b1815b067555f07107012ca5d1b2d5f838f5e7cc53a844addb8680cbb6e1825fb5ea9ecd3b94932d976dac0da599099ddb4acd2d7c80a0a8ffa63399f47422153ddfaf19395122e7049d8ea2b0f1286fba1df8deb39e30fa2c252b11bc1a6ae217625c86a7a88bf3ae32ae152d2cb05c62cd2c36154bf9a6344f914b4c93b2a0da30df6c0d4b246730c4b7b2312d42a2ddbc58218363c8085bce09d4ad871acac7409d8fb43562a3cc7b17e57eb7cb8a6bffdfb1c954724a7238c3ee411bd53b3630f273f6077a9f3a0d7a4bee7a46c6bbf28dee463c6599133510803a6797d4e5b1ea1fe21cb44c987809823ac467404070cccaf4077cd483c5f904cda0cc7e626a63e2cd27f5ea87c608efbec0a1c7dc46d20bb9d19b584eca77d66e4d17f5295347b9085bfe3e278667c43a7381643f5d9ec1f850c0f0f7d6865a40987b1b36c41dd698c0aa609ab7b06eff4f125fd3ec120277149bf3aa1683a9682f07b4cea0166bab4f2bc1c4b84f04ca1311752218a7d11387bc8d441f0fa2051ccb2ed5cd552d648c42d1bba6b43a85be5e270d1a45dd85bd37a4df450462022b6cd3c7f73e40b75edda64d71e9206898216ba630ec823939081fe43d21c040c9455806ff469cb60f20596c621d5a2c75be9fc83c6dfb8101338d2ffeed03248ffaad69fa98fe631f01d35f26f6382c22c6e52a24cfbde7f8039bb2ac87c5c5e0fcfff1bb7e23ef71088c5c412460db76f404149f2fe81783771471b14bab2fda0cb26e2339841a5959ef1145ff231f86addd22eb5f4c3a1dd2aa416f967dfdd333fd87dde1186ffbfaa9f98aa79337a77f01a337dfbfdd3ff4d9e0ad8b776e4b7a8ddd77aff36aaecffe10f1fbddcfc375905d11aebdb8f506b82078ca46d23b25451b7fd16659a10c4854918bd5de421f16fea92d6c0681f853f3f10f2f0520b03e0d98d57110ba28809c26bc0a21672131ac89e4284461b9ceea193935190b1907d4cc7ae291cc05af165961e4d4bea34519623a0f5692f3823fc9ccfa1d69cfb50c5341a8bb81e98235aeddde3b4754a18ca11c84716a3d8dd6380d8709c53b5de575d5a65ec2205b55f6523c0d6e53648f4024db2b733507e4589d2ba7b4cf1d190b0d39eeef757f96340afcc9e5a0da2a4c111637b8aebd5ce7567726327c04d6aff02a4412a4eb479867686644d92c333573ff59ba670fadc7a0e528204677100bbf902b0201f6301e4e06499aaf89c5df19eba5651d2031b63ac4a09cf43a9664df44f2bfc4acd9554d3dd741c5e53a514edd164a70b25192f36e695b2a8bdab3cbbe4eed3b3ea5df3324e8c788345fab0f0d239c8b5cac9c87b49144542b64ac68b9485cde3bba3da0f1eabe3c030eb41ee6b1a9c1c88d329c4f92550963d51efbf4018d7a6f853f900737c7100055af0ee3996894c5e533e08277ad2286598de68a96592c484e2aeb1f7ba2f52220dfca4acba5dbc9b63aee2acc233631eace8326a6ee9eb92b17594e0db2381a4141bbd0b94a7c6f5dea9fb413b82102ee847c5ba6c285df3fd375b857a909246ee27284ba658da11061f238b6d7d2c16ca3651d097d29802c50dcb2993bf5fd3ed589515e1c77b73e9c127826dc4063cee4e7cd5dcca5695252fa91eef77b20b887911bcfbf225d118d74a430b3f11f6ef2fa091d97289c8d589dbe52852612d0f38a221d5d1203cdc93b28225433c86b3e7d30bd403f14ddbe93f544da9c7309d2d6ca82c3ee220d4dbad6815e0825318437e3d7def77c670bcff189b0f818f9296db26797246cf19c9fa4f3d8171970eba2dfbf9f7ba6e67dd08bd94fe7d605ce06083d8786478fcb50523db24883d023047a8f540b4b83992feb562e3b8cddef016c1789c96d985ea56b81f0d284e86104271e0caad018fd18e221be2da618116719f43f072cde83e7a2543a34cc3e58a7ae63c87928eac42e394b8776570c65458a0f34f314d36e3b62429c36a3d0c4950eeb0d41db9edf5b6126ebbe4e2d9699175046e647d6c5ce371f5f497baf074d19f76e970d57d27e0900b109d9b6ed93486b193d335d77c8ee41570b52326a15fbd0a05c4184cafab4e79156ce3aafa2d61c5c25ecfff6d2986054016cd65221fb126f8cccca8ac442a3b8f58028a1bcdaa5b84b5df345f4b5546fbec8a73929961e9218a9d8666e2dc60f5d857701890c55fc70f3601b6c262b06333760a717defdc1a81b499c65f8208b08ddc4454029a189d4e7d4c8e39702622ae5dd59b4a561f79c0fb2e7124ada5f94ced675fa4acdf69207894aff80bc701e4a89badbc4965abad8421d3d6e12500a4d783034d552281d596ea947f01e5b205a89f2da4e8509c74901c61677f24ed2c23c7da444c640d65078978b67726b8b06327186005365996dbe4ecfd28abaa81a9cc3e4ebc0145d5f417ae76c1d660501c74a21e02cb529d0dc157a6f19407f082168954e27d64b960c174aaf05dc91105e56d220d4aede9862ed9238ca51a954ead9595dab0e8eeaea8a0258059c2832eb0648a4f6ae88c7402d16d92123ae0ae1299c83eda759eeed6b0d7ceeeb1b0c7792ab6f8afcfa592333feb98a6e1246e5b65693dbe655b7a82b4c7558bd024145b0a715ef8b4818b838220df88ad324a3dd305a1ba2e92f11d4d22dcdd4b2afd3041e26054dd650948839a3445d717f832a5c4c26906a60053f8fcd3180cbaac4ad79f3fda5ae3d01b7a45462b98267d32a6cbda5d166961abe2ac847d335c62135cf85561a64aa9286dd04efd3e02dd4317c5c0a12486868b223e3f99632c98cdb4643fb62a74c088c87dbaa0fd3efab6c393762c020903d6cc81ad1dc4cc2913569bd417d834d1b971cb2aaa6bef0dd6b1ac687a79527b3167ee312221b0b4ed2c5bbd0557917c23399b6e80d18593809683e3121ed68f87a23b5980d6019152f43cb11947f18fca13806c8bfa782b0fe289619182b0903665413b410addb4e7a4e681d0a6934043285e0e8683ff6d0cfdac307407e0adba4e8a0dc0d47e19d8b0ab12a46d843479af31ca15baec996d34caf5bf57c755b2639837d20af21260e2ddf70b618fb8405809086ef4f56cedf6a42dd3a933de799f6483c8400aa5eeace92b80c3ffb132d9e69227893d1b169bdaf06b91f71df235dac711735b00b4aab86a122bbef546d4c94a8c2e65d30d6463cb6b4c1a9911e6780ea910c13b6d5c27dc33b499f5c5f6bff735e5f7f6299bc9b9397df2b73c949668f3dd33b9c06497c484903987ba53d54ca06aeca0e06ebcc3fbbe4937b9d4859d3e06d98f652c670c4dacbead9e79718e67c332351cc39dadbf31a80b4bc4ee1b43d66ca7e2655debdd495db23def9dd22ef4dc3153bec6cee4793d0891933f78db47bd4482e67df0c0003cab23d4f00dfbb39dd2f03ce124f9170bb94ace6d126f26e0e68c62870d1f2585bf00dab633ee85c149446d3b44d9f37b43233284c949dfeec4d4c72e253fdc5250e435087975ac0ffec611b1fd14e01ee2fb0d0d3cb0da43c439b93e2b6732fe120c8501a5de2f4408ad0eda9acca1f60ef63b8de833f9b0eb3e0d12db7070c6602c1b8e3783cddb4153cb0962e71b097641ea4acef89553d60e3c93338b1710e316890306fc0ea020555b3e5afd44c6c8d317dc3e98aa43b34d54bf7cc11301cbab9d7a421fc6e3b145ee8bf2d746f1d0974e3f1cdd34931723b5620c2c15a3639a9c9da82c924d5b1fcb5a55bce75d882e559bada72a45991c1f36b72a70c07eab9e0a66a34a7185a9c7c79e41de0cfe6bed7c8183b3c9ac27bc77146b9366f14ebd2aaaeadc6c09fc09605ffc1f4f439456b286e994506cbaeb0aa7fb0d9471e8f53b04ddcd5273218ab7bc070223d9c51174ce68577f0805f30c2f87acb233e9594bf5e1e271e84064d15455c8fcf6c45e8c56fdc5cb6fbef262d1666cf5909531fbfc88b8676137fd2d27cd13d007b7079f785e6b1e129f410c171f3ae438fc2a3bf513adbbbf19d7ef4fb61171ae5caaef6fa2de81a4eb24597e14389771caf13475e777efc77b5c91d00275d95657f8a52d27bc4ee71ec8b801f881314650280ef7c6eae74124d28afba201594e53cb2d1f2111224c42d0daf8a33ba1938ced098014c718e888489a6a7ccf9b687051fb8f289875db3fa5820a007f1fb8c184f8114ecf08257b03408329002948b82272291c9e0f2c15c2805d47509a411117f4c417fc747746b17c1709826193915b5701a76aff1d1a327ee704ce5d278fe80355d5eb7f8fd40dbff05e4f61790814a99cbc7619755e3572a4a6e0f9404bdb4e496e6f97a1e183f6c0606f0d1bd8307c60ee2a2c9f917ff6784fbc05d56c67f296b6ec1e66f14fd0db38afbca215d8e5e565e6358d237d98903e870215692c5bfd543d76c50b49419c954405e0e152b088384c7126f97974951638b342cf6fd92a26abd67d579887b30fc18819ea77afcb33bfd2937a9a787c50b2cfe68bfd8c47c56f704523cc7e0aea70d26c42260c66de221dcf804173f3cb3d39c4818d43b96c18e15bb10f5ad44cb541c33f109e9ed8be2457e203b7f784b099f3f4b8e6d5d327a6725947441a664707736ec11bfdd73e68ae3d4d466dd27f3d03868b4521f3fc3427d6ac7cecc159c20de249a1369b3c3c7e14d3a7e7db859f8c62c55bbb0a523ff9b9dbd7d0143e3c50b218fc98a1221791f25dd4d52a06b00fb872a989b0b38109298f9a3eaae55bc183050ad053be1ec909858f5b9b65183165a82411433b01d062d5ccdc75c13682cb99a399aaa050bbd031d698d1b4b39f2714ec144c26df102ef2dd5bdd448ea5a4cdd2638b78bc3c1070937b9b855fc23f1c03c1e17cbee48fec917db68a807eff2ae317c4ffd43156374027288ab22ec1c6959ade51a9dd6d516d7e070d1c3f1c33caee7521de8410431badc976ddbe22cf5608b01b3faf9498f3b2051f85721c5048aceb510280f3b097bc557e4211ae10e60261cfceb4622b117a52d1a1864b67573c5cbf9838f0cb087eb79f991da35172d86e8c5a46798be59c115b1cf8955172c34e6495257eb6526e6e9d73d74ae556821bb5f6c1cf09f6dec56cfd1809d5e49ec7b72705135bc2195313ebaf116faa6c7af8db6cee7e688f102e7fe71fa2791859fcbb59ae88fe609c4591faf86b544e4131aa6d8ccc14238d022551f72fadfef2aa785f17ee1e28488729b32cc4cbcbe5fb972e42978b1b87c8c0fe4195d0c7014ea9639a9219b10c8484bdd129836a2c921c6ea7bb58a5e554d8bfe7f9563b2f8f4d2bdf5a08d53590f51e0f63e101d336d0e3e3b8ec1f9587342b03efdd516c82353ad7f73db922f8f0d354cf4913a4068e412fcba38daa7fb1a5afaf878d2f768f2d77e24129c35f651e4cca7667ea9b4bf582e543225f26436dd61fa40609abe5359bd555e55b2958918255564247fca6a88474aa311fb5baa4f091ce68d3831f257ed3fb150d6c7d82d40ef7de3a3e9983bcac9a65a6c87b1d5d43427ad96d45f6d148724f0e25580bc8640dad0d6b2129ecaa7ca1d35528b7c2e959fb5433d4183faf6f915b870db9074a2e17f1209975171ccb8c853d38107f828b3ab45310146e99638dabadc5a1f80577829748397330eb713fd701caaeb7a448208c96a0d0bd20ce3f7bf298884e4340e3e9762faf68740c3ef1886922801a5d5aa82673c8d734e851913545a9fd68cfec5131325a11290ccc7a305442f53637a1b66ee786798a33fc7cc693d64ef323d7880477fbdd0d73d8ade9ada1cd098b3f19721f2bdfc9893fcdb2af3b478b9242c4f52f4dffc7acc8da3a162b6412e9ba9e7137f2a023e73ca4f985ddfcba54817295eb2914361f2b7a344bc68ae0bce9ee6ad85f6cd90cfb69ae306bf080c6c23f1ddd0d3044488c8ed66b9f59595f805a6b544b1c43fa7dd33de7a0966f9ea1c2b2fbad58501b12e776494da704c0a43bbb895d1747f1343f5c4fd40d48627a29bb455f4d74def8f80d23bcefe83339f67b3c800de27b0edd95ca57e2c3e16ef95fdcbdc6bc759dd4792081203a22548669cda0839d4772f3b31c69814ab0e6f1847beafe5e49914a7f74bb2cb452761eb74a45e6438f121f07333a1f58137a78233b74e4c30923db7b87024a477dd4112a7de53854a10f835419768980b2ce9f1e3b1ef31bfdf2b8fe564509ef64431fa3d96d417aa2a3ffc9da27ea525a57320df8543c705bd0e62ae3353a2692d44963b46342f1050bbe9a1cb6c204443eb206f5856939f4b3ae606aa4bf7438031fc82a80c3a41802788cad6423ab168e31959852736e3154634da3cd6d0073858dc17024ffcc0ee27a2ae7802018f3482d47fa80d9192526abb8100945c6e60d1229d161a8a7094bf0e1a8a01ea3907887787796aefdc25947942b28f36db95331d5d6c67370b7f12a5b7a9a5c98cb081060c12591bc6fa796aa8538bbfeae367102f73c6e9b553830310ebe3842ede974b9a6e5017c745f38088f23173c3f8d448f2aaeb78c84ec23fc01bb570d9c2c7ca12e3ccd99cc8e5748f6b931d30e82d0f185180aed30354dc63cb4786dd60a6c42b9ebd958cef4fead28a1f93c3b41671bb6bcebb7ebcc41f8449d7971595c8c3ad8e1933c6a9d84cef1f0f812749a77e7162beba2373636f1abf09834cb2a53cfe4d19202b3bf24fb63a98aa9ba1092f7c36c3a0e94fdf530d96dc3a56157237af4ac7fa8edf8ade7cdb1fd31968f06ecb03bc70dd7664d114f383b1791f8adc8363b735cf82e311258d06c07ab77c3d99feccb1dac6d607a0df821b7f1922862734a5038db979b0cb31553713e743c77f381d192fb299f430fd71c299f14e8594ddcc4d00f07a18bd1de63de4f836b7c085c2ace1cd48a10f57dbcb54a3e8cb620bc50b03f40c6722b8fe813238e8dcb8b3114d47a47d8bb662e7dbb233ee8887e11f9844f3b5a4766fb6edfff2a135548cc150f2ebd13fbdbfcf75f5f2fe1dcd6def80131a69463bb1672a1c4e017420e88dc692fc809d09e1165279c89453100318be1edbf1f89ba01e716ac0e3ef1ad3c6153b39c75f30729c2bd0c76f7dfddd4908ee13b77a62ee194271e5dcb839f9c418f5d393ffc7b129e0e7cdb87ae59fd51da6e937fa13a30fd4e81066a4d4e3dfbb0907a9170a61373ce42e53374a09a1b30d90d7e49e82a1545e9d15dc5c5525bda83f25dcde697b4c0a5cdc1108bcae5395b04710bf166d59228b74be3ae04804d56e60e0940dd3d4265442f2c3393e890e18000532216111d2165c4ee5b9e6e791ecd167fe2d6cb0bffe60f99937a2518cd92621f94a86c60fc134e187bd9bc5ed17eb4a2e7b972f9e9ffd13cf41b558be68c08042929b1aef58933ceb811c07c9217dddb614ba2fdeff67049e5ba7fca3058e25e8cb7cedfd7776ab6675e61d3f92c1f9b3bd268d067742c02a109f06d56561c764892f5b80bbd682203cfa051a7a5ed6fcafc0c42dcbd409c6060e9c3a50ac7a4509e8c09e6e90787c8625c954e23c946ef5b2d442980a64a05e17c0620bed67d825ce10539e32a8550d95ad576568720c0c0c11e2c0613e12347c16e02b74490df25850c3c6f4aa47cc803b602cb5c396d4468047b7e4eaf23c8fe52270b2d25360a84af4d9de7e5a0f3ef803b5db1956e6a68549fb2350bebd93775dcd0c08a28fd3fa8c7bbba8ec3b5924dffb221d5cfbeb1e37f3ee3cf54a13fc67a084012f98e03b0f3f2cef513b86ad754995ad462cf5741a87dc974804cb3a0c404a074622b28d7a23a9a36eb6a484a43732a20d32128fb713211ab63de36ce0dc7713fd79201f1c4be6b56c8e75babf839238fcd91cdf34c69ffc2aa4a6acacdf60560d89dcb21b46aad4fee352df864cc72a9793d0bccd6438a8e6b43207523305c43e74d1783637d008b60f4d9a825ca54d997f27174be238c28ed8d339358361dd3df6057f98482cd5eb5838f51df1be076703156483aa2f6e1153e0bf44b15793e60e8a426d5fbf0b6d6d9498edcab35d622a70b8f356e232cc0042dc7619814cb8e4d1dba2923dfe4ca257e414278fcd022d2f396223ac0528ce7f51de65562d457c461ac5d8cd1442002f8bf76c5bba98ddb68731a4a383ae37deb03fde91d5760fd80a625b9246ed8ac0d8e5b8985010e9ab003cd542a59c901790493788f457f4e8dd87db1aabced7980c9987dd262c1e58b1ce5b2ca49d1c14c2574c3ca1d622e7b54a611f51612a568ecbb8445d3515639192724da877d990fc1db7ed61bd530ee045975facc7f54a6ea44a8b5df687641a7a7ad199e203474392d6158b93549890733cd601c4827fc7b01466107209d6b9ed2743316346b663e1f94655bf9382beb8d7e450b05b15a88a14e50f5aa547fb1b560956e6fba566b0a1faed76baedfce9091c67cd4d6c9ee5a49b2808c69642d3e298240b2a9d8e7ca21a16b68ea2125aa664e15e0e8ab29b4a8e614acbee8dee66358a8266dd80ff43f3530dd4fd53804f8e6623cc7840db356db11463a35ec0438661dcd9641af41058338a42fec47c946cfc0fd7c57f81dde3f246765c45d1d13fe9deb667bc2b55e6c4ec20dc3f7acc4d1ae58b6c4eb7afe5c36d4fcc3e71b087379264003b01128b83514a2cc980ddbba5b52e43a402256e26d5df5a676f732d85bdd21dbee457da423c49af849bcbcb5f7287bee7e79048397cb772e343569aabf52fb22ea926d0efc1cc2fa0eb415a4eb8d9c5fc37ceb31d166e60ff5169a43cbdb7222f0e6251ed6362a3368984f4f5ee78b18b6ce9fda878826aff02ab176dc159e3dff313ba8a0221d8a77de237503e5f8ded02699c3bac06ce26f4a35bf7c7e7af957c7264f8be1d73a56c4700abea64dcbd83320854ad25db44314bda5137d6030497c16838a2d0b16fe8bf4c6285067bfc93d5d6610dfc36892ee67b936bf82e2b37c89104e7af80d1099cb17707167983f1374c3fd0690ee24b8d1d1ab797427b57cbbefcea71eeb5a82c48ed3aa53906d1fdc89fcbfc8568fcf40546d82e036b7434644efd188a7febfc9a0d89c124c4ef2c3833fe6e5bd3ef910c56bc1ed73d625a862d117dfcd874b73e7186bc336af2e48ed4441946cf473fa8098c427470496f76d5de574894eb07087a586356f91cedf59dcc545dc3816efcc0e733cfdabf4d71d2e0ed35536c1cc8a07fbd0b2705b4668ef9348be2118e5e11337e91bccd31f777b3d30b623386d1ed48e1cc6c3375dd6b4e1be6b7d924ca9b08b330ce8aa94f8592d43dad02bd65bfd83449b6b34e2cdc5b27cb4d99c00790d43057ae6c99841c77ad7d911241f93e60a86b7a1d3b09433daa7a16506daf2c7730ddc8ecf277575e7c55ce3af30ba2994b1e298af9b7984b181e67fc8a0285bfecb7e06d7266da1353e567cf36fb6a6ecc4d909c621f9ea3a27183e517a4532a75053d875cb7a457432e03561cfae6f6ece55b216612ed09fbb39d990efb688fc63c3b302f7fdcfac30e1f025337d5d930f131403ffd84136ac88c37fc3272d7abd3c8f290de976ea6bc073122ef38f4edc5f4c0479c89dbd615c976bd97404a56c0911ec92cf2b7d06e98f85c72a24f0a41e97f54aaeaac2553123c9a20df362c4f2d3266b4fde1ba813176db3422aa988a75590164dc6be44b2112906e5b2ca6031193714e080db6edfc967a34bb9941c98731d4efc54af5ac9f839cbac003d7d79e2a30a9327d6fee6bda6b7c281178ac0630030dd9dd1afed3a5ba17902f56f4a1a12b67eab1909b4816f27dfa7f22a39fcfe69a22819706a87c508c0cb5915ee5f36f3da3cfbabe78322dae26b5baa9159bb3998ae5d7cde89203bc2c6a8af46a5b592c91d399a8990f14c0eee75454a0862f93ddc8b922047dab1847c963574ded27ae4b1a2cfa5a73a653f899c9d5f897f6b5c12ab84e3d94b33f74cb4c44d700d911c83aeefa194a7d275328c456bf7cdcdc6a8be96ff15d83ac31ee9c4723d35517dc7f627c3c5b9e9cf6452669b20bfcc0ee2e8473848ce225ccd904c7b4fe4225d48640ee538babed34744999f2d0599752f9affbf22fd70150254c25a92b8c63a98036375dbe8a511f74f2bd60863ce946a8c3f4373ec10d4e8e28641debb0278fbba00dc42999bebc58e56524f43c0b5bb1413e4ee43e4b97bda2b5452885335f3a5485b8f43ecf170366e5875c6ea6090e6ba7b3c1cf9de10cc8c59b40bf829428b11da98115daa00b96d6c1382a1bb909493a26a064d312f3c48c9cea52d2a8095cfd5a00ea86a527b995ee843822d8bf798e80c3c9448c45b2de2fb160b203fe68efb80ad7b7239709e88e9b4fb1fbaa5ebc187b4d9fe3465ec81e38847889d1390b26120827af79490c927c76d8600aa25d479e81b7caaafbd8be4e1c943a2db705a457da2bc736ece4121d34bd2feb2eca283fea4019f1f9e8e61974075e421be34e37ed946988a5e66627888126b5762c2acb67f2b60771af92ac0b440b18e58defe955bd8d171c90e151bf562e10d88d96712926f82596e52d02253afe58fe3fbd1f49b9ded86bfa8a3f6d974eb35f1373c653de93698adb4c341a2258395fc7d7ab3ebd448f96ed48901b34d11674552535ff2f27730a1447eaf3c3b881408561fedd13eddc431b13ffa95190b7e4415e7c5177bda59a93087de4fe27694bd8037f2bc0d280dd5a6fe36bac81314d9cb682c6b5f04ce824d2c2bdbdff10dd84c382c81cea67517725fa53b878fb2e603097253985780438c8649b3e957204e5d94764d3f475de4b987119379270958370d1747df9b07c57f1dff7d3210f8bafb390ef35d83bf7810cdf81548e7b2856c60de33c8191d38c27eb39649eff0e3ccdf43541a87d4ce5220275ed587bcccd3302ff70419d7c93d579a96e8d85e7832f135ca4bd2ca0ea1d29fd65563485a6023a718f5c2061e3e87a81c01701aa931080d04dde58eb0a60c205554971860b1b2adf3569a661d51f7c130766fdfe3a1edb4002cfe5c2db9ad765328f054c7e29dc0e8ea8899f69de9d7811990bcb306df92f0d1fc0b98b6e15cdba982e9141b0c91d0fc8bd6762d8c8152b7e53095be55142256e70fc630b28e14a9b3d71ec03c1c251b3787ec267145d337cb21f3c26a9e0cda040efd83cc355d90a1008d5c10f6a9f786c432989f59aba4936d27a6a2d5b00de14eacef4b089ec4457a01bdaa2fa90d4ca21ef9d46b3a54bf6bab688b1680d8c6e42968fbc5039146d5f2f71d2658475e0c1f6870184988a51a0963294630c3ed152cc4ac5e11fe2750e884252ca4491d9520ec891c1c4c005c7fcda77e259839eb809162670bf89d9d93841bf03cdbeb149b29fcb2eee2c4d40ec10e11a4f9f94fd7fc36cacf6992a4f0fcaaf51d1878ceea7add75d2c821b6a8f3ce83a7eab1228ca9623043e9d7928145014d237f7e6b1fc4af4af9945c2d0cc81d8e6c952da1021f0a351e9c352d9fa8b2d86a9ad2499e475be0632f00a225d8959e8934debd4ae1b1ea52b5619be05e2d698f4bd5bc70cbc3fc4c113d30c0c9b5e831759f2b8f823123397c881a2fa819f8c3314a54a3d7d54a53cd3e5c6d70b15bd43baaab05081793b15ab76ce3eee3098ac45ceae05835f088240c8fbcd4cf4418e1fe6430f10ef826ebffcd9f7a8636f00ae2018ca6fd493241b7ed2bfc8d0438b197418472b8f0e0012b4316b7daea4a70455636dc4dbdc707560800de888064e8599e3e9c3be2dd5f258647d17fc1936ddfd6fcdd52d07be184d02c4c854f38339d702bcc8fddd42cf3b1bcca7e5f1ddee2223eda8b03e6f37be9f0af80edf9ddf6f3213c1eb86295b656f93405be55eac0990d6c1fe76046d6b680c0581d15b8c4753e06e687307e3968764ddf0906caceb00c9cf0e13072d0d7b4fa2ef1a4b93d783b54cad2db7be4564cb26873c02a280c97f574f4b669f9bd81f1c7aa838c54eb4dd63a0bdfd931f02fc3c2762076c7d1dbab8061818ac15df76a99604028366c7344c319fa8ec4bbe3ea36a68841fce4f3320519ce97fccffd9d80ee2ea50c92798a84328af5157e00bf885e53046726939cafccc3490f691e6fa03043c6059ac1f661972c816d6ce6098530f6a0dd5258889e2c45dfb7cea0cfb6d45014f9e851c6c9c6ac0194a68051b78444d24617d84e3713e234c9f053f45c5f8e31f42013bc9fa7612ad6d159861f541e08033d4a51ac4b9d7f2983ef343ed6a19a702bd3e42fe9158a0c05855dfa64e68064fa5227b22b1f87626808a0dfb29f87d161a02d3ae78e016aa0753ef34371f37950cfe014da460a8f5560273d89df0d3c2cebe1900ce0b092045888c3bfd75c72cbf0230b4c0ff7a9e70eb9ab344ab71c0bec0a719c14c7fb8130dc827859a00e380f067abf14df8340807c799433ebefe8cbd54bf4999e76c99907eae0c2f0b2546bccdf2b09b4ccb84bad19e1682c8635acce956bf0c807ba400823f7564ec39f907455c0a83adbdd13f9ad127fab374a951d715ae3f5ae88e2980cfd62c6926a8db013ecab96806d96d8880cb1400102197cf665a1f304bc89de2b12bd216e1d4ade1633314cd63dc1e86db7457a489451ca542e9d4f58a0ab68e922ea05ae76b3901b495749057982df4749f8f8723984f3452b23959e9135dc3d7e354252b31644dd2d7284ce143a6461e5c5897f2ad529502036e74a78e4a2a758f8ea1a16b57f88607952c5b6189aa001eaceafada207353e37f1e4f6f22973313513de878cf485031eead144f5ae4ef5dd877193777b3654352d1bfdcc1f475f0c3c3273c1fe3f5bb9b8e69a578b78df56da4f85b4ceef6abf3cba0cf14cbe3c9d7afb4636e54d9e583013ddcab810e186dd219f4a07886230edccf3858faf741c8e12f5d79d4fc0f254023039e4181131863a0d32ab3f53f7dd8ab406daeff5ef3c152ad568de586fc89b55dd0f282efc78f69415ef914461b87aa35c3e01b516344fd137e1de9b3e9ba6debc61388e377450b290dedfb08f551713cab75024ec57ecff4155e53d4e7762664be57982f0f45e17ae6cd4fb9d025fdfbf7ff6bdb08aa6156a82a6b70c0596d0f30d0a87d8ba24a1cfb92961a43f57f4b42f01a73b675bb2f9febabe2cd3903eddb867d12fd59c2f2c056263e952dba4f6fe756ab271515f426c176985c6b32d7f4e3ac1b47326da0a31fa27dc094f374c407ad30d84050b0378717fc7583b40bdf2d4832d293de157eda2a978a51f2f102ef8d0270fb8d24849b8e6f44fcb38b05b9bcf11b2313015721363984f01fc1eb8b296e2584b6da9205110ae0495a0b138cdccc6afd9aa1e24478b90519efa9e8d10b3428d7fd44c611e1fbff991e9e7f00bd9141f54506c1cb7fb0f2ff06baf7b8479b343718fa4ba2936baa1e00faa5d565fca7283081096d87637a5086be8f06300f28143c03b534f867fddf8009ad4593b6026c972b22b413fd81635e867ff0a5cf8381de1dbe6c615bddd237df1e2379bbf15de1d5f866d87f3d806e32f67a7bc985e4c70ae328d78f4cf8d39107c32f75dba188d1a4f797297abd6ca38961713c201b0080feb665bffa6e07a67fd638c756bfe547d0003761b040c6be249d412908bd0563330638b7369547e96fe32572c06bde73b64d267e669d72ab7646d2407f09cef6d1b8aa30e4859bfbe84cf696a283648ae01dadeadc0549f1bd7b9c6cb9a62b2215e5f37222062ed63792c7d62633994166b7de7fb17d6fe830861ad1c6a92d7ea19dd2f3702a2afeb11e4345adff17ae64936be331dca22cc13b7441a7d643cadad071980cfbfb0ceafb814bd49322fb3f9b5c6e78e8e8a9ed451678b482cb91810ec4506474a68264902ac4401fc4b95dad4a311a7b8c8b527c184b055d4a74f362e9d784719d1cf00b6b6adaa179e863ea18c0095b3da35a57618b97e56702569927ec99cffe4d8b834b8fd3c465d2e78b3d66920b510f153292987423dba9ef0848bddaf8b2c63cf4278037ad8266954aa1de40eeab99216d6cee9b64a5008c472b60aaaba32cde80417e68b97d10ce1b8d1b2e9785dfb09e5ac7995502fe32362ae0806abe61c183f7604cda6eccee7745ec1a030fbb0113b13ddbcb2be9c92fed02a732d7d45d9bde6a86e935aad26923eb25c23e663dbeda36bf0ad610378e31525036bf5fb85e0f9c55f701ff65d69ce77c4c6737ccd9de4861513641824896df5ddfc43ca8db7ccc37daf433e0151e241f827fad86628c0bb364e76428b919fd08f59b039e33c6ba103b202c69d201ffffffffffffffffff7f8651bcb1fadbfff84a744a32a5c5fd580d4a0dabf6cf0e927692322529d01fc77098200600106666d6feb32af1101b10c0106bb1a6cd55abbfc648c160d66031030c1c4d506bb5b24db40737196630981ee06002e799f572aed7fcbe25206f538db6c1f3dfe50c06e302c4474ba6093894b0780afdf1b752b4ce1996355e82b0a8a824e17d1f51d9ae7f9a5a0307120e420929e7d3a4436de908890ba5c34753669e6a04659aac9225225f5658044fed47135f4a4e40d60d17951f2c18cc0e20eb861a3fd0301da702298f8308a6fa8ccea3d4f87a228e21ec7e27f4aeb7af0b31237008e1f78ef57413ed197b0683c11104459c92f2357b27352b1034954289ca4de3cc8d2bc0f1837defdfc5d3dcef2ac7e183c5c79b0bd139d88dea8c0a8e1e2494ea5d5fa1d5a8a995c160c4c0c103549490aa4e558cdfc2a222051c3b30e34c87b2cdce5b85651101870e4e2da226dded5aacbe33184c0c56de71e4e0f02054760cedf966a90c06f31203ff81c1ecc0605a585a58c848f98103077898f1d321376a5fa1c82dba693ed6d8f559dda9b80622b6c0537f301d29bea412d542cf54316a7a3b6db069814dba06b1196f652e9b82c82c96a9b3d9ac85c9cd23cd60306fb4f7e0c5605c7e381b2c2f8e1091c5e7a93fde9ae2fb93f625880f1b88c4e2e89d37bfa47ce99aca94404719296388c0e22fefd29b2bfba7935ea196dabcead4285cc7ce60306f381b2aeb43650522ae70f3d4a8ce3d83c1b86841a4156ecad6a093fe74a3ee33188c0f4458b19730214a793e83c1f040641528a9756122aaf8b5c69ae6f4314cc569fd4024154db327ad6c957ad715ca603022a8e8b51a29ed6c5d5f6ba7c80617b1d95ad5938829d0e3aaae65b492256606832943a414beac5989969a6475aa190c26067b860e1debc74a193a74bce165e8687111a400d93380ac8f198890a269f6976a522ef446794064144b6962c7b3854bd3e20c06338688281093f7cc13696a106a32188c4828cc9d579dbb613defee850e1e62888002939d937ce552d9b9f4138aefbcbd3e5a5f9f85c1f010f184255fe7ad394d233fa64ef4c9f486ffe4397fbaf11e1d86082712aaea9dbf475ea74f0683f1355adc07067301914d187aa39f5c316af2aeb1f2026fc160768868a2d51e5e84cc902ba4520b4432d1e70d176bf39fb6c832180c06e3e23d822c9633c62082895d496fa9eb6d9a869507017289cda3b9107264cd31aae51997cdfc08d28858a2bff3f918edad94af32229540e89d557aaed5ac4fcd603c80860825124a3e4d1a3a378973d66adc547983d295f5404412b766d624b26ea4b83b83c194211289958e986aa7f146e928f385082476b9af5bc479c99bb4190c0683d121f208a4507b3272f5e79518b20311475c23ce4cf54bb11d951f24c060160d441a7108b3f174dfbcb7146676780f5e13883042b9b62b62a4dd6bd10659045b7f837f09259e33b47820a208338414f3e24d6b948d104412f14df3ec2a21b5ec917147c80f4410a1e8a0f3d66cf6a3e9190ce6c5d778f10fb8bcc821d6e3369ae64bad72bb0c06f3b2e26365c7193ac0d0c123c565fd08c2f2450c56c4c06058c547c7400d1143743bfb4ae82c153a6e3e10298442adcb59cfb1334408b11a859e5577b7add4cf60306fb4bcf8606911e38d161e981022880c22d3b6367242baf674333bfc074b0f303018ffc1d2a353ca10110473a23d7cb9fcd39e94c16058fe0719fe010cc6058c354402718f1a55b6369b5fca0d1048171e6cc58bd10e3783c1b4c81fd6f5767312e7a3b48b85a56545fcb0a9d363d3be8e77a994c1605e82f850790972468af4c176d99e949c8d6e8b3218cc11e143aafb45c9bdcd3aae760f4db3feb0b24a43a51ce9e1de1b6ece427ec7d5b6478f558985481ef2b5419e58ed1b458432184c0d6ae06325e3d2451b3398c118227840caf2efa45b76da22774827256b759d3cbdd2ceeca8410d663003963454d65a0c66c7cbcab6f07880cb3e2024152276686b16a55acdcd498de23ae85983321de426919ddb10a183cde1a02122078bc3d980081cbc10794372ff6d43d6d81c2ee5067e5d8aa8bc15d25d6b434a431136f0e146df76ef6dc840640dcdbda373f487e79c3b35a865df2ceaf3fca4bc4274209206c37f4e0a9f8d512b4ce9d163c1b081081a50636867b0c6d0479f80878819947f359778dffcc93544cae069dccbacd1a22a43328440640c97daea9c337b39958b611ddb832e51ffcdd50243240caed65909bbad5771620683d941021130586a56a68514a53d47f10b7dac392ba11b0f1d68ac7c5103112f24bae6247b6a505aec21d0a102c4256408225df8a48d9bdd4b17217d2ee02ffdf4dbb9921d1d28886ce114776ad037eb9c4f4c225ae07b6cfa14fd74a9dc824816903d364af5562dae5f18202e2d225830546648dd41547cc63b16193a528e207205c4d58bbe9a4f779245ac60fdb74afb8e5b359f502052853665b6fa1bd46c239f17112ab8a96fd61ad5a89a4c61203285dff56fc83b51a6e63452305f56b7ef4fa9e956148eba3ca4ff0af320722824afafeb36669f5ea5e940e409cd377a8a8e2246ecf947c409e9a0e69ba3ae59acb65513541d6aec71d751cbd08c09cea8d413b94acdad732b224be83bff79a7493e772ad90f4494a0a9109e4447975e322c824812fc4caf9f71b19bd32b04294f1041c2354d6fea325b3a2b0b6182c81136a975f26794389322112360e266a6c6bd6e545304b5e9d7655ae99a7d4a8408af8996f1523d3a52bc70f196b5d60b224358877db129b5e8b49a1211429baaf3715a7610e2765101e2122205912098b6e34167e53a77b8d191d22b2153100102bef242cbdde9b8a5b788fc2061ef41ba4aeda46f9a0c06e3c6b6ec7079c3cb5001e2f28697a102111ff02a4776eba3b84e6e0f1a363bea7750428a5f85e0011ae001f3a1f25cd7fb9d5059c04305296388ec40ddd6fadf6ff5abb2880e0e3195a3ca6fd0dab53fbc870a182239f8758f929b79ae54f82238d866d162ab537e97cab738ff6667a174bafe686dd15c93b27fad8695f9692df6d1517c84d692178f16a86b28259a3d7b269a05a33f536a9b74b61351167d6c9ba67953999df4b168766df6e2cdbf73cecd60b1486f2d4ca7e16b4eafc8738899a9417f34a1bbe25b3335afcd72c34df3adb084da0536ca0e527d789bfe5c1084b0624faa55081bcecd26ad6299a1373acf6eebfbaae86d67575d691d5556a9c874c598129d648d7aa362a9d42c4e7f14fa6d7a9d82ff98bdf1bf3dd4343205233fe7ac8d2e4d5d5d8a93d7f041adecd7ba94a4c04ff676aafffbd2f628bcc165aed8a4e4ed8d8bc2929d4d08bd1f9516ea503caf95bab93c55bb270345a30661aa9eaba2a74fa0f7c3e630a7454b6fcff104f2e9b6e44a972fea84e625a6b3bca8d5b40f27ce08d94472446cd6aa0f33226be2aeb1ece65cbd2ddb9f1c846422a5bef5dfdd9e543a2aa346082650a5b31417b5399b4b2f8109b50bc764e59eaf7e7c4e1a219640e738ea43c89d371f4384105209d6a416adb5b694193594409c18a12617369e5a7512ea0eaac7c611527fd620934483941e42c854938aed984522136a1729256ef63bd7ebd12b323018b4821048a0da4388bfc9f576be1f81aea7cc571ae6ff1d47587693b6c106cf2ae6d508752ad5fa11deba4f8a11dc8d1fcbdeb5ac377911893d1da47db7dda8d3c84314e1ef9caec88b91ee3989b0668f1b425d988d0e21e28ee52ad4bc255fa59a439ca4ebf89c2b9ed4e4ab19a2f5206cb456cb3e4fb34218f2d347ab7a3137216ed3aaaeb4abb0396e83f0b3c3de6b8d54a1a5205242ed02ad758eb9d9e39dba2310a9fc8f37ae75e9bc1a40e4f9f33677852ebfd31f8e373bb24366bd884e0683d981c19c20c40f4d3a5fb3a94ea3ffa7190c66f9721941481fd437bc6bc6a6b7ac3d840f9dcd5179a8f7cda7ee1e4cf19ab5c6f74fab523d9cb49929fb0c7de6a21b84e4019b060f798aac8b06d1172bfe6b50265e8647c81dd02d852a21653baf8edb21112d4a4dead6d4ec356c84d461f5feafdd9ae60d55b9f020840e298f52eca9470feee11e84cc61214b7ed23728f110253928a276a16bd19e26edb0a1d5740683d9b1c30215f822240ebd67479b57968bdc28c5479fe043e0b056fdc9d35b64767e4383a85db471f6a76ed27af3d3645280b0b42c0ca6e5458c10373c5ac7bf59abd809516530981d3d7a2c182c216dc8c5bf9ba9b9568ab1bd0d1536ac5c2b29ee740e796dafe13b4f53b9256f375695d018188c4b0a18216a3047d4c4bd9a94d6ac55f9e1188c07f12023c0605a109206d5285a67fd6a5a51b31d821034acf54cc892da59c26366849c81d3fb7939f94fe5a31033ace5c8d541c978fe1862302f2c3d5cca80bedef7af7dbd9c2783c190114206b5eeb766bb59a7fe780683c160ac0d0c468c903120ce3fd3c5681d37dac4c0c768713758ccb81031a4a6bf6994eb9f371f0693c22161484739953536c9ef9acf60301997204030180e8480413df93c5a96fa8ee72108f902aed51c26366b33d615418817fc1693e5ea6eac530fb22029ef6974a17535f24a5fc6e8e9a00a0283102ea8ae756fa839bbae49dcc25153ef73129edac513a2857416f1c9c615f73179162cfba0996aba9f6d150bbdfa31d59f46132b06d3127285d4a4d45cf6a7691bb44060668573be1a75eba8d07d1983b19021845421f15e2eafeb377b50beb4ac0868104205e7e6afd9c6ecd076daf7345842a6b0567642b446356a93f304296284480195d79e193a2ec5da2c32de582c5f6030a70d0cc647c740062151b86b7ee959a9ff9a2da1f0eaac85a77dedecb928e409688c969cd661832e1d0d8438012d5d0d727fb4cb8d9602829026f4f23c74f3a56e576b0613c284c646cf8ea9637b56aeaff1c37bf4d84c7f11b2845f5d84a72da9544c27b38110252437abce2f3bf978fe64305e8424e1755763767f96b78932180c10160ca641a606068384c4d8cb6ae54a7ef593c160dcf01f3c30981f2ae408d6e7a8b4543acf603016628426d12deb268d9b44ca33184cc625488f572145d8c6c6f052f3dc4959653084087a898d37bd39ca4d733218ccf21ebc6bb098b1c61a2c660061090106b3064b8f94266408a8071d37b36b6dc36c81818b10d0d4694ccf9a99f541190c46e5c78a4a8f203e3a101204c42a7da9d4a6cfcfa80d1597c1ca0f0c86577a78110284e64e6a197237bcb65706833947d963300f08f901bae5f9be4bf9e5f985f880d3224d4a1d476ed442991d3bc8d0c123a5c55fc8f0c1d222463b10355654da81b874480ffea4e48bf49a46a90f6330292c08e141d3786efbb1836b9ed60eecf876bff2b6a99fd5415257f3d4b3d2a172cfc1a9536365d5e7acf5260407767e52c2e3fbf74d933750fd344b6aec0721b45a3ce3b263a860302a33b0014abe7853a12f6d6c510d12a73b85eea8751821ca60304d90141e34606ccef970d136cdbeeef00006d3be786030293d6670106e36b98c3add392783c1fcf01e2a2c3f54543098c6a8a8782103ebb65f2b5526958c10cb8f6d3530981632dec047ba898fdb4947eb0c06d3c2d2c6f6781595951e3d1c8379f9b1c222823430189697176f797159698941d3d849bbcd3afd783e7db0b43c06b302371ab416eadf95502f3696c16056545e5a60e0628336b839ee0dfaf12e34df0c06c3067283050806638220d9aee7d6206cce4acd65309818b0b00a1bbd3d38022fc84ef92465672f59fa0c0603035779690c66070c3ce03e5678bcfc580cc67bbc7010971025b8a09527a1e2a68576dd32188c8bbfbcc12a2c2f188c250fac1ebe22060683c1ac1f180c1bde6397b7d112a453d0d249d921da6f50131bed80c1c16d14236d44c4735b69d91f2b5f7c00c81af2b3968be90dfdb23ca355c58a4cb35393190c86e5e5c78a0aaa202aeed2b240ec47f3d7e83ed7591bb36a9081c047a7b56e58d7aaab5acf60306fb4bcfc700ce6c5b34736bc7c77a9f8289e860d33cb94d23675cfd67ac1ebf271c75ea8cec1cdaca0fd469df5e92cadb536d345a63557554a869c9a4bbb866a96a154a708219ee56a607edf1c0f3932de52076497176b45a086a7b41a55f38a2d9de65d028aff7f717da9a1a319610577ba1f75c64d26abf2e075860e1e3ac42843c718295f84f1460b0b2f95143446568150db23d6dbb5a5775a5a3c80c6094654d1a885ea8edbbe19b26754322f2b6ef4482af2bce953eafe2cbba6cc082a50a9c54fbc7d3e9baf25e58b9153e8e5fbabdeae3b3c35628a54279de5b7e4861535a5f873dab741b950aff5440ab33ccdde977df63c8a95b0d11d5df23fd436228a462fb71f971d1f76fce134180905da35af70d79dbdfa8122adfb4996f48ee294d0277ed52b3ff6bbc718db13bcbf69ab0e779362f4c6482710e2a15f83fea044864638b19967b5aba48acd8a9b406851635287a6f61b69629b11ba6aee2c3ae49f61795151011284a5658d914c5cffadd5999e5b69124630717a10fba2d46e52fa5f621dbf55ecbf14d551c8a2a202240812462c917a6952aeb2cfc9e6e048251c25e6ffb3bcbe3955168c50226dd3a8656aef8fe53b8f9149bcbaca45e951a52617079184370aa5ffa3dbe6981689d4be689562737bf0161268a1c69ad5acc54d3af48ff8d47612379e689de30875daffbb399dad6eb211ea5c79bab7e33e07152330e9222ea9224ed244246bf479d9a7ce6f36a5780fde2b8c20228fe635ac2cf59d4ec802270d1d67043a8e08741c34749c10e83867e838665440a5c57ffc58c1600eb1d0735aa9f8b7087d6388b3fcb365c58e5673bc2d2f31f0800e1d3d7a2c183a524880c1845061a410b63a751fdc5b7395dcc5657b80d1e2221821c4621fde4635998b15460681d42f0fa9a67d2946aa0a238238afc769ab8b54ab837e046101030b238168b04f4a3547ebe82c4b6104108e885be939b812db35237f50a5f674f1f7a2d2e3288cf8e11a4fb1a2eb3bf3a6102a8cf441255b52e78c113e18defd7fe3ca50b38ac218d903424c89b9d14767f7f48b113d24dba3bbe8ddfc35abd1c0481e12a5d49f398287c65488d096526d9815182377c0a30ecfebd15c857d190cc6575a5ed418b1c351ba09fd5cd79aff5387d3ec2247b7f9ab6965be061dd26a1ad4f80965b032829139f8f93c45dc28e45f9b1991433a6a5da8c43c0771a3affb313346e2907bd43a3ed34c8ed6c001a954bbfdb6d42cbe5363e40dde3477749b6ffa3cae45e506573e476d27d256eab80d46da902a9bfd6fdd53dc4b36f83a9c326d52449892af61358de2c67075b37a7a47d4a0546193faa8d57873d68da401ddd28578714ac7de34236838d958179f7e7d1a9496b95c2df381913374ea448d5a9dedcb2da52461c40ccd2b9554535afb0deacc60309917962f5c3c3052860651ed346d7cb231954cefcbcb8a91460930986f69a30323645027d9b13c54484f95655c9665640c6b0a0df91a369ade550ccbccba49cdc2d5dcf186c14e5f275a35437d080647ead3e3fee917fa55a387abd249d9647ae1b0b1912e206c6c840b071b1bd942b2e526520957ca3cd4c2a2bec6ec501b953c595e7e907182912ca09e52ab8daa9ab52f2c9cde44fb5d4ba1c3de912b7c2ebff23e27d67d348c58c114a6b4ba9ed23627be61a40aa89b54abd9dcbcbb6b17951ea142f35a5fc64d7cd88ecaa460640affea9ac4bcb0d9949c190cc665440acddaa634dd8389a7393c5246301285c3547ef8314f5aac0e142cd1f1b94e15203e48b0030c1d2d2c3efa04296cfc5851c3479f4009234f3847ed2c63a30c912ae484e3b4d439eaf37f6ce732d284458d369829d937e9b24cc665c7c011267436768d9f6468d3e2238c2c810fbd4aaf5c9bd534cb94c07a6b2897e5598dbb26a1553adbd689d413a1cf6030234850bafe15526b73e408acd48e9da3f0d8695a303062046f75dbdce0bbb2db0189912234dafec94ed3a466652e22b8df7255dababdcad110d4734f7f3aeb33de0244a5050c2342386bc809533eca5df591202c273a42cdf2a6da4633188ccb0810f22ca9a95f8a523acc66e4078df39b6ba7d4e6b4cac0880f1855713a96df9c5c793d40dcd9c6cd594a2ddef340f559222e3f9707f5d981e2a7b4504feb0a4674a04cfd26324e09938f477280fe9c739ab5d6b3fa8f114670e0dd97d44978f26e776f8156ee4167dfa0efc4c816c8acd6111da3a96dcc510b4ba6d87cfeda4196978316ab39b66fec175737da3966b1b9ec0be942a86dad238be38bb8ce21fb5fde96c2841cb14054be4fea6c255de860c1675dcad4acd5a8a436bd02a54b09933ae87151bba255c3c97e7dd05a5ed221472b909e94d64a78142bee1a53e99d39fb24d35534eaa6597a9e5a15a713427ddc9c94eb20a6026df3510aed0dd56ba3a24d33b167da3f74ece438454a438ad47b572275ea0325d051c64b0e5320d5348c87ec2c77fd2d459318a9567f18ed29854871d625bc7c63f4a37b46b14ea94266755a14ca5439d53e1e621e0c85efe69fa65763f7e381a2c98572a54ee73d65f627302177d3e841edeb0b790255e3ab506ef6ab4aee84af9ec6945bf739544ef07a7d6c47d887eea44d34af4bbf2d15f21d574d34f7254eebec33a1ca2dafe9b5bd58218589a5fa16bac25bebeffc2536f5da93f6a8bbcca6b104bf26c3e628d489729b4adc23c2e5ff9488931d4a2c75a895427586acaa9350fa8b0c9de6cce6734842ef9c55a76fad31753922813c29c4bb66d5b11b4162d91ad1dd2d7c5dbd47a4464f4f13f1bb69583962333132fa6b12efaca611b9dfb850312d463428d769e4ba87f8dfe45884de9b7fd370729314a62274d5aea6c9c463688f12817cd3d66a50f39bd296afb4f070230722d05d4a9bfe57225baa1c8750bd10df9fbdb4982b18cc8e1c8640c96ca8ebf459ee548558d81c8567a5236bf88d109a78aa51deff681536190c0683d9f1c6afb47809ce4821418e41b4aa379570d1f669f23218cc5ae3c78a4b901be410c4fa33df2952b5734865325dc81108d447c4c99b5a870e1d81c801883c7f12351dd5ac3e373cc8f187574bd591b11f36a3fba139f7a711f3a935cddd87e489eea06655f97a8e0fc9cdd6ff34f748a14539f6a07e0d1f9fa7ad64abf4b07e57a3e5feeee9d77a46458d1c79d0bdfeb55411425507e5c0c3cad59c073d1df24ccd1d3acf5aebd36ce242a7ec90e9512f2e6fa5471dd5e1ac9f15cab4a90d2ba6c32b5284b6da7fef1466301837fc478e3930f26974358d75b2cd9703baa58a4eaa83ab11638e38fc31e36ef65091ff6a32180c0771516179f9b1b2c84831410e383477fecf7a9556abc49ee30da9599aec4ae927650873b8c1303b35cd32e5e99cc50c0643831c6d408ca9aa39a6562963de71c60c72b0e1591de6a3b6cbd3e5af011942ac677aacdee0abc1d29c9b44be97d29d4f43f2dd6509d9e936c8140dcd2b52ec6e4da308213f43aae4468d662bfc54cb871c66406caaeb0e6ad64abb56192ed3f2a5debae7c58b0cb88a7cdb9c5ce5ea63f0cf366c5f44999e9618d40c8f364793765aabc3f0ac0929df51876e6182614ffbfc5a3eb83a717fc19afbe619133ebfa9832e080633821c5ec873d89dfebc7a54da5d38ac9eb7b1e5a8f934a70539b8d0a4f48ff8087d5a4fde02ae5c5c7910112a3fd682b12d57a8dc9d0faacd42e25ee860ba1f5bfd8b053def6979838c69aa728c1c5748c7ffa09414da5db8d60a961af597fbff8e72b50acdc2d567214d4a850651a3a7c167f4fb9d82fba3f2c659a1b38f8d14cecfbea975ebf49ccc1185734c7eaef25ed536a1b0764fde5a4fa48aff844489b9e89c5dcd4aca09baa78ffab36d2759da26eca966532f5ba8b13e2634eb92a95da5caf29bcbb10447bc2a75d15b7521a504943afdc1f529098c77ae7c1052c71c48b0d4e3a7d49aa5d235e908a9a994377612babb2523a4d5936ed3f159554b45508d6e42c92ab9a96e2442734d3a741afb4e478943685cb39bb3f08590b638bd2b536449ed05e1a4c36f84a7d6273f02427226533cb59737be0823a5c55f5efc0335c8f1836b1e8f3a6b4eb735fa3e58e87b9b47680dd2de2683c1788fb592e23d16193fd0c0605cd86061c900c9d1035769bb7f0aa5ae3d27070f5a977aa2f7bcd4a38e8df60c0b72ec001f1d277f65c675d6e6d04193dc60da460f6f5abf39728010b6f25be655d7a672e0a0315d49ff933d1d3608c72d50ada6ebd39c45f6a7b1c5dd69ce2efbc5efc93d8d30c64831028e5a34fb6e8e72e9514d4a4e0b36a58edaa3faac86f570cc629d6dd0319f6fd3ab611cb2486f5437723f996b93e288454ae8d579f36c5aabf40938606188f8e96883b9d6a206c72b3ab72f53211a22ef83c3152a593aedc913e9e2621cadb86ff2104a9634cf91e36045eaeaf5e54ecdaadf0c8263158a8c87d2edd314362b834315a8d6bdb9835066f7323770a4c24ef37b69a54569fda10b0e54e8deb9736c35e9761b15028e53b4bf353a57ad50dd260e53bced1aa6ca548490a5161ca5b8462ba9c4bc7dd59d7090c24e6ad4f522c2b48dca171ca3c88312a9e337644b2d5e020e51a8d4cd2dba47dcec624717031ca14075796a134adcbca903040728d672cfd49af4e8de25101c9f68bcd5f76996a23ec7dc9905383c716c4ffbf43498b9bae984fe39ee6a34d74671c3892631d15a44d8ba16eb26f0fab851da78d6e96d4d2077ee8594cacb8452e8913ba695ce5a4b2e40585c82849142021c98b0f3cdb3ca6f9437eb5b45e58d969720e0b8c46aee2c5e4d7aeb99ab25b49117372759aea6495f09cdc5c5d6a75053b32ab303084b4b18180c10969645860b8b087cacac818312ce9ad09fd3cd51cbb30c0673071c93603c6b721b5ba8d71042c8def032745888147048421d4b6e94fedcfe3812967cf1f759a44c77cfe180847df3eb4951fa5f97f888b579f0e8ff72eb6cdc117e943adc9daec974943562d14aa9d51e9511cb9ff4db999b6e9a3b8b5078a8319d745bab31a48875de341b53daf9859a88d368697a27212276a9df4d89ba32180c0a701c42259f76afcfb3c5a833184ce33084add5a83ebb9edbb8be00472150a38ea959441f860a101c8450efcd37ab95f7b7ca06717a7ecf4aeb3711f21404f7a7440979a2739e5020d6314f974835b74edd00618730cfaf469d4674f00ffd9f382de44ba9f7347e30cc95ccfca05d7fbe3e3832851ab5ea8a1a95890f09d56275fe6ccabba5f6606b483dfb6a5ea45ce96151352f3d9789d2f3c943e24637b46dcdca638687c47e768dfb9042be77f04767794a8c793c6d63877c565d564e5a876629cea669344efb49e970ecf867e71de2a7f11cfe4cb12a9a9d7de795035a4d52c711728f8326ce739e55daeba50f875ecd697835a97144ccf88666a1f427b931f2260f724333dabfa476e532c66b031efb5f791831ae261b36acf5e915fe42a8759b5e4337cdefe94aed90a2a40656f43dd45eead1e74a031e6a6aa5d262b25e34f05189ac8d8d4a6dbc398331e3eafa3e547dd6cd90dd28ab5208a5d93a57068467bee9fc32526d900cddcdae86dbd3fa6fecc7609948b159a32685c76240a79cf85ef5b9e2cb309c869973293fcc850806c5e9f8f6d355f2ecfb829dc286ed16269e3aca0b9fd2ae3faab8762fad2ee4a1fa75943975d33499c16030981d51c0c1854ee6bbcc7f7b021c5be8d474baadc6c3bbbab560bad691a5830e224d270bebcc33d5b1359ba41216d2518defa9e6da517580e30ae9a45c579434f9a55ae1a4d3576fc7df882f55811b191e553daa510d3715de6c0dad5a09692f745358ec8b67d9a637fe27297cf72fced5e0399acba2701af9ed72f5cecb4b281cab95f890a9d6458d7a825b838d5ae6a8dcdde00e1f389cd004e956afa39466b3b29183fa637d3e651c9c57c37bcdfd1ee409c1013507bd9e65d4342ba9673098161615304cde909ca892ea6a4c686a99b82139ff37a51a5a5afec6cbca1b2f2b6230690326747faad9cb5bf406c4840da7747b7b0fb563e2af815971f7369d48d9eeaa81b951676bb555e45e2b304983aa741e1d5d749ba7151ad2563a6a39a1449db82d5081179333bce2396a0695aa412a9979fa615286f5b809adcb93dfa7d7840cab8feab0f2c2ee6f7c603286dca587af9c1315194dc4706ae96473cad2a96467128693f06073ac4b9337bc6e0286bfe63486b8f946a9c235f9023edab2ebc5bc4cbcb0ba7ff98edc9b546ebe584200c425c54dbab0923313ddfa7241a9eeb756869fcc6f653018951fafe2c365dd50f10d986ce11971ae6cc6473c3d265a587f9cd32936c4dfa9c9423a7fd217eb4977ec0f160c25a4d2ba843e1df6bf8227a6ffa63f946262054349a9392f4d68cf4a2dfef2b24054d8586f6134a942324b6d9ab45797d64d06c87aa60b132af85a2a37cab851a9dd26536812ea9fa37f1a36cd97026a7e9d53558f4273a3a9a60f4a4ad7d3040a7b8faf1a5cc9bd97f21358b95f36bdcef206959938419d6ddaa55b654dc326dce9ccee4e9dba3975264c48e5b6d368f3b4db3540305942d37fd61873a1da7597c160d8581f184c8f959720264a486ab19b72648edadf4c9290f8fcab7675675d1d334182e3b5dac4d4c77777d4607284dbe4af507abbc5a749633031c2bb72750daabe47dd4a052645382be972b39f075dab9a10c1ff4ca9daa5aed237eac71bacf2460f2062980c41a93173275f6755366e228443d8a0f6e95ad347cbfd55fc2508101f2641d8d37db736cd3279523bccd0b1c68f153274f0d0a1c62b4c80909a83da16a3d33442b7263ff84ecda9560dfac93565e2833fa876a6b841c9b69b1c98f46095d1ca5edd458d233405131e7ca384ccdb71f5357a060d931d9cb152877579712f2d314c7480e74ff72b5f3bdc462639e863d6bdee5fada1933660820345e84a6ed12074c71609a113a3a4168ff2d7f6dad95a4c8e68614da692599c26138f12593036427dd6b9947fd0298985b69ea57f54ddb3416a85125820334bc6cb3654ff57f28a37859437e26ab2f12c6346892b0e725c8df252e9fc320546492b0c95e9af35e84d427e5e94b022d1f5af560dd24bd99ef9f51e18cc8e1dfbb261fcba193e285985af8659f9b6379ffb57a28aec66a5ef55b8887e592a505e774a689dc646ac50d1fc7e4a3779b30e352a839253985f2f6bdefc5062640ae4d8694d2af5968c9d04292c2f3fc8d8404929d0567626959c0da27c52f0b162625ad864f3e96050320a44fb94ae51e7d23d738928acf5689eb4a7289136a1e8fd749aa59acbfda45d020a6d6d45f6eda61f9f3f717ee533b76eb30c750329f1c4a1b5ebbbdde794ba77c2cf1027bea6b15f4be78429d47eca4c1d6b727513e8ac671dbbb2061b5513e76ebaf8709d4ee83113ec871d751991d22ca30413d66bd98acfa7751617193a4a2ea13ae9e3256bd57a9e5dd8f8112403064b892514f23d299df12e36962c21780972468bbf9091e2a3a412cde8a839a4b0bf59c794d0f5dacb4d3b4ad73e09defd95996e5dfbdf24e18d165a7d49b7bd9575a02412bb0b6f391e65c736ad05ba0412cbd5276a479a544a1eb1d94735e7c8b9cf8c5f5c585050e2884baa7b59ab45a6d83e83c1b8a0a411c957ad51f264d44c88117b16dafba673255b27cd285984bddb5f36e70bd3d9dcc123650e258ac80671a37ed4dee0722c4984e75aa597ec344a4bf9f01eaec387f7f0408a9ba004114753638bd2d5b635ed64a4bcfc089251838d9243a4a3fcb476a3789af55743c7193a78a4a471c619184c8b8f0f9418e2b8fa1fbee3cde6778920e40c258550e8a0e64faa449512427caea44e257a5467bf4b50320863be6b1ae5692cb9372582404a69a68590a5dac47646492076f15aa5cc54aef4ca3d1032851240a46f5ede76ab0d7d7220257f60d4a85d5a8699eecefe28f183f149cdae7aa2f477ae867f4045a58d923efc79ffba56c9ac69fa4bf8b050364a8db9cd4a9c5ab287feb3d4a3e67b8c123de41e856cf54187ee98e701191ee4e6d35966a357f1971d3cd6f85146091e16b711529c5eedd0afe40ecbffb4ed427dad1a376387e3f7cca9d0796a163f2346491d54a9067d21df6de5bb123a646a7e6d9b476cbd58b1f02899437b2bf6a3b55cedc832184c094ae4904df2598aac0eb5dbc641173d1b77ff6652b58c8aa7a0040ea969d0bf4a8447b9214da3e40d8a6fdd36f90a35e77a4550e286c6b5ab137dd366231294b4010d5f17ffd2e2b5aad8c09a72fd8d1b457516d7a010a1e6166f9bb7f4480d77761ffdd13d6b953ac58d9234e451df286ceb8586839b2a9bc34d456b3d43da7ba58f9bf296f2348329743c658abb553afe454919144a9bb7f2d6a66358428686cf6adc30b1ca647a256358c58fc915b2d565cc532286e6d529af7fdbe4d9584918ce995abf56dac4df6c5e500286f7beeecb265dc665c76841635f360c0e947ce118a1c57e305fb1d9f58235f2a9a5b64ee2b434b343c71829184c8b0f1f5dd20533eb5c6e4db29ea4120f099470c1be69648d614297da10185ab205c5f5864d1f8f42dde00e33527ca5858719295f84e12b2d3c30185f69794939a3440b0d27754da242f968edb3a050732b11111ec295180bb7d72c4ba4a6897e855f5b6a8aaf1b6b4c1b2b204eaeebd2d93a6d38554aaae081122afc51f56859a7b50e362983c1b83425534867856afdb37fa3449612299c94109d758c14ab4598c1605cde7036a2f0493b1bbfc58b1153aaa0040a0bf5d9325dd50f6a2e7902b25b473b533aeaf5d205254e78ff7597b6939e744c99344a9ae09e6a35f90d9151c204b37452a265e7a34dc225a493b8945266ab69fd55a20457b9d88e15d26621559284756bb127aadda47eed6cb4b88f2b4182a1726e38dd717cf6f5819223703708a1d3dc6ed25577506284e38d9fccd6ceb6b4568456eec4787c9ba60d89d0aebae1648d105ae9ec101657737663ea0efbae44088676d7e25c0bd752afd028094273ee6a2d5eed266da5961220a043aa33a5f4ea1a842328f9c1a36d545e5a5e7773eac6a681c190a0c4077e90793abc774a7ab0b677d079abcf5fc74b78a08e5477f51e8446c90e12dd513e8bbf9a734d96e8e018e952cdd6a4b6bd59490e902d9b6c122b5df9f846090efc3431e63a5295ceb50724b738ed35beb3bf293d225b1c94cc7a9dc524b5b094562ff67596359f8b0624b4703e98bb7257d33a4b31d228414a866416abd136dbe7f4a5f553190ca6450444209185671b325a5b8494ea0e311ef012c48717292f2089852d85ec503ec2a4d231092c56b2b5439a7e9b940a5fb11af1348774917242e90a6e50f1922af4f498d68a26dd6273aaf94671d9b1e2146d3b5bb566e3d9559cad72b26f6f761d55606f830a2d67d59ba86ff45002492a1ed5c9a54d7310de59898aec57e9e8fc36afece429ec1cf52c2eb7b3588f2974572556ab418aebef94e21b8547dd56ddf792c2d4598f0efec2e64cd928ac11e723e5b6f868f3a2f08378295f556f886aa158947d7093370928f0d5d9f44b21337d3b998c8acb60c5c507c9277413fbabbd336ad6a7183ac84801b26764483ca18bcd97d0b3f1fc4e1937fc87ca0f162f5254c243216720e9c4e12acce4ab7b979be4442ffe566efdf36a5133188c926ce2d4a7fd45f5f30a9d26e3639d3198344834d12c9eae71f3471b43cc60306fb4bcb878fff022a5c5c970024926d2567f79f3f2f5669b0c06438209dfcc36766fbe84ee414cc747f753b38e1713f862022968905842ada51c2584bb87cffd172495389cd49732e2f363a50c2f4828711657a37497f65ba399c1604290e2e22ebbd2c30b742a7b2099c4b15eab87af4985d6ea314824c1aa504acb3a4f52fe8b8437a8ae9997522bdb7fa4410289a3a8aa69e56f6886d20c9247ece24d48bda6456891673098e519972040bc207184f7f76a54abd75a4db3190c46c5a511b850dda5afe9f6cac40847775f733dddc348653098f71695971d2f2dde461b0c4816a1ce9d7d565d333b767c91e2e242c6ca1a3f82bc8a8b8f249028c25325e67f6d948f5725029d77b3de2c3f5ebbcb902042354b195f2642b4d292b77480e41049d1be6ebe66666a3784736aa24beed706bdca047151f9415288061dc33caa8bfdd34f1824844047b1da54bf985583d218248370956ea751a8917b7db2c0173abca8401824825049152e23dacedfb3109004a2cdfe38d131c3fb56409822bf3fbdfa59f9de1f144a3bfbdf745ca9453f58a7dcd524e467b1aad487eb55f88e3453f2f6587f715161a347105ee3c70a1fd471e7e3ee397aef5f021d65f81a2d7e460c48f680e89ffdd6bfcaed5b1915207af0cb6dfe34a6649489f3604debfd1e42b41a566bf1171090e001358cba501b940a1d131a2920b903a2da47a4ec339bd793c1605c5c3640628763990c25c5b4ce72742e6020a9832e7675e79ca5fa2457123a34e78ded2c5c9c48ad5e3f5c8d453287f7d49f99d4d661f794039ebd65a9fa5053cf3218cc0e1f7d82f5c3d5b040192471b0ee548855d7af49752470f06f7ad1716dccd51083e40dead1a7c6173df67ab5190c66c70e1d2f2d67e848510104891b9a0615b54a7e4919d99f41d2867348d95e9dfb46a5b476180f48d8a0fb0d325a7ed6752c7da1c38b941f2b188ccbf62059c339aad19b5b6f3e1b3f6a404cd5b5f4bffb2959a6478f202d68fcba1925d051868e357eacbc11c67b1abe584280c1f86209b904491a3c93bfa3c6df7458c05b4705525a1c0810969630a4408206636b5aa1b3a72bcf6d49ce90d6cd5336085973de2883e93f9098e1962ee6e6385a834a9b32ac4fa61815a24d83840cd88d35a90f3339262683640cdb28999db3b42a91afcc8ed582c6182462b894ec3d25b608dcc51083240c7d8ecd1621c51d1ed0c123e5a54790940f9080c104245f580af53a77c718f1f2ca60302b649078e11217352adda2b5e521e942d328b4a71fa54c976e4d40c285752a21b2fa79553ddb02428914cfc16ceb5626d102a6779af3bab64c183806b303061ee8b12b2f407c740948b280679ba58b0fdac3f9a7060916f6d22dd544b7fca637a50324574054a969569bce638a500683d991e2a34fe02efb80140c46850a245648ebc6079dcee63765629054411b4daf29a5d556d91c1590d3514be93935e7deb8cb7ea1059229ac293bdc183e2f5b4f542091c2e96b3645a71bbf733b83240ac6cbecce9bb2a5570f83040a4de36a2dae6d5c9d217e41f2844e7b27392dc44d6a7c1227649e73ad567fc3a64e40d284b4ff5f74fe2ce5e85a36080c5c30981e3d56b8c54580c160302a405c3640c204fef4a949735dc2c5244bf06345859fcbded62025a86564883d8d1336d8493899c73673add5d2a44f2041c249959c5d2984b78903244770eca5ac97e2a36e1a6530180b84a1a3022999902c9018a13bcd51e332a55e7917c154a2fec774961e6a9408debcaa932b939ddb9b219cd3fcca2fd5a1fc3e2442500b42a3071d12202454a47af5d227f9013af7d9a4a409cff21d1ff8276d9a5f9d4c64f8243de0d418aa57899a775e293302121e9c1e44b28335bc3ef88797eac64e66fd58790c66871a243a680ed3bbb1b5ead2f29a80240777bad184d23a8d4ac7ec3d0d121c1862e3e67b0ff9e14f3e720ba51435e7b8b62aa55e5730620b7556dbeaf32a9ded7ba609a263c71b5e46c665c7d0a11262718387b3b13dbe08c3482d3cf1ba49c79ba56a3d65545cd6c58b138cd042536db1af23343353190c86c7c82c54d369e5d2b4a6d463cac8a279e75b5dae3c2ff9bc45c50b5e1e6e6c1a1d188945d3e4f6e947a66fb4bcfcf0c0cb8fed2d01074660f1a71a46999f0d37d72466e415e911d761b474a14c48f97035465cd164da74da6a29b4eb6c1a23ad58ed9d3e164084813b183074d0032af080377abc64d658f98181d3c5a52e4c0223216f300602008017972069e408f13536c81a3fb68789884b8b7790c5d202e4840400b895971e1997555139e1e20e407c34e7e0c20e2fee52076f83c5870ff751c2051dde00d23edc070917733815132ee4702b2f6dacac38dccacb62f1114445e5840b386cf62be55da70d723c990659100cc687b7a8b4b1b25496cb8f959716efb102c4074b9bc1c51b6ee5a525e3d24345e5840b371cf4d89632f1cfe0a20d6a4a352a646b6f54ca8cb3b13c301817365c67234c9d879e0c530683d96106176bd03bea7dcfadcc70a1863bd6a8d9c995bcb947694087a749ab18a57bfd8486b6e6a0b2a1f5db49cd19ee1166f3d8fc49c46699a1cf5abe9a479ef65dc04519b81b6ff24e83d6e75765301815704106bf5f88d6dd2b97ddc960302a8b8b31f82eda7496725beae90c06d3061b3b4a50c64b903344c4c08518d61d55ae6f44c7273b0c49d5f13b29970283216f32cf4685d62a71f1053dbde3f5dd182b2b22830b2f286a3fab9a759ac8bb5dc874f82b6f9942ab782ca0035d900ae8b0400526d05c7041f1d46a93d226f4bd10175bf865292d22b2ab7a632df4c1d4de94ac795e791fe0220b9baa54c3be1aef463d2a830b2c28a4c8bae0e7b3d0162264a81151c0c5154c75eb61f7e429f56a2b243b56ca32256a344f57811bb4949072a5e87c3654387cc89ddc38e3f9945350b3a536f35257db4ac1d5f5f2d3234a9e07a3b0b90c2d61b34e9e46078557a570919ff7248510174fc87442c2a697ab856855537b131c95cab5eb64f35ec504657754d3245ddc34c990b5808b252042ca7f1b39f3aebdddc385123a79b3b655e935c959b948426373d6a864942cb931124e6308b1111d3a88d61ec15a35cb9b4e624bb9d408aa9dd87714e2ff2e42a674bf46f4d7d3a42242e3e8ff2065bc95f8dc10f20f219e663715a93521a45defd89abc9ad60601f55a5df68cec89f2002135b7a85a7957f235e6e2079ace7af5b6af57dd1be0c207bb1637b7b8500c2e7a6078cbd46ad68dbf7197edc1012e78b0d241cb72b3b3fb9b31b8d8c151aad6992b3d6b30a10eda7435c9bc69141739686cfebbd5d43e1a2f2e7080d61c45a7d55919fd16894fc3f8eafadcfb9c8c2dae95bae677b4deb839945a1c6cdc6fb5695cbd420b0d145af0ae36279d4f8b29fb31981e6aa0cc02ed2f5629257a4acd6964c1dea86944ea6f8d9ba2c4e258e75a7beba4ba6c96971f64c0e21b67759457da57ac554df7b9ba43e99ab4f2cfa304648821860f9775e30dc66054dc4071c5ada49ed9353553197e81d20ab494aab2523656dc72f64ff4b9b650e328ab58fadaad90794a5fa755713c71f63f9b2a6e1a03e292e2054a2af6d5761fe6596da612158d2dbb9973a3de7c17ca29924a6ac7cfbab89a5e6b8a6e92a3ab999f30504ad1f86a14a3aeb4faceb20c06d323888f44214523e3a4ec1ad783f23283c1f420c11a2b5f6030189451f41f6eb5993b0c45149da91077af7ed254a84307ba20293160f982850d81128acb06591728a040083d9f1ff449e9c283f209578da7d1536773dd7a82fb2cf35463a59c0f768202289c505901e2c5cb0ff7f1c68a0065130c40d104cadb849437c8979b3e9960000a2638292bb33dcf8dc2bc447f6a96370aa526a27a4b1000a5126ba9e766237bcd6444091f67140065122feea2b202c40b03a048c20128916896663779549bb38184ae251f5ec91d35bcfe08e476743937a2d50b018a235cde70362080d28815205ebc01011446249445440045110340490422148072089515205e38ef170540310405500ad1a01062ada8bcb80b025006e1e22b2b401a8022884000e20f2c9f00143fb8f441070a1f7cb1340350f62001143d4c00250f1440c183cb0350eee0a2d200143bb8b4b0b8b08c218203a0d4e18d4f9fd5ae8ce674682cff909b2ade6b50e6e0897630795d5650e4a0b202c40b134000250ee7715dd1aae6f7cf26ffb1c23e581a835103050ecbd75863795c00e50d2e6e30d547f7db5636f87e50dac00605a0ac416501286a48c7dea951aaa675cb333cda81a811b20394340800050d054039432375ad509a63a31503cfa098215da5f97e9a653018943228da4e2819e2bab40633180c19d66afcf91542e5560da28c61002862508c989e7cc9768dba0c0633064a180280020644d518ca1710aa460c142f18aa06a50bcde9d53b8dadadf3db285c40d8885dd9e2267dd9163a5de9412ba5cefb7416cb8ba368c1db125ba283ddc2a2e23f567aa09185cc845cbdfad78ccb8ea12858409c529f591e423b857285dcd409efce264a5ef763c5032856e0739a66b11f47e408178d942ae8b1ee324a79e8d622153376a05001fdab428bb37939d799423a3247b47c1429342b21af36945a9dbda244c13d5b93294e8d3a67a9172850e8b52cbd753aa8aec9c6174b085680f2044b6ba5ec7bdb6c56f32edb4305084bcb5a018a131ab4d8a4d44d83d2d11d667881d2845c7b76f51afe8ccafab12aed2508c18f161426f829b48878a9b4ded982c1ec5023042e405902a3b39469bd6b370a7fc718298b2504284a306dac7965c453a83e09dfa46fccf9b8e9d99f97202c6fac19344041c2493ce5f426a93f07a5972067f04039427a6cccd3ddf229463102da23778476cdf5e74129424ad4a010a1494ab9396683d05bf310ce52fd3c19eebfefa208a1d1d962836ecd1b5e8a1284556afbd572e35c374401027addf6c58e909ee509e507dadbdc9dbe7468d3ed03283ec86f9e9bcf5fab94faf2004a0f926f13f5368cf6ce593c50f68c67d6245495bc283b70ee66f1e51d758c693a322e3b0608507460b60ad3db3ac8dd51b5a0e4e0f0a3a4ec6c8dded9858283d57c6e6d7757312d9edc024fa9e1c97c4ccb3fb1c59966b34c9bc611d7f1a41628ad51b3cef2536bb2135a2864968e273ded9c6eb5d1c64a18184c838c04b3e894124d6f93b927ef892c3e1bcf26ddeb42dd64663018365858322a3dd6492cd0b9b26e557e50c275190c660727b0c8570925fbbfe59b9a7070f28af3c5bfd464decdfa8106183a5c7af4f042870e1d6aa478800727aec83bb773927d73149fd58a4395c929214394b49315678b1cd9dba9449abf8a45d834bb7c27aa4035ccdd949b8e1a43190c468565791ba94048b5d7c985dcaabcc96030ebc79a71820a6447c8f29c5e6f7f0adce693f6c7c7146bf9a8a3d0befb37cb27a550b5b34ecd61fdb74327a458cdc9a3cd726c90ed9de56414964a99284e2a150aa594028529d5b60d36ac0815f2c92794addb9fd1b9497e1a83714911c1892770a1f6a59689ac9b469d589994ad837ad9bd37ca8b9420279c409ad00f71d3bba2730683e1c1467bc6c7c9267479a76ace3f91425f07e22d18cc9d6862d3d3f7b13e379d2799388cfedff0fa296b7c333f1c08279838096183babf8d9ed5251651ae467a6eb12b26c18925ee16724be9dd4c716f0e4e2ae17f4a71efacd53e9b134a70d3bd144243e910ca733289944da76659c308d5afd4b22288c389243c9dd44d73f3e9e36e783889c422b50a3d4acdad9c4002395dd31cb6524b3578278f78c4a9ff2a9dc62efd5b70e288b64bfdad6ddf8dea37e2ace6ed9bb3bd788b9611968c0aad6baed94cf10b278b5867764811a5d746e99f28e2f76c2b1e22fbd59512a123384144d334a90b159c1c0253f247a4ce6753f396831343a86c90a90611b9596778839342b4abd3c9b1f1a649ffea8410e91c5ce4caa757af419c46a5fef1a4f2e4372783c1a871220853abc163a46cb69a3a83c19c04e2e8317fd53e6c8dba80404dd3b837c939cfabdc3f28e27df66394505f377ed8a49d285f934fcfa73e1cd4e6f2349e5d0bfbf8d02cc52717a37d3a8af19ceca157abb60611a16c45ad87db4f6ceab896fbd2d583e5240fa9543a7840a5ee903ee92ba3f7544dae5b39b14352677c3e76a94fead0a4d5f83a7fb4e95ee5133aa8fc74c686cbad593f5430981d63a49ccc2159f954637ce8d37d9ec821b1ca477f4d1b1b2771505608152fe244c49c2770d8f3b914358afa864d5f5737aca3ee205f8bf11459b6e1d4518f311e84c18071c286b48716c2ff94dd3499276b706e5652c71a7bf933d5d0ee8bbee9bff09c8527693898ffad5473bc9eb5d170d0add3597d926a56da33dcfa85d42fee93b0596706e5955467ea2c83be9a526b7c9a30139e90e1944a76320655374794d45989fbf7d889181a4daaa850ff1e6d373a42aa701206b7d52c74ec53979a27182ca156da204fdee4cc6b38f9c25ab90eae1f7776f5dd86132fe442085165a7cae1a40ba9697639baf5657f569d7041ddabc44fd99cc5d9e8c9165e976aaafd75c2954eb4a0eaaf9dcd57a675103ac9024aa913c245cb1a53a9b7708205e6c5cd428dde49a9445758ab79d6749232568db315d03a875d1da3f979ca2a687ff36e4b717feaa6174ea8f0e72c75a49469ebb19f4ce1cf25440daa995a7b748c132998fa737c6ebb1472954ea270f7790daefe6efacc4fa0606fd88c4c2dfa4285e9e4098acd4a971ed952c83e76789192b27ef84b0c3c80c1b871e204b40d2add5e6e9958d7491310d939e772d77261426626314e96e08d89fccc2e25a21325a057daaa9ccf6da79324f43b3e3aeaa8b43eb9c68a0b084e90d0b8356bd5ae748a7bc6c911d03adc5c5237336f58706284568daf6c3239cf39233829c2ada7955a11e60911cecfa7e652a7f5ea28753204c58cd6283a79f09ab32742e0fb3594acb1c5e4b44178e598aeba51f25fde00217123ca5c6cccc84afd40a95a1fd5492d53339ef8c073939e29a2a1bec3cc8e149cf460a1f2c63b8ad51cf98e1d2e273cd86d8c1b9935dd9bd9b8b169e4c90ecec2de659cfcd176e5890e547b2d55ec344f6ba5931cace487d7f4b46642c6131c1cde06e129c5dab650dfa2f14c781a1fd11cd56cc17e998a731bed85de40802c104c6a710e13b9978f623d6bd1e2dc7293d0af94fa8969167f1ade440dfa41e74fcd78e838c6a3022969220b654d7b9619eae6182d16d78f4e4274b84181092c1a657b9ac4748e9f746f029357a83a1f76b49c539b3a223071c5b9b48da9b4ddb402b3f9ef504a4d4c9e26ac402b1752a7e13efdf7375905aa47d7f05a4d5ecf0486892a14354b6537f67db2930a46db4b9dd54a89addf0415dc1cb4a652f37f69a926a7d84c8b0835d66c838e1d536c9358dd5aeba0ef6fbc14dea8695ea5b6d286cf9122b7535ad5c817a1e32f2ba80c1d5686f7e06df117329a60320af596fe8e4ea7892896423ce88710f3695c4d42d17fa9fd64daa50a990c4c4091e87a4edf6f73dc2d3ff18b74df558307addb79a2e14368edddf4abdb7e61d209b58e2dd5c9d7a855869cc0443b2995fd50b6a9c92654de6f93e99bb395de269ac0954aeff0f095a156934c2c6fb0d97e3b0d277a038319c304134b19595ae8ac229aaa4b6c6f1e6bd64feea5b7258e52e8d35a7ef97e7c95486ba1c36625e4b6c7cd8412afeb86bcd93c0d52ee2693b84e47e9691a76ecd39949692f01069312868924f25d39ae5fcabe951d9348ace6ac4a89dd4c20c188f25a79ef35f95d652d4b0f0c66c7eae12b62bcac7c71d8c58c5ee9a1c6cbca176b983ca251f972ec474d8ee9ed6db88923921eec8259cfd61fe43f7b1acf983402f5a009234e0f9a2cc2f46017268ad0e660175f9824a2690e9a20e2d7419fb7790e1feaa54c0e918fde34ba90b1219cbf9b537b6f7a0f9a49210c2573a4985f3d233d619810625d7ffb0f191ac4df1f94d65284a8c858100a592736bc3c0b5420e5980462f91937a17f73f81c35010472e34bbd7b835071b607fea00a1d45576c894de332f183ada3702f6dbba9c46cd28793d4ea497c765bffa8091fd6f2206775f4695935267bb8b469b5751136eb9f321d30d1432ab44bd1de2b3a968d491e90eaa3cdad56e574df0c06c3a2628287d53468d9faaabc43ba5deb7ef4ea55a76407745e6d3c1d47bfcd591dccd815ae4f9a54736ce9c077fc54bbf164c8bc4ce6803a90eca824b18301511c1087028140180000839b6f25250083110830484c1c0dc7a342a96ca3751480014a422e60462e26241e128b8522d1381c0c87c2815028140c85c24092823810632ad2530385fff111b60f5a8ad18e3034f9566e624256110ef93ff646edbb056ad4213a744df6d43094a76f261af467540bb4a48bbd26a2c407570e95be7bbe5596266b6fa50d029dfbf66c67652fa7000186077c9275a12fdeea3267b2d2a291052f5a0e3fd9c03c640443c3081c53142c4ac1aacae8a941cf8be24076d1c315c9623c1fda2c2b2ce0d5819c6952366d6c3b6290d9d76bf9f1b05aa987151319195b8a681b1a4c179e851436a88ffd868f271514b2c98384a102b789d864de85d9d60cb58788f7d85b5fe577e2fb5d87fb6ac978c0693c7c02d9898f215e0c2ab016b827eedd4ab18c65c3c466b11d70345c2076d6bda028647d32fb165573a33f68c3570ec87d33a9fcaba08e7491cbdfa50db2fda901ff3109835d0e2021ff3b6d276aad2e8faf1aa27a13a6b8b4da9f4c393450842bf366a589698e30c88b7f79c0c4fff31ffe39ab60eaee63c6c1ab4131aeca8cce9d491202fe21f6fea029d7c10fdfbae4488f3aef8f14b79ff357ed22fd5d8c6f76c84ba2f1e82ddad66f5f17c92f36ed7a0f1bac8ae225e5c024fc3904218b7c3f97637656ea2add823ed3e07da3db0cc5d1ef0333661e93c8c39438bbf27d25139c1da8297e77e70a87dd872674b78b84c4f2d37f849dcb70fc883a24eeb03a404e99408648392832bb362c2e17882a557f7a664cda588016adf58cc64cea3d220b470e2edbb6998e1fcfba2b1b652e39847adcbcf855690667aecb76031adc595cb38bc62e8867c0409c9cbf25e849446410ac79ed6ba844a1bcea2889a42ab4cad2341a284166236920ba52cd54533535342d6faf6f4e3739ea06e0a614c37d187eafd62396a7bffbe1acdf16c614da742ab745d0bb30465f765304fd476336dca0513114e01a101584e4003ac924718c628348a4e7f75f08baec124b12022fd5702015ee58ff7048733ee90c673ab033855e6e52c0c6b2860438e7e1ac0e9395e574bf0c8b2886630150e359f0a56ee58e06f879e19b38a97d3236ae6a087aa0eb14ef1f230a1ebdf797fd924954355b8ecf4811c1b4dcc2f7acf3b646211d71aac01055df42851e3bb760fcd6fdfe027ad71648a16ffa82c0e05423b4908d3ba18f07a80d182e5ffbf1c0428320515a0569176269b654f4f3e2e5ff85b6b8f12d029bc2bf40521b3f7fbf50b002806e10f5907e88814a2f41620486b0bec03ed109fc8fa0989b4d7a69677c61fc4160ccca5c64ef05e7a39691e3e9a6c3fcd145d51b5ce06146a063dc627fd6917bbafbe8993396543c5dc2d5e74d7ff9aefaf52b11aceafbbc4b4a739a8d2e3283b1c618669b8975686ee30c7fac7fefa716cc4f80830da585e29155e1af5be49b14bf2425c9594616220b66154ac88d107fd291b5d69349ba9fc9c29d781f691caf700db03b893ee021c7ad79786305c1e94a2e578d191ba1352676b89e0bd88be3f2c1c4b5848d711dbbd6b5618f9ce938622bc1288f4707be6f86812bc784b0ef01c9437a0934907018191b8a04dcb6fbeb0ed8e2015d6d2dc917d9a60236cfa0112ff75cbb9d45965a0b4081410fbce83a7d21747081284187c0be8560efdd5970a6ac1ea5d822266d55f577908572ad04e7a85d1d7df97c7ced1a66fe830e396ff4a89e2c596650a614b44ab8af151584c3a565b6b318499c09d4440cec66b4b3d086cd93606792beb7d708131ff76ed1a9ff115ef1c4960fee42c13862070a40231f6aa2bdb43ef9e21592a26e395365c1231fcffbfc88dcff29c706d6ff56ffee9204defd45aa7ad40cdae4f0a9b1fcad112825608c1f99882e347e147b63e9a2fc15809ea7c126f8b11d3300a304a8d48706ae632b63154d40a75d6d13f39d6ca11f59887bbd80a5386c8b447d46c42709a13d70726b3d76b0da0681c413fa51f89f9b81d27e8bd327ecfbfa24d616552dcf147f64346c0509e683f4050db7d4c5e43a21081433837a8448f2ab5a182c070c59238a976e694caae5e71243bf8801c7d1af833f0c8975e3d77f079880aecba9cee1f978c96911c03fb7600e23e5b77597abdfaa06a9841c058686882b0a36a229800c9f3b734c98b6cb126288ef3dcbd0bcee5e3a9830a94dc44e81655b069ea1d189182f72e57b3cbaa97236c9c1b1a3be61e163f636d2a15693434ac6ee7950a01ccf2d4bc8ada9e87973cd36182790fd7060047b6ea3ac19d7ec41edc7f5a4538288bf285f1c504878bc3a3469a68adba418ba03b70b1c0c3e748948eeeb9fad5d209b125649c8813a694d98d2d4554ccb753e5e8509c10162ef3f78c29d824fc93bea09ac7745469cba89ecb1da156b37c00480a2b33af3531c13dec237ca710d17801e3d20616b2902268a704a0cfb5b35f39f28c63368e3fee3ff2c42c7bb3ff24f2afeae55f86e61f1c931707ec63396a78ae2d542de9d7e001a80f444744f64811a31023ec03c4f81a5f8793c344b8c168f178a45af58649a6876bcaf3259b376f880fd112f718606d882c3cb091a9adfd312301d6a782e1e4a8ea8a0d57ba3636f728b5f067cb32656fe3d01df466ff5b5397bdfc39e6804712147d48c3c22490f22d39a1f7d90dcae0b53ba1ec72c836d006d028a3c60ab825c487a7546985031708b6bdc670231fc5170716296ae023ec6708d211f6b9b18ed67d6b55b0a2a5c1ae4e5111e6eabf6ec4d704ae2c6929bb7cb0826e63f107b6865f488c53e85c5885daf648139dbd3e612aaeb1805d8113bfb8edf174ee790d8428f7102729aa2c3e781903548624d1853d615192609443feac23ac1dd001ca65fd975d66649a2893e46507f1fa1252914fa7a4f5d16d2a31fea9adbbc98d5a81ba33cb198c80c5d78f4f259d27b38e0d8d046511cd79db617b17e28c1dd1e09ef2ffe1f15140ba04e84400654134518bceaa840aa1568f5b3abe328b949afa1e27fce584252955efc57624f3003b88cb05634d8b40fc96f8ccbd54112bbf9aa253311ca8647dc8b4efa0cf2e7b29fefb63f3b7fdfae2e5748270c54fe9636cda01577d0ffb1bf89b344b4082911220c3c4e4ca3f04ff5df5476111e4d87964d867890992c4770a0122db0350a0a889b4a918c5454d781e33789db956a74db750ded8c5642e8e2b3a0a925a1694a5222b49884bf91dd95669eec7fce9a4c8dd72f58bd36a144360158fabba2cfd95fc1ca90d0aa7abccd4b6d2b3a1bfb14d2e8f146926edaf6c8ad54d14a4ee40843421d567bc0bdbddd8d1a381708437ecaae9b10f229a82c0e85a14d5ef8de05cf9e0610cc66bd9bc5a53db1f9694bf95c483187061f489378830b9a4ac55043d19b283ac46f893f7481559b4be00b0937f18f4457a7f8647e7480d868d1c52373f6cf0122ebc13b747f3042f6479dee100c40c9a6d9e50557a87e7ece9922aa1aa60eaf949cb1550ca4ef1b0bfc9f015aa9bb9731683dac7cc6fd2c25037d0370ec4412177594787126e2c142dce94ab7f6c47c655a7bb18884262b399f26d9e47e05025a095b67d7afdba8cff252cfd123a8a2c845a94ca80edc8afe3ffc2d54ad4dd9b6b78c771233e3f61ee3a51acb6fe8fb0837c12e460c37105da5eaa5c2882ece8accb7d1e0c40c5be7db3fc4a620a8983ea88a27048f26aa56aa2d224b7700a53f47a69acedc3e62538d8b0838daa75a6da96445d88242da0d3ebaf41b1cab1564c31f48ede6450ec8651f6c69cd02a0996c55fc566866bc0819320d6346d52fdc1116ff71da56f53e466df0882bddfe0d5b4cf5b4f8824b5e9b09e30bcf9891c9911554b8561f2c23f07526753a6b2248cd602f2b5c4a6bfb1f24df24be9df87b238ed7c142d4c0201841234eb089f0fbfb3a834a42fdaf4bb8cc84289a6ba7b1797b076ed3ac4b481b35cd705a84f2405022882afa566fdcc8ff3df9606afcabd0d0109773da915e963de186679f37bf60cf92d9866c288d47bbcf0532aae1e854763f7ffaff16039fd49b893a4ef3727a575e57c9bd2b462c9a20cfa2c095adcc858dcaff0bfedf29306f379fba828ccafd0339250b8788646ac5378ee558002bdc0318fef3625fe525e27b61725228268fcb92ae4b84503c1d1f5988fc39f4740b96eeaa5b53f9ce1e1df6132d78f32b8488605eb671cd0b6490b775ba8ac9d80e10215edb940da90a505b8ebe34e075b1dd7cf146e63b03df56b09fc57c64c85b46aef207a2d3868076d5188b9a90d320ca9c071296b5c041f9481b88e0e326d598f4b34c32360a5614373fcbdab3fb6d7323b6f7c00a3120a1a0a43286d1df4bd704640be03940a195413d81e8f7dc934ee1ce7cc80649c839b0c8593516b95cbc5b76c9f60f006aab718052b0e6ded23917847622885c8bd3a3b651a06befd5903612736f7f4bc248ab3f82610fc16c4c1994c1f22e9e11f59cf7253898e4f47792c83a352381f399f71e9200a6adfe8e858647a374e3f1e59d13fbb6a726090c4c81495d4a9883e8f95099b417c586606846108aec2026235fcaad3ca7412253b5525cd1f50df577540733902960e132da4d49a5aa5428947dd7f59a46e86b53aafe737be84cbd899341b03740480b5f6659201cc2643ea3643a3ff9784e06b78c895027b85519335a1e2e0c0a871093156c3d192c13e9e005174af6baf4045dd853735f218d34bcff153d29abb4cc27f6a12cdf81a71825c1964c0749ec7a4f229a09e57c805db97ba42cb4e0df84d3eb2ad606765d9ea64d747ecab27d06d0ecd45d9e29102f823d62cba4c6be5ad57556173a18f99f9798f7dafb35c7e2120484a0d96e4cf9afdf86b93e86ed5c6c6a9868ef493abde49f088ef70683bc69f015a3dabe5ccdfc3d8d5ffc73f445df34ed18040090545fad6addb456b08cb91878b61103e4b402ac2f1923bc6726ee8fef58bb5536a7815785c2930dc57f4ff40d2d0dd1e5ff7efae683d09f49d1ffbd6d61efc89b30939caff07e22e537ffc4108d3e07cba45984367e11e760d808933b384a2a392774d161a8ba4be442da6e4d41ca78fa7aacd1aa313a2789dfdd38abd75eec4daa5acd38cc4eae9bd19ec27fe164f9cbc9217c4192ccba6042284386a4fc27ae3ac12c75201b95e6eeb60bd08ad556f44f595eab558d0e0edf6ce6456c3154d18ad38171092e5a35947741554cba70986c2f0b2c283ece96fa3ab25bf4f331156193b4f6a13d4998994d8cbe84feeac44a8e232d844b1e418c206be9ad5d88275d1cb20d1cc13dce3d8dd9914e629e4b4e316a33822b7076eeb31135251aaaf317886b31829308083ebd2be7bda7c86a8b06183c9349415ef877019a5c725585af8d425955bf03ae7b813d597e6476aaf9e7299f8c8178f9e0a9be50b8c061beee578c0646fee063fe6c947553739728880d4182cfed66c48a6034b91c7115559d61029234079f5912499e670a72049ae6a3dedebf76b8191983b5f00c85f2daa098e17dbbb41b936b76272415c54fa66b90d74675d5bae7cde4eaa4b34a7bcb9e07195935eb408ff1eaf96e64bb57d826510a4994936ab09a460455e47498a2816283f83b061ea9a18ec1b4a8defd49dd5ef04d31f8737f23161ecea979466012df293829fd257d67c54a6992955a484220147932ba0b35300e5a7b0da8a729bfd09a8062db24ebc1830a0c1e20ba924bda2438ad3a033fd00472686127007ca547ca961cd6a06c64a5b76121335422c5a99ab262d303002c392dec83f1285ee1c53161d9045db6a0430d62ad9362890ec3c79639d38fb7bba3c148e1ca63a5b38c6d4c01c394c5f2a53d49870494af42ff7449e3ebfe7d7de9612d04bb26b811a4fc1db136e75302df3700dd8d30e7cbd69fab7b7f143e20fc8f099b69c40b98c4dae5234d7a43b583964a0d03339b2069058265fea5b8d42f771bd466f26ce3138a14c36f5103715a869accd924a87b78f634e67996cef08f8887e9df2690c28d01c558568e75bae0b563dbf627a12f73fb15c04cb977008f0233a21344bb2dffdaf2b5fb6fedcafe27eaad7bd811e7309570debe96210f55e9d794e8b3a6355552a259e2c56b87c981ebdb201492408e1d42442f3e369b60fd06c9936b5449d82c8857e7e52bd1f190e42a07733b11d03a7aaf46af194c438a27a5cde7599386074b217a20f05dd483cd83a7e56432d7dd27025341fe1b90a706c49ecd43a04e804e3e2349257ff04ebf457e30d798a0c5082fe574ce07d0a611904d5d99f6f8a0462bd2c807c2fe0fa466ff065a2c0c01499303a03da188b8e34363bc92d7915f3334f1969d1857c7df03d39a2134df6b57951093211ddb9c64506ae825423f6c77a847979f3afbf5c70358e0c101041697f3d7293c4dce08a82d114ed05befa5222c548d2fb340428827321b02d52c24e4df2bc26791c21af84d5feab464f0ecaf26bc060cf5cf5dc929bfec3a08dcda1882581a072e97446c909f4c86faecaf9ca180189854ded5248f314373e0bb6f2bd9236135edaf5f663c269d051b4640f5fc06288220db3f634f2ca8f517a981c61b7f9efaa0ac071ae6e6b782fdbc03be21a3718167c276275177b5f118ea0bf277bfffbedb08b8c9876b2552da7ca42352be6a26ce5d559b4ea23d007271e3a9815b35e603c530a78a0c58c38b7bde329391231b3fbbf20e471306b535fda4b6f15756ef2821c90f6988c12f402c0245232d00f9bb04979527802a5ce11bfa82bd0f8047de52eeaf20e96c8aa015506aaecdc24a4fb92a773f62bbad0ddf2f9ed39a8966d5171f7f17d483a068668e8a41512237b1e959452f451d81b8e0a65fb6798e141ad91204f476114c71fd8f7f2ac0e2367a4dd0da3d28461126a4d33c25097680b49980878e317361c604a09f6a38dd55108b27dfbb985a852bbbd8cd205e36dd0c57edcaa037ff0d99ecafbffe1193fd82f1bfe463f9474d4e10f990097d53e0843cc93edc12a6ac673225dbf03a06fa8640fc4b9ab53928322639359304cb2df9ecbfe114753819ab9bcafe4c85f16cdb0bb08cbd499de7d03bea2e335dffaf67ca5fb637eac994681b2983259550e459de651d9f1d85abc642f5fee91c7b4c5cea32227d1b776c9e3d82a0f5edf2e227519a68d57a93eefc8a2424062ecca191685c2738adf57cf5a4ed64635022f732e883cb582b18703bea23e2315157020c64978499566dead4a3e4d0533ceb752616869a2fc1085993d557d876dc30b2a065590c5899277517f7d4b169c2bea68650543ae20b3db95090117398428598ee97deca04451ec0196b6eef761f25d18c6fb5c30120e52f7844008173370ab4d22e2c9d331a83253de2806c1cc84653bafc573e04bb23eff1e07b11063074d434e5b17b3adadfee701cf05391f9be8afb9e4ddd8f46e83d602cedcbd1eb83358aef8183a003f12c6c61bfbf91fffb9067f2cf5dfce57e76bf27e067d597aa3450088c5c0a8ee8ce9eab7d25ed8de46fc2ddc40742d91f8eda7d667f97d5994307c87d4d7c8f4bed76e488f98968e4da8b4ed3299857ee486ec966ef8baa2de4434a53f489c82cf0d85de43939575456197225ad93765caaa95b93ed889005e1a3f9a4680b1f6ef0f9f6d4808240f65a0c6444e4ee9cb59db1fb03a4b4accd1fb8152f5917b26982d877c7444084422324c47077e358dfc4d8dd2927900ef38affd5d51ce92632e6c7c18f4637cc251c11cfabd79d1f07e364eca52e400a274a041be32a35756efcf29e100d8252ee17a1da084b3d88b1f67309328d8aabba1cf2462b09b7706b756e0945a3720e4a7c1687bca824ac3a661ecb7df6054377af5f9504f8868e418a80a3caa7e760f378c45be1b02751db66181b8a0608e4ff614325b9fd8945f12fed251f067a0237c400d861bc8447b2c3f16e10d621306ba2a663a10f83a6befa8384be6943bef31ad147386162a652510e44075bb2d864d041e0cd1946e45bb10058515d6d48d290a9d5e50270200c939a804ae33348e837afd8782765e669fe8769a326a249f8b541cacbcea473a6832401d72fc36112864ad0b44f6ccf7313d77c40cf467637c9349cfc43ec6c858138c3c5d47b54ae5b14ae07dc2a04d2bb6f523f58fc6854d7c4ab915738f74e1816fb4d70a9679bccaa00e91a3c040183e9cd88f5ba380c228003a1b4f7bcd284fc380229606f0d689cc4e81df4694c04a764451b4f71efb39c098093865c8c9d2dba2530cd824c55a254337f2800d694c13fdc0b35055b3774ff6f9f943e8d688c910fdec815fac0f19a1229fd0e19ed1684eaef0b30f52cdf05daa6e0c3553a031cc858c37cfc27cea36308d0b3b50be55384a94ae780e836a313f1eb324855578f6bedf6d07b0c7ab009c69e528eb46c11c0efa3bb670ee98234c5a6ddc2e4222eea37922d73923977de7be05c72cc0ba2bde90ff6dfa15eb0c4ac5e04aa0920a79cadbc6f5348dd4fcb0e266a8996c679869814e7740c8de3156c2d96c13ff7e8792f205fa570b0fb435f867ffba8c2e506fb31c82ef4f6c5d2a63eed2e3e2cb0d6d23a66d1e1312b1573e9af3bb7578f5792a421178c3e2325ec500b72dd2f54b782a7398fdd0db8ac51b0858fa7bc75608c4603696cbeb97660d04dcbc27a473579ab0e06a6de080e64225cc5c45141fd22e421e8eba6bbe86bba0b779226a9e4978dd66c80c8f61ba63fa7940820157b0ad2c12c5c0cfd065bab6c6816c359100f38645c612e06986b05e24ef3ac6a128dedc17ef37831224a24ac422245daa80db912934a8bae6353766ac2f2474affb681426ed1c365b5d3111ac61b00f31965bdf31e53d0f2b9b862f075ec36e7ab4cd54eb4460bb3d9502176d100d0b7f03adee3cbbc7fb5d9e259b6495a3ad9109c1dce2edfbaad66fa9b60d214303c2ce8f2e530a46bad2f262c41f687801a96fe85ed8a360ba06798fdbd8820f705b3f54fd6bb6786abe86c29c5dc6e788eb0d7dd7eec57b4e38b72494f4e8bdec206a933b5fca50a72a7fd34a750ae140d57a6bd891382875ca85fc1fd2a496d8141340e712336c2d0de0b1be5ab4a9ce5e2ecc75467b1a18851699ed9896cde065045f22cfde0a39c150b0b1d4b1011a4bb397a152a2d446064d049601ef377426ab7a9913ee8085d03e0f9d94529f26ecc485c45648ad41ac3d5dfb0e901b85ff4770cf1564941674df3aae001cc49b3624d92d29c2d1a25f56420889457c7b0e87f5eda37a1524c0e43c2d80df883599398554f77e608d6acdcc74b7fbcbe8d2d3af56f1f010e6167491e412bfca97d654ed85c3f5c28294f0621d07454420e3adb62ec29601b506dbc2f708abe4f751420a40f6541e5c3c7abb8ebb001c88a8e95d110a8456c57899e930f30913d92a2d79b2bea2556efe64d77ae52922cb8b3725bbee6b6a86ca3f8d1c7a4fc406f375c97f27f471459a50a0a2f76f3b6ca2e2e34521b9b52c49816e8a12b1a70b47a603df19e1cd874b4ac50d3a8ae8ae0235a23611562547e3970a8ffee56d34eacbdf7ecc62098abe96948a8ce35915209be8b62ab9e991c18c88d5f533b2cb22b00ba44e7ec8824fc393a7ccba2fdb36753c1f83e4707aae535c151548974fe31b06f08dff60877d77fde896d6dca4817eedf7a6373938c4855086a334e684e8c2f9a0323b32120bf585d32f7d3e000ebf74e746fb52d3013232a8f5416c051989b299c146405408d213b4f498bec6e2590a7928273f4f7fe17ba8b3896521734657e9223bdc4653790743ceca8afd2c90826a8dab4467e971e284502d13323440dfc1830335020fadb8a323ca5c1f89b692f52042124343bedde33530842d401497a13f29ba66ad233789780543312f9d18a0c45469b6bc2d8b16eefa71720f32314b20f949cb5a7cb269a27a4d627ff4d3afc39169db11937aa2fd0fd16fb0facb90d590f1881b22a234c0389061f1248a644994e09380f817787a2a81e991c675a721e39b60c70e14e6d85d44488bed6a0d3fd97367379ac47cc60cd96c88cebd4bd4dae65078a4ec79dcbfd12ad94c954aadc4346661d89deb82dfb5a427a1c71fc3c609e01bb7a0790109886a82f8b4ee35252d71a4121cc5248b4696b3815d2d739ed37f01b831d58d297006b6ef9795fb54fa562e7cb8ca2cfe483b72d1e370a4b909b20615c05a9de808731100e0f2ab5191688a4fae2737765d9813ccb88c11642f43aeb0dc294ed50e5a985ba054fcac60a388e72fa43bc2f15e73d2105b1ea2ab0460dbc086efb2a519bc9ff2172a07b10c004fccbe25ade906b1222b2d48630cfe578771ca6f2c0f00cac12af4a9207d12583551830de35ea41f00ba45e4e63fbc443bc88462c648419251bf6e7fe4a3919d4c36ca952b8734eec97561bd1e3328f5b0a6c2810489af95e35ceacfaf0fa03982d3bf83ff0b775c8a782a71927cd70d5c3fe405004eaa638f95ab878098a6d6d76ef3dd363d4d9fecba59d7c60ec476924393fe3e4b0b4c7fb3500ef851b763ed28740614013d66cc8664ae20a9f7dfbb592aa9a5ea0414b0b5d60b7bb440dbd0bb0f37093e7d9155e5529efeb8b1f866a02d47ad0ed3cfd952dfbef12542fcaa53bffdfadd33b479afb8b020fa77783c7d932990f80d8ecee6f575b57dcb43d3e1f775c7dc3a73b06cf999500656180e13327ef0311788ceceb413fe2d28df4947470653c31ecd32946109cbf44287383ab375f3159ac2f1a9d75f29007d5f4b5127e5c0ff4f75cc41e788b3c96a8c74ea9382f51b39daa978323c6dd7b539261856345455a51825fc99b7d86a8f64e30ae0fd964d866a14087bc2e71782a1c930deb521ff0794ad19b29e099ac5bc603e678a5e492cab56d13ee03729ba5080daf89f01b8878e184748d9483f3d19ff164ef8e5cce207bd097334d3b551eff40a6c197b783335f4c9e0eaa4cf1919a810664aa1c2f035288110f22c06f41bc787ba780b7db15b7e7c4081ecf1a90992d0d1a7b28ce68b115d1058281ff756f2f293235c6033600cad7f78d1b052aeb3ff45387b2932380d6a3a35803fa65ef004fe3af71927e8cddfecb16ef2fd984c2b92b223b9ff3b9bb3b020a677a122b1330c97c1dc7ee887564714c59b89f113710753e6972cf07f6d4b44047db58de979eba848a36bc9e48e9679c087061854de4c35c3745c924143210e613540b5475b534836bab149dde29b3e280e4f8a4272316fe37085039b5176b086b5707a5a4286e19d1f4fe181982b42f06218e09280d62d112533f22483de422e93c9b5b44638f869a48efe5f8cd4c6b6a62c460f343b54a58749b4bf9bbb71d37fecb822c3e48f0beb3ea02cde5521daab8f67f71c91a5246cc756dd8bf0cd1c595f14df735b3175c17643f3793af65c6d5c0b2213d2dd6aca16c2a901276d7307569de08f10a8fef745172dd18ac289148b5faba142ddc3dcb8eec035c31846e7e3b2299ff9e3231c7f94655ff8a2333137b6c1bef74d1ff6fb7418323b55f3d4fc60e0824dfd01550b971dd6ca287aa55e6c162f0640e0914b022a83466c49483ed8ed440096b51b22fb30e157f6285e8c5ee3422fe6ee36f10322004f51d9d30a3dc093b56c9a92eb4b48f4a6ad0448cc1fb6da7965a9a259e493b13437ecf30e9a86a2f9f4a8b956c5c379312af3b3ab07b39e78f2beefdb5dbc89f09d09e926e454dbb0c699a962f2e2efd223ea75b0c9fd90680620808872beea5db59842ec12ab2b3eff9e893ca07ea00da08903a9de15be71198463df761d9858a440e57f8aa483a021cf1447c809451880c5e939630e059e395afdd7168502bb99c6e89d3a9ee72dde1bbbf8ce7e8859df7eb38c085ca82bb0d6631cc92c375f64f59e7d58c114036bdb868d538a9701d1a163d78399a7dd9a954be8adf51139e8a423c2282f1427657b1f96a206220bbe86c72fc45f34b863bde5d75fe201aaf9ba60c687025faa619975be4acd3d8c75ba9f7f0da1ae4ce88850af6427e903115553622fb610c9d3971097837bda3b868aed14346b2cd06bc9affe7c39874bb0df80f265c86cfb3ef2039d961832ca331bdd5cd4fba0d6dcc0aa066ee61c606a9f4775eb25a960ca61cb99a80931fdc88e51965cab026b3d219588c0d8e0b50aa4f77abb53328476c406b6666b5281978c2b55d5fa2ebe481cba18cf05ba92a0e01deb5351790dfff432b3b000f2d799bbc44ab9ce00730f2d5bc7d24e386fedf0c1bed868ad6fa3bf66be837bfa21bbacd29232cb24b77a222971f08666b76c5d3f165b4447f020bd7ef2a54fdb510ff5ac8be1c92925a3912cfafba89634150b3ef7046635d371a8e7bd3b1c68003039f3364446350226d0eeaf3b133e1ea9871770d8a6f76674eebe6b796ee183d4660321a201e3fd606a46e8ea4f7c34fe8bb07848a4fd9d248c2afb2bc5610c53e2ec91a02e2bcc3fb24729bc1efc7a72d7d4b1e7c53b1c8b5a97fb70e967c6394e0f621c5bc4a237a7da80371302e2285b2bf7fb0753c815237a855287d390eaaca5a6489c4aa7168dc4361e3fc44017cc550be66b0f64d68769b82d4f5d234106c7ab6c21f7d10a1173d728b7e25926086191848168f1969297900c2160e591d441f4ae088a1f0b6a56fc60785ce47f5ae6ca31aef3d5503352f5cf9c07907706a3618616e2c3418972ff21fe0106c3b5378baba6a82c7fbad55c486e4fea213428d4ae08857049226a8406fb8cbcd30f22b0b8e31456cfba3c597c360ba43f40430128adeacd8fca8d0111c3374d1ac65c1d801ac5b11522d5ab472162dac7d08681f3ec0e37ae60a65ccfc1e9594126452749f18dcb97306396376af66c5be4d6fda0d1782486e0b72d06f87de57165964937864a41b6ed75259071bc38ecd7d0f004c550ebba738d5da10a5435be5c964d481029904503199a51240662a102832c044221d67841de74fd3428aebcf44dce012f4ad58f62d3a9c7bfd6f49a03524e19089dc3d61fd26a68709dc98187d4da0a709bb3501fd27dceb89b939017d24a6f70abc9d12775ade710c4f70af267267c2f59804395785cd01b889c43a61f499c0ad09eb31313d4fe0e689d16702bd4bd8fd0ae879c2bd4ccc8d09e83f313d9ac0ad09d347023d57f8e689d16b027a520294a7607768f93729051221dcadfa2a78ac041890b6725f3fbfb091957e9a13ae2c487f2c0d9f8947ab01d9de2ffa8b83b4560b1e786db4ce90655e19a5ba4fa90f631f9723b1e26120f4d033e8a8c1ce3c3d27efa702c671832cf773f86f043cc0429c043912ef42ba44dc8f3da1555c1cf245505284d70bfef480c28e2e836df690d1d09525dfa25e3127170d5bdc0625cbe0aab1113367d8b4adb306aad669a6580648dc21eeadae82a9b62f3ea2dbafddf417f41528146df77380b3fdbe54f34970ace198570fa921b91c0d80d40dd5e201fcf2f84bd85514b9ccd3653314b26c306e350e88288dc5dd107309c5346aff9fc7f82cbee7c1f466ec0e1eccaf6f7062b6d3d99b8b78c4bc2b0e1d614dee0c92c73fd45401d50ad3dd9ab09438bcc3cf15086f7258c29445347848c042860a809a81086413513ed903e96f3236eee23c5ac3c722e04cf9695e6482353fd29728131a9fd9c3190a85db60904bee2f80118f12c9e19c3b4b1b78fe60ff446bb9821a57bb5cc53c5d87eac3b41898016ac41c92b805c86a4f833c08cdad607b0f1bdb1ed730b5b928c1da2d53be0c068d57d02c79b2639034c28c88549762ffb1a8067076b5dd40ced291fd469c9f01dc939e95cfc9f993d632ad05690d2041df44ab96ac9bf78a439b5f364a91ce0ba86f9bd08f240b745b406a94b49784a4be21c9c20aca19a1fe4b9303b9fbcea666a8dc792af399fc7e00660271bbf65e02c62470d260ece13444eab0685ef7c5b2abcd2b55d107ee6a5b9bb1d253ef982e8dc81890cfd33e84cc1a7d411b474fc42969260c182d22b61fd26f6ce7870630820ecdc07bf1af41b4384df8a81fc79848debd5ecb5c09e2d47c132ca85a0c66383c12cc4a057b194d9eae5482eb5ec8091bb69435cd25f26c39e54a641e5824fe712a3ecc719f0e428c4871f63f6a52389bcfac09bf7d0c3f50f106fb155809e8864863b47134c3f2793ecf7883e30ec4ee41db719132e1b2584111fb92740867cfc83ade8655f8091e29dffea05a1350bea2e8b7583b5cd1d5b44bb51732fcfa71a488b5b14d044cc28947639bb84b0f24ce816b5bf4b1a8660b6a05c63e248d966ad38c7873e164545cefa9bbb081e5a354ff697e89b01d4a77f283a79bf60cd5866512635bddeb5e5ebe2cc87dfcd044d03c9d18c85ea7cfd19713766b9f0f4f032d45eb4d85601dff63d68617bfbe102ec6235a6d0a488d1d8206cbdb11ac2b95915fd3643b3d9c2aab6e8829a404321411472a56af65a35bfa37c2d710c2684c8cd0b1195390f0c374ce78bbf00843e1c6ac29962b9611a76cf3424f4bb88f823013fa6e25b117fe0c8aea2cdba36e33531ffebc1573204caceca41b0ae5cafdde1c2e9ae0614bd31a814558110d97ec4e72d6119e1484b5bccfd09d17479bf7d81ef4caf6401f5da6b5923305fd4a8ad143c2e62cc53df828bd57667097092d81ff106eba159c6858374a97eecb8897636f0a4dc26bf556cdd21529e1715eb046f5f0e3cd5a79eb56d85562903fe4611d0befbd59f71875f13d704b4b8546aba0c7945c1437c1b8a3eb124e80002777ad2af0ec217d77b47856c614248360f44debfc6a98690c89c6894294f281ed5ae9540fecc5e37df3557bf61c9952386d00dcbfff3145c23529403f1601d54f11c7a2066faab9ca68ea8e7bfaacb7c2522b551b1e77cafcee09f0d6e1acfa4654d627bb88be132a0a12b983c5134590ac16635e31115729bc231821d825b71af1031713df4dcdc74284fcc38aefc97832c43902c368bee21ebae341b084f8430a030425c3534cccad2e4f231a5af6b4a029436394d25809cf43f139a1dc2d503262df92ef593be0085631d8150d1aa078e28a9e2824f45ca881bdfc800d461ac53ce96a6c45ec562dd6b0f7cdbfec3bc9e07f82768c8cdc0ef46aa2312288d70047ac892c450f773669810b44cb8ae1b5cb571b7288e6a545c9adcbc040a5a2b363349d290afbf657281e1920cdd2e43d2d51446163be468d78f6e94a0e10eba57e7e1a8c631c96185a65c27ec5407580d2152ee7c111170d9cdbff05e1dd40c0a055b9685e4af35554e4b9417a9bc979d55803c2ff68cbee66727b64ff7edd794b0b5aa1371eeed15b1ea504fde382e9312d58bc486e319043bf0c1c8725f592e0cfa87dbb9cacdda473a5e95e6248933d2c22c04dfb208ccfa707c8ede805c9ae8ff234b2f5778e61d2c5bffe14fc6310e06a5c312498d38eafb4199576b72800f2b6c1f5770111c331bbed458d0f52ad4316100c16f7a6c9a55bb0c89bb6e3d9433529342a2d90f6b21f6173a451ca096c0d6a02d4ac003f29660e550999d12cbefec0b834b3242385b4d80894e3395868be30470cd8cb7e2e68a30e066925ce9181986fa250c2f53889f9fb4baae360389550db63129b44d022f3822c20503e4db047e5fb1b3936819279ac5a66362cdf08af5cf842203be80c2cc36dfdfa58af4f2d399aa2a179d806edc38a8803f00991ebc8c9e547bf193d42246d526ddb32d1b154c434e12f3cb14edb233f34ec6d4832686d7f90ceda49682b7a95e02d7cd6f61a197572ecfe9796a15ec7c95c097ee307ee839de1d13b7cd0b1b858cb877161f37513efb5f589d1949d754185c1cda8e77aacf43faaf036f603bace1569987f25a7dd74efe0b0b7b6cf229a9d4ad2fe39c0df4af0917298bcec82db5f3e12cf270ef73c9440b7b0c700f0514d5a5e434365263fe305d34001e01a9bb3c7bdd4cf8f8a438804fec93a0a48724a4e2868ac6583b150fffff04b97e3889b786140e210e0473f3075d71154c84d1c2638205533072b1f7986d4d8370667e361924204678b0d25433d614cc43daabf0ef6b0dd57fa94efcd2f443e0a01ee7f38a62be7793b3f00c7ea318f29443b27301e48abd0c3412415174e6297580089ed71a5eb428a7b3c82736b73d569a6d797079b941eafb00104429db9e3191a7977b2045be3913fed64bdffdcda51c045acfc117ff0e69a3d690ecc794e43ace714ea0c5ec13be87591c8576bc98003dfb16012b03184d9b872b62530698d04550ac69135f60d07d6e9ac079f9be5390f3a731679da9f78897de8bd90c8a483ff9abe735cc4b778a4ff52fa17b36ffa84a23b0bef58148d030136d8024d3d31cce4119542cee2d33b09640e54304c4117d0dae3c03daf2941abf55ef494c278ae78aec6fa0542f2c28086e7fdcb07b7e3c52b624e57268a8f6c6eceac3292adf88299ba326b6d7d8800c3530a34079ea13e982a99a1eefde648443bbf31f03aed03b27f2788dca2470043fe18ee000b516b92522cf02b5ca01165049b788217cd860a2b26c64ed13eac725936bd18d024acebb4c2acd4ecbbb1739ec673520a1e7aca26203e20cb1df1a61952439cd0e3b9c400d7832059975424e7af0d104d0c8cb9c45ed1f9765b47acb4679686203d101822e9635aebffba98104f1e9fd08342d9a6983e6b83810d6384d74ef53b162f891a04eca9ac18098115ab298a613f8ec875705ee7b369f6554c40a409bece27373825a343a2d650ba643bdf19f7e2aa514939b41d76ee914085db5275e7061d55e42a7a20b472aec8f1b0bb3445635e12658e643d285499e338c04dc092a40f769c2c4e6526d15c24aa21d8eb23025b42362051a5404784334745670183ab4d3d55cf4e72996f13e4860d5636f2d051c3549b85812966c6873f59b445133e3201067c00c01c5242d5cd381d213692eac46a4aa63237b479ba3d81c009d44a7af33614b85f177ab4719483c10f3267b03ae629b055e97cf41a1b033fa0d9629b95fce92ee4af5c5b0e16ff7f8cd22c71fa85b358c29fb4713bf07f9d9d7ff81cdda529133318ed7befdd83175a15b0e20bdd83fe30286580984678288bf2c83c9605308c2316a17e35f8ab60c74c6a981e28122b6411d8235d463cc7669c6593157533a56313c65a596dd10ef431f78fd162f0c715698c1166e1628c313e4c7c1f16c533f6befcb312deeaf3e89d0d7defd99c18e3b4ca89dc0acc50b039cf24a277dcaaae9f0361941dc167304f76a9c40fbf20a5d66d89dbb93a46c38057115f514115e59e7ee5095472a14ae058810dcadb63bfcf27a5b2f49c355a28e85ee94a287f96515ef3faa5754526888f94a2c37bce15fa582c0f062e1fbdd440db2b3cd968f4a79fce1db27d0cc064e5aa94bc33095cf6e92c32d761b0104dc4f709555b91801dd3cd585629226ac85cc6aa3625912b4a2c1ed2c252e84abb2fcae6f4f610f12d0ed9886fb4480c805cd155db00fdd392e93a125179f224ce69622d02d51cb897673e57c487717c756cd619b0d8bcd4e81c0f2959b9c52fdb9fef93a37410fb65ac3aca8b4d", - "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5f9cc45b7a00c5899361e1c6099678dc8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950636f684eb09a15046772616e80d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a6772616e6470615f617574686f726974696573": "0x01200e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa0100000000000000fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d0100000000000000e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1010000000000000036be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef401000000000000006c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c810100000000000000d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc3301000000000000004bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf1401000000000000004ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc0100000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195012b62e212b6a7a9c696d6f6e808e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19508248d97b4996007070617261806a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac01": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0x08c41974a97dbf15cfbec28365bea2da8f05bccc2f70ec66a32999c5761156be": "0x0000000000000000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x0000362b4c8ee30d0000000000000000", + "0x1cb6f36e027abb2091cfb5110ab5087f66e8f035c8adbe7f1547b43c51e6f8a4": "0x00000000", "0xcd710b30bd2eab0352ddcc26417aa1944e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d1e1b030b162ca447061726180042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", - "0x1405f2411d0af5a7ff397e7c9dc68d194e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd8bbe27baf3aa64bb483afabc240f68e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3c25dd840975e8979fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00": "0x4bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11ffab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df03685", - "0x06de3d8a54d27e44a9d5ce189618f22d4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2762c81376aaa894b6f64c67e58cc6504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3328718e032416872520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a": "0xfcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee81668bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80df6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f34903a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e", - "0xb341e3a63e58a188839b242d17f8c9f84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950149cf457032f53e57061726180d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503eaa3e59477bc9506261626580720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", - "0xd5c41b52a371aa36c9254ce34324f2a54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1a736d37504c2e3fb73dad160c55b2914e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x50e709b04947c0cd2f04727ef76e88f64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2ce461329fdf4be12bce01afc0af09bc4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x94eadf0156a8ad5156507773d0471e4a1e8de4295679f32032acb318db364135": "0x00", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195075a33a2ed5ac2cdc6265656684034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d62276": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195043d506aedab0d2ce696d6f6e8048a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3df32aff68041374f02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16": "0x6c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c817c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac0116c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb53102fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a6", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e592f5ef74f560666173676e8068bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80d": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509df5f4072c4244956261626580764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe21": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da945315c068df2baa1c677b9b3e81f7439fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00": "0x0000000001000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xb341e3a63e58a188839b242d17f8c9f87a50c904b368210021127f9238883a6e": "0x201efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac01a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee816042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11f0e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502d2937d2d9650f057061726180a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", - "0xa8c65209d47ee80f56b0011e8fd91f504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x4da2c41eaffa8e1a791c5d65beeefd1fff4a51b74593c3708682038efe5323b5": "0x00000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e7240ce913e160eb6261626580bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", - "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d7ce35a3ce71c3d76175646980160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", "0xf5207f03cfdce586301014700e2c25934e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x08c41974a97dbf15cfbec28365bea2da5e0621c4869aa60c02be9adcc98a0d1d": "0x20034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d6227603a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a530307d29bbf6a5c4061c2157b44fda33b7bb4ec52a5a0305668c74688cedf288d5802fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a6020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df03685025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986", - "0x196e027349017067f9eb56e2c4d9ded54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x084e7f70a295a190e2e33fd3f8cdfcc24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da995445d4efb6eae1971fb125f6190c49202a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16": "0x0000000001000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x358e18726f636f636f", + "0x63f78c98723ddc9073523ef3beefda0c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f5bc812467e867ac7061726180669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee816": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", "0x3d9cad2baf702e20b136f4c8900cd8024e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1cb6f36e027abb2091cfb5110ab5087f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2099d7f109d6e535fb000bba623fd4404c014e6bf8b8c2c011e7290b85696bb3": "0x20f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3cf6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f3492c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503c75eb9438a505fc6261626580a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a00d3cb0425699a66772616e804bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0x3fba98689ebed1138735e0e7a5a790abee99a84ccbfb4b82e714617e5e06f6f7": "0xd0070000", + "0x50e709b04947c0cd2f04727ef76e88f64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x94eadf0156a8ad5156507773d0471e4a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ef9482dba3e5b0d862616265807c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", - "0x2099d7f109d6e535fb000bba623fd4404e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500a3d203cf823b13d6173676e80821271c99c958b9220f1771d9f5e29af969edfa865631dba31e1ab7bc0582b75": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x20a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35010000000000000038757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f0100000000000000d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a0100000000000000764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe2101000000000000007c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd808130100000000000000bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b0100000000000000720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed783720100000000000000da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa83490100000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0ff3ae12770bea2e48d9bde7385e7a25f": "0x0000000002000000", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x5f9cc45b7a00c5899361e1c6099678dcd47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3dc18ebe8d771cfa002ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864": "0xd9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5bc4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff351efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c4c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da914076ec446ba6876ba5cb99bdb7129be8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47": "0x0000000001000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e193783dd6b845ea6173676e80ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477b": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e592f5ef74f560666173676e8068bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80d": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195021e85cbadb3ce9a26772616e806c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c81": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d7ce35a3ce71c3d76175646980160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x20f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3cf6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f3492c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", + "0x94eadf0156a8ad5156507773d0471e4a9ce0310edffce7a01a96c2039f92dd10": "0x01000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f8df002813b43b80696d6f6e80560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f7aec8a47707294b61756469802c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da914076ec446ba6876ba5cb99bdb7129be8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47": "0x0000000001000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da942cd783ab1dc80a5347fe6c6f20ea02b9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x3d8e18726f636f636f", + "0x2ce461329fdf4be12bce01afc0af09bc4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0x94eadf0156a8ad5156507773d0471e4a16973e1142f5bd30d9464076794007db": "0x00", + "0x2099d7f109d6e535fb000bba623fd4404e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3c25dd840975e8979fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00": "0x4bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11ffab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df03685", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d560e0b6940e074462475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a": "0x0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfaa076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed3586975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef7430e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477bf49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d62276", + "0x94eadf0156a8ad5156507773d0471e4ab8ebad86f546c7e0b135a4212aace339": "0x00", + "0xd8bbe27baf3aa64bb483afabc240f68e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195021e85cbadb3ce9a26772616e806c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c81": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0x94eadf0156a8ad5156507773d0471e4a1e8de4295679f32032acb318db364135": "0x00", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950091b1bd4e8d4c12061756469802496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ed0b865484219eb06173676e80244f3421b310c68646e99cdbf4963e02067601f57756b072a4b19431448c186e": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195054435a901133fb946173676e8016c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d46d2cb2a4d496b46265656684025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e887ec3d30b64e896173676e80481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb393c0875f4080dabc8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47": "0x4ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dccda6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa834992156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986", - "0xcd710b30bd2eab0352ddcc26417aa1940b76934f4cc08dee01012d059e1b83ee": "0x00", "0x08c41974a97dbf15cfbec28365bea2da4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90d10cc4959af6a68eba3bc06d5c7bc28520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a": "0x0000000001000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950149cf457032f53e57061726180d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503639d22ceafce3266265656684020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0x2099d7f109d6e535fb000bba623fd4404c014e6bf8b8c2c011e7290b85696bb3": "0x20f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3cf6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f3492c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501e69501baac264d4696d6f6e80ee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950feca8028a77ba7626772616e804ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b483908290ae9b936c519917440306ea62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a": "0x0000000001000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950585cf1f6f8e46326696d6f6e8086975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef743": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950776743a4ae520892617564698064d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ee41af0530f856db6772616e8036be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x6a0da05ca59913bc38a8630590f2627c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb33bb8d7990ae3975438f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404": "0x36be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe218e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b821271c99c958b9220f1771d9f5e29af969edfa865631dba31e1ab7bc0582b752496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c0307d29bbf6a5c4061c2157b44fda33b7bb4ec52a5a0305668c74688cedf288d58", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195012fefbc5e5cee2846173676e80fab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", - "0x4da2c41eaffa8e1a791c5d65beeefd1f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x94eadf0156a8ad5156507773d0471e4ab8ebad86f546c7e0b135a4212aace339": "0x00", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x0000362b4c8ee30d0000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195068dec3fce5ade0966261626580da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa8349": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", - "0x94eadf0156a8ad5156507773d0471e4a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d31ed6cbd51d9f636265656684039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a53": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", - "0x42b50b77ef717947e7043bb52127d6654e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x31a3a2ce3603138b8b352e8f192ca55a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f6584bfaf470c1b26175646980f6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", - "0x1cb6f36e027abb2091cfb5110ab5087fdc6b171b77304263c292cc3ea5ed31ef": "0x0100000000000000040000000000000002", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950feca8028a77ba7626772616e804ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xda7d4185f8093e80caceb64da45219e34e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507f532159f03d44eb6175646980f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", - "0x94eadf0156a8ad5156507773d0471e4a9ce0310edffce7a01a96c2039f92dd10": "0x01000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950417ebe2c60c84ed5626565668403a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", - "0x63f78c98723ddc9073523ef3beefda0c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb319b9aeb2f5add22992ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f": "0xe1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2aee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037244f3421b310c68646e99cdbf4963e02067601f57756b072a4b19431448c186e2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a53", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500d1064d79ff558056772616e800e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502e5e3ed1cdc323ab626565668402fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a6": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195043f25e7a03a30387696d6f6e8092156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e887ec3d30b64e896173676e80481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0x1cb6f36e027abb2091cfb5110ab5087faacf00b9b41fda7a9268821c2a2b3e4c": "0x20a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35010000000000000038757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f0100000000000000d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a0100000000000000764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe2101000000000000007c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd808130100000000000000bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b0100000000000000720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed783720100000000000000da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa83490100000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d1e1b030b162ca447061726180042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195043d506aedab0d2ce696d6f6e8048a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507acca078b878d43a70617261801efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0x2762c81376aaa894b6f64c67e58cc6504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x2f85f1e1378cb2d7b83adbaf0b5869c24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a9e62b8a5c8760f06265656684033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df03685": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bad35ce880ec90d4696d6f6e80c4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff35": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", - "0x94eadf0156a8ad5156507773d0471e4a64fb6e378f53d72f7859ad0e6b6d8810": "0x0000000000", - "0x2ce461329fdf4be12bce01afc0af09bcba7fb8745735dc3be2a2c61a72c39e78": "0x00", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950deeb3985cefbdfa47061726180882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503639d22ceafce3266265656684020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195012b62e212b6a7a9c696d6f6e808e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", - "0xca32a41f4b3ed515863dc0a38697f84e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3328718e032416872520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a": "0xfcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee81668bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80df6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f34903a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e", + "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x20a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35010000000000000038757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f0100000000000000d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a0100000000000000764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe2101000000000000007c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd808130100000000000000bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b0100000000000000720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed783720100000000000000da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa83490100000000000000", + "0x5f9cc45b7a00c5899361e1c6099678dc8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", + "0x1a736d37504c2e3fb73dad160c55b2914e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x6a0da05ca59913bc38a8630590f2627c2a351b6a99a5b21324516e668bb86a57": "0x00", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950585cf1f6f8e46326696d6f6e8086975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef743": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb319b9aeb2f5add22992ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f": "0xe1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2aee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037244f3421b310c68646e99cdbf4963e02067601f57756b072a4b19431448c186e2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a53", + "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503c75eb9438a505fc6261626580a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a068f246c1094c1462656566840307d29bbf6a5c4061c2157b44fda33b7bb4ec52a5a0305668c74688cedf288d58": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e7240ce913e160eb6261626580bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9935ae9d4cb148940af99a366d100d5af02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864": "0x0000000001000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xb341e3a63e58a188839b242d17f8c9f8b5cab3380174032968897a4c3ce57c0a": "0x00000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503c0791148c7780b8626162658038757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb393c0875f4080dabc8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47": "0x4ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dccda6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa834992156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950deeb3985cefbdfa47061726180882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0x06de3d8a54d27e44a9d5ce189618f22d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3dc18ebe8d771cfa002ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864": "0xd9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5bc4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff351efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c4c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474", + "0x06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385": "0x000030000080000008000000000010000000100005000000050000000100000001000000000050000004000000286bee00000000040000000400000000000000000000000000000000000000000000000000000000000000000000000800000000200000040000000400000000001000b00400000000000000000000140000000400000004000000000000000000060000006400000002000000c8000000020000001900000000000000020000000200000000c817a804000000", + "0x4da2c41eaffa8e1a791c5d65beeefd1f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x4da2c41eaffa8e1a791c5d65beeefd1fff4a51b74593c3708682038efe5323b5": "0x00000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ee41af0530f856db6772616e8036be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950776743a4ae520892617564698064d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00", + "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x4da2c41eaffa8e1a791c5d65beeefd1f028685274e698e781f7f2766cba0cc8300000000": "0x201efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac01a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee816042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11f0e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d000000000000000000000000000000000000000100000000000000", + "0x08c41974a97dbf15cfbec28365bea2daaacf00b9b41fda7a9268821c2a2b3e4c": "0x20034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d6227603a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a530307d29bbf6a5c4061c2157b44fda33b7bb4ec52a5a0305668c74688cedf288d5802fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a6020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df03685025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986", + "0xb341e3a63e58a188839b242d17f8c9f87a50c904b368210021127f9238883a6e": "0x201efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac01a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee816042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11f0e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950438ac98f6d864839696d6f6e80d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0xcec5070d609dd3497f72bde07fc96ba0ff3ae12770bea2e48d9bde7385e7a25f": "0x0000000002000000", + "0x1cb6f36e027abb2091cfb5110ab5087f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x5f9cc45b7a00c5899361e1c6099678dc4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d560e0b6940e074462475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a": "0x0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfaa076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed3586975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef7430e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477bf49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d62276", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950091b1bd4e8d4c12061756469802496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", - "0x1cb6f36e027abb2091cfb5110ab5087f66e8f035c8adbe7f1547b43c51e6f8a4": "0x00000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500a3d203cf823b13d6173676e80821271c99c958b9220f1771d9f5e29af969edfa865631dba31e1ab7bc0582b75": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x2086975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef74348a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055ee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae86298788e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2cd2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1ac4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff35560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca65192156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a31727416d0095b96772616e80e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507acca078b878d43a70617261801efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507d9c46786caf74af6261626580d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", - "0x08c41974a97dbf15cfbec28365bea2daaacf00b9b41fda7a9268821c2a2b3e4c": "0x20034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d6227603a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a530307d29bbf6a5c4061c2157b44fda33b7bb4ec52a5a0305668c74688cedf288d5802fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a6020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df03685025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ab7b30d24546522861756469804e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f5bc812467e867ac7061726180669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee816": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503eaa3e59477bc9506261626580720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0x42b50b77ef717947e7043bb52127d6654e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195009ab51029a10e53570617261800e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da995445d4efb6eae1971fb125f6190c49202a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16": "0x0000000001000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d31ed6cbd51d9f636265656684039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a53": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", "0x3fba98689ebed1138735e0e7a5a790ab4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x6ac983d82528bf1595ab26438ae5b2cf4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xb341e3a63e58a188839b242d17f8c9f84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a9e62b8a5c8760f06265656684033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df03685": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e193783dd6b845ea6173676e80ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477b": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0x5f9cc45b7a00c5899361e1c6099678dcd47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", "0xb341e3a63e58a188839b242d17f8c9f82586833f834350b4d435d5fd269ecc8b": "0x200500000003000000040000000200000001000000060000000000000007000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950636f684eb09a15046772616e80d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503d7dc9205a149f6a6175646980306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0x3a6772616e6470615f617574686f726974696573": "0x01200e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa0100000000000000fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d0100000000000000e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1010000000000000036be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef401000000000000006c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c810100000000000000d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc3301000000000000004bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf1401000000000000004ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc0100000000000000", + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195054435a901133fb946173676e8016c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0x6ac983d82528bf1595ab26438ae5b2cf4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501b1525326b5d47776772616e80fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19508248d97b4996007070617261806a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac01": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", - "0x94eadf0156a8ad5156507773d0471e4a16973e1142f5bd30d9464076794007db": "0x00" + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3df32aff68041374f02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16": "0x6c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c817c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac0116c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb53102fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a6", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195075a33a2ed5ac2cdc6265656684034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d62276": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bad35ce880ec90d4696d6f6e80c4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff35": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0xf9922c78cfa3c316d27a3eb48145ab1b4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195097e3e605d1b3579b6173676e804c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd00586cf1047e0a469f1357205816a7035dfb30b8d4b93aae112bee7ff8a97a5bb9ffc2c6eea0614136db70c733055160e9c5b710762b51e7a2408af0fff5c1a0d65459613d951624f96e88951df7addc80ffc027ec8b9f96b4bddbdade52ca94a40c2314f212111443fa696a28650e079d7294a1ce8dad9cdef43308792777d62bef1476368f0ba71af9a51839e2e8e8e8483c7d679b4ebff69a82e851b662f4e2a9a7a55d4dded3cc85538cec21cd5ed8ffe3dd89e6f90d9913b584fbee2b018862d0f94703fdaeebfea7bbfe04f093e7e431723f9f087d8e1bc2fd4fd3af06eebbef3a53f87d473d53389d90bbf64ce18c42eeaa670abfefd0f3299c326757a06c394ae71d8468febebb1f0fe0f7f3db01fcfea73bff884c31f2f7ddac7e674c6305f2f71d763685138ddcf54764764192f9c342fd4241b3469279a8259b7ee866efbb5297baf48542435e36bd57f3fcbdefbc3068863ca78ef7a570a4d9fbed3da1a19b4d36d03172e3207a640a836e727fe761d00c994e9dd27be1d8b9f41df5bc707ba7617bef7fba147aff8541f4880044b9f19c3c4ae14873e97ffca7e793c2f9dc38bf6f52d4c560af706e0f697e5122af3920740400e973bd9a2f60f65f7df78c2b1edde3d91f2423fba7ba45459ac79ceccf7910e866ce4863993e2d02256b99fefc95b754fe99be3f8579cb88d328e92daf59943efd2743ddbadfffd314064e5aa6bff2967dea7fc31ae2e02d8b57cea24fdfa81b49162b4b48c1156e30051362dfdc8d050b4ec8ddbfea151d696e3c7be578e4e62caf78d021e88fab4c9f3e85754f3f7d9ac48feee9e935795c65539e58d608c2b8a2b13c715e4d54db79d0cd1f20d86427cf5ed5a761ed95d320402e33d919f23cc48ad18bf7ad5cfcda11afd0d850737fcd8d696ce8b7df6ff110cd34c75f94c89b4ed1cd1e2096336a79623163d6234f2c661821ef788b26d19496edcf917e20db164da2599608cd14464900ee78ebfdebd7eee9aff87be578a4b9d670453f1a1ce7f4ca7efdf716259d65df8e941c3fdbefbae991423aa557b6be875ce8f5ca3ed72bfb5cb64f8d5c99f4b37bb827e1d1ff7e77434af6ca7e490820cda41f2999edcf8f06d28f44b992429a3df4720d3b7361aa5716ec95fd11cc76ce328565fb94ec9efbf6e9946e8124490621daafdde37f711090cb1ed6f4ca7e47bdb7efe1cc39dd9aa2fdf955acea95fd54008e3bd9d26cdf080fdd33b19841cbf687baa7befd1f280c34db9f5c1e77bcccf6a7b7a8384e2cb3d68fd38b6c7f9c64642b8ef38c4c69d45ae9e8ecc2fe58f31cb99ed1cbf367b7fa471e7906c9f3e714327b6af0411abd9a79feaa7bfce7ffe89efaf3b7b09b030067962abcc8a83cb35051469edd9a2549921910c79abcfdecd614c79cbcfdf45609031c48c3082de0a20b2ac4edb9eeb179fb8d8a1279c323939d7c31d72bfa160b00a479668a6b00638a5ecd4cbf766b8af43decb0368b3e0da02acf520a2ddf3cb164a188da1725a2de50489949d14204fb472ebbbffbbbbfbb14a3eceeee39ce840c0ce060e600f6cfb26889dccf79e08f2e0120fdd940e6cfae9b22384b0cc0be7bfabbaabaa73fa77b6aee32083172bfd72d176b1e79e4aec9f3e98e938e3e0dfb917433f777f49dfee8f4fd27fd25fed31d0d3b9739cafd6858f357cb515a4e5d7b34f4fc45b91e2d47f14c5388102573d00c997efffc6ea82499690d20e975cfccfd1df5e614427f1c3b0f7b409afde7cf8f06c75cafa60df328d319ce9c76da4be8669edd33f6cfaf3f63aa02eca73fce9fbd9abdaadf03f6cff79fdf0dfd4b269ebdaad8f14f13353d403745b0fea8caf677ba67e48274cf08aeba67dcc9f6edffe81ecf364b5112d97e4db75af4c9f667f7741e7964fb60f7f4db4f758fbf7dfb5ef7d0b73f732c5e32cb3c7188287d75f367ceb893fdbb19d2dcd16f48ed15c534f4671e873cd7a6df108a6ba83fc399bb6e7e345c3c7ebecff53729aaf60a8f439e4bddd66d24121e495f7ad2e681793ed83ddbfba7ba87f4feddec95f7f4a381e6da2b0f8fde97bc70c833e93bda93ba696ee1cc5d38738914ce5e8daa3c9ff356951767b3e6d4196bf2c4e37dfbfe9dcf39730d479aa3d83c1ac91c1eb279fefc864c2ff7775d7bf3bb7824caf76938c391cbf3fd9b14357b35d63c7fe456f3bbfacd89f27a95d32b7ffadf2bfff90dd9fc8675fc210f79be3f43309cbdeaa7df909bb298eb5583dd3373f6afe1ccdf3df3fd396f5592244952f45f4d214e7fccd9c91387a844ed11ddf4016749a29167492e917de4599252e4ee3473c6cffdf383011c6beeff698e3ec74d6fcd668d60a63f8279e4727fed9ef9fdb37bb69f5fbbe7fe7cae7b669edfdd70e62da4b99b3dc06efe003bf7e83764c341c0fbfd0db93f3f01cc7c9f7e356c7ff1b8fdf65d7f358079fbf9d55ed59fdf10fb37dc7e7efe3fdd75f32b3d178e1ce94be10df74978a4dcff38178e7509e9679edf10d2775c380620dfefe6c7e191cbdcdf709c65bebf85e326001c1a60848727e30ff9feecd5fd1fe7c225417e74749446e67ee62d9cf986a34faedf518f0beb6fe1ccf3bb2148beffd33f4d0a83b6cce191e6289e2f1e7fc8f73bea6de1ccf3bb78c8b3c5b35763cdf47ffaa76b387b45dfc3d9ab3195e9cf9cc64b3e4f1c2212ad533a1970febcdd0c387fde6e760ffd91cbf367f7f4cfef3aa4998634d7eea13fbfa35e8733d7eeb13fbfa3df108b8380f43bead990e6f9d1efda7b01ec9f315501faf7dbf76f88c54140fa9d7b36a4b93ffaf3f3ffe9f90de9ffe99ffee99feea847c3993ba4797e069899fe4fff3411a554896efe00bbd3cc19c1ec3fbb559be53fbf9b3d40fa0d99bd1ab9ec3f3f1a689ebdf2ffe91648337d1afa33cf5ecda7b181cbfd5c6e4c63437ffdfe8a8768a678f66aac79befffc6aa0df78eca7ffd333c7f112304f1ca2a644dd14c17effd93da32afbfbabba67be7f4df7d0f7afdda2a23fd83d334b0ba6c8feb37b661e53d97fe6385ef279e210514a43378180b30c2296517966b9b2459ea86ece6f06e23cb348a941def2cc22a5cc34cf986eee80d376d307386d3779c0694d46d4054aa8954c574c537c47a60c988c301d618a998630156122e223c344e55bc32484893405612afab2f099f19df131c154c5f4c457852f8d2f099f10be303e304c52be2fbe207c40f872f0e9e088912f0b4f8d8f0aef0a9e0f3e237c21f864df135c0cb8920445b781ee8b2e08df952ff6a5e0ab62a3751cf87ed025d189a00b410782ce03251c744e744a74b1ee89d2ecdb814785e785698a57c5b686dbc0b33816af81d3c067e05db80c9c0b3aa357e814f404d404b4034e9af4c064091205d8e0c30c32c46072c2c4c437850f8d8f0a9f1adf133e277c50f89af08df1d128f079f175f161e1d0e88ef061c1a4848903260f9086f0acf886f09a508282d7853703ce0ae7020e0a8e89af468de065e15dd18de1c5c083816786e7824ee6b1c0d3c25381878547a53b2a89c06b4167848f888e76777079d042784c2891a0b3a2aba2a3e28eb1d53a33ba2574657c44f896605a82eb0037851b41274657841214f78bd208ba1494982821b1418154a342d8d228c9e80f6e0f4ab12fcb77832e8c1b0637058e051e19dc0b4830e05a503202270497c56785c3c29404b50237c587024e0a2e0a8e045c105c125c08ee15dc138d01ae0a27e33ec079a0496fc6c5380e7044701ab833ce8852114ab492185c11de0e4a639488e0e9c0cb01d70497026e084e055e1a253038985705ce8803814703ae885ab159612ba33db0890165abc157834f061b165c09362bb62abe0e7c4adc216c4d6c4c6c4b6c1cf0a240635000521189244da146de1997560ac12582b7822b86f7820bc615c2f501e9089211b70c4f09de113c247845f092d011e133f296501a42e7822b836b4687c43dc32ba3f483eb45e9893ea28d280161c3425fb05dc199a07b017745c9072418dd40298caea89bc289803be2b2408de090e036f051e9c0f08ce0d1bc31b8233a2094bce884c0911c151c0a9aca46835e82bbd20d81cb8057032a858d0a8e0a77828b839b83ab03ce0a6e094e0b6e051c0638291f17df165c155f11688c8680538273829302b70687854b821b821bbb4f5c272e08ee076e13d7039789bbc4edc055e272e026713740697091b81ab8b07bc435e266e0167189b843dc2ad7e80a71a9dca23be54ab918b8415cd21ed92cd8352c16ac1af60ad60a360d5b054b053b058b8695828d42c32c146ccd3ec13aa199b04db06758332c13ec126c19560936091609960c7b046b045b04aa85a5d93168179608940b3b042b860dc382618560bfb041b040b03fb05e581fd81e581ed819bd81dd81cd81c581bd81cd626b606760bbb05cd82d6c69614039605f605d605b6059605760b5b059d02b582cec15d68ae680ad828ed11bb0329b028b023b4557a158a06bd81358135829e810dac85ab1515812b4125604360436669fb04ed80f580f5826ec12b60356099b849776031609ab016b84cd802dc20e61abd01958237a8515c252b145768a95623160c97a54b350d7a858a86a542bd434281274090a821216dd105d95ce880281e341a9061d13bea20a824a12a12df02dba094a85ee009d4213d1459dc457a591e8227a082a060d839a4183408f40974091409540d5a069d02a505a4ba168d0239a05ea044a063d8336813281964193408940c1e80fd02f680e280ebe217c62d01a5019d0f2a30185416b80bae0b301c582b280663144474045409ba04ed00fd0272813740baa04ad4233408fd00168029f0fbe19d4902510810358b2a37952d219a4762028472850e4c911201e8a14e9a827690254a448a9048209858992234340498a0001e990a3d4c474a2431325452c2004e4435011254ff25013a01e2c7004872f7960022169e2a4499123489a3831c050131f9c2041926d4a494c28508098d8948e702955e9a1002f25a33904044507202011a624441227488092dc94a44c2816005a02c502403624202c05a1e449b600142501b0400e4b2410d2510e290bf307a0262d2435e615260f489c3c01a22155610af9b083121d9a38415244c9930c448123e20b290a5307274e849e1479a284072842404d2ae0a488058096e4203d6126016ab28312284d7c183a82c44914253e040115191272f204482808c90933899222434050847c4022436ac28402a464488990131e867c38526487224a9ee4234f9234392244830dd219d302142862061426404d9ef420c44391244d7c704281264a9830d4c4099222413d2429633ad1618684840965a80950142032e60e4d94246902f4a408d0d091244a923439828407c908132889132436a4224c21273a4001827283449b50867c7832e483131ca431e691a123498a3471a22409d01014255084809ee4208931a10009394152c402434a9828a1c011264a8e4439f2a4302694273e3811daa1880d1218138a909321284e047044e8080e2a9217b3024a9e6421a025424e18704348e2c10402f201c88703e4900468871d8ee4b083a48309650912201e90d86042196a022404c44313254fcad244890e34a41a4c244aa034512234f40350110b3079f2e4481121a0244c94f8202e41e284895843a2c1eca1c891a123498e0c01150045eae2024a981c5132a4a4899217d216730912274c28500468c80724403f00b5906230859c00c09b6d0121273d00f5705be89cb0c9b23c8104791275b324c94c895ce6ba4cead6066183a04fe85683f898734e1f418204a1ddd4af6f7edd7ddbda29a5ed5e29a55bdf0d66db71dfba29756e66a3d4bde5de6e2da59be3780f0cceb651774a533de8e694d20bc4b7adfe68ba6d97f3e1ee3d6a0d7d9bd9b63bfdc238bd74d27698deda7928a50ee34ead7737ccd6ddbdd36d63bbd5b7f6bad5ed6e4eaffbdcb6ebd7bb1db5a150b47bdb501c6d476dbdd519140ab56d1be7a8eb8ee2280ae528140ae58e42a1dc46bf7c28177c7314eaa2501bca1df5a17af3addecd371b5e6dd8f076cf739b7bfb526ff666d35eb78d6eb56eeeb5bbdbda6e77a7339bdbf05b1b86d66ee1c2d4a6bd3975d7b9d4a973eede5b77db706f18efdefc7abe390f77af6e9b5293d31d3a58296e46d5dd33deee9ee79e5b77181898ebdbe6edb4dd6f7777fbb66dbd79a9b48271efebbdc1a4eae63936d4e68ec3a9971a876e1b6abb71bde66cdbd66d6ac771bcd5b9b96f3030d461a86fb7eb75986da34d69bbbb773b0c0c8c6fce39b76d9bbb6feedbd6dbe6ddee9bf7e6de9bb7fbd694d6c0746f957653eaee4eddbbdb9d7ad7b06e97b653dfbadb7beba6ddde5dbdbb37df9abafbe66ec3b7cdddb70dc629a5f46f26a593d21a0a0343699d94d28d526a636e9b4d0dd7341bf5994927dd7aabed9b3b754a679dde3075db3ccff33c9391690877490224049444c849911e203d8094080de9f07294645433de12244728c0848913211d32478084665e6cbcc8b8401982a2e40720af0727ab1e4a7400127a8253342f4e9c08158102b44393233c20c14d809e3c393284e40894264784868a0c29e981023e4061014129d28393244d8e0861d51094224b849c546008a8498e09cacaae62923439520448e8c8931e9c303982c409931f5f12254c8e4429020507a6071b0d0424a4431121274347903861c2e4c8cbe4e941c950131f84704a87211f6c523f00f15064a88912a12745904051d243cd8f1e9b1f9c5460c8c692234890002de901d2c325480f9e223d80961c614281223b3451c20394233c7c4b931d944009b9c903c502404b8a2051c284023e3c5909dd40cd1e4980a04001127ad2831324458480a238410224c4b3a407488f274880a0b46e8040434784809a00ed50e408942448704e393e264051809814f9e1480f37a61d9c3029b24313253bece084894c094a911f8092345152a48992233c20d1410727cf930408a79b3c404b8a0cfd00d484c7c70314254d94e8b0f2260f0f48868e50a0c890d091a16e0868871ca5c923740488099222403b1c11723204a54812264a7840526488890f4774004a5264e80720569426404e9a3d8a3471a2048a1050942216d04189105094222ff00001d243084a1127434f2c2084a4c8d00f4038519a00f9cea9073dad91f922222272a2d746d419992fa2cdc8dc885eaf17257abd5e2f22a2cfc87cbd883823f3f57abd8888ae91f99a44442f37424489882e1125226a232f4af47ab991179d4688e8ebf522aa4688281135f2a22f6a64bea81122faa2446ee4f5227ab991f97a11b911223a8dcc69e4455faf36325faf17911b795122ead5c88bbe88888888ac914944d44626116d2344948888c88dbce04ad03927ed01ca91198f690fe370cc25a4659a3036f3b58fc530cbc12f17f1c68fb816c317cef2981fb12c06da8f618d06c750c68fa12c062ccef297d93cc610cbfe630c58b27f0c52784b855d31c4bcf57211bb2fb3cb662a184ecd3f86d25b3770d7fdeac6ec464e8de4706239b41ba52c6786538b410b6fc5dca0cddc2073625d0e0c47b6c2ae1bb39c5a0e8913cba1c520f3960cceb951bb0173c991c9e09438b31b311c39650c0e8943bb11c341e69438240eed46ed460e4e8933bb41bb41e6c4726038dd0d59ceace5479cda0c8ca6a4c9a9e5fc989343cae0c4666633244d2c07862393a1c5fc7803369323a3c199e1942e3fdea8c5ac700c4bdc88e5e0186039658e188c681c8e81c421d3206769647f9f2fbce562cdbce512ba3c2d3b0e188ba3b1c89a8b8e5a761cb1157963b6aab97c0e76e1c00163c1682cb20c17323b0e19b782b9acca1cb39cd7815d3870c456e46c55f3a1792b07961d47796315cbc99183c68a65c731cbfe2b568e32470e1cb3952c4799a3960386a35cc572c872d072902e1cb2156c55e6a0f99105cb619131b4161c340ec6912eab5ace2c0647ad25d602e3662eab32878cf929def87115cbf1630e9a0c9683a3ccc13e4637c6952c06fbc072e03147ad05fb2cb15afd98a3f48939cbc33147cc87ec70fccb45ac65d70163c9767c37a3d1c4b2b3ca1a8fa7d941ee80c5ccb2f32077c4743e46874c47b90a75fcc3b2ff0ed9ac855fb168b510c78e124707d641baf0218f182b8603bb76942e1d34970ed2c5c305cc8ab978e8c0ae1d321d33560b985563cd78903b623a74b00e1d3156e92cdf51dbc103ef80e9a8e980b176ecc03b6838662db31a8c25a3ed80d1ec2075c458656d474c4729a343c69a913b64b39a8a45e3019bc12f17b105fb607196ef285df0cb45a4c13ea5b35c074d06fb68e12cd741aab08fcc59ce8a75d887476c6e2185143ee417d97ff421b33f0c346fc160d7fbc3f085b75e6038558b0ed9f190fd88bdf0c87648551ade4aa9523a301a1e650bb11dd80f59ea5bb04b87e421fb11e391ed90356f9d52b1ec3c662dc84e3f4a9d5aa703e351b610db81fd9095e12dafd391f1a0752d94313a2d90333a258fda2cfb8c0ead0518875d3a258f5a0b3a2dc074643c682de8cc5a2075623c662dc87ee8a07e9076c8cb23d32179c85a88753ffe9091766017664b2b33e9d4523ffe2875623c66b78552f5630ba4cc8f3a331d198f1718981f5b98a9ba991f5b80c9e0961f756839469df2a42308accc5efbf7663d311832fbab5ab28e163e4c099be1bee5b95a769a778965ff19fe19590fd972e373e4fc8d162da7058b2971be2556cbc17a1dadd9ea592d32c7af7a64383e071018101dd8d56261578b5c61578f2c077601c18181d06e60578b96835d2d98abc705040703e1b0ab556bd16057cf0c08c63d6410b22573f5d08084b8071604d62a7b6a401ef7c478d4667efc318b95b6870966f24153d1523b329e99e56a3e503ffea89176cad90b0f0da647cdf4e30f120584f448b497999f22e9068fdcce0c06bf5c44d574960dcc534bfd142d9eceb2c1a32ad31f7d90783aab064ff1e5229e7efc0123d5329019aceca9f5f4c080944148590fad67d6430291d5622f3fb6603d25901a9018cc8f2d1a4c6bf682b316ad1e1910da080436c220cb0e8316de3a61978ccc5b1eb634b1ec4268b14b7b61e6ad19fb2eb0ec3f33cb0e7b99657f5af63f61170c31213421b120b418166fa9f0e93d18ee93de4566bfb0ecb69c9dde05bb6080cd5e800599d16028bd95c227999787a965ff32fba7c8ec7f0a227ba19499799a9acccf0891a95ee65db5ecefba9243ccab82c45e90d160979019ec1222835d2fa8b02b480c7ec115a4e62cff17ec1252ba8490ae20b2174a170ce40b17bb84c082942f80b42f56a26db11a43d1be5909b6cd5e80a160a659a9dc60a82f90a89fa2f7a390d22484ec5e28ed8f4164a71f83a040fc279c6535d387551ece5a089175250c92702e6bf8e5226e987356ff142fce589ce53fbe20cb384be12cff29563c9dd53f0689657f0b8034f78f730b29e616b33c715e95a8be5044f5a522a297fa8009ddcc1969adc5fdf6f3416fdd9faff296b7bebea5b7e1d7700b5d2fcf85ae987fb9889bf7dbbb6ef7f75db06a4d5f69c97dcfc52ce94befba9203f8a477d1ece92d9d7dc9e55fde7525879677a195505f7ad7acbd60d7142a9fe8ba9203ccc7bc6b8ad10ce2cb53a1a2eb4a0ea97f795719835d54e62c7f184c858a2f294c4967f9bb6017a539cbbf0553a16209bb769ce58fc24f9ce54fc22e23cef20731152a5aeca23367f99fb08b96980a1539ec029de5ff611a7396ff865dd359fe1ea642c58b3b4c61ceb2b30abb17b431d28fb4acb3fb93f653bc3fee6cb326967ea4b4fb532ce1978b687f9c2509bf5cc4fa53dc7ea424f753e47ea4b2ec5b7843d059f46da87216fd1abeb3682d4f9c578a88f636eb4e5387fe690a994f5f3a99e933c5c805b19f4abd993e463c4477e921daa742c59e993e469566fa187935d3c72865337d8c6a6c4c1fa31cd1b16b7b231fdef49962a423d6a772459b9a3e46dbcbf4313ac14c1fa39898e96374a39a3e4639c4c6aefb463eeef4992265138d76c47e2a2e56fc4d1fa3364d1fa3d269fa18b580d3c76806357d8cb0e83fbf65fa18e9101dbbec1bf910a78f91157d8c3ed2f4317a294d1f231bb1fa18dd102b76f91bf9a0d3c788ebe963048ad3c748254e1fa317dbc76825f6cf9fd3a7b1abfecb45dcb6be77c32a6b2f061dbb8c7c88fe1673cea26fe44374b98815bba4f8d1d191e3e92cfa2f17d1c887d8f89d457ffeebd28aa5a33f80f333c5230d9aff031865cb4194cc415088b2ff48941d439953679c3a23cd349cb90220fd0a80b30cb2796629a198d38804997a10d9f148c93c3f1b68aed57f8623519e3f8368f69f213562f2cc9f1dd169f452ae5fef1172c5417e74c4d527e1261c1eb9674244452d5fccb9727dfadc7b587f7e364c1d1c91396cc576af3cd2273589614a996f93a90358be3f5e207324dc6492818314307021085c703f64ff1ea2885c936759e5861f103712860854485902599f5a216d3200451231a11bb1146021879e4c32b215d2852070414689614af9c305f27d2b189864881b262719e2c4aef9af264e84400841608124458bc92924e94fb2d7d0bfbff92d00550422449105294747e214402a3bee176d7b69d0352cfb77b80070c9fd1c79bc9816d1ab2280a610a19d6c653ed14cc2d39f13573c858a8e58dfc8452ca27b52d97fc674053832c9b4885ef9ef20018729f5e9ffb41038d222b2ff389190fd5df341671189730a1fc8e2892c64349214eb539186643d811123c080085e204ea1a223d2377211e7142a2dda379241a45f43231944d7951ce8bb7070963f9db9aee460bf62d78fb3fc2d765dc9a13ec5ae77967fc53bce2a4bfae39c4d2a0891c54a13c03041117a60ca029c22110770f002279cd8e28b2aa4204e71feb893c393a448bf88eec94161af26a25e9df05a43eb55ba71d6be3f677fb3f6d6900e69cfbe7f760a59d52b1b448f72fd8b67af2cae34b711905ca14302f637c4078c74f467ce0822397dde14e2a6fe6ea8944aa14e21760aa1f6f31109c895de766fb9b7dcdbefb82f71dc5bd25b6baded48a1e7590a41467eeefdf3cc5204cb35bde2b8a7d9de73679a0d9bc1fd25e1d92b6e0bedd4993fbf3a75e6e758bf8292b98d92c894ccf3bb6eb937671e29c90321dc4083c8138f94fceacf308a0da739858cb5e2a0539ee33ccaa3ffcc0900e95ff9ec3fbf20303ba664153405130838cb23a66407b4088a80b334028d7cdfe9771d1361508e893094d0c2fdb7cf069a827cff72a00a0db34ce20550a800669e784987630b0d7139681e65fbf72332cb245e90afc53ea8f2902a3b0d291246798634881ee539d239758832ed70f4b79f0d2d827cbf7e35f8df9fe51149c8f6fb7e7f36d4afdf784e9dfe9fbee148b1bf0dc7ce5da370797638cb2392c84135049152db11c615798422042cba22e471880823a89cc8e390144f7c791c320211f2fc201a4a352772d03c3aca429e1f6443298f3e68e00679be0d611e7da84204357024399fe8d28b8324b2a5223b09f24da6df4d0480b3f4c0947c0aa2d97e373f1a1adbaf782c9b90e526d2efffe323118d0d968a25515efc6d18348f8e8e6eb8c9f4291e896c18e5450b1b35b454640f873adbc8fd36f492f6f78f087d6bf150374b0f5c91873a3b1efba3fc740d6fb28737b9c3996938d4e5f94496f6195d7f573b904e8aaa9fe3de3929b672df5631f2b553d8b96ae4bb7934f43cc3b946bee1fdce7ad33aefec4aabc93efd1fef3c77f33befdc55eb5dcf86f51bc20338dfbf1dc0f9f3bb59b91bd358813c310d3bdb70a29127067b95233b56f58a12d11725aa5e4df04a40fab557b3be9d42c57e55b6610de7a704a4ff51ba0904acbf23cf2c605c913fc7080f4690c09648649c912d8feeb15bced9b0d046e7771be97f7aa33f8326f7fd5dcf490aef774ef704d1a3dcde469f7bfad940c7c841340cbac9db775cd83fc3b189dc1fe90c2f1ee9cf0dcfc9a3f14fd3ecdf7968801ffff911717fefe83784f31a606456c55a77b25de1d080eeb1130b01baa766fb3b194822dbffd12d172d966c7732cd66fbbff3ae7af4a3a1fb1bd24f3f1bfc7bc336d0b7df6da1cdaa338a10236f3f33fddffe86f4b770a4595823dfefaab78533abbac73e98eaaa373f1a5e64be7874e5fbbdc600b290b7a747f9fea4479df5b6706c32df9f4de60d8ff76710ddd3feb346428117b9ff0ad145be3ff3a9f192fbfd34aceff57fda27a6fd1f0dd786fb3d85ccb7dfddb0bfbbe17eff162eb99386af863bffe29196fea7bb5238967ed6ee29178ee377e192f9dbf7476436009c2511b0bcfd9c0520fdc4f40bfa610a068220b350e9a110e5122e7dd0580135d638ca50e64c8a2486c8dd4321ca1d9ebd2ae171da40c2e30f79bb1f0da57cefb5d6d65addbd3bdf8f48e7edfd2352ba1f119a37b7df90ad3f22253cdf7e444aa590c686ede74f6f863393c2f1878997701fe4caa367eeb9bcfd4f73e1789ffe8f779ea510b15c5fc7da90f326518b46f700b0be989ed0e5594e2123cf9a22a4f81006d09ffe9cd3c34fd23d00ac60573f8543f78c8f258fd38b5cbffeadb7be08da1fe717f9aaf2ed19390174cf08f2d03df77dbac7f3fd069491ef47a05b55f4f9c5ec22df541e83e4fbf3fb6955f7cc924a11f97e4df774bef7def7ba27e7e225b3d667747eaae1fef5bfbe59df9e7beb6eb7ee46a179fbed6f3873d774f6cc3fbde125dcdff702707fffa7373c12e58d0ed91e8f35dbeacdd97049908be36ef03c12e5ee4edfd190c69fbe7f8734fefddb77dc77747bfa5cb811e9df9e0bfbbd86fe6dfb9fb6dc77d6925ec8ff3e17d6ee7dd22585f6efe5bef370e866ff1b8e9dfdedfb48b373784e1e4ec4fa2fe17efbce85bc171abab923fd90974bee79247fb7df515a267d57e2dec3b133f7f64bf69d14fefc06409449784e1edc4833f7fd11b1cf61ff1ff790fe76b10d3bdab9e7212542b37fc5608992a41081463321c28b9a7ed5a97e57fb3bfa4d8a02439a670e5de9bb53f7f32747e27e279348a18a9b3f85d03cc39f3a3b79beadc17ee9bb523812e5d2b7570a4b6f7fba14ce4c3fd2463f22dc89e60eec15e9b9df9e7e434a7824da421529ec6c1885e69166d297c2283493486fc3996b670af24c43c433f71cfea9339f661b92f092edb92f8533d72f882bc0f61c3ed5d57cfa31e0fefc52483377439afb3b72b785e3f61c098f4499f434503207d192fb1f2f85b4a3defc4838c873733ded8ff52f0ea2d962a28d5a2add34230a439055b2cc200b2510e7d7cdf9cd40b057f48580e3532fd3a741327dfa3eddb365fa4f3f87fec8f4bdee99effd1e2e005ce29f238f997e37a79071275b222b8052b66feb8f8ec757f61f49f308d9622bd5fe0cebdb70012e04618b2371be87a32bfb789f09d107f2f6e32bdb9f1386395d18676914451ea279c34d261939c88f8ef2c5565cf35f4454d4c48ac9d1952d1efd4752eeff710f73e48e7a359c3fbf074c1dc0c49923b7770f56dd538485eea647e433f3eb28dedd3de444fc83e8d1d1d151f61ff2ecd8bf66c73436f8db77fa95d22b5dd7cdcfeddfef6c78431c40bbbdfd05f4e39128fbbf44f7f935a07e631791e8f26fb1b7b0862e2291fefc8678ab7fbcd8e291e60d738f03d8cd2f07fa15bb5e22952b4133e4fb54b4a1fd1b8e9eed7758ffc76d38730d5b9c5f0e2ed2ff690fc32912f98b12d117ad1d9b659ecf4d21f6e777f647af5c09796754657ffa3bdee2de7fe52d52edd57dff2053c84f9dfbfea4100cb966dde7bca56ad67d7f554cf69fa5104679fc91fd63a6109afdedfdaebd1ace6cc38642fd9f9e14e5f5aaff3e7dfadda7a94f73679afab314420a7996422c21ab7a75df8634cf2fa8e60dcf5edd1ad65e715367ced276d73a1a66a6796e71052674348d36c1dceb6fc87c9a6729041a59d5abfe826a9e5367e2fe8604d1a34c9a3afdfdd140b3bf7ff36948f3a4efdf10c7959b3afd3306006739458a3c7ad9234d2133773f378594f22ca7389155bdaaa83ccb295a6495f56848df946739254b56556f3aad6936752268999efcbb13cef5e7d71ed2dc75c87d8794fb9fee6612709643cc72f7dcd39ff4a3612b7d178ea55f42badefc864c8abacf7dfd0ea41e17ce3572f5b870ec429a1a2a49e6ef6bf6fc7d879de7570325f3f79d7b5c68fa0e67eeaa27e5c9e9a59c5c44e2e9fd0b5478885bcdc89c919704835b4aa498ac5fb0eb7e0a37ad674e635f85b96dc19cd10fd1f4d61d855ddc83d8693eeb5a8db9ac673e788115caca6157f54413aef58758b1ebe24a7316765599d79c45bb579841157480c50d8298d1258e0085128260e5d535b8820a2478808526c48a6badd25c464b3a2329ed4923509c427a2aa0b83d95174b4f6525764f6547f49e4a10f10afd913e3185501c348fb27d62ea84d689c9d3df85160493a7bf14da0f4c9e7e2eb44d4c9efe2db41e983c34728a518d3865ca94295c1293a79f034a7420472461294e6331d866b412a74cc9801193a78f50891c96726ad9767494052104c1064dc4a618fd10a7704f25886885f0c45ac4e4e91fbde6042080718427b080214e71eb410780b0022172d004719b32658a94139517ed9495688b264f3f951dd152993c6d496f6d784e16fdab52cd69c98ae764dd4c1ef467b6e54b45d45eb3826ee68c3a62383b79feca6b4c0fcab8779134f371f0967fb27eef2e4dfd20765599a5b5cc490ac392e746aaf5b7d450efea27d16b7f7ce6ac9e254d66499f75540653d666258dc5e6cf5aac86839765e4e965edc6b89896f6ba71b06ba7c2ac8cce9a96dfb4a632d07a2dab6052efaae5fea679977fd8d5315bab25251dd6b04bd6d913ef0b6b9739abe78fffc15ba45677339cff911ae559692eabdde4855db2ce62b3d6b08ed95a2d7938ccaf93bdd996e5aecdd5989d9ddaa5c154dbaeedd22d4dcb99bb43c3c554588b8d95b978ba667b365aeddbf2ae59cfd4eebbfafb460e1953c26c786c66319e7e20efead1419ea7bf07bb389223dd2078936d35ae24ddd916db689c8c44de72836d33cec236d259bd71308ee6b7e6aceee75aeadd5e6a8c76693eecb679577f3f875da8f2250503632d341cecaaf9179c9e89d53cc62eb096aab994a7590b6c893c532717b056da7e150deeef9aa6ff43ec42cd5e66a918286ba939ab6bfee65d366cbaa6d6f23dfe07cff7e08985fdfdfda3e75b0de47bfac703691fffa3855d28590f76bd00c1ae14f903bb401fb865d603bb50311eec7a89b95c6a2e7007b7b85030d70bcce542739d5cc02db2269dd5b316704bcc593d632e34929cd1648d8271fd12c3a9e5942612159b49cdbc143f3a42e1b8b8cc60205e643920898128cd707820be5c441958ee07bd855d2da4fe96969677cda4fa5b48183205d25c50b5975aaa04672e3014ed2505ea60175226f6f252a6604e43b5d45e64206a567a99a56228190c099625a7bdd4b676818133540dc52aa3857c812155ac2f369c9af160cdac4bec765dfb9b8339c1cc3ad54f93818991691859d7606a2a194c4c4c4583a1a962313418986a063353c1626631aa3245539131650ce92283a1220e48a343e8011563d8a07685d34a18ed92cd81d20a52b0429625ec2cc6d548984fa18c232cac708616254dc69524d816a335a1e60511c6e88178675b2df74b0104542c614410c4e048d6123d28a28922276011a7e89b3f37b3010c6c3085208828420a718ad63e2966925911c306464c28214eb154fa53afe1c5941b9c21461340d4df48d9d60fc4e941d3bb4a5df6d7fa4ba537eb6aa45a072bc9bcb2a391681d598a79b26e469a956a2598d795a4b2442b915e2723c94ab37b729195c898f276e57a6b537bc7c06060a8999d792ca66fbbbc8a565532fc72319158ed62a950718c9139152a8e30980a1559aa5a6e56ac86ab34421669439651c88285ac259cc5032b5ef0821c7021236533dac4924412a410450a4a50c2ca59a9469bb0c2822b94200a52cc625e47eb4824942e60020738c04224d14a3220440cd10318126512c4296e63a92c8541c4088c10821422c42996bc590c9526d09268428d34ba1a10232c5548420a4ef084b18301e10724b082850762e2149ddb6afd9b8c6cafc96ee9ef3f9d604d7e33af7622db24fb649ea93491a6d849f6c53cf233c14e3153ed837db42e46aa6d34307632d5481f8ceb6216f6d564b9bf98674b54ec6422495f6dd2342bf5577a35bb591f4f250a046d1d4fa7136832d1de8ba46c5fe447332c65c3f1532cf233c4edb16b863576e02afdf815915e2e22f8e093302b662281a437e9781d27d3cb63204ca63fe5f81c5f54747a29dc17b95e3010a7d3ea5777c74fb1a8e8be148efe148b4840dcfbac67fd8ef0071007c6f160c84ac359fd348442942b008eac3474c0bc75c2fd3a96f09609f7eb30f2d6c5fd3a486f91b02b0d6f715d9e3ae7530d93e99af7666033341a994c0dae21656033e4cc8ca67603d3c468683231191a5893343319d98ccc593d53eb998c8ccc6c26466a9ab294a1cdc84c4d3393dd86296960343452f76d1a144d0d9481bda955cea23334170cde46614ee41aec67c5bc75c22c13a8038f1c49c5c223783faff0a8c2d35923ab96fb73e0f1fb71842c2c53a7ff02e0b84a2377b3c83468b1662d51d36f43b311b351b389d5c058309b9a0d598d8dac86c632aa21fb6dc06ccc6e6235331b588d8df2066633b3216dd4c8baa6144bd15e62b96dd42e8ca359d98b4d0dec9a1847a66a6a36656e1b24d860c3de86ccedf2b799e546b56b470818e0001074508226a0b0cb062c855db38b1e64a1841524a41401c42e205c7eb431cbed0a5244087a104411152244f0a7784a793fdec45c27228c418324c4a80921d6fc0903d118887fb9882edd6df3a47e5a6a0d17882f1711089cb6f1a96eafbf6ffa1b7fcbd7646edcdd8d5d38a7c39ab33ac4efba99b9b00bc35ce1e390e6acaeb96e4a5c3aab6f3026719e7623cbb181b1ac71683fbb61836dd064f004d7f663cd4c36b34193cd68b2922c6be50cc3c01f431a399b4c2892f2c50f86f002718a5ce9474cb3021a519042902510a788c2311d68910410905668813845700c6b58a89c5185219a70244eb106bf5cde072b088107900085118853dcfa575f78cb35f316a7e25a7663fdab9ab738eebb1fecef3f615708c3c991ddd46265788b3399bab9fe7ec1ae308613cb79f2066c45f3d6a9bbbfb1ab6bfd295cc3a93d0dcea185250ed9b19c5a28c381e53cec46976251f0620a20c040bca9c164b21bb0192be0a0074118c218b1580c76839cb52758a1084b06a6c064301c3287cca9390db070011642a4b1033146b9800206b89899e10197910fd17f0c6795a4221b0106a69001718ab5419a0ed4588210aa808311a73665b0822aa85153420a43187368b91b035a302182230c50419c22875d54dcb0d3dc527ffb5737ddfe7679147832b5aa55dddd386633d8952326835d3954d8752306af60b0ebc6ec05bb70a4ba05e74061d70ac4ae1b27ecc261c2ae1c1fce41eabfbd61178e9ab3fa3d8c23e6acfe1276e1b0fd15bb56dedf611ca4b3ba1b074d56bb635bdb5ec1bc65b9b9ce31cbdddecd75b7ff786396bbc42ac359dd2c9ab3ba2d667de1acee8a593367753b6661715637fd918525ebf888ee0b878856aa44161d7855df5eed76dff4f3df13a7500922724f2a75de97fa979fcfb9e904a25c5a9e4634a2a917989f424525c6fc142aa038f353a870a2ccaba650d91169f05d8976f2d09f42e5c53a79e8cf0984fefc99f065f2d09709539387be2a74993cf4634298c9431f268c993cf45f42d5e4a19f0a65260f7d97909b3cf45bc26df2d04785a4c9431f0c4b9387fe29ec260f7d53e84d1efa5f383379e87b21cde4a1df853593877e29b4993cf449a18dc9439f0b6f260ffd2d344d1efa37fc260f7d1b9e260ffd1a829387be87a8c943bfc396c943ff35437dd6cd9c716e31cb23a8fa3c7f7a6bf50328f4e3e9cfa26d7bd7cb45746bdfb5bd8f52e95dd6f48d7a29f58b50260c448954647a29f5073088e62cc5d4f19f6291898481400161eaf11500375c2465fba2af5fdf2d2eb216e6aaba6c0bfa30e12293c9d4f58cd6682753972da333f0c94f6fa17011eaa56c5f84f29ad6a4a9c3ae9ed11a7d1217955eca868190428fc42b353fc5a292f72e99078d7cc0bc8bbbf1463e4418ec82f9d2771e7679bffdc9845da647bdedaf097f0085e8d73c296c5a9394ee38ab63373ae6394ecbb0141a9921d73597ae358ca66134dc421cc29fb0e96cd64a5aa3344afe8c8c51d84e378ccae66c965debf163c72c7eb9f0fc48cb3b69d3593efee70b32fbd7c8bc555f2e22aa059a0b325a76fb2e58f627b36b517acb3f63f1d60997de757a1790dff99e6f7d900a7ef72e1ebfe375be8577e18d7c8078e366de05be2bc7dff8d5b35ec71bf910370e73ef0aff1f3fcee3c0ae18ec6ac12e0ebbb8dfbee5633ee75db08b06bb66b00bc42ef0ebcf3ccdbbbc0c76a9b0ebc3ae0ebbba2ffdf7aa977918ec7ac1ae14769db0ebf4a84ffdcbc3bc875d24ecbad865b1cbbee9ef93de7b7f1a4601bdb0055ae8822cdca1853e60610f326ca116a4855af67f095d285b65f64f853bb59e9d5af63f853e62a8b0070c482cfbefc0b2bf4ce802e90299fd55a10bb31666d9ff0b79481d32fb77a10f5929ec11e321cbfe3b62d93f277421862396fd6342176a38b5ecdf12f2c470ccc72cec517e8f32fbbb842ec074c0b23f4de842e8022dfbcf843cb01096fdc1d04719f608cbec7f23945114502141b98134404093d1485811aa00e38a209870a285da4e8d8ca961c6129080c6123472e6028d07d64306e48a31c87001152010a7587ff4e1028c0955c0828b2b9c61459ca2c9f4a30bb11ab040065888a1c4182c10a78842014172a176032a4830604f0021264eb1544261202e4f8c0a4c68020d35ac5811a7b861206c8fd2a99081c68c055bc8c42956ec326120502f17d1e46396fdb314de72fdcb45aca59a2f551b55c906888198618d9908c474d6cdcf501347ee471805a46457abcce934cb4e936d333256bf32bbd7326569f64fd8e5339acccec85a7a4f96fd4b64f6df66d9abadd9d8875d5e7ab534ebb10aabb4136965b1ecaf72d857bb0bb3d561ae7a61b674967b8555da25adcc4bd855c93ab3355b9db6c94ae4370367a0d76ab9c14ab4affc48b0dad8666b2eabb0afd2402bab97f4d84b8d75b5a6b22578610efbf9e23d6e2b6f8c54f38147ceebb0274382c970b2addbc82bf31e06bbb8d856de1889bcb51e787ccf6523c5caecef95d99f969d04936d1b79653c7854b960231f22cd9d6d3118920c66ab71331acc9197b6c93852c991cef24bdb381aa9bcb38db471b30d468a71b7dc1a8f601e67f9c58dd564c8979837333b5d996a235f60de4ce9423bdd7283793112b7d5ee6c8b79d58f9bcc85a623953f72b4971d3fc514fe91234f38a6c76c27c6c14eb3ec5f66e778663b3219aefbe183b6da2949b3981e34ee47cd470d0849a2f1d0563fc81eb5f0076c6746aaedf820796a3f603b3352cdc70ee6a9012149341eda0fb2476da724cd7afca8f9e0d9e16a3f683e683d663b310e36e3299de53b545dac342b955dcd2b555e57f266259947f3605d598a956a259857f3621dd9cd3a58e9233b9a27eb60a58fec689eac04f36a5eac23bb9947f3605d598a956a5e57f2662559172bcd4a5dcd2b2fadd4c5ba9a5796ca12ad9379a4372bc94ab5ce8379b452ac233b2fe6d54ab983e52e7bb2fc9125b263baae7b10762a4d35d53733c5baaecb014f269acb579a6034d805c24ea5e99bc54ea79869b6fa6426929499689f0976a29d60a692e68b7db598d3ec64927db0ef74224d1fec3bd14e3067b9e9fb4eb553cc34fb6426f29b81b05369aa996226d85782e44966a2996626f2939d6aa7d809662abfda173bd1b2ec34cb5a9cc85c9a6419cb47fb60738b6c94495409d6c0580bac8596632d31d40c45b6d44019aa046b60ac05d642cb4bb8902d32140d2c51b096186a86225b6aa02cc3c0990baca544c55035940ca4b9c45ac896194a06d25c622d64cb0c9cb9c05a4a540c5573215b64281a58a26060ac85d6024395600d4582b2965a4b0c3543d15030b074215b642d25aa868a813317d80fcd25f65346cbeca7d642fea48192fd7c01d22619799ca5ec8becffa3c58f2c354b912eb297d84bed67f6224bd152309712864ccd52a48bec25f652fbc102037b29533597592af6224bd15230971286fc295d6830b197594af642a64a971a8cec05f6424b952e3518d90bec85e6428389bdcc52b2171206f652a66a2eb354cc45f6527b89a566293205732961c817598a96aaa5622e3318d84bf9327b215332171a4cec070623fb59e285f6137b81fd48912a7f8c5c6a3df23803ad34cafe339431034d8654c9626830650cec8794519531359898980ca992c5d060ca18d80c69c8c454331509132393519531359898d80c3519998aa682c1d4624a99525553c562c898994ca9aaa9623164cc4c46a6a2a96030b51899984a05438bd151ca903232550cad83cdc46866323055d9c5d4664817990c4d1553cd66542e2ad8c7942a985aee6464a54c8967c0f233cc54311e3fc5163cc317b3cce119b48821678065ff71062db2ff0c4b780be62d8e9ba9cdc46264663b68ca1ad80c326fcdb2d39033b21c3531195a6d2626332b6b605278eb468d2c86864603e3646a33e58dc7d8454333531393a1cd10f3d68d903543d69434b51b33339a5838439b81d5cc686435e40c6d065633a391d59033644d49539ba189c96868343099da0cce8f32335899a3169b91853fcad05835b115cd2c0799037663a6cc91a9b16a642b1ada4f11ff4853cb397e8a387ea489edf8716646d6942c2c430de3978b88f363cd6c8565480347f8630d9903cf40eea091cd60d4f2e34c19cef219582a8f329465647f19b078ab05bfbf0ca5b7b816eec9ec36b21a5a8b8dd94dcc5f069ab770386e870d1a8e0d984d7923aba97d0eecb241dac86a68b39b98b3fc0b6f855c8e9bd246cd06676333fb1dd8658366a394d5d466de8ac1d8067633cb7143c6d8d890619b9a4dec86d6828df2066653b389ddd06c9437301bd8cdec86b4a1d99039cb6f4a1b351b36a48d8e1f6b68311b36481b994d5953bb7123b341b301b36133b3216fdc94366a37a40dd9ff6843e36c60376637b00c3a7ebca1c970039341f6364a19b4e0816d6458c22656ca630c3519964823a6b60a5d6e6a5f3e26712903cc5b3a3a0ccb793224393cfbd90abbc2f2a6566212973218798b063f2c9cad9e16c230ecc910cf7e260319f31fc33156180b6931a1ec65b816d6b02c94bd0cd7c21a96fdc7702c8c8534fcb070f6b4f0cb12932e61497353a3211fcf38980be912ce42d84cb35763cdb4ceef397bcede4cf70a3523ee6e84ecbe65771efcc7494be2f5087727d478a20346b0824a142e103d27bb6b0009d9376b84548fc082ddaea50d71240b25c8a0892cb22ca4215a9c6c6d160d74912dde59f5ca082c89ce1ab978db9e4079cd1bcdfe08ca6ef58c83fd71ce72b0b8012418968a57bde2418d788bb35f93ad3d65fb0321641b44ded9b2c0800546b2c0c8f08cf0404b62c45bab2c507061afad3f7e4a7966398205f9cb33cb114f6cfe09e1c70a1d7cd5fe7c618514d6e260459953e6d0802abeb096b4fd58210339275501f32a9670cf800d26a83843035314b101247096239eb0cfd9cd6ef6da8b719082b2f5e9e7507198955f4cc1fa96834e8d9d203b3f76bcf543c511a41f4a44a77e26cf1aec600d6ed64d98959e02259464676c3f3234b6ed860128a21b9585044408c00f06c468910932c0fcd35c4021ab64bb11b3c945dd214952ca4f0a68dbe657346bbaa059d3bb68d6cc2368c4c44215987002952476d08412c22b4fd8300ebdcaa17e0e38fce03045051d10e2892b322bb048c25f310387c661a6fa49c11731797201027246733b820b1a2591021ef0208b30d0c001086eb2401a011244211082164e5891050d4820848d222090466094860ca090051d80e04a1421b0a9a2c13cb1ac31851f00810558b40009a330682ea8a122048e3ccb2b33f87070c4162f3841183688e20753e882a6288d9ecdb0648108247c67467760b0f54e909d1f41ae48b1e3ad9f1a9459ae6f2b019401c00248e3c75b3be30c99fe8893fb7687138618a60bf4cb2b3253ddbeffb99d5eedfc4c8165db6e18805ed10c04a0041f68a2092956b05084d833b9bb0b23a4e41600fe5901387f02b0f323f51c2780520b67cd2dd27042b679628901963cce7296270e11476f133ed4bca4df7ff4aeb5f6ba3f073a0bab7a35827f80041c4d11a2075992b0c507fa3b3a3f191354418a95286490850a9090c9fd60f79976dfa09b39dc8cc90a30ec419597d0ee71d60ba0d31fb9bfdff54726aabc851f1620d7832adbadfbe97743149a29aeb80755b678497d0cf6113d89d0c41062b229ace4200bd50c6e0c2e97674985102bf013b4a09e400b3fe559032e3e90b73cbbc0d2832d1c69dee81765648ac54d60e473eacc4c666aa5e6ad69a0797b7a3d4a9f4ea7dc14b26dbf6d9452f7dadf09ee2c733d993eaf2b5d4aba97082773ef555d1a93ebd77195ebeffca8afaa5f533f5755ae7547555fa6deebd2722feade8d087863eabdf75e997bafb5f7aaa64ebd7ff178af6a0ab15f5fa63ed83d5cae3e4b17159c6cc5ee95a35bb6ff39f639fb9e05b3e5b2b5cd4d21f4ed932cf5de2edd28a6db57c3dca6a51f0d148fd406db14d292edb66ddb46dab6aeefd38b376eead8ed373c6e53c87dfba429a4c5de1d8f8c533791397568ad7876ee3c4fa6a9e3ff4d1d7f6feaf8638a0270962758c23e2da37b463a46f6a7344a46f7c4647f104b76137c914795979363f2e8f9d38f484b9e53c73e1dc36b79a436c84890824e139e90c9b8816201a78e7f0d140b3885d8f7474d212d3d59a6101bd22c53e7bb9d1678a8f04e58c21951b081d60009254823532cd9d6403f223307f9068ac5ab150a6aead4af78ac58280c33cfa756a61028744aa656a6ce7c21506896a9339f4661b1641b45b6f6270c3964f6a758a6108be529160a4393793eb5c114d29227365501522c79047314200c6dfd9400079335b3ffa43d3f25f062ae661e6d64aa823cf3d89247f0a7043498ab99fd5314869f12d860ba70e345372100fa8f5c790229727dce6bd7ae33a7ea706ad1396f38d5e938e86ee659bf990f547d60ccf78120f82e29371f369a11bf9fff16c4526eb0ebf5bd7c07fe8bf42e3fbfa6a565bb3244f3e9bf94f726977f91542d9b832d34ef7a91dc7ef7f3533234db46fff53d4dcbcbbb5ea9f77f91de24d3b27d2eff029f065fe9ed5fa4f7996adff4544a620c76cd98f015ee5ff63799169ad2bfbe37cdc060d7ebe54d5ecafe0b7cf9177c0565f248ff023fd592baff02f1158a6b5a503805e22b27fcbda26fc2e08773fa5fdd77f84a09bb5e240e577ce565f1157ce5e5556ada98d05597c125e56646f4fa2e2a57f40fba796d3c101dbba898447f23986aebbba4dc387e5bb1941bfb4633e28c5faee499c054cbcfafd9ac5faee4995ac09fafb2a4cd2f57f2c07fbda4ecd691fc722593f7f3411bbb91be7fa5beabf1cb79ff7af992151b1a997fd5f757a9b0949beb343258ca8d73ff7a995780893533762375a77fa5fe7b1795924883a5dcc8a8b0cb68c66ea4e7def5eabef4aed7f7debb5ea737812d30ff7af9d4bb5ef7ed46eabe13eae55fa97779d78b7bbb91baefe4f2afd4a3def52abd7dd7eb657ad2bb5ee077ef7ab5fcf7ae17cca3fe95fad3bb5ea8f777bd5cfebeeb55bff4af97e760c29c06d2ff12d606423f157e03e97709b90642bf25ac6920fda8d06b20f4c150d540fa4f21d840e89bc25403e9ffc25403a1ef856003e9ef425503a15f0abd06d24f0a6b1a0805d2bf85df4028907e1be6341020f43d9c0da4ff4543494be866f76c4ffaf9a9eee97ebeaa7beccfafe99eee017f7e4ef7f09842680e1a29089a4cd6761d89b46ddd75e8e6fb2def6110ea8582828810093a7dd0f741d6fba0d207711f64ffbe0d37474731c82d78ac38e826ca4c46e171e341761c74733406d12833f9f43f0d9ef0f8df9b3e3cd678785495be2be131c53d09bcbf5d3c7af63b0cba393a3aca168f516672c5639499ec7864b2f120f78ff5e6c6516032c5392db4c6baf796cdcf17c0136ff9cfa74b78abe6e7d3d25bb4f4f37fbc45faf93c784bc7cffff9540b6fe19c7e7e106f996cfc7c6ae42defe75399b76ea47efe8eb75c7e7e03bcd5f233c7cfa752780b94b979989f4f63dec23378e4f2cc7758c3fad5e3781bdae0229ab7f91be2e43cce87bf858f8b2e8e673d17eac0456d5fc777e10d5c7423fc9cff421bfdf6b9478539708ebfbffa9710e3221cfc373e26bcc1453a5e9e7b99b0a8e8e66b662905963cf3291ea28d9bb7f953587483abec108bbebf799a2fd1e02a26f1bf0617c9fce96d709517b1687b9a57d57cea4bef1216d5a4dee64d366ffa14aee26251cc9f9e1416d9e02a3a6211ea6d4c5ffa1a1699709518c4a2ee6f4ab84a8d58547a9aafc155526251cdd76f098b5e385c45462ce29ee61b57e1c4a29aef771db80a158b526ff32fb8ca158b4c7ff3165769118b5efef43061110b57a1118b6adeae70951cb148f5a7cff15e589403572989452d1757398945dedf3c0e5c258858749fe6c1b0484a1191780357c92116d5bc7f88abb0c422983f913e7cfc342ccac1555a2c02dfe6a514118938b88a0c62d1e96f701129f52edff2a807bf0a156f1ee32a2db188f434b888e6ab5031fcb0a8061755a162cddf94de4658e4f236b8a846e6551ff330fff255a848838b8a8a8a4e6ffaefbdeffec767c2579965c2e9acf9aa70e5acf931210ece9a0f13fee0acf92f218d396b7e2ae49c35df25dc71d6fc96b001ce9a8f0a29e9acf96048a570d6fc53083a6bbe290ce2acf95f68c459f3bd901a396b7e175299b3e6974295b3e693c21f67cde7421e9c357f0b29cc59f36f48b570d67c1bbeb3e6d75000ce9aefe11367cdef902ee1acf934a4a5b3e6bf4022fa9271ae04dd14c189a509b24c1fec9e51a5aae91ecfb409b14e0da0eb5e0083e8ccb37b66f74c6fc3239737cf7e3690461c72f761e4ee67d77df71d9e53877221258535cc30e61633df30d5c8f4bd1a661132913946a6259abb5238bf2124fb118028cfc9a37b1a8ee1489f7b120d671e325763f75c0dddd3fbdc0d1d2ee13957dccfcf06d2d3f9d5503369f32df4bf438eb95e1175b4c62a38470e9547f00812134427c842112710e204494c81048c14515cf13630c798010baebca0080a53e4e0258b952fa2f0004c9e65144e702cb47b6fadb5d67ba3f0225f2fdf7b2f89fb8e4422fd4fafbc85c3bdf74641837cbf768f29dfe73e754952eebdf7566146beb67a0e5e9e58a0d022db3c65c00514795c91a81da2944aa5261a4c3cb1c40d6a392002092952084e492c010b3aa8c210624770a95921374909a521d068469278796e418408cce826850204a944a17bdcc98147afe8aa13dbf1ceaa57b6bbb3607141eeaff6fb53dd53bff15f5cbbfb47f7d8ea9804607fc541402efff44fe37046a69f43f75c1b821ad7d2051613d0a01a217941fb8c20b282225c89e207553802969615d0c088098a13d06846924031e576a0ab995639d58c788b24c59d65f0a88f4397457777ff4fbf9120dcbbc80015d95fe5ed349a9124b40a1350f900119e3843075b88a8168c20d3ec3808a8ca3f0de67105e6c9850e9e707b020f38072e50c515235c39e309b01c80506c000a25ba53799624a8e52ecf2d88f8a29df01daa5082312bc206cc00433ce511cc534597d08010b508216010060fa038420526157c7996239092b93cb7e86289daefeeeeeeeeceb95f1cb4e58a97f8773f142222fedd6de1127bf1c86ddbbdd6d6ea3ef6fc6ad832e9eb6fdf11d1fff11bda47a38ba61f8783b6bca43e14a26cdf3f22f6ebfb37c43e0dc74d0890bb817bfa99c3e392ede7f7d53cb71bce7cb14881d6558fd28e7e35dca7785ce2df7f7f89dfa79fff0d976c9fc5441cbd596029c3e08e2a4e9ea508c4c8df0e34a0da6c13ea124e79962228ed11dd38b18cde8eff8f6e4d9f3c7f35853aae5730ddcc991406af28cf9f74d6ee99993ee7611e79fecca1503470b7bb7153663e4042148e80a52cfaca58113870efbd97b419784106558c30040c64555ae05921041375a757f5e631959b0a91134555805144c613d40082d8cf754f971b084564b1a2045e9e3210430a5a2f1673b6ca82d4791be7173bdb8f2b1ebd9aa2db7014f76362a3954ae7134b4bd5ba5405a0fff8234f262a7fffda3dddd3d8eb157dff2de4c2d9acfe1ab6461ef5a73b9d754e377d1a3a45375fa59a29fbf4bb1740af574c5443c0ea21572965a29b39b408100758dfc7a157dd0d1bd0ab1c7a4571f0d6ca59f4dfcb56956d290224b2fdcaa5f0c82427db6b2b25029c331cbac79f7e0e8e7b1ac3e4c9850e52906b9ea50838306979e2105dea46a73cb1c464dd3f69bc3e75dc513aeeb6eddeeeed7bb76d73b7cdd5dbddb76ddbdbb6dbda9d3c57bd9a5faaf5b77befed2635c99dd4247712a90e79d76dbb6b4f758e6bae26d52bffeefea9e34fa780fe7fbfb91fefaddd5b6fb56ebdd5baf5562b676b6d7cefbd7d6bf5ce7af36b3cba72ffe4ac7beda9b561a8b50ab91d76d5dacddd9df366f7d45babbb3b89f4eeb5a7faadd948b454ba25772f7d3698f2c5325367be757777afd7737777dfbefaeeeeb77adcf7ddaee9d5bcb8f6577b4a9dc9cbeeee7eeff5fe6a4f75af61a8d5746b303d79744a4e9e5fd3ab49b76b39936aeaccdfdebdbb76adb56baddeeeb57278f4f2a5f5d6ef5abbd61edb30d891666b7fbcbbee5a6bad3dd51b861e876a76af3535b76a394baaa45aabadd5fdd65a6badb5d6db5bb5b5565bab9d3f4a74b37bfc67eaccf709d2bdf71e76b7544bfebd7255afdcdfeb9597be0bc79cecdddddd5cfffd52ed5bbaf7de7befbd97fbf1de7befbdf7de7befbd97abbd72f7c291494eeef7eeeebef7fec89347afe6bdf7aedcddfdbabb7b4eafa6b77bd71ef77b1b867baf3fbdf7de4b83f7a4e742efbb5bbfeffb847cf77eee5dfbde7baffbbdf75e77ff5269ab3f7ac53d8f5e71ff02e92a73ffbde2de27737eefbdf7de7befbd58d52baeab73eadc7677777777777777f76ef7923fedaeeeb59bb3ee1d8e5ee6dafdfee84e84e62053872b7957aa3d0d4389ebc252480a47263ed99febeeeeee9ebddabeabb4e65b1b06f77ba9bbd3c673f36f22d0ff06ff25d776239729fd9a69f5b6f7a9fbc5f5c7fbf3da4b43759f1e159246d775f767487a8ab99ff3edd7dfe6df30bf542a954a254a873ccf6d9b73dbe67c8f7edb8fd65abbcd896b7a353fd5abf9a470fc3c41cfe37a35adb5d6d66cadb594526be98fd65a4b297dccd5ef6c38daa7f637fb37d8ffb1f6584a29f5da53dd76a6dc8f94526bffa7a710ee474a9bb316d75ecd9ff4e98f5c370ed94c7f723475041f1f9f26394c723a47bc529bc6bad93df47edd701090d2efaaf702e8fe0dd96e77bdfa0da1df5f7dff86f8d34f0033d3bf21cd9492a0faac79a8e6fa34b53311fa41f3e868a8664abf668a696ca06f9f560f01a5d92906267dfbbdc476b3877eaeb96b4ff5f6a3a386a19708d13cd499fe51a6b37b6cfdd17e67432290664b83eda19e21d377ea62743367b4e514e24fb3116944b5a6b346bb44ee1f65f27c3a5b967456d31fc0e97938529bef8fc84df6a76110ada9f1afb10985684d68657bdb0217bc00063160412549176745b557582cac0a6c16560bbb028bfb2d0aa68f119782e96304caa68f918a8ae963f4554c1fa3d595e953b14bcaf4c10bacd06fa3983e53a49c44a31d717b2a56a68f519562fa187925983e4629134c1fa39a134c1fa39c29a68f118f104c1f234e04d3c7081cc1f431529160fa183d14dbf7dbd8f4d9b04bcac542cc2072d8e522457b9ff42e9a12b9176206b1c32e2166104bd8453405174254ecb240110b8ca8b0c11547a24b8819c49897b249d95eca7671b5b7f4ae6a53d5ab787b79984afbb64f61d78e9d916077bf845d9396242a3c44eea56c2f257c008c25a4f86203a294ed05bfa89e4c952def324a89db972a0d76917e06e3f0f304551fc42e4a3391bd53d6381526c13ce81f27835da457610aa35d06a6bba8e4289655268a90834c219a01920000a0004316002030201a8c05535510abf514000c6a9a7a66541f4ba41ccd625021448c01020200002020106c62000fc30f09f7f8b772e5213d46283170154c961813b14c92c72e3b5500f58fee69aed566132c1a6642ddb4591ec0d82c0ce0b689ae02f6bed736e2ffee7bc3d6bd4b64887ca60617554501e9f9d9b157f26e16dee6f241f5308d6f30bb2020623739cf39067fe72f79e11fdd3a5956a9dce35e9c074c3a35c836da387f6f5ab4a6784c58b16eaa2fd760c76755b8600b5f82468dee413b55afc97b882f6fef194d6e40ab2c05a57903636e354d479fa581d1be86ec5b06731efadd34f16ff09a9e930f064decd147f547abef5d1d944dc5615a993605d0842a2910eda227b3d8de67b3d8a07e7d0668279cd961bae42d37efb0f1d89a53bfcf24b293e17296d9c96d9c5856dfdb0b6aaac472bc56c99def10f4187f5d277d7e8d401c6b036f4d6036046d339cd54d85661665d46a31205ddd8e05ee9403a69fbfd2570fb21c3b9306406358b41e6543a83c93e3405615a2a05b9628b0045c10687b9b84c389f8959474cab3e7cba92ae917965daa128ddf946cc7468072510c53bd99884e2a5942d6823c593de43fa6f4d6a1ede5731e37ab5adcc01fe34fbf97b6430a451a453776aad17fdcedc3ff967ebc9f65456fdf1209bca90185458f1f9e624e0060cd322c33ff30ee76516a456293c7d6262ba78f73254bc8fc2e600d3562b9b0969ca303b1d83a374059b6a282a20af291809e72b1d6d57a461b649afee460272f84f7293dbe53e3e2c121fa8c5b1931deff7c804b493901b16d59dbb00d64a95d58846603d002e59ff2a42ff3d0e5a37d7255a60689a483fa392a0b31acea6421ed894f3b771ea0fb503260bff551f580045a94436c5045171a5e75aa94c7d9a8d3330cdcb0d96de81e60a6cabc9ee6d34341978661f80ff365bb148dc2c5ee93af2c1368c686d6fa9caf84d0bdcf3d638462c5ecf58b1ee20747ef22b0faef74d7fc6c3e1102ce94802972c8245b44efd31c9d86393136dd71a53bc17acf6dba059e6d64effc576fe2d4c48b64315eca160d2d4a39f8ce3a230d6fec9a0999282330df053f486528c47f36827af1e020d4ce16accf61679e193b903cac5dcb14fc522a2ff1998651f6976a99ddc2ed930dfb83926ca5d9259bdea99015950ee4534cb0dac3a9350a9d31c285439db7e0e1188998ecab2f3a1c89c00afcc83670c1ab792faa7c06986f82fc8045564527705f07df24ef97a4a5847616aad30a77049a52ad0e70437948725a02c0f500a3073e08b3e1c0345ea244384d1163bf63c50380077c2758071827e7189815c77956b31ae09ce9f8702f88288926d0136fa4d018e5afd5fa73502534446205cf8a0d2af324bac6c9d6d5869d01caf2da1a3523821a509efe6e35de96298605cedc96262ddd27ea87da327e3930749ac312e11f19e4c1c4ea06323e2651b2ce7ec555bc0ad700a17ac90c4ef0e795fd5016c3e1bfb231e31aebb9d64d35339e3211c01979116ccd101407c37dca90fa0ae620f176a22449c18a3ab3513e2d174fb2f77f3b4559c6aba5378d1b424039c9392767c45a5662a488ebb854fe2d0972ec99ae9c18967506122312f26bbde48c816bb859db5e50a4b9053bbe9803cd5567263fd160cbb803a4454f77e8ea51f5598d0d4d70b4de0da623466f8f577a82e46d7e7fc46cea975a20f31c610ec218fd51f7c25b5581edaa108a6abe86af8fd12052eae36242180f10a0cea5ee2b911928fb87183d9474fc8531c84cd62bca6ba322f7e2910aec312dd296ae51819af3ac44f6c2cee3047c99b6d41e8ab8de90b4d94c502bb2b14baeed5489ac01294858020a5be99bb162de99fc8cd01ec6f8e11482b081daa79a18312c2973b1274045f123173e2024f49858ab8c56ef3e4eaf2df301de7803be7fe543e0644228c22f3ea1a7a6ba682f0ff298954083ebc1f4c4eac1f4c64dffcfcaa10db2a4b8cafa443a33ffbea2aa9fd07ffec4cebc8a79ea3f112039f517a463b4633142d546c5c7d9f419b2fc08bd0a8f53552d87cdad41c74220c47ee731ad72e41097b18bb372de56bb7106111a41558f5c9088539c3fe2d72829d85dfe4c8c43fd6f151f5ad4f7cab30d28aa7ead512fbee3259f18c16b604448e962275b7dc49e07dec589904bf6e30cb756510ef2ab70c84f2c36d772116797292a8b937a51de267156fd372e5825500ef4d3abd56f640fd580a6d973e4f0b399d4c88c0422e3d31982d44bde5f47c69d9c1a6719e4f1c4422b4c31b926c24d2ce2c6485621a7f021533e65a004e90330a2188bb2024a2f2936569894fad95db33a02a1e44b051f36c6bac69ed0cd3ffd6fd7df949edff82a7c5d0424d49384c75a7c8d65b7a6d761710ba1ce905f533ea045fb0e994fa32fb732444d69081f8c4a48b28fc475e45df888015dbd04c476412da8a2802f85782e96306ae3aec55deb370c9412def7e1a2803d14f19f30b469af87fc8ed8ae75fe91424b0d24b5dec3299481e63a9566ffaa97b75dd0cb02110816180533a72b203c1102edc3dd49b1f1f2c32682b7ff843fcf945ea195e53c502a89c897a93e9d6945d0bee95530794d639dd00fffd11b16405e400ee604b61f4c00bc0d56e1c21e33bd7d528ecee40a2cfeeb16fd80dc5f4219054215f0843278fb39bd59e1c0232a9c181408b1a7cde83e48608c03a59efd2ff0b089726420d93aaa8c98637fcedc0bec0bae3db2b785dbde2a6fef56bd0fdd593859ca22d60df570dfe8d313c33438e5834ceff37c9cb8f0c68d36ff6fec62677da38b7583e994f2228ad2897a05f7e86b473f1a6b1e6d8196bcfb547788088ff4d087727f1f087c42e5911ed5ce7a0032426fb1d568e5f7b2f762f5b2ad37d0efc5a613a38710bcca0037ce86838c030935e67ba6f50f216dc20ce5b0b87de17ffe64f9b7969d381a5dc37f9928d7d8ff3e2c78eca574ed2b9c283f561cc87673ae4473728849b737a737814e1533e1fe3ecd6d5d606a277d811859eae81c101cdee7ec8d69bc5ecbf8d707cfea4027379c4757ea7b94a2e4b84c8aa5f17db4f0fe1f665c91684a8e8f5f95c52281560e2f43100eecc4545d44f7b6ab3718ca736ca0cf1dad2598072bea1873384baa930a0c26d5378995f16077a7910aed0a307d31a968113a5851a6f12ede9065311ccc45c0933970956a23193ead2ab1ffde0b09852c4c9321045659763e16a1cda4f87e2d529bef6ebaa21370d059ccbfd57b62baad54105214e1b69c4a1095c5e640d7da73b3ca4746b1a0cb16e094e23e421296a3305164cc9a49ef64e91f68a7644e66f8a314edce8372847eae1e432e6a8ff54f3f46e2f7fc12c6864969941958e6bb30e55ed3fa4f6f3fb0eb0ce19267788d5f95fb73f50fe73b0ce36a6cd702d200ea1d0e46fc7c89c97002a3f351250d32e2dca2b68c4e522171d1a10121179140ae59af7c10719e787f034d2e1d2a536c21bbf9bf12669b025c6d52e7225bc1734cb11f9b68af2aebf172e31a4c9d8bc38ff806b1290fb2aa8c3638bd33e24121332f5aadcb2ccb531f03f0f60bde9a0394d84733dd4bbe73dffac03f691603f7d3a68162ebda0d799bf5b175a0f3f49d67dbc17f4b0756da3a3238054ab093da7dcb33540a4ba60f8f52c62e44d79a4c2be05e723812f5241b6faa152289559b6ee29b9c48785c3880c62b6d8bee204913e06f469a827912f2148410ae4b66e8da13a5c9e7b6aa96fee41ea1ba32bfff7257e3529aa672a889e2f85ebbd2ceebe796f9e6eedd65a121640ed067dc21757d4d98e8da7bc39afabebf41934a28b8376b579ba651cf1f142040697431518f6ba0effb2d404919142a18750ce7fdae989c427eae6f366968699628868ecd4562536a663e9550e30d41835269040216ab80f0eed10b3401f488de88d0e25e6bab28c6bb47b34b07d565521bbe350d42a357eee9425908e826649df849e58fd802794128a1831a95c1de9f7f3a07611f7083466a4a8ff047aa87235857f91852980f478b44643cece42488f7bb021bd169dfb4dfef3750ffa95e52ddfa81ddfedd24fa375af60311eee518dac6a311457fe36256fbb084e8938fba55938e8dd7bf4616507beef575957acd397f85fa0e264f06f438d324e7c29534070105581a9b504af4f7252b75ee73df01e17cef6b83b4ba04de76a6eb4bbcd20f1ddad3d60a7129460aee7f6325b5f282e0c692d67e87dcccbb2f7d1f6a941d99558f87f252ebaf28ae7df212055ba1ab39695f8f75348443c5ba95cef9df961d39cafb59eca0b6e1f71371491d54b5d02c42838c70f455fd6d9162c3db0569d6f4caa3620b587a9416bd3d74e98446f172d8c9bae41ba1383732a52f1ba408574c6e57ed9d98ac22e8c284f6bedfe6c573968cc996c892e95d91bf33e82c5438269072220d99618ee7bad0b853da87ded75ed7cd37d3e40d18fa4ee89a7d5350b423e5ff4398d9e3954d38237e5a82d721d32a8b809861a303635853321201d01f221b0ba1d847ce660d2d8ac86a98ff37f0aa41e782a1c642dcdd5de8d42d02d9da9d50c7b561b904139b87979635cefddcc5ee70106406f22a0dcab33752cfc705269f0d5e224a88d350f28417f33ec6516da09b40bf4629bdb291060029cfd2a07b0dd8df08c0b4427a0905616a23e6512c21eabe7495996cef9d175a40003fe0b08f2f2bb75e04ba02579dc16314993d52f44463f7dbd2d6382fa04876431d770fa08668c90feee81fc9123d5cfd8d36c6109d678ca4c9f543b227e236ed17e5769969e153f6588cb75b5494b8b8c7ac68066d9ffd757ca6b6c407d493f08b36afedbc958d894f8d150a0cf06288351da83d9ccecd42b62c61369f764fe42515d3088826854d2154795b52b594930b365a3cff466bc3b780c495e34e34e96f07add1d9436ed5675c66a5579386f580242c105c465b978e04d91178e6abc78b2fbd224cf214a151ac85a9fc931c05ae25454e13863ab1c7d164fa0f30f14b0c6ce00ca9449a5aef3022b476a431f05f9aacd7e038f5d8e1b128337b2c2fb3a828bfd07c63d78377fa784e168de8226fa3f2aaab972e3b054d2bcb32bd738c7225d9d57948059f6957456b1afa5a4c2aacea406706f0b8ca311ed62f02dda28d524661d805c095319aa1affd2217bd7004caa605921f4769faa36d5600d0d8ae1de4d41802a565ba61fbd50da73dc9fe82462bd914be0a8053638deeae4829d73a4c32c784941b1601ab30b3c66d8f061111430c43c95f9bfa98ddc812dd63ace89fb4ac7be7f47aef28e8a647360f428f96b57877c3f62fbb9d0feb78d68739a05a550d84ad3c53fdd7d709323cea9c849aed70807e7c75477795f4a92345f5ab979a239c9415e26e4572f1f9debe502e2ea6f5254a31878a8b06f61e9130636d8803cd6c8d92690eccc7cb861f6c90520ce7ae8bde5316801a211504e526cb71bd9d348314b9f2879b50ee8e198625282c18e26cb7fb0eab14992822a9da9231b5a6f19d1756d66043a0a2f426e346a5f2fb9e50a9d61712ba4a1ddf216b7c21475a0bf4f7769e0667da429fa46ef8e0778f07a8f494a70a80e6b42385daaf461f8a7444d3898c8784cc4441a65e8bc4de7c212d140daaaf698af9b220930063298127a2982ec6441a1d63e00f247b8ab62f9f5df49a00a39e222be866cb5df23a6d80e44178f52abfc8396ddb71e574c9c6a230b8959f2af85ac0aaba6e681a8b4a8de88532bf7c50524779c3c3054dc660a38ff0ede4fe513d7f71208f90ae9e5c1fbc8360bdb09ed353ceac933004a9253abbd76caa360ec8f1b0c89c167baf3bd496b9e20198f9a509a7574456637182689bade5a848a7e8466d5f002b06945e2bf4cdb5f4eec95af4f672a71bd6a7f04628559d5d9fdc42558702466b38ca51a10271d554dd0e4dd5aadd0f868b2950691080201460e3d442a264dc382495a6c7441cec29ef226ff04a2aeff27a749cb3aaf5a94ed2a65cf1a70ebb8a5310cde5eb3e7517ac1444756da8c1548a8f6bc136665e7daa303b66fc6242add0108bb6222d94d01b835241201fafc4e05842608b08e76adb447112b6bdeaf785ec54a9736373a8b9a14c0e47e2c15b2344c51a568fec3daa90b9be1e3da6944860db9bd8ecf416e58cb85d64a48bc373d043cb00819d4671e9b38a56ca5315d7f24f6e1f0ed6bc51ce230564ceeab26588422efa96db18bc8049ff40b4a8d7dd2face06c16a7a2589dac5e31bd919b188e4ee2454e015799ef7c900867085aa15ec545aec8670efa91064df376f26e247ae6f453fad269fdc5be004ec7dd6d75d02cbc11fa43667fa6b50d2d200d88323ab90dcb287c3506929e7321c238ce5eea6ce81c743955be42de9b898e7e7524fc84ec344ed33a3ea9c689c61ba7c297898ce46734d438e9f971943b30a16f9c92d0485519aaa5f057404c6fca1f823199e457b46def1ca182138e8baae654a5e4bdcab984235a1be231a58f94cfb079a4fd0897f92189a804797c4a9de58c3d4fcb32b1c4a9f222099c4aaa2d868b9e9acb7144698987772e92ff5c855bf773a03cb19f74912c7027f22716de829b94ff7fbbf14a0c657fb144fbb67614b78114ca99081048d991b147508cd922c7076b56b62bb20f0c5e9bb28a588d094df6b2cb46f26cf5ae766c24645c56bfd26e805f8f8f867e30037fb09ba805b88a9c69800b00281aaf089652f29000ec7f26ee03984f0bcfa9f561adff6043a1c453c886812d8b471b7967697fc65d99382fd477aba9adeac8395677d5ec3afa17053cc6ccca716b94c80b573acdfcf8a3adcc4897802881817bb3868e612ba1e98efd2b197ada716d00be87bdaad70010a36709c10213ed446682fc510528351b54622ca8a201660abb097c5b56fcae22aecc478ef3b59b24617dff16219c822dfa391a9666bed538fea0528b2697e1a4f073b67466f4f51c05a400eba04d53a65239352bc0a46689ed14004019b744a7ed98804fdbcaf747eb2366b9f2a70648ebf7e311a4fb18f69deb511e0192a73f08207822d4fa537f5e2d3fd3f4b7e3cea039a75d078e915d06a7db7656991539f22f5bb5af6e67ea3e90470b497fdfffbb087e4b30a71a3e77e49f141fe73765c8ea104bd778ae4e0dd2ff2d79d3ba90b1886a04fc114b13b5c839b03a5a054810fba943be499a59639ec27e6303bbb934c26468ede63d1e20a7124013151a376e0fc935bc2ea74da73f269277c1b96978aae2d9d8ff88c851ecacc38a58b3db3c01b6edec6f9148540ad0c6cc36e138177527dce8f8e204d92c1e8a0f73651629c2126e94aac284cc80995256f0f1d0bebf303a7c103cafd7453b518ad1c0a9d84a1f7eaee39405e387157f2f78829f3288cae26c0c4ea278a2189986fb5a2219de6079d7340a710d351e48bc73821070a1a8349784c69cb12f450feb139e8c57f6a7d0b71fce30c41e4e874dc35276a700cd0d607328d099f71ffa5271ffaf481632e6c540a04b9bd6c52bacce6627db26203f6d442a6f2b0eff173b3d571ad71659a259266bcf7dbe65b9466083a3a44ba05ee072f83cb07feb086bd856e90f1968b04c3818be926dbf33177550f3b7b331cdfe260eeaffe27c347b6ef132670d5cd09b774abd7d507410460033f51e31702817ec82a2b2ef07bcc685deba0139a4982ef8f6624fb7f0f9dd45d32aadf35c83cf088047dd0de4900492e433ba64a1f51b2ba6136af69c5a5ebe2a06133b740479046cd5da9df07b9f5c8030cc7c264c0ff41313478c3975ee107ced60d687207459e678499583b943556ac08fb8d815049475500922aa01875d7fe67d245082a512b74278dfb98c9c89de1b4bb4ae44efa2a6ca3e40735df6406ee0e962810c76cdb06988e325dcf716c4f441a819706f4ee3afd5802b02d97204f97f907f1c1c6810ada2794223a0d984f5d06358a405ade5e7fabf51752e913db13a874a266c3a59f1c6d8ba684e8846310347c754cab7149778b9222400c5df21ac9334c9ea1f1600fdd8576ac4be54e6876e27abf93721e0d111782941f946c0b884d9ccfbd0746a8d99003bbe14a9b26a397062925b19c32381374d564082da30fcb7ba69cc875e44cf42d7ab2bb3b8c5450f7fea8162a863079acec930dc9e721106718250d62f8870993b064203795c7fc8bdb21b69378afea5d1fca4cc4be32998d39aeb9a20eda826d22b5e088626eed7cac7ba1573ea17d3585b5a4545d9ce0a3112c860179306910759cb9facc30625dd6c705886d4ff20e263cef2e5efbbc1c7d96756cadf8131b740c68eb1144c72cfbc84a6febb44e6d75210eb2ec5171a39a4fb7a6d30eba5275f63e0771c402d4eb2771d379fabdf289b93e8e517453e3a8b7e4ab59ea9c1806ebd6633d9b5edddae1c7bf74f0adce3db491ac37ad2fc6265d56e4d8c5c03cd389d64fb7aa72e7079428c3a13b8faadb9263a33dc7406fb4f160bb718fdd0fb96e556e48b21a9babc9a95581070d857c0394acdcb2b56bba410946d19c064dcd47f834eab04d179b516802664225008980648424f1bf1b6f0989dfd531176adfc73c891fc69eba5b40419cc180749b652e8ca052b5ef8dd48070b8dc41fd4894876a2039634fe14f8e41b3ec748761b5dab84052b9244b155b89974113f18590f5e52497209b5aacfd2fe7815d84b9a967321076aeb97b9fa4d17da2981451bb2cbda73f965f34e3a38a0a8a2b594857b7dc364cfd7c8f913e996c01aa2c490b730fee2effd143ba217b1887ef3cf65b7675f7a2c89307bd1827cbb851e1631d0c38bd1c97debc2c7019c2a7f372fbc63c6e7bbe643640197e633281c2dd91846bf52b95053aabe3840cf684709df8fa288af2961253b52cefc5451907f01cb70a29acc2a26eaafa2df20180582a838ad5ef163734849edfcbf5c4a9ce8181b9f5311618e1c0fb8913471c14aee9942b0cae5d701d24ae40d35805ce06b644c44aafcf827bf59b0b1057449da27a895ab16c2203a5c10f8980b56ec2f73f1455f2513e28001e8d1fe14f43bc34d37f6e260fae20330ec0e114c1c3d4891ae6e4d5ab15141eaaf8de9de03833eb4856e2c513f97e29070ef2de312a4560f400597642408e6beb1d3746bf4bad488bd946253b7bf29d5d27777612c7b82272eddd8d0a93c37b6d276af528f5e77099722ad5a142c648ba7458f1519c91c2bc597ec41cf2ffeda7472db597e653394d23dcb0757a59aaa211d574b44472d734d9ef650fa04443d130bf269c6bbb6ebd49e2927519fd7b7304dab46ac1ec501ee979de175aa9242d15cf85675eaa6353020fa750a5bbcea78a764e2d0b6b297154068f322b193e258147b947171dd4b586d9215983f05eb4b49b73679d182c5d663e3f3f5d33693901dd101a49e076b715c8dd9ae0c7f21528bbbf6e830151c46818efbeba24c24e81937e6a85d98ef90a9517ee89c8206193015f9cca5e2df1b4b9b999eea5da06d1aadaa9b897f2c5901748366099b6428142c7c3bedd262141cd67d80281142fb3708da5a64393226b8f317896bb0ca5628deb999e5719d4bcf5390a08f163b47df116e25e4d35b46b2b668faf7674bdb2e238b7185e71269992540a1b4f955785bf8519641a7ec2abcf83a86175fd38ba08dd40c945d3803cee25dc4f577df8d3f6900198d02f06d0e13504560254cf08fb0f80b7a99e3876d22004b5d7a101ccfed0225d02d4ca048fc8e0169f6040498f49ac0114e62ea0928cca02b65a698ac3a61824ab83c07afd6afdc2d5a43d10328f71d56738f01994b023b475ffb4acd59eac5c248d71a87fa691cd00314b6077a0a5913ee06c586230893c3f23a97163639bdb4734584e016e2658daae23346c65b3f457da5284eadcf292d270615bfedaa90d1b0cf10866e36c6cc85bb08a5574223397f40ed2df6a54b0fd9b4a8258c20d9924de7b8ec26df0285782278818485959d1c5a9cacbad171c2a798963962a952af62b713066a90de07f1840501cbfd297bf303c81f304c57ccc54747e41cdbd4a86c5cec5e460664afc7d800064e21d043e4986c0a8b0e4bebbaafd20df5eb884915e48ff1949e5cf1129b98499a5a0f7e65e0e3e20e4ca58568bc42ce448b89406de1ba25b54203b147e689df31ad80e99201bb2113944e048ace0e684d68de8c93d63e1e81065c4f8c920bbc00b6a2039f05d4350619379bdd2a07bf61713b0554563dc2c0ad6832b2e4cba12cc3930fd70266c385df0d293d4d6f3fc5a241d315a65d6110969540218fef38b83a4f5e1a515904e36e76667abe78427f9fa4d1a775ac14be211cdf309412b658cae0cb24b14ff1ed66ca9c4a0964ff74a075a6b5b76fe8deeb25b599d888822105518ec402dcec672a86c6f05cdca9a18aaf971985b68c97a0315f839b105183537697241dfd3cef63488e9e0208d2c76e7c59d699f9481b2af2d3a4db7b8f1520e1eb7f085b2132fc64a382dd1126e981d7fbe3178279f87626576f904551f2f9f2c028bd51effdaf5b5208da8380c3355dbb4d670455975cf222373748205835dca2b1eddc3dbb391c833a3b0b909039b3c3ca58b36545e5ef211f875dda2c91c1ccd8df260d23c38156aa2838e8e93985444ff4b774c8ab87f010de4a71cd4ab3c1b17ac6f1f88db7f54eeef85cfb09cf357e9498c4f463298fbefa6d624996d6bb2945682977106f92d7e67767566efe3dc4206ce24aa6614dfe3b20c0c941c47d6eb208caaee1b9661b98cab646962705a0d2b8510cb7a0912bfd4ff68b021e4a2a2f2b5119d325633481281c426aeaad0f108f532e1923fa4a9e1905e4895c3b38e8da2f501211a35e36b68ebc6a667e3cc292ea2c9b8eeb6b66febcbfdc26f27ce9cfbbba8fc10e1707d9e9e890eb7690c391e1ada6c26fef0da4296be9d057428ab4722d340494c3d8569af82527a1f3bb7f2544d165fd45eec8c70fd4ce9a7e976e8413a8cadebe35115118808770613337851bf29047501ec6d0e07f4efab077c09c549186cb9f40128920913278c28a0dc26ebd8a586d96d955411c0e2173e16dd4ddc114fff94f6f9b9005ebcf56e8054ca9e1228aaa557d04d2850ffa0adfe28748d274928a3da3639b10f7e54839eedfcfbc815c0f68e81f3ae0ee944b8cc2e292dd977db89d2f46907bbe3e1b108971213433fb13868c6222ae86bf152155db3a6eecc5ba1a56e0bdd3c0bcb1a224ab24333952c1b99db26abb24118eabc3cf8012170bf877dac223916cec07adae5b029da67f91857cfe282da2000de1c74e922a4e09548c6a26a23db90096237d3395e8d0cd34a0c4221d9840cb4d4bff48343f3ab2d88e4e2d4241327f731335e041ad73256a5ea39d1ec03c06d81f35cadc49e5b27d626a2a0515dd561b0237ee121f402f4ce4041e2cd6da24112fd107ebee0b77277d1f4b26f97a3c948569586d20affc32052f56451c1a4eaac2925a7f031b7e41e8235dbfb8ab5d32647e4f594c226d2205a0f57080f00d3cb2dff4aa2ba0703de008c84dde901bdb25b254918d3d6f1d4b55bc5dce692715c8a934c0884333b325a2c8f0875374e8021b034ab8f8182669b896619ef9ccf28d0dc1c464420391f4c44dc0a33eefba10a65171cea7f72146ebf9b494f3edacef9962829ea63e06e176f729c14738ebc0504c53aa95b73735b14f84c14adb291076a36b3bc07a25ae644bec1ca5410e9b7bbe42d162e861dec3d362b4465215be93f96bf2288a8fecb8d4e596d99358653930ecf124d3ec373a3989d84cbe3533a1b5f90a734b57bdb7a6737b8f758cd751bdc939f30c68006d51cd71c8103d201e48970c7a552b42b3ffc34728953831095a712cc3f82c50681f0c9ee6259dba6596e71e6951683ef2d7eda2b699a01eeab48b961fbccebddd3a2f72caa00d0d6a766a8e64a6f052cc0815515c95ce6b0a0a063e6d489ee4aae82f155679cdf8b60460309e95352c04e8f0026e1a7a8f96b393599e49a9dbfc4a833a500c66232ba4f55f84177e936f4d02e5040cca086c5717b66d52231ea54233c17f02047da19a139065a4f0c642f5add2611590d923e886754df6b657b26463d001a50059c0540152406c55bde2e6d66dc83e47f6ed7800af950e235080b1e9dc689a9bd4939056e3c5c08a60409fee294c442dcec5894c6959ecd4ae1de176d8c82e706d378b02aa758ab8d03949b4aa1942b264152ed7f45c246cf111365d8dd984ad0c5b3210c86b5db647991d4750b4c5178316eb006582ed26f1172c2312cbf9e7d1fff0f2b2c827ade88144378f02357987a0bee94c8983149f3afb2a624c2b19cb22c18e93c95498c0241bc9aa5463b8793d1eabe7d7e11d34c592a1f529fe0313857af97a384a0b0dcbe0ef91f25b6b54d8f3ae45dfd85751ea5da71ce604902a610ad438317f71853561ab2bf1b100978b1bf313bc4437f5b27448a7c951cd378f8fc5085e4a440a214bd71622920ce014e6741fccb47537dd0120e9d6e9aaf94970395421c8ad3efa796af6fa22ab6c588fb2aa8a83ab8a53e4b30354076d9a3e924d258be9dc0e5958492d80ad3501938bf56b83b3a97888c572063d60875a2905e9ffc1c9849218cfdd1f5b2607a05f7b9feed07c0c0fef6f0c90389e154e9b0b19cceab5837723b77acc78d5130f5514e78f9cfb1ee56ff8c6e893f18702ede77113c55acdf19914639dea2f2bb825cf8a9fba46f2ee8368e94284b14a18864c913084182676ed66a3ee8f88faac887c096a842453da3a73d90e5b41306bdb3eb97a035d198964ec8041b860664d11917488ae2d58833d951030989b622110833cfd29d097a42cfef3ec34e1e1aa9869e339facd9041a8adda23f49cbb04b9e630942914fd63a74ac94a6d6d1eab278fcbcbd8ae32a14fc012252371d4901f40a912c6526b37c43812964732dc61174f9a317b247ccdd7a50f7696d5a52bc0a2294855d17c53f8f4b53581cad1525c5248946ff49c56c614bfad52f4af886249ee369db7b53b6227b60a212ae7760f9b6c44be58de27bd68956e6ade2a882d592d9fed9367e916af3c3ed3786875b1149b7d21986c63469020da0db4ae50ab209710b21a9766757aedee812868a81392c08a3e2fac37ca095c77e794159a2d1442f8d2bf21040962fa9ae72eedd70a94bea87387353ecde03b8bb905afa6625dfd38f3b3acc38637f4a41b803d8a539b1cb66ac2d1791278b4894ac74b1f668a232430e635c1a83c7102c7aadba209f7ee357fe7510859529e4b6beb955f26c57c7448704133f8a55e014a65fab665c5ad2881275bc6baf06f678015c7807d20a7b49ba87001349564afe31587693f34acf33f4cce38855603a24a1e7657d3f4cd0c324152d0b2531d49edf712c5a626b6f3965fc8e23fd16a5a2b8187e8ed9dd7a96f018289d9d8e5f00cdd49f95a79687c69c73aa7198aef609b9a371a4eee99196ef93e3c6e212e46fb37990e27cd9af2c8ec4c31be4f4d9228fac5f0c8fce625d5ce5e3f05d94cfe7cff8f24f139c5a0b6586d25a4e068c9aca9a804c6770be024e417ccfb9690006680431fab15117f66f3dd39e8937e05b72a08be93cdcc9274e687ef2078cfb2c5fe149701b4b62880e53182ae57a12422c0cd90d345f2737b4370a03a8869c4acd9202b426a26255114119449cd99b2c21ad5f29e9d6dc869498481191c843b1b856319fc565ed649896dcb13b4b644063a1037b9efbb02bdd341b51644d6e4fbb9603b7462f5803aac91b45e7254be20da5042cb2bc009887d864c9b9a7e182046e85d52ba7656ed4493eb49ce3c086527971256bc9536af9b248834f1d47bf275619625c28407eae14d261fec9ab8387d517c37a883703628097779c95c34021949d2d3bfee63acb6dedb89402e44a9d9c8b08429e15e0ef84c3f5977ebce8c136bc322471060a9c25a603d560433f3dcdf98c094f722ee2f58158f5a945a3ef4e1363ef7759be5d5d449091ed74939a635d8ab74feb90b7b28efa2231b7e1c5de280bd87007deedc284de6535d1fc96da948336f0af26e5c3de19c4389247feed59324244840069cfb6fbf7319c4a3a0c46789406a36c0aa31fe3f3ec57e4502a7945294b74e0d0d4ed35f59fbdc9f6f7cd5714c979074aaa50cdba4a8cea679ca467eecc3200a51dbf947bea22d4dd515fd4ec6eec3a60108dcb0927880d39f59a59271c1cfcbb7a5b46e460f5b5309a4cc375e1358764ef0b7931fc0d813ab925a3e544069c8a21c1cf3037df1d5a66032a76cca5ecaf2cc403d2a4894005853188cd472d867cb466e860e5b4c31cbd03a087405b051b7271aa695cb2f2392817ae4bead2da458de400cd043d0a36caf90abe70e1453a3c220b639016b9420ee47464a20353a40765da5de64b033edb81a07b21608d91881efef5c61715243adff81f83045d0431f2bbf2c1980fed399c8ecd0f22263c9520de4d86d102b466429e2945b8b44ce8af95c44e02c2e838b25dce7a2a5c776b5b82e1f613fca0d75fde143b9c0f70a3b30d330b64c89729dc07329e806c90ec7eb4f5f45522f66ddbb243bde6776b5ae77f1e9e2253657ab98650c177d51915eed702f18c4324d3051d7315f9b28915e1d9ccd92f9d22488f592c4faeb4539011d8212a6186d5d6c69c534cafb13f62ec6dd959db897c7ee12ca7c91bc452db1ce99841e9dcaab6a0076cd2c179c5c1866b5812f88fde2ae6142e580e9173d8a79e109cc79d4f4835f5ff06a95550e882210ae319be0e5f7a55b22205434d6749f58bc42e2cb77bf99bc94c4efc471574137d2c9b14ff8aa3326d72edeb5bca67c255ce22981516b8a41043fb7cb780e70fdd8a577d131fb0d14b6cbf5fe7399c48aa70b1d745011ffee6f46de9da69e550c42b13ca1d8205ba9e98a4fab333eddb44d8c57fbd3f90dbf54e7bf52f7eef23ee6b76404e5eaaa23c51e42ca612517f62e5b3bd6b543167212d54cb5a5c61adcaabbb85f9457377905d73b653f544c732c811d8479760d568b65bbeba585db255bef52c508e8cd6e36f5f23e79aa2761cf14b7d3312568ef52e1171da26339a9882442d4e28a62a3de2548486297d7fa45b7e6de2a7d088b23ab14fe6c976be77a0abcdfcee29448aaa385a859b9181abae63699d1bafc352a664fbc51b58c1f0e739a70503dd1f1b2d2cec490715f91df5604995e972068f50041331fc42b6a2d1e27e23b7bf89d28fa621a5974780d3a34af33690c57d5bfa14900da1904c6daee6963236e926f254f9403e7dacfc3473c1474323e769f19906875ac2e364aaebd60b41a7e57005b34139096dd385ed814e97a8e743d536fd5c50534c4d3b0adc9bd25fd3b24dc2a6da1d7ec1a81540e4c3eea27b1ff8b4278c316e41a00f1620791ab8f6dea0a5bc09e4094ccb208ee6fc2059ceb5ff311017a8935f455c0f0eec82d89aab872ce7d0883b250ebd861a4e8688966569fc6f24052d503f6eeb861d94a5fcbca7f206ec5f9129e9e671191fdb64036cc0d485ad61b951a2515c33218c7002ea139538b2a75b34638a9a7332ae5bdb64f5136a4606e69764147ae4c4afda64e8f606480d009e242893053496cc599900b6f4cd5c57e72ba4a3f8db7a1b6090e86b147a2c308704d80d9d77219a91665df762239c4b6697b87f709ad1d122ddeddb6c8bd79e21da835705a716278107061c3fb0785a1235458b6a36b88d0c945b476ca87c369af948f66b40428ac7e3766eff6ca8a99c9ae7cf1205cb8b9153509805862380f48246200d9f2d8e8b544ec2364af1419480c2d27c782aa6bb380a9a91d7011c1c78f214d4203585a1455bad0c21b54672da84c7feb14854b9641c0606c05bbe42a1818d363ab2e2323566a0a4a82ca73af988b3b472e4847d38ae0880b59cd538953a5eef2442dee106464394dc6569df6ca6a5662c61814a4fc5c6c6d78413f9da82164e4044b50c79b8f1dbacd81773335dd9d98ea609584a3961cd4788f3e121e2aaa006a7579aeff62c1d4d5bafda4009b6b0d2007c442a0bcd4f2ee067f94afc7bb5e7ee8241932499cab91b884dabe98ee41628860c88d9ce0f531e912fb2ab29bd85ece44c8c4999a135750ed8b76ffb56fe3065144696f6601c3a2f30ef257cd25d9d3f62d9015efe3464558da32359804bffcbcd0dbf403028a182aca7709f6db8831cb60459ec6b5aa8a761b496bd5c9aaa20b910b4e5db3fe1e4149d17d96e9b9543250a2300c0dc519e913e5bc2ede2ef381199b39b10e2482acc7c826cda4d8a754d936b13415154ff0a141ad9c6b0380a143858a476c8051aa78d936aa0937098d18d1a07e017a551202cb0ccd5fc7c0e971bfe4febb7771eef7df53bc9798ebce03314cc5e3da5831957d496d99e05703c0d0157121022b5c6dc34956351574ca7af0f7853900d62ca10ad8185280744501619dafd10f193ffff5a5e023b3af807aaf220657773790e29465fe88202e571123208f36397e1988f48e5971c51bfafa5da46e4d24838f95813bcfa8697487b3bed1b3a17a95dc412c6d691d70359900aa9d2824d70474c3a02660ac6a67e07584996a9a59aaf41a1827ebc78e8bafaa11a8a0b0a9c4603b097eea609e86fc537df7d52db31d5c54ec900758ecfc95feab6a3a293b14e8945880d88900502703f32671700830e85ebbc9ed094f277bf902f409adcd039c28ffef3f516a85eb7439bb40db6d651d7e116f08811beebb09815c7de33b526051a74c343ccc6b7cc28fdb53ae5bd150648c2673b109e88c32cde0e08c304061a23d052feb29813c679c2fef82f57bcfc7bb3d29afbd1cb1b410838c6cc9385a3fc6a75ae1c449e1fe868d160f080068cc8d8e46697c23120060907feef2c5d485be4b96a28c458cbb76a639953f3b49dd444c404be00382d89ca6f3036b434f96809479e04bafd2c9ef800341398f49ef26fe9ce6c4f003955c4141b6a8b2557ded7d2223c7414bc7e44e23f92a640f7af0dda4a36dfc130c207a89ef87c91e741202ffac6b993226d28b99f75721f0b123fba0525b52f39f53339ac3dfc2f3072dbcf1a485b71ac71dbee9bdea206d711e6707a3c2821d9babfc680b324c619f95e3211f289980f2e6f79bd044d963d9a36cf64ca4f9b5c08e10c440561e43464b5d52f0248067b79fd1fa9b28cf3d52db6c0e4effbdc1a1d9162326bea5160b90466e2665a030f3e55a06b9f4459ecec5d9e3791e5033145bf0f44148fd84eac66806269612a4b5eefc7acc126e6760387aa86b0947c50e0fe10557db5613c8a0ed9a8d2243f83ba4d444acb82359020fe7fe8f9b1b573d2f661fcd47cdeb236aadd99100024d1972b550ea184a3b237f64256462e3b48cfb2ff9fb831af2716301513e5e78ecc5c86d0cf05f504dfb24b0db08607d653ea31455a844fa12057e945643402d92d8c55a309f7610f49f5b3bf73cfe708c0e2cd405fc8071c7ac09f030875853a48ebcbf8be0a0e63ee236bf162a02b32b71b8d5eaa0eab46d97ab23b41e9e8964ce5f9804dfc8f514866e2566ead7945931d1389fd646c0db5fd6dcacd0d812475950e0066db69d2388401597f030537c897d1b88752416aa11294a8f8775621b977fd23f3ce624f9650c29c1af36e20e2d49b18d159fea57ba70e2c2c17ddf08b45826cb4ac4020dfa54ca13335087c254444232610597f2d22e8b22defeec49171c448b1fc0612969f77cec00f0687a7336991171ccf23724bc25b8fa531d0fd3eb5e6edfb41fd4fdec61aee0e4a8241c10c2d07572cc8dbc322098ebe4af47ab756888392c7b0a4136bebe3447a996ecc25b310c7127506701edd620893f1d5989301e9d33b2ee8ab82490cf4647c628230d365be5d1d69a00d4dd1995672d99277704bd1670d11d6838b5150f3e8f4ec85869d5f468c18acdc04ecdec9b7d64105f05ae5106e16518a5ceb5ea92bdc7d8a9936ac980358dda9609d825bf30ea4d6f565620cc9a2acad44ab870ddb95e91645b6116130da06fa68ecee5f97b515abda9b0a18595f415be17c5e3e3fee9c2cda1325a46ef5d10cbab82881942e081a14d312d09c8436064f4c663ad69ec995e286b0c5e839c11036ae2d88a0573fff1f514ede44493afc19ca0d4b343e37a39f53cc8994f9cf23fa14cda332ba14ef5045157e723e4f5901cba296920ef3852631c6d6685902a7ce7ec0e09017deca4a2e4d082505f085fa1e946b42ca6d16ec21e8cf15900c17161398825741765323b592098514531b1c8e43dd45281ffb2515a8274e6b47a204c6fb9f5197159c38b7b3a9443d849f4631807813fdab448996c04525f85a3e9fc0fc4bba01f10a02f49ba3702dea1352a66d87d3b7092dff0f614343a45740fa4c090d7baf96104ac40a98dc75075155a02867c3410652c05910152524d2db407ccecc00e25f97d2a1ebc139a83a76b0f123132a532193604b675a98a2481a0a543a215c43fc26c0f59445f8832ec7424940249e5c05ecf4d66860124f23ac97f7b96bee4fcc81bb61bc779b164193d895f9401a3bf1f72a2df5a494648f0d379007405a32a23d18a4bbb7a5dc0157e42dfbf0486434f945bb4da32e19a349a6fda7086933e5cc02021e9dac08fead4ad51bd84702d611730a976f8858cb802727b16733948e60ccb50ba458a01a87fb12182e14bdf0d768fe91c39e99b2921637c86b83fca622b66dc0182b48ef983f30d1133e360a2203eaa83bf2761e6db467e677b2188064176e7ec1b69d713d1f952b142b82bc8ca91f4dd5a7d5a6ffd8a9844914037670710151534a6b702b2ef6eacc3fb152c97963bf1e6c216e7e4c74d2669bdaf5f834bae833a36eda21b9da86210d321f39f44ecd8c35923d9d03d8f09fe438a5146e8fc6230a20e586f6d412df39c96081ec9a1d25a380b7fe5c8fff44003d3ef892b3390746a79033b46829353af387e3a45c3ba8460b4f098ac21a75297065d08577f6641c61726ace0e6276156f9bece2d9923df9100a12edd0989e11a92181f649c9f3f09829972233f63c79c6570aa41d10ab221418de06e0bf05212f220e0b5e3ea890791054b5ad5de9e19d1a47755ddd3ae0fba35f3a0694d2946ef7d8a18a30c21572865f0ce4788b1c82c6c654592c975e8354e06c67fc5fc9d475645bbfb6e5b8d971bd91bafb3c395dad59cce599fada312162b5aec6e6647ec3767b32c028b96f631bd53b667fd682776c7b6ee4a50fc1993611d333473b73e36ead1ad6789c5c43ccc4ad2c6dcf698582c8c43ad23dda8645a8b9e563bf64bbddffb11c3ab14c5558861e5bbc4e6286a1d5c0d7499d691e9cb765500a3a20bf4cdd81dffcd652cc5e0a245b499ed28ebd97eb613eb934db7262cbe4dc4508f1d1a7b4d7b64bfb1f5cc952d8f931823fbc3e4aa70aa91c230fb7bc7958713635b66f62394abaac9182e495796d98fa3fd74fb1bd894fd233e9ed3cd7ebb2508559bdc122a64abde15b68ed3d6e20ad0f426f3b685f04f075cb531a0ddd44e8cbb07ac90b8918b6832d9518667fe681756473bee4a58789a688bae1fec7cce4c83669edd17a489278a444e57b318eba5b083d06618bcd8a3c06fa6e5b44b0d1db0b27af2c26c2ab6b9d4cfb4bc7fefe0b63fa44c6650dd545ed935c6ee63b554de5bcb4d1484ed5d94a78b1c4675a2837f2a73df551d8e5030792a5a5916f09095e88ad96288a04f4c656b556173515a5413f96babe44d7fa3a6da920c6355cd0448f48f0c18ac80082e7156c5d2148a078a532bc9ea558dc004621d3c3685819d3a6729f63dbb5479f09dd5855c844aff746bf49b51abb7c4431db339d27e94a1b147b82aab635c4fe72d435534fc74939ad5b425837c48ac44a84dff942bde64580023e8d1e1c307e64e4e316d8eee542063e0c604184bfad04988b02490f6018d9dc48e32645ba035c915d147bae863732b0a075dab52c80acaf358798a079d59888cbaddea54d7e22235215c5553e5c116b35d457dfea08122a78b37666ea8042698f8780d00f468324833927c70ccb048facf98e284657008623ac392792905ababe60ae7e23f6140609a78dea1ab7dde0503146376057bac7b49fa395e8e7d2e84913fbe106f8c08003c09d428f43986ab6e2cfd92d2758acd7edb97f40f59281a0c55e8b7e4772665d3a05fd2541f8d88a668db4c1fa5ce77836d0c2fdf46328438620af31bc18666b7ba82ee2c0575faf074e5f21c3fec8fbff70c178ae6eb13afde888a36fcb071a51851dfc66bbf3fce56d23d0faa6665cc8300bdc0db3c8b7e4356abd58e462a4d23c66ee8691c288059ad9eb3464eb8998010c92a4cb119f77c6cda98265986f016d5f6ebe4252453f068866a6dcfd92d935525407f42c1b9c8dab2cbce8d200fed88edc8d65316899f09b06556370a7300ed58b36ab7741015f44893c6ad0de97e831773eab58a05b8339f10847070562c0893c96f18e2fd24d43c9ad799b2139860276abd9b71e8777b5266e2185d2fa1aa54d62760777d0b4d11e3bc7b856816240bfe571d4f17299a114c27a969bb0e6abf54b7923b41c00cfca96c0882521d3aaefb638e2eca2e04d351a93e71d7998ce1468dbddff0b96e594bc27d0b844d493837c3c7534b827f1dfb09690412249286d25deefd9d74e3b550536ee9ad7640ca814251f24c91652dcb37118e152e455e642c68f69856d808e92514875252a47da2bbe62402dfbf23343983301219731091a0c142982fdd8b38bf3158621f4cced469029f0e76a3960b9c4a6fc356031859e4dc998249665fde64a1d21e59505b926110c48c8323cbe6a7865531899fbe074a239fec1a067e2e55c514754efe1ff9084e724a3acb69933131ba58e3584303f3525c0568de010d2c8712eefd045c6e1a8e3f8e8fa468694caad25a3f4deacb0b559e0c3ade96774a9902bc7b72b58838d6103591cb8d8622c770a62f8c2b2497315b8e81431570ee022ef332f543c091bdcc0aa246a1f0585d5c4b53641d5c53efa46a7adc81a09e17a1a1b97e363deee58b47be1c119a38d238b2e9f9d34d99198b86efb75da26a013553718072cf2b051abe18b942c7dfcaa5edb911706ca203b476e5f07ea4034ee36885cc78e5f92dc2cb64444e6b0b98c0b24ff43659b67c3633275d668216f37c350b63e6b92b6b1d3098cd2e60ce44007848c43b535401843b443e4b073796fe4c0280435afd71256717a84e1f2870abc73fb59072c3b1e65678f009fb42bc0632c1343581992e27ced92fee1c09d7a73f397852f897d4e36105c09a8493172ee3cbfac01ab5ee6b8bfc51050ca86f19e1a2fd2c1560a29637e903be188603ef72f75b28f1f3d7ac5c365cb2c5d4a7978a28c55e86ce7af129fbdbf745b2bfe06761c9b05c3610f6f35f9e91cdb1168f98918a7b356b1f2901288c644b0823fa887d8c44340303598c060442d5a58891ea90de5380248d264f259b7399b7f41d0bc8455b20a7bb7453c1787d6003498c857b87abc8f4f8cac266194df79865fead317205ed6df2996c4ccdd39c2549e3b0c7c401cec3969489d4c774f4c046f391103ab270d8af4adcf0931fc5f449390a880e195f88fb9d28b01ca9b5ff4eb7741879739e9a1d62c9fe40c479bc9281a37a181a46cdc5bbf6d015bee3196d0d4c1efb99bfdd84103c5827b0cb3b46a9606b80b65d0a77c9ff220dd480b6fb161fc033746f57b1b6405d1edc7c95c9e3789aa79a74e6e995370c76ebcab9a73ecb86bb80afc8d1accf2bf7ff390817e94af23f9f83386325fcdd99791aec9993c3be078549ecb13b2cdc43eb3bccc91ee8434d7f457219e4ab3576c61c00173a1b68e415306571c15de464357f3210449dd0bbcce112e0e4f6cb72925f772d15e504606d9fa403d1dc58d441e6048c71bfe0cdc8f2526a7c47a18e94b4738004ec0cda7ddd22ddac92b6dcefce21971ea6ef58e38d5a0de35bf39a7d90200c4730c5af2f0f050917b94179ffec668925b8b557542d0fce8b5b4f4c6498a681561c025085e2c2a0410fbfcc6d8173cd206480ce7c967391fb3d78f9ddffd9f3497ee3349a97c807dc62531a1f4185bc32a677dcd683cb113b324605cf3ab4adfb7e5660a760f9c0c4f42ec41cd42b81b65226b5270a1b583b61ce640ada1c947414f3a231b36c32a601d440ecc264babf6d1e1f44e53ffa2c65be0caae00d64ead1b66d993d75d1fa6717c0315b3563a3bc571074bb941122950773c8f8d06d9e7da8545e58435621ee4b1db488e2d5423acc486570a7796a93ca39630288807b8e31eccd2a012e44b6513fb6a8ac2e9f372e500cacd8099980bc78353ab5a5e2210950d5d3a14f1b134e42c93283e58860d88822c10fe39ab051218f9e28614de1ee70470e814b794173a4f33203a16e86580e93b90e44fea8ee42471482f71d22930dcdefb872585cf97883180ba2147a215d6aa2c012d8d6d58d09a7ad5137be8e4e72807b4cf2baaa105450bc1af8914750220e1657011f44e437a8ac322ab8927b72fd75febcf244642684d56cb9d403aca4a133c4263070b731c315b47938d0023a35d1b883ec02976367172da45d5bdd25700cbbe53085de542adb3d31e604393fd265059a3801afdb384523510b12b3ef725664a802a431f2e6b3fb231c6e3fd0f4f3128248e9e2a0cc0aa4a3eedac3de3c4a810d61eca1a5ed1fa9fbc792c32131376cd0b5b25617acb21e77992c418352d668b5e3dc0414eea8180594d78192e2424a69592d08160a8a8c072251cac9908c99623b23c64c1c0fa08b15e9d546ef096af3bfd523c9b7b1238d24c71e2b9aa14226d698c6d3e36b6b6da875fc519d9055a4a41b47f48621e1526b14a1a95affb61644ea57f2b9c20fa42af13c9fc9a32df65ee9c1e87f50607422568b6df2b248e8f4f7d0fc9a828b61f47906c7ed74c2467c9e9f21bc09bdf261380fa2d6ae5997aa40b3dea2513d37bbd2e3d60c34796f814c68e6955e22d77ccda7e07447a595a4e76de1138c14b0cdb85df5ca54ac58ca62e420b58c08f8d001d4fc9c7fc85ee9ae73979d3df2e6d4d5ce0d47141f55be55c9941b3b447960631d106bb9df456f91fc4551e3bd2367cc4f5ac58d4af1891c103a3a668b4309b200ab9f191f6640a0a3ccf67d5da47f9345e2e02076b2fbe1b8a0a8f3f85ce67fa2f671f80c92bcbc895652c1310a91cd9886e7070d431a40bda83b9116e96fd7f46344a670752bcb99f0e7b3187a99ecf8e48e02a19a29d72c759c1c1fa6c03681a756c378bf1bc761ba48ba3e0a59ff5312ab6ac9d73f471bcd2af271488f9473aea8a32044a5462342e927aa1c5a6f58b449d672e2e1a54b2516693b3aa0fe2d009778348b8ef85044d8a1f00d416feca68de00894b477aa1e06ddbeb072d5a1e5a4223e372a7e7eeee2860ac0cff227505d6e559722b820eec31c59ce545cd2751300d797c645d0fe6318aebf9541673fc6312daf81787a0187b6321bb2423ba3e2499c81dc4a345da582d4836b793947410da375d3f6752be9b41e27c28da9a3c1153e7918daae5689ced25b09e107712458e9381dfaa07a9fa838e537626d5d8ef313c67b8ee3ea28bba9e5b004b2b38b2189df438ce1a4738e39996797859f3c24e74302d3923ea0a32c7f6bf25b25ac4c8f12d6375854326fe429b2e04f0544cac73e427dd387614a72fc849f74e70e41dbace5dada2ff20b02c2ecda6b7de44dab83906b70ee12528f982b97f22b8f876e4806cc8f1a4c5b01d141ee9727404be3b04655f17a5db6dd95c3a281875431045b1c75e97201b09e60c78d2406502a896b7ee2b140522000f0084585be405498febd069c37654d4569815e6efd892c61135c68876678361015b19e77a590cc1124a8042b7882c5f4b4d752fa79c21936d6d87c7c8cb0f5ff2dc3fc1f5d769a411e858c2f58ce48216d18897726b82f8946f93d53f707fae25d383bf31c2e26d68a22e31251129c18d1e38b2c106c70935864042a8e2800d10630f855943ceb727d911a06a4e48730642442f9fc331ceca2ba9b57fc4a8ce50db3465a0d7f363798e70e15a9d0f82cfbc7d04476bf714754af4fa514e6758dac14b309ed41769ff8a3154c60f101895f15a2724a856128af4a8d740285dc01af65f5ba96db46cc887320270239a3446cd181ac055ff459d3dc30953fdc90e1075657fbb1c8c9491517fc77fa81d47e07e3fce19998570ba399f86daec3c090a8ab3402a28017869f6366765a7dadecd78fff19ed24fa309f9f3e0444f5110afd98b647eee4e75a790ff798ae28810e3c88cd544985a62c3dcb637909018a9e786cad8e8daa386401eab7e7b7c5027f5e1b89085bccc5963626649faa520fb30832eae3da6f96cb5737339f33d66a09ac4bb60f96a1d5a953e41c8dae8df604e4547476b71d4376709a7223669a29893c89272efc81b9250166a53b5a38e0c45a5646dc140e9e7c256b22c9e651a6719628a056378e4733ec3d4f9824adfbbb4f7f3c87a4cb2b55bd306fe984598cd785c7925587c8bd2d6ee944a4a3044d7af0aca96278c75cc7f49ac376a1b9672bb3ea389da83487c07cad069166f5748650aae8e294e2a4e1456945dbda2877493d586b96494abb46f4654c918b629806b024000d35734df33c8506b51c7062910983f8c46e91d991626ea3cb7c600c530fdef7f220b81678f92deea97cb98dcaebec1630d969d052466a30a1700f18b1ec19eef27cb307d1049e0de7ccfc242116a12c3c8c9441718f10e02145f639a85db8df042a0c3a2be87053b38a88e0e9c7a432a412d4f2c52fdde1d925e818ee02f42d385117880b6e10b2b56e610244c4ef87097dfef70aef69731c0a1040973db0b4990d1373b2620ab135acf150b0225c6c318ed9053f5e026e311bd9d33ec14ac1813c939199dfffd06f4f591a287f548751367178769ee02be1f3011f22584d3154828d2ea285842415e3a64ed996f91e56fce55147323f110ac6226353076705d6c55786feb6e5e986bd672ebd47831c4451c14c309f320349cb85c68fe1487e96cfb8119dc554844623821b1009ab65da39c00f061e1ea88e1bc6c1665220ffe48504ed6a63dc56f3815c7aad0f772b0eeee02397842f33023c7063bc704007d9be7fd63bc0fc388dc40b33b023a0bff033dd1fc0c807ebb4f0c9eb385afb1a6cf5140bd1c5b0ac512c12197170a1235cfaeeb533f509ec31580898f594d346519ef639755625088bd78fd9536eac16c234f9e404cb55528ac33d51d5b8ff8d14127f6997bb5f4c29b79c9e87ac5d559266c59ad9342dde37b385350a815da4c33fd929051d7c8ac49934a52d4c2c2255aa791843b44d44128deb3f6b7285d14e51267972f2fe3d70a41127756a1dc71bca87d9152075c6bba7a051b7fa6a0a7fe4e81b007ec829a7e60405a346ee8ef4aee745e3430d57ed2eb56f5063e05c83c0bf7e35d9c48b4f20c9d9381f9116805110222b67ed3042f05f89b91659e453d0d73e9266581e2b12e51ab7530e6f10df0329787a9afb9543579dd4f9381945eaf33bfadb5122170e0ccf194a5e14f775dc20c8e1d244202222597c91b57c9ed129ca71288660cda95bebac7f6ac5acfa11d4172b556efe513b96e0f58e1eb9150fda2a70fa8520f588c160010ca2d14e8746712f73de3ec10638ea5cc5f593f76668cf0a30f803d1912fbcd7cd9aa0698069c760d8c7a06a39d1e67305504b0ee076b1458549a728cef848ac1b173cec47da92efd9225638cfb33fd9ed82dd49d8a0f0d60caf56a472d7dcc358fb5805f2d335ede924fe389710154abc104e2a7b8eab85ce5357d4dedac3eed6cffd3ab5ea5b8a57f76c0e6493f76e71fc370be44cdde6b17016c5c6cb2fc76c43788a7e84c248b62d53e2f05dec857f4751b4e8e05f53e5f1c180eccef8be2d1f73eee1bc2e43312d27ccb6daf2cbec169bc2d8a4ba9ac046203808e279da06c886a3b449344d9b8bfe1a37166efa668bda76334dfb5249ddda5d12b012a598c4a40280b6f08318b8fb2944449c3c11de1e67a26c179c041765c06bada6e0fff483155f08d48a89e0d458e45f38839710a9b74c69aa41fb9cb2ef4afcb6c1d75b14f913d3d28cf20fb9f74ba9d37c3da05c82ea55ba82997491c4af1a72a29729b035f4347e1d5b44900736c706d48dd494e2835cc1e053c6868521e01e89eea9c42db803d26870cc40d089a26fda1fa23901ffb4285a992454403f8d3a4037d0f8b4d026a092243eeb3e69bd04382fb733785688d8e5b97ec52e6155ce91169e07dc44ca32b97f7a5f97430997fcd151e8e038453b1f85e3d8dedb1e80deff2103f02e3a3b8475de077c581f3c27d116f7f681a5bbd193fe5635a1179666e5ab1cc1e807e25540c75d7f088019ec2c0bcc167ae3a043920ff3c92200fb86281d4b39fd4633955620deb7e31258a7ae84fbd9d840a2467d7e386c9c59e5cc27e83eaf34a696e279c5077368b439666872b2b850e3ba4f433f4ef5666f5e1fc136bab77e4ad183dfe06940513628371f606b6333508aaa229494291d7741f00b38b2c5bc334eaa11649d67d93e4b3a26d31f8270d58fc63c08677e94771b22bfd5fb8069876bea55bf25e00cadcbdcb4bd63f8a955b111b57527dc3959ca9fdf96138189e16b6b1a643b759b472087487b99c3708561ff718b234773f259ac3605eb48b491dfb410d0ea6b526571f23a88a10120a0d63c8bc39b59e382a6264a2319bf4b883cf653aa14e3439f71d1d1b7c95ff8b4f6838c1de63576ebb1558f6cf1509e65d48444249c5f4a93629a84e101662dd863243c88da55fd5528a1b406fcce08ad9fd28388e3a1db4514da93fc5540bbfd4b47bf4694353c7e004690962816c288dd524e2226eb44deb871d5dbc20fd0bb1e2723384e18e00cdb278342dbf24b998c01f840685c142f39639bf8e378b6ecdf1ef455e804ea0497805ccdc9cac7acdf5ef81ba70523d8b4707a31ebcf7197199c5ec54af2e4a6545c2997089d01b068188a829ce4a505afe62dab9c81b7cc8e9e9dc62593f9262ef2a342ffb13e35734fb166d31434d9f8183773122adad7b71b59aefc934f9c4d95c378caeccd475b38fed1d1dfc8c860563dfa22fbc9f8ecff3115e1ceb59c14ab00b1459a09e70fd608801c655d02137e3a27ba443d72042577304e0c2c3c382f2d65615bb9824712c466a7695952007f83c9e8f87046000b427948bd35bd9912bc8937edbf9622e8ebbd9c3a72031357ba70c2a89b6d3db86acf9856506d1edf92c39231654dcb0d4dede6a892bc7cf4743a1e8168585470d77352c02455e640088a0264afcfec7fe349af0da5ff0e7b4b8577b2e1a3fc40b655d9b3e2775f152ef084fa151eb57cbc25ff582e26f63fcf9ead16e721307bc18fecdd0393c8d43fd728e2c17ff8a67568fd984da42c4483d4f579c19e0712de8dce7e1f94e1cc53d8d5d68edf2158952d0a31b05cfdda9ada20a97f64c807ef8802605a7da04d3266c375c0975c6e0b1db440454bf10a81da1e89eda384b54f46c69b02579020cc5bc17d9bbfa39558eaeb35d0920057fd2d2ddba049087102b2029e16e5ac9312921b6732f90c88f57ca1d637950881d334a29dff015868ea4737f0e5d0d98231d47f8b65df1809027d67604df9065ebc77241dceeea211a3522e802366b7f9bd790aec9cbb7f6969acff45c7fd4b9b5be9f559603f6db8f5208cc3dd0fd946d46f3197f91514732285f2b92201c7e1e77d264633fb7e3ec4c1b9868ede48346949360034211be613a84fe474b9e9d8e24f5ab1c437b07adc2404c50e83563c20882c4dc38bbd0217f8908d44955c6c32c713262fd688039f453ef80ef7f610501bc97a38d8fecd96352ea8a1efc966d188486038db0da8b68bed980bce4962146155000253d48b9455fb2fc9a601b77b0ac2c8d55493210a10ee85be64752e1a11db6e275893e9d80136edc84be49311301445564b2cf67f27eebae53061c4750dcae803165606b75e46e4f0bb471b3daeab37be7d55e8e42a8c2dae56869e4f8134851c111d09495f2ce10b2da66b1676f40212cf607db6a0778c8c9b3b5ac2b9715535b4e22528367f01f224551a89a93b2faf404b900f9d00f495103c1b21c758e0105b3c3c01bdf91713cae3e957a4f14f583aea2921cdea58674288ff4385f28f45d1889031e3d34c6b36d5d52527b36485110337fbb22859036370fe2f0a1f9df5b3c9d75215e2d193f90bfe35d6b2429e384fc9437197a1852c41de48003ae28145c83360f041f3f08ce72530c43eaf73ca5dab0b83c4e837fa2e0b09f17a931dcf9c6e333d373be2a300fc8b84dc69ec74c04c777aa1e1afed4b3d303b962f83642469763cb8319e890376bd750993a81ada1f6c1464688712f318837be6486984b4f6cd0da9db33a07969a65f505ca9b8712066e44e95a9ee9097006bb6fc256b2d8829cdff213fec4515daa9a96a310d63d42bfcb20ff30bf4b1fa433916055ca02e56aa3f65f3f3d07dadb8c336b2ec8989e8d41555fad18138ffc2cb9f6ca7c14c4409e4b510aaee7fb7a6d68cce94eef0fbb1473d8fb760e4d0d061d9a05f262e4a08899b24f93467e70c90c1c4fa1df8ed1e172f5abb2716495c2c9c4ed3c1e4d5b227414f4372a5643ef44e1a5f425d47d326eb86e9f3b10ca2695fe8c959f024314b348c8f8742126705cd1929216619509ac90055046dd54db05d11b9b8d2cfc49671060980c3ca1996d02b8c7602da1fda6d5d4052324e07651195a169676229d67a82473b2d4e62f2ad0a61088e2f615d353cefd2cea4b22e1181756b449fed56f55cecbb0fc8be41a52fe0f631668eb001f5534bc11a4ff3aedd91897dfa8847f00df88f4bdadeddb6dc52a694a40c0907e506820651aad0729a028b32854a18a42ba7dc800339a032454c5d42860e11e33ec0748f1736ee21ea4125075178a590165f4c99dd51b4454622f0a4ece007d5d5c415f14a97142b5298d8a0460d2b30585d1bf8d270803b81bf96bb6ed0d9b4c2e75d29048691eb570a8181629e4d68d4f20b95da51ac1a052501440980f94e9858f7c1e20f3a53ac0ce12306988f189c98a095e36b6bc7d2e5709c73c8373b3b7e63c9a589bf7b9ba18724e4f87ec4b9fda3cced1fbddb4f250f7d12ee6637abb9dcf9b58686539a5ceab85161f613d184131044b9fd24dc1dccdd4eb254911353cc40053f3c9971a087240eb084104b18f132e292c4055efdc7dd3d35e2804b1521ac10f22289309418a003557e503057ba827c5097b03757ba82b0c8603eae7cedeeaeaeb2c3f07a41abf64b01a94e1ffe92011683a594524ab5ea72f28452eae18d1a954644100e1a1362d0d1952e26720033c244175afbebd5e385972b5d4c607147913930a4480c7600c40c64328021290015266274f55a39f8961851a29284106ca8341962091e3e55172b2c413321825c50440a508e48d24407a40ef0804506a650428b1141b001019a58d124cb0888116811eaa204457480a5081d473471224ae94c61832c56a2e82125458e2a1d78554971c15de9624205a418586922b6bdc210f920bb30a243ca87252d2d3de8713da1eaae743101856b2e4d92b00f9606a92c8a64f1c50e2f9e2a4b18713191c413aa1eb2f050ea2107525a304ba2c51076a64811c3061349f816d1955570f8c05685c633e40453aee4608b0734004494d3581ac01dff082164141e8ae8020ad8105b7840618a145862aeacf24382f9db731b2892393eaf3f96ec8bfc3b1c27bdd26aa1943c351c4bd7477ae7bb4be6d9e14443973afa3d0354fc20e5facb9e6fbb2e71c86d720ab81cdfb4f6fb66f8f2115132bfc89f9424806b07e5f450b27773c82cb98679e56cfe5671393ec922b318c627991d056ed674dcbf861edeb8539cfdee1df2ec66d7c2128bd3725c387eb7c3aeddd935ef589c2b74387656ab3f6a2f35d06acf5a6859e4faa39bb28fdf433bbf6a45f65f9523b7d65a433a821f589064e184ea4811590800cbad5dc507ea302020d0f241750508a4c46470aa01b8b5ba8254b7528f210a16acfb5de90a42d9494190c5e5062e273c5839d2df26dec1279ce0012770d08108216458d4e084cbff996043650828a838028b1fb2e8e834086878c10a86f8e108089a800100a860e245151df0600a1213a0a094504109b48862052d1cdacd95423f30e29401a1166469c10f4f84b851e34a971329b7e630e5096c0859cc600632224ad89030b1c3ad396c48ec94a67e7eb7b7c319be4b8f6421e14ad7125a36216a0696d8000527a0e2850ca4ccc086900d8090a2832dde95546a7084f94a293ad8c22f574e992282d1955360593aa003a88573ae74352972ed9553a88461058b4170f4af08395604cdb8a165674a9715472eb37fbc3376974d974bf396aa90217ad83afe01d1558596eb574aa1040c22438090628a255250c1054a8a1a42437411a58928ae7765951f54114c82a0c3c4c582af2443bc72d2ff9a876e1bc8a3bf529008ca9ea826350b447f476b0d8e406edde48bc26d9b4100570367a8e10d7de57f577a2dc82eae0c816eea5f40ba4e15f0af00f51d6f7e972fa5945fdfa77cd9fed2bb91610ffa3574419e1a70001d1ec24da17050960cdd9d2ba12c19e27272aee01bad658da5e9f5e8679f5a411ef23d1c27ca9eda9fb31a50ff8edec0d16f90eb9a0de90c30b782337878c3955e0b352e0d812ae03bdedc63f89453ce2bc718e3d4925249a904ea975e030e70eaf0ab903964b66b7177167daa40e89b4fadc75c295d4af7ea7ec537f95d4a29ed05a7c421ddbddd5bca1d29c598181819a5e6c989bad9826fbebb53702cb9974adf274df26738facbffeb2fc29da1d96928364fe9a3d9b9bbbbb4a2cedddda5a8737777297a2182e39856cd6e760347e99acd568c57439d625a35ab597094aed96ccd18af788869d5ea285db3d99a315ed14a67b31563ead2359b2dfe1ea56bc6e0285dd38a6fbe741fadb4dbc8dbbd7b889d5b1389439d3c9347becf8d7d79b5a72011943dd1dfde41943df94b7014f202ff9ce86f60919e936b7fc34374b5f006bf344cd9d53a1c85783736ece1ef823cf9378074923ab41088b6e7237f47d771fecc9f4b4129411abef9a616c243d8fd09d81d2d16284c5e0ef8241426ad3bdad1995cb9fc5656c141ecfea0d194c6ca8812362dc274c41ba2fff895e07acc7577a7a2bb5bea83fb4948064c90ec9083106e707212aefb97beb84e99e8e09452eac3dd65d7dffd637eccb801f311c3cb955564625c992b5d4bb690d510c8eea654764b69bf299db3bbdb9bddbbbbbb760c8e7e9929a7753d5bebbabbb999db4ac9dccc2d7dd224219fa79c53ce39e79c73ce39a59c734e29a953eaedb3631c57a94bc952b2ef7853963f32334b29e58fcc52ca1e999bb949d38a9452063cbfafeb46df4b8cb6b2acaf550a7a9728a4c3af188bc562b1582c203d3d3d3d3d3d308ec966fdd3281ebaf22b75eee9e9e9e9e9e9b9fcd2e50506262646466686c669689a270d0d4c27d3d1d454d94ca552a9542a158bc562b1582c20cce21607b18b85e45367b1582c166b0291322993322993329a524d8d8dcdcd8d0c1cc7c1699e383835dd0d0e6dd9a0cf5512fa9738f49a30d884b1582c168b259bf10fa338c5aa19bbf2bd43168bc562b158327072724410e11f0c3d0c9b6718e674efa7f933512a954aa552a9a6fdbe52e95f9c41d33585e66b0e4dd86c5df9ad52a9542a956ac26013366113366113f660188e30c28c1924d0701a349a270d1a61d7271d99187b18bf546de2b73f1faa947a95b89aacd995cff67bbd5eafb22a8d552aaa7255ab46e82658837333beb8fc24c448a0416376f96b782b4cde72f9b91adde417bd15e6e52ba4c94da6e669326d237e491cfc7c62efc76f2c6d3fbed4692951935fa370b45e38da2e1c3f2e1c3f513896b6702cd970fcf16b388aa287a3ce1d1ba5430247a3ebd4f7954affa27875eed8836a94c481c4377f6cd4e5e734bb8dea53898336cf760a9dc5d9dea401889301f86c8eaffef4b06391ab6d137f3fc65cefd975073f0b83cf3b1679cbb5df9e0addd54247b1c8cf447cf3ada32e47a067f76367ee59f7cced4f87c1c919230cec7675d5750bc45c6544fd094ecfc743d273bba74dddedee01f87c381c87ec78e138ef0e16fbbbf463cb6a7eec998d7fc724cfcdfb3b4af2c4bcbfa7248fccfbdf802c8c9ef42550b689669471dd7f4a1d33efef72e77b7f2b775edebf933b2eefff491efafe25b903e3aaeb7d7dce0377803daccffbb1270516fbbddfc12c348f07b5a9dfd284a3fd48e1f88d4229343a962f6e3fc769a0731c47813ebea363d9b4eb41dc5bfb7ddc8fa53b7ad0edbf723b0a72b236cd223e1458ecd761b15f079c976b3979343387cc8052e2f09151807635390a72b5f78f01a5348de6cc53a1bb44d44e03ab942be2642c9248314e4641d103fa24dffcf12995512a5117cfc67c9ff7020303a3817d29488ab5c9871463b104305fc748bed1b23c4e36c4373b4ec626f8e60bdd9193b16effe731603b71b236f573326e0b378be164325d8eef7b19cfe747cfeecbcb783e2f331c2f801a7b76fd79f5f9f713fcd13317705e9b91125f3fb9f647c74292790cd84e3424ed6016e29b3f9262a42f58ec7701493216fb653c9f2f24c54af0cde7663c3bd29ef43ee48ede5f03a5c441b29ecf2874163d94ed8d1d078e24a11afc8e9cecf68fa458774752cc87df7a2dd84f817722e0aa9e1d3efd4acfe5f51088bef480507fa2a110579d94dc781801575d6751c2c058080f19099943b8c22499979b3f45c99c838eac628b046378475eb95ce4a787574145e73ddcfd09232edddd407a40e9faf54448490c03810591d910e4490a8856c508aed3e9c4ab4d1256c50e2f409c48b5495eb63664406cb071a510111a983fa32c1b0f06d8c2084c96811f7cc0648a2760387cc07b70e2891d708882830e78314505585e5c48c9e23b38181e98b2c50e3890250c2b3f54541184117032a7a2a94329a594524ab550d4b9318ab76b574a29a594f6d8fcc5c51d45d9a44abe27aed00fe04091c4c8122a88f540032125988861814b134e5823390821b5012a487a008410aa003591848804db918fd5055d71c11d45d9e4a2188d8a7441feb9b02e87231d906419e2881a4cb1c3084e4cc5c9ac4a9427bec5c90dc02b5d5796b8b2b238e0643e6825823afb90011643adb5a93ba9b5c2c0620e2fa0c28327442cf1811050a6b8466f883e9a670bad4b0a0b83d55aadb84e70b52badb8a6b0507ea6e603a14c648cda55ca919612444b49d25290a8b4bbc27e7e7e8ae0e0b2e65416e50b36c92d368a181f919211364971844dae4329a5f5e78f0f1c952c62ced40533eee325032c06195c5b5c6250ca94524add9d8bd878d24388d43d6030bc5e80c165c4750448114ec6823b3333333b576e62a451f6f1920116830c51ac6814ac71521ddc65155c0441768326405a5c39b994eb6ec535c5752db4eedbcf97d31d885685f5428104b121c86ba802699ef9c3ae797570be5719c1757febf2ba98da01854adbc11de7092fae33fdb124856ee9965894e1fef333895479021367ca720e1447341fbc2faaec50ab10a122834bba92ca183f5861def9f43ff944947458e44f960740df7f769677c6fadc0429d5fa35d08a9e96eefcb639c351145a16e957ea976e5fc9e9cb1fa0aca0dc6e6e4ec6e11b7b52609e294dbd4971b9d2eff26d77fc5ceef8d5dcf1eba9836fec2980e4a1df9382d421ed948f8a4bb1f0e6e92389a39f562d3211704f0031f7bc8c780131c509302f623c3411a2880f272905ad6123a2030dc0005aa180063e4012c58a285b9cf4f0c3104f80d0c50a6010e4012856c0b274a81d1054c101952501200834c228047164b1979787f95183bd845836ab9898981f2ddb2bf39279645e7a2af0ad79d9ccfc0caa7946e8b6117edb981089b88ee3382aa35412715ce7755de737047186dad42f03c479491cfdda167d49dfaf0df18e9422e9bf1f3558500b07ac8989643efa62148b19c5be1c958b1cc5aa4d95cce5f83a6f34658f3ccf4bdd23b7827d71c09a112a2708cfe726cc512df18d62a32f98c7e6089bfadb26d5a4eb6c52392a2639aa25df7c9c21a9c3e6fb1d7c11b249350ffdf67e7c11bafd5d8e2a4765d375dea8cbf18d665433aa6fca1ecda4f8499ecf0f526a74779fee3eddab3fcf1c61119c31328362b12b96ab3d08cea458ec7f7006d52691ac7972545feada1701b471813614b451b5a93f47d5db7b387edb7b38a10db75c06e81287cd0cc70bdc80528a5e63234f05be36a924bef9243baa6ff373da8435e0d8b7148e38566e3f0d38d6cc6eff0c38831afbca1d3923a34d6bb4191a71bcb8fd2ee02836dab8469c2a6eff680635da3be6a8aee546b1d126e8bba34dca46689c39a2bdb497f6ba0ec284f8101a2173086f33b2e0b81c9f54f2a580f9434ec1175aa7b4d650f37c7e689ecf0cd2bafcbaf379e89b3fb4d7e59f3ce78f3ee79c3ce79ce0d8a1d5acb5dc484a1c9d10babbbb652d4b424a6ea755eae8ece4b8e9f90005d1c099029aa836f144b1129fd421f27ece63afc39eaf65b786e961973aa2fbdb62f001fb2143cc86ce0322650f80814513c8a1f6a92160872b012c08bdc0223fc9eb31a58eb953270f11ed8bfc490b95f467a77de9727c753a75f178749882f798c006312940bb2df4a55f69e5603a56e2f321de91a5ee0a19f475af0ff9900fa1c031a9837b9eaa55f368cf3ee4433388a9f2a121c7c23c36895db1c876252323532b8d77dc8f3da4b9ae9d6197a242d4cf8152e2108592455ba5943b3d25cfa6fda5df3ea548ffc5e3e18e854dfc309ecf8489999247f56da881629b5c988686a68665944aa552c966c67c5f8ecfbfc6f3f9e1a84bbfc6f3a13f3aea76901e4339be206e5f60753905df7881d5ed96e0f8c351b7dfb92ec53b5276a92ee582cf3a16d8e577195ae21bed6ae8f2db954dc23cdd1176f17c3aec5253a42e8b36ab8dea7bb77fae1c8152192d90c9523225323064487cf382e15d2df49f23fcc77f6432996c059c4b69bd9b93b93d9f1f9de3fb7cd8553570d5f7a8d96a869aad66f247fb7038e7333f6ff1fde818afbef1abd4ed1466667655cf24388ec448180923d13ae69cea726c8b1f1d6b1bb3f2059f7f3b8bddc5b53fbaa8c05d2dec99c4d1cf5a7cf3e71d7b769b7927021dbbfe6d9b3bd6318dbbaf7072c6c895ee06963e764aaf7c223654326b28b9aa759c6c489bc17e62a8abc55e5acc3bdb3192ef451bb8031402eae9a1dbf62abdfe25beb4db83888ffa532aa2d6f3a912856fdee9f5cb4681864cf27cfa479e0fd0d726fe36e29bdfafcdd015accf7df439eaf5479e4fad7d83bac8228b9f8be6227da5c52e6bb136b1167bf968c7bcd3d11f790be87e79e9bb74f55890b743e79d994ef2cebc9f0b69eb46f5b9d69523785d70b27994d4b72f38b5c0009abe30ed4681cb539aba1d0694121a7aee0ce21d72b2cf498f07fdd08244ec17514243cfdd865cde40294f1887dc5e61c8e57a72701472fd6aef5e0b30d7bd05f4edda7655c90d7cfdb9aeddadd19116dec0b50ae121957d0927a59452cac92d9d56598cdbf987726a8666ddda762aab9d39ad52db442e12354f9188564d5a11e71cd73c39ae6a566e5b27459cb49d04376f85799b75e5739b481474e5735c27c1b155577ee779cdd3f364fd031b0a126216aff88753b298d050d06ccdd45ccd9f99504c48ba66387efbfcaedcec48dea8410d68f0cd0b8322383969e831c450c01c83b2900bf2b81ab580064e29f6b3c7c335f006e611d6e06f83bd35d8f0dd2901d0f3d9e3d1973ddad51bd8534037cf1e69570b69e8eb3fe48252e2e890275fe1e6fcaeb368d9f3912c6a1af82829c7e79e4f8eef8a2b5feb211eb55f57bea681cf5a6bb9d1bc0127678cedbafcdd6c5a35bbf9b635cf6dab7613719d775df3ec3a5127eabc1189d4915c5e6062645c46a679cac8c8743234252e79cd0c1bbff19b9be67973b38d648fbc42be5c294898c4e24aa147ca8ca06c501d91331b80b0a4b8e66b5e6921c19ab029c69ca188ccd8d4326193554c2e3fb7b8fdc9657e1a44f55a9b67addb8855393ec9c9e8e47393bbdd29ad9a6b5af3d4b4a69db671de0c122cc338269b358ac562b1582c16101d99187b5869a8a755cdea5607c9d72af5eee9e9e9e99952c4759de78d46a4cfbfaf03cfb974393e9fd60b4d0b66ca1ed1b05e5e5e582cd6a84183c4eddfc135409a2415f4ae00c09b1f9b998dac7b81a9a9a989a1a161429384c5fe12409a95cc4866a4eaef843a21d5fd3e0778f3ba11ba69b56967002670063155fd2e9e0a7c6f5849bc749dcbf7772edfab24486c424c342d00e0fc0962c28b0937c0f9f2e2014dd444d9e0822e89850493efd5a6272c7a9df73fb71f66bb36c0187cc07ec810b30188cc043e0086211b200276f4970026800513f8028bfd335e0f97124020fa36c0d70189e87c913fe9844afcbf1fdec9b9357efad79f354e78aed4e5f84ea8fef29ef0339ecf09278033e6693c1e1edea0f1c41e0f4887c66ba12f0a5ee3e7a300d2783ee273a552e9861523003047966302980393387802f0fd9de8fb3bd137f763074b1d09a2fb711404d2246153dfb0dad4342b28be192cf63f8b4b726452478defb7f1fe8635a259d1ac6a944aa612bec6f329c164e34d2f3d1f1bbf83b998fe5235e4f51a21d00dd7b52780382b1027099bfa0100e220c162bfeef623cdea46a84d5fcac3d48df08675c332a17a4d8d4d97e3abf1369ecf0f1bcfa7b2bbfb74f7e95ee319c7d778e9f9e0f81d6ce3ad2053020874e36d8040a83fdd7892ac796856fdfd7c4478a7c6f77f28dea925bc65a2067883c44d8bc57e1ce00d1316fb69562584a3f554f0fbc40db0e4017d5f05f9e666a6abe0942183a60410e60a16fb6d8030432c9a429817cd8a2609f3dc2081e3f97878c36af2cdcf29d1ccc89462604a2f2e1f69e4759ca82463547f8ae138e4d670eaf9d4a0018e37aab1adcc00c76f0470144398d748031b6d7e70fb4500c78692038e1f0e388a326856635bb10161c6bf23cd6aac59359497a159e9c0d0ac6cc2682b77bc61e990c61bd6ea8655bae30d0b67959345bce30d8b51da0d8b99708b834468694378d210328730a700281c47b25a7c63c3e67466eb5dc8cc3c9979324fb65a7c567b0d692fffb15a7c3525e342066eb9f2e5ecca97b22b63b25455da4b7bc9aa69dd5cf40adeada1ff481c5aa46dd66afdc0c87559db269f7aa879b89f3fa774cd847e82da04ce930814cd825497b5202ea5827645b324a03c89400d04aa4f7c4a1ed9dfc1b672cfecf3cfd8c25124a269b5ceeb326e65ee473413cd58c8f4918b3aa5c100dc3b9cd2e4de4ddd374a4fe87777f78d5277efa694863bd86b7b11dc586bad95d65a698df1cbd151b73d17e609c680791a63d481cf7a2acc31aec782bcdc02b4df5e7a5c386af2ddb4a0fdf69b1fb9f58ddcfa2ecc93e8d9053e899eeb4e03bb5de893c8dd5df093e829a5d4057a12d55a6b75a19e44cf699d066a9aa6699a0bda49f49ced34505bb52a06ab2d66cd64ae208a9a3faf5b7f9442e1c803dfe8aa5b7ff35cb027d1732239b99d56cd8e1a48e4a95b5ff3b4f086c7f6daafb08543f5875ce9690bd85e1b2d30bb3f9adff361db9c122bebde26f6efa1e6a1efa1a6c5e09bb7c485a31585e3574bd786e3dfb174d9be7bd75aedb7b52ef089869a8c83bef963c3eee8aacb8eba55e3bc6af5b932aa51d797ac2aa5328485bb4f89837a38a548697ba59476bf7badf4bda360d9e46e774a53b39dd25a35cdd20a1b92c5a248eea69d82b953bbcda169379188e3bace1bf968d43c4756c475411e0b914039925df9dc8844fa99215d5efce5a579be58fe8909050d05c998ccddee7472b73ba5d569ad9a66ad66b74d24e23811d7759e371a91e6a89b245237bfaf9b2e2f300e03d33c616264e40c4853f252a97996ec045fba09c2c0c4c4c8c8cc1499aac9a4c5ab20daf5c45741883a6f44b2ae145a4858bbb5b6d6d6da5a5b6b6b6dadad65b7d6d6da5a5b6b6b6dadad65b7d6d6da5a5b6b6b6d2dbbb5b6d6d6da5a5bcb6eadadb5b5b696dd5a5b6b6bd9adb5b5b6169d455e7e2eff68e5d7e0776c18901571f3689b1bd5e88f5aab61ad45148ebdfdfc19fae96fa1e4fc6dfbbc75bac74b6e05e5d5445ad065976876f9d986a3a0d637bd250e7ff67cea733d1b032c713837a533cfe8099bf84741e328e8ce6f2d0d6391612c79447f07cf1ace0efde5a776f50018a4a5bd9c703979ce59f3458d6cd6f4a881e5f8668cb038335397b620c5fe517b72fd352772870516fbfd3597e409df5f13923c24bcbf162475c878972f168d1f3de53f92a761ef2ac993f3febe923c22bc7fcb240fcefbf7acc588a9336e787e07d45ed7e67b6cc01d4d7cf3dad8843b58e01d6da805b9a36d21c5fe86358fa846c36834ecf6732dc6ed8b858497504d49d462c16c529b0fdd7f304795b36251ab91d1d0d054cfe726b44939a94b66c8c9a3192e1298017e12877ff57c3e202280569afcaba700edda20574a93f3b08e62009f7062411baa82f506988fa8544c596a7a142a6324020000002317000020100c89c4d22c0bd36cef0114800e5f924a5e56329486a3b118856120845118c42040082080180000428829643b00e211ab4f6b7e47efd53a227b62f17fccb0b585504019ee7dfc73e2282dd5aa917b0b6bf88453f8f699d4f68b2f9a45d84a3434b54092a0d942e8193c6e2023f05bc56a3334975b37c1eae9c718803a91d6845413c4c6511be0ec3e14383d6119d4fbdf351b832ad231bd8059a5c4d1fcb3520002ef15d300b16b7ac712f4a7cec7a222858e68d04f07481c4d7a3347a1e9045d02987409bc5d836532536052843342e4d0106d6483ace1a04a81907cf160feac65bf23e8079243d82f42271f4174340ff13d055b1b1342d4bc0fee05cca6079e54d3fea9beb51308018867f4bdf6deaa847a7c1f771099d5009fa7f81e1866fd3075c2d7316b1772c7877aa10ca7758cb3fbf4d0bc738ae638447af0a6bd2956a90336f64cae4d82ad60de02366572cf8cc935e2e52df27c56ece564d39088284cdf746f6c6a15e18bc677530f69e47df3569f7e8d62c995d0bac76933454af115aa372741e074755e19075c76b93d0942e20cd1f98fe59c4097282d0f245c8e915999f8c0ad2fbfd326c16e07b687ec9313a4c805944462e76c66aa5c55f6f33b8136a13d0880ee5963702b843918962d8df3ab07914e82708a6357903208fbeb5f56a3d64463d7327fc0c09ee7ac02fe671ee57e7656bef9d788c48ef4110cdd4dc892e3c082f2bb33c1210df4376d8175d6e0e8e17a0317c5af76557601d35ce2df8eee829a370b762b0fa76dd634e3a43cf799ec37f2da00b82e6a48a3bdaa472aaa889c05df08a503c1828cc5a49063a6ac53b50d443e3f324d4d501e7fcaff834c09ba1a9697c1fb37f5692b172ea496666b94baa2e2eb01c95585b81c0190ff47ce10ff06acded36c3146371831e3d6961371e70bbdd3f3cf9e594ef8f1b5c6f34cc2979d853bfb1acf32712709a24645ec86c83eb9b390c1c0a6c7b5b62076212b514f6062f2687ffc7e148096d269c06acf724d9f2ee9b27fbf7f64a9829ca5ae9add3fcdc9a49b9baffc5e0e3228c2414fe1333de2a089f8fed2d9ddd13628a70d32fd8588be7a46887097cdc8d3a0a3db5ed06a2a6a0dca92ecd62f4886f18a9cf7dc350bfed7bfd1193388d795a8cea05958947d0e3528e9e592f8cb6f65308cebc0d7913659aace2c64ba75c552bcd1dfeafb84fe63fb0c450bb58b73bd9b9fb882d27fc4930486d41de80837634660c6d0809c60d466462f83eb7d3d4cb339e7bc509c0c1a489b814719008992469add944e73e5239417019f5ee3320023091e8d8dab5268f96f4c423b7252a23c6f8363a95d6311833ac860314cb95274ca51d139501ca3dac90b69f81c9d449a88706c5709639485f0440a344a8553e76561c387003c99ffeac762db23a46894f0ea647f64b729f3fc9429b436e2bdca64b209b7e36fd3bb8665c48bd595fdf75e59f99fb1c2249c0c6aa8193f88ec67835d1fba17cdf842f50a7961b3a9557f1c38dafd9bafe27d96a271ed44069be6a01895dcbafecb280185f92f8ab531101e078ae5cb2aac80642903acf53d9fd58e601323153ce8478cc4eea0ea02bb709f31f0bc55a38cc050c15a1d26976292ad8ed50f0c1180dddddac7ad2015446e86223c3d173c3cbdb46025b8d6e3930ae946bbdbc93e04abad716b1815f81212b4507ee038cd14d08d7f4f6701d9619c5101ee92182c65e483dd164334ac180c2df356b014036b92f369bf9561584f5b32aa74be7baa375f30c8ce57eff9402be9e4564c44987a3ed1d0c8caf477dcf99cb29cdc955bcd1618f16843bb878a89153cc1f47c4b81be5803803706c38083a7906f2b4e60edf6a62c96aa218bd757b46c151c17f621a9858ed5c65ccbdb2d616ac825802735acfa05386f0488899372d7a01252ccb55709a26907e2623accf570a6411a10e1a19d2854cf15a66c8df45eb8648a8c0651139c4a0132af7265587c5544000aac9ab5b88fb2f44db1fbaa798bbd65a8ad52a44dc5663712e688de2e17f4555fa7b00289c5354f74e4e0b2f80ed3c951409f10c3994f64830f9841484aec13e53750a802a263e01d3c75e9f0c0024602ad634018f0690a50e0c82fe6d73a3faf7de2b539c4e634755868fc080a053437be3fdfc9a7ac7d2f7561a595eb9bb085a8d145823f61e19b8126cc1e7d306b6b9a8d6fa30799254129e42e999f40cbbc61c3a58623f544adaed6a818c352137f360faaca64376a6d378c10022a264f93fe4e48a273020aa8f7e75c170a8da018e0f55a1c8484b01cd3412a0d31c870df7281e0c084a95d2c50ad6ed665f30c22e922140203f68960559f000885fd16bde41fb3463c0fc43dba87a473f035849700bc16900562d72320f58b4082cb9bdd2b251809ba8a12f6c402d0e160d8dd05a8e746714424e0270f3ecf3a2e098b9cfe57ccb32fdf197ee5962014df847b74f5acbb7cd68cdb1f281776e480d86cea1208096f26090e686724fcccb6707f812a09d91d4eced1593dee70dd1abfc37452bac37d7825cd7c70de87697e2a78c87bbd9f0d33f79ff4459d69202755539b0e263d3c342fe421438e4c33b39785be0d0c34ec2f3c24b0fca1254c6d5849dc12c3f017c6fb13fb54dbec93618dcaa7cf64c967d5a30fdee9f9d08d4226b734c06e75c872e57a44fa53f137e6dee64298c56dcf39ad847a268396a9ad2f77a2b468b36724d2cd94dc9832def4f5eaa2643d21ec3f3732b10b76d660ef2c3d5ddfa88fcc694a855193323a06105d6e2c7e928f769c392db63fd135965faa69be55429ef7afe451c94bf5a6cca555db745bed56396ceb661d0974f1021ac7a0a85f49dbb7b030b75ec47261a1a835ea1feda1a1a84decc14e0e454db29878a6fc3d0641a3cc2f1287b2b41f12fc1f8bb857e607c96367faade4584a33043419ec28c8b1ae475a9d1072804651715fab9c731409e782019b0983eeddc7096415517586032ee0483a861d458ac221f9db22685e75c4a7dff97847ac0ef5a0339b948bb2fc6ee699a7471cd5be23be30eaf40f300de60cc33c102f38fc6161752c81ffcca047bac79ccc99a2651cf693674a9eca7676de2a120a786258c9cadeb8a524b3de1aa4b150021734bef0d17a30d611c9fad6ae404038448ab79e309278fbcc2a0aa3f5fbbac6484865809879fe1a2105e27d4dfe60fc2d34976d6b568885e00bea8e4cc17fb07b21112e29eb0f9da6c319f411b5136593074890d7bb3750e72b499ace08721a1978feae28f7da2a865b6c67b917cb2448f8f1a9a0334e5bf181b118b103e4509033991484d67d96e723885aa37235b85ffbfc861f22903131ea7ce82e41c54182f832dd047b1ca01bd5204051767ad35ae6b057a0a3d26138e85b6398e2de9a0e9914e1a4571a730678e52132f28cafbb42c1aec0544a35d82b257e8f114f187c191496676bc50b5cce31da4e8a898c26210d99c9f7ed391dee1534a0f6f347cb04614b5b729afcaa93bd48caed86bafefb6642998c311f808c87038f3cebfe23f068e31921440dbada6f1a3254411aa6b7f9e77b4cd60085f6f4f3422ef389e82f2c354c7665d28562b161007d3481d6ab370c05dff50bf9f2ec502a9fc72f46dbef93353587e92bf29ace3acf2312201cfef99413848751899887692f47de50c1a087111c9d08e71e2698ebf835c187392ecf29973e0cd3467e18378a022eecf91c6edd3886d16fe3248c684bc1ea189fc618fe304a7d425478f7ef319d95ad1862097a7d4c52118b2e07c4b4f2d0b9a0d771b037e31846bf1f9130a228e7811813079c2bb4d9fb1863bdf5c618dc20e082189959980af47a077b6388e1b6713e8899799a2ab283ea987f9e73424c1b2d2cedf9f2edf88b1b502c86d31c447d21064e108951c44463a857c19e1a0817a886def36ee545cd2b0b7a5edee5de85825bf93e7eb5c4230f7959ba5b89f8db27e4ef6b0fe11c324a57c1599ce6ddcee1f2ecb9a456d8bbe5fd528352e8236319c1765a41ab571c4b205c3a0b8ac66315edd21f7891a8ef079a4884b4c52a1aa505a1284ef3098be2bd1caea1bcbff6954479519b493a701c3515f4d8278a45f8fffb24abf9c49d6b3d1a4f4ea2b9793b82cf86bbc89f4d85d8e8f3e6e57f7c2d9a713b9444270744b10a728e91e87654bffd997b58c52c7debc05b32d05abbc83a7af0d1776843b722b67f43d54008d8d722ce5baba582a6239e1a312f49551a293f2d379f6a5069bec80380ea809f6b38614dabf64227c25a3c14d12e803d1c0e88959de2a9f627139d28ad5d2286bec7be754823d2733438597fb81266435128f9e6fccee08064b1ee19950d54d4bd43d225905cb5e45a0334200a6c974358d46a58acb30fd8594b9280bb6f9b40c3afb419404cd34464c459d01996e980d1792bdd62a6d36b913f52d527d1d3400b22a2c5e58b2f472027faa1943646a4a57fcb9a594b3504a80ce9ca4d636d52917b63639de568d08f1ddad4fd170677d7a66879a70066a076178c88f4bab92b34d4bbb8818459bbe5ccb5b7056f2c35acd3c802cec40bc0673c7bdb546cf35dc574b32ff6fbc24b4987ba573a20b4480c22a4f08a448208bc5c8e2d29584ec50e19348a38d992e2edcdf91dda4a914d1e446e0f747b1b7ac480786633aa543cdfdfcaaaaa266565d02119e1c49c87a08814ac8cf3a2546202a3059a06a76dc4ec55e4788cbeff1c2a9e6828b587fb03a26d7e2b3d09cf583e546e21844771e442f974162cf1e4b91f601161bdf004d4d2ac97c008d1bcc45157b1f092818b41e4b28c470c96ee10b9c98f9afaa8f407636c0fa0dc5379d81a2af7f92c5c7e32cb189572785dd80418137e4f9645f82c3981d9fb26cae5af6a1089148506a272ef1d2dfc6ba2d3e7d1ae41aca8607811a7f952a4dfa3f488283b3d57b14f79bc4300fe7d0871d55d522883264a09751f24f835b877f47f45e926a1fa8c9a593e1526c6a37a1cd0d7b9f06445243e9b995df0843a6e5872e90461aeb28c78de6c7065f0924c648abe04ced7a48fd7320d7a5b8cbd26205c1910694cce441d3f6e00d101feb5f69ed9f80cb805a4058674150448c483d5361089b740ac9ba01987751181fbc370996ccd122819dbc58b29526f629fc0e7514a8966ab6d47853ed60a07a4cebb273ed24b204ed08a42c89d69314cd9b893e130d3d3b4429de3c788188866b3080d87b95bb9c061cc1eab17b9024a1d5dfc09dd369d9eff1f6beda2a0810230c72745d07a87cc061e1d0258f0269b7ca9633a3cc45ca0f614b972a1a233b027947494c39fe50b2fd2abbb0911a7b2daaf6b15699895484fe035ac63444d876fa3763ac6424a0815f69d83ab823a12aa5037ed323e9e50f72564479fc70dd331c77a1463c79c64ed3b416b45e812597f34e387ccf9226f0c5003092c1015758145ae44ce88f85f72c8b5ddccf17ddee85219e60cb1242f9af464cca2d491b64fc56a54f80371091a0adb22a109c32ea0d188633dcd4b04db0bbebf81c13c375eda978305246f595d36b5c484a382bcf2aa1e9f5b78d7bbf1a1bc5c294f6768466feac6e6d8af2280244c511efbd024953acd40401b33e7594f1d48418e38ee8841c6e4b7dfe1c5e8255a2ef06933258ac1a37efd8f88c75d5970b8ad481b35342e5b6d061bbb9120a293294a93fe36dc4b3999b15fb81e830c515166fc75f2f1806653318f5ea259b1c7c8025748a8b3766efc2afdf5e600c093cbea946bba8cd9c7dee94fe0acd9f5a2349808a3a9b23ea02e1165811c4c2dd9e4844fb0f527986ae6801a462857e6de0c057d7533e73f5e29e21d88118ed779e400fa14825da48899b24a060fbb6989c97a6d57af8b1ece4e3535ab3d084014d5940eb0a5a025e3a378f24d4a822ed6c0e7f54cfa083f9551a3346ad6e9b96c8d4225426a492cd4e1ed0afc884367efc9b504ddcbd8717e6470eb744052ac07227bfbf2eb708c2258e7f6679b26677a2137a4f5e2d47932100c77592cfbca1d8ad8708c4cb5b03608e1243b99821fa1583dc36ef2280c3fbb3d9849e9f9777d948aaa18c155c6ae6bcc90f5cf10fdbe188c3d631639501f111b2db9ca8436996b726038e3854f02391c98c6d8b4e4acd0aa62a73d710f384792f6eb7a7ab3e6050dd2fd29355ee8690787c6726ec5f5c0afe991b3b259d6d30256c619d2407fca7273c6b34ee0c882ee5f76f53c5abd6bedbfafcb17b0bfd7b02032c367130239e10e0a866d8d34305a9707913d819a89b27d0495e8b76b07e86479285c95e84c41279626be8b0e8d1c8cc9b288e3c9d88c0f549890a9b0800cdb408b7b89bd5d55be2f1db9e283b83c728e5c26f66a193e20c1ba072c8b8cebf6648adce8bedfdb7585d0c78153a8627557a376170a81493f6170d1c7847ba6d30a4ceb7593359e116dc649060389253ee0aa37e4d1ccc4bf6a8eeb6f9cba2003adb64bfe456747a4fe0ec0298823fc7783f9d7b6856c5e9447ac07efaf7adc442e1de7ef620a7f42b1eac1a71be20dc75a441d68056d2b6569051a492b44c3bbfd82ad0a1d83dca85658fce2ce1522a899552984be0c07fae3d9ce6f62c78783dcee18b769b6b6ad99b016ba57307ed3792c4008dd989f3bf89447105877fff10aeff1f3359facc3739638940cc6b26676593d6f4ddb1d9a8a16d703fe99d29b4124a88de2fd6d87f2bfa3cc43ceb5165a97de79201fce507f915ac6605207986dde9d070c6a10dd917ca04e43a51a8d2ba21b8fc5d995d799829b9bb2af9a31133a4683354528383b0183e4ad0849d2e4074967588f1561a3e8adcd3fd2016469f20626503f55f652c78ae340be655ab51b466387d0694b1f2f0f1adc359f0282354ccae307d7e77484308c437b196f64a8db239042fac29762fcce18eeb2a1cc60a047960f4d5758e04b5eb8da449e185ce7cbec00370683aee566aaf3a5a460974a14ba2bda76f8f1a52961450ae69b1cf5753eab7632c637a0ed977d50ed53330f1b6d6b56225e0738de925a6a1a256d0cbffdd6b1584fbee069767538123d5ea2adce12446a6b4b6372966e3132e72ad17d2e5db0fa4a26570fb12b25100fb092eac373ca329b42143fba4b2f08338fde77341b596064880d9f746f86966100d0665d903807e21a116a38a2bf497aa183308fe49aa3b97750880a48581b8ab584644a8d25436e5243b229c8d4bdf12001c9affdd6c6aaebd00d186c1654ea755a024685c0982b3a682bcffe73546ed7906c46811d6f5763039a5a9736d3b7611f77d41ffb2e69aea1913f4fcca3d71c4c44975d5de6f69d6eba8a0c4cc26dd3e98e3f1b2592f937557c788576d81a9948b3041825bec056229655feed43a271ced5780ad6b55a055c3b83dee9e38dc984d7e5f5d599b1b24822a70f40d08654a1c96c0ceeb03c6a86e9514b35f3ff94f573f0b03780ee89718ac5c0f64dbc3a598b7849a5d49b8ef62a49646fafdbc4bcd00d3c06b8b308f4381591c56299e6e1cf43995033f56aa4a31813f2b4ec260a3354dd49467305aea1c8ec93e2d1a5c38c71f421d7324702f9d2a0e54d8872b95b1bd6524bf49e0f703da01611280a75a8798dc872c736471a93271ee2cd8f3608faef940058e19ae71e36b6d7f1a9a331fda9ec184e8f010448d2f6b6596a022eac4d58051a3e94a41f6cc6e8832c95ae49be4d58fb530a515de8493474e66ef37e9841bf660bd4159e72735af9b2b004e22b2ce38c85e3116dd5f294ba0a0a28a98df6d81fe71cd3c94887dd4ce90aeaed4691a49bd4b2b31fb40198fe795155a353524b4a1239388f28ecb78c61944bd022939a80345a17e418a182be46344b23dcde38fec7c89e5ace9f9fd628a1ee84401acd0ab588915dc87cac5f782313b04d343ac57d6b75071eadad89c1753c57d8f597911407ee37ff44d45eb4111b857d47b896f65ad411a095dea0e99a6696b078072ad3a0b87a15c4eb12ca0529c621f988692cdb536437caad174eb5fb03c58481c4319e0d7695c360996ab0cb041ea7b1a3bbf0304f57ff807b20ba6e01c2a443150a9e82c9a8cdbad9cad8bd5b99686413a384755624762a740d75b06170695fba7ad848c560b89c499f6d06496bc98f878d546966299ef74d6c3d4083c2e59a6e1a7e3c1ea85452ef04af69234071e05745a40c3e25ae097e40a0c02f4e778eccee534f6e24f51d4686629b724274d53d93c1eabba9085a2fd202bedb0d1dfa7d1fdba67fbe4c80b41fd1ab06b84e66e70a1af4f667bd30344063238489c1dd6b5f2034c2749d07870c152dd3232cd80f2ec6ca5c91f9aff86d46d41bfeed253d4b8db7bf0ebd0ec2811a47a8ddf86477c086f50f9277ce97f3fcf7553ccbc5728f2bb663a2fb247d841cf30e38f9169e312b58c544ebadf73be9ae9de25f6b8bac15f0986344cc166a35b4f05543535b8ebf2decf11fbda84dd27182d92dbc8d67e92f12d70f166c8efcdecca9cf745ecc2049f9a1e67d04a2aa5d422078f9d5deb43580c451bfae4b2bf5cb9f095cbac14966e3ff1e21a26aff27e4c76ed22d2428cc739a288d7d8494060b7aec8b59d2b2d3450df61f325d6c4531db55482bcd7d857d7578ac95473efc8eb6692c60239b72ef5edbb056f90b118a4c922415805749e93fb3431a8b99aa7d48025c6670bdc6a0aa833d0dad4348b7da1ce23ecbc7896f69ad757df1679c0a5cd7523a03cd030fe2c7bbacd2b8d77e150e047095c1d4bb1255f607a09b8a11e3ffa397a62d9ec6e91131c5432effad80a321c74536049fa3e59f6a5687a9eaac72ae5df1754dc9343a1eb4704f18669d1eb32f280ac1d50381d8b31a0fb01edc8d9583e5a9965c6f9cb46c2c5849ee838f1cbddce9bb7692b31f25b871dae9b856215f0cec230197442b3b6f52bd0ccda75d71ad12cb7c7485cc38555ea98b7a26e4183ab652d06a8224f94294112569dc4c9cde2492653f88f8d9135c1d911d79c37f359b1b562267d3d72db5bef10dccade5005a26cd3a08a466271e9d7f136eb43baa1b44e526566363f37930af326f2ca312c24fc78a500e9b3d402f498460c685b0ab21827688dd49f2379c60d4527b83e223947e4fc1b23139e135c28d4202034d62eb5ac20766028f9cd86ceb07a5e016c34e9fe0c2c7e1cd7640b0285c5d4800d469d389b821ba2f63b720c51b791b22be50aee8a93de48b532e9bf992513cc1a0c4b3e4a643a3aadced721a0617722a310ee54759ae5711cad04a128a9adc7860b3ec0954984dc0e7d37f9c7f3e8216fa4871efd04971191869b1402d193bbdd01d8dbe64ecd446d06ad08c233782453aa230031515600a9e0457dde280ea851d4e27975535d321ee0660484ff3f525c05450584dbf82ba820b65ec18164aa7c54cfdb3fa21b42a372b58ab5c7d6c13df6e7a82abdef621c4c460a7f73214e387ebf0e05296eaad5626da343785d301584dd9a8b2b75299c8fec42295cd2aa5e571aea4e1d29beb3ab715b18cc8ccf4aa4524fe63b9b6ae5d6efd3a38474db7a36545f928876bf966644f54d875d7e351efe472ad479bf6fc27ddfbf6c031208c4542ae0c0193f6c2c4657e9ae1c6500194536e2dacd49618d98137eae614ab27ff05d8b9ccdee6e982eb5065ecda940a0b4b45a98c355d432f2a2d0243c4148a2b88ba3c0f3b95d8825db01d7e1108da856a660bc8094ef4e2c0fe11ddeffa41bd9627324d03a2f91d5f24711eb386a9238e17131d52b5ab1efa985bde62b687413c7fa16802369f05021c5264498a643acd00e1cad7477077609b845090d1693012f61f24a5c9e0ff6e282912ef97ea95712b4438b22848696b0c992019f5c1856ea100c8ab791a72570fc6c8359bc22b27ca7210d298fd6549c0d6e27ba60d43822b2a6c7353f0590ad82c47df2dcaeee4e2600acfce259d8be09164986b5d5436f2b6a520900143d83e8b7232f8272f55c73e43795a65b54718f5754124e4ca38d384e9f9bcaf036857666217dca8f9537122c201b6ea58bda1ea616536c936725c880a426ec76576c6ddb0678b4ca7f841268c0483d64f3154e7f52818e84bb69a05ba9fd0ba25d45632583d0365e4f9d9ea4533342cd2e064e6f3e74d40d513546c3fff52866ff80db245168ee15c85a0a7764b8e611463418d941182c30ef4ac48c49b6a64af5084b87e0761b009660fc803f94395c73e803cc71448305086201ac445c0c9057493e480ab236a3dc088f387bfb4144d63cb2fc60371524c5c4a7cbff75399d1f1dadc2eb0b08ad0ea4c05814f380a9e6d410895c39a0e904f72d7ad5ac4a11384bf851ab5759b04fe4391219bd388bb1998e4551b38a759d1d93a1c492125adca9bd7461fce2c79f9922c44b34b6a22c26f65c76b2a0fa8a7a0f1f3cfbc629d9e2e16eaa6c512ef051254b0a3f5320b8106178b7bf81efecbf97f5d5f459dd032bdde532c408ca204575810ad37757a2afe50325bdefa1a496b6bfc53da21e0c0b7763422a73938b4ae090f3a7e1de28f5f01b65a09653591c9975d0ba291513a0c26fa9df93caacbffb88d45d856a4b73f398939c1fd019bed2f7508a2c26021b4189a315da54980f533702008f59fd4318b38e18184e34c3be1e27451e6a1a3ef2214ab759a577f8f2668a6c2be957c5d137ca0d45199f050e1490993bf5ad400669b1209856ad2cceda13a370338842514179ceb01a2010a90668abb349fa4d184ff1c38825a13db5e4409f2ec658b738ba1bbdee1cab0a35f6913396f067a1b65c9fd7352f72abd444931511f2780d15f4ba7c0d5212e0521cb18930b342c54f74caaed073c4276c591aa7a67fd380ae2c8114d2a7a4ae9205151be7ebd4dafb632eac000cf3eb5ab7678f829314967ddd92e683700a3ae80f789a3e3f903c36e8dfe3402b3d614719d6bf39a127ef9c795810e03f5497b6b837d7154a22bdf1d03acc0a58267e4d2871c748a3b6ed26d9da0b0bed0fba902c6d82328582cc847eb1c56021947c1bd542f4b653a44a47c90a113453e63817400addc02f50e000a25ec99d47fe4809a846412197269f8dd699324c84b54aa23e6d87d086c7ed9c6d801c8dbd1f873508f6fb838d9101c5c68e3c007908f0117554b7904eeadf93b2a244b0e9bef0a8a4f862fecb78a3efb971027281f21c87ca14c9fa357e15c59192adcc056eaca0aa4ae8c3a78f6e6380e1a6034dd08e31d8d18d6f694b7883eeb1fa01aa00499202f28370ef40b75dc3dd4b580ad6c5179aeffe5e9ca94936c8268d4d1abe5af6639373041754b6df60d5c6f56ee45576a0be458ae39d98424da2610e3ebdb854c9881e0754f7fd2823b43f82a47b46616439f1ed8373b998efe9f1cf7fd453bdfdfd135d28ad7a085522f0f205e05be2b64ec84436e45e817473b2bd6481eca0f01dd157310df19f2d47b883f0e70c6f74087e7240fd949fad24b6fb4413d549d53ca42468676b27cd863216b6f1adaa7978eca6356a37c69a48324b9433f8b0ea7d3a5761763c845ea99fe610078f704f4fe949e094fee0f9546a856ef039d55dedfad2770f28144401caa4c49723ce8bc55f92baefe535a0a12cc16221be9dcaeea5099a3b01045dea85147db8674bdbe2e4760cee18715af18d929bed101d1dfbe42423f347d6a110d59b64609829fa2fab333746c05c9e82f57a99851929643497ebf51fc1b22d14dd40304086c9281d7ec0b337d022b1954cb579ea47674849a507fea5e9eed0fa2534801daf222af50b68c59d90d65e42cc25b2cde65a0d3dca08d9d05ef047042ab0cc7b95eefd0e675ea270896703ac8396f0592f4d75379e72b55de7d7701958a12e204e697d2fb51ad2ac8eb4a00fe94c665d9e87f8ad8dae94338cf2164a84578633e55cd60ea4c4b6aa2a880bfa15665e8393d24fe1fc179a097ba77e624892737d04b63d3501f26111bb9cdc16613d552aa686e069147d85dbccdd83e0483eafd050c1516cce891ebb89a13652f5a12c72b884c5be0a0a88d0427cd591722aec42cc553267926107eb82208bde6e0b45c0554d8f2f91dcddc0e9fe4522d9c09a76789cb595d00c75e8ba9d68415d7c4c18af294ff39d83826175c30da48127770ab067426155432d4fd96b97ceaab9cc4a5a5d5d9644420ad2242f4c2e5f4fb4b16eee072634e656918f85b26f9fda2b63b0d09ffcc1e6ed80ec8386ae7f4d4b65575401d14480be653e172ab6bd596e092182c4869e548dc35da7087fbf4abb8f9739b5d70a27eaafec990e321ff32500f07044e543805995263830ba5696c44e4d01a3d63322616563a0f5636ba5a2012d1cb10796d10a6e9069b99c0ce78f8c887724b37e52a8c947195980ee780192677ae6e4d0145a5a30584652b962e30e438ad2fee1f0592ac4727b2a710b23a4be9a1fa1ec8f132621af8105a4fa4613f3aa9a6c1d0e27fec1bfe73ddc8327235186dcc2c26dbb2613d682ef8f360419e9fa178cdf4bef503e102547526f4035f8089b33ff9d32b51840a71f0fb090906691c4f89c8bf1faebffb781f05c295b1758e2501d32668c7db7ff7ea250708249fa2f5485645619598e90a0cee5120549d1ea5a28205add02a97b05040900a16756c494ef2a63a9402d53452019f9425676f6f2f8454888360b3aa414093e85c12dd9bfa673d2f516790536f3493951eba6481814b7e597c6283d0fbcd43319a885f91b8354bc80abfb0b00c4408f1b032fbfd4599ee38c47f34c0f2405f8de65c74694d0a5d15577ca927aa10c04c39e67da7ac47972eda319d24b8e96d9222aa7ce79b9473a9c81a6c96e1ae310e9e1637da4301d72e0387f287b047d157e08b229ee0ce8564432871d5b53d0e0e927457c040e07b0c3cb56b7ca02836b3641942de44dfc68cc9630c0f568fbe02e03211993f7f64fa0c1f04d99fc82f16e724431a37080bf03afb64cf0861952a6653cde28fd9e9ac88f8060d398372d631900de919547037c003e905ee769067ba04b7d2f00d95545455306354325b159c747d0a0e1dfae095b607fc29f7a332aacc16a552f44423fe276c83e22868629c91a458f5031e4e95b1a020997d408a75be7c70a138842f0212a1165e8218055228781d2ad4bc3029be3b8312edc2026b9019e214a808363f5c379f08bcb624b1268be6c5976bdff40448c26090060945f4252042233167976d2f3041c81db8ec984fbf18b39594ce1f477e58e3cdee6198175386d168bb7c216ca77354e37ae7cfc21a6ac989756a87875e50095626cec0b0e6a3b675d72b51823d136691580aa323da82943bc6189f777aba9a5754a357265b864a80cba978350432c78f802fb9f4186ec1fcb68ab61efc9ac07863bbb1eb4b0a823d21b93b629141b98800e14140532f4de9f4bfcaea6913f7dfa3fca71199d4e0d270e3a1a110173626aea0e7193affcc956cf0861b01308825a14ed715d08cb807360196f1bcb47174ff5650d1f40acd9f48fd479d0fcdbb6d5c912ccca9b97c1279d430d7844bf91cf375d9a1592f645517cebe81104f8f664f0ca154069c3a778379bb42d4f60028fbd386e6259274056ba8b02fdbb99a81f0591247d2745b422a9c004717622c214f9301c7f0f4dbaae9fb7a4ba40767229dfa9119450000a240ae2cdcc1cbe973e972c89d79f325432e1d83375a31f7131a816cfe087d620b6d519a817b0d9f7605136144643cad52c1010df82599288a983b75494a7bc38d4099bae57589de1779222e500e1f1c357a7c68ff3fcf359ed10042982f271e40bc587ca0f1f576ac720f8e1c240ca88bd1251bccbe030532cf8601eb291e0e5471fa505f4422d766706eadccecdff271b6c2ddd26ac62ea3e95e55ecbe0be274812c0da27f88f62e8021f56cdf72261f25b453a63ff0ebc7e0aee46776b6657e9ad8d390672ca6f3f4e577a2ad1ee7cc72eec9adccb73ffdfbbb18e3ff87d90bf389761edfd36961b14a5e3e4f549ad9f249b266f34019ea1179ba6125f2c35211b311a0341909a629fc692619af2de59db8bb34199dd4adbdb67209d84adca8a67ff32b9b612dbf261c900210d3a9ff4816088cb615c3bac89d070ce89e59f98c392f617808b66240a5f104796ae7b57e516c47a0fee15b835778fdc92ba80c3cbbbb49cfe24af4f2666cc449cc1006cf58ca2bd4ae0ffa2b1163df45206f1f5e6c9107485f625131e773375fa6b819e43293efbbd009a83e58bbe19fc216296eacdb118f9386a5289b00e6b40a95a96c86d53ee12aa9ef68d32d1871ce08770d9a15a2a3c45041ce5d5a20eba1405d2bd81b2be15b959c16d6fbc9aa7df7eaf42a68c6b20557ebab2d414396d70a0815849c58d651d2acf441f93f8ce7467d46a88e4e8d921dae1d0cfa552963592047c2573c5d92bcb107b1e37ba33436f91ca32caf37f5ce3001745f596701e5c4043bfb5c94dca82b926a9c8d9ec37db63dad2447c7982c35bd218f6cb1809e6560f1d527f76451223316d7c45c04b17308290441630e65a0a2b2e155f7d46b7782f3b1e160a38374b0d43434bb55e8708ae1e62211c74801b5b84f17605191a38a2888b500e1d049e43539b5c3a1826ef5767a3a0fcd77896a54c647bbc4ea38f3bbefb4b560bf554e0aa7eb8971db86c452102fe156551ef3282a85e9dcaeb6200098244271fc39dbf5016677d6c69504c5502225694e73744330be3d86ccb85ab931308867dcdcc56f2c318785eb4d2f6f3e648c92934076d128d6b7a1eb4c5f12afbbb131e48bf297c39d76efbeea811b232a5208fd9bfc7a253d304f4625cb88892a28fa937c2786cf868f6a1bdc8b039a3c2d59c753055b884611d11067c9efd7a3ec83eb4f50f71fb404b4344ac170b30c4ff5242d590229feb1a9da8076e261593ce0b0af681ea7ce715377cf946196a477a23647274d9b49cd2b7d901b88a8e34c65e3520aed9726c0c0e44bb670c293e0c6b3d93e9d3cbc9afede02ed57fc155dbcf9029c7f1b65031c1aa53c5776bf8fec6a7d63aec509b949690b6192db15ab590a3eb485ea34ede9b966e91355d5ebf1e733217c52aee760559f0149d0f9b4cb25d526282c74f45f20952cb59edbcaefa4138448f7666084ed9cec4b884c323b70b638c0064d4b62b07dda7cce439a000c4df962db42f0fabbd4b0167ce0a7987a489560a10527a1c4279431af37730d4650f94074227d99b847e8ae043e7cdb1ab21add329b1e77876466b8cdafac79921fce229c3cd9abe552a03f31691c51616dbfa1b34fcdae74f393625934cccc6f3afbfd34195d2923030376258cbc91c4288a7e5ba2b71c4021a3a38ddbbf221474c64ca973e3ac0a42b220928190ab9079bb88530a2cc4540c1fc234424ed0aa0384eb3eff356f62813c8b42e10a5a5f0e21ffd3c59995fbba074873e156250b7b3fea32acacc281e8a276d30da18f62238d6b8a8176f1b258ed71c0f076a2e317c5edbf3ab4782792c780091d61a1e4bd8cf0acfcc4489702ad4cbcc4d1009a55dc85d40867620642c867c43589c870741405c00578fed39a089c28f45316f5bcadaad8d34a002e16010224d96807c0be605c3a8fb4b4505530e5b18903bfce78ba86566eb97ed94d46b49da6f1e83dba68c0f68e14b3cb9472637b07fbab2660a60b6a26ab05d8bd1e5ebff5d4e3c5cad0960305f57509cd8ffbd08e33dd7f869df1486929c5546993ea7a622a84833ec44033edd4c631027b7e5aab5ce903a90afb2f94ffa70743d4cf0431208b68f96098250329cef6358525653a0c2b2a7504d78589c052b09530ec68ce0a301e3cd8433552c672000550328844b5a751575eda4b38edec15d91548e5d3c9c3753307dbd262ff1e2129232b35b74b4b39d08e8a8aff66ccad5c4737b9662605000d2e8f7ed3b1d628d3c8eda368d252de8d3662c2caeba70d81803d184e1136d4618319b73ce3ca4c784e1417e6ae803ca06834c1837eebe29da76832d9c668235532ad98587dcfe37d824c2782d0e344d9ca26cb46e1f524a772973eaae721d6a436142ed92d3e4326da78dddbd8c558a6ed54ad41c5eaed8e279f51699c5f49a6760d8bda4e7bbe770971de36335477f1a77a05623b2cf129a841e0138a8f375792f2b88878bd7459a9efb0e836af7623495bdb14ed0df5b348481bebf514635bd89d550357214ad4839b5876bdd7a451a97464c0ec20c31c75ff24a1aed680b7afc1c86e1d0f50e8e295112fa849e9ed877f3fba52ecd19b0ba5158ae2834750aeb00389ef13e32d3942a17bf74b3c34c9836a23302df78aadc8e21ce1ca1186e744c80b7bdbfdb420623303d6a60ce8a6a7fcaad38991a2bd27bc33044fd42b4c458d5f5f9a5a440e679f906d883c9bbb1b1807deccb1d67c1d17c3d8710a537a582b6317ea7e531b6046ae0a48c83f6d20aec535577c7ed3c900008828cddad84946123258f2130edb66230862bc35ba1aa72cc6e5625ee9dafcd48ea5cf1e1b3b1fb8c04ea047e79ee3c98d989c7757b5e8ada5b75eac86d823238b596f554c8af76c24144c00455a73519dafdb167e2bba737c2737129ab425981f0d92b749c6b082276bc166caea6004e918740fb7ca99774777786507ab2332598c70a8fb785a48ac3182b23fb77d8c6dabab4dcc19946c722b6fd313581f6102a5843d4d6f653d20ceda798dd06b48ff57016f5c51dcd1bb00e90920e416bd0d35b3fa77d39397377902e1bc37ff988d89c48a0f6dcd5aaa2fab619c6af0acfa1ab8a9a92e3b9c4a0fdc8ceb23cd3f23140777567b9610ffaaea5019ebb2b1e1c4c7e5257b9433acc2f3b004453b06e9c0a673aceaf485a4f36689af657bd5212464913a1c6e9f5efa08070922ace96c9edbdfeb7ed05059d9466509367189150859d556528cf51100a249c49424f3d85448ed7379286ac030e575d31f5e2b75cb799560670eb05970259a26c3ac41e4edcde78cc88f8767e0a95e3de04dd8b9ecb77d33d3436d0088f56c3d4078404547ee9cb13ec07aa9a5fa3fab46a3adb21de5fa4576746e85e2085fa218767b6baec78e64e82eeb66c7ea38e20386b90eb1d3dcba1b53cdfb574fbb09d0d91a5f80c12b71eda7b3f7c262775482349e19597a838a1cd3f6e7b745725fdf870559640c820c33a3b162735530aca063553c7e8b5bb3667f3659dc5cfc9591dee14cf5c68c5c7fd77db31e9d00a2891852e87e75286cac794a6af306c986fb29db10e51ee97dc0c12118b5129ffec561f20bbda7b6a3036d7c1df1eeb748f681d4406b3a02aa97e1abfa5967a06c3b0fc4170e6597758c2dc9fb81f94a2a10849c781cf881eeb191fa1b9af7893618522b1c709c6e4c55788f87558ed13421a5057041a9a40fd3f8766f7591e99a745891c12f45d0ad07a37e83c97c2631d4621ea0846912f0dfc756680739e58f170741c2c7dcd6ad5c5de4e5ad3c38536dd4ccfe82343a7d9f36a7fdd85b7fac6f492a170622d80f52d9696d4e29d1bbc91048ba3134692ad3f149b77108d8dad82f7e971a94550124b5ea4385958cd14259885f2bf0417c38a44cf9e931d43148c63973d5292a0df36779d8a3cb2018e7f9bc5def854d2d2c9f60b14de08c6b7792930111f651b6c3fb17bc20bce3ec3edb5ef984cd473b26e063f33e2964f4e2598c9b0f22b39555c12b24555b8e1420067435dc4899134f2efdf7b8e3134ab070ea9c06d985948014261325d508b91389d0f7d59d4c24ca2ac5ca865a5ce687d17d8acfbfb1b06baabe9ce0d734e182cfa2954feae8c9e3469e697b88e6db002ce87eeaeebfd839ec67f6b49317b5ff9c89b3984db1dfe762297d21292489d510b9cab062cf719185d0128768fb52f1002c7ed092bb7271d0fa2e73008fff1a51d01c80c4746946aaa53f5d35c0b5c47b558132bd5377ab14f36cedb8f4a2ebe8962d6568c7d0ca67e0965448ef022b1906b18b4266c70b708e952064f49cdd2312352a1b7ca9307bfed4762d6fd9cf2d4d15749e548c81814c9e2306fd8e0ee8f991e02263f8effc0fff2be117ed8bf3436b8bca9698a520138b22ac5a36daf27fc5c379d5dc0a40be5fdef049844603c09a9ee36e37468ac5639d5e24af997452fa41974629103ba21b4555e8c10a61000d0f80045ce3eea1a67d317a28f133d3701c078f4a2d0a5debc92c6a11d093e126638ab66019e24aeadfc876261475fc6d2a37beb6efe724bb3ce6b2c506f8e10951296e241a35c93f72c81864573a9ed15a9155a042ef966b4ddf68b4a03b9160d7e1611836bd4fc0b1a24bab953a567cc84e8232132e660d943b0b2fa40eb47e87ddab45d0f9a854e58ed07052a90aec88955dd3c3f35272f4c649e49228d234777d51d5dbb0974922530a4121e3f352e3ac4d8ebc98a886e2af20051725d161976d88f5621d6b2ebb8996c474e61911c9ff66a99c67f1a84820218d993e44aa4e2f0c2ba61c29762fbe9f9cc7f4dd84af0768338e4aa1681a3ab12b9ea68ce54848978a534fd4e52b2655d45fdc1c6066c1813652c797ab48bf322fac9a02ca499e745b505a514d07f8080abc55e0efa8609b5580de55496a1264dae5fc4fc6f64a2074a520f508eab35524af3e51d1858161c0100314838b0b241e263e873e42b595fa066a6c8e0412ed561cd6c6d86e429bacb42677b72db794324929039607f3062a07daa66da32490624831a498528c17e3c57831d853fbf40465d48180c480c880a8806056484888c7a32121c6c4149ad0901093c994dd9b044a3f85994c4c9c361919fbd309c34e98890c764d4e4d9c644444464642264212929089f04dac09865958c9a79f6444e4640a01f14aa491a80b7119f4c19be6c9ee6336a8e0b21826852ab4a05a99252c762f76b125eecdaa4cc5ac5aef8b5b7fc32cc7f762d91e9165263115d8c41f0c642328575c3722f2fc10c1853ad10784ebcbadce8d0c59c05a46a0a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1f1d078683c343668b11846dd77605cdff09d6d5b1ccc5a226e629432675af24042ba10ad83a71cbfa74b242b02713984514afa601bcab22c671bd26cc886b80c3a82c84556a43366650b8cf48d292bfac00e6cfcf23bfc511cb68da3bdb0cd86becf129f1f18818825b41fda0e487b7d3e99e3b89c6d48098eb346c8db25e2724b7019a404e83bee3bcce2ac05bdcdd98696e032480991fd0ffe601a316ec0acc53d481cf3869408c3d05d4696724e774a6b9d1f08698e2cd01cd303818befc0f80e11eef58c408b2631564dd3344df350da92af7934f9c5c81e6e0c48ffee0c1277467e2440010f11202d4b4944be410722701a80710288c8c92c88068808cf0652f441f800d8b60f9a206e9b37c8b43555f1cec41ddaa22dda32426b65a55b405683b696a049509c4d5bb4d5759d88ce786a894f64f17b77cc549554ba8effd168549a27cf2391489e14e55c2ad18ff1a5fc0993a57fac55bb33204eeb9db93377c60877e6eed0367b3e6846892ce76b1e2dbb587d6dab1eea824b0b6111b410e60889106adb221186a14b4a39e71026c8c78eef1eeef8bee55ceb9c18262f4be6ccdc031e59fe867118d9d365feb0e3678c73442090273a81700e72e7cc71a11066c9af0b755ceeb28b755dd745904e08af1cd14bc90b182c562e6a48a162a545ea69dd51cda89ca4a094949494dc04a1a51342b1da5e590e5f6595c90c0c0a752f2a1586420853b4c9c7ebe43385420893c069996e7a849bab8536e5e0b46e6c3408a4615c6859a38612173ad66869da86b76d73bdd0a696e926aaf8e9f4220f662d2f87f752da29bd4aa14be74723221b12d10bc90b8cd015863a9125f5a297922b0c53288c3fa0cfe773c4cd0dfe7c40190402b9c2179ac466e63e98b55c5a5a3736332e98162d4a3ea057c86b92cb39bb56b4a975633313553c0fc46b09f190cc23eb4cd4c997452f2220e6cae4230c435718fa78bd4ac21de697502817f1153153fedfc378c1220b4276d33d98b55a4c3bad156dba31d9ccc0e888443f2aedcc5bca9bf471ae4aaea75a940388944ff492734a0fe61cd18be8a5e4247485a18fd72b2c094b4a7c94e8520f970a6d6a996e4c36510504ca9e4ba9872eb9268adb3818d14b4bc757394767fbe9e5e4d2429b5e39392b9f290c599c84ae300cb7f003c5e7dd05064b9172b95228147c7a710f4c8892727282927292a251de6abb33cc54adf82ed043cb5ef1a847798bf214e5edc909ca538af2719f9c7c3132ca090a0a0a45a994bc7c1593d73ccf43095568121b92191298a8b24af1fe1b14d9fb6f61f6ee79707bed78aac74cb929f494872f2e17894d642911bd98425f55d18babe42a39494939797b82e2a2172b33e32b1aeca703e530fb3e58729d5c3cf512a13e5318a6c2b0a404e54b5052b40ed4a3a03ebff8aae4829199aa92f7cf3379c754a17c8936f978a168d30f578a0b1586295a04048a16e538f9442f2ed18babc75c997c84a14949c997614c3a7e0412d18be8c53301018992abe4f22394f44b2ee2459d29ccadedcfb94a2e530ffc082b5b1892c46cff1b862f8bc37bf04f072434149d74e62cf20d87cfda64f9d36eea81ed33c2a02fb10dba6ffdb6af30d14ccdfc59aee8745a9f6edf02894d11439837d36608bad9cc9b9422cc160b0d184f27ce064075792a0cfec4a6ef5188aafa9a288f21e3e9bb2bae5c7c0daad5d3779dc8b2e269ddd9f4a74b54b578faf387b85a79fa1388a862f1148c61c383a84d270af52b71555799cb29aa54b217a91434a4fcb449d1f326c553be79d39aaa6c661621aa329a88f2f7af2e5f6d389e7a4dd5a63351350c51b54921a200f06d7567fb672ebe02bdb21cbeca2d9e721bbecc0595e5d821b9c557f365becc19d73161fc41bee98275cc96d972eff554acb8979445217776b68f760a6dda61f26056ea882c7f4c94bf7c997c60995c34534b02427658a59989fa7cc425986eafb4e9c5c5d4b2f342d1626859438696a1eb902e6d46393f293174aca1805983a4e54646d636bc6d9bd521166d6a09d9892afeaf4b3aa59cd24dc9a63403e32990f79313906f84336a62c4a3a47b754f9874392634b4c4912dad9423b2ac78ff90ef72361d1d3247e660fc017d3e1fabb9236e6ef0e703ca2010286f163df20aa30a09c9670f6636382d53cbce2b4c156163b35a7d4a3b30ab64335143e491d72427a37f72ce337bc744590dda2a6d6ad9798551c5643a81e40009024446a4d42aed1819c940e41c1315f34b97d3f130196102e5cc85b84d462ec970564a69e5f7d9345860ccf87c30c1d76079128066bc7f4693cd901ecc6c5a37aa1a74c82b74e1944ade839b0be405040890204058740966c228dd94643e1faa3b9d145f9723656060f24bc883f9a5cbe9725276cccce411c7ab76c1173154a10769ac460fc61cd183514764537146f7f15344969226f5756c7facbd5646aed2926056ad22da84a53838d4560ac4cb0b0d22470e2a034361a80dbdd14167662aa6adba5dd31f700cddaea90f18a62d936a8fe262dfb159fd6057eab9b326017686339ca1467ead94823d9faa60cfc72bd8f3b716ecf9dc0bf6fc908e11056632a8c19e9fb50f26c835626c01663aa801cc74ece934394e9446f24d1a69776916cdb00ed7d1f11f19f697bfb24cdf2d4416138ae885889aff094319f67cec0c27d8f33b1d250b4f7e8fef80d32e03337fd3be636666cfc7da8bb0d1ded2383afce6c679784e8c6b7a8b53350a7d64f1ccc83e6a5174fa189bf685b4c7909e5b93720b69b9b96d3ab7bd3fd631a2b82fc698c20fd2316ed8021bbfbf27d3eec762d546de78bacbe8da57e2f5520d33d9a41d9fda2da5d4ae76eb95544eccaa936eee54ce5ae57635bdafc90cb3e87d2dd23a3f32cb5e7ab2e8f9ecbefdecbe47cbeec7ad7d0a66695f8c7cb5fb5887b8ef4779643467a226cdb9f743de6a5a8259b56ae9611de2fee81397ea50c7ecc77e89cf64af2f710e735f40a26c2bbfe315a2d21fb94aad516be46af96a7365abbdfdc72c8b014ab7d4a4b5d7c7f6f2abddf50d4b2d5f653ee480259cea3aae9ebb52fad57ab52cb11673136fc7979e52d217eb042583a1b1f202a5e24de60d6f08b2e35f1f73455f2f3e0faa003d68921f3cadeeb6c11b66cf03fd7f50a86f6585be7290254aca16a72ac4b381be605c15cf54daea731257d4c35267d0b775d29de9eb03060e3cda377df9ea6e21a6e67f61cfbf64d8f34540357843ead1b37ab4dc55df2d44152e48163eee6bcf14787f44b1e77fb2963dff662e7bfe0da3c8f63d1adb3205b54539c33e68579869c7a772867cedd3070dc33de736917232c13d048e6dcc7db5a4730999f698a8f9d445eb948e4a6d71aa4e3b7ec4d9e00d310edabe615491c9291a34397d084a87c8fe5a0b9b4522775f9979f657fbfb54cb88cade836dd08d5fd3229d1fcfdf30ddee385574aaf007e2d85a54c93c98a57db6a21c27b2d8777f16395bbba1e637c8e0751b64f0d60ed86c8ae50c81caf98913e596ea4aebdd94be7c05b3763606e877c398edfacdb0a6c9c8da6b525e6badf657c3b36a9b76ed7dfbd25e56fd1c26cbcf1c22cf1b64f9112f20d6c8bc0659b2fc731a64f95ab65f6d95db966c3232084a4a300b04d2876a12814d5f6a77e931c6fa0171dc30d926aa8ab0d734006ef45ddfd876a05b03014aa32fbab9de64baec9d0de6cde5ab4bbff9253f6650e226fa8bfeb15fa2628b1ea9f6682b361979071a4858601b92458cb6b2494cb35d2badf76d7deb5f5fb32930cbfd57b00d5aed0ad5b70566f9174496980bccaaf73555d94b851fdcead7a7373c2dd3f725839c3d78c31cae8f899af53d6feb6b6f1f6bcfe3afafd5b0b9c0f4351919bfc43bd4d75ed374fdb8f1b7c02cfcc5c8155794fa9d34fb1addb4e6f916d806f53c0bccf2784c5c601bf433b12ef0c7adb9d8a8bee101eef531553c78e17d5515cc72fa61ff615f0f5e0d214c05b8efef1f0fde75815128aaedc6f4f53153f36bc038cceddf0d276abec7208397ea5a5998601db00df989e80b9c33d5d4ae9cc0c036e4b7c1c0be6f0754544f29dfcaa75fad0df971fbbb90292b6c437e94ae70a45aee1878077f020a2044b0fd290862601b746b323c1ffbd5d6141573cf3cda863feea0cc853a178d4825770f24c4dde424af659cc0c7fe8883541c347a9838bc07af77b62005b445c61e5ce40e0fe9ee3ea774799b9037f94334b2b16fba30214b9f2e7267d377f719a3dc997287b63021278775032dba309928d444cdfa11bff4bc67efeed1b2462671e0d1b146365d076eaf8d3ea9fd1aabe74939a775813637ea13e3e09b3ef51e13e5e144cd21f2fd885dfbdf30ab57ebf7c374bd943aa5966249a055463b77757767825a32d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d458155010549794ae329117f5fe4d4247b6c8d6ec699b76c8d6ae9695b6a6699b686b1f0da4652df4d9f41d03dbc614fd0edbb8fbbed66d988e35ac066dadd344dbd6b6676b9e06a2856827edb4595db726a28d6824da6f254f3222723285807825d248d47ddfa77eb41ed8b24695fa812ddf3fd3924a1a5339af4ca6fd4a3119480cc3acc5300cc31430959003a396d2187386578e942c0cc330ecca5c994cc6e3f164f72621e5f130a121418bd990b0c5608c31fe72feb8100e611914ac048f47dbb439a788c808496b12c9bf8cc78917bde87c6440a0cce59c8fb8b901e5cc85388e9b739e4e59080212623221210605253bc171a6d764170a85e69c2020212613139c13a15027eaba6eced97525251e8f683422954a2524c4a06c1eca8e9890135d271a8944a23967ce5c0887f06785454c8ece892c7f0381b27b3bec29510aa5e50b6689643e01b8fb315193f423dfed4c95ff4475febe3dfebad7a6bb9d21f2f660f7ea7e74a596afb8ae156a71ad518f999a3fa241b947f4c885b70fc4b1b71f85334ec1090b78302681010f46251af0a00d0e7810c6031e54e15e91c54cf160d4c2f67f808e9e127907e806e8e829d333402f40474f81748fe918579beb04f560ddf66ed93b997891850b37fed26b588fc291ab07193f38728d7a4cd4a4e145527ffade1402d2853aaf0bb9d028df429fbc487f7e459bfc48839e852ef9171af529ba06dc6198c539a77dcfac06cf94b1d20f57a2593c488fde44affc478bfe44b77814ede251fac5a7e81abee3748c2add17432ee3fc741f7aef429c6f7fc3a4f8473da66ae49aaad2cf1f6114cc2a95343599c22ddc3ef943bedc5f65c32d34a848fd4732027260d8f359a4eec7546d1f0f2bdd6baaf0cfef7646300be3ae5b21ad903e1985dca955732dcd2591c3c8ff733853957dd3fdc1f984cf1e369e82f1e0d4d9fe5366aa64bccf99150f4e9bd583b308150fce1b9507e711373c385b017870260100d583b389ed3f7d982b2e079c3f8013087006b1fda5cc5c71a0dc218b00e511a04c02944d6cc903944f6c958b07a516542d1e9450881e945e5879508e61af460fca32b078709260d7f0a0c4c2f6973d22cb0b304601c61ffb3481b90ad90c60ae422060e4f1c4f6973e4416d4cf4879509680a5e4417903d0835206260fca176c972b387950aa60a33c284f00d2005f802a581e3c6193b9eaf4fcb1b3e75a13c5e1d8e4ec41aec525f1713813353b1b01740278185c8eafbafd81f9fb408f7bf9aa7ba53e1ab8570c6ec607fe06b9170dee650367e25e7b7ec8c657229b938d888d373f94e32b11c8e7e56c1fe8855ebe12bd3652e835800ff4ba175f8d5e3c351f7f6066f940af6bf96a64d3e5f86ac4f2026829e061e4d4e87212d0bd7c3572d9f88a04e3a91c5f916cbc0d1f1883004fe303570af0333e1065808ff1817f00047caa7bedf0df87c38b7ca097c39f3e30ebf0261bd6877ce01dc0837c390278ef03bdf9a297af482fbe2ab5b8cde63e30d7f84df4b281c68ccfbed7a0dc9fe22b66dd8848ecd257cc2a7dc4379ca81d999582f4f2b514da734d8fe4852ad086ed0f23ae3c1817892becfd64fba7a24ae4fd55a2ea7bff165195f25a9ec21f230b0def2fa3eaf4fe35aa4cef9f4555c8fbe3a8025179ef3f8a2ad2fb83445509895d3fc56b557b29b45793eb839ed763a2a607e3e1d768d0b2a63e91d3edc2fdc2150319cc9089a015ea38cf5b19e707c4b13d52e9fd3d52899539e9bd1e5355fa78884878aea94af1f3bd9044825929526829124524b28844f64d1ff06c19b57c5552c0075e1823189f80d1c8e5abd20e1f7811f081f9001fe819e003bf001f88dae0c8458091cbc607c620c1f8ca6bd1819403090752cb571eeb03ef0004f0811ec955e3036f8ef19be45aa1ef8f95be3b13355f858ace5a74e643007406009da974f63251f34b2dbef24636246fc3077aaaa7f18179c6c7f2d9b064f060c5a7f8c0acf2347ca0a7e2531ff8df07a244bed6a9d4e22baec5f485782d201fe865d36f1f78bd0fcc204ffa402f7b8f4b313ed0f35cbeca30a5d5077aaaecab9f976060945ed4e0a2856865c4c2f38177c50766d053f1818fdaf6537c206a65dba7e18bb1eda73e30c60637172a05e544dfd7bc3f666abe89be51e8ac44672e51856bf93ef08a7c603e712d2ed307de900fcc20aed67b1f78eb933e307b35c378f6711f78c1bced6f1fccf60fe74ceb1851d917fd31204934a86277213cf25c1253e5f978983fb81687939530abd66d9b3f46e68f916ffe3051d305b3aed603c7aebf8553b5851325f2606c62c5c1786aba0af0c5f607636c7f90c6f607638b3b6d4f7a50b4bd7bf0b4fdb79b6c5f61ef1f7823e668546fe1e67221327d7073e5b0f5e0607ce5c1b88dafbc9608f799740683109db90044672cd0770b11359fa46f17226a7e49df2f449418226a7e485f3244d47c4e5f3344d47cac331144d47c0f46fbf95ecb3d9f7f0dc89814418e1385b1c7eea05909c06c067bf6982aede361fee6da42db61d6fd6264bf7efdc69c1a732610f3e5c53e75104d3b6d17d7aa2b9594827c6a11d3c6a6fab654fb6bff566ca3befd1a522ba8d66fee983333b6ea694d1993a91666c25029a594f6845994bb41d81c39eac77e75ea21a62d3eb5263f45ae021f9d395671549752448bdcbd1adbd9f4d8adf956e9bddab35aebacd6e24d33b03dcb38b0bd4aeb79ed568a55e9f9a8743942b2c5c8c2d1aaca3c2f68b470628ec6e9b945da0791880b3db7fd48fb307a137c8dd12704a7a5765fd3befe47e374959ca6dbd65a2be5b4574bf16bdb63a1d742dcb66d4d84381c9cd073db731f12fae244718fb78d7bccc27884f1e066cee6f160d87aace7ed6bd769cd308fc56e66f10e52fb64952529bf79c4d5e6cd7cfbda5f9be9cf10d9be7633fbd56a4b2d09eb106dd86f26512f9eadd9bad9e5b425794de4a1bab9313d5f9e9a3b3a663843f7a1c57f707101e2c55f3c08893d87e7d8539b4fe8e8cc1e134fd7d4b4ef5f65cf830123128804e26660a4666066b65028f3ac808159a142249339fcc19f51124831a418524c29c68bf162bc18eceda3de7e08aa450bdae28b91690b4a2966eb8b17342444d3368cfabc6906f460970303830a0961c264326158e6995971c2b0138642cdcca050580aca8949c9a79f6444e4640a01f14aa491a80b7119f4c19be6c9661040054d8b3ad0810ea43083d0c318dd9d46c16ba0c568315a4ccc27e613f389098179bac8f7cced6756ca1817db6a31ad6e83981a54a734e83a775abd06d5290d64462312c99d569f414c754a035aabbb3bad3e8398ea9406f6ab775008a15d34746e982827e5705a29a5d6524a29568222627a3d427272aa1f86619809a544240444d33f42e2d9be7e23249ee781be5a31ebb4831a7312e5fc9c481c273a461596c6aac53af03ac61476b74709daa77598804a44ba4ea49f6464341a6112c90953c9e4139a689accb6e10fc6f8e4791bc61fd0e7f3b1b644847b1073d98cbc80be7a82428c09874cd889cf079441d68e80be7a62e2e38406851813fe68260dd32c4846260111b998358ee3e6b4f67ef593e927f1783e235fc88b0876c262768233996e088857228d445d88cba00fdeb4101c1210d23b89424a29a394324ae9eef7fee007d2bfede50936dbb67138140281405de5386b39ccb25e04111eaae34648296594524629dddd3d36d28d90f586fe56298da896ca1f48296594524629bd08228c9052ca28a58c527a11441851f13455418827bc5eaf1748ca70cfa8c2bab1c938a595717e44947aa279da544c54fc2ae78bd3cacfe93ef58d952da5499ef387fbcf980be01bc4b1294663e5e49171de8b73c0eee6494dd33eb33c9b6b797f5664f4cbba400036ba41a09be50e0f2a59a07880b08dbbc11eb6fc6854c995ce49e9bbcf396f987cf273b7220a75a2b96354a951a5075d488459a7ab93c14dc6b9b146a3393712694e6f2b792021269f2669ca3e208e7db72b4861081b9594d29c85c8e0dd930819bc32329d73e6ccf96db307799220cf584d97fa94d807c4b1a3c56ee6d13612267d482412099449241217ea2a2591a614a952bfe48edc8926208847016fcbec517d43cf6b545e91f78ec5a85d2d4ee9eefb6a1d9fa71317606efba1ed3c6cca45150e9b1feb52f38b691d3c7583cc76b74c5dbbf6e39f441629239d1f4db7c44131cbe3d93c9ecfab94af5d9be9ebe345dd7a32ecb5eb239a4bba7a10b4e3e33803ff267fb3da832b42640fc6f8e4d5a87bc919f81bb9240b89f27c31aa6ce9e5cd02987ec539ccbd69bbbfab75605f8c36cb3eef4c56fab6cad7de6af6dada622da68fd16dd354de6036363698f616b3ee5b9cc3acdba67dc38c72e4c8a1af8f6b331790fd4a44d8f3efc5f4339cc364e9a0807469912db225f360167d0fce616e3ab0b75ac7e733ad691d2e5fe3f39bcb57f42567945a92c5fc99c1b9c1910b0209f0415fa5969c71b71059d0fb411155e6db0f9c1b2cb5eaf6cf52ff70f56e3dea1686207dd9cf6fb2875bd3ea263dbe68fd6edcff34786901b61e53c5437c550db3ee8df1455ff4934d481c1cfba50765e86347d10b165ca6206a7142b793841d5f2a1157dd4b9620b25013c4195ee50ff2250829b3e34b1c4416fc333cafda1e9433dc8372c78e36aa50944774b16ed247796fceddcb7b927d9247fad26ba2d24bbc8325954a928725e5e4b464383727ebec6ce6dae49b3d3f73b92f39c7bea1e7e57c84bb849215f67c90d4b2a7ff007b365d4a62823e947557424297882059ccafba94c4444d14f781259ced034b4de00f2cf128e9ecf9195872b95cae56eb73ab84444ccd2f1d61cf074b4bd8f34b5128b54a2d8f93a4e7eeb2c862f2ad5769bd4a293b6be70e74df4ae547345bb67c6d30875801b306f6dd970f304a5de42f23574a69d537acd57443eedb09732f4490040a9a60010f183c91c5f4a09ba68572901c3e80d7fa9e6dbb3e3c1e8d6e5bfbed356d33226b7fc3e4b2af8fb92f6abec9c838ab744431f57cf2894cea481dcdf3374cfaf1b06d3f238759db1723d38d5a6a37cfe6f9640fe9d23ca43f5fbc0fc2ac7ba9f451431ba98f48f2a369ae5353ba46790a758d525d9f5813cc75c975fd65dab3b97e0ddbc8ae4936a6638c51621b79bbd423186fae453e271b74bb3665e93a84e336d72021d75ee7ba24724d1a8d36d7231269732d2a9536d79de76dae4320209b6b2ec475369936d7201b74bbfe8c90886caef1fee85803d342dcd7e40748b00dbab5d75efb4636d71b09c9e65afbdf5c7bb4de5c679feb5be21a3331d95cdb9393cd754541d9640add5acae6da51a8cdf54ca5aaac34d014a814941393924fa73ef6ab5327955c7a37e66c3d266ade88395b7bc72c0d874dccd9f63ed53762cea6b4ce1f1c0ed702c047cc52bd2623ab7cc4ac1b5456c4d5df302d9057bc6b0dd0ad42858c6d5719594776bd56d25e8f899a3fb6e72d667942f0c3f6f963cbf722f08d952d13b0e2fac64ab7d3bd266ad42345a3c83bbdc9ab628b591bf79a8c6c6388e3e6f48d95edd70711d962569a6da8644a9d89925a229a1100200000d317000018100a85635994a561d87c071400126a7c5660563e97c89218875110045118640c318400a3804186204343320b04986e61db4cc327d578348d024824faaca79c578f46eb3a6c5e169b7c7bdd4f91a600c7654ee94fd86568df1c9851d58f440af30e61d556397f97454a296ffed4c1a93e4e07a3c145a1520022d615136d3ced4815ef38dabec40cdca8d59eedb202e38a02788d79f1d8cbaac98cf81929468bd889b8c9f6d8111862acdddc862e5d2e6302801cd594805180204bc2ca95da843756a5d1b39efc4c6609c0c91d07c2fdfe9fc8543cd32b8626b902b868ca0fa4781227ceb62ce0ed2117b5efa3d1757ef4334865d8e4b50357087b5ec701731280cc6e28908b56586d87ead146c24283f0043f89b06ccf63789d84dffcbd4df53d47db518fbff28f24803497d62c92f7a236d1ff7d9c0220c00926005dbf47ab378b9e414f1c5d543683b65167897d6f3921c551f7171909186d6818ac089a01bc3f93c8d3ac10cce806a5c85fa766d30c50a9a97de8dbde457de0b5bfdc5eb5d2be0eb9437a774ad3a30a33717952b940c304b40261efefc886616710ff50ef62a73a0bf5d74df9ba02934bf645cacf3ae4664a4128d6ddbb893c75255e284eba99b0840a434653023b3591ee1faf93826fa3f8f0cd49995bb301bca70353d663de7b6f1192b309a958cd1727d38c78480c6efd024c8007fe24eefbc08c45039a4e72b40b575965d37e01693695c36a0ec4ed0b39e3d88278fc16371ebcc65020e2d93b3c01e4362f231e81329610e8b4084102ae791029b3f07ae229983d17aa7fa6835b084a169006a0392a3a2b69f5d011fb99674113bcd5907c7c497e3bf46370075310df859c90e21277906818724e059f62ca923b20c9c9246e32dac644a2a3380e7c0ad428d5c76c0911401ba3fca0088356e68972b1bcf695f85f13c3f074e751acdeaea2e89bda95ebb6efdfb6b0ec58757cda0cc8cecbcdb73e74d694a5f01924676ba0ecd2a2ac0a387286e29c6ba22d33fbffbda74812c9cba1ccb2723e2983120f4e9227ae1964c11102a0faf07dcc84e2367da287d5de73735813b9ca90dabe42b0d96d290906852b96fad0d8ac3e6c8b2bb1f5d5ea561f7083d28df46bcead11fbf42187a6b022ce74d8229382221777c66f59765a7382f41df827ff949bea5f4760d3a740e2e6b3fa3cb0194c4247198528b9b4e47f215366942605a638a4a2c2d9518dd88dd75cc1074fb6153f1f63fab8a3c97c9c5a7c384d806c56de04100ae24fec43bcae2c85420b9dc1d6b1cccd2b7d3249e716093b889742f39b96a7eabb94e86451f495e5cb5bfa906363f5d0273724672bbd0a3bb02f7becf876169f9d04476cf429412df8740452030be40f6d59c3a5eeafab089f475bf41988e4ac763bdcbcca1be2ae6d75615d548741deda44e5f90c3918446950731f9e67873fbdf8cebc69582e50c5232ff27f2ff72c4268fbe2ccca3ca3b1b62f844264abd87184988f18891074da07474b1b00b07de3baa55a94ac98413ea59f79aed208999b23f4af914d047b67585232bc477a010985970334ac9a9f71037c8db019190b9991924a84291dbfd2879d0a099113fc5129a04485f7528fa0447c143c150e26542bf78d024e4542a4fcc7eae7b2c553ae227c08a6699ec39d2f434e056031baad2221f7989df5059e13f49a0ccbd29ea5786e0fffa2cd91b19819995748db39e5d2f994fff02321d98eeddc36edeab90ea0439f501b849d562e950fb98f8f8408241d5039a92549c85250c06eccd87dd4a042fa1d919823fd92805dff62a6a41e00bc8ae09ef7357e2545961da14eb47e9744ab816c64c1d2194405659f98ca260e890c58c96638626d4554394a374a6306dae18ba9299245bf46ec4e6b4a43dc19d9c7230d30b5d9c943f30a8d4ea9c330d0f4911194b6885b911c8cff8ad0f9a31600e46865e80618008688ccdfcbbfd3abd2aadfe27dc9cfb070a2c3dfe10bbb16f46f50b8f2cb3bedc9226b51a6e83ec64d06438c853e8e0af1b3736924233c8bc3b15fdf053c30ddbdfdeabaf8906ac6db643e8b01a9eb3387d897a9089a0b72aa14cd70d4a0f25448cc06cc928ca8293e647f32767e2a72dc9c85c6efe4cc1118eb981808f022cbdda6fb168e60185f585c1a263f23eddf576377e571cf0f63c8c51b44e62cf135dbb34c8659905fd60312726b87abdae0ca3685ae8018f724824deef23566155f1a138d22259b5aba803fbc2b9df4f8e518e88792cbe38926139b6ef510a184649416ada5a1518096b19c8e1bdb6c128e8ebd49957c802de9f88f241da7f5eec4251d42f060f3ca5917d9ae9eb60d47cbb807b40cada370f7692273cbbec0457a93845a430052111c4c4f9e42fdbeba32513f576aef7d704270f19774793e01055d0528e83a3c2c8c851f7d19c51297d47a3f00085015beab5b72a863f08bd2a50316dae21a581a6dce8d5f7d3f629d1bccba307323918db3e10b5de702062444883c1c1601cabf8bfbd78b88cbf8e91cd7f6424cc19cc8c8aa2630090052cb0521e720d9cf57f04a361a7cec70b60cb15ac41dbbc352e29a7f13ee8a8b34021b9eb01651491c09e3c56836a20e1e04fbf0ca77622072c0f6457798780ee9163ef1b2a47e6ff4719b1bdc4daa73a10060120ff914186803aea9997002b087b90a4fa9ba25be83bc4e337bf8c56f531a18f192f7093af2c6f8d8826dc86b99474c5551c28def7ef76e4ea5effeb4f7dd216d78345fed7db505cf4a557529c9a31bf44e6df151fa6b170d48cb00238b12be7805ad1691f8e032e7527c0a5ef492e7ace45b6c3d3cb0f9a5438207ca9c118b71407ad868b32f310605c35d16ff82b6f906faefe1fb77de9a9df34adf4f3fbb0ce465526a394bbe093750f9399555946f8684d584f69783d0f6b8ee2744d852a80b79f68740519f20dbb6ed85b63cac528f61b375ddba6bc715e79a51355e7b07960c8cccc0b24757e481f23f73d2452bd68ad88359c1b18916ae8c2cd055804f47a2418bf23eaa045ea6c3cc2ee837dfeab4a55c59e3fdd50359e7df5976cbb1b454f1e5ae5666754e410283301b37e296ab966d140d793511b5212cb769109aa97e609f5da0de4e406c3ef4d9d6d1a5f2a2283bf6a01b0e2549be1738496cd0b84964a66a3be7a63ed2e60b4752807e7b232c988818aaca8cd4d740b871ab287b83b57f3e805988a2b2ab357b086160af28d5d7ce68d006ea2b337d021518673b1f85f264654006e9fcf348c37b87138ea03f5d9e9c2751bc291cdae97c01429cd8b06ea68fe9bdb220423b1f202d610f978b651b3598fd0cae1e3da5f06b8a85115c8a0b4466ba896de385bd96b58c2a7e6dc5a5ebe87758e9e28e307e420c93542f2f516cf8a5dd5cce40512109f1971843448f23a04d6aa0c176bee753ab414103bbdf206ee6ed4bc26414e13fe9ee58a848dd74f223730eb49943731eeaf9daf95706ceda1e35f4cfa99f469dd97a0f95d9cd36fefee788be0e6a21576d50fa237e024be4f589e10fe7c239ebb1d058409d47ba89b1a749be54c761be3ec9f2d4086890bbc6d85a7a1d17b3619d738551a27660c2481f54a7918b2ef3c6ce4a6fb2e7aa339d2556b4dbe55905c843f46e1e40ef82d875498b8a5935ae4fd480ed146de95d387480cebb7c97058dc0a694bfbe6fc65c8b2208f264f317c53cc6aea833bbfcfab88da30c1b07da116666596e94f4db4fb45651bc11ca59790b5e6cb919fd8d2e012514ea4ad339d5e1664b2b6c33150d11189ff8835821a21a4576d5b9b08b7468a6be2dd1e5dc7cb5bcac4e8cef9548d0e75e4865460326eac5093f076c2b75be3e8d2ed16b70b57dfd0956aea88db331e6d99c715579af86e4c922b3ce45cb08a810ff5cabd8d245be927570f1bbd54968fec68578852e3e0020b7e92af820978af4e2724c795e5bcf317e165d65341ed3a30b6ea395387fcaecc64bb8028107c19390cbf0b99f8e9399cc8ac927a861459dfa3065a1b6a98194ff1737f72fb01ed8feef3f1b4df4615f798f51d5a3537d0ed14180f00f5090fc9184a6400a9a6204db538acc8d502f3a5f1766cd4b38188dc8ae9fb2198a56233a10847e524644e3270fbb93b72900b08ee2a757435206447f92ae980dac7911f244c5297c3b535877f82b20a54a9741bb461ce5d7becb779f24a185467f88d8540bd2cd5d02c0f55e34ffd04b8588ab347a017d3fd558a9aa87440e4c69e349c5b44c7c1ea7780d19b61cbfee813c18c0dae7119b4e2da67fc92f74fd339c66b6c1e3d09ade2a3fa463a2bb8cfd45c2c4f36aacfdab458674230a06b28b1d18ced2e85a581b022f1a2ae9a4348d9b85fe8c0b9401c08f72a98822cede89df0ff22835fac4d268ed78b7a14a6a764022c9835b37a78b465a05a85e4299da5b187f806c9ab1ad28f85bb2cad9c7b0cac3b26f97df921bfbaf8da97f8b8e18a1e8de1428928fa65889cb7c8aae3164e65f0900a8b505907a2001dcc98788c0839f7907e2c55a1878e2aa923ef7f6a28e8815b2c7619151a890c5b2bb4df22d64afec57c6f3186eda3e91e052a5db3528c0068f65e26146b0ccca42e89c514038570e48f7536b5556bdaa924652804b0cf559c2ec45b2d60417d596be223d462a7d67a1f6e082a340c385cfebab6b12801206a5253457f19fb5914c745f3c5926a7ee25be39be4483530acc3bd6cbb85ad54a9e39256d46cda08420d2f3960f0efa9c6afc96a4d97e6cdac3c03cd2c534d6bc66ddd24f2408e0a926e56f272e269c2d9e38cb194bee60e5d8ce136c203b09a08e82d97f22bdb2837078fc8aa055416efa85fa8dba29780537f91a9486d308ff9b84a07a393c791f44215f7ec6970a5ceec311d21b37394f1335fba4f9451efb1a7905849798e95258bb837ca9aa55d16025f9acec937538e536e14f3059edfba567a87cfba276795087c560b2ca8ba4443bd0e984f829c0455af2bb4489ac6af589e5e028a24bda556e81e0b88e74b975d9ac265d57118374581762a1ae1b173d939b39019039db2203f20cc6cfd6a639a10814b5f2c5c4e5e6d976c63c4743838375128f16bab23f466f7ac844597ed1ad52f88f5eba3827447f885fb2eca1d579bb3cdb52cc0915de3638d6d8c03178fd8d44ade1dbea81806b5003821d8ee217454b465749b9ffae8f4e61d960e297707fa584519ae9b4ca92ee63833ee66c34c31c591b1f823a9eebb810d4b03ee640b9c819ce2a0935af29b18f44f8ac638628df9cf676d78fb30f34df660a798e44b40c84c2ca1c5337045914ce8214c1ed322b795edd295e5150a461cbf00fb0a7ca973865a1330289ed77108acd48de042bcd6610859a22f9cbce508a7fb9b41b657da3b5da42ad08e0ca7d019c2648f389a86e62695edb9d89df0468a9520d486397fcaaefa8ee400b4e0194ef02291fa7aef7a397bf4b13684540d6bc6246d3725cbbcfd2359f9d0273eea216e7d5edd991e874b4c9425771cb2617a08c1955f1268a8e596f66b58f7d74a49da15b1a9b05e9d1d2b2c2c954db3d6c70bd7d4e1c76f1b8bcb8caa14b5aa72e6b605128110e9d63f9e548a934aeddf6289abc66d734cb46f173209daf583a60f930e28435549ed0a996f6b50daab93c1b71330178972e371a1266f5a81c2640f64b89be159fa6d8fb01bcac26cee50d08b839fa490c954f631a84940fbc7d23fe36199bbf64c560d27c6af16bbb50bae46c7c38a82ce654d9afa16d79e48fd8526f47c68b7b9ea0b71d492f831965aaf4014c095694cafa1414cf3f983a38b4a567900363502362b6ab1ff2eb097e62c85e056438dd79c8a69b49508aeb86a146520d41b72a22fd7ce6cc5b88269ca24abafab7c3d57cb6b12bd3fb33e06375f722aa80f54865408ca2120eac63a9f883a8a6c7d7e36a0cba325ed009730ec9b0876040be07d2093b790a69cd544c841b2587fb430aa4e2e0d61a6bfaef34b142d0d2b126f2502b54d1f70378db5a083d6417ec0b95ce7bc9117dd04f09632867374f9438f2d6d557df18c80ce9c89dfe718a76cb158a4c79da4fb9bc01b94a18c8e32b9ffb1e632be6a1b5c1abff6fe731c0e5a07db7ff659025a1497e7d454eeb02d333b93f59ced2906531d5f48e97b6d2ece3f98028f5f4351d374e34459b79624f37e689086f6e9956079e78fc260a0b920638399e27e5e881bb2bf21ba7a212202f9d492128fb5791c900887a5c898fd3cabb0bde8810aa2739d1fdd069f1ddae7cd59cd16b6b2cbba8eb323dda1db1affbf59d85bfddfa7898f71efc8e81202d2d395a9b9c5a150ad4f5b9daaa33d634a627c85402c798922d6113f257c86c2b4051c2c7fa60933debec2ad2068e68e705c5625587de04f1ea83e3da6b70e61ddfd79aa181c4a9bdf938ed70913bed37d6d107c88ba20bf45557dd9304cf026b3de80c3f7bf6766143a395f5485f932557e5319f300b995c6490d38bf2dd1a44b1d35fc8a02aa4ecb5a91859907a85ebe7e23180ee458c382bf30f436ac22bc3dd09992756062407992061b1c7ae01d4facf14d5103aa12549bd9ef2296bea6652657d14ea5bd7b706ffc2352dd0a437d35705fe823012e31e4515bd0127658899053a5c0c05648fa5376fc731cc1f8279668dec810f002dadaa67961f41919eef8fa1e6abba67b4fbec913e1b399be66dc01bd9071f6e0fe44fb8a0c26728577dd5c0824d565e0a6623e92a31740983ff66c712dec48eb825fb52d064673b5957b6e445cf26b9ede4080720a1d45c64ce83c90dd1ee4963130f23139da71fe867802a9b384861ed58824e60100c9ef8341941d8a0c0ad638f3388792f6e36c2a03db965a7e54768832b93eba808304f065a3e413ea99845471c008a41f32bae5b7cc889268761765c29d08bf015b377f2a627a5627f785cc0e015e94d41ffc4442b3c3cf9831014c75ca1cbc812fdc2f57bfd5e3c7ee17843d2b3e4327a9cbb699dc9b1a8b68cf391dae9e49ab1e499fcea06b3f96ec3c2fca9b281a9b0fb40189034a1a16163fc2a3cf1aa727cc420064d619b8eb0ea806b10ccc3c86fe3049e8da632ab569bd31d88775e6035bcaae2a88a7916d2a8499407b48b64f4d9c6cc2ce73569cc0f5c2a4d67a83b435d4d5e2c2f2eae71af00dfd907eefd875561412c429cc2ad618ad197a441cb5b6413b5cc52d5a93365d6ce96db4d162adea919731591a1285e68d4b6823fd9f31bdc5db6af855d021734d741d905b9d809bb765c8c975dc7d95c037941f997270e0661ac92327bb88c5323cb3e97ae10c9326b07b8effcee6f0633c73ab23045170aa8f51c91fac5052cca485d7b1079a546d639b6997c6202ad1b0edcbea0d6bb2fda54591e3d392c50bb2bf518280747af9a8f81ebe311da0be24642a729c11adb39db123ef37d52ef48b6784cd2629b8eeaf1c2d8d767014f1ee86356f981154fcb72b46c698cfc071cb5dd50a36570e8bfb89cf8ec5d8c620f449ca4b7095b6a05fd9372aaf0dbf3d645e101838d4b543385641fa2edb1ec4600cd9ffa49c101a61c29ff3d5420dc076919ccb06082691097c14c63797a1836534a88af6003b97537900ae323d83884ed9535ba8cd5829fc19c5467b1396226cb22d4e083710803cce59d16b9e898b65dc875fa8bb1a06615b0756811626aadce4182c357a3b3ed90599ae43f631d0772d5b22804279c760c0f85d1ed7f112d968bc7c28cafca1a0588a70636b114c655da4913c6ae837c1650042acc70fcad12db956fcd71c0289957d58c4e83fa98f24b2ab1a52efccd1c3eff98b415ab288d80c65e754d1427d15e5033adc59044085ca6db1b39dbc5a3d0168a0cfd4ccd3e5082ceb28bc65a3400de943e19d46c84937f2dc06d5ed4937fb853b0806944e08e5de97d03857c10584fc4610a79eea8f7c5e5339301f6123b6a6706a3b775b816135f58f87a090afee41efa3c1dda799c43006d74e3f40a6f7ef8052fa09ad7cd7b0c2806b37f2ab41ac13604b6591cdc91f96f012336c9cdf1371c108d8b86ad20b7aef32acc74b2b8451bc9cd8ea41cec707ce02ec2870e242bdc2e70d5f15f9ac136456c71a051e15fd43a2177b257d9068cc35eb5040156c32b14434ea90df459aa01a5ce31c49cfe789d3508645a11ed65a2ba93da7d598400fb6cf491653a305b5d3c352c6b4c42419a72d6e3c7a2c26cc76bd742a12c8fd17cefccbcd823d4e92738b257646e91f1e500881b087ad42ce91a0b0a0a24a601869496d904ada0631314d5716e027bcb678652326de63bdbe037e5c9085d798d83a9771601746e3672c59e5212e924ef45b67816a4ceb856778a2aded4e9156d5af7c7795c245f35c741ac42e3b72bc12296430ef1f20647c912ecbca0a8fd1ac5e4b8706b71ebf57f1a7bce7bfb857dd6e2795d1626d5ea2ba871dc66021453c258d0361a16746a0ca7eb3563a9b24c3777edc12d21a6630f447631b8eee00c3e0d8612e9f243c6ee3a1ab417b9ea3c52c55248c30a42a1eb91688784d8a7b07b13e5707af0db2e03c9f7f8c8135bb136d7fc1ae62af2debe0dffa9d52dd5f01b91ca7c8225bee01d09366b34f73572486520fd21fc4438a84f2a5ac7ac35a320f68eb4b27d55d2c4e10c231f59c5ea7eca8c31a0e747a45685a185b39dc326233a58c1bb0cd51e55a4bee52438d0fda2f81b21d23c0db8302a2ab9e768f4ed861713873fa634395c79cb5dfb1fef035d3d934c7f36acc0fbe86803d54cdcb987b692f4de6bc81e186a94f1cb04187969c3468a30ae3842272255e83c10be8c9b43d35704aac2a78ecb56109d2deb4a99167c238e1bc2154db808fe06a0f07478600b94326de4f942ef696cfd8f026e8216050a3fafba65f72ef0e02cf25892d1258e2ddf252e4f07cca2176126fba1c109de27f637bc9832139015a5270a08755e9cc34ccfc14c8d1021e5b7252f2b4028c7209506442593f3eca86dc8e68b01aa5844553280fcd1dca8279bcfea093c6e5ef7e91ee9909b1e40f3fef4306e33abed482e76ae666fe5b10930811f3261b4fbe0061f9c9389e6d7adadf1a6151907f66013982f4d91fdbdab77c69d84f5c9981a08dbbb2169b29b28479a3cb214557897dd8fcf9e62398bc81a456357705af8a2408f28d45ee02f670df5e70ef40b6a56223605c6c61e46778877adf14b8fa5778dc96bc544cd0a09b68d93c2b45d77fe29a7d570a9bd8158480b0303b327e97e85b6d71d2da8b908159b6dc225b208790a63e00451a33d7b05a4c7028cce5630ce6260b575db5f696c2a4a40a0ba86a4321fbb0de9a4f224352f42a1714a24499734503962fc98d219e0a7a7ed5bef8c2d15051d4d8911ae54d60c61cba7237cd9cd3addf2a4a8cef94955b8750fcdbc7b9d6d3b926a2bc46dc59f633e9d33beae0d436bd8a9e744e59d0716c15824cc04900af9cb8dba21c363a03b5cf6a9ebde5c6ee1965f03ed9a883a7a9165d7d3277d3eb1fe810509e419cdd8e8b41968a31fc09e92d3b56da0c3f4a43ea11e53d6d2b39fa10bd483556b40d35540dfffce772c0d3b7ba74b385a83f4d95c3f561ad14359c9543a5d6704898b819a7be51b6334a85418f5834af818a0d3bd61cc199362239102ab68b44aee192b8004b70859b36e8c03565d975fd6fcc09c66633a9d232739c8af4e94e4025f2dc373429143b7cde9b61ef92dba5d51a3e3b7c9c981090847c53deaa7b6d041ae1c1f7b40d8d7ee63e387d0c095f75bc0060e47f58d3f735b9833d344d003d60a128960c0f7198803dbe7c4452275c8df25ee089e721f07aa28eb6c3a8b268097e32f23409963041f452d42bb8a9444d3368141d5e94721a758d9602e1262390587e293bcfa26fe139170929b2abe9b506d9a00f5c2a69b573994aded8aa65ff9001503fba086970c2e4cd0ba9f11af845a2e0bc7b788e4081c51f66b4195e82eedb3b6207417116842a43e18d03b073056398b0b5e784193937e1ada65963ca8ad57f88b5a446fbeab6ca9d9179575eb71154e0cd67796aa5092ab6e3a763d1ae9c0e8d43e484e739a9d5c7d7d3793f687a6cea112222a15ddbd000be1a20d00a5c0ff7ff43fc23d6bcb0797f92785d25692c62205142419d8bec076a20841f99e90553f1f94dfc5f6fe2b90a81f6fdc960d668f5e395be860c9c1a4895fa5f749e87e82b2c778d50a8c5111c03a88fc6876e0f061829f3f286046edf8f3851f6e796c099b4815ffe3a63afcbb056879418bd9d70a9a452bdd87976b9dc4fbe78bff5e49b532305fd59c78034dc9c2cd7c8c8749bfc52d3bc4311d52014d9e3c05e605915fb27410a0ad53023890e8355bc73cde1042ac82e54751171b363959c1de70f532148e23c78d4c3e3e5b02a89e0c34905ce91d570546498dd1ffc775281f014feefeb1f17fa15945996a875ee09f96ac6167c7fcc43e3ea4f95c51f6576627fe012db8f8fed0f8fae8b868ff12929dfd8242331a843f366aac81dfe31c6ffdd87d74422a4f68513848115403543576d82feaf53bb5c6f34013d90f9263538728ae23f5530055e896a10e67d2517d6cf99ac51c65aa3677726e5f16cac8b2175e2d2b6dca1fa3c3fd3a95a9386bcbd0015a565715998f0f38ff87e843bbb01e5d1864502a21807642cc2f1b54f861001f7f3c057c4ceabbcdd65f7756bd70ce2708b2d83285bc757a5fb77026214ea22bc4e8fc06e28cd18e1449a6fe61ac4fcbff12caff425f4a85c8347efd36f957cac3b67ceca1ccab933be87b8914c7dfffb646cadb8ef8681ca200db3140b0d95460a75bddd7c4e333bb491c96635ef2fa19c862e8b1c198aadd6ddc4f8a2e1ad7f1253dab796c21876cee3df4d7bbee65fed9c59162e01de6ed734bb35878a93d957c07f2b6400bb0a12b2a6316c64572d2817b0ddb4fe910394ed82d729a6e3204eb99fb42ef4c164ad8eed7ecdd6b675610fa0ba3cb735fd51a2e85b5d4e21022d720b1818e9210b7e9fb5793fd37361879efe3776491cf3c05317768bcb180a573d46b31d4c6f107ed353a02dd9acbcb28411931d6951911e9b74155f603de8ca87edc86ae72ff777034028eb8f91c9470ced67c76477a3456e04a5757029bc16df7aaaa541f3b6f3e0e8d76e6b05cf47b16a00f33bcf296c172c2ae567476885ef82f3f8343874faa0dbbbd6b8766450a16c484b316939b79d5ecff775c3ae10adca8319eae9295f9b1d5e8219b4d141fc99680825d65a84e7ffae7d765ef8d8c0cee8d3759d8ca2940af0cbfeae8418b936e473006897ac1521b3d3859b7258b6c05c5aad394f79faa10aa71bf95b0eb0cc944a391e0d4403eb8f39a7dc4813cd51e8ea19e191387da6953fdc02c8535c1a6e3dc5f043ce8dfb098c64feafb40c8158ad940e0c9236492e0bcdfb67994018b3c88863e492bef072f92b000b4d416a205dc63b2d9c8f9f10b4dbf8e01767be5a07f75221387067bf7dad0b01a512ea2d7f82886c638e4c8f82d6e32643d7483504005e4af58a812ae50d248c085e11189afc1de3060d68f817cc507e075ae1ab843bbb04f63f8410af1db79b8d1fe10e7be7a3c4dd4f30e66b7fe34b90464b03cc7d9ac005cb6d8eee6121e5c7f62cbdb97a49085fd69e84d86ce46f28fee5fe6875ec5816e29e505d0149d3aa605f3d153bf9f9b6dd108b4d6493682a40c729c62603be0259c8eba08069411130ee9a7b34d622f803c4b07af7fac7a74d8edbec363d190ab12ce6b77a57082c3dde39df9f3b1adca5697b55461d9f07713ec84734c29c2c15a6e2a232f009a85b9296c3cb376a2552e4da01c0df2b666219436cc1b9899137e4fc90f7339f7f71f3c2262409f958c104559b575f56e399723cdcd535bc98fa3df53b5d0052ef063f220bd470618d69071bc3d46b26a2015a37e606062f1130efbbe14510b33cb66bd0596fbb8199187cc5735bd9b366d3526a6dfb0d1208d5d63537d7d9bd5c282f4d9b79f6a53778134437f3fde2fd62f00a09d3ad3d2d9f1c58d59dfe8871b9d46867396a5814ad48c78e0ab7b3657d7fe9856d7b019b77c417997bf3f6dd63b52db99e649c97932b7b60bafec98a8e216405d4501e9362088184e96cdc3868146150008425f3648f44b220628530526a2e27ee24403a2e381a58f8682b5fbf3cc6bdf6f0bf23f60e8ae903480930e2b79712dd74dd99b3efdcc1812cd0b56ef26132d945614a3879c0897b4871f0f8e817100e4411fd52f25319dd7a09eb81ff98cf5f4d4b6b98b3a80488824a6b8c9c7b0e698dc17a31652cd7df7b873cc26a27d2ac129c677e1167e86bacef93db3e65a1d2157151b0dc20825fb3b064f448ab31b79ea1b6a0bdf8b80d95658aa6a64835d5c76626406e8ef3c903e491cc1a8492ff7a3d189be1be9aa63c2871d043fd42d332334129b01567aef02b7d1e16674d8e6de982ebc58481a35e4119e4dc2f355b5bba38d180b72db0f20f9187cf149da4d3a7ead22697bc8520dae0bfe4a5ce2d892ffe0c37e722f4b4727fcd4287818523019fbb3734f47fad33d947d6793df75242be36dff8302f5769fe9d575d0334066c5c1f61ff9b52ad056e34c5424833e134484e73954f7cca7e4dbd6c4693084148fb590456bf2c4a9366edc2f45668e19f4d166c57ee0b1bd9464962e6b7b034186db7e0256ec78809935b0876a496fc6fe67b3dff70394f88d4a150e19699fe7ae3efc14acdfa487137513314117e99bc1f94414ba2a8ab8c222524c81144f5e44e7da7d1d83848fdf33e0e78887abd871429dc611edf719f6168f8302844d12fda1389bbf339a73ac763f013254ffcb16b72af44804eb4481a5f56026ca32593eafeff938fc3b5a2ab72aacc5ef5dc5e0f3b718579e8d0ba7c7ce306300d8ffc10ffcf2c742ae7a9daa3166c32adc853da96454ae32b2b5c3ad9c84b530c428119efb66c1c8fe313f25b7a570d09c41196d780c34dd4aaf3946b8a8b57191d4528cb6e2046cc4eefb116ae6940178067a5aec3aa2828d56085f9f173e8f204eceeabe2a0ca6654c2b83367a4a34052dbc106401d900175ce67956e6df19f5a366e54aea42585e4b98467295d92057cdcd8e5b3565b7ca40ddb800d406a4673dd02e5845c8b8c2e502d03e569e54c044a00b525241c7a413719d906e9425f3a4b027d248c59a77de6b664a0bcd07af2d10d6e4b8cb6156769c17abb9c9a1dafe928e81c12bcc62c6d6e4815c5d33d03946d768ec31de6e83ebbe1cc13b40d905fc24b80f95105ed666259720d282618503ed20588c01b2e5adc0bc15e925f4ceec1ad262436f0d4a3e56ebbc1527d5e2e1e82075466802b42e3a212a175d2f8ad55b977b42b42e8a10451735880e469f79be318a10ad8b224429465f713e215a174d882646ff535e6314214a183d2ef9842860f4e3f6945151d13f8656f64d496edfcd9fd7afc6477b7ce4ad3445576ee13c707c75294c8e783c327409768d4f43162b2e143e6e1af4ba83c7eb81322aac2cb54baa5c1c42cb5c2e351004d4cc77895e7f650dce449df313d47c42858916993c9296628b5fed817f8dd094dd30f56d6279e604b94cbd2903c2d955517817d455c29325897fb453ac638fd60a885aa1846a0b42ec5a804a874ed7c1c08132dae3c3568cb08ac5a594b8fca33d57ac98512012f94e1381a97df63f0059a1bae94cecfae4bd3b4c2a59ce67c8b1cf0c69f883e441ff5b257e3390c51168ff4e4b2bcaf255018d57ef1a588e2386022efe5a6017103ff1903cba1625c9eba7cbcc14d9c8d35ef6717ebdb9b9d0e00169b07be462bec9a0900787fdbe4fe10494c59d9c2221c90656e6934f57f9e0b1b3400e3cd03ce5e551c430a4353f09440c9463cd47e81ad21cd00f31204b416a29d56bea998f3a7f75e6739853cc493b88018aefa800cc6951c19cdd373c72a5982b45254e02ccf1de42a003978306c5e453e2b738e28934938344a3047764d3b4a63a84f92eb3eaddb8dcd3cce468144ae2e6e5740015031b56b93dc4514a7af30ca5161e192f8e0aed759e77d6532da9b43b57bb4c4e13f769a54cb83467ad19a1ad34dcaee1439a15d134507b16327cf72c5a3adc3d70394ecaa4f98828f30d60a6d60765128097aab3bbe68f7eabf9ac3bb5d681ccf1fc8ff4a847433279dd87bef1040beeeaa24872c327d115d0085f24242ad08b090cdb3073bc33c572e97017dab9d7c3e463bd5695ccd2bffb62817520449d284cc41600709ec3888354a1dd85c3cfc41eac5b2ca5aa71221297f7deb2122705bd8c6cada35bed0d138d28f9e2d0fff5f4151199ab0d79440a93f2285743b587d89b12ef0e152f26e4f37b0f3ce38a0fdd4338af338a9cea49a7e9136b385e3099def0beb3e61df6a5ab3b16307ab53a1fd10b6612b29240551fda3e2cb17e2b0c93c2e7461e6c8e70aa55489d20547c9a607e7a8ac9137fbb57e6a884531162d7765fdbebfe5a4e314c87a3c15158c22713264797bdf9cb6d4ab21396d05cc6432298d84d64afbc5900f05fc2fea4301ce657274bc0eae208d6b2eda1d6953b85979c40f4b539cc26f6ee9885762c78c8c515d9c6788641b07d81db08f44a60d4b233cdf9c0e29f5be282509627c8d324cf62008647d65730e5e42a5cac1fcb6f033325d079671eb83de2f39bbb6348a8fe5ae692d88d7c41847054e40e0e78841670b02201fd35593af861bbd84ee8b02b5449e93ba76232e85e4783e81d3fed08cff19328c2717b845da36ccfb31ebf878c4bc649effd36b5175d0b772b46577eb87a82b5879bf4dfe857420ebf84f3fbdfce73eace8b46675a1d604f46a5be3ecddbe7921fa99ef73e43a7a22556fe8137fbb4e0bd517ff30aa74c037ca0737acbc3e9695fc1f6e5f3d26c3ddf0f55a31e5cc9ea8c835d96582fab2c475128aa7847a0f9d738e32cdf0874efda3dcdbf923b20622f026c1360e2a7de7819571a8b0c64f958ad0e10802b09574aa05d529348ef9c351be4c5761a7f2ca41f3def3b328da9a3c722c930c45f550a18ea08cb351df96350a0d77ffea8fbe3fd0a7aa01ef4738a40f60aa47aae86719097f60abdcc838d64541d3638db921bf6d7feaf853ad89f44ea8c5184681d14212a177d271aa3d72e7704681d1421940e7a001584dee6f9c66842b42e9a10558cfee23c42145d34219a187d50f9c66842b4307abbe411a28047e7992a89a1ebdb5e877c87a7a34999bff752541980cbce59e2802bebf3089e9a1cf1a1a8571e017138e763485d414c1638d534f253adb21e7c66a35522c7567945e0ab9c0e47058d4cf0e6c34acbfcd910152bc140895f764c59b9ffac4ac22afe8f6e9091d3866370be1ae44c7fca035300e84a0269e09f2d0429220c96cd56e64fb772dda6db220db4bee1d7e51219cf19c181b8bdf6f55ff7d94afc399baf9f96309503a4a58525f3e540053d672be1a1caf2ffddff312faade4bbb39afe4741457f21125a45db023a047a817c8bc913b7232735cba728d726833f9ca14cb19b2c9530929e3ca94f4644af4b202df4cadb892582e3b8d3f56d83f0cb1d614b8c83468a52c157f2abad81e61884a5c49ef6d33393ba2921194a521293c1f8bf16fddf4999471956d0818e64e0b50acb179df385212e5de10573215016abdaf019acf3cb6db5c69029bf9f936322797e32b995870907b625583579698663a637b651407dd1411ed850fd636c822792b8c618119947c2c2c2dd280ec10fc8e183c4a156f90f4482364e4e8c105220b9d5ae20efa7b2498a82a984915bbe304ddab95d06a10e8d6c1d4373fdc72d48cb5a9fb331e62daabf435c9a3a9b83bc028ee0ef2e58b4e8c3d5ee59205648979265dcc0bd6b3a4bdb2c323774ee23a902d7ea286f8eeaef30b85821cb11f566f0a9ea58d026e0705bc0e86bdf9b19357bb3b788cc3e1309122cc772a44fc17f513d7991394643f709d0adb35a0730f4568bd9f10bf8a54ec110ec9b4f81cec1260eed8f2c0d4263baa5872ac0a4e60dc1baeff370005578c582169652a6c0256052367e947b130f65f546b9dcf60bd021e56e81de90e573b4484810c592117981d3eedbe6b85010ed0b574d06c3119a219a6c91a546f74b2b04c7c0533afa2dd48f98847c3f138e42ae2734bb002be421fcdddb3ac0e9a859e48e4b44d9944381968236b64cbe3d22e685fa9d500e52cad111fd65a1aee5a00cfb34e6d8163d3be1d1e0174b5ff077dc1e8c28d841f7c3ba62dd7df827cdddb57d026791bbd76836f0182c6a02e71c0a3a19aaa70c1102e5db4e7f25b8293d22cadb22102ab783675d91fcb7041330313d8151761ffadbfae27220e09642ff3ccee4e765d0ada983927e806f32e38ab7113f3c4fa1844288acf3b05766edcc2ef1155e3e2d2df73f0898dd7eaa3b81caad2a97f336fcdb874500a3151250728cf02336f1b43429fffe73c0dd61d1da49f18759504bfa0d2fd2f76020df3845be9641f17b5205a707f6316d35fb939cc62032cb3286649b085ffc582136a188ba35e22509462f47688f09687b1d1110aaa35f6ef3399f3882e3c9f025f390855821a4ff8c21ecf2bfd731bd22fa930f5f6263e030a2a79f4034d87ccc64201a6e29d159b1a9e2e96a4f35493c803e2bc668a19d5b5d6c87f70d24e800165092a419de11396b6cb7cd35cd0ddddeb3deecc97c6f715895c39bbe5d29c91e10b6d29b83026117a9b7dddc3cf9177b2b760f6e63facad7e428d6f45c50d13e86dad8ff53a74705cc43d623c71ffa874d193bacffc3fc7187de150fc41b23aaac96530773395438a7c4738549532e5704041e7cc01fa62185ff38d1941a4f869ce61c1317b5d7dcd18598434a3d098a2065ad756603d989787407423cb410d911cb133ce4081a52d3fd4471d9c6ccefaf0438fb9b3caf69d8488ca13ae1988651da2f1a444c69913b7880007d7f020e5eb3963ff613178c90fe4f00808bd813fee0fd40aacbf73e37619b6190f3abb39373a066bdb15c1e6c521e2100131776fe9b989c07f98d5a2a3f67c3a3c4f6e5f347a29cadab253c1512978205da860dd9ad1b08eef3cb38e915007cb772239fdd3ab248fa1c0c35edfdcf777dd29a9a814eb1b2eba6fad6d717a236e56ed310cf83bc459e685fef80203f7f54220f949e856ebe0963c927352c9f9cf2a4acea399a68c1da73571bcb0749d7f2693a39a2aaf1699454b0d3d6d9d152ea6e2df51fb4d51f1b0ea00cef5ba8976fa50cea1550de2a453ef3dadaa39c478a2ecb03b03e823a00b1417e299891d6e900bcbdee4b9b6e4ab201dec6aa1c30866f69ecbf0a28e77f68e9eec762ff0d12b314171f4b1082379f010d94d5584880b011f79c4b928dcf1d02479b0319655132a2aa725369e90aa846224ea6494ce5cb05241ea7261c22da3410b8b304e2d9827a2182d696be02d13628dfb5819fe50d9fbf8508ffd20a904d3eba05be2a4ad3e3012c50c63de6d497bb57a8f5471a458f34805a0a0f09e011290e4042d4458775d28461865104db7a70d35a181fb1a379f6c8987f746df267d761c884587ee9625ec747146f183d4693525773daa28df54580a0fdc03f8434ba2a4558a58639c337e4d9f1c8442768bc359dc435dbcc09f0a4bf2ec25a6becc42abf333ba09c34654103a090083f3ad9355078fb05d80e6b5f6e4fc3835ae1196bf4c8b703d8e7a10dbf5191642a44a8d15c128d35eaeb123a8933b68af1ab8fff7ffd653379605a257f1cf84624338753c487c0aa0c8792dde85c890c4035196578d1aa3a5aa7b20d43471370d57b2381aa0726921c99bf2608d7d4219fc01d1737f9f5de0336646f7440f0c812942a3fc3d242a52a8346f132d5284a4c2390d3a8322bc1be5410776afe84e185e8422acf83bd12d6189c38cf7542e847bf310888536c322c0509457e6e2af33f6d224fbe4004be409ff9e393a035ad3f9b012c621a2a54a413074076b91b08a358b148eb242081fc007c4e9782313d25a71c1e4aa0cf788ca47589e87b95fd494cbe22aaf68840681d411dd1f726bad774ebe2a2ac8a4c7159aab0afa1445942a2ac815dd726e759aa1b24aa2eb8aae8ff41d5da85b863ef92331a9e2f733065d7620a1a8a1cb3e98e41a886ec28a4409300974586421fe973c5842644ee9331329ce3391bab3c0c2148a54442dc96e4574ca53d0bea938c6423e9375e346aea46173d7716a110b0dd61cfd236f08463b4505636dd466dac6a4a27fc79de94d5217e2694c546d9ed724186e75c89dc5508cc6f9f754dd861204d9b5a3f91d26a53945449a8a829fa5b6e2c53f2b629b0cf141eb81965a55b9e333841fa5432fa2bf11f201775b024857adc1ec6cdc71a7c69d03ba9c76a01aea7e27bb894be6e16f4887a9413f22dbedc76e449865457f575313d03aaf9aa1a941008d495d676acc683261e22af65c68e30550c2503ce84d1490a07bc54a5450bb5f9758204be8c1a980401b531142405b5bbd5ebb92d61c91e568939403deea85d80c6b674218b366d32d66e26aaac66c1f3a10219316626840517a17cf91752d6b60c07c27d7221d7165f649d7003d99b4569d791b6538a69b5bbe265e3f3882af9d614f96de1bac4633082aae3cbdcf5e137cce40926c0e8d3d41fcedb23424364e71a1fa9b2aacc5dd50cddaf8d53267b90d9e7418e7caf313b7263fb1aa6b1765d6c18fa60db0255cbb1b38eed5586c074c7fe950dfdff47f36be15555532a916afe2a1f799b5dd14a0d3fe8783131e49553169a7a0cf13aea663a6b4774ff34ef3b5a07c0a6a908ba4b6ad6bcdf6c42ce64c6e0348e56fa82d315319f465e5d75a165857297861b79a2491ae319fc10e6f278d3398adcb8abd540da640da70c291138b817af3387e7f61077f92d81eb9acd10222788a114f1122232d4490cb4007438b9967ca451fbc7162551812af97f8de94b5110ca4db1de31108ad81db46184ba2370f3c206287d85e92641eea09e33fde7dc4db1981e1f7db3886e7b9a5729f9016fa2818d9b0e4640a707eb9a119b444d7494b50bca8c363a3593899990ab0672242a406ba4dc50740774a0c883c620fa75213720f5939e05f7f0aac400d56c6218b385849a4ef0d06dc79cff0bd5b6f749dca485f7ca101374d566f5a3d201045b853919670bea27b0a1bef2c4a8932cc5137c25a1ee99999ef98291a7959b7a0f275fbd2430dd096ca73b08eca6109a8bd4be3959941935dba662f76457c583951b9bbc8e0be32be42a1742342a184569cc2c0ec7ec338088dcabadfcf850ab321722968e3b34d6f40462c625bf42945e0e0a40241eeda97f5376c89a8239dde09bee9ae1d90d562799a91889fdfac2bbd58b312f13431cce974b659fa7cffd37d5a33ede3d42f3515603c887d284be7591349407be4a3a8c84d058cd5d0c3a7d29b31a1bbfb5a7749f6e5cbdea1a367dc13b5ba4022d6611f6b5170cd1f8babf65c263b559633dba96cdbe8ee85157133a7413f671c40e264d9d8accd9aa352393ca33222dfd57fdc6531380ef68b91ca5923e7123471c138e7a113f48a025ac91d5556509c11a5034b499b5a9980328f8812844c4db278cf278d698db933ff0cd688250d18283c3c198826291f5c010040280080d4dde7878795e627de3cb1c7dee3468422b4377d6dffb3f66d9f6c42b6dc7b4b99524a49a695052f0552051aa76fd4e77a6348187d78bd2c5264857c59e8425a370bb3f35e85e5f7121224b4e3f3d0f012b3574428b65fb98ab022c97bae1f4168767c3c0f44b4e3fd2b43ce641365900d515f2b9758446f584f32d337585edfba491f82d0ec78af6fe12071eceb5b396839749038dceb5b3b48de491cd3eb3319f2c647002de943660e195c0317f00809a33f5dd008704893d16f4943d46f2f31832e31836b8528448569120b0c5179c8a01374281c29c709cb9ab77aa9faa15f7a1dbb1394a21e7157aec02d44fd8659c02e4030c031447d953244fdcf19a20620836d68475a238a5482f2afaa093d25e5a49e948d212cf3114bbe7d0a4a9b62545322646f7609399b435dd08a942142c2234025c0284c210b4d46aa7ee0e83020a81af4088e1ef981040e12260812649950a2251ca9e5f3f8b3dbe7d4cc89f4f953950cafea32491108f4d5954d00f40dcb828895952210e83f57a682286962b7a93fb41b6cc6f04972fd963df6be6788692a22aefb5635937740c47c6d741abda174b997e0bf6caa9eaac54afa8a87247d25ad482d49ef151012c6365011430185fb75df9e1c58ee9f722b6e722b150232ba7715100e631df00d0edf7807badbb7db73edcb3ad6cd8d8ececd5a37ed5178d454f825e47d5f9875b3372016d6085e614d4145747f1eea75576b6f3a4f67048fc0111cc1111cc1111ca2379ece832338822338822338e29da7c33b4f8777ded3e19da7e33f783a3a4f47a7298ff4a6a7b330facb7b79d30b0e51110f19cc691cecd3d91b10093a4f88faf0e9c011734377413884f2c025447845d47fb048bb81e5a2b6b7aa381a9f4efb95aaa6c1d117dc8fbc60711553e04c01473e7077e79c73776a633547d990dc4dfcaef7a4c929942e1731499aa8b78e03a27e694a560ff5122555354e729b1383c86834b9a9aa7136d634036b7a0a427f58d3fd2a04abb3922e8eee12f27e7a8e779eb38caac69f8e566131c43152553f545a68114ff50315e16829e7a074ed8cf7a4c9cd90a4895af7665495e7e3a669fb5b6bad756bad5bebdf7eaabb6ba44bc8fbbda807a54b63734fd3d3a86a264aba322e77a130ca3b4fe761a137e010a57690b0aa690c8eaa699aa677ceb9a751d5387803ab9aa9f2b4544f9b626a9a86c7f3b1aacae32e39cca7b088240ef77ee3ee2fd28937577b3a37bd19d3ff819e2b77e45870046a7b847a3ecefb39fffc916a88ceea6ef77bb9cbdf77f77b1d7a550ce0e89cdb18558d63de03ab3d25038391ab31aa1af7548df40c4d2e558dbb4b8c0f31d3e350d5ac14d97d13f1e774bd5435ee2f38340e4fa6aa710c3a0fa0b351d5c01c9d99604eefbe9d2e98034770888ab455940e3087aa9d8caaa6aa645c362a20fa298aca21460e387088ce08118223987309797f3dac47488850946c787c171cf28346c7e0c877308ada3060e860a243c5316204000600e7b5264cff0eedbeed8caac69d870a88c698079cabc519ef14f5cf544070744fddd01e31fd375435ce4597921d7f2d67c873e776d7253ab65f7896737f81aaaea60eada2cd88d0d86dc4eae74f91638c5d203277bb8b63ab88d0e88d15a191b7691443d0a2aa2a5045426259564965529db8cf470a29a44043168d0a2aa8a898d8dd6dbbdb76d35d929e7882b7c084ca89ca89ca895d272c272c272c2724e984f7edee36fe7c8a142902862cb6b0b3b3b343851632bbdb66c108383838383838387ae3b596553564c8104a045890c1344d1fca6acdaaaa0ae49eb7d65ae3fdece7338319cc200a99ce1d0b468c1829722304284a8838e79c7b4fbc276a484f4cd384c3342981c282720262019da8aaaafad02829a1617282f241f98868442f94aa5e17b63263c60a8c1832643c3135e14b88a43401051438d4f87c2c906559554c31c5a70996f50252d5e933e9266704454bcb0b979717181ddcdc88ac2680402f24aadad2f2c2e5e54509a0269090949894949450544a28a4b2f2f9883c2c221813552d2931f9efdfc3b2f6ae716b4dd4a3f9706d66a0201037afac46cc16bbb9f7b77fd80b6b3a76aedb3b96edca5aa30a6d2ccbf7a732f3c5d68c2d9685a2b6235055c4cd2131fbd8eeeeb0acbb3bc35cb7f3cc2e2e2cfdf66f7d357558fac58a25670b2287c4c62c48ac3d6e4f7a4a6a9ed5881fdfb7f72c2b0b45e7b0ecbdd42f9362366dcec6ffda6141ecc04ca028f77919111f96c923af4c0c26375622d8b5d6866c999999d95a666b2db3b56cd9325bbbda677eaa889f7afc5ee8ca5ae233914074dfaeec6373772cf3cf7faf592de025f27817111d750bcbb1ed2b885f2e8844a218a28515b6fd2d3903f2ef3fc91c26293325df3fe58cc9f76fce9c7cbf2773845ce6686932fb9df29914b18cd9cf96e39bcc8ae27beb85c16af1b584f9bc49cb210ab51c359a4c4bcb61034b1c3319d372ecd064f651de32899e50f47c0a96f1e71b13492f3d8a880029da37b97e68a2fd926b0129da27b920305363fa7d1b2d47a60cf5fb3bb41cd964a085654abdc746dc7e1afd7cd611f4f160598fe8f9cfd3589f710461597f4613ad0fd6be75ace7e2eaca5aac920899847c42dc873a2384285aefa57f3ad643b4230a2144a01ecdc7ae4382ca185949a87ba9f50e7d8ca69ec9004ed7aef5a0731686086cd746b7a24d6e7aaf07ceee3569ea76dd0cbf559c31f0b9aa6923620573dcb67803d77a7276eb9e6ffbbee69aa589e22b58a7f115bc636d63d325e46199d2c42c4dfbde2d523ad53c23fbeedddcdc3869e21d9d918a1e2cc298c3ac1c6c3f697bba84bce74b88e7a94bd2d16939ac9b26a3ef58e735c0776fb41cd08a949930480467dd34d61e104c6d7e8a8fe84cf311c68ea868a73fe31deea227dee12e5c7737ccf5335fbca3220c0e51918fba709d39d2dcdeb7d7384a52d28f779cbfb96fececcead02c2b17645c3d1421ca2b50d82ea8cbb7dddee4db7696bdd134f58eeb25b752158d01df414b373fb62be65126af91822243c810a500bd00b900c100dd00aef067d3ba747382322f64b11bfe614b14471d6809e025194ebf7ed1ef494bb608e8a46ee5b7ba9c2f2492dfd54d548188dd55237d6b0601cca312120c8553520907390827149163ed5550d84cd3813fb839954b43478868c180ec6c3a44b827c3df51285702e155f2f3c2d1f0fe48b65b2205f2b2010e44b858404f2152a29817ca5989840be504e4e205f272828902f939414c857492804f9225151817c815656205f160b0be4ebd3d202f9f2b8bcbc7801f9aade15053fb59fcdc505f2055f5e205fd43fe46bba2ec897846190af0703468c0a088e9747d619193266cca0c1d78a44303090af0600949410cc9e121e04abb9aaac6ceca85c55ab26d020eecc558d5bf74688a6cfd7a1ee27f793f3b87640384c7fe028aff0a7aae9feb4f69bbe4ddda2e55d70db5191eef80a8b871d8bbe69726e0239a5d851537babbb7ba6c939ca510f5a26271424f98c32278990a8945c1d953d45fdeb8e4d25d74edc554dc90fcb5af9cff5e3f3407ec7078ba21f5459af7215f1a2f4272d0fc4daf103c8ef60f99337b18088767c56fea4aa59593979a2892648dea4aa2121316985421f258b4f6337496c2cf317e2592181b062d6232ec6c37f250b1b49ca0316519f450b51ffe40a511dcb347ac7ea536728a9c232f7eff7ea077ff83ad67b785573d20e7a13d0a35435208cc6025d2d965c2da2e812ee54751203658289c99d975c1ea75ec76fd21c8f101d29163aaaa35a14291206235de80e8eee4caa839b1bad628a8d4a3de52bbda9551c93ac7c3ed589e33887a2dac5586cb53a3a1dfdda2245bc370c46d648173b3b6ad823478228810433c14ea5aad955e1275c132fc251cedd15d0569caa38e71c8b73ce61e9fcb5bcf64709f96b6bb73293d0c7dc2436094b5b2e4b88572c152dd4161f6862be8d1a963b868024129dd460b6afa8f84ab3f08b7feaf2da0ba7b74bb19e7b0b83c2e2ee4cf8c5ba387d79ed65c98ea0afcf53545610cb7c3011e1bbbbbbbbbb2b4b2351a26444e7b2ad2a17ada3ab5e929c63853987571069243654d14b9f2bb3115b92a81e2cf8f9ec39cc7db0ec41ccfa92aac66dc468f1fce7abebf38b02ab7d1862f56a4445d53796a515b17bc801e65209819e24114072ae75acbba0159f4ab5505185858aaadf1358ed2bcfd55f752791d84fe5788e9cc66db828f48f00d0496b02ab7d672f8824027211bdd0f819970c2c060c18313019d78ca7f122b23e930bcc0b00b4dcc052e33db712a382434826c5064a0e273a9804a06407121e4033d68d0f0df4f480a3c261b5843007e5c3240069008f004e87c7dec1055803680d4c9df9e1001e1a1a1bb18962ffc7d65ac332ff1c45cf51f46fdede9c688657f2748c51ef8d5d584bc88225b0da3f1853c39a111258ed3d61b45489820195c8760456fb20b0aac61fbab75b9fcb46376f2e654cb28c9da13a349cd4326823880832b3e11c83dd9531fe0e736e254992967767288d2692bedb25e7307712d69e8a128657db02b1dafbfb0ce8ff19838516e63d774aa331532d5608ac9630da721b0d49e41e001cc238ea06e83dacf6591021005435feba85e537c0fd61b5ef46d5e098c501a6ceb8f7b7b6164665a0289b0de89a37a822c772c87cc4c82c22484d22918b6763688fe6ad309002c98be9b310a3489f81dea36932fad9bb415b0c8d34ed054d8e14e9c396c3a4c928cafb952223ba44fd1c35681af6296aafd6fb10db0eb17d8d18b1ed908eee9efbf31f56879e40e5057f861213e49f7da697d99250ced344f937a448ff0686f18249d7101cd5e57af12d2f2c2e2b2f545a422cdd9db2d2dd282a3cde7327ea9c334971ce95a038e7484e9c732013e79c55e29c1391784095053f94c7dda7cadd25e8ee6fb18c72933b7def5eec0019f93b7188328647bf2871646307c8a88f6205e79c4be7fc9c37ef15569a8c5a96053e2c9f0f071ce41de8f6007fd888f5ec115af178070266eede8c614fe2d03da24a1c2d637837ff35880df6f6f6761fac44c28f9c98a333d820de1013093a395144612f42fb190a8949d5ec37e43bcf497c89994ad4d7c6edf55fdaf2babc687196155709a5a09c9894344983daad8fa782d4243de7cdabfa91bfaa616cbf65741902f5238a7c206f4714fb29c4b1b730b99e3d423366ab848983bfe5db1bbca35599c81bfe260a8304244c105962e6b4810c312b06bc28c45f875a7bc3b17ccf515137e01307b4a5a81dc898feecc5f6804b1ccb4678e2d03da21347e3c4910f042a13477b9f7d32d08b9451d7509a483fa3dc624370cc8288fb0d2bc918feec256a49890b054848485e080102815a2a6059168b053e9fcfc3b2950b783c1e9521aaaa0a6100429842044551281998a6e9a40849924c34f0de2bd980738e8403ee0eea407747cb03fc6136623dbb4768a51a15268e7efdc70fe3f1521454268ee42166d643cccf4c8798fad90e38e070430c0d1a317288fad98cfc170088fad94b4c1518219598bd165093c9483e24314f627e6654cc1ec5396093d1f76ccca7ae4f8af4a72b0209a32f5d0f48913ea344fdf742df6f884d94e910f5b787a81f811cd280e521662f2e9669dceff85a8fd895ff7b58b6fefc2d0204344dcc3749efda7b5d98eec6b27ec7eebc1b379ad85605af31e6b02d02091291b1a4facaace8beffe50dea1bcbdc5bd17d220f07af5c982b1726394aeba6497a9db04cfa27ad24bd63eafe5d978fdca6cd016d073ff7501f922e118aa2f6bd7b7e2fbe7791c77b7e01d76bebec2367b2773ea5ad995f87eadb652c33a6d140ed53adb5d6da0269adb506446543adb5d69ad705eeeeee4c16486326a46c8d955898254a804c144552c4e5c4f626104ba38c69d611772b4288868f65bd499dba9c27394fc648b83f3745c63488064bff55bbe32efde4708bb85b3cb5462295bcd69c32d1249c83b187a5af4a0401d232a6bd3b14b83b967e4845eddd1ac998d6bc2ab0f4fd5727635a73ce39c721b840bc0696befb0562e9bfd65a6b16b5a2a22c2b8d6a8159b5b64b58faceb285d530cda61a96aef9909a4b11aabd9d21f3e36e6fdb993733134866a60ada3989677835be2a019a99bbcccccccc3a41c8dd8f791bd632c6252d5e376766eac4eceeeee6cf2e632d39487263665edd10a4b482cd935316567bceaf7697b0daf32e33b356d0c3cf32825054c26c4ada241e6b6ee6422566767777799777b9a1c0cccccccd9c028be276e9bbbdcbbbec547abbbccb13cc2a9389b80f9f60b5df2098899a7cddc2cae56c576035be767777a77d2c33267b341fac1e2738339b33737516a69bbb7955d070a4ee88a90653b0d32e0dacf62d2ddc20bbcbbb6cb1e314acefeef22ef7e05ddee5b7526626dcdccc85bbd4f46e40513636363636363636363636363636363636363636363636363636363636dcee9e34bd89dbdd939c64449bd0e176f7fc3523da04b7bb3ed26e8cb4b3432974555f8e8e402994a11456fb55d5559592a0a8ddd9d55ddd31b42d7637b50414abea332fc633bcaaa9f984fb3bd7d65afb7d1ece33edadeaefdecaadbd8f6e5a066ed6b922e613a17a0c89f9fa8d931b5be788e02998f999311bc47c4245f93d58cdbc44b43406fda35b0b657ea2fdd042b1178367782523509ff9a95876808cd9055cd4dfe791cf33bc1a5373e4102d661bda1035df61ee518bd8a8980f6ffb018abbbbbb69686237c609200010398a3c18334245cccccccc58b6bbbcbcca85d5767bd777b7c8ba3b7e0b937c65162bf3aa8feed1148280ca794462ea14897945bed1467c7de4c18d75d7dfeb8604c6aa6e77f7d7dd1dcbf81b732c785c58ed7bb0b4399d22461ad083a5a1cc7aba98affb3e8b6d6c12ce39e79c0bbdc8a282130395262625bc3d78999793339979b7b17061d811a8eaabae2eb68c6de1acaf431dabfaf0a63b4882a1afafc21af005ad33637c15b0ddedeeedcef7c1ee5e26acf6ce6968dc0eebda0e920d15652fcff03a6dddcdd9905e29081756cee39e4f7fb6e1c0248741b6de73d4bac06aaf2d682c485f90922c4579e0080759229bfa0afc9b7b3b1315a5e4eeed52ebc65a89a502abbdc321a5c06aef1283e9bcf9756791304677b973ce75280521949c444952e59f673977e522f4dcbdddafd84fb93bdc24ac24b026d3efd86d97b876da64fadd1bd69cbbfb9e78bbbbbb7327dae56d57c6f4377ff77d808d1705254992aa2b13c58414e60ddd5d7ace27772bc4ccddbdad4fe6909a8c23e911a41d01813f884449b8c9e457c14192d4246c5202b7ffe58abe7ae2a49427783b45e22466aa064dc99531d46f121617567b69dd95d530d1245032147acfffa5a97bcb186a0798423d46044a204adf96f51e7ccae102a48b88ae71936c0aa3f5e4b90581d55aa6acb6e4171313abdda5e7bd4a58ed1965539e2b6c2afdd25ddc210a4cd9c1862461d6c7df0b859c738e17ab21a5b6dc1728d0b9a7fa7c5ac55a5981cc24dadadb44fb3377ef7677ef6ee75c9bf1a8d40c9dd6ac74040000020000d3160000100c0c89c482611a47512af50114000f5d784a6e6032164723b1400c842808a2288661208410638c51082aa4d4d5260038ee7c5719f9fd157fd53de24537460adcb9475ad26b8bfb30ea1b34ffd9a461dedc397a7f21b121397d28b33ff960a0d105df144844aa213b2d7e7ceb4992c17b310054cac0d609673dc9418533f2a9a726148d35a91820575c0ee88018bb01256d22b16151c7c7d80ae9134be59d3c710a231a8c5e70ae0a11f511cf2334198b3b0196ba711d0084d64d71f9a969a5699d60f9fcc59c0b401ac4c51c71c60133a0af88521d065fab88d27d51997ecbba19db930aa13a822be4a8d3647e181b1425cbe03e7123263e11238ea5702ab2da74965876946c6560075b48c7bc6ec618dc10ea02c12cb7b2983919757b0e6b1afda443e26378065487b1853a54a7a92920adf773c29c887eb8e8e6ec78e477788b43be4317ba00a4953c076bdb0c4e7c2fbb6bf604046000e1f4a395656384e0ae78d95d15991a95a33ea997edd95be589a307b3888382916e70d2e58b911d6ba26ba5d946bc0a5738d6b8a04c2cc75299b46e4d3001105e9a7a0ef7c4d59b446aec15b031fbd61caaf79e0e99b129845658f0035a43264f8abb99c81dc006905f89d7c8e1f0262f85b08a0965155689e981e05c18c416e9a88a39cf5980bd9a4ad22dae59be9fb1c85016ea9bef745b8823f1d4cfb66a92ce8f87ee9b32b2133085e9afee332daa284b15a23b94042ee856b6e51c8f62a2635a0b90e9d02642ba6ba56d68f8aa5612c9894e539c54a9e6d0224ece5a4ce8e4d0048e6a5ac0a783febf98ede2934ed14ecf906f92e063239b81d0cdd0ee8fd2402b85446e4af5832098a32380b9cd577a58b57d741de2033bbb7543c6f6f6eef900652ce13ee204b21ee6405372e22a01d85619444a7f427abf488357970cf17915cb053c08b0d9ad919c84b3be857d96ee5de7e9f538050730ad8d4f331c6a154d7c1a4b23933eb2f1e01d128776e8ff31367bb0902dba1604515675dad7bcf802928cc221f48f7ca07dd7a261fab16f37b1f6c3f51938f64131509868400c2b7ea3c785c51ee3226db5d9b9949e38221ad40edb937e8b48e64ee18b0ff9a1896a9980f8db9fa03bd0989450624ecb3461c9028b0f5981202b362c608802b87e79c1f4ff918242f66f69a288c19491a672fc08e2679e7aeebceb950c6f47575608ee82c9971b3d7f650b3a47a110f19871acd548fa02c0131890d9f48aed454eade6ccc7d954341aa8d8324709a311404bed4854af06c78fbc61a0a38f89c07951fe8bc1331db9a34cefaf3e27f7c52aa9e178d4b9e0ff6ca4e0e40915fbc0395f43d919a22b0bc435cc1b0f0da40105dc31d949b5b61faac74a506e8973c226482eb5047e01df7c1e507c015f63baeaca43e8418643c25423207c4d4cd1f46b1e28677395572e7af38a18ae948f0eee66a1598e5aa14cc34d8833c7a7b129b95b99f0f8a0833667f6108f6a788f21ed907d626bef958684b36c560a0d27ce93704366c20d9f7e2e63dbc410146b2fcc9753d3260608f1bfb05e466b21d2bc35cd4139e27d01fe3e43f6d2d8a8bb1ca9c75a1c9dd0b2369c800829ce4a21c782118394bd303b2de600e8f0f505cd407520085d21906a3e0d2770aafe89c23ebeb8124c464657adcf211709ecb9e47bedf85c114437d5cf2d11f85865e99ed4035f2539889d2fdde151757dbf125e4df3e6b35fd1672fe2f47c6780570c2a7d725518cd82bf298d7a6a77d69817739e90cb794e310d2c303dca8cdd950fc64ab12c2ab1086d660908cba7d781bcc446d510fef2aca2185d9e72b63e1e6a1a25a0f430a1bf8b94b34174540c157e4b40963a96128fb0e2e6bd733fa091790d2bbb3d5873c413735fd931448e025b7a4427f7d5f54138dd140236409fd6961575aaafb5348185382010c13eae9c93b6c12b94894f435dccb1d8422f2efacec7358bc6f3d9336353e0877d711c541ec71af5123f3f100b4e4832f361f7e37a9d62c38b295d8d4d573ab886a30b10a78e7473dfbdd32f783a4d81c9e3c9ba58f9c4a062cdc3705d52cbc63c09a2ff4ff93afc199750c5106c1236d9624a1e491d260de0346f7721a6db910cc32e0f518e6bbf7af4fca4f41010ea78639f10198d55a6762961daa59110dd579bb26d2b23af170955c51632f217cc181959d398846fcbc86b7735c04541b532cfc8db217820b410ef6d5933d962e9b70d824bc364be175c05f9df99d81a273f393ced179f7c42cfdf369f0a5475c7c34485bbcfa786b169911c128c1a7416bc03d620e5719e0bec1c9e24804cf43fa3511a3b9f4bc7f0cad1b3a8661fa484a7b0fc82b09264777de267fee97bd07cc19f0089316fdc3949aca58906b6a804357910f02626e567170ccc61bf37dea4ef5a6f98e5684e50b04a2ac9895d8cd3d7ce966047702b7512919a8f58d392db681222062296e4141919399bdc20a12e85a3241faf3caa013ff85885ab5d2282955762b568b5a2b9a9438e2a5298faaee7b05a5eb74d6a4f3009779a54b8cbb51150582d61f772f4a2cc95b3f11c62b1ec31f445a2c12122a9b3321b004dd2e511b85f05e615582db2b298bfec33cfe06a9f71f3e214c61910b3a0c344e847cab76ee8ab86c35bf168240aadf88da3e5e80420c3aa96bc6a451b3d92d0c03504a71eb49acbbceda0f508d91dc0d9cc24e546e57202774cee3ea9329647890366a2cb15a0816f9d68256142869baaebbafc704b5b094e3d7e348ea6879befec832722650d62b2b744ea5da2a75213a0517fec58dbe1343f5853a7e121df1153f941f16ef0783725c5bbf9419c381db9af5979a29c83998801146d293409036fe818f72fdec06c1c7a72f2b60daa3ca686306f804aaf5b6f97e2a754afed22ff50d40c246ee694be39fa512bc618b9f8b7fb4296643668198672788aac8dce5053f69297ad3b2e220069dfb6e0464d138632fa598bb16c6322246d95f649a50200d9461e2972fdc6eaf4a61b3f94eec4eb9203cc9cdf550dc9aeb7b702f2d7541f2b100b251da7ea06ccfddbc08a1b0e7f912bfe257ffc312e02ab41aadf822e7619a1d3fd005966276c14b4917f111b216af781b26960803d414c0a9dea0db1a5377c70ba4728dd9394bcc195f696a16b872c0d093f8f44284e0f088079fb8034c3eb88ee269ff58b466cfbea73aff6716937aa57d8b2b4aac26caaa04b8b35218bbef30674ddb8d55d54e783e17d8791ba26ed97cd9ddc4b8c23f9e73ecfe391726339f443129c7aea2b40c8cb639ab365ffb372b58cceb6695f0deeeec62e7214cb7f8f2136c7346bee27c9007d609cd95fb873125cf21417442d3608c1af3140a23d843b128b41a48baaa636082397e5d24a8f5ab5d26717d8ab5a867a04adb7b547d7ef7bd4972f134c6dbb658823355adf673a7b595b24360519c33cd6cdadd2c08fb083de181345f55cea0962b357b1769d271cecbbfc6a5800267662099b277f3db76f068660dbfb6fc206f372d31fd8a92ed0948df510bedb16bffc96d6c98f7fd9b58796cf60f790918ef65ca67e718384bd1ffb2cc797fc32af8ecc40e998360b93159e4cae6a8757b602aba832cf2998a46e0d2fdc27aa9bfbd807455461c1bc82111574c6fb278affc84aa5880592009f3d00131103203b4cb5702866213d7a771e79fdcdcadffd60700b86995a0ff928269472373dbc9536c8d51f8f867c5edad534f307cc749f50fdf66fb81774b9834111b1cb75c23d1811f22bf89abe3ef9487d7855b4c65338015e1839318792dda583bad2ebcfd2392999c6f17cfa5fcef18db4ea3140d60cb748cadcf26be2e87441ab462f78973ce5c652444c1df7a7febc82ddb95c51018e54e3b6d01b87845f92c31beeda19003947c7833d9f876dfe5acb0d3c048b8948c0c59dc29a8957984f8467a87d201c99da26fbd341c1fb8d615c1e4e3f60beb6b973a5869eff2b8cc29bcced0caabadf92fac8f26d0e685242c9cc1325b57a893d99ad2c265c6dd40a9d512b6bc1e60e0ab4e58fa978ae0253e8b2a5eb116918d163d17d40e8c11ce945d16f26c74daa49aef3a0ceae57b3780430eeb186bf416bea41e9716b65eeceb94737ca7b52866e1787266d9c47b7975d108b566700549f4721a8cc7624e452ca81cd57843d165cec64b0c520938d765babd4ac94776b411fe44b53108b81d685c448510c31545bf46de284fdf0b7aeaa08f77e580590935a7f74355a661df287e9009962ad0960d28301c1d0939c25904f0bd10e69c226306fa11b565e4de32361f78bebec8f15e4833369e8146bd02e4c2b4cae7f240fabd3ef30dd7208f3d2b867014a61b3bb154e1743a8a6d116e5719c3e51244155673c981689f394a6fb394a95cd58020e1939c592a0289d926a898b831dac4385798ea33d827fc03422a2b2ef7eb9356c2b27f394d048db0232967f727b022661957b14cb7ae50f1660c7796c92a5e6d7a882ae869b5e8fb2d5d07a630fd410998c44f95cd158798a68d65177a5fe62be4a89de87ccba04f6ed5913a1ef0c2c0c21a18915c3f6ec6a2c9b2f8a80d61c22998a72133385ae7cb363199571ca95f49486b76f981f17aef09a7e5e267522e07a95e48a2c91cff3de7abea24254706df6761009b7001b8c5991da2380fcbf2982931054c382161dd64a9c0ee4c92826d068139842afb9f975e333a72435d34a7a0d8b183a57f6308e796813dd85d0a27af82eeda5a3914e1c37d181b108a2886578330271945fb392cacc01b2b1ef4d00dcedb48909c8eae85a87a6c0b9e6a2374a74479dcb73b52dc23cf6ef253071d7a68be296223676c02eae2225cfeb01e1919c7b3cbce4568171cdfa27b3b356d642f98747eb8f6e4236543db9001e7bf22b6c963f88fb6e3552be98e48fef8116999a652468703fb7b4423f0a8052e121a83b8650c6c685af2a4e193600fb52be2e0fec8e4c03e4b4656a98b2065a9451b98839a5dc35d59b05ed1e01d1f7edcf59d66a6e108015c825ffdfbaf242d3328f9162185b1cf5df7338a60ba31062d5600c04002161da60eac6ac75d03f5a56b91f068c926fb2111b6e37d69bfcb04995f634fe12adef168ebf199602b62d6c660ff8d51ddbb350d568b7d00527d7ba8be844aad545ec892050be235071574670f09f108dbbe903cd6355efa5a42f82b6622cb9810a4531a22f700f39d41b829bfae9a7971e64a72a6367cf02dbb1ec8fdc8d805bbd5d7e60508dba358d9b5d819762e0e3e05fa3b0bba7db63a33aca40e97511541427e55e757fe8299084abe9fa5f6064a91cfb05d63de24cb0d8fed79f6bd371910233e67cc88bb114523057a0f9286e7da2b1e0309c3ff7f2e1577be782a22de5b37e2e6861dad4ca51a6bb68664137cc0009c57381b3c9f0be41018bab143b65d90f13bb9f47c4873d766a297574d70b750eb721c391f48c598ecca28eb3e25f46d82b8ccd625f7dc2f8465afa51b5f01448edb198900c1531e2d1992cc7b3316c87967bb3d349e420d8e0641ac3c10f648357ef05de34dbf14214891ec930f8bac7e85826e96cabc148b3a01a376c22e4e1c320ace58f2be1b64ad1e350166eeb58f25967410678f432ced702715a285076321b158a3d0d501904ad0aa1417641e2a01a9e40f524516c088358d0b970172fe697b5594fc7f66718a907fa6903bd4f608985cf56d09aba8bd9cdadd88cb869e6878e72f4570e37764373e435d5246d30b31c18414305e8efc111fed1116f46d0501473dd32feb0f14cd9da5b824cba83e38a8a78f19440d224834bd11797d2a5fac4a753639335856e1f3500ad148ecc0c8b9b758b39f817c09f4f0bef3fb672e3b08fa11b0980d82f45e5b26326a4d9b069056a5f79754a021d90509cd94097d7b75f2c770751d00cea2001e3011c50a9e3543b266695d3a3ad411ed5e056e6123c7164a2d2161ac63582649dbd153fa05ec3517308e2d8bb0642a82029ff6ca934cc00d2957237a228448847160de22ca35dd608d9aa6693163515b592d35735f88c2320d224206a3523d2b7bacb555c8163ed1858d7b7e2e55036c608b725a9c00bc7bdb2ac7cfb36448cd0d7c4d3b9625257e2d3bc89f3bb63c04230651febbd3dbde18a0d6192c5dd53f8d100d683892dd3e7317ed5298d56f963dc726ed27c83d1d283c9b0361c356a67e8cf4c169666c71c8c0c5033cc5427554d90460053055b6109c4b4baa1acecfe2a82eb3fe241dedb48dea2629d30c9a472c4fc00665c828a925afac8f10af6b22d35eaba545160057b669ba0713447bc12a378dd57560c0e810a60c26bec1160b4b4d31c7b3706d6b8646bcea802e9b30c1421312e060629ac6cb45fdc3dea4c3389a92ab1042f5af6f2a75204e4389f5e9754e0713ac308037e9964ad90c2048e60a0cb3f1f44a6ae2604e91d6d80f028ad428809aad254f72e4cc285c08d79a187ae779191baf1fae26fda77cba563ee9b0252a0c615ca007bd2289fc21cd6c52ce51e2f6de00dc5f901d36dec7d214f49188a4e56446c9e7b58bf0efaa05e051af06b88d5619371514bc40a112c083efe8e6a0b7938aacbb2faa2b991db44c20807b0494b6fb02039aa336825fd0553211addd24d8c618039b87bf495ac61f8af5b2e8da7eefe2cd8ed7636e2aa85f6344e231af4e519a22ad616c6b384938f365cc07043bf5dd1970b2ccbe40009ca0b5f37cb5d17cc4b13d31f946002622fc76330afbcee300fff20fe805017319b23445aa7eff83a75907a8b04b8f970b40e3737e51b8606bc091c3f40b96d8c71aa148c5d598d31b9b932fad43af02b652db08318ff982fd4050a3d71e83c16c1619c5bee21b22c9e0a7e2226a5ac48a8c6302dd9cce4ba7a883001a8667d546d85de3527645a340f2140e7063d2ab330800da90030857cf8e0e5f55d33e7daa9fb401d8da79e92baff992020cb2d518855beb05fe5c40689a58b7359695e45f1b960d727a099f25d2835811c2c11f8f3e9dec9554ae749b685e3c4ae36e899f889e4f49248c812489b24724e8c376ebf4ab38c53d46a3fb0b27dc61158b56a4eb460251934d45f342ab25a28dc38181d169c12477d1c49ac600dfe3b07b024cf21d410ada3cbf2dffb7222a096528ef5fa78f5bb76abd015c3334f71f140c32d3777ab7235269f4b81d241e2989fde2232bded890489cb6fe37ca158d61b3303b12a995f5fa904427f0f81bfe651beb6c978bed99fb274c36e1b31c52bbfca60f52e4ceb59e693d52a5d3b0f3b6e8eb794b69a2e573d97fa57b6ce9322d6265a7de85684534db0f364e3e00428808a0ae4aaab9cc893331c2364f2b86fdcc610b141511e3840bcdbb47f66294a599d49187eaa7baf006a796c9c0d95f404d1c3632c84cb5b0b87fb950caf0efc6465b7e022a7266c29cfe694f69d5c2a7bcf4d0a1ad2df6df2695525041685c762e9cd5271bbc2bc45e723ebebfd9420c61f5534e93a502906f1a153e2a3cb05106407dcc714a7592e540d0a09683446323bba7f76a2b066d9ef5aac6f309d586c81eb38648366ca6ca0231a6017b486ecca235955014f0e5a601f510cd671b3994af1c0e93bbb61dc842577bd5ca22f3793483572a6016fc7277919c6ca27f641a69ca75fc41565da27e47e5dcd3e8366f608d2f3b34034f504cd05c6ef6f30eeb06c23dcf507e6dbd631c769ec1bfd73614dc8783c8a50c6e4421746343f0f170f6238002506759f7b1a8a5a84f677788ca789ccda78b8e9faa5b46edf8d26c9f9aa6ae14555c1a740713739d80d5006ceff09f99e0b10cdf7ee1cf32be67a6380bc7837018ed3c2f7549c71add0eef0ef1ce2e1ec8cd5d2a76e23eca4dca2664369f023148aaf602ac794fe9e6095517bbd789015edcaf333e85a53998f8854fb1f27f9e05932e8c7970f7163e1d0e77bfaefa637071a3827c6a7bb58a16a97c3ad262c7f076f81e127e33718fd7855207a792b5bbca54a7f73fa1859b6b6d8ec31d560ad37b6b482a2964502d12e2b2499cac784a2793f61d9910329006ee64add7dcb4ca816003ff15faac64dda8902f4a9ddb75eba4569af1fdca0a8dfcf3fae38641f8cff8c44c242ea5bea1babf979758323198080aad2bc252d4654bb096a5055039799e6bb5d7da5478a1f6bb44881dafbc821180d248b368827fb5ecdc85ab889e7d65d30283a7085e9c08e0b4fefd9640f1c0e5c5733dcd03451b2858fb15b8908a3a03370f05f6cc779829046c1fe6b5e015033234b828f6de47a973dc198ca0bc1f997e432c491671043bcd191495fc5dd5bf968f9a9990095c71bb73d2ae758d277f0884b7a6881296bf4f575814eb770392e94d4102b3a280741870b852ca141ae3150a6024d2e4cf59662880327a41d34259ddb3eb1062f23dae6fde55aa2d125ddd8580eaae1871fab15cd2ffcc41ff6972b814eb7e8769c28a129570091e8744b778ecb329a622588806e9770d1c73a90904899de60f897d0957ffa18984c200f312a426960ba2a6160ea484121892a33779ba604c693a841ae0515d0e8166ec6c4b21ac50a5089862ee9625c965353ae0111812e0c80ee98b22c000a2edbc883d1b37f71837a0244f700a015dc174ba0af8c9740b254bba74d37fb336877081c17ae81f03ef4d3d9e0853463f933e4a3e1aac7756d7b5553ae2941db50f65695da78aac84491b610845579252914699bc11e8b751fdb769593d13400acb739d39c4f50ad2a46c28f044391b73ebce9ef2fc0e527b05ad10c2532a3e2922ee2828e7b0f7cb48904b7f8e17c753c1171614214d413c1514680301712667c4184f190f28c106f95ff47f75e81a6676824c82851be26f48b52f9dc5b1d2641a05d77d5032a67bb95fb00bc8e701b11e4f4ef8adb12b6e6c8efb62d72c2077ff8b06f226f8904acff1710066064d5cde5f24be54d9d0fffebf984cd4975d8342e38ef8b009631b53e3eb4e1b1c58071d8db05bef3c2c41e017d2f2ec3fc472773878c39b8ac121ae0ccdd821d872d50ee301b99e0c110bdf268fb25b85d62250ff455585798506a94844075acf9161f85280b0c7d1757e7a9c8e8af8300adb6d6e6f7847f32842a6c47a81e36b5fbdb9fec60c1452a0de2b8d24c0f6ff72e02abff526174f8a7b2a28b114c63a9b15c50b414e20e4f16487af1d2f85c28d55cd18ef7a866f53afb0e9f6bd167dfdd8164670b1b0808f94efb1f1002f83aa5fe4019e286311a6b442d7be9c0d436cc7aec9db916ca8b7c42df524793b5ee8a61d859e9fc3e78faced9e6876f77cfb48cfb0eeeb11c944bc93e13aeada3e82da8802e867d23f0242d8a6910e4ba24348818f2222356881757651e28547c8960aac2a589710ae952a9540c8c822f8be91e4f83351eb6c8022479be7767739a8ae2b3951d2bef69117ab2e19cdecde980553fb6daf8106084f93f79c696fd423a88cb26f015e057a81ed04d65047ce2da3f16a56b72755cd2aa0c6496477a5461cfbbe58455c7ad2ad96fa01e825c3d83c5fd285226a038648c87c8b42082cc26a03339800ff9eff15532050b865fc72b35fc762c23628a430e9879e532077dbabe0b13a269e634cc5387c0ec60d11ff62557e48e3b62742f59fdf25070d8c5a03e3442b6fafafd22e4c66e49f69f2090a9394b9e1559f4b492c20847deea928a626a52bd14923dd1aed042f19006db25f96ba42123bebeb01306bbd5ed6867c540ebaf07089661715e73e0ccd21d305066064fbcbede04efc3fd8b77a4dddd393d76ba93a328d0fd74c7753b35eb89aaec141866fac9838cc1041f375bef9cecbc79c0c20a8a998d1b95252420255052b61269247c484ebc961e033ac5a12379a55130d95add1d11212b62f21e772bf65db59f63abbbaa28e048c9f199a2b2e23baba92aa260a2a3c1329e0d17719ba360f0bde3209617e97f4bd3b6f1e6583f4f2f52710189f85419e67fbe32ecb23ccd0bcde0bc03afcd1eff5525cbf7d7a0f00ba0b2d27deeb17e9da11b74fd9639919faa2be79c408bc9f317055a0b471d69b3bb8c206c6d9c1aaa7d666b8353051a5b3ecad4aaa9c85954ac67c40fe9200b7d968dcd595b08a32cc7a6296997055eb0e8449cc10a89b2fe70bb2ce51ab4b19459e3fc052a230bade57c053ec2808e292334d971815d9e01ae004aacecb39777f89e8ba7c51a5a37c31b3546931992bc713d0a52caf056cd5ca1de1975631f227576f522d6b46027244f3c5c1928d2fd9633f1f18907bc42cb692569b708991031572edaad0233d6d096b4195e5e69d4055cee4b2c9f6449c79a6571502d2e5012906352df379d84dd4a6857ae5fb6464a5c9760d4b7ebb054526b5374b114a1bd5f67d99914de95a2b2841b2c5963903320625a49b45a04665330e4ea75178d49814b2ffb238877ebed32180dc966112459f985dd45fbe9f4966264d89b8efedd3bee419a800eb167162d6467ac65a1cd47fe940dd0b55d67d772f42284eb904394aaa89328599a39cebd6c2c04317f0595cd39e654aff6152a643537ff6aebe28b98682b4f5ccf9167932014b317491b2d5842ebd763823bdbbd9525642bf733631edb45655388a108dca1583826a1b1964c20eedbef9ada5ec253ef87578be60d1b42f2562d6df3da5e00b705ca36556ffb95368d38dadf91f025a24738055430e3df7cdf32353275787df31d7211a02b3808da64bfd6f42ab096981c2544c1f6d0091cd3f8878b82c08a1a2b08a877411b3216a45a3672f34666657473e54d154811ab3b0ccedccb417ffae9a78ceb99ad340372979449e1fd7b5682ce927b79d2e226d1a9ab681e3a0cdb6dd8e9a55aea13eab56ee6dbe56c90c3d2193cf00b99dd73342de150b5a6367789bb3649348acef0ebed6ffd8c10c464b2b3f452d0f362d13157bdb32f263297c497c04df958a4c8ace304c865f9a8e571a13d404cd66c227f1257ce486fa52d84a7110e3222a0be2c72ce45ce94ad79227f124ece48d63c31fd664eca4c963c99ec2720abd636114244f762543b99e9750689fced8b5cfb04bee1f8412f07c195a9b81903412ab4fd9149f33594d3034b731bb41fb31d1494ce2cd8525197bf13118848489e0a1ed330832e2395186d71eb70f7e0196f5f5fc4d731a9ce5dbfae01e05dd24e184c59067fe5244ca7bc5e6d5a8e705e939b12245330acbbdd1dbc9f9ecc3840f9b7bf9ce44712f2d1db47c7beddb640559fb57433c9abd3cc9dc8ea3889604cb2be284546397c521b065ea5e9b2ba59526f44061a00b5aa5612acb4438735b6579422685305263904472a3a883f4460554793a0d2f8123ba5c5d4f4df9e5fd87c2383f071744607b86ad3a3f9bfc0d0969bd139d9a324319e0d3a4fe346b51a73ed70ccc8efe872b46df672303757b1415426bd52265983e99d5857c81713fdb32a34d8805164396303c046460dd2a9da17642e3c42aba176bd3068c33dcbcd16da9c79c76b7fb4b2dd53ef71ffb5b8b0c6d5120d3cdc13844baea4a8b02b2be821111c388c6dde51c7bca06c4daff6fdde2894f33266ea00047acd25a8071775d0a08f72f6a4ef5de8a7f598166c5aa2791d29687599fa97bd044e2959cf1a050cecd42da0048976ec5492a730ff35177fd44cfa8e1d876f96a16acf58ec022d4863fd9e505938f9a2255788c9b105d1aceadad255978d7bf663fd6073ae65b57de63d801cedef03199c714e02aded37892c66ab137ca44ae7ede140d56c84716965143059e172d9c2d1fdc20ada2e584bb275da8adc0389f10f21478d7d1a44acd14bc11c81c6fae1c9a53fe98822d07eb17f077307b3738c4c9e425349aeb5595dcd186e8c97d5febec634b75e26ed7c4be96785da87f17a728a354d0c0dae9c84b93325a0fe41e72017fb1e31d58e17c083821d94a6d10bf4c9d22e907c4cd0efe0eb937697e405bec070cbea764716083f8e7a5722a44b67bac96afb767f0be6abe80a72abef56adec245ad44605d4fd683e3b73ac82a639d7863e0fbfaeb6d7ef379178438900708d0caa749e1408559744592c9c4c14647d571d0b9d381a50580550c3aac376e76131dcc3d07f50ed3330fd381a926d0210d1b8528713298432cb64eb4c33585f8b7f685ec29ade7a4bd49ccba4be556b13847a2a6591322ad1c7a2fb1a8c0be82485fa9e4783927e4c415c7c25d2bc1dfba29df135e3e3ea8727bc8121fa389a1ca0b3b802e6edc724a9b42b31c56f402302cfe966c454837785bea3a5906112c8a6bf2274e6130097950e1bd64e2c8cb709915c43650569b53913ace4c1323ebb4ba5e83d10fa36c3e2454ccfd4af343a75fa3507de53d60e1dd65afab33a8072fa37a96670abec78169c8189365c811198233014dcaca06646e4d6a5c072d7a8b315e664fa11fe6967140a5852234e0a287a65bbde6f9b9fd8c0ac640dc769a7836f0dc3a7dfaf584c2ac45ff83a08ed906a747c08a04119a83f2b0b7f2913f65bfb57518d159ec5eaa46e50023bfbf18932bf92b431d920f71468ff4a49fb64500dad6902b629d4e13ecb09cb4bdc41f1a1acad17f5974df39e3aad858c5bfdc69aca36d578526e1ed0975577293aaaeec26025c83d885bebb8c2de334469df91345ca0e99601575ef77b8442a19ba1016b7495303784d281bb17689ef6ef2a647c86586fbc2c893d3bae5e0e09bb4c9e4e2f3b60f5d2b4c21f6f819b31b9e84a7390b6373dd6728ceb66e807fbc84c7c39f097f29f872792649dad6911b9f176530b655b9335721add91df0316e0200fd64ced8a600ede9804de1deb40204f4af075482d988e85a9ca917ac02b963eb866cc61c99af61123bfedb6f86e6f496ab97b7b0aa1a113251bdc86c5131a558eb078650d02178193ddb4a5d1597d382a45482d0c4b1187d58900521ed9a17f10794a3032dcad500b53fb91d68cedab2259308d082ac0114c5cb9d51cc96911638e1be38644fb39963be60ce91291924e96aadbada627326238b2d1a4af8deb346a3846aa41d8d4d23b940c970d1af7d59b143473d10c9ff9126a901f33c8e945107703fc7b9190b585adb5581f8275fe2538edeb245f110be7c0869c21ee35c9047a1f45ec268c8422704e153fc39008fafd84d713f447352deb1c4c7de6e432bf4a9c66eb02a2c48519b7a08823f537d7039076597792759ae530073d5b7ea6d434158f36af727b55abff20e01484a002d37dda057d493ce9ebc01cd69809c70c9bab5eaadf380be8a0d0bf65a22f4801927fd218d23ad7d53142ac091da3f81cff09c9ce575a72a61d686689662858c1aa3432aeff3fea9f904a994913f56b542833499635937ec1c755081ad3bf32d4912049be02442169410ccc6188963cb542529290ad9c4b798b43103f9e9730887a7ae70e44c5cb524229713d4a0e0ecf8d654c75038104400df1148704849c6b267eecdc584d981b0d2ac8a8fbc6d0d71eddb52101fc47e3a87481bf260939127a013a98b830696ad5387eb2b2293be3c231a68b61b31ee5d67a041bd91314ec16603c06ae514ce88cdb169913cc1d393dff3fb9fed462f0fe2a9b04dd5342ca4a45b3d6487e088740cd2a423b96e48eec61bca2c4a1bba560f943222d35ef0878b15687c20f4b993c8ea637801afab4ad8858e9f496c54ffa87e52a39473fbf96ec77ef2d0893efa53a5c4a61537b9e178161a1e5080ea55e4ba281d09d031b52f6fa6d60e1d352e7abb6ca425fb3f06926cfe3661d95e67828d6021d2a61da89a23abd3b1461b9056bcf5f23e8674f42453004e19462330ba27c2a82c56ab0ef827a38c6e915dcc1b5054df1aba2bb0eab46bd92dfb993429bb6b41bb31b8434d8ca673fc8e707bb9e288a4a40e046791efeb7d6fc40f5fdc39d8e90fc38bd7c1024d37550c88117c43a38e9b3dbac42c313278a5b1e93276f9c3ee5057f9ee5b34c916112c0198036f554a279ec3474e0fec409cc2895f604d3e98039e32734dacc56208d427eab4d3628f1bdd689bc45748ad7b8d9bf1e70c81dbf136d72ba5a701d87fbc9ea6b176f27c1e72b1f8f6d3cf6fe932f11c18c491f1784fd2748538e92a9289974cf1e6140195016cf63d23b2b13971c7cad8a09fc064a25aec00d7ec6c467201695090da73fa324851e50aed0cdeb05483f35f39621d1948f074d8241569b2963610b441d5b8f73c58c47d26a49caf1bd9f7c7d6d7741a477c82a8af8f298455e07fc38da5469a850e55656942328433460565971939bba89e9c26ac19877897304455fa05f02dd71a291e5b6f03d0acae46ea688e37873031ea211b2fbb861a120cb3fd02aefe0b742cbfaabb7a0770fdd00f7d7cb2ec5360d5c6d4149f9b5a008ec8ccc355a50d005d24338808e7a3cd6fd850c0a5c4b993b3ace5d0b4a9056f22a5afa7fa16ec51df71143d214e1c255ed605a6b4141436a12ea0d3009a84cc275d32b9310ba5f31902e3d2dc52d28639c889f749529300089246a2416604a10cc57e294ed67050e1a33b605e586b7c5287de9133165c699c13550dbfd256941f9dfdc823d8eaa2fc62780038529765db17a4b9ae9879eae30a44d42366e41f1a3853660790ba1419769318b20da601ad6276c1caf7e49c1898545519a5e64527ea296b8ebe4b5a05c9093d0bd213b05308becff35aa7f0e31227984e3ec74d0632a39f0a0f68b476b1c79c4425d8ec1b71df2fc62603194ccae8c5bcd9e7e7aaac18b6042401be8cc916d3acc63cb701343c19b0e85a0874e8daf548eba0177d6bd250d21b20095b1c1fc968544d8b1ad4c4662418b45e7780dc4f647519ca619979f5418e82626420b7918665859e8a2560c257abe516b350e57fceed7730bb64e154ad3a5910462b2e371b0d6000eaae3eed16f865a64aaa9a25d301413eb399fe33114ca991abd636cf59778af26d6395e8d868220abbb81a5ac7c49c9350a6988bf21f982f492e07663100afaf37dcebe10798118ce84c6d1fecba7244cd020e0d3743f78267bfc5a7e020aa8e2e7a583504eb6dc4eb945a8f1015c253ec59a811392e72c7b604c7bf39b3a3bf3008da67444cca10697722b9877b13f65e7e08b7cf1d8e6696a25e97415f583668607986a347d7a5a22c998cf75e96841bce44395410facf6f1b7135ede6b0c0fd32cdfb43c2b2ff86c0907d1eac8bf8bbdc0fe8fa99b526dd87223b80c4f1df342a3b9e1fd545e1efb5dec14531130a80336d8637721627f17dd2f398127d0808ea111a7a2d5283a529f98c0829c404156e06144af543017732ed5c45ea3d14837cdc7ff7e97494e4c3b1eeea2a3884e45ce7a159c5fb0ceb1449de5462ef2122ff03817979dc009e83111598a7cec71a5367269973398d1a1fd5e489f4698970935876e605efec0cf78049d630dfcd5ef05f3ff951e73a39e64a3d5b7ea19e66517803f0047fef88eb336595a352f63f144ec2f34ff76a8f332a874f3ec1e674e359c6a6f28ce0f0c00d1b2487a8319f0d9fdb0973cbcd7e55f2f2659237e96360add339544f1cfad99e07de4db8b9ee7a67bc90a27bd4c1d2cd2f9377e996a1f877c916957c02c9c8eb845b3d2a9c1b2306fe7842cad2285fc96c5ece63e158bd96c59ab42241ecdeb2eb2274e660a21c9d00073b117bedeea0738f2d6b130241a782c0bccd35660c44124afc24c33930319c098772aee935ea1f88b60679814d5331861fa2b52f7e57147caf7c8f78eccef95f61d281cd47da1dc2dd27bf2b82b25f75d3ed1b76788fcfc2cec036fa18b1c67ad517a2f5fbcbbba43a028168ed41de7c2805293be03ef7c3c9550df15c97d79bc2ba57bb164faa8c4cbe68cc867b81bd3ad651246475c474e804a51ec47e598564298692ddb80c0ceac82c0e2bd5ef73188f5edfbfc0a336fc449919621205304030faaab8c97e4ba8b703432502bce578e46cee3ad7a2f40588cb41390791e92a55a9c316b0055d264ff3acdf052f3d7f98bad4d6d3400c27f225a2aad231e302aa3a7fddf195f2123453278577cff64e4a4d4c06b1aaf45902903d97c02c693b2ce8eedd066c074e89c68954da04d1b72a597322afe09874e9bfbe71946c3c60dbb493a98ccb0e03d6e9e019f5d0a90e5cdd1059c4a672b051429fbcab489bcc06db10ff28b8fc963244a11521a34947786c072fb7ff9aa33b7e4cb8820dad26114aaa6fb65990e7e6107a5d01b2be56acf7667915880b908c1be3477d04ca07ef5000906c5391fcd0882b44a6614f0a86e34965315e99ae78e5f4c25161a80fbc128a1454d1c5d3dfb88380ed4aa5b72fca4151d529d88a0b49a05b83662018807eb219562ed6f4c94aac4def95c72ce9f78d1be3f4f663214a707f259e07a969ba12786461ed3932d6e2c0d3dbcf87ffa8e2af393ecb9ca5d49684995f914a1cc4b538df8b71a02dd8846d6267cb12f7fff87511809fafd87852027090e4a306f98724629e08b1710bc87696755a7db7ca0446cb9a5134605068cbb06f63622841f5344ee1baacb5568394edbc23abb2bcc737bc022012c711950e9d65f2fc9c24223fba84302bda22c59e000e7196b43975ba94fa3ba8a02906d3999a4d8fdaabea5a78d1727d1e442dd1510bac73394fe39aecf61dc01555acfe0340a7d2a9a07ea3c17ac4626e9f0829c0238020d26a0d9a05a6474057b3a0c1eaac6506c795e1986100d511429e24268349165504708558d487d3761c39c108ae0b93ef44c09f34c696ed8f37f69a4bc1a66806e7b8bf1d653090df18a4fb0b664e532ad5a9b6e6a5651ad9da0ca732ba029c35cfac5efe74478ef0fd83ff6b1f2331bd4bad25900745e4890ebdfb75c489cfd9fc86bbe0a46709042fff89781552c97511ac8eeaf7b84572d9288d540ee351a5cc68bd6229e146490c548e56263720f9697929ce41b530a4edde56dff20f2fcd2cf76ad22404eb55238df620133b643255e71dae2349cc5096311fafd63cd48756dc952492aaeb57309e5da3f0870a39a11c6740a48c778a490e160958d7e2995400daf463a4b75f5e1696668b37059d7a10be8773fe456aa00ed90f4d814500a90cdd3564a827cf56140519521b2b31269849a827461b5443dfadc690f1db782ef1404472cbb535015b0c1e6c93728530db915eb5ab4b06aa31a73eb3dc993d4e42ed56c10867499f9cda25240eaa0baaf03de40ec28bac42caec1e89468765b53c84765922cab64d91237558706c5d5533574e8a7f00cc33f7d3cdf9755f5f702e35b8619b6bae6048131182356f912e859e37f52f83e647559d0f6b8493e337853151f683c95fbaf9673e9e7850d59884612bda953610b9b1548b68bcf378e4edc7fa4105b03e645c9a307f2836b1d89b8d398c2f67f9795de4630bfe6a6a47d01e69761199f881e3b43c7aa9ec30ad84a03a21b92b73fd3de41bae9aa2c50fa22096a18991b5c836b56e438189812dc480e01bb1aca3aeaecda6fb730dd53d252d44290d9eca95bd8cf99f0b6f35cd462eb791d354a2f9e48cbfac81e99b4c2be5f3c0efbc6abc0fe185f261e20439fdb28922dc770ff18489052443288d06114da1fcef33c5d126420719302339307a2f8a905a5366f5cb676818544040186314aa6241b14957563fb9b8ff81d14cc50f52387ece0255b976de5141765d42a2163d41c1c4ad9e48c51010b8b554f2b27dfa1a8b0412811baae38df4ade9ce34bd4f8551ae652b7a8617001b779cacba8e23da3c2631e15d6af2c6b94ad3eb404a1c2cf636e00462988bda58cd91995e06b46c633ea0e9a88b278e6753c101826f06754911f5f2a0e7694aeca1587abc3c45eb1962fb81fa3e877702883151b848c1ae3ad80cf75c41289537c315babb0103abe498eab51041e074a0fab136c9a4bbacd2512db6c54ddc11c85b2de6c46051e638f9948e12a1c95f84c4fd934a9b36d8d1d71ae8ff051ea02dd86d396f67cf5e13e09d709cb47451ab7a090414f1f58810af6a69683056ac2504076d2b3b37313db1771f713191f01f2f44673041bb3c65d2be142e9bf96022f3285084c3bebe4b01627ce026c8016b86afd8df51a6b636055e5edbe1f0f51fd521056a112764592880f518a2171ed3451415ccff669789bb9190d3688169e6bf00cbed69d6c5ce22e7d02201ab495f291c45b2b569e9793b1dfa2ea3fd12d65292c288828f47dd7a86befbae4a054711d02146540d62db625bad9e94729f8e1b4780ea46b7c5ad144c53b3b5167b14c2f962c9a35c65ba3c36050e7ddfa3fbbd58e489aefb53395800dee0d7c6a7aab269af22fcf76ccb9097cdbe1321d373490a4bb15128325c8d34c7399a9b58512b7b854c80d76e905bde651502b3523d3acec8f8b078bf3fcff4e0bb0393ed44a59f2a9ad5f9f420aadb09a1b946fc1aa61e5d1b35a9f78d61cbfbe32a49b8306535ad057850d5f2e93403fa61644012e805d31e516782cc19231297cda3b44e03f8ec0fcbd88a8981aeed21f45a721ce55ed5386d3b12ea3891aa3a55ddc1933b0b1426d8f34f2f65e22fb955de0b202dc2dc9848ccd5d9cad54e67482b49358158fdd3c307a195c4cfa330791646a7c46e8f2bee94cb8bc57f16bf31f38b530dc125f7b28928139cb127d5518201b43f03996e9a693f8d48f0318f47fec2a3c9296b37bbaa6080666f7fe18788cb29b81eacab81752d77a98648a47227f0176e2366d419a5776b5c00b8b1a266efc4ed8958226b0f839cad4a19398828ebc0e9119343891eeb9bcae173997492f59fbb54392a9f2dd0ffe271f17cd7935b47638083133b5dd6f291fe46e5bb3985e64aefa14cb11aaa97bcf499ff3763a299b9477ce23796105073405538b0d93022c1366835953c7bae0c050a303f60a155e92174b2219664ddd03c820abfb186d6a6cbc0c2c78ded43cdf6819b52336250fb08436e5b85b9ea28f562fee39b72feb9799d60a0edcd4127bce06039215b9225693592f6efa418aa84624d62f732f37e20367fcb89a0aaf1d877187b328e09d5789b3a8818773bddf40744aaf9095b38b025fbe4aa93195d4f837054a53e1644e446decd2c52e730a7649dd6355682659ef30b3c95655180ef6967df412358ad067a89bb67f8489699372b0eb84ba5e3dd833a5f4344d88fd6c9b67e8188e2676ac3915a81c3286b75128e05a3266f5d633165b32f3ef82f6105bbef036aa1964f6750889c61108583733276ce1725aa2f30ab2b6012594499c62594fda3689b90d07ce97d8ed196873cbbdefd4807254caac3c0d5f21fc504b0928f48858404e3b0e45c3625cd2ea32f12a4e1167a4d6a5123e69c62c3422b17a32f3da3b0a7bdb57a3771d97958e87131363c1867c8e9266a847eb931b5a42ec819262fdb44971faf702e2184c8999a78828de7b15804cbc45b76e1cfd46da13bbec5f45144feb45a2099a3aa7ae618512307c152f7eb7b32c752e19c3ea3f258f631ce4bdefbe66e7d9c8d5257680a43452129edd43c66bba5415dd1ec28b632151dba31a7145b63055005f2f66638d512b92cf2b4b2a63a4b7a346159549af23370647570d98307dab0900ef24b98f3b6f6ffc0f8962873344fd967432367cc553a01c23256a15ffe069a1212e4b982a40fb6945b5537cc86034c7aaa9c7703d2bc598aba978bba44dbcf72454cd15a958eb2d6a4948ec6da014b79f5a40a94057b27b060bf20d21fdd1bbe86c61d33d3a21585431919e56694bb8556ad9eb52da98942c158b87701348ebda8bac0bb7fb76bdf68941f2c73ecba007cc631a58ee48f402065da7920c4919a24ac225d5f83cb020d40f48bd52cdce8618eaeeee8b04e749bc9eca89247600f1fac58c8789f9f951f29255f8ff2f25c3903ac9e9d294713aa2e9aafd184b1c73d4434828db1187ca25d0c6c6120ca222a4a103e3a28d7dc67881a91a93cf28740543503278415c0edc919b0b500896a3f29254ce740ba382599479d4369fc90a4424a6034e5948303c1bbbfebd580087098d1598fa3f82f042d9b0d5a5c19431fae2a380285697240a7b3574b568714a8be79cb08f65839a2cbfbfea5bc043d1ab4bf245969ac778206ee73864c17b08690d7431d4a0171546a96bb84e044b6a24d8b375d27857dd718fff3bd676e162f4ad7e59aadd7e97f6075b3c0fd5b8570e5794424a37dc540bad98780918a859c8743489be4c295fea7a5400bdf0f2a069d097caa159fefe6a4fb2dc4849ae0d30b44d66954972a1c4620daf81f9ff4951a926443883122395f6d8442fa43d8269d02372009d3144a5266be86d4f7512c2c9d8c691ad591a54460a5ab48e6c27ede120e48ad035f4e116ad91e2961021e42af48a8850999830c324e64f77852c1a30436a0a315975d7f4e8ff9f711da2292638ba887d777ed9a9028a66abb5201d33d44d82ca4e1e2e02c1b49f98484a09893717c9a4095f917c99c65e70b97f5d17bc043bdc8a8d41e4ae1373c0146a4c46023d26583875cb40dc2438f14226f78ec81441c25710b4b009f6446a7843b650d7787c59e4df09043886f573526a76689e62eadc3d9f6980edea8b964785c4a833cb7db549bb4ca68823cc0e936328eed2a5caa2cf81f816843de16b7666c350e0a4bbb47f8a33e8bc6f6b9e80efc7ef2971c319727f3352601c5bbdc617f0dfab7bc80ec3ffffd9f77a0e50e5644a67197d801b7ddd139b4c62b140b71e324bce9bdfdd1df31f122152c7e84ffe167d72968b7f84f44a88bd2470646e20440561d17627bc0d48e6cbb0e7ff8dbd6cf05efb0784e4f6b127c8067a768a00890f69610dd0952eb1f08ea814faac50c83d1e35941069184ea5ca42ba52127670f4e5b1d30aa9aa2a8a1503252169023c028b3cb44738b4861b9ad12686096c7b1c4420a3b4080b740d366e0c3274f462e251346dda8b5744eef1982b3e17d33fc2bd10ee05622f47e3545484f221ac280df407c75133d9d090bfa05cabd28690ff30360bef9485bbf41d67218c7b0dc5c2826b43cd45626cfc5747b7408c4e8e35da69db471da01d34878165fad93d7c49c65e12bd914c0b6ab8bae55521252278400892a7658efd31ff83d70b2f7dedddbeb2e2fa968f3876188f62bdb0ef16841c457ab658d0a18f9e8a79b730db149a694a8e686e3cc8fd257128d20099fc2ed186ba885ac5ab7ed79ad35c4e84f4da4999249a1b0a96627007d272a25e56e313a87f707ae1ad070b7f57d7d82d3800572b272dbb04583cb9fb71f26427b667b319b1bc68add90b3abee868cdb639da3a552c13eac8f9c0a1d9e04032b0555a2065d9de4af72676c1df57504747ba0010f0304a146e25ad02b6a5cce91bcb5baa9d62242d8028520e45c50e90aaf5b875f42313211bd6e714d83bce1f8d5cbc266192207a0b209286d8358ee4425659086710267112ec2851898383ff08bd9b8481eea0cd305f60bddecd3ed878a9059045b4c29edcb45c98dc35aad7628e2e8c159db2e8b3e7facd91329df451dca00c79ec80cf5cb8276bfb0b475899149c7cf814ac002565ea7e6bcea163a9612ec431c00a786c44eebcfe1dafbe23a80037cb5919ce176ef7be57df5af1cfd284c7835344058b5bc3a1e2464f370a1ac3b07b6d12faad1777d6d8aa94ef5341fc538b61a00db497de0c700b8a5019a950f4a76739a29602b85dec7d9814773bebd82f619a80f241b7f2ded768a1c68383ffc8f5b9c38769114c76034a023b9e5720942a520763404f93532dc2259725b45e847b2c5b6acd58699944db8a914d0125bc3d4f8afecf6f431e3bc5c80b9d9b14ce595004d0352df4acac5d0c4e9309d31e90a2d812f6f9b828d96c11d9b2c9de7b4b295392018609d40993092d7cee32da03f7739b81e519e2e75e41111360d92f2321c032b7088eb802f0b93b20c415007c6e3284800163e9b0851a537658c5b028403f6928354ea809a24109342ce1867663841be0b8218edfc103c1dc00860d540c3583204d13248dd026bc29d1946238a14e2e00b9b905ec92769d1d326003cb7623cb5ac3a144a2819b684191cd48e714f1b50dec7fa473920440cc2e0400c43726276b1b4c0be2ed642dcb5add366eab1b2744871d0ab0c6bfb0b002901a1a6e6eb8e1870a3e4e3dbe7390c07030d81f1524c8d6712ed454e2b1cd1ebc01004fe16448fd26b213dcd58aeb0d3b0749e90404086d31e413b2656edf84db6c1be53ada35e136a2173285f8bc223189f954760e12da394524691a57a269fc979033fe485a0af6229a0aecef51a41c2dc67d42761553c0fe493a070a4b481c2794e81c264d2346ee2ba480256d7e13dd37216bdd0240bf306105679ca182990233cc300305679c71c619679c71c6192b5041ad566b5cb7ba551fe40d7c90382dfc8b0f2fcca316d2d727202cd80fdf3f9483fdbd1889f2e760a801df9006269d9e058913003903d334fe3460ff3983fdfb8244befbbbd2f9c2c20a407ea8e0e3d4c3c554e2b19146618b08b45f68f36aed366eab74baf81753f1c5f7e1e229ce7eb781915d1d7c12266f3f33e52ac9c277b38ed6d5ba20d4946975aef0e7f47ad844756ca2644049c649eb158d25a37053470d1d2839fe8d531be11a2b354e34c0ac8078aa63e14cb170bbbbbbbb7bb270a5aa9ba9a64d197f52f8f9845133e52b0f855128549299f258cbe713eed54c392d7739cca75546e1dcab5ee17c8373c7666ac662b4999a3fc4dcd1683d682e34936ba6a8e94b62ee4acf63ba5698b199a21d103177e10f3187a7f721e6479dc48caae93163372e733553b53389b92b8939e421d2668a76dda869d863be3a9d44a2c7c0d812b0573bb03ff1d50a85b3af56ed2bfbd9d07b627d4eac4fc5d54c55d79489cd54e57e35572bfcc542312f76056d4a8d4ad076c56b75cd548dcd5a5d31d78ccd549da3c66aacc6a86ba6ea1c7509d455eda0aeed49a5551a37b71fd31673c55aeb34b7a9b94dff759aa3e41b68cc62780d18962af8719424411321f6979721dd5d360eda947abf6dd46da497ea9e360b023ac5c214d08dec640885ec48cdcd94f1aee2321eab6e2d47395892a9ced3e69044a9eea9989580f9b6dbad664909b7cfcdea2a51b2b4d417dd254afa0e1c3e930ef3e8d7e8b6bcbd1583dff2a3a72d6f9fb6fc2894b8e562e97e745bd66db88c3fe92e6112e2a6810c248d3f8feb448743b1d75881ecd74cf97b148f6eafd1b250ecd8e869cbd31f814366dbcffb60fea313b4210bc4b6dcfaf63a265d2cab4e05e5e58e3bee98c2a8ea3e84f2527bdbf2f455b0a351cb05c121a3d1078aa092c6583ad1a1104a51057d6879fb9fbd2d2f71f822704828de842d61cb833b48dcf222908716d1b670747ab7d416e989446fef8641fa22d0d22d571c1273bf81bdabb0bae536127ba51e9d74c27030dc1528baa023cd06f69740400d070dcd06cc8d181cd8fbeb6927db1cc180fa07244dd224cdebf03abc0e34949068a05133eda49ff712c651ee795e13b8bf13e24c68779b776a2cab57893e7ff8190615a48606dba16c833d4cdcd2b5743f7ac97d4b785bec7fd3da9f9ce55e4eda178be839fb1df8ddab6045f95f4836e803f7e07fa0070ef9be29411e38d18ab4e574112871d7896ef33028b709a152220f7c4fcc4c28ea3b10863e3f8cf72ddf79600bf8a21b452412b378ff59efbf0e1c0282fe813c7862e9ebecd779defd874185be2d14129950ec894e504c1dd57122c515a68a9d5f07a44cca5cca3a042e80ad300d962e604114646c8b2a9806cb98162b4f45c9c264e2d92f95f41d77dc1184ab9827306b6d59b76eecc4c474ab200f2dce2a3e0913f23619b2b11f03430d3760d934d4061e9f733a19489f69b02f8c72c2a6f19c52d3c817d10904d20f13009747a037745d0311b03f0f2a6d875dea930f2023cb06f60fc31960ff96521ad86f706c2f8d44c922607fce0decef491c60ff90a4010e36d8ff51019038303c4c0dd8bf1ffb4f22120dec89997e46d1e71ec53d6dcf1b8d7c6414cea88cc29e51291929f3a4b73ab1847152876cf049186fe4e34a19b4cb99929132fe3174364834b03f6a6e5ba558cae8932cdc7f9f43ec7d4bd5e7f69bd6bbfd8994ce6fdae3388ede1313e4a1fb8c50efe9a43f76ec7f7fc48adf1ff15e64822498d0b013951395ffa7a4efc0378af7df8df2bd9c32219108422532083399b886d4099e2a2f9f709ddbad600f33e09ac50937009d78b35ea5d5ab734e0a8a3ad109c7b53e476b1bdfd7d2ed3e27a5b56edde19c251bc21e1adbe92a596f22a9532ac49d86600f8d4724120f1e5e320d394d3ff5c9b36684938c39c64cc14481194ec6e6a37a3c423c3e1e3c78f0b0200f1e3c443c441e481cafa9281c37e9686447281d352badb356d08759b7e66a27bbaef33a5a6b0d0da2325a7dd2ba711de765cf0e04e46e000185660afc5c43ab05218179f0d64c19d40d37371508e8a353d664109229e3b2810ca1cd0101593ae7ac6e752b79186a209cb30681401107536db8cf416a54d84242a68cfcb633856476a29cc190cc94bb2165fce1a0cd817d09405ee77533ecdb7c0348030e5437ee7350f64918253958bad52aa70c938ae96fdb1b353c9df0cd0d5dd23dd45a31159da8b38e4fc2642ad1906a641b6a6298271f61bbcf49bda6c65d06ce86bb11f2425ff771de68ca6019039636e48b6591ec49a04dcca319ce1ec39266b7cee93e8b94eba1d978704c398e03ab53efa1a18e7beb0c3031f5c01edc9312874e6badbd304580bc196da32daa9ba8c84cd437e6438e6ebc9a29e375d0193a0e421f26eee648b6e3396b66ca652065fcd97003bbc381dd3ff45888c27a3c619261c6749961c6375d61bf74329c0c0e708003730c32ac7c12267f33ecffb98cff1b61fbaca36b355008930e9c3b3a62ae567383abcd39b3a2c63f4a5b9a20ec0f9b06303ec4c5c740283f7f8d169f6cce9e419c1c2ed322379b41681dd5df5d09690eea801e9871b329d33f419d0f73332084b2ff9361d982db315fc264910feeffa64ce26c73c66e732bae064edfa52a24c31d8a4d997ecf40283f8762b85d94928a7c38f7217c122677cd5a29bb654b79e94feb36f2e573b47e2d0c1a32c39cafa605a2386a8ea06eb59f4819ff2bba29d89b0af61f3d0afd818f49b6b87e5f252ced2966275e68f39efbcfbba7f0276c5ca2ddd30f7d62e8b71b657b2b5eb589596aa8bba1904b6fc8fc8a4b6eb384c5f5b9ef68f736a9a32a65e374f253cbac12357b7aa52dde697c686034b0fc5c1b8693a83ec5eab57abbe7b089d3677dc1f7e5fb32a9aeaf8c355d61156847983b90c755b4c584307798c3fe1e6625244ecd02c803f94ff284520633a00377df3d28f321b27636657cab4d99092465b631bbf37409f93c7f72f83c5f13863bcf5867af79900ddd79fa74f6170d5df3b98368bebbb3b772c302d02d6ba059af5ae8dcacfb9dfba7ebeeeeee9bd0a451b2b43cfddcfdf86d3653a121e2569ba9104d87ad3680ad86fdb995db705324cadf9f9322fdbf71a6b82e3c0911f3e97310f30b40cc281c44aebb41cc5d9823e6f0f43688f951376246a5c45cd3ada68c6ba6bace46cc5d588398c3130d623efd0c627e940c6246c520763562ee421a31872718c47cfa19313f2a8898512f884153c6bd9a1a948c98518f12f39f4e6100c41c0240ec60c4dc852d88393c5d517c113dda64cd54a8e5d16a3c9a477b8f76f26821cdc3d33f0a95e90a83ff956eab42b5907f880eb759123ac21c32e77bff10d04c59174de2cc10502944eb71433fef86b7d0f77b212fb4d52f0e3882e84807ee2fd55c425f1c70b84c1cba52ceb85c891d7b72e0fe2f0e3870370b5faa85442c2c881c27dadee56ee2ac6de94a55883653b350cd1fbc56bc2a4bcb6fe090910487b4bc101f35a61c6ba6be71648dac9135b246d6c8c2fe9c6ca6bed78b93bd38d98b93bd38d98b93bd38d96aa6bedaeaabadbedaeaabadbedaeaabc166caba3a98757530ebea60d6d5c1acab83595717345376e6fd745d189e4eff285410e8fd80de0fe8fd80de0fe8fd801e6da664a855538342fd9f4e61e8d1ba2e0c4fa77f142ad4ca41387693d52f0ebb0bf7fb57db700df767ebc23e5db546ed8cbe463783ac89650cf7bb7fcb75dc37cb1806bfcb4198c33c5918f7cd21d72272a14805200fde70859b392fe80aabf003880a131cf243bc095510e23f6e87c34b5510b1d06fea0314edcd3308db97ac039a33dcac5af8206bca842d163ff79fe87ed8c621719c082d1c3247f4fddf6ba6ac6bcaf4f7db99c4317d93fec4e35d7a7cf70b778b3c6e8f37dd0d9f7a7c3fe95dfebb097b907aec20710fd174eb89d48675b575992ec53dee1b73e6c203c874278f2be5cc89244a479d1cbbb49183c986e9363e5d897bb8f010b1944497d37511a59c315d89453784bfdfd266aaf42d52196e0f83ad998a92c5f42397f707abb84d8fe7f1fea018a2f707a9c81cd14fd694718943faebf2a4bb611e22334297efeff123971ee24de8d2c3a54b2e95478fd2a4d8e5d29fa61ea27414255dc7a32b718fbb8449c883268f785c895d4aa3aba467c426114b49fc364e341a8952ce90ae1479226e7618648560cb5f1412751c4b7437ec289035531e861f6825cc1dde2af8d9d16d79d1a55885fef0bfaeebac4824fef60dea58f0766f4393856b7010aedc1233285bbc5d4adfa9d8338354591a8ce969275e4f3b69e96927cee130826e5e8195e133c31246c614b007499cc6fdb5867d0ab85f86defb229ef7df7fe214a1f73eefad6d204f9485bad6413dc3fd5fd34262c7a68c8faf5c3ffd6a8db8bf1bb2440910df87be48e82508c40f20426fdf8a537c1f127ff887de894aaa7e14b10fbe5449504911508ce17e1ea9b22268e4fb1f4566b8bf8913150df7f7a82468e4878b4564b83f04842578a4c9e72fdcdf899ed8b04c5f35d6dd1f4078df7df7c2fd9ef71e9027eb15cef45557d567c4955557b299ea3ef49902d14efc0144f7a10f8953501aee972aa9fada76438acc64b89bf450216419a51c2a4fa4a2870a21cba8f29ec280aaccf3be135b4074ef8999be785af5143665bac519ce0566e0828dfd82010e66e033f6d31fb7912fe4e00940f81955db4b9fddfd1e3453245918728caafe39ce553f7df573415bd0fc79c1666c46abe1ec3208670fca33888e55cc14888a53cc34865be562a6b05ac3b2859ecd09e7768e4fc2e4ce67fe6c02a5a54916203a092598c1a8a2e27f00915303335a40c51e2a9e7e4e0dcc68c11d3de37ce3085e8caa4d14f2738dd0d6ea799993e1b0ebc66e744e267146b89f6b437240929bb94de37e8ee636deb22f861b85a22d2d2c6d08bf50ad35c4fda8df8486072e186d08ef090761a62e166579157f15dae8ae02d8bf65aa1ba58c7fa9ff03d8bf832205fb4dc8c9f0f658e8ef3065a8d88d53c645230827fde447bf6eccddd88d35e4893608ebe71b8f03773cd50ed789aa414fbca1ae980d61ff573f53171b61bea92fc46fa62cecbea8dce11b8428e9998a360843a15beabaaee35a765d0b4106462dc6f96479a97a4a184f46556bc0084a58a9be10194b0052c920b04410537df64a172ed50d9c5065a6fa446d38a18e18aa45866e10870e669c05a2c550107b6db44b0304b56e48d30fd41bbab96b62869e5e110ad260a99ad0ef9955d4005265e1de89eafb24f87d5fefbfeb43bf27e6be4266df9a77a21232fb26a1a4efb843621f6af05432b113144f31378199b404439e179a3498a1afefddff2f74e98fa3660d42ee337571ff01b799a21394bae88f121d84b98e09c55c87379008c78972f638021ca33763023468e117a2c2042934558f0060aa92d7e09d022b41322a367128556ac052f5d800d5587bf3a30b23b4543d3d5e2afa4e544d6c7290013a5aaa263d9b0f6ed05249afa1c79b8346c374116db9c53105328054f3f696454b956383515663af1039e32f6de0a3a2a213d5a441986f442d294793a25048f4552ce58c2aa70666c0543f8cd0df7e139be01005a6a2a213d5379ab79bc8275c6008a3aa67cba2758a6126133769294df0014cd5a4a774064b25bd869e6e0823ca04c4650d1ac000267bc4a0c50d603f74bc0d1d7811a4f20ba4c1054d25553208020b33992d6b508217d4548dc50850e0a3923650636ca93a8bd9173eaa6f85e92d57a8a2ecc4065a90a0a64213ff4941133830aa7a423c60a9b2fce841ca81fba51cb8c507d272ce2b714f8bacc994d131d20c81a5a262961f3cf4d777d284448496aa490f0d0f5c30aae8f7885bb05454eca99142c62893400420c854df0b5923cc37d89bb410e547d5c3d154d26b6841b250338327bc54f3eb1611d862e5d71292d2eb56f06641e4728d15b0004835afe3ce07a68ec6927e8ef3f92f2132316d9a7e223fa4ecee298dbf167f50fed7a2e3790b0f147f54369d2239a57783f1f9830eceabe34d9008104c79a0f8abb2ebc49f74e9dd55947b309533404a8e9ad8c9ec0efa3e1b42d18ea4a36c4bb11bc9148f410186b72aa69841e5074f60c1ac0e2ac6b80118480083093c5a10040c31c000418b0a5ef842f645105eee387c81450cbe607925b081034460411c41256002076cb0860ea8088e1895a0c50cd47823ca1d2aaf811761c4c00b31381274f1460cba8803868322e00f4b180edea05f10be1347b9ce76212db9d05377c238d83f34c34b178019a7c939a4f0e42271589033408200e04f27aa82762fe46305d16798cf2f849f65b00107a9068fcf9206a5cf12072e9fa51ba6cff2072a7c9672f4f82c8f70fa2c9960878fcf520a2f9f3b0a90cf2d6585cfcdc57f6e2a2c7c6e2b01b674377ce44ad5476de956fc555bba147f9b3d72a1bcdc71e43d8dd29dd8616e93a708707fe936764919ff169c472e39f2804c4d285f1eb938d9792191fdd295788e3335452065fae719b8670bce73f49133fd3c774e995c348d172c979c6179a3b5d65a6b398ee3388eabb5d65aabc96432994ca652a9542a954a2e2e2e2e2e2e2e5f8b614b7709ad5205fbb7159048e9bfb682010cb8bc3232604b377b2b9048632f8aec2bb4aff495e9dd57fa8a273af2e34c1d119de48da42f89de48f246923792beb3331e9ecf3c76c663673c76c663673c3ff3b7f565ede71a9873218c0b61dc73218c562badd22aadd22aadb6bace445b26da32d19689b666a5d2ac342bcd4ab3d26ce65d7872f939bafc1c5d3ed790782c27674c52ce94dee5e6ce45ece44c7fede72ecfcd0e94a7cffca427eaba2018d074cd9ff99aadf9fa71b55e73357d26cb54299dace9335793e534af795035994c62f6990779cd6955e4823ce63207aab5567777cedd3dcff3dcdd5b2f5fb98fb37c7496fbf88a63d16a41b3a01a6d16149301c11aa8653118eedf80dad53ffdb2266e7bfdb46b7bf5aa7d9a65dfc4f15831f7d8acf6e1c4dc2bdc7f6463d16a41d6c4434506d5a41ca941337524d757aeaf5267e2f9a6729b75ef910a3453fde4c88ff5654d549ee7c9773da27093fe881adc25313fe9bb0a49cc373c623e513999c41c76a924e6aeb649046921cff7efdcdc98e7bfd0efb4ca1b8b10e610b6f3fe211a12a701ef1fbaa07312f0fea11a6ef3c3fb8740331525cb1041bc7f389ba92850fa0e551606bc159d0a089adb20808e9adb1879ff3036534228600161cf1127e038535d05080367a251d412c144b396b1a5355350bc7f0b6ca6a278ff96d94c49f1fee1984f19956bf2cd119f652c4b59964059d2b2ac6519947b95e473fb342bb72bf74fee57ee586e596ea0dcb4aee50ecabecaee939d95dd95fda7c9677f4df1d963d965d981b2d3b2d7b207e5b9cad3274f569e2e0a7c9e3f2f296e17c5eda0b85c10062e07c4bd38d6b6016171b72beec6b2e2d6a02aa2dc1abbb5e77614682bdd4573d153daa7b7e85557a0a14cd1448585c420c30c43741840049448222391a4b5e82c2c40c593f1882a4da5592de51ed9f9dea1d681c009ea6c3694e30389340e77aefd4f76b2db3e9192be43f49d4fc7caf2b9fbc0e7d0039f4f1df8fcb8c481cf285c727daec1a5308862f9dc61ba010dd0f072a69cf81a5eced4136ff3dc8b03da823816199f434c2ae3738749a4313e777834830c31bc14f212bf54d5d0c0f0db4f92f7df5e15a8065dd9b6d6e71077063807cc1d979733b5c4cf7c90175c9041bd2cc04b03bc3cc03b1921edbad03eb6343bf2418a44f917f91026714c5e671173177e40cce1c903623e7d07c4fc280e8819358a61d04ccd58631183f0a8db8098bbd68038761962ee9a0c3187750c317723d7e88a98bb390b5bb3ce8098bb9503c4d68e98e4722ad3c5d2648a2fbcf8cf6114503c0cccfbcf581826b99bca74b11c6958c75a68e1fd473e5d3ce1c4fb843e13f89724b7b29ed2fc4752fc4fee13faaaf3f11f03e0935c0a650516de59e0e257f8dc3191c08b4b5a49eeacc0535af599a9a6d2535ec9e7b0897f7939534cbcf823294046ae991ab9925c57992e969632c5399212811f4bbc7f91f679ff17299325b9adaaa2820fff5ef9f81cfa8871753f2fadff386bba58daca8fa4f8539aff683553bdc523f119d583d2f28b2f672a897ff144588e78211ec2603c05debf6533d5e4fd1b68a6a6787f1f67aac3e8797ff79929277fe4fd1d3653cdfa1ebf9fbcbf03cd5453f1de54de7fae66aaa1bcfff499a98ed255bcf705de7fd266aaad78ff599ba9aec0fbcfa099ead5fbd3d64cb518df57cc5463f12ee5bdabbcb705dedfd666aab3787f1b3453adc5fb7be34c1df1de56dedff399a9c6c0fb7b2c0cdc1ab3722baccaad4162dc8d7581bb0151b91c8b7539a0302e1704c6ed5e5fdc2ec88bdb0175713b1617977b4db95b90cfdd5e5bdc0aa4c59553e600df59dcb6c06d29b7b1b872ca10e0fb8a2ba70c0fdfab2ba7cc0edf15b872ca10f9b6e2ca29a3f35dc5ed28b7a1dca6e2f693dbe33d729ddc9e3bc56d722970a5b8515c28ee13d7893b81cbe44ae02eb94a6e139789bbc48dc055e226712f12574e1954922b5547dcfa9a326eba251e1ee93f6a4d771476ff719f27aa2dbfb3733dbc805b7294e91570b318f1435cd307010123fefbe13a86c0edda1af13b0f81ff28380402e24d6884112fc421408df8a473a29dcb61214cffc30fe24db8f3c3cedc31fdb7d99dbbe18fb33bb7e2afb341dc076029e285b8dd0f97620584ab4e55c42fe02e31bd929e112fe0bf226e94236fc5ab8e88597676de01ff80ff3870c803c49b70e7253864e785f8036ee3216e63075cd373e00e120f219e1c65dab9132be0664122c48d92850824ffa920322344f23b4f0411e24d88e4253804c90b71221aefdcce51262462e828d3ff200e71b11cf906dc9633a667c07d39637a216e37654cbf000588411c114f53c6f409b8b269b263d3ef5c07e246c9b2f340fcb7734f6d776e388e23fedceedc6e1c4723bff308408078131a4180919d8b7294c98858e3281315ed98deeedcc63f98fe939cddf9213ba29433a6e7b93b2f64eedcc6456e9ed80771491fe0660964809ba5ac0037cb580f37cb2002dc2c6b3cdc2c693bdcdc2f2237f78fcecded1a727307e97073d7067073d35437fb0bdfec3f426e76570e373b90006e76190e377bec869b272be7e6e98373f35cd970f374dddc3c7f5237cf97cdcd4eabe166af650f9ae1665fc970b3fbc470b3b36a6eee18cdcd2d83e1e6069ab9b957416eee176e6e960b37a364ea2bdfc4dc254b4200dc251d4cc3b07f0b77890f2c52da927e879d300b735c12e23cef9211ce73b6c40756c1ce962cf170f6c625a18bc9273b506eda28d757cd9d080604e7f06694b7b89be52c770b36e25c5fd8bfbe664aaa9420c1498c60a26cc1494bcf8d13ef69279c11f07b23042a3953f235eb6861ed47d40a48560343ddcc15aa3bd18d0861fbcfdba96e3895bbb2ac6daada74d5da8bbe7aac2c958c6d3255df8d08610eb1ad37cf1556a9bac99aade99a3f2f58cce572b95c2ed7d8ad429f13eb5b28d74f4d10eae7cd8d3c3daae666b25c37cecdd5f479c16232a0266e4e8faab999b96ee6a672fdbc603119108bc562b1582c97cbe572c964ade62e97acd1caf2168bc562b1582c97cbe572b95c3556bbaafc172c26039ad1582c168bc562f5ac67b3176beb429f13eb5b2857cd8f8ac562b1582c568f2e63713541a8dad34eb310a87399cb5c26632e55f2f4a89a1b51953087785ea9fa64279a3827f89a106619dba1009edadebfdd7dfb8f525ab7219c9c711897f107ed08730df6fe999de0fec6f4d215ee9d9a9a1937367563830d760707c7e68044e40d3937dce0b36fa0cd61043a5e68341a8d46a3f1fc0c3884e7bb21065b13830c32cc3083a5a1061a6aa8c167d750473ead56abd56ab56c6c0d36a9d4cd8db501c7061c1c9f8dd3896cadb5d69a2a43ad41ed6c74db899121c7e2e4dc70030e385801e420801c72f0d93974a252ad74a4328ea38da945721082552a3b001d06a0830ed35b874ed4d65a6ba9d561880e112276071e76e08187e9cd430f2d9726f17025ae9a62ac4cc927ad1b6966adb5d65a8ee3388ee36aadb5d66a32994c2693a9542a954aa5120ee010d2e70387ad105007ab54961bc000ac0ef4b95bc37f72880e4386f8ec211cec0c2c7f8a40a6664c76738ac4d979f9930b99337af9d30b69e382fc99acd9029ad16a41e35cb55aad56abd59ab3d96c369bcdd84cd5d68c713a7608a8a363632042c4c6b0c30e96871808c0030108e0b309d0899ae3388e93e1fd3919381a463e328c2edc196552319f6c2395711c77469406b1b6585b0da61e2c01409d1e2c0c05288085c10006b00780e1d6fc277d38800f3ef86c1f3a91ad6470b5c5d5d6a88b914f0c231f3adad99a7233b40f3648911d5b04d4d9b1417878ec0f418cfc60c4c8f436d2dddd5bc3b08de338467114154fb891ca388e96c5d55823560601405804803a405819993b33bd83e8446dadb596da2d08e5482e54684a41d818052cc0c608218465404c0318d080064cef0674225b2a954aa5122d6d32148b2b565456ab55935cb88d67a691803a44d8979ba7031c605f1e10e501b608d47fd288228c30c2671b417b8ba15226655256c408cf4eebca18656cad56abd56ab54ea7d309880a3eb8d3e934e1903842e89c6a8a418925226ca922c01a017510602b1040d89a8023315fef0cffc9208e041184cf0ea226c0ba941da12308230ab0b20eecff2dc0facd12c84891b99a4fb07cb743a66aabdd0d89d30399b3f3f2fd0d6983f2a019cdf5f382c564b456abd56ab55ab5e5535b75015601a0ce022c8d1042581a0630c036806688060c3184cf1ea213d95a6bad35ef5f6baa0ca71ad4ce46b79d1819449f910f9dc184c40e01ea20b1418820c206718003ec03825c18fe93453ca088227c76119da834eaa28e7ceac8e7c789e62ea1d5256667a3d62586743ab16a0cb608eb821110b046803a10b02e1c71844dc2bd0b4824410289e98d84b5d65a4b6d10ea2ea8252a15861212769493b019d449c28e9488c06889082cb1c4f45ea213d952a9542ac59468cc388e63142a9ed491ca388e4d72e1288b67a69bb04c803a4dd8979ba90ab0bf1225f6e52e5103fb7f4bac045e98488009139fcd24a6a909068375bba069d0e081b160309825551af3d2ea55af7ad516682cfa8ad5aa75658c32625aad56abd56a4938384b849c43d68460950e48e48c6c128944e2e1e1e1e1e1e1b1d65a6b2dc7711cc771b5d65a6b35994c2693c93469ddb896c1ada405bb7cdf78f586ec4f997e8b0a492412894422f1f0f0f0f0f0f0586badb596e3388ee3b85a6badb51691b2d3e9743a9d3e25a6232c04409d2392244122c7f09f4c22279184cf4e0289ce9d4427d14ab4121d818e402fd14c50269898de4c30e1895a26032cdfd190a9918f6f7ec5c7f032a4cd08e63fb4104669b491cf4c9d4e231f6e091b015067093bc3041376a68926ac9299254a962cf1d94b3a51e9070c27184e3545607029638c2b2d2aad56ab46cc2d35a7132b069304ec12504702d605264cac0b13988075c2851be43ff984134f3ce1b39fe844fde3743a9d7e90b299227336e598429870948a50a1293d6151504461a10075a2b0282928806a4281264da6779352a9542a95624a2ec498482f2edc388e4d72e1e182f41451766eae3e324f5e5e625e603098bba069d080b160309825c5702fecf8e8a38f72268a53e14f381fa98c740e6a044a87db986854a8f49576411185144d7a6c9f66ad5ab5d65a6b5dad56ab954baf7a9cb01300759cb0dc134f580e8a2840228d5f9ebb34ff4929a290420a9f2d4527327150d852146f607f29a4a000056ce9369103fb7f4d6ce94ee16af4d09e9ee9ddd3e3891ce62c9f82e5fb15327552c99e43e2d097df469039dbcb6f3aa4cd8eaf6a412f584c06340b61a7992a723a7153d826a0ce14f6859e1efb821327b6c717eecc931efb493f79d2899ae3388e0bf2fe5c100e06dcab202e3b1b8d31d1ede561108b5089a131a1a8a0781e755db082fb817b5c842b2265e5f2c28a3371eff23206bdf44a4c8b4aabd56a971712b732ad562c6ea6db0a50a72bf0c66a15d2ae08e5c08ec5e8ca48692c5a4a4b9112136342c5cc66732667e4f02904973be1e066acd96c6639120f1517acb5d65a3bb3a339ce718e3c7746995470773e318db3c4c3d566a3d9f07ae6f54f8ba0cd6812740cb7ec45691cc7711cc78de3388ee3d8b08635ac61ab7e02ea3415d604058a3545e92a486fba2f58d155b4156d85159da84d51aa9851b0c28a0a5480ae5634ca6ad2ae987260411b8bc6028bc6c213cdd9acd990a922b44520715e5e7e9b2173625e7e9340dad096bd60415df85d189e4eff28544daf562b2933f50ad4e92bec080b2cec488a14db16e07e7465b2680b74169d45169dc89a4c269309f5fe2694c905891b860a613c34e6c5a55f62482eac562b96cb0b59803adbcdb58d2d369f9e0212e91d2e7a4a73d15c7021c5b432ad569d46c3787e09859968a6e7b9942667e888b9d4082f97cee14263d16896c4bd4934c9b8b878dee6b9d0166d792d97b6e44c194ec7e0b9f48aa9d5c229e1f0740ee736f565ee8e68e3b0b32becccceae98c26a5acfd146689aa6c3513e4e997ed30a66adb5d6da71f4d1471f7df49102eab4056c6741e5bfcec2b616bd0548a4473ebd45fbb48f4f27b2ad05a56d51a3f8f84c99e2c38505b8a0b52e281d5ed0f6a2bdf0a2bdf04494d657b0fca622535da39038a4972f85cc7179f94da4cd4bb37aec959dcd66b3d96c35530db3ab553717a04ecccd360a5ec47cd160c4dced3fd96134181d4687e1b33b8c4e54eaee6e8ef60e94b13ea6f5555ff5f572ab0a2a0aea19af9725b9703b228c0acfc8faa475eb34ba61ef0d834119ebc7dc2574ec100693336a842e20dd100d1e18ccc2618560b2332947a08c8ec6388e9ee78d33e56848997619e0769937b6ae8ce1303943229148241289878787878787671cc7711c478739cc615c7461a3f0850df2028c2f6ce96670150618050c5bbad9b240228dad1c8e6a16a8636ff6aa60699635bdbd315da5adb4159fdd563a51e96d7dd536eaacbe51615505f595654dce81e51321b1c4e15ebe4ae6f0bc7c1da40d89ca4cc6a46c1cc771f4b161a586d9d955b8aed255b64abb4a57f14476266754d35a6a6db576b39683e2f2fe7674793bbe84a4170a89faad8b98af4c4dcbb53339e34fba96e75a21340d1c72e6a5dc23d71b254ee9fdbd271287e7fd3d2a3a877b7f2f8adb98fe45cc3263f6c6d3c788b93b0265743bc671f4341ce6b099723b9e3890bb21677ad034fd269f4d19afe1feea41241289442291c26055a1c2a272810b882146152bb4adb495e9dd56da8a27f2c6be801855aa9cac58c1000632d0a2ddead6f4ee56b73c9137ca197f89c3e13c63f9a66564aaa9bc2cf1bcfc909536f5592de5c88b0e9b32de0e2b5dc7472e94960e7f6e4b97c3df0ca268a8948cb74549ef149a19000000006317000030140c872341968759928b3d14800d62a2625852348d08e5990ca378ce18430c0000040000000084a4a6013e5748e3ef21ffa97d790fe7d0a098f4240bbfae98874ba1dbc54c8a14f19f38b0a30c2c0a70e989a52230d72402343d3e4738b7f34880abafce17772c538f596c0cd37df18a13d6c997863111efb931b034039eb8b424102e377214f12729520d7ab62816fe9132aca294f17f7fb5f28dd75bef59f4dc34e78f9687cce76f7b89aec73dbbd7e1b0cfff1932240058a910b3800062fc411403162000ac19221906425d1c1c4720225d88ee150dc6d528a004303f786c03c1b8faa8e378f131728c04ebf236d55f1f56b42c48a8f5770f4ec99f89a0bf683ce7059bace8ae792d867ab55a73ba9d39fc7cd6728b461f344f4f3c8270de7015effe02b27221971e604349cbbf9b8c439a3f24de04ae0ec166f6ee0d6cdfb6b6e9eb201808fe3dcab46ff8d63f37e2a4195441761715b4338e28a66749301f8aa03d11c775d530c4052372292ff08c759922f444cbfdb9f86144607c72f1839e9bb9752b0589d2d8d99a9c7a58efc9e39a66bcc9282f57d224234204c9e5ceb864434cc4aff9724aef263365ff9bba67833eeb0f117a73962e035ed6136f0cce5daa41148a23b15fe72e4584808516246767efa002c520caafa037a2538762877351246412c5ae6e12cac4df48e1b4a0defab66def68940a1caf4fc74069c89e48df0e198f28edec0d0f359338bd18758a3ea2bd8f8f5d7ba41945e800fefc49cdb53298b1168d8a690a50fa9c0ee99b05e13135043ada866e181eca345aa24a2d03431f4d4333661b5e36840075d079a097a8180fb723768373c00a8783b10c936ce99b98c9b7929753d2bbbf47ccd4c346be0a7b82ca900e307cb496d94f54e284898259f916775f33cad8dec37cc3051a028a4f996fedd97530ce68cff0f0f43f37909198d849d98acc486d5e8a319b6f2a5261aa541c81071f8a588f06294b608ab387c4c0889adebc9a25491b9d17c0ff5a95178fe92de6d0fc3b42f354a6b713d611394e2273620773c37ba713cc37167e1875ec426f597353f3b4207dbe81a499eaf06ad656fe64c37d86e94f1bd41c893b0369f51841e758466943add64760e4e76e33114cb7b8822a0303907602e43d1b4bd15fd4f212caa4626149cac88b5bef5615951f418465ba79fd73b902c6eaba1912bbf491bf2a688429dd729073726a6a1e72976ec7ab541184d744422f259cb0525391ad97a0936a456ef755291d7c707d197f729d4f701ae262efc4748b85485d1abab79d46ef129460840208984d0a4915716bc04a6ec9031c775bfa1373ae6f00986da8f6a4eee4e31d28b99200e1d4a9c1e49291207f946e30002170287ff8832b0351e59206955349852a3a9a325725f7bbfa04cf89c10101ed5060e8d424dc858d39c1e0e09826793802278e816ac57f87eb677f4a1bf61fa260424aebd28a31891285349e0c2e9b45b947a7e8d2514c3a5129efa8d381ba7d305209c7bf2fd4eac5bda72c3ee169d64b20a27b0aebcee1227e930d141a4f6f1f75db8bae6f1ba289235a644fb3954f44c56fe9dae9af5e15d940e4576c90a0a002f47a374e0eb53243213946afb5f8ca11e321634fc3a3a714c89304d09cd22b7ac97d1dbf2173729446be507bd7a4a7a374f1cb43ea512f1ef44acace9c8ed2d6b87848c9879fd4ba76e34b9c71ed4c5cd850d57e24e2191fb7ef5c89771ff8608a3eed0cb0239244e2cd843f47ba39d6746ca2310592ef4b956395140f1ddb92e69822c2f551ae787593ea304ec28e5209314e075558d5dd81bad91e8ed774785a9c0f882379b8fec3c5c3ec3bc7a4b99f239284a89fca287f8e6e109eddbcc40404d090bb48546ba50bb98d35e066b39fd387ec694fe1661f0402b9f0cb6f76e8ec2137fd092fb03c3d5f1878a84d8ca3b6e2cd2cecfb43fc8a0a14c0c3f1cddccb2360e5c047b1f719d7d601e67049cd6ec9468299912ef77dd01d9d49b35e8d05d6cb8e3bd48384d03c952ffb8449448e5344e66587c48ed164efa66872f656f6748e47542d0ccd3bba8728259b20b88e2af08be61ddc97ead64cb0a61fe0be161c8192eb95de1d57c60226fa39e32855391ca07d79b4dd517655fcc84bb080565f6593f89c10010a86e55436bab0d4c4f9c3e41b3ec869482898bdb31dd6270df79e8075d90c0385bf00901f2004e780190af15e80546c4fcfcd472f3b8e51b8c4c4b7ec9411ecb4a9ba0d97cd8d3cca443b60a59860074ecb00ec124ccd441d78051bedc4e791e4a510880d676d84274d3836fc322192a8d8d9b74bce6c14f4f1b45ddb73724e5cfea8b19b603928531cc89044c236516de5bc7fa9130df381af71fd337f691e5a55bb29536c73157ba8713e091ae546c2ce6de22acdc6427aabcc795931e39fd87a9a815ad5f6297c6f48d8e8598169290366ae92a0250f8aa1e258a00ee657cbe52d76bf60ce2a70d99ec97628eaa133c2a99d8f7031b00e00371f755848156766f6ecd135e76b122ce9ed20ffa175497368bb9337c4ce9dd4ea0edc0af6b4f1a2d8449f13e24ece237c8e1284648a9c051d62a70332872efa78549543d48f431745e2e0820691ab83d760317520f2833294dea175a9224bce408857fe36a5dcec6febb45a3a2be3605b31f4bbc7951b6c709e54150a8e19c6074eb91b7cd124f8fe73198f7e65c74f46fa71085946358c3458cb684fcce251d2ee32fcbb283c5f6afeb97b746309426b3a489c9d9e43259481985f825e84ae1eca1824214b2d42573a9253fb71ba81570e8ed7f337b27d8c1ce669cc111981f26424729491cbb58c228719f51c280e6fead8b5186722c542e1694bb1931eb61a5265afdad36d908d333093c908fbe90f68ac210820f66cb72976e5a1a358c4c2de4025d87bcbcaf4d7134498189b6a9dfa1c1ded44af272868e8b6dab4c37629cb168ab54b4c4d27ad676a71e562393f1177da15a180ade8e2a58569773300619105b7392c4e61be00902a5729e1dad2846dcd1806d224d9d496e6a3b9d5d2620d65d285a8e39b6557b3b618256b0be12fb7e3d6ac636c96cdae3348c0e1bd350bf7c28ffa2e35ebdb6635139dc17de2450a0945a0d5a0279158b968595f6a745172dc9836eba4da45e08a8dd15009215076fa68cdc4b8d435d31d36055346c83eb1b4e22fb28a3e124f451df2788de1f20e614c7888146f6b9578baf8b16cbd34aa77f1bfe807da1295c7ae596d7d37500aa91ec8c20ee49cb1ccccc0b0544cf2f2e10874b143da9684d4ad09b715e7284c8262e4829ca4942d956bdec2536f5ddb33ed7c39589e3fd89cdc2caaeac5c512821c5606c4e271fd27d9ddbe344fd9f219630b98272b6c8eeb613d6d14426755b441f627d1dfbe7f846e3af978fdede4c166ec4ffd9d1a32c519c75cd130f8609b68ab70c0bdcce1b992e2165b852770bc4cf669eaf245c0274a548fa0c7fbc6429ecc7de2913fbb35279be78af7655b26f4f2c91c7952404ea96b445c7c8ea4c6825ebd7e9ca4862f3fd7cc61830d6119af91106eae4102d98bfb25f99e3c380aa906ab04a22027c0c674512a588ab2f37b9106061c636e5a4e4607220cf5030380605fa9812a04cde1126f98fae36341e214c28669aea00f8add09c7c018b0f41b5390223a8009243f07c3c421c760756bf0081c48e95f72704d87ccd123c5fbb101231c33c64826762a05822886e2328c6f2e637d0f2aa1f4bb99ebb241539d9da87168260ff334dcccd17f9460ceacac3361539069c727aa8d823238ecd4ad39e0b8de69a245c82423a3ba85c869e4dfdd95ab1b5bb416a589e2f7803f0df89a5ea6e3228d7912b1d3572fa85fcd6ec064ad2a5ee97c5bba93c37bad6b64376199b4a7616f9e524fc38653c8aaa123a9ab123000dab54c8ef94e7c1a4bb0c00266f92037c51a979fb2b1384779202dcd8dae75b21099c1a714cc631f28eef97861a121bf65ccb07c2f55802196dce4aba386f5074496d5fcaa9094e5b45f161be1f33668dcf81cb882a5e090ec874a8d5f3935a03ea8d4808df4bd2befadb21cb86aed0c2e2ade27606925abfddaab89f2180b92b794aba653723d4bae937faf105aae2b71fa102b5927463859f3b5ce4a91a6165a82c5222b41a79d3a200fe133ab9d0d4b9330f29107a87b0fa8c27347b73f152cbbf7fb6703b8342d1b23e850ed8f8a229e382a5dbdee6bd21e0c8e63188bc78f78bf050d9b82bc3c362d308842fb48e6e7110373caf88446f986cbd032042b35bb272583710881dd0093fc9bbf1bf0be6cda1581bd71a4673552ea0d14d90e0df924cbacd0082b30103492cc23cc7933698d1b4c006aec8acb0639c9e28362f0e4d11a3cebbf3f81c045032f561768070d18a4f55d08a48a3c0028ad0b6c220fa7c72680d559ce06a6c8853e2dadbbc04b9c0689839df46b90b32d16b8f6538226067088b6f4bd34bd322499f7213e3d2f1f13ad0aa3897bd31516d061b86465402093ba30777931a6f3b6f84478d25343890ba3db924fc0437cab2363e2682c586d9b092d8563c4dcab0181347682ccb94b1f8a547c1a0b5eda264fc231b242a548b48f62ffeca6c08c13cca81e0772c8c11ce5a07353602e4af766d29713b3cc025bd68839448f972b9f38d6183d50be4e5b025ce32c3055c939049e59d06c722ccb762f4d3bf3e107c51e110e8b4b685bb1ca0213fc8908ca8fd880123153353be834ecaa2bec3c67300b971ac3e6aa8082a8c0194739ba3a0330106a81465deef72fcb5e2aeaf82e13f82fe02049ff0818141e507857ffae26996fb1f3894d01a3d4d6585fda6fc55ae7ef821c1c3c8831d6689438c398262bdda5d9118262f17cb18399ecb241b188399c3979f2f8c3f34657cd02460e1ac2a4087e745e3620539b7050bdb0b7ebacbe03e3f2fc582ceffd253323b624cab93adaa9b9e84035126f4ab51dc6a690e38f3c5f7121f43192a431a12539229f42a8a637957f0720e1c24d579164ad5cf47cfbf763ab9811fa7540c7a1a7ab1e5340352f5e376180a9ff81c5f3d8d6ec63ba5d5b7070875054612acd8a8e6f6fb2546712a7a7f6335946370745773fabd7e05186cd0c92471eab33179b6ece7e907aecae267504fa7cd6c2c8c34f99b9a8ccd46b2b61571ff948f293a65c37bdb883c3b9206f2ea99c11816bee6caae1850cc22668da559dd329d1a3ffab92a073b092a0dba6234197588b04dd1751d95d0791123717c8453b1789606316953375ac4db03a7e0ca1e4be3961547608002dfacb1fab203e0ea4cd2ba43962bc4bb1f22ce2a5d6a760eafaa90d1e41c0f2ee52744822ef50c99d3b20b881e0989a734633e004f80c16d247221f120e4eb5668fc4810a7ea761b6112d18c5267a53318be41898665e77615cd69545c9e50974e137a739cb5c39a7ad1bea82aa83ab812c6d3d4cc18e4048b75fbd8b43faec1150bab354dd9b5bac92af3eb6e39d5d6cec66875465c52e41e67ac084273715eb40fa555bc3d5db6b8d02d1c8f385d472ebce99e6784e3dc12da6ca753feef0cae55ddfc37bf5b3e60a8f236d54dd5e05e25285464ba94e9706a3c844a25f4b683ea04d78067d342ae481b7e9e2cb58e71dd3117adf73507a0f0ca6deec23b6de952e5655a4aad059c3791c483459eb2c4d98417a4cee7ca9e91eb6090ca445ebe92ef025105461975e44f4d14af58ad608fa10fbf88267a24d6c31204964a28fe07fffb96215a94413b1d2be13d2de296e3caf340d2b9ae5466c4049de8c4c0ca1db8c1c7132ded32cd006beee3e76bb0dae00f584ecb1b3cf135a62102f077b1ff144d58ec67ad4836d17a925add54901af7b54e703b6c6ea54d349b53c894c06f9f0ef6ff3480376d20715c62353c39d38a4c5e93ecbf3805808a3084c7f09bff54a86aed7ec13c0fa138aa9243b5e4201ca04700c3594245d9dbffcb6016d44493802998f16a8ac7fca140a21c55558b96bbc7056915498b5d106de2f73b111d7814d9d953ae8c29980422121e4020c7fa701e002b20af0d1af152c75f24bb18ec00b0c4807848934482b38024b9d6b051c43ec60fc6f6707ffd0026520f683c4624b5be60b5c50f9f31cc83ab105a35ba35f0233101c637b666816862551324b065d401f711467f39c2994df639735d8293498e3dc514e9cf145c1855c46c651108a11ac7c08c094d51e3a7c7cb9e141c45de328943461413c11e8d40619c81b8a98830051a1e1f7927c913a7a02039a64c51bd30ec20fc37ee28497003e0549803a9bee002924f13841891b43683cefbeaf1ae6004a3522995a0cd0cfe9a849b11ff1ff23fbfd53f5a3715f363a2f66891429c309ca917f6d729b022c59e3af8484c71d7000346052813dc72d2a538f18c82ab421fba255f2883a61ac59209f7815eff88bb0c92b4dfbae43164c160dbd33b25d4b939808cba8c42470b989187b12e4bbd1d4006edac9482ef39a2086404733870d124dfb8dd3d84407810e1749219bb6da6f93e22444a054c6581530f03cbfcceafae136def18863fe4e12a9bcd1cfc8360d91ac6365e8229c1dd97f689b416520461f94a48e097828e3d2def9bebfa5e594db796a5d82953d905945f98690e1ca452a5628ca3c0969145a5fdd2cb2ff997044c8ffd7c063d13faeed0223077bfcd74cebd02b32e023fb4f309c891b8f3892b8731bbee4c1a5e14199d05807e6196dfb4c11369a84143979ff76eb0e1359d7c09fe0f6c350bf81b3db0de0e8186e98a864caa2a080bb2e3f862655b82b38ff5fd252cff2c6ee38820bd352d1bc3c8cce48a17507bbbc0b9eba6fa669d586e7d1210af9aa2475dbbebd827a47c787457f419f3620a40116688486f2ac6c3f323c375eb6e10aeba9a8bd269781b7ca3160b10b8abc8f06b632acc3b6cf2f440bbd11a491fcda0eda478b19ffc24204a2a49794d8d15d3ad2fa0d54f39093909a0428e858359ad1e22191fae4e85c44413c370c6da26c42eeeaa31987185cd4217174f01952a40ec67e09782071e952c724852c3490b8747a0796680611feddb8d76dc5c78dd4c3104cba0a28587e96b52aea7879e4591fd1ccaa358ff1f122bcd18f94c9cec6437fd0bec05a7c44292a647e2b5dc1b5d48e0d60a5a5902ec264a76e9c8ead8441df03a60634d4f04abce3e27a7cb5a3951bc39b19ed75c60a20879f244ae942f1797f8dba554fd785f4c96bcfc0966b5ad407593e2331a70f018d8e5c144316f59c743126e4a807dc5134f8021d0e53661882c0dabd1d11435d7d6982e77d199efb662d3676825cc022f45c67a9805185c3106b35baa8548514c090ce8aac37a8702c0c3ba4ee2086fc2c12bd74eee8ffdea0118c971f1bd49902224d4ff728973c1a243fb3e7a0c2fad94312fb3d65d7c7df7b537cdcd02930c52f698c381e4e31390b753bd3c18e1262cd4a6b62fe12c1fbb5e5a303a5c7fc4c98c07a2287caff64617a6c52dc85b725adb0bf2b07535b30d688553838aa1dea983c9a831ab51b54e6dbe93aebb0bc89b8b0f968f7c9ce5407fa5edc2538491b5717c4450aa067cc7658b9e1ba344fc24b66f9ff8f65942daa46404242fcc4fc50c24df30ff272f411cda854c3902b7e9651cbd7bf415bb71643056d1b28dae48da651d5b272057c62b3142a9780476b60948080cb78ef5949b08aed4a77194abbde580a821193fd796c139f3362f11a66b5446ad3ee74f892e5888e12582acd6f0052cb141ac5d82c5394c9ffe218f9300e6e199e521a2523dc54d2d38644165c4c6dc0e772c2fd88969656cc7cb86529036a55a52f98bfbcf6df03b8f32687235c4bbfecf19f77c0f0e6e07337e45d41423e1924668c4360c034b778fc620f919124ab938e3da412ef2c962c390793fd49325084f364be97147fa1f3f2d072866652fe56d88a098a9de07bb8a7da55142df1ee72960763c2d34e2aeafe1e02cb6b8a9b669f4758327494578e65a0f9e29307e6c9310baa6ebb635b334bc4bbbe05e4f606e833bf654211e72ff1d6f6cc034787ebfd15f06a601c04d36b610a4f900c0ba172e01eaf64b6f9386c41cc7e4d363294f0c25acbedc1496c898e93dfd991bd2cd89a034ba2b80c91a795b5628d90a6ff1067f3a62193eaac275c9621a21995631ddd54026042a002804ff942abe40edd68e3e8c7c2365d4142805ab25d8c40dfd203f74a7f0e31010ed095821e974bb34ee69332b61e2eab885059e502cc5bf2208f503f6907e375de437af821ec9ba04f62afadc44c421ca9ad819d5edbbe6d2dad8197090da9710bb03a31640a9bf1083a010b423000d6ad3c69fc1e401fe5b2a1977fed677e2138e38750fb867bde60fa6ed8e91f02050fb784839135611c6542fcd29b2c45755ebc00ca15de41a139fd86d59f6cfd2ca7c0782604bb2234a0add2cf5f7597c6ee55dac11ecf20385870daa54e7105105bf0615ceeda61d0a013124f8102ceef8718fb3627151a267d1ecd7e3e9abdbb9e572634e4f783b934a509a4ea5c4e97623329d853032da85a4b18a0f881ffb31d8dcb7d0756eecf790a1cdd1fef38c874681df4c1187bd40ab83a0e0087f8d689bccf73c58a5905bfb08b27fc21567217d87cff92c17fccffb3458eee26eb18d0c4c64d6b2d8c1dcb2f2cd50c59c39dfed82c9d46513342c4445798101ce46b4241d490d8001b047ba61262aa9b3b959a63f53a2a4dd35327960eb44c37504fd7441edf2c30b09f1c619318e3c5460fe01253b0e556119b3e00ca302967eba989054980db45ef4b7a75286fbba9dea98cf859571d985975f17b75bae42b8f527d04b32bda26fb467009843bd355d37f3a7c8d7df89be27b89032fa8fb191d625e45fb5ea36814b80e6bed01e209110c2ea6931cbf98b9d8a8a60a15b08f962ae6428d2ad2e1b0144a6497448013073e09e225ea028e9c8a8a04d48be9d660633e1e47634e75b8c20a7fba865961f3d7bb9bc7bcdc4c863bc8e42ff0a7ebb21444d232b5d70e2b0122524455114ac379b0208bdcbe527665390944346054d5e4e16fa77c9654be894e058e476a47014c4198de4f22035cfa5584ca16e0f9c0b22217cb063ed76829c0fc462a1ca14d5d1e2ac4527de486aab43cd2e935a044633ae8e99d96912c3afd9ce560e606c42002072b270a3fc3df75e09ac6a19390752e4a2de790e88588377bbafe952f11c895feee6f42ba9cc400d3d1e470d10c0633d3e06dbb093516d4aad18ec1fd9387e44665da1b7a09196b585aa51e8de313a948fc830b0f538660bb9a5456f0b59721263c40f7e020cdeee2ba25c9b548287b29be1a81eb1072869520cd4742a9c967e99a09ede722ca3007712af06707f0e28ff3b88a9bab8e15ce76530540fd818a711048e0ae1b7f7680e577650b747cbb954ba7eee9acadbc40b53666b5d07878da8c679b0a971d3ee9bc5d24effca362902bdc7287d9c4e9fba7e3901e1dcbc92e720498fc7c89e25fe0e3996f26faf49d9da3979c121694e51218f30c434f649340e7058f7dd618d99d2aa95f2f2a9f4f41e5d6a75271976d767e84905d44c5bce8dfec220f94bb048e757cc0f1840b038ea1a40908729340ff2657465091f1d7cd0785a2d586824f4489faf06d683fca49c96eb945f24e884ae1b4a5e8504c01c453a2f7a7dc34540134aace512ac43615ed6215f4b84aac5fe55ac62a4eb36a599a382098052d6d2c212b350c6d95d86ad99474fca8c8df9509ff588880e9c01a32caee06974822d04b7fb32af918a3286a408151f4c66dbaf6f01c7c49f1909aa2d363363a23ba0c25ef838f8973d5a436f1957223736beb20c2d8708324ed5cd0dd5cfb5f14d188ecad4101c5d9fe463d499328ba092f5535c0f3475d6ad5a100ef1d115ce4ee54cb5a53710756449299fd34ff937247bfbfb6f4fc7dce7023abb87ee967ccdb8d04d5d3fe78cec098f20eb1457a68ab89eaaf130bbecf7b2c66ca44f1394d0085d41305eb51c63b969c653cfa0452f0160840f7637781bcee5277966ac6859e50f7569964096033529d58494065aa06b9524065a80261a580cb540d62a5800a86bf0e1766b1da20d53b9e55be90fb3713723bbdfd8e1df083853888946433a4469a3be8eec6c51a7e6b09c303534ac078b02d56d85f43f0b08beb817eaf14858a9dde7d1a3dff62710e0bb60d3182735ce3595197fb24133fe0b0d1274c8f4c90dd6d811542a00e50e68ccd073d0eef9de15b0221b470f48231e279e3bb13e509b9096a118789c231908cebbf22640ee258c5a327be5fa914428540729e1d7cf4a5ce2cfeb1a8e04995c1409afd61e4ae717fbf323030cbfbd5cb402bb3ae9c171352fc32b4313b4438395ca4a51d3277e3c4ad5b5eead107b3971eb679ac6fe101504f0e5815b8f84b7935983e1fc51f6437b6db8e39fa15967a9c1bdd47026daa614ad2a2e0ce63b27895afb88e4876941a749816fc1963f4ad38ae8470dda20a6ff36641c1b7c551268ba39f68064a962218b27a17440bf77c0b648af572a4b15c91cb974b723c5ed8c66e256f56390abe475c2bc657e43aff12a4ef47d9f600a98dd0d02601901a388be8168c20037171ca45823e67cd336f463f9b108594fac991906d787ca50460c1455b6d063c729a8687432a4dc9aa4e0ccd31c3b0d001fc36d59b655b9a91fac00de3b5c996c1b9a1c4ce779c991e5dda65c0298122b1cdcf107b1efcc3a12badf54e161f25513666c2f3d8e51db38afb89e1c92b1e52a769e9e7dcb1bb3b534c674636392280585914d8880070dc3015002b1241ec288c9c2f8008b03d0a200bb8989841b0da7f535b96a9e51b90104a2ee0443d880be1a05d4462398c9ff3382812178e9c0024b285dbce352e0f8ef5500fb6313199cf87e39792bb13112422fdcfa94669f888520d8a44a26223ead0b620eee475c858b19a2a21740c4716d1b4c9964566084501844df9516496b6095b1a2e41b3a5d2730ac2c595558f8c5c49e3d845ed335e14515a360c8cb9f071e0c412752435aeef07af359f1e634b5cad11a96264644bdb417c8c0479b5f43c9e2d3db45d4154bea99f6de66c3b93a308e61e1e210ce7dfff82fd12e1bb3d9d78fd9ad83b6147f1028e029e6491ce9c7d42941206d28758d04a8bc7ce340b4ef5329ab24a5e5e58d0c603b952753bf713c7662cb045ce19c934c99e5e88a420b77ae9e44c188c9458969e2a98587946b161adc66c104fdc62c381ebc5868143f58c95aa563231a3dd031c1342273e8023e7c8d78c1b3062199eb18115410059302144bb452c6f71d7c8648655e60af1f3cfd7e78f36cfbf0d3f7f907bfed9f5fdc3d4648f518cc4d14183d50c895a4d4fe589e8669eaa2a08016d882f8335cda62c387d4ef3f8a6c8c20d839300d149b755b190505240fbe6f4e64c594f6f9a258c57e7578a4256c7290a356f2a0a815564b8c819b5a290fc87e5b507666fe18c10e5f7a78e9b971e6f1cfb030fd00d3a407e65371e88bbe30ca180e53f0196d67f3abc3ab61aeb70d8c16c15d8a9c09725ba81c8cffca3d4edc8a70a6dab91985dfd389fcfa639063cb315b4138f52260d47421169449b4b8e8142fa26c91334362e54526c8d8eadf0e8c3de26beccab90d53126d7e8ad9972e0fcff0dacbef1265613a342ea80a3517144bb42c25aba82a3c84c9ba844200145fd060f35da4f533c595f05531c60c8312e8ad7e632c755d7c48ed437922b1c3aa8b06e76464ae3858e666e122febf4b7f088621533abe62d4104c2a60249d6116179bf455d4296103fc75eb8f2cc6240040e32259492c6d684d292e7e1e97345e15187ea9497a492008498ab16fcec199867da7507c7d8de0a94f49fc8603aac98f8f814b9ea549239b6d67be20476acf784ea615f3316ddaa33291afa1e8ba26d510c9b6c3b2a1c4562c2c3dad03c91bc092adee8c5e765ae87dcdef562e119957a541d9c95c40b6d1b64de88e0ea0c980c82af2d8c6af2e9e484a21b85ee691d7ee33bfe39ec17f9f05e8c05cb1304f1a7dc03502e13ce872218928ef4b89c47462ed37435d20ba643a9eea1f29267e0c005662ae077efe80bdb4e9440df14e5d57cb9fc2857f74f402707b731e78a41af5dc759e54fee593946f5bd4f9c3c19f3000006d4c900274792e5f8cdbe686a0738f35d46d3d333ce0de71c633dd8ece20cf8ea4b2ca9690e61c85bbdb43a3c1834997e532361a0e0f7796a07035df63e1f784e362f547e140a18f0d7f57ce2fc3696f2978af3cf37970f599c7f88babc4980e667ee0924e4451d4701f29a1725d48be637711c40e6290668d9cb1e271302cb1ef731c48675fca1819b7e41b1a4904944dbb5c2919be617732d0df55b87f15c101f05ecb05c93f934319e8d85b4c6e187dbe5d8398157e7128e32282839259c914292bc66f05930130fbea4e31b5997381f000a54d7d8348e42dd30206ca74c2e3e6bfb5c095c9287c0d1b25da88cdd22d44bd150794d08680904a25a39381e74db3f5a678ffb6d2d1b19299cb94b0db017d27ca20da562951e5a61ccab5db9fcf8c4b2c7b78fecdfc606e6c2537dba4a1ab401010847382737be75f8077a3a1bc190a94c4c4926db055da930148c718ede4107e28fdc8f13b51c6810bffe7d9444f05d754b6f99402011fefd4c686e3f79a5d2c1a2536effa65e1a043af24fed9ba26f45ada58b183ca3969e08a0fea766ecd923265004cef6a282162cfb8416b036ba105e7f6e387c8c59ee4610ff4bd08fb1a4e209e441f3972dad01f83b25bf581058cd2fa00b2361fb296aad014a492867c57a8609fc452192b0c42ed20fc3600272de43df112d8b6382fc627c7b2758997b9b78602b02f816c9b5c9660d62c5abfa2f6cf1c0bfcb1678661edd0e4d719ebd95b0aae35db49f66732b79555d9d0ffe4d977394946dd74a95cd44b998c19c165fd0a9ef48cb3f8341afa045504960bb520741d84f83cd7e28a9f6db05a99168623d645214f55ad4bc495f41d478135055ae64b282da18e94b0f3d7e4cbc763ba9d72839d656391b2d32a47f94ab2c705348782db24a36f3526defb293ead7fc5d3aec1998c8e1d919d1bcd81f6f885324c0577f31a322143f458e2878ce74db6589e89cc12e4eaf585be064b687d07ca9004de168416888bf21452f14d4d896c751b9f2a58a26e52e933736901a686c100e1e76623ea951b15aeeaa0ebca6b72ce879121fa0327ec6b2ddd135b6e247a9ce6e3742b9ea05a211fd2984ffbb50988f2db2909099a50b7dbe5b8917e0c21bcbaf080924b8e8f122a92f0415465633bd31a3eac327f7716e758e032ec8c51823b6fc11b0ce4a937f1dd40be007ab772d0540496aecaaefb2d1244aa5f84eb2e44441336b17da2908885cd6881e3d6d0c4997b241024570ef9f44d4c3ca2c3f207fba3796168c5e79e9063a896452cfae3236091f01c3128defbb96b885616a2a6b908f798e96674b4e88c967018788f667f86e586046885fda8dccacc72bc5a167a6479567c2fd6e50fbb9a5b97a52f4f38b888833b5faf9a07f74c6766bfc6c660c8668e2382c984fd93d1dde92fd3495b35fb78536cad269ea81dc687b0b1df20be0dc35e1a7ce69f8a73ea08c9542cf1486fd748772271d080a7c178f512a17d7c07da4c4c965db4f9f7ca6c9a655b48a6045f541dc64089c0d87b8561396510986e060eeff0c0dda4854d5456e165fd37548586bb1aa52b79707ba0e75ff25387db416b195998c9c12d677895ccd4a3b25008bc9c46248ead735413a95bc055c4899f4fd615958eefcac1636d117fca18cd2e2356fda25e65124a4909b3414f0e7a616802cc7ac616834083279fdb01a1de3140f3709e2145976b12313411cc76a66e75551ac68fda8fd119902b5f5a2894204a74b8512b47386af999c06342db8f03d7cac966ba5438442e442bf331c9d31327d458802a2624097a01850f4ea051ce52a4a5bb326372330535abb83a501d854563410045d04b948d1eb196961d1c9701de4850cd8dbb4cd78691b20b81bb06df4a7a833aeee9947ec5af4be80ddef4c3a528ec6c030e05d47985699aae88185610a40331c66576afd5532962a6f115e5bff46d0cfaed73cf9deb36241e9460a65037345a81e293831abc887c41066e49245643bd38e9f30a467d98915d78f0271f1d264c206f3d573a5bad46ed1e3040bef545c6b8e69b30ee8cd41379b309d8d34aa68509853eb91ac27f595cd3317a54ed2871e69dc4f786942b3254e652aa724cc58e2e17028f4964cdf0e9c1fe2b8792fae59d2287c87e041bd207d2a159e5dfa66cb931fb67c96fe372767d0b57b4489f7667f291e299ed1ca5053e00d6075393db02e1732add4cf7e1fc3fdd1e3686caf56c59dd36cbe04c44122e9cceec3cf95dc09dc8e10e80dcbb0d9d691eccaaa6ebcdd84ec6a8dd148c87ca9ddbfef9d76929ac78a9511b72bf83db2160c419f5a30bb111df9e25a3a561593a013791ac7a2ff4bf873f28ea4349a55271e0da556b8e959d2b3e4899356d70fb794a20fe90bbdced2b35f534dee2fb6d0eedbc786b1a2f647815ac00c34b71475780dfe31715a43e9e36983617313096c25a7e4d42ded24034e07ae4cf4e8575c1318e51c28d0042ed6e20362c5fe15749e3ef6f52c4962effc55955e2e0c4f745f15d82ac918cff0ad5c53313d9bd4318e7a88e5e7208addcca3ad2eae355a1435c9ec547db1d9d9f34eba1d17da195d86540de166d4a0bad55a8db2b0a69ae865eeb1f8218c71dc0cb9d2331cae3db79a9f6f7e5e1a44eed5b57ccc139e6dacb2a5d963115b7f582c16b3c856f1ca89856751cacc8baafee4ef509fdfdcfbb01bb7af00a262ee79765e5f2bf99f5b74a0dd38dd01ca9ca84b23f0e85a3d6647e056a772190dbc22cc386906a5dae01aee560b9d5be03a4b9ced6947e9ae7303457830332d8ca401c80f194d6ba474459a78388b9750a1645804db7fffb2d6314c42cdded5abf05e747bff4674c30a17e92aa77976ba7f5c894a69a98e36f47e4dec24b47a8de8462efe288546b6c29e4c7bd6a4ac7e46f657bd47e4b596598fc29191aa0defcd7575b0346ad25ef0d108e32bdd12f61158c943a923051df83e4189b771f0439958f5366299890f10c8acb3583ce4e69bae24448f4be871115d0dbab4bbc3d9a07175e477d39cc785524339caa16bedd09bd9acd0fec643328d7026a3ec90547904a5cd83e87f2aad0baebecd9e8cf2642307691bf305d36c90b7cbb1320e9162922209aebd0562df28f2f6b48ab31bcf8e2dc75d322b038161bb070a05e9082e142c47206fd17ab9496f464f9e046dcbb6e7f146443bd229f2c0675b84e02eadbc489c94e78bdc649059dadd6061d2c582e5c1601bca5f4a8911d41af9dad5276a1da36d83f75d247ba11ddb4207db8c3915d311558b96a1a841d3e778f50b010da34c46d954138c629d8a5c53b435d99ab5a650c64502af44f3139b6648c441bf439704e70c8bdac203a5644724983d845e6d1857c89c41b31c87b2644f024603252408670e56ff708deeeffcf3d89eb23a06a8d8c8bdc0d378539bb4b82d6ad1b1a28788951bbede2ce62f38778ebce9d6572dba84d45c089a507d23f43e6f3a2f8d2f7c8c0b6c71f48f9da6937eebed2f88cd77c0fd50b148ac00ecebb20f034addd4249bf6dbd7748284634aa6156561c85a3f0e3f3a5cd19e8e59b0884bbe8e0f2511424024d2c621114b176f31b491e9809bff5f84c858387747f0935cbcbb1cd5c1a22ab0622455d5dc693a8eb0d586459cc142f0c8d549c5c6e1390b7d3bfd47ee2d7bd5569525786a86080381f11cf6f07b18f9a7aef1e252eb9722a34f532e7a8227a10b98bb936c4f2550c26b8bf7b02517671632bd45a88d952aefce71c2128daeeeb239edce3fdd15d2dd26b1a055714717f19d4faf976d0469071d9d2299d0e2c341d4604d4eb5eb4f463aa6db04b4801afde8ce0e2cd32519f29a6c6c6fa258db64c657393af46b53c69a321bceb4345b7db1d9338c939fd24c06e964a54c72ac33a7ef2683b6c794c67772eff97293b961b4f2d6d025481ebceb7aec8e3861a8f2a2dd1a75996f244723b7853023747fe86c1b4ea1efefdcb5110a56b385353edf0238032aae42e8aad1143a3e1be789f8ff05bb642de755c5500cceeac15838340dca665a22593bc8f2c68ab2ccb0b4411a03143ab23f7f5008cd9010ecefa4cf466c18d4f2151eeda79d9c80acd3526f42a94c81be0ee869f6908b01efbe8e57c8d64801d2359cea7a5c5d3768e9985128f8fa65c7c3704293dc5ec7f2a9183604675090958bc0df958168f632102bcba10367385f812493bd4fee5054d14b7893e19912b942e25bfb736d77980395bb8461c0de191c6468e72e3950cfe6fef0c2c663d54cc000e96c4e065c99b8293a47e0a6961994b1642e676815aa9e8d893e19ba1bf5244dc36c4548b3e23d20838e631ef920ffd7bf59dc1709e2a1d17adfcf2d397b04ecd56bae13dda06bd9f06fb61599590ecd18539eca382ac68d8582b70fa4d429b4892265a1b1a6f306624229667af076b7e242f92703f76bd0b5171ad8b8f97210262f2ef4837cc242fd12a77809158b0912b70fc732498ed966a0a32d09714e019298cf2b1e71354d93614be8a591a76c9c26baac439c8b83b88001850e2c0874184a131471177c8e798decd8c2112137bb93edaddbc0543ce837767e7e3b201e14e5fe603a97a3ab9f2c2aa986334cabf957b1a1dc7274dc7692fb0ec99c356d0a56b76ea11a1a4a82ae1923d8e956daa9190f4b2197cf32f4729baf2bf144f3e4e1fc749792afe6dac7d5c6d165b8b027b8bb59f249b6029d953360b52926b68c857ad2b85c6deda9447d7ecb38d167986451094e0a8630e67d358e9302b0aff40c931dc22fb2c9f06d4c802e884fd188e7373d454af46d14e88cbebe7be34584de8cd101eeba00b8d722d5368b46f17174858e97c1d590af313e34ce677fa1a1aee4c36ebff10c79b141c76f20a1f28677db5c3e6f07dea625bd967462e675ad7df67244e294ea0476a5f1398d6c5492b272410308923589d369d1ded4b1e2c134ff7d57671fac7a2de1d594b341d54b420be4a767a8fb6ff1d5a80a7b1b43d78823fce75d9899d9eaa6da89b15e973bcf58fccadc56093b675ef9d8e9926d664bb64a7e3a210233b482985c3004645e7d4ea30a084a8111260bb70d362ca460864c7bd3055e43e0ff2277ba218ec09401593c83df535c7544508cffa392368286cf48cce6d295c482219f6c0272f174b10a368c1cc6c99d1800aafb529eb5bce29a2953d0257174cda87d4507929f1059c702344b91d9e88c9ddaafb4744ebd7898a225d240d38b12f485df026e6e27d0649213555210f4059d173c7a9ee76f310808bc11d91cc469d2c488bdf900974e8c7b69b781758c665614811f8f452cd3f51f0573992222f514a1a1afd38bcf78ab52d1f6ab138c30e0b7b58db3319df476d033745805c2a06c37b0601a03fdaab3bb026109c98db8ff43d2a3baebc0e3ace47622701e3c0e8f2958c02acf2c7c6be3c03d538238c73a671ffd9aa686cd0e7b076d3799877c97ebf140d6091c55a3363e6616dde35a34be6c6b4cc89989de1ed87f2a58936defc85b00b114d5d77761338d1884137322d3dfe79a98fb3e33faf304547a1d1180c26bd6d2b12d88b45687cd155deeb7d8bda9185d309450317754108807f838e51eded7a05e917bd8d18518952c930b1fb4e17e1beadaf416e95bd21a9ec3bea9514dd32293427f7a25da5439f693e043fea7f75c559bce5a5bf3f6491f45820c0c09a1eebf55f882ce46a4aea16ca77fc1e446fe04b24b9ea3f08d62fa65e9ecced2adeb26b633537d1df8bd998bd9f3908f29e8c2f1ef0d3689c976a401929c7319d8791e51c2d416fcae94b72892c913fa5651c65cc27b405f64cc588348a4390566fea042782c58534a24b8ff7fc48903207b5204b22515e5c3ad1ed3c29249788d36251331415802dca7de9a6455263904fbe2b842ad598e8a76d0df4e6bd2a7a0d6c8f8e2525996f27c2f3e91e2b581c0e0097eed2a7ef54fcaa360dabea9dcbde6a86aaa70ea0ef7aa8b7809aeeb2500d9511981157b861f6eb8736edcc7b9a9abb77d802692432fd462850ff4fc00f6c92dec68a58fcb9be3408c4bac422696231fa007457e63be6ea9719c0228a445ff842a969cb762bd3092feec47b2c05c56fb491b72cae1b46a9d2a796f6931563872d559de1662b006aa46ff85d448545159c5f7e76c35631059a2ccbcad1ec603f56d51f603337ed00d9408a626ee6d7b5c24e1955791a7ac8b66d59e5b2c8e2ba62559ba070ae3b3b4986f05aa7d569f485b1a08facb24b5345676cc9ca8cfd0a7fdd165680c9d41c3d0393a8ec6d130f4b14ff4635f4ebfb9ebce301d47e768181a43c3d0183a068da1f7852d870a07dc3144fe56c4b9fb340c8d8ea3f368383a43c7114d65a29b22ce839a9b49cb53e63bdc96079584b9e80328dcd4dbe74dfd1e16bd685a19807d63ad40d28d5c636bce0ca6dd9580252843815d76e7d5b08a9ce064d95e8355972d37c064835ab3d024479f2104908cf1e62e82c77135c288e7e9386f5a7e8f8ff07524c1b2c676589d884932c9afe5ec72aa85f715b707bd847f17f8015ce01b7400d6450104fa72580ae49535e1107f25a5ccb4bcc4c42c0ae3ef40e14f4575de5c81fdfb8e3916fe47901e147eea2681be5aaf0f3dbc14e38d04c06087f864561670d01de016dff420b9cd94621d97a54f1824aadf36136e99fe9852b84aae881800db92953752452637185ae7062be8bbb9d491de1ba611fe9da50e0907ccf204d1ae08c863507b0128535150be815fc6d1207e49043ec42f1cc9c130d84cae32da5b70b909068f9035af12179eaf3a8d6f99e526e0d3d0c94664c258a0da938c984ce066ff96d7be50990cb2c0be13846da710935a32a573414d6d1fe65ec0852a882918f089fb302d0664af99782ba07131b404638f7957a3d36698f3a990a9945c56ecad18c1f499bef2fd1649aaae5737df5b1dfdf587b3f91e12f9bb9d32dd7947f477774a70ff66164a9186cf24b6d9e2b9dcac4b258c4426f22d900764951abd5f75bdc19568be694a46545a7127e0f0418ea96568f79f43982340811a0756014b7fe5f625078ecec07d2112dd7372babdd47418c72fb38fb31e545d394bf2e2f6cb16023105fc7bcd3a7f5bc21e1a7646867e394b455d6d7638d26b84c00b16d12649edf23ad6b3c8500835504a5ae22bedf85441173f42d761b1819de25adcf1624e5fb3fd2438e0450fa18c602b7dda8a9d08b58a8d9cc573c412280fad7d67cd63497fba425677b4b282d3ebf4bdb4342a794edb2b9bd737fad05777117950aea7f46451cdefe8ec4b36ee4132249033512098aa9a4601d622c284a18d2856ff4cb8170dbc4557f7cefa6aee4dc65da9ed9418bb8c573f5d60c4122bb3210e7c7a94547c2df00b0bff9593e6ed7f8420269c7a18c8bd35a414fbdb5b8669678abd7127bb6693b3c0ad1ef2d92e944948273975aa29c4a9cde3e5bbd2f0e0caf5c5f1422ebf030f78b0c0db3b5e2a845525ebd2b56a5c4f17e1bb41e10bfa702408cea46a78884d90dda00e988705bfb16608e74d64d084949471286c440be3750b0a41e5d39fa0b9883643ba2ca6af1e83954e28519850a9181a58468116c8a3ef573af40d1738c26796c4b4d3aafefae6af338eda3ebfa072042b3f29b8bcb8598212cac528fea0379d63d289afe712ea4e865160e962a3197dff53a49c69f99c350c1a1a01d58e0c4e197f23a7613aaaaac712f2793ed51bb6a5a9fd94dd5062f0c7d723c00376115650aae63fa888416d779af511f4f5202d20554d90697a803abfe79fd65ddf4a3ee45a2abccf3a962d5970ac6b45970a6fa992d2aa7bb5a64549f33b53a2dd0d5255ffbcc67b7f74026aff1d2b7ea11961c7ffa636cfb225deadb00ff3c3f89547c036956d4187c9ebe16588902da93b58896cc99e58518af6e736c30b5a7843494b0a6c6ee5cad88399613a6b371c5466d0ee6dce1c55028bceab01b9a3530e2e6f3828e9b6834a13804985c2991fc827c826a5af6566753d377af31ba493fdd4c7d0689ebfcd6f91a1019f51da23ec5baa7e9531127b4837d2a39917261300ce2124fbafb7430e0e04e9b28c1907eb87f35490c141ceeba8ff855dc9edd5c44c5b1097ddefcbb018447d460411f9b876cdcdd86f173acc4e99c1e9b1036ab700756dcc2eef52846a341de08e0d053759914caa7700d7507af9e6f2f9de007dbe5daddeb7a3348fe275bf90ac6d79b4049c3ff78b47df95978be6676553b7a2d4c5b56cd4cafcc10f3ac1d749ecdc1981f4f9f0e31cd81798b60832c80b5561e35e1e229c2f8795a854f801bb1fa1417f4a061fb4fc88c3d1873e6ab66fdb0beeb27893024cd265b9a031733a158c4ba1a94a8103c4024d555c2f634dd649ce2f18cc1724afb59a5dcc58f89a78c627224b66e8bcddf5ef0199068d8b015e482af0f6b25e0a5c1a7cb13afe6767eaa3c8a259c656da7429633b8a271311c8f5152450dcbbe5ebc2c94ebfe1de626574fbe3f23efd3c3a58f39c713311abbb3931e4b3982ddb3505091fec9bfb22e402a1dd9c661fb71494bad8c068f693720c9914bc79296c5f54b3fe0fd3bc005abd4c7460430107c9e28b9309a4fcfb36f20078dcfd52175f7ddedb169692207cb70add1eea7e172dd2e89c0c0711cf0aa826febce97969c701694f1aa3d84e93cf371ce4d69514bf9637e4d8f3d4582a19bb4340b94483404d46269414d7a1821c0242743b084d77c919ea5e509c29ba3b59bfcd27b3686fe719ef4dbbe2265ec2b8180b5212e8645fee72d14d2b63d210ef9fa90101e8f24cb9a4cbd804a31caf05d5b61feab943ea6ddd1f5ceb4e7bbb7a452525c438b1804209a8f115bb8bcd6bc7f249b10d218c4112f9f687510d5c0aca4011bd31a9c16397759a7c4b09e87b92f90f8652f59ea7d4b2a7db80faeeec02cd5ec8c26c256135f139574958a946e5a43ff9fbaa5d26e806d8056fb61aeba07678ba24f46c10c1e203bcca1b40130d546d8f960bfae6da7789a397b54309a0911c9572d1a84e3aea07a2cc715afc1fce602616708fb4addd7bd3032e92380ac389ec96da307982b19c635b0410d615e2e119d12b0f176f5148033bf108dad6f37d417840ffc4939113647f310f765677fd1cd16ac1a9ef5e315e9e477b60f3267834ed3f9c03d6c34aaa17bee60fc72153a1d486037f6130fdfb423fcdcdcfc97209979b455cf736ec0542346719628b85bc94ab8bd1eb5a563607aa2cbd6e08e5febdfb8a2e1ea485affb64a4613dae76c4a2de152c8d9924e48d0c8a68ca51a0f101e7d1c8144c0eb6eedfc7e0aa2239a381f68addf10b4dac3db0d21f3c9860ce7890b5608e38c0c86d16e5995cdd636d5f8b49b9c74a4da203a515a8aae3a06946b8427b89c37713a5c40fc8c1d11653114445fe00b9db86331d638309f57a87de176ee68a8a19cab5cde82ee4591f5d0fb306b7cc8a0483817eb4e265f61f8083e0c51edbf92301ca01c8e5bc9e5258c107037d2a3bf925d131362e40aec6a6d392a1c23272636fd5861a7162747bfec9cce98db1fc2788058a57e3d79137744dc26f0b4f38ef3e303f3756900f0e775870d8dafbb00a8cb7688868a1b6c12810bc015bc414ec4a9897f80c1bd7e3e745f5cfbb08d0870c339844f864b3420590116b41401d41af4a4aa4fc00f49135a7ee1077318078060bdb410cc574627e33f9886d933f827de39ae6cbf0e9eda5dd2b19025c74839bae603b013a46f9ba76d88a2a50d4808f319e8c5f846dab23d4545fe7eea8f6e5a5d50b86d746e558fa8bce5ea46cca577103a185b2bc8d50a26880e170ee068f5c6f80ed66a370ed86612e17a9eb521846178632f69cd4d5ca6ef359267e8a0bacc139a6f49b304a1c18548262dc808f1990ef42a55cb2bce48523776c89e978a0fb080ff8fc8ba6aee116b689efa440d9683e77ec6adde6329ba7591474a2be6a06f57888eadff38e24ac51e0c9ab1ee5a1ad69948b5dc3dcba3b60bbc5364cceda056e31a78d1f41cfd38f2784b546c875e3a2ca91f923f91e88071961de015a3ef3a0e2bfca5386815ae256ac7c6642562dc3fb53a3394738eb27bbb111492f15912494250d4c3bc262dcf6a26a739f749189bff573505ddb567f95ea7cf32394ac70de60c70d4651a7df948c8a908b2fee9cc2d13e7acdb68fd4360ded3d2983d52e6adc933fae12805068d8fb8490046b75fc1ff4f2b734681f00a1ad78e20103d7a1e30186ccc147925ff24f7d5886afcbdda35083295b5281abed235437b882ec6770f629863b5d9c5d7f1d5eec94e7ab5a06ad4f2469769f1d833618521448ef91bce68771d18da8f23e76a87a959b10ea24a37ca0c2dcbdae193ba81e80c9040f44714908dbc10c86f49640b7f9a8c4ee83999fa35d6083c2109d23077d72271250692d616e804f15e5f5ddf80b99bb9f6eb9bebbd13706d75113f9ceb7ee16b033520737261442db9d088809854d9b407181ce212b31a116e0f7f5b3407fa47d4116273b24bbe8890201f15df2b61a73406e52ea54843b713034a9d058f68cbc7a922c8c1246da7e0960ddb48b4a888cb00788b400c48f58038a178859bcd92e1367897fc62cd871a9290f7097943626afa569374e81eb8948a88805f3e5be26e6e9fd8a696f23c48f831a25db9e65b5582d3656913f70a7ba1604dad207e3153152ff006421bf0622c9d32ef9322754de4b721329817176fd0eb6271a06356c6214e9a4fbbd263b48ed2e7b340b9b45793362d972bed76af4c6bdb6f073ac135c71941ebabff1bd07a9795424920762349c90dd9e3a4477a39aa67f4dfa5260251785015cf0fffcff7debad621939696019bb9da56bdd1323ab014e2fd6c7b7d75f8d1c986d51bcaff12ca1c93cb0097d398c873c775c604048dd6368679552ba5f515eba409686f4faa9dbb9048d2e248592662911c2de03d83315dbdb4e2739600dae1a6cda6df06f8870e10b1ca43325b1137fa6807e9bc93d4c15c02b063eddcab7c9abbc6eda813a85450c2f84ab7ae4675e3274742356329e7aa5d65527a68384590c344ef2da7b8efcc14222047968b990b476d4c7d38db6b6782e5d0fb3e8039c307f13bcd8a85cea60620c176a093651be84899342567342cc85eff46bf7ae057ebcf8a1daebfb22e54458c1dc87146003509cd984d5bb9bbc17c7f98187aab2c9ce440afe75a02302b7f8ebe137ae3159aea16ed257fde0cb2159edbc3c089822f799c36a08d09d4b754b46611ee417f64f5bf119df2a49eb5ca930a1ab5578412624eef9d033a1bd02c89b5f348828333d461d71c223eb10a7c5cc3800aead5f64b3e42600dfc61e3f16e2394218eaebef185b5fa02c1fd883e6ebdb74f977cf6bc7866d9c4e580288e99ad017242c50b40e17827b40d0480d1e9b632beccac70c12a2c1d8ea14927b6e165bad2c781ece0225a633a3a90be4e9eb2412f7e03c7da30bf59d8e5f2dfa651faf99fe932e660c3c72b382405a5aca182ef18635703a9d1498267593c6dcb799727ce98495ac742bfbdb17b18d8a34895b9b52147290763607694f6a79cf1cf928b070049bc0a1fabad6789d6422e910e2e0371d2de71829124d244261ef6e36b87c06df12e92554361771fd561e907404ecbd2a6319ba109c962a9d3bf10382b8252b90bf470e6d4ab28848773d216509ddff392d8f159251b87fdab0c2d30c9f47ffe620a0b5772ee0d5c67197fe81cf528c78c73d28e427485eb35aeb14e62ab0322242d17c9a073db2f2082592dd534611b29eb05214e91e0d823c73daf6262956e68a9267a7f13a9e496797c25bd36faa36bae547ed5050642a6a746f872b74e3c207a4698cc7a223b83c479677288350e3c0a418aaeafeee273b78dcbfcb7fc2936feb1bb537793aae192400f16dacb6c7029dc3a352eec26a5a3d88ba23b912f596521ea4941abfff836d489f7b3215edbe2d73a9d12b87f2d063d21e7414849eb9aecb29fd989fa4cf49c8d98f8c35e92729ee5e45719d41866a00c2dcc4593909e82503d5cbd8fdec71e7c27f2df4713bd8da7999f850a07c45253f07d7c0e2527913f51769dd74cba5c09c5a9f2b9235c227e4b80040d1eaa3fb383824a7371b1a5f7d38b850f2427571fe0254b818528e62951793db9bab62f8965c83897e5230cec8e08ea4c19b5275ff74c28d2e15c452f03504babd98c3f8cef0706f65f40276d41e9cf013b7bb7e5b6c0f6fb8f532db7bb6774085dbd15f90a99bb771218f82001195950fcd21c4ac14dfe924c7c86904ab065beecce1ab98ca7c92265d1bb56f00eb1e2b5b39e81b0913ac02d1a10c6e5021d8f29d62a436e68d10c5aaf7ba95c00ee8c75bf1ed77c122e811b9320554d78b5352172a66cff3098fe38e4f539023989ec2e6db92c0de63a161248c93a4bea2eb1ab1525374a371aac7bd130d4f09bf175e976f277e0422e4e7181497f5847de2354cccefc8800e7893d30478242558e5d98703d5b696a8baccd2ac7089e6762ff54036c176adff9921c1401c5433d6da737cd697bd6079df515bd70f5d1de078acd8025e796be2bb6bbbc1e59539eb346c8516144fa991f484124dc09664531e62db1dcf7df9170b31a4b0804c33a4d706908c8081570420294cfde36fb47f00927d856a4ad541a6b16ef82a81cd2198f4ebf950d689a1944e96e1a54a38b26c9ea64c4eb5574abe4e22f3b6a7ba5297912051810edff6d8663b74a6c6e2be0004032d73af3515d0e932e24f5dc221740b4dec9d1d5397229217c9a961b79a52e888b933cc699ae1285048c8c3df1618544875f02e698c0f431da9963cb83ec1ee2484b7f7c323d9bb4956a4e28494bb9cbadba6386bc6216bc95620cfe8e64138349f1289c4da59f85189ee3539e2015b333b2b9126301965d36dc1f864b3a6da9b3becfd5dd46e4f6b31c5c83bb808b6db730f14d735ff863ce5525589e4b47047dd258f437c83e9cb4eb42d76d9aff719d4e1b6ea762098b0ccee172645da394a76271cfd84b8738c625042048730db14fd0b988fceea179d04913223e63a410bda63f1394ded1218c30bc8fd8698d11594700034e5f6cb7aacd6669dca9d83374e6f964af4c8b4e61c3bad9c2512ae7ea58433ad37801b599d0ea648a6150174ec2801da8e64e2d25f5df626df000ce02c7aaeb3f4376ced34722e97e1c2785ed499112f3f7ccb2617973da34ef4e1cd18603864cdb15a51994450e34526ad8d6617b331712f697391e8fb1f6d2a2d822f143bf757b2442964f8a4b6ece9aaa7ce43de982d9722691b30d5e300153285f9ff2195fe6956805a99283267651cc63b8509000c55470af0a8db80f7f05448de72fd4c54b02199739e66d4083ee2bf56f25c88f458e3df3c3d644ac4161a13e7e6a7ebb539cbc898f0e8a1ac496e770287c5da6d37cdd893a250af3e84dfe428154336c67d1c7c6acc45d740c97a3597c2119adb1a04bc3d7355c8cd61404dc4f2a2c9b8fdde2a404e19f4cd874d2bf23fdd5983038fc0a027a15448e5ab83f8659324bca8c63c8d2002c8aa245c69012ae3b42c53a0d2913a00bcb6309c25d05992477f18f250c4a796c2eb69b2814eaba0c7a9f7026304f05a30becc7474b6b376d4b322b2b7b1baa3fd60f76fe6d300b125b2f708d002bc02df463eb761dbac11ca96644ab201b8029602ba020b4321178d36d2b62debb6ab647bc16925df981a3d83ca4499f0aa3251263295710a5893d564a44822851a924835d30da6996936fb76777777d8a1508c22d188b4b066eaffffffff50148946231269737777776729a594522ab0aff324e6648570cd94430fd41eede155edd19e1167d229b190aa0db4c332ecfe912b40ab954a85ac549bb2a03c436c8f0e692250892891655522224eaa547974c812e122d06b7a04ea113dc2ab7a448f8c38a74915482e11b84696e11ae12310899a66323f4d43fff48ffbe034a7d1fa5d2e3384dd2129e56a8fb350610211b961ae00e930eb018815201d663face81fa7f50806173c8992177ca0faa88f8ffab88c8c8abed80f625f24dd4229964495905ef0d1254c4aca44992cab321171d2610d649a2d89ba44972cd1253f3fa659af4c37b869e6a69969366b1afac755fdd33fdf524a29a514815eb2c588b4955c804a5e2a2d6b49c4b9320d3463eeeeee0e210dd2382f955a70be4241f195c9e45d9fbad369594f0f6b5006638032994c068180b5ff86b5100402d6600dd66a1f7f9328a6aef33fa5c8142997558a38fd9d81fa87d997ff5d3e0aa5a2e22b2c2b2c2ccbcac234da07572994a656a71633fba03c1de12ca516235a5a3ce4f212615e6060961586613ce79cec03d39a6934cc4ce3509fbeff3e4ad0b1c4a2b7148bafb08c18d1e2f2e2f2f2b2ac2f3a03398cbfc0a452eea9541e23132323b3ac322e57cdeeba6a1284e00a8652354b56363fe332a5163324489828b900ad4cac56cbba1271beebadeeeecce7a52c5fb16868bc6bb5dc73792ed7b2ba4ef1bf8fdf77777777ffffffbfbbbbbbb388feed22e133244a943061c257ac158bb5acac180188c65934ad96e7b9ebe57abd96f515638cb1269eb86136eb4ed4f8abc6c6e6c4094701000a0000585600449cfeff7ffc980ac19544a54ef1010840000f40800106700258290848918257536c01524a29a5943206b46203e98662c9858a4624f83eafcf359e6a5a5951a958ac13270a98b1ebe26c67b039e72cb97789e33c64ea4c5db7acdd0c36679c73c2e69c33c67e77efefeeeeeeffffff8f0c351443312e6b8ca2d168674bf21169dbbcc495386e59b939a72fc30eb1b2cf25ddddddfdffffff32994c269391b692732514ce64ea4efef27f593f45fe4f9e324a196a28250f31c86432d977777777a398baee744a49917f4a91f21f8552598132994c8821feffff3fc618638c29f21f8552515961812c2cbccac222bbbbdddddd5d4a29a59411059e30ac58550e9fd5c1dc8407e3f4803d7af06a8f1e238ee74d89450e2e826b4cd3850ca10c4d64faff93b746779dc6285490bae7f948e187c9890a4074429d3a9755a788932a164bb569c985a70279aa4dbdf55415e30f2033c80a30a83085c1140624c80a309c1ca8399a93a339416038393a3b50777467477760393a3b31215085a8105e55212a64c449699ac998e22c0ff7402804112532e2606d057b155a45d1b28e96198642cb1a42126a21b691244aa02a5125bcaa4a54c9889beaeeeeeeb4499ba218642d93c5206b59bfecffffffdddddddd1772c35047d1c837dfdc97d5494cdb2d6e5ba8e1b6c52093c964b218644b64dfffffff1f45a31189b46d5e226deea512c7a19858e633777777efeeeeeecd4b258e43413175b0eb78b5ebfeffff5f4a29a5942291c9b4b2a252bd0ab086097f82c015a00c30d804072a8ee2f0aae228ce8803526221a7e34c233d5008582bb17016ee8417f26af782145662b1294ec94528678765adce8ec6a0c634b6ac1a13715205dab463d8b07b595bc4f9e7ecc484b0c003954779789407b42384059e9e215087e890213a444a213c3d438814815a448b14d122526e8f760f5b848dc02348a0225124481489ba4a0e3536d0c686576d6cbeeffbbeef8b31c61863eceeeeeed3e9743a9d4ea70b56f5429681063ac306da0303c280c1ab30608c388d61f042555555753661f089e1c8d02486b3b3638cba0c02e93649c9baee3a57b574d4a00da4cbd0e592363629950729d546433f803f208490aa016bd458d61a22aeebbc96ba5caa4d5d2e1b1bd5a636dd1f845043041c46b0016dd8e0551b36461c948520829422ac8d25614b58136ec01b3778f5c60d1b259870e3041c10070e5ec5810354c2cf9e80030788c20dbcb9e1d59b1b79020a373974ec803b76f0ea8e1dab558eddb13cb6c7fa80298c38a6a9f6d814f6c7aab0407855a7ce11c713a4b2eb260c2bf86c0eeb40d5511d5e551dd519711c45a30d76ff38b327bbc331b833095296e7894624879ea7a3183fee93ad6d0e1bd398e7cd6073cec962c1e69c739ebc3ba5a43cea51a86545c1e69c33767777f7ffffff8ffef575b65d37e744710ec564ea4e29a79494654d7177f77e7777778f31c618637777777fdff77ddf77e2504cdde9949222e5a3200ac5ab28d4e4b95ac1e69c73c2260f734e7777778f31c618e3ffffff4b29a59452be0a6a45856565c48816178749c1a452cb9a7a8149a5760661220c4ca8210ccc9c1336258df6edeeeeeefd2c235a5a5c5c5e5e60523095e2d554cae505a6e7c718638cb1bbbbbba594524af97ddff77ddfbfc0a4522a554c8ccc0c9c99e1d599197777770f7ddff77ddff71f08bb357645d81d61d7c6421246dc8650c3b5b44f9cec8c63383cffffffffbb5f97a10c4d4052a5a107e9326cb5f4f5ba7182e298cb9200851b0972c01c3996358788e5ad966ad3d6eba5daf415238e9b1c3a76f0803c78f02a0f1e230ed66e74ece0d1c307f4e183577df8d0b13cb6c7fad8147ec01f3f78f5c70fa7f1f09182911e08040201c2ab4080807cfc506106811a448304d120ba5aad8093a3b313d35877288a46cb4a52a64929a5cb722bad5628cbccac9af2b2eb58baeeff25c562b9e795d8d5b29846679ea734ebedaec6664f9ce48043ed871c70086000025214a002aa50c1ab2a548c38dd362f7128cb6a7abd624cb12ad6803d0022004a00269000af2690c0888b40ae640965eb827419769dcb256d6c16287128a60edad8b85869e0c43af000022a1708200410f02a04108cb815061a702d495010a0da04a021404e2688408df4c4feffffbf971b6e0c67c618638c317edff7e9b71f7f1dc361ad7f93557bd3d0a892d423486b6a1c050a0a2a500b78880b703078015fbc58d617a2d5caa3a1516d4a434313f372c91a1568d31a478142b5290a14315a80c18b0c34801b8c38a6619081061bc0880163c4e0d51831a4cc603758181b6339900165c8e05519323688c1818c0e66c019337875c60c21821022082963c8e860860734200d1abc4a8386ecc0031a1f80004358ad78aa76dd8d5d1c8bc24d0e1d50870e5ed5a163c42d3333333377ddff4e29a564b9e7ed6844da4ad08b71f6c489cea49452f7f5226d5ee250200acab2a2bc5e7243e183a2f549489168d41654a42e6812a8493409af6a124d32e274455f4b5e5b4dcd891311b47c5affff1f9f27168bc562dd29c54face789c562b1952ff6f7ffffffc718c17a3e9ec66231d612967ba9105ca5e24b7a4aa985fc47a9aca8acac2ceb4a777777cf39e79ca8538c632a8e5259596161f1112d235a5a96b5e583ab144a53ab534b55519eba784ba985cbcb0b4c4a9552a99655f5afb03967ffffffff4b29a5941266448b8bce608cab6264646648942051a2c4b2969873c2e6bc6126e3ab87befba7bbbbbbffffffff743a9d4ea7932a664686c44c0912264cac58def25a9eb7ac1e4dcbf3b6b7155bad50c356ab5736c0e6f7f77ddff77d254cac562c160d4dcb839ec7ab9ec7a269799ecbf5aa813535bc5a53139a4da6d93923a287a8b9bbbb7b8c31c618bbbbbbfbffffffa594524a793a9d4ea7d3a99fa6e5792ed7eb159559a854b1bbd98860060000e31a000400c23010868120ca3ddd0014001522252b1b3f1e0e934dc4b1502448c7520c06428801ca18640002c02845cc507200738ea1565b7ab19d2ec2b8208c808aec288f5be93205a2b46528f8c5c8fddfa4894a2b1c740dfd10dd66b5a25f87b2e85e0546a87b4f9f102f3e2faa186a693b1dcaf820448389acd14a2b73ec4d153040a877db9d8e0c2e66fa9892241fc218002838047ee413d1c7e4c9d1f4c7da1300cee012ce2706251c6417493be1199956360c6c0ee1e4a3297566a6c436c205ccfa982c20a4a76b0e2d29d396b2852dbdd9bd9a9fe96fd6cfa4b06b8186c23717d2669cac39a397e01564207894838532848e26c43a361a27014e5053b63733d2d6eaa0d525d7fae4b65c02ad386d4f94c48d0ce8b2de58781c43db2c967a5abbe2ba87cc1d7e855b8547680e4f5bc37866df75c7fc0e6189f9b6e6b3fc76741510ec8bf0807839026b9a5f7f5d06d0c05dfc4d672252cf56997c9ba6da811d580af465154be1d217d5548dd209883709a53c942632542d0f912c6b1b35880040fcd63f1ccc0ab8dea12a134ff794274aa889c8a4c77d010eaa49462649338369e3de5fb5760fac0165309464e2501b90288eba3925d1788324bd394f615182df00ede1e50e9174211103485a394cf1a38699b58e22f2fafbfab2db4a55618b3561891d5ee2fd9d77ce7d217a3ef12e3905f3098210fb9e5f922840917b084e80a01b660e502923a66a6d78e27107f6915217730e1c4123a6255b905a175aeb5e80d5d3658477ba8c96ad3c27e042bafbaebbd3ad8b4040172d5c7473a1765d481e8bd36de4debc20a821feb3a45c02a11e86bbb9788be3ebd22320d0e1bfc2af5db511507496df02a76841d7bbdab191d001419591de5dec08c9f5dc5c245419599dfda97332763d1d6fef28bc5c2cf4f53f0a08c0ac13611c05821405117d25cfa85c2aae01934e5d550f02d7581334ba99e4a515352852b920ac5339a3e3eeebcd6fc90efeb5209e382308b1c366788211602a69695c266c5709e10e3fcbb6102756d6e2e882a7f033ec7aa80a6434f06228e886883712f5968b0a0c3800cd693909683ea31aa52d8b753c8d403eeba8b7d0efbd511f20aa5188f5885070515f10ea78f8790b64cc63ed7b228ce07c3785cb617988a7e57a86944eaff5a6fdcc2518af2994f4a34f543f96043700f710fac497fe0cd7b4d7611f4aac4f44cbf6899347489d02eea94823f819ea3cd5e84473cd5b2965f60c56025d34849f75b9db06cabcf9da4e9c6f8471e4fa471bef57f12cd0c2f69e1c72fa09c486d20be685b53c40300fd95dfa20945e859b8a245298bbf3b2d0bd39c7a7add694100314722a0c08297939026d9a0bf4d1808f9b9b08a0230277936c1409b9354a0243281349d61e537f84795e954f381b22876dccdea3b1110ae82480cf2057345d8c03af2b92fca024803444d32ead70a380705d39f1c569b41d5740a281689dd2714106d19383a9e29877763db3ddb92fe83e00ad9d53e78f0de347868258509c1e8303126d1537b17ca441758a0a690e0e62bb15c1068d3d6a44af34d9ef305dac023ae83ca5a13c9b335bcdd79221d00aaa116117f4bcb26c1887751b24806b0ec920d21ca1741f4c0920371808e6c7228b831c34d028e809d56625a76dce466e6395c38d0445073ed1c12f7a06542c34da5ea97f04aa1bad058c540b67ca4230895684c50a5bf78198d433847bd4d3f301ea99cbbd861cb16d54e537c8ae0bdb7f20c00dac77357793395a641aad04b2acd1dd5a1c89e4e607e71aab11b515510948117f504a32f49295208121212031e7010eca9183cbf17651f543ca97f97a09142fd27dece23f80477bccf9d6375aa6d718fe375b293b50e5604100f33c91f46e4077330377186af1e4756772a01432167dc00c842863b6083c804dbc4c129b16e560a3aab9537a4abc26e4a0554a96ab63554747c054f3e1092e1d03db922a6d4c88ea890d755a69c708f7ee2f5b583dc8f5b60e3f5cc1a3e60a930404c2c0a6e0f87b46dd497ca1bef97320feca86b0d24bc2c7250a40cd392cd6dad75415427d7732025d104ff31d67554e190a2b300c1644812a040f0d835b0d654c37fbe51d5cba09adcf8e5b96c4f12a58003bfc61907068bdcdcff1444dc2e1eaf126432f02c899cf4f13fe4acdb70d9d36fc1ee42bb90e109d6a9b751c40f0a0611d731bd23f77f559139bef8673dcaef41ff11469c1091dba05e9bfa537c74e64388f748e7b6e99dca1b38ad01c450e4526d4613f6b6227c2dddfd99049521ef5f67538172f3fb71575441a4cd935cb79094dd47f20fbeb166a961fecd6e845aa1b67b3c86ed1b5b4b114a4ae7cfd10957e1db075ac9eea56090816dd95f6497840dfe58b8f1bd96d589136aaeea4d4af3f34fdb354b7eca3b5a29261c2a2583bedf8e8871655f702dad4de6dce499020df4c0914ff416673e05ec143ef53c35d973b8e224b9040a317e457d510c03d0f42cf6ea397ae9817cbe058191b68c65466457624554465f603f5bd8d77a482fc82ed43302a111d56ec2b48ed39c1cacb7e820f401a0009e008f1dc61414005c4bb98776fcf55837f7dd87728154cd9c562c1c5a6c7b375d5e663ad36f3ee1178f72c3c8a20f0795561a355f93fe347d5be3763d710ae6e36025398fc22790a6a4076366a0068787ac067368f929076ed91cd9c9ab2d2b4c45f861b6badae22fb2310d9d72214a478981fe9434edffab95b3ed053db8d054d7507a5d908d843be06440fd403e794083ac553f6877979a49d0b31e1055241b6885f9014d22bb9e846bd0d6101def20d4e0b06f3726f44b1a6a751da160eaad1697666eec06c951168a41312b44ad1acf00668a8e1acb0b849a17717d4b18ee991aa824b1290ddb3668d87651ae8fb6b2c157aec0799bb7c1b4a8982666580dc2df89ea3a57e590d71082236d1cb13dedf07f30c172ff6ed39a25a97a43289359c80c3acdb0576051ec469a484032a2a9be175822056715c0ff6690666419d4510b8fb870aa6132c25d688ad5d736e238a85b8b3140ec835c956342936b22bd9fe436857df1591faa3fe5a8388ea962bac17540b248a82c537468d8f6d5aea7b6b962684c20a74d0e44c30df19869baa11eda59ed35c6aaf213ca95d3bff9bd8e390a15247b2bbf2ad696a3b78400aac0d4132d7580d6e38f079a56dbd3da3d14045c5e496d8cc9efc82faa7c98e23f7502f85f537044f54d5bbf40e1b8a114a024a9fceb3fcbb82a28ea1267f809e9fe3a2446695f4e9ed0f6f956fcb895727d9c725207f08667137f9967de4ae63d572c0bfebf63ffbf70fb3accf58d328e7d651a070f5320c5c014bb24c9925608e29cfd42da576efc0f8bb2b980cb81b9d5adec4baf0c358430e3fe66b6b70908739251278e971bf8aa6f05f4c24d44aff624481760aea1c8ad90cb3be68cf58f715db8ca5eee55c528a9341571b7016e90a1d1cab9ed41c25fa3dd5f5eec5cbff748e9457f73044b5e28f38d407b1874e3c0d281c9649e7802655bf8ec56abcfb0cfc0ff895fa60b7ee793a6b2ff6b36aa55a813eefa4143a2ff03d92cae3387024107554158852321ded28bed8bc8702cf8209c6a2d547c7486c0b1d7019f5500da7e90d37fb905a50cf53a13baee7db1fcf5b946f8ded77aa4de74dc7f948953cc73feb20a9a822450b558aac48b222d80d64483b7d4925262fb19dbaf8e11c6bc238119bd8a1199e44a140624569526c6dc719cdd958a165c7b569c57f3527292a48b7a7b99589d645ca2b7c104e8a27ab59217fde805cfb821fa8e38021645d8a048507e052200de61c54bf819ef54162e95e5e09eb41843a4c0376301137a8131287ee889a0929253d9e99c244f590354ed827d7a4590a9d083597abfa7957e2404e270ec25c192872f0387728b1cd00eec632938293b7171889333cc2d71cd732ee062a8c9320b0a423f45cd28a9bf71ccd9d5f1e4bf2b92a88fb8e4ac8ba2c045555903bf5f431e7ce6450260bcaeac50009432276408f88389d2c9ac9f1d52fbfce8ef4492060187aa4974c99718ac82c843142b52c829b978f6e866a74b3a9027ac420862d1fcd1b6783e3019ed6691c533fb415e299e0b90f0bed25ea9637c84a87cb90921630f342b48e42d7d47f8202257911873107d2a96b4118c7093613f9a82772c9e78d63450d616fb85581209ff4fbff9c1e2f10d693e39c3e5ee4193f3014c482c2f48c67e081448428173b94841dd6ccb17f7cbd9daad7a3cd68a0640b49e7e84df80a1584f924ba48a90a6c39455c6112133730ba10733fbbf9a259b47328ab5a8f0ed343d88f13b081fe1c817d3155d17b831632f63984f075ae89cfb18d194035f116b03bcaf0833930474ff82f740fa17830560321d3aeeed27ea4935248e62afa068c67019f5cdcd05a30b3d725a413a916fce62d40a701720847f8e8803159cc9cc845991a88978e73e96411c7dccbf0020900e5e928ee7fd351b45f1e8ceecc8f04879f6cfa21b67718105b0119ec124a02791aec894993739963015022975a3dd1536a005a78eb4ae2dda2236f0ff4511c824567bba33d3b0b03c362c0d798e1a909ded8a81155ea41368fe3c4501e875d05c202d8805f0ae5217060044ae4556d02908b4edaff6379af15398f88041893c1663f54ef929ba5dbc38351387f71a0a65d24bb6f0d231b4ed3007901f6245f783540a77c2580bd9979a64a8a0df03178a5158bc893574d1b71f0ee7258ccd9dc042ff7af39d6faa53ab4abe15c0c0250a79d1c495095663852d7efee037a0b6b1fed8dead6d2bc854a86be5cf9c37cad1a949786dcea3390111293e8c702b5766a74fd9c7eaee31fc8527911bf602e88b730d2ce75339b4d9639df5171c33de31168fcd1af4db4b1b791814ed433d3230339d33b1e7123fb955694fedd35bdc1e0ff50fdd4a6375e9e07c28a2e6979302b1e6fe2da5d31d6788d0d3a486a2d54d6ff8f3644609b8650d7ae7b639530a55a1ffb9049575fd8b5d3e74a1492fc925a64f7ac59991a91c1b56b34339533d45f94c821466f2314c1ef183127391263099f5cdb721dd3cd0cb5a0ec1aa6e7dee56925f84078ffb11e1361ff8ff5e9f459118b5f16f31c9162b3f6242ff75bdee4644a701c5e44973efeb6e8feb1770478092eed327681fd84add833b5f7a20860b9d948abc40bfe53d6e6b1ec72d3e3e8ba3aebb8002829531ffb9037d4534344b6c3aa9cb467e2a13bbd6162aae4f871bfccbb865841eec3edea291c4c6a48de5a1e1a78ef7e7e9146fad5168e6bb2af36f140937f8581c7a39ee9748ce87f638a5b73b149aa938cddd5d3a801db8dc8747b8e4643cc1d25bb92ed7b24f5f55d118fbfc7af51534efd9826bc372f6b2ce05d5c072664e37876bad72a7d0e79e6f883526b8a46a2ae0f9c6035290993f4acc7a18a505f4fd00bd29efb3e18425243ef3ac21a869062840c2a52c393ee4c56041682709cd741f4a78d73bebec7deee6fe57d2bdc8e0cefc6b0ce564678fefed2b26810682ff953431ddceed45db62a9e830c853a4a89b25a6a3f7f936490abbddf41e87b5ab4ecb2752fa77fbe1004ea90d8732083864e27be422dc6a4bc8ea96a64201325652ec369ac67a0b22cb10e4c78f2ddd61a81acbdf4117fe184ae1a4b2caee7e90f76a0d60741715fd033ba118e2e9b35878493a04e280eb079efd70f7b2ae7bd0befed80f44ff9dff12f3586d9a011a82302508ced268d9c913d7aa61cc606bbb7b0db8d8677e4201dab78238e4085c9e3db76a389494e31d2f6150f4bd629c6c53e4685c87a3f9ed380461345df2eda578c9fa50ae38a5f838d84ebf98df24615865b9e09a1176d1544d0570ce62a9ea0fe853768aafa24fcaaa7edfb1947fddd4d1957505a5a34b7f7bb28b494da5bcf547515744e61bb2983a36343ac894829b4d1fffe0e7198668708b625e681f9c4068f6b9243ab00eb6b826325f89e14e50ecd87a421ba8a38d9b44556a5ff1acbcf6f3159ad80c233a4af415c56ec2086e949f8b143990090f5bc39c321ccc36c9d42f040216bae4c80f9676778e531606b2d11fe6207b969b96201f180f21e15d19461ea59b28f752442146d7d52a09e100079e224ef9a7dfed87337312c8985e578afd3c1f2e265e92088c1058a03f99df9986bb0e8f0cf60a04f7c4f0b001ffdcb26bdf80afccb8fac1cf4027f57d5befcb0261638b3caef435bb6a885e9d7c1a341c15ef4a77c96d886d5524d8fc1c518c70230ea12ee67f3adef6342d9c9348b2d4c5f772576ea8b7403c20ffe475dff437afbdcdc547d4db17fd62bffd8e6f5872820723011572a74dd79f6bbd6880058f6730af00794e10f3e7bfefd6836d7f1ace27a6a34fd9814be41fbcc81436b8ee6d0267124a47a8885525ca59744e2b5bbf28de2411b044750f9f88933254b9d309e1388643849769e28f4d96309f5504a059c51915c6baebda779127d07ccb02a857795bc8fa6da7f81618d0663bb227cf83806acc831eaa838d0438047e4a5639a68d6f0d8ac1122b0d9f64f98e69b00159eb079190b37c53408fd718c1c772884f99f8718e31581d87bad68009d8f314b48d496bad7e6fe553e196b25f13ca3ac59c2d45ce04c9bccd324b4cd93e206076e901ced8558687d31d1e1ae7e346acf5d295b85c43bc8d1f68c4088a05173d518bdf75617f8ae6fbc27154d326152946ec12099e19bc8ce7549851f6dc11637588ced13b3ef7ce427883129ab34c608fa915b0cd745ef718d9faee9f3b34ee5c1ac5d435cc9faacd62f3761e242d350dce0fa082e81559137b7a0aea959926993f9b7c1945976f50675f3e67df26b3a296d7aa87bbbeda752dc92312c766425c19ebd5cd0b3576ca434528302082dc0dc8535695ead423252668929e43453f20b53cffdb5a40005410cb5e4de418c08fd1c9fa7231d9043e28e6b383b2cee1291dfed75aca19c540954891aaa3f9fb2a2b04c43d211f9bdb6f61b5d3e643fc8cc253e73c31e20d5e942dae1c5fb8445df1e89332c5b0166f9e1f4dc6602005bcb03b34d920a61d5dc9f404761913da4c06ed80ce12f3855c416496811b10fb0202a78eefefc8356ea97161a74b5ce780a5432b2afb3227d442725b30ea1a8c4e5a6c07782ae14ea4fc8c7765ac1fbda35a34ac0b23a4a8774791ec9b63e5786e363e9ebbd8cfa319b309f5058258e207b314872b1f17874dd9d777c8094520cc73fc45ff3ecdd092dec059bbbf82ce63248eb8b669f25b96b4b98bbea2e7397d40a0fee1266e475162519851a67310e05645aa646b9961056cdd7b5f7d2bd3216aa190349d089dc3d6b06d7b470b46eea8098260bfeba9c4b7bffc328098ed1a2d725a23dad4e2290a04ed9226d8d641470fe30eac9538c2f98084a292be4026a08e4b0a3c3ab3dde29ed4f55d4f1f7aa325d860c0fad781803a5c2bf05a58fa9c3591e469ad2fe91f02dd0edfe4dc05fd868a0c9ffcac4e3d19aa9213b753830237869faa3e342566782d383f477817a1cd45b7b37b3b10896671da89114f3009d6a73c48065dc99d768bf18f70e8aa7762c035800e6a973281a63a9044e98905e60f93372e118930b061de8d307f5312d30a81c28d1ff5634d315f1c74fb6db98650738eabcab287e61910d72c05cedb3f784bdc7525692962c70389aea2f5a6431365eeaa544f85338324dbd4bafd1bf4b0f0937441f1d4b307a6fa71bcd8cb6fe6e180ddd563a74aacd6c32d4aa6174890458ff8f883c30311bd3747e11bfa448b017397112ea502b8f725b4aa5ebe208c48305c60803af08e54d91e92a93e9c630ea83e4157666b02aba4e489504ec33a1142f40061638b2c670f6fe7ec62871fc68db6c708f15b86ff1cf82a0829888cc58621bc9e5968e5e4be3642a2e23640cb78dbe94ccc72c4ff035e235b6825121e1a305c34170662a5e225ea366d6ac94a7fbd00ca1891a0c2e3a7bc09c0bee9a8002b9bade7e1d0735623443e9b27f0e36d9be246798f4826f5574372a45a1b1e65dd63f6b637c363107f38bbee04fdbc26e2827ccd331fbfcb0677ee458101bcaf1e8830ce0db0b002122378392992bc603efc75ceabe79dc10919f005cf43527e1e4c1cd453d5d34ee6e87daf3a0d80b7f3d237a56e120c448cc93a8dcbdc24ab7db0bfa20579ec12d6efe4106c2a9d67a3667edd39103b325b528cf1b76f9d067256d34d33e0d3739281be425e4f0eda42adc56c1fe9af90748a446530fd5552d054935f8d4cde815fdf48f8a403577e2045406cedd4e86c74853b06911079b74cbcf94f5abf917be3700945de2dae347eb392bc3f6ecbf4b165f14974dd9953a791afa4411d1ab72ab80b29616f693d20fdc9c3364ffce0e9dbebb016772603a6903cf47adfdd5ab266fae0f5f5fe8d290b3c9e111413c9f5dfb3959707f83eee814baa62daea979751789559af73a6cd81244d86d09d6ffd71529ed9a7c6223fef2ad34ddddbdb3964cfd906b78195cfc590ed10f7a82ed8c69e83ac9fbdb92644afd13fb3013d7f39db3733cfbd76b493cb4d1c575d2c92a93f1e8c4791431716c208fb827caea113c4023a1c16babd93a360ef85300ddc57d36e7fd7a091d5ba4b578aa0a71bfb6eb89f289128b10b61027dd63dcded9270f609b9a27de67ba2f21aebf306e64ea7c0a9a04a0ee5391b26aca1a52360066ba61bbbaddf9c425dc360de12c2b6b6ff18528b2cecfa1ecc6f53df7dbcbdd36140845548b3fc448f36f88bdef4b8450727aeabefc9309804d3aea627226fdfca0ea283a5e8dd086b04b1464707473c99d710559fa35e720ca2e8ffa3cdf7841606bf812e889bd85916d11be2734981ef68a03bde5f5c486c5d42c9f34a7435bf3dd102cbacedca873d001822fa993de97ad76310a9be057defd33a0acbdddb003e53239de5cacbe215d27070ae2471c1e98452b73d6932780f96937ee21978bb0aa22960e56c81b6a8708ab706d22469ea0ffae3179a59d43c2890983794e41f8a5167d2032f392d99b4cb40287e507052372e5f2c26a3b877c6b668e30f315773f0f7658e815bde29cfd106a92adff3f96958475c89c2f221bd504f57436223a95816a1b3756717198ee4ed6e304432285abe75fe29bbc951f6101c93fcc8f440c01c95f694932231717f86d47cc62a236639ba1f7354cf91935c23838c23a2e2112f503cb8786ace162c20723a1b1b6104c50ca573a671613b31923863b02422ef388b8e7e982f0589a7f31663ea242eb87b12c76aaba5d638ad0d96c39337f43c271ecc0c3be2e81147fbca1564df7489e6902fc00f23951e1a8979dc0f139fe08ac4a3a7ed202795f20df726c59c55e2e3c47c9169d270bf2d304426e29d140c24b859f16d55042de4424323dd9eda710155dabeaf16b580a09afd1b0194a8e0527e787583332abbb88e140ec5254186700c58323455bb6bf4cf8717a06c1f0aee0e437ce308eb145d185bdbef3dbf6c30924c5400d2c1ad4e3a28e68ca9e46c32d9cdc741a3a4daea723fd149c6dd09257c47a1e3aeb4d13a31d95934a7e00eb4ce5e0b68b3e0e83466efa0afecc18bce795f1a1494a429d6c7918b7f30f4f9a8998c0aa7f5c0cad3b0a49c16718680b4ebb3b3a3d016095b8a2bdcc643a5cb598964e628409927240cd53d66513a5ae69afe902bcbb425e6661cf6ce48d4d773f7e5eddaebff8d3ee2e11df201799bc2c1bdf9adb38915834bd4bb7072249a578f6ed7974d61d8e2a405a2ecf1069bf663da217be4cec3de5d6c0299c634241988fbe35946fb64efa8a96005205d938623382dc84b5790814069fe1a527bcfd2250da4420f4ca060dc1c4aa5302573c1540ad8bbbf7a6fbb42d135f5fc777439db8f77b10b11c9caeee9888c9d3cdd901d145038653634291fd229dabc796d8b0c7dcdd58be0eb30dcfc40597dd99be5e3935cd1a5414c32a8949c56b2c61d8e74297c1ca9a18f669e1c0bc60f640d217d7113251424df598f523dfa7e8d2841df4a1d385d63c6dd7cf13bc043977ed021ee7b4bf01e4ac4fd572ff8a1044ddeb06c9fc0733a40103267accc13b2ccc705b562c4bfd66d40dc29437eee9de919c607fd6aa6bfe789bee98e6564b9d03791d9a747f6e768e4558a0983374007337c6467931bb5474c912f401b90500887237e50e4efcc27120123a8c1aad434141ab409d32cc6b6641cf2cb5d13feb73736826d5d9c68bf3c9230fb8ce449f11e7ca99dae8962f401b770ae3a3e683b97349777f1bde71a720547dea1f70003b92a8ed55449f1677879d17265871878bf9ecaf27a7b182a155988a6ed437a89805401fd4a19fd4fe1b74ed11f6672c88161a41efe647231e80674290d01aa0b85414f93d9d5fdb9b18512273f3a3c4e97acebc2ee26f3d2c581f14baf5f9b3f6dd71b76c2a0c9bbef4c6e264b73600773db75a26693ee17fff322a0f6e3930599474dbaf7feb6d341ce5f432f9eef2aea86ab09f0f38357e21a25fe9010485ddd6389fbe2ce53ebd9e0242331abbde0ae1e28b6f4351501c6aeadaf148979e147e8141ff3c4d6b4e03883a303854ab2bfbec555654831eb0ae2a029fa91c7d55442be6c3ab62218d75a2d6f5208334b427edc496fe5c0760049f303c9003e381701c57bdaeb6600c5eabb46213e8685788c058ca48c3a597bceb4910d200a406a7e3be5f0522090b9102a67664c0efacf8c9042bfcb1b7aea4b2ae6fa6bffd7f40c0dd6e47148ad570ffd649fa43c494935b88f092221f433db8a987417eac8a32091e8e50c779e95836c7bd4da565e59474893fe33d245f9206eb21dcb4783440c55a530e134587171d1f4da2fa69b9f311f19955d18eceb5a03630e132f7564c4345a363cc79d194e37a36f36c2583857a132c01c09fc858fd2b51a779c97cd77b9924e9251e988d251112db18dcb1ae104c34b9366d71dcd5828af50d8c34bc21e04103808d27868b816a8c55097664a7c51ecbe0e6b377b3c11ff3bc972c5b1cb03091f8f405a04dedea3a046bd423b39e103845f6bf9fdb31f6650d4423ae5ad803c56d999f4b4fc207444f7c43553b44c77551697d87e9f2c04031a15c75d63d85ea6885cabeb897da6d58df4aaaf8118f1aaa5e6f867540d559151fc22cab5a027f39059435c9dc0963c1a454dd96f4a25bd930936e9b6cf09c0974d599de063b738300cf54b2d73303573e93a161e44e638f58798da3a5be3725e4a306e38c56f5fc1d48d8aafa4ae982c361a9c1bcf25b5837418c12ea9b4e3afefef6550966060aff37530c8174d71c86aaf1346c8cf0e22c1879ca5b5d88a1cba3aaad5708b7a349e566bbdc7ccfac03235db81748fc71b08a685b36cb0bf7028f1da5a700abb12a7f8d2784a396a8637134ecf92c71129538296c209053cb2aab02b8182859073507f712cccebf21543368862e4e80efc8ace91ff7d6b32228afc47676e3f859f74c24e73cdd5ef84a474af53d8e7d7c420141090abce28ed21121cfda51c8c2778b79f0db2a4de97f46535082274146a3a2aba8faf9147f77cc00e4b59149151722ea4fcbaf0de2597ddb70713031477d11e5cf1214bf96214050d0e0d92e8da6dc055bdf5d4a58f52e57eadfa5f514bc6019fa7bc92d42ef7002459def46b465b58d465e5aa0304a96e7b1ef6985d1577effc93ca934b92b88069c9fbdcfa3c1e2429750b906899a0c96653d2abbb6cf4356b7313ebe8e2bf91b0a138d3c749c74e573ebdf9fa921a1a41ff0a7090a82e997c60505f16550547a0a4e749f5b732299a549b41e97e47bc8756c08a8ea2343a94a692be6f7d2077fd39614bd0d526c2b3eae6a5f558968685a15332e9a37d11eeb4b4b28902714e7bf3b9403abca9609a5188aa0133fbe567aaec435a6d7c7bf43e3bbdd3a140db9aaf7ac3fd4119cfcb8804b81d66e013260dcf23b7e321eaa65e1f90dba5184fa3fac8e02c8ff23cde3c3124a7e1da178bdf59a5ff237c7e97199a9f59124ca0a1b2612e059641ab112b4d8372652f1aef2e9eb2134b51b3c259d7d3f02895a45e518278bc72afefb6633081fcea2e037c8409ef9cda2b53e536e54b01e6d7c152d6ea0e1e99bc0e23db2780e253317dd2246c3d9467fdd52ef924e4201ec5e5cd74a9c942faf52c52209da4931fe7f0eff93e2d494fc8a94042d5a81af18d7864adbfb8431ce743e5ef9ab32ac73940e5aa4710d3a3cfaea15d7b850cd3881a9b903d46e045aa3bbb659301ad6a603ea744d50a48c0ec854d2afd47bcd9cb0682e244eb9458404c9f4027a16e3eb820bea1bef82066e9a070376c10208800044793da6a9178eed326192404c298df5fd5621a3dffaedff7f93ddf6de7bcbbda59429c9370b910b5d0b34737e93ae2ef38ee95a441bd2397016218ae42c81c5f808117615620fb147d3878347f724c2865a8abfd959a8fa16aa1e4d54d3344e9b7376f334816da72abaeaa6aa9e744557aa1621a1aacca736b3393b3223b9f9b06d5a582ce1c346f584529de8e4744ebf5a345f9f4a9608e0d2490518c08c4b0fb5550d1e6a38353cd45e321e6ea86f968d7603000f35d70c1e6ee196b2e1a1d6a2c1434d67e4a1b6f3220fb722289216d1155579f53984a5abcceb91942cc9204b31b214832c812e5dcb9125185ce64459ba7ec3a32cb9bb803cca120df77894a517dc7a94a51921ff78942518f73ccad28b771eb9cd694efb5cc9d11480936e01ae66a3a9341618801be5e80668030cb51608ace14639f2803334dc28471604408d1be5e8038e40d1dd6aa21c71a0ccdd502fc170b3c9c9bc82f444514dcae889a2288a9e6811f45429aa66599f4e980c574b69369a4abbab97eead974e6f5e3a0d18725efa0bae971e82d1765efa4bcd4b6f39bd74968bda6c5efa3cd9f6e96ad17cb56b1e6a5a385ded3d689e398fdeb44dd3b4cd5fd335a14cd774f584f2dab29a659d840b9a1530b20bab398c8462ab733cbd5eccd9c301f3687ca8f1ede1407da8f141daf9b58b79bdf4db7d884d7ca8f1150c92393f8fc6b2da9de5b0ec8c79aa4559369dab73cee97cc35530dfc07896086bad5ad56aad9a4d76b59456a449596b291e4d96598ca301f871e63170bd0505a993187aea6609c2b0ae51114954d5a29ba8a3fd03adccd152a924b42a5e623409ad0a8d8a28925e2bc845d28965c71cd46ee20c097ad5a22631283dccb2cc3350d6ca2f39929873f5de38815f350963ad34d60d521d22d2882ccd11d8f9d3e9c71b1dacb48f2d2c5a1f36aa6b5a5290e2e38cd96717e6bfbed873392c579e43ecf4189a14c6d09c16a57451477b3eeac7b7def9c73dee798a8398c94fec48d49288246d07918948ea41d4c1b3c5363c508ae7f9d8603f9cea3c9a352c9b4258fecd3377ead1a405e5820a2f4f272cf3d9e298c04063baa62bda901eb9ebbd37456019fc3883a12d88f7381b704e8b9cb0ccc2ce0fb5540543d5f931f66cf1a4453ae0cbf371c96b0b3089a7aa2892eec49d71c0ece3cdca4649ab455236e1e9304360c35ec9302c8bb778a8a558a5e56a3772241b24736adf50c379e93304dd4a6e9a5445d4c1f153c1f9f16898a6e8499e6e9418427652669c79345e8d968a3af8bd1a6f08936f4c75c44a8925a0f842cd08247440cbb02cee9e7f7cc5eb178278c4ae524f3c0aed89c11ffa19067146f2e84d53a1b45b52c0980e35aaa773d36b80e721763d06e2abf50ca545d25b2fc9c0ba6b5ef6cd0db888373cb0e2638a5f8e5141eee392970deac7161654749ba64229374445454545c55d5c9e789ba6c25131723eaccf6ed2d12e9fcb61690e0eeae4c2fc7787300eceec7050275db09e5feda3e73c9a2ff69ef78009d29c16519d1649a72f3061a2052fb360bd39b960bd4c8661a97fdee22c1ed616965a5740bf21772c47e9cabbbb31bfc1867eb457af0dd29dcce78de71bd607a4562bcf400cdcf8f65593f865ad1554aba8822eed2d47a8b7783f1a47eed89a92a32dd8b0574d6a3589c120fc34ecd2bb89c66952889bc41eb614b48816490ffb869e28aa4512c783401fd7423a50ff1c0214fc1c02518e54b4603f57f1937beac320cd5d8f865b00067a9cb01eb2675dbd413cc83c601b193dd122688e070c6bb560687f4b0143d06f605853b254e568a6664ae5de0871e8d026eae29f1bba6836a0ab1571c982f54ad1249d7a59d7a5216c9324326182880f63be67d0437e143bbfccf94a27c4d212b8cfe11d5ab4b14524792e455b702f5ed229bcf48c1dbbf1dd1b43774c318f0ec6a0c1408b81268338239d5e4e4a302ce6d3477d06b5d417b6bab310927a18431bc7942452f1831c7c764398d797df1e0de6120bf265a74d4b2fe829ce488f3af8e515ac66c399877af4cfbe1b92abbdacd07d5ce2450a9a58118fbc8c624a28e6c4f9c0b373cc91abe7797476e5f3ed4ce695fd0704282dfa9f173d03eb80e1a3835147634f991ca10b3b57d0858f8ca315a98265504b51c19a3e116334781df9dfe9d9a3912e8b39bd4ca97f1ec6340d3e3ac7df8da6befdd9771bd5573ebd49e20d0b5cf0edd1c829588c9419f150533512d984b5988131442e46992903eed9b3310ceb6e8ca5bbbb6b9e91e02598776ca09a20ead800e82711310591b280ca60662187658f29c24d11c299fa9b26cd9494820db514bf62d0ce3b70104bd32583a8d52092320725f1529b814d7272e2a573f46483d3112f3da4a957e2a5672ee729456d5e7a6fa0fef4b6b154553d4f7259c795cbe855af7ad5980c33b4c8d0f87823822f3eaaec746e761145d3d54da2a7d9051139ecb45147fc0c6b0d072f3fa71e6a46ace824c419e97cfb8a3823fdfb9c5e2132f081dda447d2b3c6f936354b8ea4f74a8ee4679257743b2e5a8a77c497ce9ec709eb1fd21c8ee6c89206833892aed51c598a26538e968a82d552f26310b060323fb6b0f0e2c346a9542a554e18c457bb1203afa47c64120328a87c3e31254ee50e1102012dae7287a8b4a8a8b438097098589c85a5a53acbcd9c8b69267a1545d23f3145537dbc093cd624275d9a353535353626596337cbfc3e3291810b3e1f99c82007524b69a90a86b5da905f41e877738221fbc755ee7763044366f79c87e40dd0f77cc5a3f9704a10fa9da7783e3aef9c932186bf710755451bd22397e23c7aa745d27de0327ea713a3491f97a10645bb748d0631e0037c2e5d8341d481b9d46c5e6a3678c960a8a95e6a4720b1c401543cd46ef0d2231be0e426150f35235ecee71fbc36843a8b73396c3733d7f63955422080e50e21c10d93105c8629c991d30d133d72c261a233b6ae683d7b8b47c3edd1f8c0653c36e79cd3072ee3639ce92729dd0c4d791e85301ff0db3fac8790c04d9107107a0a106ef2098b5c14de78284821d3c927489d193ac9858e0db554cc19717451cd402077ae4604613debc5e29c13c3306cce897577e7501d598aa62877746013cd7182a5a7266d2e9d16d1a4ead2a9a444faf498875a8a1e114b2bceb5f38b1e1195f81a0ce91335740955c51929b150d1f0edd6ac46136ca8a5e24b0f352d342b4a2a1e6a54684b5e9eb4cf8bf6c40ac82ab57ed6822fc6821671245dd3c0b05690828c050098e04c43d74927b69ba1a9dd4040a0ef1bb24f20a00ad65083971e8a6e2c69a9906ef1d2c319ff124934278aa4f7693ea9499a9197320b1bcef6ea5c5fcde66a29ed6a4534502ba2d934a9c1707e839a8d96fa504b494d3ab1dec72526e0e219b411455df4fa395187cd66af477d066f744cb58833d2eba54b8833d2e7a55bc419eaa447fd06698edca24897620d35d490c372d246065f2fbff4708853a4e03d7c638b0c27be7a9cc882c96b3eb0cf9c6b745ec3a3e92892235a911e491f7934d639cd46b3a95ec11048f7d5ad73f56af66a29276cf5504b6945a82a85aa6e2b1147d26b783fe67b3df87b1567a437176c48555a11cfa56ba9265997aed9b867effce8791e78e473183e10045df50a62a0fb0eec465ead5d18c473e7e69d8fbc1ef53d1ff900c4571f813d6c5e9dbb1d4855ce6dbe71dbe635bc1f1bb852c3b376ab2ea9ca39f768340d0600783f32700648918098b02155bd74aa6a129226e9bca44e5a249d068f86419ab3049bf974ce46d734b2c49c00a41636a4bd92392f5de6581b7ec952a3e248ba5c72059d974ab0d8c7d615391f362aeac05eca2c6c25438a8fb1449dfdd68f5e9425ca26672e879d7c694e9c912eb10869ce003a8fcef5eda7974d7c415147fc58a96c6223768f50b06339a9e7f96cfca4a8c4b8c2d2e2027aa1e1382e4134086610b2bdf9040d22a0790581d85cf379277b3b54df4020b013d898aa9449b0ede194a3eef8f1841e3069379a1848e6d16bc0740cec8182a06df6828b3132f6a458b6b2323195119511acaeacd4de9aebae3d0f17ac26cd56144d28f6c55b3c7a9bf3d58ab448b3e931bd98ae7905e9fdc03e84a6fbc060e8c57990c166075394616a712c95b23787214356fcf3212a4eb554add64e30879716f07316dfe17316108824ec40acf8e70cee409dc55940205484b0f88a0b797115157f71212bcee24254fc85c5577c87175761f115e7e1c555ac60852411d2e29f0b81710ac50a49b203751817f2798b0ba10ee3ecd184d87768f1cf778071ead10b31a8438b7fce038c5357718cbf57a10d390ce00b357506787ae9a0cbc432faa2e2610c378383a10bc3a67a899c5e4581eab05667af6874f7a42bfe5113d0d39c58c4587a324e65c5a9f3f0f9e714149264071530c4ae2284fa03a289ba8a5350081049785001857c4e5d48921d3ea7601026212baee23b50577176151088240ceea0e22c20102daee240b038e5d8a3c1815fa3d19ca8a269e5521650c88aabf8070a49b2c30a186267f11557018584180ce9a0e29ff3c0026a2c50bbf9400ad6e964bb9a534a6bac758bdba6793435737a449c4122ce248144d5cd6d36bc94547c072f9deb3a8f6673ce8b1e4b0f5d82e65088a55ec951fb8076c1de744eab60df23f41ed9ee91cf5f5aa2d77139ac565bb857b2144dac16cc03a209f5d2b193e9e54693c7a3c961c89028472156f3d287d01dc97dddcba52c3787212d6094231890e6c891eb86180ce5f0f98ac7df81050482ba8a7f1e4db30a52f8e945042396e68d1cc9f9846d48c70274d38597d5b99498c2b2c9cd9327ff2b2b1e4df515cf4737a6c25d58fecfa95741ab2eb621dd099797f8c2d293f9aa5b3db0b0a196724d5659093d95245e8c63ddc7a303892fcd797477cfeeba5d1b868b0c5258b0ed7d05cbf9e48c2f557937c4ff7c41826d9b1da78a5260197336e7cc3210e3b00bf48079c95a7a8238532a3916b99981c46846e8aa00cfa18e679f7959f10bc61d3244d2e6eca348ea9c552e83a1009ce30470a98aeb76f659051bb23adcde0978b7023aeee21e6a823873621bd2bb4b5310291151247dba523c03537c82ec4def2e6dfd76579eafc709eb930a36bb61104aa2143e04e0cd61acdf6efde83980a31243fc76533eeea0820d83f8d9e4a3d70006435267bbdd4f97056201970b08f480aeb7c18b589041cc79481e8dddea3a6e084ab9216541697ae5c0901f8800780a96299295146c4855a10c0469d1ebd3fc213d45ec13760d7b3e5cf9330a36e417d80512ad264578efddc86405e5bbdbef3560fbe93cba7fce95d65882d01a9284bd8d28e1e9659c0a055b433f30cc83f8507bf22e0dca4baf1e2ba83d81e2d261b552a968ce6aa542a2522159552c954aa5322d1567b8afd799ddcfb22c95ede4b0b014762fe637740c04b21603e98a4df306a7491a7633f985d338372daae2e6a60a9cf974f20e12dac40d3316bd0c7c62e7cdaca27d4eaa62bf91734eba6a918a2261deb8e3e78c27ceab4592a3109937bf3561339deb74cc7934c879382fefbc38cae4284dc282ec3469fef38bbd62e00ff3dbe969d3b40e44c20553677a9ca8d80e1d3970b8b4c1b17b7f7a3e7adc528a478fc60757af00bcef7d7f7fbe295e6f4873fc7bcc1b2e20cff4f67a4ce76a57aff5e9f9e8b100ac082aa882cefb478fc11e136c25c10907bae909058b397b6b4f5c8c61181b91e219e01881fa22b772c0e256461c61ad89978e35fff0c226ea18b1e2c3186c880a7ccafd816db8e1a6c54bdf71c3ed8997aee3861b0c422d8c978ee3869a162fbd7443ed89edde17007803740141a0070c69ad3e2c7869a6f6a4091ba5d0e10996bd298a9e66b78d0d17d69f8100b21f9496422549c2878dd2b1f7c32cc5440b88f0849d22a8a00a3960cc400a5cb05e3a4604154c5e3f75b0940f9640859f3ad63f4c6208264ff8a94373a20e76e93f70fb2cc2aff317736c3a61a6a6cd9c73bae69c73ce393ddd24325d369a913902ebcf2e3fcf54e51e8ac9115554ba041e51205481b25ef228a44f78d983fd542b55fdc04db00ec6089e4c8109b657d3c8cdd3cbd1d3749cd868c3e7d227156269823e9fa9d94cd54cd18f2cf2180ac7324560359fbe044aabd544d5e2a2d11445cd2dec0ffc2ea06c3a56b3b9041b4e97b661d335a3d4fca427556b15cbb8e75c38cfe3b69468e2b0fab57eb4903bf778d88e815cb7dff05073ecc6a5a73873e3cad76e7c7a8a3ae4cb48faa19f77fcc07ff963d481615e69ce9c0e02fb7117f7dc5e75b759394e5a512802857804157ca6f904c3eebb82dce35a13f5aeb42804027bf4836a0bab55459ba4833cd5f5310cc67cf368b0ca9cf70d9bd3d1c26eee80cd499318c440f7ec59c7556ec618db9c8bf2b3d22255930f4db047fff41b27435eba76d3a44b1e54bcd169a2e535d64b5aa3f382f7a06eb8387da8dd1f5e146951fcbe3fbc40b5283edf1f5e10493529b69e18f1510b3fbcb0f99151e13f1fb7eee2f5e3f2f960f1f31c24d19cf89c055cb9a11fec1dfdcea92a343d499c620a263e499c620a9bff6e683adbac72d81f1cc0205dcd1c3b4f6095603bbf01863a00448bc8883b4c8c180113246890cd2cacc97ebcade35cb0003579b9c24ee7609260a773a11956583ae3059c176040020c348e40c38d70abb0f38245006320420c3154c4c8702383cc143ab2f4b98c6c3941f2b1db99413404d14808a31a52585a03004100000d4c689859325343ab061b40b071e3073702e08300c078d305300025032040140428001405203d412ab14a387a600f405d3a8723070f72e8d871bde93618c009031ca0890320800904f058a279f06b0b1e783e3af74a586ed5d4fc7cd3ca94801dd8990005e8c0ce8e03bde8309358221fcee797530cf4141360437363ad0812ee2394419a4375603c4cd820fd3d8061907e76d9e9133ce2fd60d79c8b1e0eb707f666cf07e6d51b0bd21bd07c5ecdf9f25fb1c3495824ec064e9f21aee1212a1f974051b59a34811986e51136d41e9f2fa35a4424e4b5ca86309f1e3f84813dfab176addb90b89e80bc193168b1fe3c62791aa175fe420ceff386774c70a6a20de912bca9ec3033073ec11076ea1cbb7ce222f8844d23b60361260ee4ad1f25d8b9e621bf1ac3300cc318e3360f35264bac1215a5a5725ef306b65936b0d5c35e61188661aec120561bd82366a83de11dc5aa9675e00f93b5549ce955ad76dad82e069ebce22c2d9fab30bfbc74dd6c615951f9422d99733366342d422469a9987197433b50fffca31e84494b451dda6b2a279aa6691adbc8114d75287edeef6b6061fc48e64754e2145650f1f3aa3ccba78185d961974471126f4e46f8d5a490e684d355a449d18a1f45a85a449d74299a54ee100a26a9b5ba06d2538b32ff783459f68952b29d9efa63af58c04c57aad999c7a399b3abf5f3ede38d12293903daedcc4d4a59bca55f3cd49650f195097ecf6fce3999f9b31e0d77d374d4f95e32187a6a46683492ed73952276cac0ce8e3d738e993d03b554910a76e7dcf5152c7f1e4de6f9617e10f90cd23b44882f887ccd3be7f67a60de7983474ededd1f57ec74600d7d5c52851fd8c4c086f475f37d3f2f6d9c4ce1fbda675063c51918d890e6dc890ac1f7fd3e7a3db6cde75432592d92ce7ae917ec620e427007ec7c410c229fb91f57ec70a7a55c60c1185a6043eca610833dfa37242b530c3193880d69ce74aa925b4f0c26d4835d734d4b550985e586d0cf5d3e3ac8cef5f5dce0e52df9efcad5f38d4c98e0e4bf2b5b5827a3b09c5624cbbc3bd38c70d61e2d255f562bc24efa3330ec9e0343ad499bb7b7cf7a433d3a3e8c47d3f56aaf0d897bce696165ca960286b3698e4e931ad43cecf901c18e9bf1718917504c9b4d6661e3731e6e9ee5d09c6de3b66de3b84b75b44cd3e1421abf56bbc663816dcf409ad3aee9e4e468291d9d1c2739394e74422f730536ec15e8e38d0eb460d3af55a182c94dac56322051b1aa674c2cd1c6b22f6cd6201b6991649b89b26c83bd4083bbf828923db51ccc145895d67239875d989f97ffbb8dd2798ebb9e28b0d1c42a60f244146c6a4cd97373579f27b0ec8df56a7ecd9aa999e2fcc3f9100e1fceb36b2c458b5a20aa0b1ed01c2a9cfc1661432dd5375147107e99b2291ea765374958b0da0e0c2d680343907b064e0cc3322cc3300c03b38f172d92597c04838bc7918122136547e77bd0c7d1228992a56f47e526037d3e9471553ae5f4ac499613e7cc3e9c2d8ef3e673b20f656610628906aa4545606f6259966515cba8e761cc6f9c3f4033611c239d93a747c3b4b72b6bce4bf9392c75aebd768fa67b896fa7b7afdcd57cc44f718f26c56f80cc1397e2def5a8e0b98b3d3722c007208aa4679ec36abe848d5878e9a14c183604218e1986908e80589a758a97322ae1a5734458cc310f71c812e8025d38546e4072e45d9091e7eefc14eed21abce7dd1425cf5df929373e10ec04a5832e2852c6457ffa8c250ffb8442237569a05666e87402cd1abbe3922394c4893abc67cf9a34a9bd9f3dce4e60f66fa7f5ec392c9d6a726058192832af26b52c4d18970bc6254318578ee72933c51e622f6100c3ca81a1ad6008f2401b1a280f58a3e592253004310c2e19578d2ae6f47e605fe3c6cba1464b068acc4be6d58dc0d668c992f5b086ebe54d0d9d8f873572180c6bdcbc077471f6b2e97365746470e448d61b599269c99194ad9b97cec9386912f69ccf9c26813c9a395bd4e2dd10655a7287be9c3237d6ca58114b1c4773cae0c8e45c11753469927c124556c41d928b6843be8c1591c451345b264796a4cbe070582783134d931d743517e5a5e7d541284daa0ebe2ebf77e78c8f896143ec5d8d6948576322819b928440e6e9a76f384c972ed8ef1567a4772a39aa2a3798873139ec74ae938c3acc85e0d7f6980c9dd61ad8a35ff38cbe741928515efa0ca9198c7429620147264a93e214643c797933e46528f39ae1d43653bcc4f8700614d599020b28f870862259c3e06a124c08830bc6d5a470b654aa6852bce293f0a14a932eca74f132ae2892cdbd877530dae439b9846dcff45c5ec9194dedf9009f7aabc68632210e195793da27f8c37cf0bb21d6f30dcab85a340611d91eba1fbd23183731d03d5704866d6f496103f576e921d40da5a837057b680f11c19139754933a7de03f59ead16512ae3a2322e2ae3a2a1540815221222124285525ae825e4316f446043951b1c241b4228e921948b4baa496d3f2e594108546e9a440305d24081ae1a3c50608f7aa8bd7ef7df0db5330eca73430df6b8df9e244ef1c5163e499ce28b20fcf69e9b244ef1c513b85ea2bfcb2b6e76df8d264f7de9d150b007f89d8d0074350db6219d58130e1c2db3234b38e248fa6cc591f419c8f81047164bfc0d0c63ef252c7b0ecb32aea8a3e5657d99282f7de7a56b45d8e93864b0db4bd870b6240e6e6039cfc4fa813027d7c429c038c2f3ed1aac0ca7861220d460b548d668bd9461d550f2d261ae0d3d922568cd96b5d6f3a5b08cbaedf6168347d3b977bdaf374e01c690e76e36814cd76f1ef21ad01f5b36b4483ae8d16c200e1c322e1917cba069220f74e9c03527a3f34697dde66e74dcdd7ebb718a2facf0dad5520fba7ef370989cad41c27786037e3b50d86fe713c3d68464bc78d989c0c629ba70fa3084fa2c6cd8a9be1dd025a4ea9074c986160d990ed3c240970e9a69b6e408c6b344081542bd74ea2ea9d97249bd741b2d19574bc62547adc42ace489cc7c4b0210d140d942c618e830688c313c28632ae9732ae196bb0f9184306020e42520a14c1c598507bfdec6ac5bc7628e25318cfe5b0b209c98ac130efaed5b9dab5b116e24307bf70fdcbc79b29b47eeb68e89c47ef40c337101a14209b60c366451db29ddcc41b9a1466ae791053cedad91550f51e7ce8c067fe61109f05e9d77cc83e73ee869b356103fd37ccc9ecf9c8dc0759461965dcad0c7ba4260906aab783200906aa877e60de8e8140e4679db7b787030efcd5f92b18fa889f01c78074d205919a6f3084c3d7c8e40485efdbf2d1e31c9671a46071131f1070c352a29dc0862dc546860d63eb0b7b43939cc70de00d2d9aae80164dd957e0a18026d5239c4bef86f815fc613e1056b340aceef6901e4d2e7a9f9ae40282f8c329ec612034bc4bd7d0c0baf81097e901adfd803c1fd2bb592e971ff3af6952e6d37b48ec9870c6672b9f7546c3f390a556d2a3e9dd070ce3cd0a080c23ce0c9719362b74137313700c6cd618b65dde064155588c477596a2455c851396e206e42a725c7c56afb154ad0522fa1eda5dbcb667382e1e320e37498075f1e67697eea1c190f4b0822109ee10e52804227aac6e801f7371ecbab047e302720ee388613db134c3b90ed45dee6a5ee6718e3b7e92c7a7c75aaded3e6c1608dcba603b876daf3fb061779396a24b26244e62b35a8909c993388a1f7615ff82cfda7968413add59cbd50c61e134e933a76b271bb2ce4fef9e4be1d1a229528092e638ae9300f53ece7d2e8fab80167ddee2373429059cfe31465e08a57c73aa160c09db981e7edf757a2f1167a687db73de600844f437ecc0bde1f268d1f48d0b36c5c3d852408ba6a7388feedb43bbf536a2a2e221233f1de63610a268facbed21b0683ae8b6116237e99c25a46ac5a73712169fde2be92b8ea9be82487efa77c85cd6fd6c77716681613bc83d8b31ecc05b075d66b568bacb0d39f0d65b6ec8df629d876cb9f1596ec8addc30e5c366852ff7879972a3029ad4a48f4fbf21e553b3239c67dce7ed0d6240f41664252d9a9189ae69d1ecd316868d4c9038797ed2a593693aeb34a97db663a5e972349d39cfe567662d8ed8358eeb30ae3bedfe284215df03e3fd3833dd65c9c4a3e9336af1d3c352126c24c2e4b111c186cc62d956d26137017d1c25e1e65f3e2e4982ce739fae32194205cf5e8f23a11dfc036b92540ff14043473a8f262ef4e4bb164dab8456eaafbd20399a3ea3d8be91251ecd922566c5d1f43923eba71592f0ccfad6b6637b65f3d327d6793e72e8bc0770de790fe0bc5972d4c44fe7ee0d3207a9440769e22147d337306cc82c66296952fb4462081130f918450d24e6abf79dae4d8f71ba6c068672f5d3a7cb6260d8ad9fd3676b4ad1a4b06b7eb262cc047bd05e1f081a03000e5a5cd8e81cb3d4c2ca523d45309cc01736aca70f42339d5396a3b215d5a4e670fe44d5225a9435418115756a11d753f57a9215d5a4d8310b24e97472312773c2850d410e881fc1506d9124a39778b1cac9709a5441efe7ac49e6e4d9591fdd39aed6222de26a9382d951957c5db1cfe8129b6878f6aa24b56a5258554d14e95234558ea22c0c8267949e186718ac45b48833b09e5850554d62af489ae40f5230ac130cb39de77a8521acb4882519d66d4dc5cc254bf51447ec35f55c4fb5c55b1942a03e522184cdd7f0910a11e8bcc7cbd1fb31bf3deb7a466e4f8c33611032d82149e4ed5a44dd362992a6cb88d17a2588c3666008037b3c7d1e4dc11ebc61c0c5580f57ebbf16d6b3972c653a72d4366bc952f6ca5adfd9ebb16f97597c6c8d71fa2a70d9162c4805b44392c42e4007808b1cbb38c4724627086c748e228eb1e5fcc2460ff939c6e86982cb61b9d6151ab8193b24494b1f922482b818d34ddbe36cacb947a06b3f4fb6141e754bc9fdf27d294f9e2bae3dc684f2e54d8ad2d52266e98a1ed6781e81ae8d34fa88cf7186a59452c6528c9123478ef2c5f2095d9b1211454d89d0e273ad31c8787a254ec6556ddbb4b9756bda29ead070a03d24c9cc926cd543d66c52b50776cd66891544309b90fa1b1f6f8a703dd77d27d8f978848f372750bd11727e868f4b8cb0faf674a8a9e165a21e12996ec8916946b121bfb8af809a4dd09e509f9b07ea40b8b04c9f472f870fe4214738c0b08e630914d73c815df2a282f6849945d7cd2f3a9d9519cf9c9712052b46d1c2a296a39385b51fea5083211d5a1cc67978711650088bbf380c2824c90e2cfef2e24260bc050cb547538b47539d2c576bddd022e92f370739b2d22716e28d56b3b9a48b235cf1450eaf175cb278cf96979b176660a109d31ccb65d374b134e188b9a344cd13d36503fab51128d81af250bb8141cbc966a8b1de412d256980515618c028edfd3c74a9c3dc1567b92aaea566dc680add6882b9d164b251bdb63271fc9225f9e29db65131b70d77af5ad5aab6316263d3465aa5498f26cbb8b5d44c49d08ac77c14011e15cb6198c7f3d1aa8ae5b62ec3e854b176dbb64de5b35badb5c69bcf67ed0ddba6b29b7b3c46911c79377a1fb0ba74cf9bf7e6b6a5aba0f36806f40d93bb91490a92f8caa81b18d0a5688a26ef4653968d02506badd289f5d7d8bfcff9a3f9d4d7f7b9a73fe7d1f5254bfc62569c91fc04888a25320ad6df3fbd044a149f7b9c5f96447224bd565b3f602c5940fbaeaddff77d3b1d68d2f7398fb64dfa40c91e8472a1ce73c4731ecd1fef0f0c7d40fe8898dd53bdab6b37e453ed3c7de557e99ed0c7dcf7f1546dfbbeeffb6afd7c1c7f36ad7a4422c681d2d18a8d7b1a5a2499c53b545efa7644c492254ea536236c287a19e3c7ac2629b979e9ec8ad2a5d18aa568525ca264f5af97925b9cd3a8254ab6f890755e4b9608c2870ce565c8375c5f4d0aa3eb779a14c69daf512c50c5f8283cb340167506c320f4bb219f5ee4241469de8f76cd99c5621618f2e71f8fb787fc1fffc09007bc21bec73ffe797b341e300c42fff3f9aee6adb5e61df19c862e79de65253d1235a982348061c3b86381d801598200152c273e8cae2c8a7c187398fb2e4d7d9c47d354933e974eeb6b092f9d5951c7c7a5f30f3c97ce50f0013ccc3397ce4f441d1edf6e9ea9f03c6422741e7212a687cc64ce217c98555ff1bd3bc4f394effbdcf33cc5f3ba69daf37ddff77d9f7f1ebd0f68af7cd26d5acd303a39c5295e65ddea630c41f404c10c82b30c10e1624c18b29125367113427cf7a1e8b9d8655d4491e43257751e9d7501c64b979f17c7b47a77d71b253b00e7a19d357224dd5690dd01d978a6d7437e55719d5262141bc2b631d8034b6fdbb6da9ef7c99d396be494b3468e36975758dfb66ddb368c0bfba2928c797f37f4a4a28e493ff613ceb09f578b9af3e81f305e4daa59966599d4d92e3f16051b1f7b623d0f11b1aa9ae4399d9a245fed2122922418d1a3f1388f961e8dc7b9cba67aab6f1b3604cbce436e5b85419c89419c91419c2972ab919a7a1b206a762fc03bbf813d8041e4bb49550551d43b59c65e0e379ae41376db36dfb6cdeec8129bda6b2aeae88a7a517533f871a9bad39cdbf40df59b576b7f6b00ff06869cc9cc7a4e1ee7a8e771ee46d35cc2db1613b278ed76cf456fdbb68b69ad039bb27a02c36cc75304fbea9d1e5a344d8f9dde1fe6e775db3cff3c87826d0f3f4fb09fa78ba6184b9e14c491e71449358928aaaaae9e14c4d2670b9e932c7d5e3287dd1c1b82ddc0eed422365555129124a34836f88068eafc72dd651377ab97fed9022b9290bc74d92911bb23a2082547b2ef0ed5394e3e61bbbbbbdbd522e9e9505db70af1509d73aeb3913bf2016cea5272d41e7628573bd80d7e5c9b872faaedf32282e661653284975e91784e9f249290e01d9e5355f18eaea94b1e8a979589972820bcf41ac58b8a559b08ab125f59551567ee914a29a594997dce0ec53b24947e51f10ef9e217d5672ecf8977643b9c7121ce4049198288974ea1bc74f91241ca9097cef2f5d23357f8e9c24bff8cf1d23bdbe11d9f289c7121eaf86821cec8cf16a26b2945bc4c19c14bff44e11d9e53b4215dfa470b5cf298208ea4eff018116dac80e4b9410a0ade13831412bc043d2bf890f1d23f515ac458b0ed0c7e5e2d92ddf7b3f379f527ca67a7490dca495f6048c1cfcee765fff3fa44e952d7d4d4d4acc0248f1047f1793061087194f2f4254b9e21e248ba0a60405f1e90be3c272cd806fb06844d5cf4989bd876be99730c3621ea5879e99f9da843933b7224433b542038af1e8489e36e8807ce3befc079ca76e448ce9a2b6cf879851daa0836ec769e7a876ad2e672c2f0eddafd21641008a683e46713cb850dabeaf39a55c536d84336b4061d703126dc68c63d3b2e620822ab6e82cb611909a718d59271c660020e160d321882b015160f639ce38c3de77258958ecb61637d0e894d71954e73e9ade3a5b84a0b3be76d5bfc6755a8c79821493aff9a58f048a58d6ad44e0776a64c516654a3627f3afb791e85644591d46e34e5b03dea77cee5c052e7b6cbfde77e177b7be316df5df9957e3c0a8e0a37c131378babe0b0b8ca4a6b5ac56a6d6f6fb087cce7af64debe9239df1f2e9ec1c0b478765d32cf668b4be63920c5433870dee22d600f3183f1f695157681f9a1f31f82d4b7fe4310fb9f0701bde7dc0db578fc946c85c555405eb19ac4028659c6ab8ccbb82ccb38ee328b57dc04af78c54d308b9b73b55ac9960bea195cb16065ab45222984a56c8a38384aec953ef8419c01429c91fe91c2c7081500548e17e56202ace73c845b5d579d4bc28692f5b954d2a521247013c885f8fcc57b5e11679a90c03b07f31717f2e2a14cd5974e6ce71f3b87b990178f6bcec38ba6611688ae2b19ec813d4a617f58b7be5dea3d81e78fd31bc2c1d93a17bd1f937a96b094869bfbc06f6fdcc298cfa654d223e93c5aebe6e5acf3afa3f485838333b7ee868166dd79114334a805f6043f8297110bcf4795457c1f288b5c19eb673ee24fa924092b51a7161dd19c254b1a58595857d75c88c76f8eb079047cbc510d79cd6b4807cdabf3d0d535c71c04623369600e72243de2b826a54d93664cd34080c9cc2c53eda12cd22239af0581ac458140d64a9b54938ac8944c35898b48955c3112965d9e244a9e244aa2e44916214ff2248b90a85ae5e9a53cf12bfb32974a48020cc60181401500b9a2681d63f5f3764621305d76f74f56e37047d89051afd7ebfe681580558e15a3186535d473291e8e2c45538ecebb1a67490e153a2fad70a150445e1995a957d4b15a81cf9e51ceb3cec3986ffa79279f804246713bc98a4cf04ab2a40f22cb87921575b0bc74ed82b260adf05246e18510b19063f08ece434946944c78e94c6452fbde9fd758d2fc0343f609e67413c960e780dd44d221b03549df6ea35ad4a946d154a39a48a31ad5a4d98dc26922389dea22381bcb1b595a31b12628592ba6b057dd8a893a62a957a2efcba838235dfb8cde39af7ca944b25ad4a826c29f647db751b2f57ddf952dc9924a244bb29a34fbdbb64ea15e2f7ea5644a8b359329999225f984644996646517db810d9be42f3de3018e929b26c5256254e143ed514ad1a410952eabe01d9d4ba79787025a243db6c430c287b17503035a244f3ba8a883ddde8e7d6a9a0cc36ace924ae48dca5a21a594deede75a84781c73212fce853aee3216f88b3803c6cae5282c200fe457f5171782b9c785547f7150c75e48078f63cec38b8774c0dce33c60ee015f78a8fe0202b1993ce00d39920e8a1e7b1297500341fc7417e7e95dc86b00cbbe2e2e6eef777f98ffe2d1b8682e957449b2dcfab14b55bcf47abbe51ed1b0cb72ebafdcb8640c96d7797c1c236c8aab808cd3a2941bb2d31c1c9c9c1c9c2638384d72388e717ab5c9948de1bef209094577651452090c9285028f6b2ea43ae6423cae85618524d941738f0bc1bcba10cd3d3478c0bc3a0f9a7baa63ce430579f080dd9223b999a229097bb2566bd93def66ef5647ace7b964c952d76aedc7d667377bf61a40e3bd986ede394691cfaef6ecf5e0e91c7b1f1fdb8fcd3330f4017f58a7eec33af5203e7a3dac533026ce4ce70f88c873cf2de79fc4e9285107e71e6f270dc503d65a31500339ef36ab2495f48c19922559ddaa49dd77136dbae940c9e28cb0ec8c6a914cc9229ca294868c9229ce707068e3504e318a89308a514c84535d276d5852896c4929707070987124d73ab2244fbd1347d2e5a977706e7470c487f29445920f7b67255728d40a955deee98d4bc4e0c2cf9b799cb0b2c4ee388cc3388cc3ab8c57bc7ae9dc16a365208c699a031b4db5a3c9880d252b55abb5384dba8479478192bddac90636603700e215f67de3167f93c425638ce0d9a3611628035bb2a4120e07967ad82b545b8183d338d21b25b52a63b8edd5416820e020a6c62710838b31610d1b97699ec9a7e1fd76b55bb1ba45cda19ec34e9689222346b7e290b4a86fb7ea5401a68ea8c4cd92864d0e3b4533820000042314002028100c0784c2219954a829a5fc14800b889e4a74581e49931c874110420619431400c0801920001888b60dd2bdc7c0ca63fbb7082cae1cc64fc1c112fa5803b89d34934ebab626c663edb731291bc4c5b9bcacc47473f53aa5a842403280897ed9fb27bb7999f01cc172118778f06afb5a46695bfafa5bba8e07d0a7b9cce5b8f0aa5aa049b7b874fae50b19727be53c784477f8e152bdf842d6e633f8bf77795cd8c1cff32984ec70daa4bbf96b901f16600f24302617513ab4ddae99770eb062c8294952623ab36d7904fa59cea775a052958fd6bdcca90ef8cd1e2d04323c17bf0649a10aae2472d4172d483688a3cea681bd8c77bcaadd71c796462a4e6c68372a3cc905cae5f101bf20dfb282e88bc2d79e6d058e8bd5d79e12d878b500abd8ce754a0ae43d390cfff939fa0ebfddf92e7ad732a6614c75fe2a39a96214ca66acaa9e9f8952dcc867cb603a120cfc8b527a66934d9b9eb78ddbcaa8ab37dde7425cb6bca0c494b861d219a49b9db003c9ab154828760044a12e2a227ebe7e284ed3d7c6a9d4683f2d480577b9d3d22e1051b76ff5d5e1388999a0694b3179b694dc089472533f6c48d80bc1279bd6bfbe9a642abf7c0548add364a0a0409df8ac19ec036ec0cdabad967bd191da211e75a40ccdf8488e9a34d6616b9e87e56a183a19bb04f5e2c11115383133c42df22f0f96c053900d6248feb9808c467f090844673ddd857fb4c2106a6a0733edcfd40d996b416bd9b27998c70a60f8b12bcf2b56a72548ee2393a5da3645e295039c00d7269e0c4efeb61aa14de76271f52b01e113eb8ef5269e2612307b34e606ba1846c35c00dc175cbcff4dc4010797f094a51d3511aef5ae08787d28e615b445b4f37bcdd5e7f3b0800535292ea300aad08fba52c94a90aa7e20860de6860e5095bea6a1a23b117bd627ae9a4e6f4d759911838f86a0099530715f5c3767b0be5a22c028c538a3f952ce3406ab64c0ec2b3dc6d4d873f48fb24f1f907f920e4fc90477a237b6275a997e61b4cd84045cde333cd053d269d90871db92802e13d0a426b1fff43f20347d46bc7cb0788a6b99c0f80827bd9ed75af9eb6abb2876487144dc8bb96bdf3b047f4907eea31ce8e0551d4178940f682c1668c116c2cdc6ccfd67b586c211b1123c8f882aeacb1b9457ca9f08d1b9efeeeebbf47050edc0cb9f257a80b07020d6910684f0923c60db3e102f7740114a5a3e02f4907f904556837c7a9aa588858b54cd7c1da9ec737b3f15b67446dede0c84cc65277a8ab6a8e70f8aa8bd00bf01de7e4ab665fbedf5d30eff1e83338cd144dc154886626cd48d2ccf98bc63682c963928eb79565b24bee1f721c518ae8386a3ce7d65773047750779fb7a74207a9688d88b30571a7596f3e2c59686376a8a577aed6c4e2a2d8eecd74fb44f6a648f9b8103a62d0c5079208038810d73a29341f8d70196674f8c6038e32ef1880db03552a06c5cd980bee60638ab4a791600dac8489d8d22ac4359acf3e7676c118a40cd05e04beb8e59e41c65a2eb9ba1a46f5e231db3e9981725476aec91afd1ef2ecf794383ed81dce189800e5a37f77d20c673fa3b2d718d98b5df39e1ebdb582057810c2158aaa788772841b61b44ea3dae498c7a2feadc166975323a6c08f20e89d7c80674c3745e1bd692981afa7f1582245b056d5e6f4eb2b7c8158d05e23f963311e1a4b4b7126739ba557898b493d4618c632ccdced08e5925ae131dbeddd293f9ae13b5d5fec7d194228b70f051fe154a322730ea478af6ff0a1f8a387304756031476878578d46cecca14ade39c553d12872701b8434d9a161155259302e06840b08be1676b2ef160494cc170c3e8dcb9fe99216e3e86b98e500824b207ee171d609b1a325ae4d855ce73107caa33ddd4866d6630aa03ad8ecbdfaee6e8e125bc9398246e715b433d76bfd25bed662c06683c32cbd28cb382ea1abb86c9557f598e03db672244e251ab4d1f87ae99622d36b190d1b420a74f3d335ded72000e47766a12f549006327fda9e255d665a05c4be8cd6cc1c81725670cd460880682f1942de020d261e17143e2e1d6649470ab1918fba7023de98b5fdf35388226488c00f9ba702760474eee0c15e90f9d4df8d2184605ac42554ba73c40d4752559edd0fa10d090e06cbb2f5ba24758373f2788304a2fde350a1bccdcbfa2896748f95759eec40b5c0e7760a80b6d51788bbb48e859e124f0a67e86b150b0d022412f70bc30f48f042c6e1568095eab02f3d5a4250483582999a0e734843e1cc86a9e405407a555a00362136fd2f48d0a1d77ab1fbddf5e767424f0611a39420c532ea230c9206f7d8e5a593cb4cbe1c8e95c7c5fd97846e1a9b70babab394b1f183360b76dbbb24c9705c876565cb818bddd44ad6dc3f402f81803330752a532f835b1bbd18e34b60b0118e839f8e90f44a25bc09483a350d1b965d749cc5af18ecae5040c395ca620146300689e01052cbcf55212e6fc0330c624cde708688009d3020de1cbfe0dcd4ac45a46e40383f50c19c19debef600dcb1283435c0c93e7b4c7e9ad41fa629a4271c09a8b4ea3fd9c5185ce3d9db6efcaa9c6048075a4ed393e052c4189a6e6026a8117b44a0ecf54bc9738b9839827e0abdb3349b8c39e2b986aa44519c1ef781f9e5615b673c112234bc766f244d51a939da8141da08c9ea8da1d158230a8f318e5c682273f6ba394d30482af23273f143f6740fc5884cccbfe9fb01c444131495c2bf6d187936f638a392127bcf6b68f28419e1d093a1afb0c9fc518121c4c703ec961e2235e396bab728f9746ea9d20c31f660a83d36c5a79b0e27b5820ec8831530167683f15ec608a7a6aa9c00ecb882470d8ec909970672688faae8ec706b2ad0564b3b4620487f525565f9320cd953dc0169296c10c5560c63cc748cd0a8b0e3a7cefcccf73214a69cc08c3f73213f6ced79232dda244d6081b379eb66d421e9102331441547d8d58246eb7eb96e46587507458f32fb56a97321a458d3ce88e0b279915439221ba5aa51d4da9470d077ce0058d1ce4490443f900697d7228867f31d135cc486f46c36eabe5c6e8283b6253c451034e9b99030d8e627990e6959dc38631d79dcac3141048a57113eae80227ce3cd527b582527db238656c6c07f151fb93b3ef2f606b6a777efb2a4263d89222c2436d58ae942a98165187b442ab09aa37d4fb090013e3aa60fe8f0705ceb829ccb1ad6e48dea3120e11ba2b5e8a32d50da800f33919907312093404e56d387f597dc62556f70872bdf712c9aa1bdc02882cac679f4d524b1061a07e892567b71a8d0d91eb7627e9cbb6bb9b2568bf192b09021ab2e3c0ece90a2e242e40fd2df5a4d4a91326e6a8686388b65d5492d4412cc634c6ab9eb565828dc7c8d32e76749c4c1fbc8858d3847c50d2ce27705ea566b41c485164ad91cb3d4c74327b4fe2a817dcd51407e8be23b11959f9aff06eb73033a7ee1824152e8e3670552eec0085bacb7fc53673867959090a73bee684c5ee826dea9eff0550ae141db71bc522a9a53ade3a6762b69d1513ee9a3c89cc28285687b9b28404cace27a29381127b5d94c3a2341e5012f1469db9e89aa4e588ec51ce3dfceb590396d09f02a47faea91dd72a4c49d7c701e28430eab5febc1fbaf78e3e34e870d21f10c6b8789e3401e22f82ae4a792e27e47f29cc9c45113b3772dfef7ff7bb4553de622345ca1d7c68d66ac899d2c52ca4d765a8a186f98950d66cc98ce0d74a3a2c88f291c78d525357994417132127892b21215f2bdaa14d7a3f3fd8cd51693e6d1c489f09aeed1a32f2d3434377a7c692133bf726657d0786c588ee9cf594bd781c0a3434c782830e1b5f871a235853e1f53bc362124bf7356cd0e3d2f26b01ac60f031c12a260ade4e751f1608bdceed3bedb1a435a7ba0ffd95e58c1157257a5ec31c3d4ac656456483157a1e59a0a9c06c49fb282d6e69e684207700d02baf51b428f3bc1cdf1ea47fb35f472969bebd0a98b7992ee0fac2b02eeeb11f691e97f09c6fdc283f61b46d02251f5b50885c9b1f7d0ada0478a77a7b3bc6f8beaea38d2bef17ee39eec214d505a73f7538bc2f5f387688d837e0d5e6fec127e7bf1b22c5ad32fb82c4e5c25fb08af1c81d14b17f8e67bb1af05fa28ff4b930956f482424084cb0af76619ad8274a7047d2d842a737366b3cd0f6aff3e3c0f32f8bda7acf867b0ab63416b45d7528882ee13627dc794372ca1c40807556451f95039172cc308d3aa187237d7d8397a972bf58efc572a10bc2b5ad402f394b434c09f17e93bef5c95100da5dcf38ab920934897b50cc309e39c6acf44bb2e1471870852d0937fd4b7da6c5e500136e438aba157b01936d1c2a22f2174039fb851e86c9836952d3a568c8ca3bb3cb3868719cbd120680af37eae75dc97686610cbf9ae26dbe8911e30028b6c161085c680c92bc1e466f18d7300f12d6c1049750b2c40c043ef5988aca1aac33f49cd9ee3cd166728d75d94c5198f8908dd697dd4476f6022cfc5645bd8563283e2f7fa4fb3104ff3a0f8db523d5d427023c9a98d05153fb9aae447bae151b89c1f96e0307b17fac81b04718628e00c62414e582f89e5599c72afd2ab04beacd902d7d9313783367bb9359598062dbc4cf413c3172f1dd23f2218a8567bba4c0e759d6608bd9adb5e53dc2859b12a873c5dcf2113be69bc9a70cc7a84ad733b8e254a9201a6e48d0cd370446f5eac1da9d0288b92f043219ed0b3be025db393109f4a9ce6869d28c0de621b89e0206df7182d06bfc7184bc990c204a957384f480c63fd3bde32d3c41b4abcbdb1f78ff2f086d4ef0d0a6c7ab7657703b9a19f0079ac32b54190692966ba0d7b0432522acce19c8e9599fbe1382b5ea5750f6a0998e5ae58b3e28005221cabe8e7af46d5989465e7b293bc7c673a06e0240631612a56cbe40d0b03355e53904abee424efb4c8bf899eef5bd9c0b3cba10a8b899ea37334b109be0b901b7cfc04b2627a697fdec2a774f917a5c4c5d2b52e4ae2f7e99b59cc6a2f9edd1a1ba13209ea1fa39872196ccc0cc042e6bb1da99150628440866359758a816414cb008a25dd27a65d5893d789db2c467a7aa9b261f645636e054b5937345ae476a6c29717c0f62281688fd71d238ec8297ddb0b6defffa91df7d82b4c73397f34299cb721dd2610ea9e723889dfa2486f441d5682f5ee267287ac54c4c48b35cefacf610369b7647f5744a1457d2f8a5c6611b9f3a3a31a61c2953a802a8c40a7ca8899ff28926e66174d9bf989f7ed227f37bfd996de63e8ed1762d31796190d084ac43bb4042c1ecfc9cd2912972584093987316368c625a141e8fce3a87b7be819efb6281fe5534a24d90423beb900ed875d091b3044dc9d77299af64e4f3ce6f88d37ee515b64ce9ab0091465bc2c1d7404cecb0cc6284ff645311a72573ad6ca26bfffb686f8100f9d79bd7c4b19ce721c8ad164b3753a153934b744df504185ff8688a38afaab037f9753c6ffcafbb18f7d538c6546da1a0759336939f2d86fa1b8f6ca65e928a0d8d4619675658af16d05686a99b6353f7b10b3e59799eb1c06d94f73701eed1b2bfb6233a3b28112c1f5e48300735972dc68927cb01665b7b40fc720cd0682c409b6f65bffee9da8cde7d988c256508cdb06809570c5fbdf66b752aa0d1cc9d563a647961a484bb141d02a7fafc43f4f7839b546b9c10e6ca9268c8c8080607610f96983815f73f1c0c448e112b87f93efebefd9fb65bc94bd46e7e06e0b4291fda90b941bc19f133b3b655ca58493a313d34ac3fd1780491fce246ae2dd503b446b987f5a52531c9057c9fed294ac5a4ccc7ac80219bf379dd738b345a800743f28829b5bc1ed18cb76947525a77463deb146027c7d9d63d5d6cfa42d17f21b512a477a30060676328cdaa76cb3d7e9c7ccacac496ea48c485c83f7c4d64847d4c4864f924aa58014e2c9e15f2e3b792987877e1f833f85467bde6ab0ecf632c6dbd6568c4afd70db9a9c68295bd829fbfc3d7aabf0cf268c80b7b6bcea3c3ead9f448dfcf848c307e4ec33a8f91cc44864e366d9474957a8f40ff3165db7b90099fe73965bd93b496f2f1ed53c275eaeb24e355540ddb3faabf1287b86afbe642e22ff67136fb9984ba6454dc68e8544b9722ed4565486fae7aaec5d92b1a7e77140e70bb08c587337ee8ce4bca72307be9a9d8febba1f628ca484d7a520cb4fe33e781a3291fa3d0eb3c92e88a6862ac1c6b299f404779457066d5e447b9dd1f9fc868d385520399aa112642b5e430e141f4919a470d24a60a8e1322cb8f797a597c2399045602e32ed7874f00f9748d69dfe4ba736536ac5f367760a5084e549af18068636d08ca990dc1dc9da753bc3736425cebc72819fe48eb731e8317f8c9a40f033c451b55e6f0764c1efa2771c7a89e2e362e663ce5cd0bb30e69b622a3612837901ad97b4f0a62c95017df0bf0a850c774a325d433a77ecaaaad317d6a5402f2d2f6eea6a32192b651b81f4742105294cdac246dce154e3a9abe3d9e48a76ab8be602485c5e1236c6c6a97ef6b50636d6ec6ac611254eac31b4c73e0f8fd0ab5c557e869f67e1fc2f4b85b0cef8b602799cb69916d77bb4159dbc61172f9a061d77440a9885bf50af8470392323b605199cbc6edbd375d20656d992035a4129e601ea144e4fd4880f798709535eb5ce08e4868902d6d98172e4aac62fe050cf6cc5c457b1ad708c6023c13a41902a40c0439553f8989c53fe9592c041e1d7a50389171807498582a43e53b0df214bde1f05c4becc1af9a9aada93445aef14604a0c0bda80d41944196704ea92d82661c8b996103ad831c0bd915191e015236a44939948dea3dfd37881536b34827639470ea7b7dc9da7b4a5487a0faf5b931b65df4210ae1f21a0ab83d1d92f5cb61745267abcfe6c5f5aea1b9a37f0f9cd4781ea89cd60f5696ba4a49e39f9f217c597379a891a0c3c55b0f26a9faec62ca4b5d1d5ad7376c1daa646b5c080b843199ae7bd2fde063a428308b91b8d9688e5cbbecb6e9ab17ccdd2d79de2e35663987724c942175760e88e3c931248045daebf7834aa31c860baaa12841e3603ae2f9a365117fe8ab41d3447e463d0583002bfbea4c3f99dc210180d30fcd95d69ae71d6d441bccc2ad34cdfa08a2449a2b8348891213d1b2978f51ea7eef4c3ec132478f93ae7101a810b18e54da6f78edf6e0d7bb066171a23430d87c11c05d87f1d1e0896409b5e9e74434b4812e58f5646f16405cb8583ee8b4fa8aa8200f557e2b29831aeba78a61a48015441110539f6eff33c84918ebb13d48959b522e28d19768b2af1f64707408a19de6b1217213920c8c16b3bc9e18acf92613faea31e070a3ce2a15da80490091876429ad6676eec98d6200f597b4222f2364f3864efb3a61629aed66acab9b1f113e867a86a6ad59c5d10eace3289fd5d092df54ea1591c0420371fb7bdd3db54a295575276ac31a79f25ca7b5b03955d5ca55a1b95e3b5725fbff0da2749ca59d9568f1b03d08aed7898a77cb9d060af21bff5ba7ee527b6f30ceb7d1bf067d9a80ae2fd18e013d80cbd223078418536e2caa28af412cfd758740c680d2e64acbd7282deb3661aa8a5fcacebcfa1724ce472db52e4c22c9061709d98355507858a0e94c0ae36be4ea945d21a98dfb35e09785199d155dd011fda6a53262376a4c65c8b5ff07873f67fe641533950300a4d9395fa9c4cab7bf5318b29bdabd117f4488328388ec6bb7e48258d7e22dbc2139bddcb2cf05586d3e9a93225286aaa3c59189e931b38cb635ab8a36c1ad89ac810d413c685da871e30d483e781c9163c36d8e19b9ca0bc1da14b7520c6f4020455feee3aa0bd35a5b181a776cc81dec233c1ec068dc13cc0d21a0b31051e9ab73d8c5f7dd5918ff0c39163f7e1e256c731b42473f516e74bfbca47ea0299c8c67b045d130440e90e34fd33968627a67c503a55c287f48e7a4f1359df3d5989df73c2c1ad10de5140a310cefe42d45c9823f7b7684477d8401e650b96a8db670685d38977c86c0a3a32c029de874a536105f28ecfb5e6d1a19a88cf3a1f7d992d07729c81b08f4fa6db95331df04b965483f3c54cbe4158ba7dbaad62ce4a1af4bb2e8971c38dff948c18d3abaf54b49b46c3042ede60a51d5f8aef3879e1a886bb382a48665ceb3f35018278b834c608b3185cb4fa76c3468bcd00f75b0b7aca5e588681c68393520e2c85534d1310a3d262c3293777c6ebb836e9e508a37f7acea57b3de41029fa97b764508854eea910f66fdd595482aa1cd0156e05ce135dd56f68511cb03f5684057e5419894a67a89c2e626aac46fa1d49c9fb5618149a36acd5bba2a2c570207c331d2a9bc9153dd97a59d087c431ba33288a864c6ed2756e14d316e8610f9d56db80185f858d2f2790be89d0da44d82556d0bd7597d5a0c14d5cdb6df57dc46afb253d66e024a46b7c4393e237b7a77ac143bb79881db0c8fdfd38f09806bb581c7c8e86759f5347eb4e8372159b74af1ad87f0828973e9034a3aef5973275a64a896383e0abfde79200210978c13ee6b2afefc3c64d1ee1956526982090db783895de2ea79f30d677c567a6098f8a0240418c27e2d84ce42faa1209996524efc1826f36afb4ee31feab10b31d7e96410f9244c85391b289529bee098b8027f5c5c9a7e027650c6abca970a56ceeeeed7b718320f41f972f93f454f1ac32e5c460dc16ab68c51252c45085326985c3621861ac05bdce76dc3a649c2e23e5858d6185c4b85351867e5c4995d64f9c0eaed78ead9073cecfc3d11c45e229040353545a5d2a61b0d30c39ed507a3394e80b4f0e119624c169b00985381d6b1172ad9297b9b244423dd656288c2da6c0763aa37085926b1b9af9220541a30b949cb6525302c5f3b0d56a088e0ba5c5cd5701212378253c79c7117054ae221b1b36de8dd881d89a44d49059500d2853832cfb1e6aec7b426e60afd01bcd1e09d4658cd835462d551b076ad6721a2148d48c3e14b987e330acb16c2a25c5febb6c374cee74935b5c27ec6f8ee037ce3ce5ec2530986335241097344f5f651db8e2cd957294f74a3d318ab6a09e412bbe3cfb8bf6ba9f5b41db8d42a041a3b3deaa9b7f78e0aa68108eed1d5123ee3f72709e95ca55834fdf0c44b6e8aa98989d10aa731ab10342d6eebc7c6321a8ebedee169be873c9167200d9456a6548ad3b2956141eb530b4ac2f1c4abc6de0a9534ab193ab390206653ed89ab64e0fa229deeed3151564ac1b263d08181426fc101ba740307dc27c5ec34e4c61331315e7c49d2ac1e823103f4ea484d86cef6127a475d2bdd4c4cb41f6c7cc1d4bfa6c311c992f8d2d51a7dc4866194093ea272cb26121cc1523b9bbcf6381b78770f968d8052db995ba6ad41e47f42651dbac03c6cb1dd3ebf4c055fbd9f3adaacb12664e65d07cbecb92de25ab88c48b53ad90355fcc770623ef4bb8a72aba4b9f73c8a104d877c643631f7133da0c332ddc963a1b41ce0e228d08d640db064a3013d132ea27790194ac70593651046eba9ed7acae49aa18bb07e387ef9330e4de713d22e7587570a02c7bfb37016ba79b982eabc6008a674410aefae64e96c37d86e12131e6ae148f307a44d4cf3875900d954016a9bac83a8ec4e5638f6453887c9fbc4aa53e527d6dfe25b98a6e1f6b313d3a8ba13a42fb762b4ac1145c1d9297651766da169547ed570b0f435b3854c9ed26da8c468e55dc60b0d9a7e38f90848521610c6f94b21d434fe2bbe8751c3501d3f66e5ffd7232ecfd537724d7f8f28a7e8641420ff6c912e594b4ba5316540a64b8a0d78a6204c85f9c6a16e909ed2e06001d1cca5364061ad3ad35935fa78493aff97563cac9008e42dda4e6657cce3c8089f74455ace83fcb696a74039d82f79289eefc4a4dabcd2860219863ac1e70f250e308e3a718788223a4b65b41e58060b0ed6f5040e3902936df8a127c929e74a05a783c39864c3f06fdd87956eee7070adadbb95fa7afe618773f21a2650ee89e774e5240f80834f778c6454e7a754fc7e6a65aa1517ff21ba8516c5757cda10ecbc0b3db19d009024d1c50cb6e703b62b3990ca3eea4f5002617e96f976dda4b5ff73273a4929c53a73892b6af489d27ea2db0c934dda3ca80d17fe183636f8e73ee1050fe1785e1bf37040355a3fd1900ad37cc13842b9e4cf4c1414ff61cd93a88b36e6065eba05e4900bf0f3570a4ee23f310962b35b63283cad32c1ef73b88b64d4cdcf6494e382c0b915ca2954f16dcf10424986d8286aff1c03bf24b2482e76b099de2cf2ecf2085c146bf5b3ac08fd8b4a2ee187573960f8d9c12fe468e23ae500c79ebfb178b4bc78f07e6534bf490f080ddf078ee82173355c0782732e67e844411128452181171f963f4684dd61fe13424ab9d6a75c1c4a3301c54be40bcf1defd372af141d1ab096072e9ab92a0a8ec8a9b6807727f9e7aa75497933c6ca081a66d999e8c1962e8329ecf7a2030f54cf0104ca8889999b5ab772a03f46862a2a98b7eac8643eaadbb14eaab75f0f962c6a5b468bcdbd466975e5f3a41dbeda30d42a6159058f072bf051c2a29028df0947d673b3e5c4398878a2ac429dc87490c9abca4a794c9bbb195bd44684b9fbee237ed2dfd971f704fdabccbe6c0c0545f83a515c0f05a7a617b9555279a2376630e0dd481b90b3c233523cbe9d669f42760f90893d7c1ef4908b0fcf57816c85193e83868368372552759b86f64c02579db32ea95796dd10f260d2c53a05c6b33474dc862f9d2d7e8c6accf4850e388e3bd804685bb2d5420f4edc8aaca10d8a64f27049c11ef0c04c9136195964319cf47e6e1fbc76c3a687e80a5332145d2219eb9a516c85248c08544e3a6540f84b83ab30e0e3025626ce9fb3b854a7e1cfe6c5c9be8d34018483d64a025aba410e3e31f4a5f98d864f13ebb0f8456ca613ae1b53cbc326e9b2fcb0236efe5ce79a52bfb16cdf06373871f3352348d15df8be8dd23aa8e8bcc245a1b19bf1638609d2a1f64651d5a1cbc1ee68a504c0d7770b1ba43eb018fbb00139b66ce2996782feeaa366ade084c72827ad02a659b30979a074aade010a7edd60fc2b45c6c74396d63b93618769e83711ac1ff69281d58c18449e31085858703c1f750ebc602d517acaf01c3af63add65c02a88b4924ab70a69383f1f71a10cd485bc088a188710900efbd2c85d47694693fccf214078269bfc6fea300c61bb49e759da177d737b10fd70d878a3d80b820b42ca860de5a01a0b61d1d034aeb41a5cdec899b69eebff562905a6b2a9cc0ccb61c2dd9a6acd798ec632052f27e8cc619914b4e4250bd490d0391c3b7d944754d3b500f341bc1d24545e22d1f59249829ad8b61e28ea48256062968e3c24709a9e66854603a187ac90a820fa8e3cafa582af4b147cb2a9dce2801a0e6f2b30ac499a460899b8b3d5d83ecb58d6112179dd8cadfa9b1df581f20062c5a8bca67dc0113a5f67d4a4e0d756664401e4e6768ef0d9014ef12dccee2b863c7e688ddd16cfe56e86e89d9ce6cd3abcf8fd267cfe6c962741fe6e5101b584eec248975920132893b3e362b06e6f8c84bb4df6f7ce4ac8a5c453b6ba36fefa9817632fb6d3cc10df46ca0ee883760c154494814d0d6a932a9e51862e410f1a5718b54795b335e668adb5b91d3e3025395520df697c08e3d5d094347d00c2973aa016ac386ceb8a34f2bac108718c4e15bed2228033875a919368257f3584fc4e1539871d25e6e36b905763570f3f398a1df4528d463262653720675487b505f5ed44ef7471ffa0b1a066399a6718ad64c5a3232c8ce631dab02c6fc27c58a8124791354b299120517c23cd9193a191a3e46e542ae5c7db8a1825a7d684c17be6b52162115a0d6ad85bc842676f0e9338c2b20279c23936c00b06b828337efd0a09401752f5e3eae289cabae7c16dd1351e279e06745cdc1812400bd2289931688a838794b3189db9890f131a132ad91ce5b0c3073b4da6132b08ac352c92624f73cb87e0ee08391c78a7e66cb6639f08d83a13ada73955af3d60f60fdc55d85e5630e66e4271635d0083fd2145d0f3a4abdfed48f64fab1ddf40f2e895a41274e992e8824ef33e8ca557942f9fcfe4d4f6fda246e2e0be7fec7f206d0cfb8d80a7edbd58b6b87a146e3a34b4756be4294d375659debf7b0742a2c9cfab70d29b8d9f60d73149244e984cd0270399b406e4fd46dd996ea8dbe9d70672b9dba96c576087ec925563ab492499891668a17f4c6601c10c3eee96b6577ca8ccf062c35cde711e6718748a9295399d97052d307909f216112d0065647bc0121fab842a5b3c85f9f77aee8118936523bd8481aab2710604e4edf4ecd89bf88d58fce24914138527c669b1868c11844654701c43942a8b64626b107b585a6055cc515a42565887bb1e7e0040ad43c29c3f60738eb2c1cde6429708568bb8118fad8c41e84d769e4d5891c4681b7549fa764f5c92c53d022675fae6b6ad65dc6d6c2998ae0c5812f328697f58a5313aa27ccfb2748df3a997e252d8daa6923c981f34158b754a8cc72c0a4b8b647a1bd7d632fce3b87fb48df02b61b84fbc7138066b8a45e1c04b8fd9479997e142110a9c56d67b0eb2cde9b03e6ece1f24cb8a86e9ba5f0de58370fc9ad68d089a7592219c78f2186873b601fa2254102e9431775dcee48946524214ab15793ba409d3935327cf266882eb60e1715684c8bb302afdc34265729a16f1297195f5ad3770b5d26b62b0dc67815982c1486f1ecbb2080e38d453741025c2d6e33d8ccfe4c6b550db93c3b7207c4428feb84f5c08654e33e3774dbe7402be84da28017e0ca1fa8ca79a1fca189cff239f522dc273274cd237b386d784670726f9c3534cd46b53e340e092df6b0a96ca6da249104265b434f3a7736ce2060884b26af1f45a62f69c4dd6799a4c84fe7e0a4628b9086f28b6e06db41a0f517014eb128c25f2b14c582cf899f843a551e28398a53a23c6c79c999bac5df188c230265da834afa44e7baa12d5d65a89f9b5e933f175cc99bcacbf50e30df5ff95ee0307f5391bd46d519d7cd9b74167e2585855411f3ea07a8b40bf84e0c7c6220784de84e8570b46c2a4e70a98f1a8c5845bdd848eb5380624dbac135a0ef4a2a8551618226cb327a370325b2c526bd5611d0b8dcf34a0b472223fe99004a222fcb23f224d3ad54e78a6fee6e88f3b18cf6c94b96d87423da39fbe33c8ad7fa5c2c9fdf0d637d75c67b890b46ab9c3d6b823d697023f2655add351e02189a1e88c6dc4c64880bf22d99cee88635a0e8a4b37befe32726ab0773b49d1845530223b111162e8d9ce0429c25093de9e664d46e8875a5144ac9f6594917df57de18832300813545d2ab56d66a4cfce9de9c7bbda794b303a95de0b52914ef0b175c4f87197c5579168a0ab86611e7948660a4345350e953f540239c2c3574a0ecedf33c70ba1c43ae40b82d04f0b4c0e0be1c5f903fa9034e4cda5f2b9dcd20e01501ab3b8ff6805964d47f55ce1babae5051e37bd4f34d40b013291a28377f0f4d34d9cda1d7060539cef733a19b1890c2eac2fa32da83b2e940f90506a259cfb16bd6ba25fa4fb1fecc19de567cf6f5c7b178103dcbc909fe20daf873d6f1e309d51854ec8478b33d1d55dc90847dc1279447a996cd4c294eb91e3d0c9fbfb4d4706406cc0ebe7ea614aa99edfd933de00d196677e8c4945d000fb426bb6129c28f2c3b4b9a673e806147c2a5cb852d31b66ac6aa5f0af9459f3fbc15b1e665e675815f9c141b45d63dc9566a85efe054b67dbc8a20d0915a3324915ded217848b7a09e45a9adb97689aad74da09aa6417e39851f35ac14afe842672c86966a2bd8c8de304c27a3c33fdd1fe3dfb39559f24ba0bb0ce35e475384e96359940e3f4d34d59198775f1d93978b5578ae03d66e4084661bf12a321808e9e300131ca5e90a5a1f7db251c3c917003a5dd81bf2c5d7cbddc7508f8bea0683d174c6f948105adf98b14866dea0f06cf9a7214375e5976ea2d5731e07f80036a48f57b84857ccfebc1788d82f19fff0321015aea99f4db9c5426ce2c6c1b44630ac27681593cf278e2d16b9f92c484fde970d25b3248b2a9530a9faf7cf51eab266ecaaa918c4142137e78889a2a3466f8c0e54544224e92e6cf8eecf7f6bb8cb8bfd4dd8b193520ea5b398200fceadadb94e6b41bff582aa33ce25b251edec62d8d28c6b9d88091132822a51314ab9fccbf421df874cdc73d5ceca303a6c20c1cd6c175918001767656f9ac1e03e4b4e305906a82201183d7cafd1fa2fb288abafdd641f3de594b9eb349dbfc5a8dec444bc3be1e3bf2528bc093b9fad9c761870e96f7da82a3273f8231e58693ff18b0c5c4af011bf692746c8efdb7a2a6cba42345d1cfcd37bd3e5a2ecaf538093affe2cb8cb854da0d60dc2d8b8bd6533baa02d8f5849a085f2b02d324e10a0bd7adec21aef4d82b958f15bb46e2f798c31160fd933cc067631312adcb5d4fc75e1cf60d2254080298a052118813f7aa6c34354ba035a5afaf97d1ffc0cff627cb6a051160ee8d186df47cc0e7d6bc76c25d93ac7d26b86e983b60ae432c885047ed2d513ac9d6a39d3fa54f64007ab81bcc34a56c6633f6c33acfb7d38a895639ae373f705c734e9597a5deb16970b989534452770a54a06001442f532c3e5b5664afc9fbf41e12b67b4bcb2a628693579cb3df4ce055ad611884b8a2e3825e875485202e2b1380d25c427f296a8ebc25e701fe6e5fab82ea2609ed169c614890fe722266204a5bf29d2491a7969a6aa261104756af620cf3dd100cdbca6ae1878b76e853984cb8d4dc2c71a20cb4c9c63d7893fffd6b0e9d21b8454fb89c1d8c9e0ff9eda2ab2dcd281feea370a01e4c53f54ec980fd37eec616cce963982014d15cb223d1740af97644aa2c0d9798daafa819324e2540461c660d66fad32fbeb69e85c6d416ced559850d66db526b72d488665466569d9cd01b110d7310201925c09ac889a35e8e20fc06453175a6b6a19f130a08bdda21575b486a73b206528e7664b6a1d15ac4c90780d98918a9f20222f83ec8ebab30b3fbf95b24c439b8092f171872b6ba7d18cd216ecc458319c41d1b7020d7bda984e257378d3a2d05ea84ec3b40e04ef2c990dcfd192d7dbe8c73404025b427be3a46495201bc62be2ea6f36a2a28e91f260ab775f81a9826cb4f50a696b32f4b7e11cc4b1e20106772c7fee19fa5c1005c2e8e3c5b9cac101773e5992d910b83c0a02f6bb7c3555482b0c4313d50dbb9e4004a6a8caf008ac06145aeb18b1cc83646216acea0694c81e48b08a75b91bb6b1b3dc75d47304487aacacc1caf087a5546d8b11e9e7641d0e7455d88de0001b9e1fbd72051e6dec6b0138540b25610b3c462b2987de7521d1a3e5094e3aea20c6ff347b3500400389678858620b2f671fc856b2513cd4a2326333e5dda00408f639480fbc29725a33e0304ae29a9b9b1114f60943c73632868b0fdc5c625296c74c66b3b67e6f44c99169d1dca8253dc252bb5fe28e9b08c66178a03311ef5bd2ab1efbf63f700916699f2658939c4b80aebc93e7e4f8ad17b69e04c3d4701d65d543e5e0980683da37f29c6e4d0651e7fc4b13114ad6f6a03891b6816cb882b5212d4f2c46113b9b72741c3787e1ae211390d31f0a1c15fa04b6d2dfd3dafef38331dbcf367384174c333da9d810026e7e354c8847da19f1d5c61456db57dda6a6be50e490a32a3aec945d5423fac872688485a8344bbb59df45ccc51f7c01a154c1c39d4f48f5b7d900d24bccaf6eb34fc0efc5f5778787dcd8f0158a6195e179630e280d9e1f69d88a1b8d48025258762e6761aa6bd20a12d3d0c1cf38c5038b05dc137b85b4bf2bd0e756f89d8831a2a0374f0f75a83bb338144b1b7890a1fbcc62c72389780e89c99c09cd536bda59b7a6e8b2095b15360013339531252664b395a56d2b0720f9ff0b720f1072b8e41e981889e2989ef8b395390ce4616711d4c010e6fe885214eebc7bd308dcba48075cbcd135d0076f488811a083a72b861807232ca863f41c8c2d7e3d80aaed653066fd3ea58d4e34b5856bcf5ec40fe22fa857fa44eaa36559eaa9f5d7f3779ea5d88107db9597fed124a775ad9c8dc82c15a349b619fa6b84db7b0be482fd1de8f77e614bed0640348f1b9b12b6ec371f402d73c6bf0356bc252d4519b4f196dc7bf7e554b7f9edd0f6f404536f213a1d65742adf2824669ad013af8b05cd5d91215e374b63956e0a2dc3743349e55374b90349be2920abd36587a90668f8482c3ff2852b8037664aa4a4c00cba178225fec96f196e1bcd644ba1c2ed9a89125394a48f30bc85b9e94ca68a65c23340137ca00f9db3de1a34bf65591f53f867acc5cabd401102b130436a5a3577af1172be994cebc57542938d5b5d720c33a10f4792e59a797802737bfcade3c3d9e9df1071d18fde1b75d7236cd84c5884dd89fa71f77d0529844a3d336bf6a3c16c6a464568bc54fbcb6d0f10401f32482a4d60b0a14db8657430308a5deb49db65654d4b2ab670c552216ce95672ba42bb66c6e6aa0d93953602c6a40b017ced698f5bef60bed481cf37718d93c8b0249a937dec76b3d59ab3e3f212ca7f665ee1d234ea115ae456e935c8ff7d69bfe5ac49e5b805c88357229419df1efcd1309a37697edb195605a4e613f5d011a9c571c06eb649e2cdc16fea3cbaaa0727ff7a24d8ea95eda307780aee7e863044bd645d2d4c1531c2aaf6942495425c0abe967284221fb928815efc7feef21883f11fdf054e295a2a0bfdca3dd6d23a8dd7ff9c9091b3daaac0e403e5ea936e1149a13e11edd0e112b97e4e32ead45ec73b35b5cba121d86cfeeff114083aa729779db439e565f29778defae1345e165ff880f27a6ca8d5a7e735282d1177a98d3adfc2788cf7f539e3d462cca4975ad2bb6cb866441646b1be47f6a685aea866897380b1294d82bf4c30c2f39ef23902bdc76e62fa20d6d3cd54e107e2857ca14ca0ac5c470324ff23fd69fb7927bcbf27c93a3e898711a50e1d994239efabe4d520f009ee75dbfbc14ed40c1a5432305f0b0ac3f81a90950af01b47a7de033c7632c82d93e68240145b54b2249535c4e8091b5267b45788d808c16213a42d6e8aba833edf1d226928f640e119de89c468d67de76df157704a2bbb6696dbfc633a67fe8edb81ab50bd603b1f72bf853320b4aebed72b0164e7e906585e4bbe45578729a4324bcfa94cdf3d7dba610bc48b68a46e8b42b5d2404574389a065a59c461427d16552243432509844aba94b66885e163ff30e640db589293946cf8aa1946f9c2e773d3314ede635492fcf699d3ed7c746d5bb3de8b3b48e93ed8960b8b3ad552eba0ee79b44dc73d321de9c2544171bab6166859ed1ee41524d34f154125a8b09717cbd303555e038eb41d2028afd04ef884241da206eaccc581032d94873078d5c328155ee823215b03e9df13fc9bddd213697baa75a229cf018c523f1bada97ba8a83dd3eda64a84a9a21b22469a3f5d261c097b8dc86079ebd78e57b2ab9fb4a97c94c191f90003afd93e2b2fe984ea8688ef4cd1bc6b6286e37953f8f5224477c73eb624c33243e599648b6bfe157f8cb19be2405e4fc65962a1fb1e9621f0f03556b7954e4cc5e9632e7d906a3acfce25a6d30c91344e85d5badc0ac2a027887bb98c5e90bbeae41b08be49cfd05002f1be29853afd9d2f282ea76401a101578026fdc031f58d83209279670418217fb38a5c44064af15161a129532825bd7e5e2e2f701a1e08d8c2ef34b4541acc499dacfa20321b6b427a85f8f97a106005c9ef81f1e3e0c86bf08a00e6438d1901dad37cdb7f694bce2c6e693cf52e0b0cd7ffc8319f9d7ffcc2b8d8acc467cca301180f794e4662d34efe87964186d9faeb57317317f8c8dead45401165c173cbe3e3d7348634a3b86f7c006c180bcde8c17d8715e85bc6d8162afd21d132071b8ef0476273856ddb724a5795dceb96e186f4d4b0fb6bd1358fd3e98c3bff7fd74e9473a5ef28ddfb69662f079037774d96fe7c7f71e582836d8df73f9d53c0eeb43f44b000b712ce7ac05caec26c2c508b3a9f22d004f510a9ed8c63dd78aa9e782093b2c8f89b423acd7e6717ab6fc0e9de28fb4d46f92bf8c3813301db8775e087e01d04ef58c2f8c38bd3f16df050694a16030131dcf4f24ec3edbd002844d07738d6f50f8bb6a6a6acd030b2d52d69d4d2d4a5d03216a1a0c7deab6d6c7dd7427b5da63bef666d98f51d0dddeba3f0213f532db147f86214d235ce1db58095e0a0b91dc7f82c7928259a7dff50663e030972cff51cbfff2efabf61403410689726ec64a6bc39ee26d9ed510bf57e19537390d186ac2bfc0b99f53c8733a587e6b4a113f6f08ab3f52e95f6f56a6c6d605357afc5ee37f817ca2177f30be2440adfbe49fc8cbc32821979df858e38ed2c4baf4275d331e8da9b34447b95849ae882c134f44635f3b26f0081780551dbb612000fb4aeb27db8d27f2b84328f9ee19291457b3da3f3c99e12595d149637d0d28024ad24656a0ddf46a5871c43272b78029b9d587e4e862f8a02c7128a1fc8284e516f00f03d06fdb8c39968ef29198ae72d2d121d507a65b436aa9969e7ab25b10b9ba428942ca82a1ab61c942da4292bd2d298cf49caeb704c1b50d6a0362030f3afc265a3d53976c4fa496cb2b5a955b00849bb1463efbc2f5d1394b0c3e3117d1aeb513393ae988ef67c3c3dccda3adedeec996c32e00bab59c37fd2d8592dda39989a299c0b3d596b783e70b65993ced3d5ad7d5645c1ca003e5aed783ae69cb8a3603d450eab480ea74e016ae2d37c91ba45ddf50649b4fc4b04e04aa54f4388fa8001507b66f9b95fa88d29ec0b275a428525bc4e9142250783391142d3410d6544256c2d756e6fc9694a89322092f6b3dbf91835bd0a213ce48dbea1122f20c0e676ab233926d2cd92a094588628105f00e8a104365662ef3c6059f0f7f3515e40c8a3573c61e52bfa150eb0803c0483e702b3de97221824eebcd8d4ac1d4c43f0f309a6072116c5f6d4d6991b02f50e805e0120a6dec28f09cc86d1882420e105f664a8da500ecb062acb770045a8c1518a344cbaf8d82c7b9c6131bbdb6ec841520188b6145e39bd1b2d9da9ce46cca79ec857a981434c0c3caf5ccfddb2ed1da0b5496f98bbd67b1fbf7601169faa04415ae54fb10a9a2f64f2b672f71dd6c30dfb66d8f237a8f8ad182a07710b61778fbf390e25ec43f41bc718553126a879aba44f35b54eec723b14d3cdf24ffb2c8d41c86e17fb1159fa98c6a0593df4554cf4db48b13a78e2259acb1ed5ede6bf5e1d13c75554e0a6290d637661836052c5b232d896543040db97a6f06cb944ffd3f0ee36cc6f02570e78ba6e57c0429fcca0a482ae4576d2468c631c2869b97224a13294ee7fc0cc2c1b6a59b5812e2f1b0b10ff3184286740464d1a429bf67e25d08ae659e2431df1c3ee01e47f49051c89e2912bbceb18da68082764357381f8b79024a5d5ac22a98c0072a2e84f23e04b4d917db3039ddc14bf19ce22bbf0a17fd046e46983e68d09feca3f552a49bddaad36ab0bed7903fc5fc70fee3c454be3346855f6f47fe9fb90e9863e5437541f64bacfe6c673504ce2c5c132642bfbabcda79ab47064afd5d10fe20361854314cef5169cac93692d4297ff77f35c7e4d71f1f058cd294d22d7373847d8c379a7109805df9db8e0aa5001bebff31ebae5e1c33eaa2c2006fd85d8132f00b6332fd78332e851fbe7e6abca821620126abbfcde6bf87964d06a8dfc8ec0f687738ac0e874199ce0e46d2453387c8973d7aa7403488d9564824712b29759099669381902d57be8ac7aa539c196c2c08f457a7b67c4896bea093722bc2330011fda07e51461ba66300d18473a149981ddf7df2a978228394c6e24a5106b651114ed944aa54898eb8d9c6749e8cb8d6a4123c15efed3022361de766cd2aa245c5fdc8d0be53c3e0a41920a39f1fe14ee16ab659dd6d5038f7a4f10b6d66e11ec641d84a7342a35726a5546a7a1fb78b8edab21e621a3fdf3c3cd20e0dd5b37bc022c5c444b97031b3aecde36dc9b84d9165d94eaefdf3049c352b4cbc02222771b4e97edb3addb220b6ee9e466a8f7c0c6253174082b7ae70590185fb4337a498c5b75a1704c9337892a79a498d997a97ad6942fd10d9c853dfc7fcdebce7c0c00f104800fe90ac77cd7e72ea7d744b7892636cb8b310c7e8552ac90549cd904bc1d33b632840b15ad3a77f40847bf8c56fd254727da0e96d624b1e3c5f265c40fd65d504d922a0f851f397cc937604d62b4c6d52a22ee1f49faf771c2f0f0e54cb1c7aa52e40c9bdfb63fb595d01ea9e5216c331c78887dd7ef302f002e4451a055d2d3cf2437fa2859abc360c122e7e88d81d7e38a24cfc3779e130cd035999a6d84cbb1a234905e6870062df122104966972d038d4db38705225f059c874bf014cec18acfba3fc1ec203cbf75e2a22dd4f4853c9f59b99dd480b6ee8c6461c7e780495201f0e508f4aa5ba2d69db00eabc9d0f439c948ca0c8ae20ec1ed9b350ea47f0c224a47bf940dcdd2420d25a67f7f2d404c8c846bc33c6a144c179966b9e15eae19996b6f3b6f157586802e5161833a6291ea4fefa3e5eca39fe2a8fcf8144defab37028e8c06a52be29612243836e1253e0fb3789018280e579eaee0d92b1e9692d567781e569227fdd027ef8dcbd33b589a57f1bef1b5f59e75257cc7fd6b897a9d204c07fdc5aff84b7440a488953f6a79d7bf87414c3f7a443a17f347c35f64929c90925804719685def96e7889975faea77bc7d46693934272a1e56dc853590065f0ab8bdb86b439de87005f70a3f2c489d2cd86d61e5e8ffb1a52f90784c2c76f7c1ce275780002f2de6afbc1d0b29708a998c507a654d28d501252bfc2542bf9b4f7b5088e29aede0bd3b12e697fb674f3b8c60d065a519281bf7e0edac35fbac30c08088226b316f100e8b3b59d71fb56cb9c81fe0b6c3274b005d62b54c10b457bfb3602dc9b38350c87285adba1b5c9b796d8a6ea043f056cf9560f0d372157291a72391080f5c0ac5d49eeef81ac42773d563e0bbb7ace7d41a1d5053e8b30cc450b25d9df818000fb703da63b14110b1d35b55462eaebd12cd803126360523f5cd7e1ffd9410d3820ca7bbf680ef77ee67b8bcbac5f7e07b04df73c66ab51aa828f367fe5e6a1e38f6ea44a3434c499001bc572b16dace84517c1d747e2ae025dd02a9151bd2554114f58250fbd06904088c625a2c5434f6e3311963d476b151b35984398d4e7196e7caee67570467d8e9ff7477a4f5834b2f8943090766fdfebd2fcf5142a4ce911d68d170bee046c208ce376daa511af60f8e470a3c0f88dbf0bf255cca60a34843938296b31f98f806bcf6887bff960f1a06a383c5b40ffb01d411421e46f16e222b273c702d02657dda814bd6f0b38ed3da2c6954d74358a54e727b63fea8a12658b36becf5cc5d267a86e01099f77c39bac17179e23fed8ad65f3781ffe9022478b38abf6516db58ee434a5f9a7030459220263e989f2ebee9dc516d59ed5dad041557bf425168beebca87d4affe71400d2114e2d44f29df5f520048ce854a3148de55d8b0479e25a685e6483b790ebd09b2d35ca9dc800170db965711ea95eaf61d297e8a3ebbfa1a3e937ad36ca0b044a96147f89044195f93f28b6e9dc9c019d0659977095318332a481abbbd8fb10def0f5414d9f20146b5d75718d827f86b4af9764e11046dabdee7bbc2268467eb1e6c65cbcbf3d62ab8cbf6c42c689d4a2720f4b6b7d0ac8b6174a5aaf7f69bdca8b37bb02c387f4c92df4e9a4ba2fc4cf00ee283d2b7c74e093d8ffc34f8af648b7485dcc91ace72ac507009db5ee64fb79e013d8e7834cc0fdfae5f027e7bec0dbb7de5ad86b294a71a6999d4c19605bdd09e9364aa7a7f272b35d5974a63658322c40b15ddefb3ea45e067c0a698b834c7e3f0733b9fd1c6ec2de17a2671a97948e757d76b093d7fe61ad86542b7cf86026b1bf434d6abf0f6672ef7db7b543ce2ba0a5ba0d5f329fd83e0e6ea27d3bfc09601f92439dacf69daad58642c45ae483e016e3da43d66c276d02f030edaed83a6a9b15f2f152a86411f1c6acaf0cd0638356328a6c45c36704d74ac41a3e76d084b60fe4d643b24bd7190121f64f7614a1bce8d4d834841dbbbdd2f0ddfcd8d5a80772401bf65d9d3a2b7cec603031f2fd225a32dabb8a2b8be54007c4e14e0e99299bea53ac3e3cffb3ec72f1262a839b8d67e3e28c05f5caa3cee516039825fa45c82b0ca1b7139e65710c21dbe13859f76aa07278848aae854542d8a650d64034c18872587320bf970e8e1cef8f240b7fbd9c6ee0f0c26f340b45cbf09e6572c28653025bc2dc7d5fdcd3472412c6de23c106e532f0382d95a057a13223ad202639b974bf0e9c962a4258523e345c42edc9348d630647841ba03f3c54d3a78d13239f18dcaebb6f6eb55d89c520e2ae93a448f88423e10be90575e146cbf5eb63cdfb545f969d42bbdd41c5d849c6766063eaaf37a7363775dc0ed277f25f5c3353abfff951e59c66457538f291ad7d5586bdc70ffa75e0175905cf053e07489f8a2c674f674ac73830ad69d22631e6936e3d7fe8991a7a6f7a9dafc0c93d7fd81733547ba43c914b9bc4ac65c4ba0750feb0d5d42f533fd1eb42f1f62a136231d45894b9aaebda4adfd229820ef93c6ee96e2f112f45ec07cc2ad6023d15a9d880b8c135b70f69d241eb89994291e21194bfe7553e6356eac31ea629cf89baf0525f5aba241ae07dabca75e0affaeb66df393f4460f4fb13ea4a956129976798821eadd00a015f46813064b2677148a0b13df1b2649f78f96a6c9b5e5319c43a667a104fa563ec4053ba7e27aacbd29c4da5e1b0068e910ca16a801e178fbe346c4a7b11594b25d66ba86d231c8011d7c06afd7eb07061f4ee7ee6b4e71d60967328c216385f2845dd1940420bf0f116127827261ef7e4147eac2d90157676646c7b6a20a6082767b75979eb7854b6229b20d4191b1601e4c1cb80d91d4d5e27cd147b75433c7b9f447014a132b4c07145222de7c3c6712f9b6a75127057e4249c9d43244e32c9c1205fd665948cca2af2e838b0005c1788614300c4e061dadd4ad03b9240063fa7ccc2218bfc42f4cd1640f13a026e24df27dd469c404c195b53797edc94c9a9d45092718cdf0a13d7a40ad163447a9093b41e4f9e27d12d719c5127139c9565b9cdd2ae916c122580518a54b813fc72c02bb098492d4fc82e6cd87202386dd62692d60c4a798668fc0ea7d4ad7ceaf9947eedcf70e005e20d327a8b5b7845a7c70c7282be53b30c8f3a07dc18b02d755a43b48886de6fc705c3ae53b7f4f988fb84b798b03cda45b110bfdae2f10567f3bd50e5c1543f7531ad3756711812f46851ed8393c93570c55c115397724f3c682054de7f88fed9140e37df14758800371fe487136baeb60a3e17dd7aa605162c716c436d0f8f7339d03599bdf7bcb96aeccdc08cb78968c51b52d51776f62c7ab0a6190061ccfdfb3d02fd0e66d7d13467ae0fff2d3eefc4b41d68aa0f3c256b177b214f43d29966b5f02adc76ff9e0a3d2403ace992eb718193cc710fdeeecf9f3ebe98f934045907763ca542b55aa60bec783d5ae9324f02f9fd830b2df16580eb774d8d509a6414a3ec48204ccf97d2a265967a28bd52d876c0cbffac2d1347d8e7bcaa8158f222e0556035f8b8debf659771e3f7212155c4e252435df120cb3c61295edd4b0a05e8cd674461c36fa3448801d5dd4d3a8eb99ab6f9882be46e8e73ed1a56bdf13d6cb1b172c28b6839125ebdda22846d699630b921cac0c07c0fa7fb4572a1d0bd32c20355164d61bda36b3ca3a93db90a6a5496cdbc5dfb3a927157539d31674197d5911fc794fe62ca41164d8596bd0d1b7c43db7ef162e35e506161a7e885a82ac51355195323d0d724bce28c67326208fcc6fd2df2b90f171e67bfa222bfea530ce7325f08fc97df8c4d2499368b80682c53151e1dbf213f00132ca1462e696656dab7af348c21aad07309cee84434a360d2ca881983d05c6216b8d34da770f468cd165a270fca8215c712f11bc2301e725a37ce58ec7322d2b8035362790797aa63bedc5084585cc39d48bc3789b5e152788af30fbc5f7338e005eb0e72e269797798f6584281d3b2cd8ea2373e611a131a0210c4e8abe2b07b909af80e68ece45b40654e77dbdd8d82486df762e317c38dc676a047787b44f6ac2d7e223a2d32dcf60ea25e94a44f49efe501d6bb33f30d9587defcfa65a8c7dbd250bdc4f678bf1da8c87b2ad6483e7bdc8a61e91b5d40074d18d656cce6b740d57189ae909a7e038cdf0d67605973d2e95c5a55ba1295d4e1b1bd133f4b423bc4782a7c9d6d4ceadf1a51e2f8dda95fd34069d19235dc653da4f1b2d144e0c9ee5d8bfb4a3614aa74ad46796b2e028c808049703809ea6926373f426368d622543873920ca4aee3a6b3deeebdc8d04ae77f24cb0ab3154dabfe77099ef33a2993c5fe5d3030fa2b8ce2b18fe0721334a811699123a6022e68c12b997fe159144d8f0b2a838ef0078e2c7801b32b958bd3a6a3bceca8f4a8bdabc8631d2f26cf152a914003d08c9003e9db463d32e8984562cf805e3dec18cbca1a4abfeef9db0fd7e16b1eb0d94e8532e78da562405a151965a4c43ec1236e0271a6c2e192cc5b17a075f076fabee4f5716244efb2ae9573dabf80d54e65c6290aff7535bf5573fb352acade0bdf2b9e97e0d0b0fb9df6b8e5d564d1bb6a13cf4cdd346d58318409970a3e8c7280ce13e8ba1ba7f65b650bcd4f11b8aff7abf57302017cfc921b52543f7e0914e014c0af195f5b20eeaf4673c4a291ff677fc73a2a12c4612123d7d82474fdc3d06868be1f9ecc132e5c17f927248b9a94c246f9b6e3418f9346a27e7b0c3f8b9a54f609542a180346b51b972cb609bda63406b3c320bb55826fdd07faf15206c8274e2745f878094d0d980dfebc14830ef3eb9a0f98fb188203a1e229dd08895bca33c5fc453b66db92d62133ed275c6db9cf43d232c42c5b15f766af4b87253021fe312b1ec800a94b2ef9bde04fc6c703721fce5867eaad0d21644cc510b72edf98d8018ce6b4cd01ee7b41b026aadc0bc1a98b26be7eca850301373e4421e64d1c0786b1c6fec2d01084d072225e7524e368865e3246b1f18d619bf7852311c308e22889d6a1f575259a252038a639b16de524142f1240834fbbbf0ea44f0fd02d1b23ca9771b26efc90cf3da1f60207175b51fa8c42cdfb601cb876b9c626c2e0d1052f37b9d750fce5ebe58925773701050e2ab7bce39a2f7fe22701c5f1425e06d1ddcb4e4815e3328503ad8cbbb6b24651767fd0af72af424c7abf9e4a6ce390a2fcbf587a2be6b8cab8284be91f90f00792c64a7ec0e080db5b52c924fa6301b16d36bfb4812cd04b88c96a5742595147ac4918b587b56fa5ce1ddc31bd70ab821ce0b820e5f364bb167c6416f59bba26028993d6b54b17366e6b1f1dad5de53336ce7a0170563c727f01ebba5dfdd875c01f24045a94e48ad30f1546a68803ac7bf4a137813ab1a9688a2546cd9cf197342d510201019f07317f4d3650591a3f60a0d1f989dfcd127db0a9ce296daeba39d5ea8c3b7672a6f401ed9b005327af0d7c964e7fe329c451f943dba827ebee5d346705bbd198943d71cac54d3521a199ccfc4549609acc1b22f9b8ff2cda32e133c94b2624ed9da859b425a649cdb1f500558daac7e895ac7f844d6932fbc45ea97cf904892cff7b611dcf3e058f7a536fb66f61549efef4d16e2c62a637b19625cc43eb50cfeea888c68d008e204077057e6f2c43c306aec991e1942a047a98c3c6cd81579704fa699a7a57ce6571c91a3c07c77f11105343625f86c50313c3c92f101f212c4ac02148e8fc4d2175c301c682e830ecea1b39eeb4301125b4a57641c032eeee9abbc2fa0cce4519411810557320bc3ac7f1b7b9ff419de286ed12cf2148a7a9b97af0df8a72f336b73128526383e35def64f5404a6376d8aecf58e9c1a7adcc3f9f33e115e0582175ad56c564fc8afc3ef36be93175ba016859ba97a49b7bbd0b49e185f9e4f8f250af5d5459619d7832471ba54441ed9fa415dd0abe46b17c84a02d9608fa67e40809c737081a6b16b813ebc360d01c9cac57bcd8ec724659dce6a019e3bf4f32bb7042056286fe0e68ef5b1fa4a9b0d907c00eccd3ef125f8f60b3dbe5d32d5ded17178971045c5058afbd28edb93be60a58d54b6cf97b06e6970bfa90853ec1312337d8e34157dbe11576c39e1e2282a1436972ca0755e3a7a3d4336d1348a8f445f78d850b6eacf6b53feb8d84e379f42d5b8a0e58b2d640ec7c77a1633118c598e7673eb3d6f611420fec1c4a11aee68a0c416766a2fb2cb8c2bb8ec59c0f7aa9c50580d2c8f868561311dab1877f7be7f2d8b270e53b455c862a95299275a688c756340ce89c21472e852eecb2d579e09b4f18efa3f801236a330e29870af8af111b6923bff58108e8e4216305c03492eb376578167f47d8e92f1892f488c60811a6bf548ed65ad5d97a8143a6974b3bcfc533242e24f6777a2383c154dbb7cd6641bbc2695f1593d8f574f704110eb469b8567a6b2f2d1e704a5849686b1fb90d846d241d6103f8d7dd4d9530353da2e47a58302572908f79a06019adb4a91290406b8779bf0e3e98226468d9d225a9d4eefc3d640b4c1fe27f1b509a4a7933c94c67cac5c6ed52ff657b006e6b0d0119305a9ddcf2bda852164ae46207e75d57a312ba5168b7e1ead0a0bb0b5dd0ab8020f60ffaf9f33c12865f62ec0af95c48afd1a29b31b5aec7b45eb03b77f1fa4e67dcc55a4d753af3dd099d1face1d70ffcd412cf782fc1d7624b61fa1ac1372fb49d1a2a4196161db401ad2e9d8c333a999978cc802395a5fdcc84e4a598a059631d400374c4be85194b1027d2672891882946e335d437adae48e25b6c67e88d65491d6a4669fdab7976c9ca5268e5b6e35d60093b2128752e51ff65b56a6b34a31b73eaca2c688ab453d3ea8b106a0e0b0257dd131c5a0f31de75d897750ec8dba64b701e1f38c0e530ecde73007e648182b4900e5ec1a4040d77b13dc4bf45c81e82306df0d4fdf5305f157b385b070c45238b6b0d459fc52a616c342a1ecde632304bd050aa355bd072b7d24282cf46451c1818e71bdbf24018bdc74ef7c24f80805f6c3cb44029968a5bcbc6a9d0ce2a4aaf949825e273c151bf98b97d4c40795146ca0ea5ac14b7becba466929010589cefc55ebe3b5b0db8a0ca864eefab92e5ec1298c2e80aa5ba1c3e50a592d24716649d4ba0d286eec73c549347a23df0a967de47e58ec63c478b9b0dcdfbc1808c78450a9b4528c0fed82147ec6af954960e56ea619ef59e8773b014b10989a7e01d3628c21b90503ec8b7e198606112b048fe25a4645e7b314d4b7c06d113b3682c572dc7cabfb05ae2a0938cc80f0b3ad2fae303bcb0a60f5fc59325c22e6c62c1116ea397bd352e3eef39cd8cb0ac8b92344a035220fc974cead7b2fbbd1c6286b94e414c14e2584f3e3a06bf7cd08414d0e0516ce64ab68530fd4280d4ad4d837a811ad826597476770649d0df90435a2021b728e5c2ece895e0fc1fceeedf22e13facb0d4a1bdf80405a9f5020f9a4b3dc121313b75e2a90c872a368108e2a7ebed5cd7ce4c915a5bd56bbd33ea5b5c68c6e42b2cda2061bc371e8db25a9137cf6e6804152a4fb2f5f12fdf6f68174727e01513ecf40c5d5b0ecd45a0d028ae68f312c56318090ea3622ed895d027a83000241dc56facac46f391585b12a87ce48567fc90e91402f4a611175c52422aa705001bfcb91e338120ce10d3caa907f2225f6ec6bf4b12b5b65ca0b53a78fb6f238161fa26c5a4807aefa2d80adc813b1e115f5dc42a70fa89980a5c0a11e85a026c7c91d7872a856c106e25042cd0a853604d7a32956d9be0d9b73c4e303141300057eac403f497458f8f0604ced25167ede98922680eb12a720a6b3097b6c5c8b4736f55a9ac92c9bf9ddfd359581e6b69e651f8142336ff53d651016a65382a73252f744a272d9e4c791b9e306e95c18c3c5a0bbff39c201d0308e0240985adcb4d6c13725b92722ce974bc660f35b046ae6147c55548a4209f8d8d365a30ef6e64488eead03ff595866971360c310970292eb91a27ff7fff1ed796edff46e70c54631704019b04c41d99864414c327e6f4fcfda8b1c124d8917868b4f5df290e14220f19d7452698321c17dbbaa06aeb849de203efe3aaaaf95a831073c537167857d7d0696422b5f285a1d7466087459150c0749950a38167d19acd91f759f5d53c7c9cacae2a7c6d483a8652244032bfa2426a7afecdcfe48f877ea33336c9d307ec6569d6c65c1ae2045150ea08e08ae8f31c5fc0c345ecfdb45603ae81341f14b084f0be3b341d636283268c0280c1b02882ef3dc4dc1a159c88d50e60dc28cfa87bb3c6074c08f3b7f2406ec5555c2fae1d1c95717fffce300981c518256adc90e8f0c2a21c7697971c7d6ba934d341c08aa644be47cf01d0d10070b4be067cc735629df8006ec7505772f2addfd40afefa12ee4e2ce0832766bf0a2040028ff4eae10ce2d441b7ddf2642fb3e1ce82060176901f9bb5104c01435b040b4b436d57b72e4e6554333e8ff405dbb13d1acc6ac182ddc66ef5b39c60fb99ee2c72ab897157874690dcad6a202db462984a65ec63adedda8918ead4bf2ec7e38d6dbf82522135e69ab1be56934a9f70a46fb746a4fb705eb8f489f19aa5fd6f351b99188e794ad95e06412b115e23d5af0f5a587e5f2117276a383dd947551a42ec7230f794f423689756454649db155f219d25088bd58a484d334b852d0fee87038397d603be25a250b07a3249d0d680118f7322e09b295ea1f80015bb1ef3dea8d813a2fbcdd1d4ee3deff4d7c697521a8d4b1641b7a5ffd66453aa909865c18bda058ab3c4f69ca88b8533b50058d2e5cce7adeee37db22f0b6cce86522fef7a49d5b3e8335d7cb34b9a1ef5604fda260f39456e92adc7293264b464fe88bfe5c939c3d856c10d50d1443b688cb482577242255e39018c5a81429812ae5aee58230eeb860a76e73c5a0ef5509e1b1fa00064a15481d0a56ee84d05e76c3f97ca631c44f66bed734ae93d1b93b2958ffff1f72ef94c3a480683de72f3378aa07be1fdf0aa1ef8877bcbf05c4b006d82fbb58cf20fff4817b5df4d6b88cba0312795a0b1e5567d397dc43e8841b6775ec6cb5cce688786a76422c2b2fa4520a34e84c20a2c5d721f1587cae7f281be04fc5e3c937edcf30ead23aa3cec2877bd161696f5f83c556b4a7ef8888a43321a7883968dd3b15f030601ee46ac0425defa4a298c5acbe514501bac6cf753013402c8661ee937304f622a9837be9b981e63d02821bd21d52dafd8eddd68751ebf575452cc325d7d8d619bab8a06a591a7212c50f6266f17def00f858f33ea4adcdcdf629a54d1bfbb6cb7e08d0badf747437fd89630b2ae24486a041ad181716c2ab6244ab8d0123d65f71f8d809b845ac74b8769d278cb77909031699c1cde8e95ac18e6e2f3e2d0981ceb79fa84961df08be1586f7dfe6438174a749e26c5699870f4ea5019a76cb35ed4ea42c6076ad175944462d29b12816278198f8fe3d70d3a4c5fbc2e575c0bea57b335fbe57f7f8e3f1196a0bb7fc3120a10e9af8b30c2f2aa2b796d018bcfed9d99c6afe761f800eea9bef9dd5ac0bfc8fb208562d8eeb136698a8ca74dcf167d999df9110ccef0739eb0d1e4cb75fc2ca7a96ade89a2a8afe31a73da9d02f728db4a244c9359985649e435dce4a6f26d1a4a1d419e80939e49ab8813ca54e574be8211c43593e299ef5fe8af61c197224d5078e3f2eec6da2d1226b6458305709e21f46aab464a297dbc23471a33389cc8c4135601554270613359dc60db48bfed4d9d61c998cb522a088468418a6c523458d0215d580eff5aa4d72f1f1f183a5a5b242f35d1b171aff3a6339dcd1d2822b372567d56f8cdc72bcbe4bf629d7dc7aade016cffc86b648c1499346ee7379b3b5e0505ba26ea7f0c3dca57f3630bb499ab31a34db2516e38f81d9a0a4f29d3adfb1cb9109d52d2bc9c2efab67a8b41f3633d49f35d0bc0bea382341306a536f7a231305f44ee7b89486b88ca1276e4ed8e4edd806c190d6e6e4536a82d17cecac55463d77b1f5e046c9dd054f374ae2064cda75e009d701a3437a902eadc567b7f941d1fd1108c1faeea88047bebc74b45327ff6217ca02a6b2471bb293172692d147c37040be9b904dc7f3c73f0cd796ddeddcff783fb9a26b8eb890fc9408e366e175c82ba83f8a75ec9838967991512b8ad48cdafe693d9404fad2ef4d0a70c600c3ede11979235ff2d4f56f2b095c5cb894a3313927936a16edc67b815b5f5eae46c4be48967f63346b73b3750fe8fe3a99a06fd4aca156ffbd1ffae3cd2c62da5e358fd806386e9f203ffcfc48d0eab17fee8be91f2018a1ddf57e18fc54367d02790bd324f01fa952f62d623538b410073bfa7017ac9b5d0c78db5702fde1874193f94fc63b4937ac1e1974c932cfa85571d3ab1e83d137a95e75fc4524e01d61353978e1e821197d88e4e53a56530b3b7813ee6d1f5b5605407afa222eeb14f62d817c1a041fce19795605594a171b1e016ed3edeae5599ac28a7e09dbf84ffdcf5b7951fa1ff42aaeda0d83b500d82388afc0b356108082f25dcdc377bea57f61c61ffaf7e85f40869aeec0b43ea11bafeb31669d84a2c78f677601b1f19e3e8677a6cb826e57e17e716f2c23c3b16237c1f7807d71895d98d03fb71a9b632a0f4de1a1e661cba76a934f5b8b178fd3052bf76f53201fd8ec4ab7e94eab4fc7b7111307ca001ed1e6282e89cb2b9f865d32377a8a44d7d213a54c338b53f79179cff015d7cc762b88c9c4d82b57cb269a8e57c333dee5389674e2a6013d34ca0092608ce460fa50fbe0f5ee096a07335f6c4fe3e82d57157bdd23a756fdaa41d85198a8c9a53428d39075285583979413217e1c902e0053efa6763646466d0d628e34ea6a9706e54d62714bbdccd39492d92c983202655d796269693b3694c6431c0ad217343f62b201cd521ec06b79f8b2e79340af1500e4921a7f9e786828b0cb8aeb61158b3766629fc5ee797b5684d544ea0067fede73ac1f1704d07c63cc3a551d2bdd9ca7231dd79d8694b25d241f893e511eaa772f93a2c39969460a9bb89a9eaf5be38acac350d2e595541040a9601f69cd14774216af9733f4508c24f83d6ca583cdce01a4aff2279d4452054a1c3494194bcf5ff04e70e244f15763c5b5b270b26f058bdc6ea2e01584810fcecfef971257843cbc3f683fc9aa01934aa0b3b10483d349c5c9ce16b3a1a1c118c775f00b35783bc0c0aa1afecf602f552e9daa71a9ada78570111c997bd988ecac881c7c46887313131192aa8d35ccfa411fd38b8ba6967b343440f2d22537c4ef1978ffa247e1fd08090083f796f7f2a0f81b6732dee11492924e70e26082d789b55830e2a5667fd4ffc9c28bd0b0af0ac438a4b54f01bdaa05a14bbd312a1d3b3d4e8402ad9038d7f10b98799d6241176639c78599218d4aa53f7ad03964bff210bafb06748bf1f26b0e8a6a06d07537767313e093bcae51e7fdbd714deb53a2bd7d7c7c1a1d61fa8935d00d5992e8b752831d34ba233aca2519bcdb4e8fee54ce35c96e6b76ea00c2802354e5c73baba995494cf952fe8dd1d7d3ad84fca77a1409b8da8c4304a5e9b5dddb1501b6f2a3c6b26a276db518a37c5004c4f6dacbc638d1966645a377b62733add3416c2da1e0da4dc07649d0b302240229052916c803553cee8966b71031d8001e84743eb6f9e587f3b3359d8a1f6ded307b81d2e17f010d443956a2fffdefd7ec460b4f310f1c9265cb22660cb6b7767fc9398a5a73eb0307e417c90ded6305e198fd1a2989cd004b20aa60bcf39dc4a050c0bd3d21f911bd921f2c64d0d2339f0c4eac2c1b6def031c4e07c9817167cce2c739f3a294835352058374543bb93dc2304e9ac2091e3440d9663f100d553f5f72442bd83cb4ec67785164d0025efd27ad74f99a474d77d504f24b7152a7bd019f1c3f2583aa05286a3bf483c2246afa7ec981754e56f54c01b01dec47b9c5deb516149766416c36c707337dc33bce59ae46d9f5b3901401771c97fc1c3b439020d913cd6b14270c17c3cd055fc82b66f685817832840faed01c4725eaaaf03f5558cfea98ad5b5d88508fd28e22b4f54efd0f1b4fa887866846cfdfebf607b04903ce8223122782acb0a6f9fdebde9f4fb003f06e755559ca7403faf1355aca08509bbd6a3174737bf7a24ea206ce8f5256e88f7c97a94eadb0ef2492f102a06eebb39fa142e31061f55bc1d85d6cea8d26d23a21ff10b921870bb047a7ed64c8000017e2b472b83355bfd0854215f4276c04f86dfc9cf70c085a7581eeb599c2ab22c477ba080219b8cabdbb57b4729929c2cc60ad60e8b3c08928ab33200ac20b35bf9e3cf9273ff9027558300b82f4fbcf4e4590deadc0d3a7a176431eaa566ae63ab23ff45e9f53d39650ac083f9c45b88201d0e5625b917c7dfb19427f16a56f06f6431761d9fe588961efa0a8be321c8a6c643e3c612a264b00fc639487429071cfd029053cdab97def9d621dbe58fd5fa30c750f3335489de86f2f4b00b785678155e7a580e16abf175cc5459cde7670a6305f443bbbe92b5395103e2651dc6ec863c61afa43b98c556d2730e46a62a8d7f9bb95407acfcf832c9d77541f0de9c9387b36b0336d24328c743a930a43ebd42c95b0d95f4bbc1bb29b0f0ee5bfbf9522a78ea4d1266118a1428ae29abd828ee844ebcf5a876201577544249fa63253d6ad4a647465d03b45b44d97b1232c11a87a9e488f42dff9df0e7a2060a6a29c0917cf06aad34ed53df9599a4ab61f392fc8ffb48f3447e3f1e6233587d613e8a1897c7c9e143e98d801de2b70a7a7ba2d0290bcfa62db27f0d7def60de1697ac0c9cd371f9726b958abe4e7fa6ec870d4fec72736f13cc09633d4263b55f69dbe531c2f792c8a888cb5b94c4c72e72fe66017a844297fe21150fc416d7bf898ad667516af63b14586e5b0596305720cffcff8443653ac7388450457fa31e391aae4f8a1d18c554ca22e2ad0a0307a471c3e2f67cff7091650aa8a429a02059aeec0c472b6516044513a85204cd3ff14931b7e9ce95a486dd38509b408e6881dc8500f4e8a5845d819e047d7ac3426b952f999e9cce0ce142b0e329789c96f02825e1b09c7c392c5d42ac0cca98b75266ee3c4b1c6ef24cca07e9785fe90dfae094088cfb04c2b4e0dbd329a6e858ff9cdc816fc0309041a4bd386bc64a9d7f547fa24197dfcf3ca961f8da3eed5d881529bddf05f794d31fefa62f3f40ddef26d60dcf57dd3b1e3be7a04426b387be0647418b6e1642a7e14605f66448181245a22351543d5bd2528ed9b03d71743edc08d18e255b23746c36016ef4f63e166c4df6fe9130e468356ff67226c6a907fbc9b9be105e03debff76ff7ddc6b25a864e85a44c335efca6e7538eee802e0443b27a8b3c03a684f12409e8c26de097124a8128a1aabbd14ecf42568e3a9d6eb4a0104ce588fc7f2919e87a67faf6a6a202abf2d3fed2f650d62d7ab30ae233a78db101999cf757d4692b21816d2126d8664a9b7aa3092c50e6d7a45d518f57a6d7efe1043faae37333033ae28090d492da8c65e321c2def73a82f9c5c904413c591568f5d471bf9674832bdca67e5b21ce521e50d33ff27627d6b1ab17b2409f0a9f61fa16d5bc3b453cea1f7c4f382ae4217e73354b5f0b97953fc961d69292b8e648b7d862b5122a9ebfcf26d19d488b675169dd3ff1069c22e6968df53ff1af6759d77cf0cff6b1281e9555d7d74ea21afe15f53aa4b989da15f59867693c0058ff47f695eec693bce22e7cfa478ff383558b70d5259b6a3c1434e6ddb19f1d1f0222cb34d6483a8a6abc6e6e933af8175c1228dc44f66c65eefe30f8c08e8f56ee5fa7ca9f0ce6a0baf61490ba5d78bc88394e2f32b1944f00b7b87205088d283ad5a749ad1391dd989b842182416468c3501e7c08867db45b9030133f4a473fa146bf9b013f7f48b282ecde41016d59aa1f5e54f25bedd2662ec0a972d3539cefa5b758d55ea207d404931ef91f1ef591ff2b26363307f5d20da89b96076093b966f0243411e63985cb2abfbece66ae70df0b2431849493f821613a141b9700353e9f805b0eaa0b4d23d01664201a4c0d170742ffa3ffadd7cfea17badef1fa0f39b14a40cd576c3e541534e4bb1b08d07e6fd387e76a413404f6c2265b5dde2332a620346e40b38a9fd62c2f0bdb99de5c3bd4f7ef133adeedc5989a0abfd70b5b8c5e5eafafcb22ece5bd3fa075ce05a91d5aa964b73e5c8f0659214e3f82f06695f6c2870c1901042a05ae79c4d70d58305c55493a9904adb84954be5ec756bd91e477784112d931559cccab586cbd8a9d4d0aaa7845e67885e11f000e0ce08d185c3212459aee058e32057f8ba05e61562b2b86bd5340b7b289ad6d6d1342082164934df6967b07d00dc20d740d98858b0881fd601086a47fbdf61ae790277aaa5d62c1fa8035ba4c29856cc8f41acec9341ac994ce70943e936e9061b0507b11da8ff6e831eca33d9a95b4df9276eeb026931b8e9a7dc0183a02cb5df4f89202e4b91321cfe1be12f244f44558090e5779a298116c3cbceafd6672bde663620ac821b721b463c7ac7f5eb65ea505642663cf30ec70c321447bd487b4f8ab411b8e1b0eecda75abd76b036426670732b3438b9447a330bc75df4dfeb677cfb05b7f5d1dd82bfe62c62ceb3472fec39e754066f296a33dfaedf2d082ed8efd833f1db6c1aedd067bc5ae3dab1709778cbb109d83bb45f4893e8b391a65612a04f5314160b17f3048a63d1a1ef6eb14fbf6efba6e2cf6ebdf775832edd17b8dbab6537ad18b5ef417feb6d767dbf5daa3aff7edd15bd7a53dfa4cb1d7d3bb78db85b96278a63d7a2128fde9e97f68148418d5b04d864ba4f6684b7bf4b3b384833d3d42a672f89029194a0fa545a94cae47eaec6a904197ec0a433a6029b83fa8a28e16c4b2e68c4d60e8c44ba251384813418458a81964bee3b239b72cdb66b6f5b66d338b3a4080280f00d09352665847876632c341a8ce6c6207f6cf7ab66d38eab4a83365f803451cac1b55834e8208c95ee50ca7c81c4ab2954388f6648625f7afebb21c3bdc65d775dcb79df67462135b7663c333368b79663ca2ce57e9c4262a1df94aa7622233d1a8a833e1cf132dc833c69d183ba7bb487b4e62cfcd553fd19e8c3a30884ce5802729e1cf3d99babc04c4d4850120450402f4e475a03f500ad4aee40f3aa9307432714cb202fb91482d5525d25db14ca15c3d562c40a1c5c202194cb0862c83fd754f56d5849112880504d35ee5f15493a73daf9a3b31c3ced561781a0569e46ae24f2657d72ccb925478fee6cef4e150f49b9975af659d7bc5e1f9337daa4f6cddbbf8581f1a355f9de687466daf9e03d680b9fa8c2753f5d82deb73c705b783eed9e9edb2ae1375a2aeeb3afc899e3d13655aa68962d6660ce0a93ab4f0dc813115f63a9bb0b1b71dd93f7ad1b3ec6a87b04445b7343acc282291762b1cac7511f6da134599833558dae8deb0ed5547b9293cb073c7894695745499beca14b7b4579d146461aef2377dac5955912babaaa8e895fd2712894456645f8944a24358bd7b66af4c7bd5bbebc1b457798dea5e1d46c67619a52368b12a1b04a04e201d2e9985310000eb1294a8d6d1635b0e98299e3f4c582f48a651308d0acad5ab19b4a4511172f8a78708b58812d8ef1b8ece39604cf5b902ebf5b71bf35613ed55df6e3c128d74ccb9d78d3857469eaa63b7a2508335524831d8cf1e99f2e68eacee25c955e5e56afac4274c9d2115424ac8dfccf0ab59c6121dbb72d6e306b365d10a0c56067b58d82a7e0a5d44e24d748184ead0a5fb4674a23d198b684f06c9d00a999610ec3ca5980f99c2f04c9429923cc949336303db48b037761f3a851d16d1271f7cb427a5b0f314c79dc8d3a84969dc893c9167273ab1d33b4e441e083ff344dc7922ee3cf144a322842a19fe3cc1837a8545229ede4703606a066a016201a7603f185444a76664a3acc39f2c5a9e4ac12231e51b004ff25ac8529621cb199982353e3f1902f99081ed53ecb5274f29a5ff48f4d7a398d2936e0b89d4d22878f9570ae12194f1487187448a3b3b8d8ab345863f3a9041fe6658804bf008999af121539e930c71cf68520b023ef658cd3171e2e47afc4857205d71c5154b581ae9094f78829ccd35914197c844a32a29a594524a29250ca905c228458631498c7f310a18ff62cf132ed189d3bd7fb1890c1f751a158043001c3e1a69143e7ccc69d43d7c2cd2a81f3ee234ca74f8218dd2e1f049342a87c30b6954cbe18334aa7478208d7271f8231ad5e2f046348a74f81f8d42397c118d1a1dde478f467587e7d128eef042346a3b7c8e466987ff81c6879946d5c3d39069149d7196ab3c65c67581a797cbb82df0f4f2984b82decb616e0af45e1ee35ae8bd1cc6d5a0f7f217b742efe52e7742efc57b29224f1717171717171717efc67cba117a2ffe72bf2a03d9e58577617eb95fcc2f3eef77935d72006e1401f4e24b40863c5d6e04c6c4bfb85f14418e77b91f9133e47900dc9803bd787c6311e8c5df1b71a017ff3b047af1a69b04f4e275b842a0179fc30d02bdf8960b047af1a57b04f4e25d5c23a017dfe2fe805e3ce91601bd78962bc4ca121fe0293e05563103bdf8d1a501bd78d18581a7787b3de8c577d7057af1dc3df4e2b7db02bd78ed92a0179fdd14e8c563d7420d42e8c56824cf9c2211e7c9101a9c64d1e40a58ddfc90e70c8d5c1df6c8d373790b29c56ab9aa5e610a0cc95332d1a8ae7002ad10991cc5a4c0d1b99a12499d5dadeed9d6bc356da6bcde575e127ff31788599ede3ab4ac5aad4967cf2ee99838da921513f5d5b38ece57af905cd5bc6af55ad5eaf37d6daa96178879d65aafcb7afc552bab9a51e6928eaac22579832356b3deaa0419b4724b7b4d6aaf6772d3c8de4cdf87a6d1a88fe4c1340a3ae12d59dc745819620863ae95e116e3617443273f792827b5b55630c349ab7938279669af3d1a3f34aa69f467fa34e414a07881bc41060f60adf7b3ae0f5d52a27cd35b527b11d3e468d4079ba6bd48ad579b8ebe759bae97b52b69594d1fabc753d9f170aba20d6c49c74dce31c62893630669dc4c60ab2cb1f86e3a42a04a564bc8e0016c87c3cad9a1cb0781dae5095b1d23b1a4f624ce5155588591485a5570dec2e853f27d1a49d33f34dc30527b7ddb5edbc0c68a1efb8d0e7aecd98d1fdaebae5efb86bde297aec35c310c7b9c44225f9d88fd1e7f998a35dba5c961c4c26f26b0305b2eed79183e1616fe7bd5e040d3d046cd7a22ebc11ec26df268af477bf2f30596477bf259ca085d4a79208dfa20d08f467dd58846412764791e3daeebcff21ec6d01cd80ffee41042cadbf8b64eae4b12016a1aa67ddb2e910b8b26355054d72e116a8526ecd468cfbacbc9d20bf693492ca09d7a03ab4175eb184fc64d8ecb5aa687044fb86c42272dbb230d73d303d0c069cdd80ce06175760468c8f3ce7c318087c68033f068549021900a50e80cd510d998a053a37d4950ee612647587b368c472086917ce21bd2108f2c210a950339eb232cb730b53dbec294ca4ab5b47802e8c5235611b2e5436345d790c893638323354448550059ebb37e6094a2165bd6831565a7698c8399d4852cc2a053338408e90c3e35a7024e24f5699402179c0c2d01881bb2eacab7cfb8823194985af8b3a290a57585265616a3db9722a6008eced1e6b3af59bc3860aeacfbfdc02da4ca5526e9cab27c608cec3c053cc953a192492c2b525286c41f252ce9a9194244250b273550644788603d476a549e05c17e1610a4c416aeba5a4b80d6aac2328275040b094ab27663cd75e13544264ee18a1434a91942a48509846a669a07f92144342b7a6a544e041554a3fda6264bd2fd93e1862c592bad4bb0a200ad269f95854c029b872bfb81dd4eff451f48c508aa907bdb81926152e6a5396e3a462f05d1d9d87787b9778c5ee7cabb8b4405e7bc66055b55f44965fa30c9f228b7cbb5d22e96ab0f04ca5d73dd58c35d4b0966551d6bae1f518bb9518fcbaeec96f4692f9b8f58feb4c77257ae722b3c59dfae8527ab2fa4924ada9337731bc27ac472497bd9953f28974b1a25ca44572e694f89fd2795d88b4ed3dc96f26ebb7249cae58ffc694f927c7c9e7157fe489f918c28a7e994ee96e829376611ca3b135265ee2837e67721c83aad2f46020dc40d08fa78a9a4511d5e92832c21ab8af6b273d65a1249842d9f11b694549161ebc707f68b47a2cfbd72c4a68f8f8f0fad2a9b76634da6b90c8580a76608116c0c40d6b719638cf1d61cbb6384395a3f1d6fdb24e47aad3ca435e00338fcd40c2142e282931a28b00f21428b3054a39d48017c6aa0b0200f49a511d21b6c1ab2b4c4906517b28d02e90a3de02a576b0f0baceca3cb112e8d5ee5afcadda5926cf94c28aa45186a4f724f3a1cb94487d3dd5a8b2a891ef3e86aa25b2be56c0a87cd00035aadffc866b0910aa972c4306e08c3d447d620201772ac17c9b651ab8a3e256994948296600c3dc8462cc8b5a7086c0fb667640e87b8216e08fae41e6cd4301b4483dc21e4620e7686c02c14ee0265552502e59e81653900f4686c3e004429c9f290a6b75beaa17dfb86870c59d902929d9a21442a2608d56827c292a4068af89b9a2c6a9a8ee533b28c0053416a40942482e524898545964b7012852b64792202445948a0b79060593e5107593eeac8d3ad39a3b7b375638e3e9665e9c81f9924c61879b28c3d0a8835f1081492f8583a578ffd2c1fcb07d69802a6aa15d609d9a2421099e26ab5d689f5e333942f94113891eb10d8a34f7bd2aac2fa59c2fa69215546a2e19cd75cb814b1e56355d127c90de5c894d5034f3265f57043568fb593e579006568f94cac665986ddf2b1aa6814a462043859de72623de9d48c23969246412a44d04426b198583f9690644313f2673559831bf267a1c1c28e7cdc501e9ab99255ac100109f9049c1bb285e2862c1ab720e015b9bae593a5e533efe32268942396e36935217592210088c81b8b48531a811a64d0e5d3628e3e411585684fce1378f404596234b0a2a7e6b1798b4071d93adb09198aecf35996a39e204b4efb5cde4ed8b60b6b241359abf55050ae0c1ec05eefedc61a1893c424d85539abbb8ae276558e25861793c02113e40f06451d5c2be48e6d3c963040d798615826e2ea35a7288b22ecaa5ca76975bb8144cc5f4ca26d385251278b564427a06058d4a1a0605dd77547586bad45b95fccd1aaadda56cb509de854273ad5894e750263e43dcff3446d398ee344afb513751d1caa81ad68e893d4618407572717fd3a83fd913ee049bec33cb65ef4cc8596ab282548ea33eb3d30b4f5d372e4419d580d28ee5069d520ab9e45fb6fc6a551d945d684d2fe65b9ca01da80714685d998a3d8411bb5461b5a9c511d461b76461b2935da20c519550d1db468a3a582f5b7d1c61129d1061052b411a425da10527129b96a120586e4fe11d14612157f5d1d48b431c4ca22570f126d449cea42a28d58a40330a63a4543ae9e4455551fb2038d5c3dc9d5234e8c5cbdaa6e459c5c85007ad5b5fb02bd8a875cfdaa1e3b5024da70893342d043ae5edd54049349072a74d021872972c8a105fab4b4940c502ab928800b172d08d0a205c9071289c5060bcb4a8d9515951e5454526652525052282823d46824e24124b234aced06d075dc0e1cb70960db34194dcb6664192603c3ae98ebaa30b55a312c8bc2a0b43ae5aacad57c8135a40c00acd1778135605669a9d65c9d4711d5617472d5b3037d628042c97c62c083fcc12532b9f22157af16bd3ac8c004dc623f1ec99a7b924197cb850af0542f5f20ea1c885e14c9f58511fa4247ba649d06ebc2a453239c9a7a39c2c932b56424d428edf5dc3f4d93d7be43de463b96026a4fc3b5568d947209c21f7647418dcab07a6e6219961a050d09356ac4a45143b9be8e8652684043a3b8432c84724d3561c34824d960451f1da230b158adb30c16c32e42d865341a6a94f6fa913cd5d76aed08c76703423b86649402922998baa25315428891d0f297dac9f59fcd69affe6b119da653383285225329575979c50e658a746dd369715347e4a99e745339f254cf725338f254bf726752bc2c533c3235da913d3295f2fa54129942793d94a20b652ac5234fb5ca54aa47a65c2b4fa924f254af1de5a676642ad6d4a7ea533a4fe5340a47a65cb2e894148d82d0d35e9f8aa2534f746af43ac2291e0d4a2c5897205863cbd5450bb9ba6091ab4b1972756143aedf8b9c5c5f1cc9f5854eaedf8b9d5cade8f52e4232357a7d76474123a1f6323c476051aef2f8cf25a8a480d1514ec4e828175d89d24727427415ac440a2e651809499eea53eee5a91ee596b28b0e6b46b794e192022c8b5e8495109d8a4eafc4e8d661cd2c83c55b0d2c2a48d6a36ab5161594eb4557469eea47b73eabb61b25055817bd87751186f2d4835e4a6c849361fd6884c363e58364aa6bb8730be81a972079aadf782ce742051853690f86ec8c0b93940b933ed5bb04c198faed05b6fafc265d98b477038920b04bfce9c02e2fbf03c88cccae8b507bf5da7509da7464c7f027b18d7c10950d864b3a700983390db68fdd1fe4a5f1a972b4c904065dae1f1fe468a825320ccad8b98bbdb70e07911dc336198ee7eccdd15e7d778568af5ec201621cd6b2ed8e98b4574741edd5378c8232fcaac49f4b935cb12c06251eedd5c3dca3bd5aefd244a646412e4132950282a7fafab938c9157309ca7514946b0a28d71fd87ec514f8916d667072fd752b86002072dd5c9d830c62d6d25583004eb865588d96cd241a28602305aa810fed964ada934a1a152977a0d25d60d660680186c16a061f1bcf4468149b68da51de8d7ba07c34645efb4d8d7c36a3856596a56516f6aab61bda0d3404438da239905ed56c287a4704395e51ceb419337ac40a8bc1adb6855995cb14e959e3a4708ff43ae9b25c9a73a98f4a0a061a61da840a6934485a2d191ea7e4eaf6912138c972bb51a98c431ce210879af90dc9f58d4bf1484a11d39c1a6ae406538c61087427cb531d79925ab470d028681229a80fcf4ce2639941ea7c512863b7b9bad109acaebd260ac99486698e3c55580995c2fa47732a4b8b28b9bad14703396e433c639f3c3e56366d13f34231371c3237a631367132542d2cab604db3544d73300cc33021ccc2300cc3d6a547dacbc93acb9a4c9e886b76d993e7b55a2cf561863f29740490264940525f2855aa2c3a0c60a8b0a8a14798187a129d08b527e3153c32a5759826694f5ebbf396e2b5c39a8b88790d6b5762f47922b4a7602550aedd4a83ddde4d509ae40c7f373963b9758851294677f2d01c1e3af1477b641a32dc6e603f3559c4a1228dea9c68a371221ab23cf6ecda6e6018cda147ce60b79aa25997cb59bd36471414ed704845b36e97b3babde4237b114156d66dda757fd06b849085652931d715ecd62c079a43a348829680ae80c620cb1ad024193b82fde4fce844544fc14a68af3ec24a40d1437b7525503e0f6bac34d8fe07875a68169685c1be6190b16bb3755b72e45104e51acdb98d2593f6b85cfb5a05cc6bef31afe11ed5690e8b86ddaeaf96e11644f7528e2ed1c3be3f123b943f4b244f3dbd3c8032dcb8fe9b3c4249e0e4905cb292d691564c735a9020b424c73bca59dcea7502fb554d9ac8d4e4993c4de4e46972f3178584660c1a2736d140965f014e09e607260e8cc9e6b3aadd4aa80aaa98d40cd75a6b862ba12ac8a7374a3f90250e8c9154e7d28d364177e4c95283954cda6734042ce4785532dc869853c8dc23b6e172de608390e3e5b28719c17e3d845561e93f9a3394e1153f70c1135e588110cce0a4463e872d08b964c687f6e4ad966d87fcc1259a1f56a2007db2301081827d88c04697cf72d0b0bbe52cde9a9934ecd69cc5ed46490128d7de03e51a1e0245f621f32858f6f4d03ec243aa6b58f2b46417f148fe264f14a27932694f6245b0f4dfe4c16e4ace2e9cc267891caf95fbb6e47aa3c4631ee61e398860064cece0441f998a5a8027792c7ecac086202118239f69356b6399d56ee8219a036b70f1fa314685fd680ee591a94ac90fad824ad1a8d4114a7ba8132099923f42cab1168ed0500db2424de807600c08604c08a8119af3499d1c2b7c5c00b71dd9375caa1a18740037eb07f63a4d6f6ac8d9ad99d4d63079b63c79600daa0363640d608af6f8d4000859d218e880522cec758d0838c8d9ed72468df4334c73da9b3cf309cefee338ee1fcde1ec9d3ced7192e3ecb767f6d22334871aa13934a7515b66399af5d0238da2461a4599c8f249d86d8a254ab63d99d29eec7260f59337ac829cdd2ac36d077d0989868940273e35509474dce49b4cd37d45b9e32991680e3c2591a9aa093cc9574d688ecc7d493fc8fd166068fc59b99672bd700a9f26e46c08ebb525ebc8d4acc1e4919367f2d01c2a2453f112127d57dd7c32040011eba622126f2891be89d44711b4f622bc9449c01a25203a773c06202ae2740e99222d01bd782e892538fcc12718809e4ce5a896f4cf0ed858a4bd781c6dad3836c258c19f1cb56a3692723ca951467234128dc09f1b2e5213c48ef08d6960e0fde0abea555738c62a56b18acf4113233c4dcb6e18638c31c6f8081fa33cc2c5cd7f0d54eade8735a50e9714106f1141df58893ebd859580a2d429613de252f71a14eb73bb0bdb2b4350e7a0601b9413875abbecb74e6763ff68b82f5c5992d591624deb48d9a2d374b70eacd1b5065607593610be8e41d5571795a09c7bf74e9139392dc4f29506eaa02cab65c12838c8e27e4a761e1e1e5893d23bb979729a1c69ee1d1e7ad29ee4f0c71de592fbe81f0a0a77947ff187bb0dcabbd3f4e8c6a1f6e4e8b2566b510e210afe46af40edfd74372af9e17e1a559534aa031a553c63bbdae1c6694f9e7b64c27ead93d38de2bee6388ee3b8d844a6e250904c751c0aeaa038c423e56bb5360b4b45cf5a8bddf063b05fbf7590e05e6d7ce570c9d2f84b477479142962bd5f247bebc854ac350605b5c53c282e71a7b1479f5a5809287a60b7aec43cfd4d4d877b54195602bbf50a97b87e8fea8d8740d17dc8c425ae7a877bccc7473c04c3250e9714d0a72722debad5349dc5ed58d0867dc8933c6c928361284f550c9229582394631378042ce223873cc91c5001b046be48f3e830b1f05febf4e32f204a6446ba32862c83b4bb29adaacfead2d9d27a354fe5b47acaf9ea77deaab507bb6a9594d5a59472c2ae47ca1d969414b0f2ecc38ea721c830ade9e73ce693a49a8d6a4dcacbb2682405ac2c4f245bf550f8d1d19fd79af5b46fc9f6c1a4532802334dc59a6e9d396743c9bde5e72df5a74e9e3f99a6e58d3db193d0696fd361657aa3d3de0d052cf9465dde4c22f1464e8b0542f9195aa104142801ca32195aa164275bc127c7c8d08a2a449195642db7644c78227b195ac1842239830db0d00a264891b3ac3dc35e3ddfcf662c1ecbb078cc896b731de698d19b585517d239c31adb64b7b057596321387e9dadc72a0821d99d893146ecdff310d7adc72494c29965b6cb46d75e654a740d7f581058ceb40d07ca6106731663c4b2190ef2e0b667d997e1eb6608912432a67d4ae4ec9a908c4d27b24d3d919c5db8e990d97a86dd2cfec27e7db3891c2920f317b3856d2eb8edb01e1b7bd6e219fe3ad7b7c05f4f9d2c854cedc23408b357989a3984a816cf3e21cac5337cbd5ecfb2202a8e3ec0a5ca43a68e18227bc49f8eec7147f6885d7b8c22da88d770e778ed157694ab6d385a1eb14d8b0e6739942a9996e58061c7361cd96db4ee57a603ce01b7641dfdb9aeebba361d59b670fc7563147146757947ef2b7ae9d2bbb8dd5b5c7b1a89525fc588e7fcaa19638c56b576d4675fcc194ac4b1a7bdea333245fae4f057b7993ccf43a648f8086c57f067710a06fa62d61eb3579992cff0fc84cccc3d4258618a847d42d4750c67d9b56347c14168e7f01773469a55bbd1077146c425eed5b11f215316cff84ac8ccdaa9902a6bd8add115ddbae1d06e83e1fabaedd0b2064f18e661efee841e863f4bc394d25bdb0d7a2b9ab90f0339fb3290b32c6799d391e57ad26d696fcad39c38cba25665af4eef7793a9f678bf7f3663cfe47643abeaaf9b0b471fc419d5adea3432f6441f441b10661d286bb556469c8a48df6c958b32c80c7ec64b4c5373b8e07640698e46d1a6b4e6a0a1f92147cd1cc8b0bf3d4aa910edd126700116fef42028630f5995a2b2c50a140c003d795a2d21cbf71172017c8833e4673a2546c8d20a335598a1c24cd0cc1466a4301385992533509879c28c136680669a30c3849925cc289951c24c1266ac98f99941c2cc11668c3053c54c1166a8989962c667c60033059821c08c0fa41429b1254f18812809021dbc0028c3474b4254b5689412e27a29a3ec283bc608e3845546fbceb27659b29064655dc209e7ab0867c4eeee892d4ff52cf6c09a3aad0fe5eabb608d2b57556545ae9c90abf9af0ad5aa3e831142c92199a7e91979aa7a03c2e699f6aa4f2c234f5508ac1358d33991a9c95325c9e6ed9ac853454b94d69e1a45a32015433892ab57a14665d129959e2a45a320154218ca958c925cf554a05c452756f8d8207f352857d5112a86b093bf7a45ae6ca6b1651af5cd2455d72457afa8102493a750754d646ae2243e1547abfecc03b68f61d1012b2511a414ed55efbb90ff6472f5f6aa27b9dc0eac44434662662466c6b5a7bd2a06f67b4fae3a279d9346a101c7e274671ec858e6d510870c6fbc412cfc69e249feb42c6a32bec2a59f236fc8a41afb6945b5350d1b4a28533dc0537f8a6ac50c8cc1b13234e6c4de278a86c00a2a9c6439334d2701a8a514ec7c8e191ce60e4b16361d1c6441dbb6cbbb9d5eb865d7b2f6608c96d629eb71489096ef6e9f65adc9cb0d88ea16d3eef276a7162ef5618dd6a7d89f37b0da371c63cea433e2ccfe912373220e0e4ea3644b097bc6186344cd0cc7a2c242eb573d369bb013c77ad59bf90063627fc6227dc40fa1887344ad47fc3042e8871147cc98132395f608a4d1554b991aab5859182bc4335642293bc29845cbd9ddeda3bbff830f1e8c10cda3513caefa8c5e1e370715700861fd8d6acfca3124cffc0dc93187103c289d4264b6e829be80cc11bbc06e7bd485a4904117394760ab2399d96481edcf6d6ef2dab5292cf7d902bb7d9bed75db55de755bd76124a2ab6c5779d69dbb36dbcde8cabbcb7d1bf794af7457e5dc558159656e1bfeba7319b7d29db3e15038148ee350bef20c6565eb1ea4512b47b9b18267ecb61d6e875bf716b74238adfbd67d3bdc388c44b425d15ee3e8e2f659cc51796fe7baab9ce3baa7e0b4fc2a3967f00056e51d15673892611532a4c20c51642acce044ce5e5d47779567dc57ae4d77ee5997552d6e3850be9dbb2b2bf8eb7e8198579ef28dbb2a5fb92aef6ea888de729188444f799faeb75c98234ea3ae94ee41926854b7f24ef9b7b2b2f29594241ab582bfe7148b575656f09772946729378920429c046914cab71b28510b22e4491cc184ed58241a09f26448a3381738955661452928efcb344a6574f8c658f047c2ae6d43444edb7474f76cdbb6ca755db722c160576acbaf4bdf6dbbd175d85b81ed7f357358c39f10b923ab68e880c290933cf3079f7ca4aa87c542fad4a7e920edf5ab9388034f32f5a3a11046a4bb42d9c9a08b8e8d2d446679235fc1f6607b15feac0b9199e26f48eed334b4a4c5dd2f89cc3d6b2b9628c9f6756b1cf0d671c05bf3d571cc57b2fb7213dad4dbf78d39cb2e253c8e09252ee98097c701b3fad12586edddd42062b6dfec47f619dca1079bf2b9dd408171239dbba467f0072972bfc513b9cfd9c3283491e1455644c148ee73562c7992dbd2faf10b9285c86cc31d7f2d43b4781f7e960ef1e7820249641b791ddb1b5ee2b8991506e226535ca292d2e3c0f4dbfdaa8f8e80ee560228e676909205917d47e392f5c35bb24e0f4b16064247add2b28e63c310c34cf19744555d2547cc9d7c8685c8148a6dba5bd8467421f7935888cc1d9ea28f3eb720ece1e5a64384610b1622738bcb43fc95f0748185c8de86e0de027f3173ef8f4886774223f2101f9eed7d4264e6f0a7446e1d324f3c2bfcc90b9159483ff6fbfdc65f11db8f0fe04eca026e3bb0dc1d5ed245f74b228be47683f4afc5b3eccec358b3e3b09ee18a4b3ab6d7e3d85e6924bca25737e6ed22b96e5d558b169f2fe9b05e1d87d5e2559eb8a4a3fa3c8e16a48f3e2124f5a68324a2d70606617377d285871b4c5ddfebe7c49f90cedd33d8007bee197c8085562c619239a96da7f7b35f903ce7a1f5eb52abaf0bfb44ebab8ff4956f9702561ce2100738e4f9c61790d8069e7bdc82b0e7b8aaaa6895b5d65d8eeb4ad64bd9bbdf640b97b6d7df644a731219bebb38ae0e8ac3d261615a5d04e1fd482702c44d2e552fe998df8e63e20dcfdfe40a9774d057c741f117247fa393b01099b9575888ccf0a3df64d8d148eedab3dcef883cfacafd82e4d155ee97441ea5e019216e320abe40ccf672d3a192ed4799769ace41495a8bad2973ced93db33e2f7d7577ccd3bedf84d9e7b59187d2c2df902ca433c7d56f667b528b66537af6a765117d536cd96f522a33a517e82cc25f125948d7b6b8bedb5e3e939706a382edc33c3f2fad10999b02310e7188431c7458a073878574e6b0c416e82ca4f3269160cfb40b6b32ad2fb3becc79cdd553ca9eb0a65ef70695f5afaaaa2aca4a56b2c274fe90234e3aa7849566ca8e5f9f56b31f258d534e594929a5f778fb784b24d62a8613dedfa8eff17d92c49fbc5a7b5d610b65ba90c11d6c5b45b02d4f299553a65a6b6dacb3659c73c60436fe93c93f3a9842fe9edbfaf418704c8921b411e18cf82fcb6de188218c9142d2490aba1f46c0c7d75b94f6848781f014ca2a299669cf93e9aeb536ec0abbc2aed0ba4774f78f46c1232c9861c442414734ca8846b58fb7270363e2e795f2144fb2d04945ab00ea5475819aadad5a6699bd48888e847df7ea16d19ecd695fd1c8147db55e6125aa5bafd8b2ae44b5b0e612cdf6b9f6c2793a67d085ebc6636e9fd527b522abc32499da70eb8826cdaa68756435679c71c639e3dc663531d11cdd5e34e79c739226cb5c992af3eae824e1d661c12b2a19b73dbbdc9c93833574ce39bb6a65f373ce39a7bd68ce392dfeec479ff629ff46a38ffec51f7b9b51ca1ce13947733447f323fca5fc7a96722390684e7b7d8a5244974864a79d737eda4f3bedbfceb187d05a3be79c73ce39670ecfccc2d65b9f1bcaeded26da9bafee9c33a875ecafcefa6571a9abd69c73a2d0572fc27d439973ce393bcca3e2927db570c9d6f7a85ef11028ec87e01edb10eedb6f6a685abb3308d5ad1351ddc2509e88d8de49ac6c6fe36448dfc33ac543a0187d88bcf511ee51cfe1215d9d08faaaba12f2f44454dfb012dd3d3838383835a22bb3bd152777b7e2e0e4ec4201a96802929c4d0ecf6d4e6dce6c4e585361cd9c73c623e62d5cc4873ccd579c439e660e8a67e4691691ef4942410644cc2f2249657559c9c0180b5f61cafa856bd3d3577842d9284aaaa79ec5b5bd299b07f6bd062b3fe75ffb428cc4cc4066f2c44684aaf8c1070f26470e21fbfd2e8d4ab155130a42061b05ef0f9797a68ad887f66077cf99eeee8e34da83a7e9ea5e96694f4afcf56d85e92bdc8da9d4b1b1bb7bde548dc41e1a8d923f8c3822e690a291d844965088e6871f46c02b4690e1230822ea47f4e4a10a1c1a412844219066532bd0ca5476c86dd6add0ebbe7267ba4f48ce91a91ff224af82bfa7604cf2b1ece5017af4333df880235751b33e619492a30163e83f1ebe207275eebac013fd0693e9b57be8d167d7ad971651dd8720b9b2b0acf08f5aad255dc61c21c412acc027063e316766c6874aa351924857f45a72f9c878301efcf9667208219978333e78300280a81cd0935702bc076120aafe25c3bfd001da205d88a2d758a08d161735308c9136da789c210f8f02614d89367e20451b405aa28d9938c3830163e437ada5b10c8c39e6e5f883163217aad8013df9faf32bb23c8557c8f29514b23c1058859904c01829449c210fa390bf1953184c261dc0a0830e396091430e2d4d5a5a4a5f28955c78c1858b165d68d182740589c4c2051696952dacaca86841452545282505250b2828232c8c46a22b88449689b59d15ba8eab02c76d54d8362d48d3b229641926050cbba2705d7549ad1614b2cc21650e9943ce1db0869432cb2700d6681813df597e881c42c829036bccbeb1a4d686acdf8385ef0be10962152231e6904197ee18331887fa5a3d5273c854ec403cc957ffacf5ef97f60d7f32b1031185fdc238b7f01780fc451c527c414c0194a73882ec01c03c19f98b4332a8fcc5a1e8040bdb2998b2f264802c1f03a2aecbcf80a97a792fdab02e0f03d6a02ff202dab070d4007c8135288e4bc0187929b38c433842911621db20ac118544341c007dc01a5ade5e04ec42dea018f2f6c134e42dbb0bf9054bbfbd884659dffea351f5db8d68d4f5cd760a65fb2481ad7e84dcfee33107d68079fb1671f2b64936d87995c7d1a7e84ac8be08e31a004fdb21877dc098ed7304769ee5f1f2f344c8cfbe12a34b5ce23e048a1e2a5f9927a2cf8295106124fd153c24055b79da2e513014d9b7c31a28b6c78ab3ae8cbb36c71f2c4021c76d477d497b34d2de76e8e38525b9a461203ac72cdadb1e73324d7ffb26a3654edb4ed3dc760dfb686fbbc4c256cf44d7c7f6ac7dbc9083fccdd18535a20b6b6a70a7b1c4c5b276a18f178290b98be5de6ec41c18b375356b1722618a9cec637badb6c39f25917ecffb64361e3066eb4cb1b0d5a1cb866dea91d99719b21eec949fb0669abe8971060f2736a5bdccc22e0bc3ac26c3112549baa68f5d560e29f8b0708a251cc9d7adcc925e65c32922b5176d2c0de214adbd28922f5d403aa5bd222dd4a351700a253e1ab592fb41224e2cd2a9229a8f125e90fbd148a7a018768a68149c620939b9ff435e1246216f2d77c2ebf24d3f6135e2cb8b0c18181ef0e176039fa637fcc523a4169bb26d3c649165b8984c3cf03001972c037f4564202e79871d584ed35b7c0b899462adf69d483906c6bb6b3a8cbba3bb097ff1ab79a340ccff6601b6f7e9ddb5d90ef3e970db648ec13264c4de699efed6a80d5f40f64e772cb78b34ce16e3b603e6321ef1b7c365e0cec95e6e1fe9c19a7eb1c09abec024f790e1143200cad94f325e4ed3945223b41ac282a50135aab5bf7851c523192c0d27f200fed11e99aa6ab59644fa3dcf47caed86ccb31eec9dd162064dc738dc6ec4d86e74cf7abb113718780ebddc0aa72a62a4f2a9aaa87e945440d592eade8ac9155593f6a4e7441e800034ef51a83d2657109316ea5aa751302f321ee3998c1be3f61198cbc0ad93454dc6856142a851302e21183f3d83712fa1d3bd8260e08071b5c06a3ef87a32f484d6a3258171613ed938cc85b9997493ce02a681ba4d769b4cc19a14ac79b9361ee3c2dc471a658309d3296a43a66a489e7e1a75bae95149a746373d2e69948c9bba9b4cf1a647238dda6e6a7113cc4d97b9e9c54d336e7a74a251d94d8f3c8dc26e8271d3bde9318a466937c9984cb4c764ba27532d371d9a5e6d374c78c646a10cb71da520b6c76f8f978183b48ccbc036a5185c7a39cc320e73a9eb3eba2558733d516261fee99d07732fc6c914062b0cf564799925195a923f8c27cb6739372b92e1b45c6c479ee4b527b2fce5c9f230b0ac892cff82899f44b216e6c2bcddd87261127cb27004a7a66fc42ebc22df1b7f723504970065da2353b0a6521ffa4361706644e6663374b28c8c4b430637ce8d22edc9120f78877f1e0c8f46d0a533e30268a0fb974399b231313131f7616626db4c40e65210f1dbb76c3dc1464c7da4d8dec9381604fb5d439d8cc7a1f6301c2058d3e3bf4bc6bd9e24b1dbbbedddd675dd769bae81baaeebba6dc357d000aed267c46039cc0f1428c8dfa553871a151b3543a62a1f20da74319971319df8e283e178d3b7c7edddbf7813be82dabb84b6c70ddbc45f4c1a2862791732fe6ddb26e3d29ef6647cb505863025e3a66732ee257405b5c7c4946350a34c996e374c57d0c5e412aabe0ea2492e1d2d9afed5ae1a8a4cd8fba2f46b089e240b8ec1bd5c30262841feea100f7284798cf9d0570d9d4ed3d590bcf745e5a33380fbcd4ce37adf4d3ef170181788cb8d1da00f0ff77a8215c9f2f8c2f64c3766cb0a7bd5adeff5e41ab294d8299c3c11850dc038dc6ec0ed46cccb667a6c528b6653ea57bbae33ddef25868c7717e632ee8eee1d0ccccbbb97c32dc630ddf4cec1c17e604dff1a6787e9b148a3224ea33aa7aba87c5a88cca6f786c3647ad6837d91c927986f4db4273126b0231d96d39e1432b1223102d1309cce0a82edbc693b40b08d651ce6ca38ddea497b95143eed3d1185b6d31ecf4fa34cf88baf7cdaab7eb0606336bdfa694f9aaa18c269140cfe629ef10ce6529c6a08e65f35543dd9ba7e79df185f0365914fff1ae81a82b930cfb82c37695564f918f7e4840fec477b32eda1548969e298e2574df8b35712798a2819fe3cd1062c7c1ac57216fca40a998ba3fb86638c8fdb5f9ebddc06a23c005a623ac980e9deb8f4cde5e584bf5a65e0cf5a18fc91b2e91f29bf1c9a301231bf7cbb31f776e3e56283a681940f940007d694601c884b8e29c59ca6615d030bba8053f3d9ccc95c985f6e8ca5c378bc384a87edc1786f40f48681b86498c378e9964487d9e630dd987f626e4711e3310a24765822f73328c466989b68e4aec35f7f3349402637b6897196673dd898186390509652b427691559c2b83667516b2a328c3bca99d4aec8306e8b9c4dad923d23ac2897c1dcce19d5625c1696c7f896a45152e55fcb3f3b7575bf7bda8b21e824377878d29ec4a131e370bb31e334bd6d34be5d205a9639dc6ec8b8c001f064a0481db98386f624932b1a08750dc198d42515eceb500fb7710dd5a1d7f8cc0d4080bbec70017ceed89651d821fa3d78f0c07e70eb7c14d15d4b6c3bb0589cb96363e9048c912e80352a103376f96b08d6c8b2fcf564000318c00078c8a6067367ce5ac37260619edfe230de83953ad77643ee543dc830ee968d1c9138ed495984c915573001ea20d9412df28b9ab899f0974436956a2988eef7177f37b9eb6d07e9dd12b6d4020960c8c9a70c91d0a40b196e417418c908c3bcb8e90a91fda43dd935b787b20b2e8a16dfb61b2df08ccdf7029dfb2deecc708339b7e180390524cce1d6025f43180e2c0c1abb6a5a7125d33bcf0c7361ee5b325de62a6726ec098b6366d34bff286c02db8331373ab97b7669302d02fbbdc86d3ac5a929424da5cb384d5f4343db0dacaf27530416c3b996b0f11814f6bb86280dfeaa01f0570b803f6b7dc01fc9057fa44cf177cfa33d356e26ac03e625dcc5bca3456e60bb6ba851f7f2d7934609e0f2184e63451ad5e2f2584ea35e5c1e33d228d3e5b1231813984ea3767897726b898569716bbb617ad683bda7e9b8ed2805d1dde52ed806003b3c6e38220f1888ce5de2e130774bee15c0bd9e5c0ce76245b01ccc0876046302d3b181eda0ab03361e863ccabd9e5c2c00172b723117173b723126da93a771b11917db91b998131acc8d426fc8302e4b869b0c7c0db5878585711eee0f23846cd4e861a61a6a148ccb574f1a157369fa67f3cb61ffe557d0e9359f7efcd5d3574e57c11f29573e30b8844f26fc916c87bf93f0e7c1b0b61b3138c6a591da077091a8f277a52eea22314f95cf57e31dfa3400dcd21599744b8d81e89c729577869b8bd3748cab9da593ccb9dd98db8dec7d775822c3b839e4d28548d002132e7a5c6814ed4920bac378063753b78d2e105b1139e2af74202eb97b3fe612a6a6fbdd641830304dc2f2b5381097ccc2f2fbb801d1ffe3a6c325ff7d83b8e447d3fbd9d583d50e4426c33453167396f190c9dd4df2162f10998cc51fe4cf25c3588397c8df718653202109b9851643c695c10e9232fe18efed7bf98c6ff88b69dc4136415c72bfb18de9dd4d2f3d335d9877a5bbc178a9afe9d9d44a77ebb6fbb9e4edbd6ddbf6acfba5fbb9e4d28d37b51713d087713f93102f2f1d7edd1b733bb83164f44f2c6fb80501f3eea60bf3784b87f11561ba30879b8ed2b7d334fe8ac8305eba11c633182653115f1119c6673aee575b8e985f0ee37edd6130b703db61202ef773dbf1f2c6362f2f619bd3fba6afc3405cf20b9ea7b738dc8260d171c2325888cc313e037f315888cc321e65bc878881bf9865bc6574ddb6955e99de7d93813f25aa6ebba984bfb8451d1dd47d366a7b87bf5ef20eba5fcc5d16d7a6a3b14907d6f53b8ce9c0eae89b4e23237ef1edc22bbf78f622801d0e3b35806b48a64632872123860ef13ae460732700990bdb7bc1dff3cbb70720c6e0af9e64c0c07879005e5c9bed26969b4c7ff12c9b1adc70bce0aff3cbbd77dd638c3cd01880007690790eb765870bdb1300fe2e833f970c93bbcba091bbc3f890bbc3e85e1a3aec148dc31ec00ea5cb1c364a003fc58899c103ee68e00f6600f8a3b103fe7cc8f102b8b03d197c0d759f8165e0afc66098a11818061ecaa712fe9e03f0970b01702f5e5e20e6ed2f17e600bc788bcf4d47e70ddbbcb8e9710b82e5a6c34dc78b9b5edc2d01f085b6dd78bf22b61db0bdaf881c3b7c23458edb35fdc585d9b4ddced17497b757fadbeb107053daf047249bdee21dfe80b8e4f8167f61c22f5e5c96fbf9c82d0e80fbdd24c92d8eef57446e016b2e9eb17fb60971939f5d2066965b9b0e95ccc272b9dd6f6696f7cd020d4f6291782426893d910702c1202804859ac49c8833143f970c43c3870c835a7e3eed482e99beddeea6bb637bc772e3fd64721cbde55f4de5a0830e17760e2d7764b3f6eddac4c3ac1d6e710232b9843f1e19884cc6dee2b68b7b03bb37b0f7fd80b864164c9360dab3018b91a26814094fc025a3f434aa597a6527cbab644e64f9949b19694f1e43c14846c74698884b0d14d8a518be89ee114060c76d5c0f846613fb412797904c5d6c8027790d34f9400984e43514cb3045be92fcc8d4a5034fb20e5d492e276ac8dfa5e3b3440df9ab43d710e9629f4b8b7a5c88c89b8b48bce968dc820632b88355c12179be564969d7f600ccf105fbfd873405e8f3040e0e5ccc19d8525fbe56219ca692768441f68b3842304a92509638b55a4b8a385103b006ccf2b10445aa8833333333f3d32b70027bc6c042924c0505411249a660cd3d991c65d4c007b2844db2880363e42b1c93c86d049b082cfcc429edc9db2858781fed491973228e3834b0f03e9c6833c8e001acbca5dd3a50aeb41fd6a2993942aa1489f903c6543b32158fc853757b04d778a45a893fdb78ee5808c054f7ea3f608d98ab2aabaaea2499ea70ec91a7ea1cae483996c156187be494595b72ce96c7ae6cd96368c1e57d68afaac7f011f8079ca1d94860213582091b7ba0467fc854866728a5f5d4faac2a8a9164afa79b0eeb1a7dc5ae8d751d7bbdd675eca3b35eedd8d54e73cd3e8de85345677cf8d15ef5d8933f9f9ef8530635d05bb8ea89c2d2631f86d163b7c16ed9466155add6fec0b66af4f5a23826a9aab883da09225371079eaa78049eaa573f3918410524559890f55fbd71750b6772b6272bcb7a5773563dbb8a5b75fa4d99a3032ed05fcfba48033320c1a9812e3498b0988c4c65f8544af9ef1223c94e9fc94dc7757a5d79ebdac84cc6ebf893bf8075e9e595b9742afba4d1a7293f5da64c7bf327b01ff4a990665ed51463f0c2b4b806d978482353f0aa66dc5c60297d25447b3355afeb7a6dcf16b1b5a634cad2648a06571eedcdd7a9750ad64c2c8435054bf111f8477b96142cfc0785a093cb03590f56be654b591d68926cd774843e19de05c511b70c8d9946cd9e91d961d24f38e7ccb2e2e0e0e0f8d4f47f08a18c8c0c3cf5a165cd1985dc32146bedd5c0ed466daf2726d9cd0616feb3140c4277f1ce44a688467d97a171970c03ac7ca8c46c9595554d32a6660682000001f313002028140c0845a3e1783ca40b73ed0114000d94c04e745099a7414e31638c21861000000000000100000810004c8d4425805e523568580ade266aec1755d39f3940a251a470ad2f1d3a415541413c76766423b2f0e3a706dbab3981fa797788189f29194846d2adf304c5839e844c72de243763d520e0faf983b1288c1f08cef3f1f91b43c39f8a49bdaa3b7918ceccf6bf9d320e5dc9f9670cf364be997fc1e2e67106da818d2925a4a9449a33ca77f0ddc2f5cc61244b88eb61e700cabcdc42f498e2aba964f254aeb10bc81af41e71e7c7c3487fd6a046a1752cf0ee6a1e53cc2d0dd14c9f0ddbfd4f523f9d454b113ad78ddba5aa33008c85f62e65761f6c86f6da2d471a4f4e744e57ab669b3111a59a41498ed68e36088c525a6e337f45bb6e421ef99b186560215e0fc7bbb943e31f377d65bb5ed007425747406248959abe2ab8ceccec88c861363125511b3621a34cbd53d526df51c5355de699aa2b68b9a867366c8f26c93664cf72df6339e1c50bfa1632c2fb334067919ff883d3401e905064ebb49b53b026835b1a6e14aefaaefdd4728a7151c13cce80b6e25f855fa25486c6d360d18eed65c0bbd7ce5ff8cb4fe20ebc0325d4fb3de57931e55d4ddd98af600788724b31973da9a5e1a4c169564e59998de65d690390d8a6c79a9961e8a92170f98c59013af40581764df317efe290a6ba69d3649c16b0cd6562ebbc2b52ed359a49eaaf6958141048c691be4a98a46c34c5a9dc90cb553b28448aabbd32d663d4df42a5d2752a0b95f8f5d4dafa2e81eb612f4d140b98878c6322caf1903268638ed073c21c656d442a11a51398cb4678c8afd8bf0e2955029a48fff10adc6e08bd845ea9dbdb35d938cbdf989d30252392f4e25525efc046511a5b666144107778a0a4625e5998a8304afbeecdc948bbf658e9cece2d1140d15f7b9e8e478ec8b30490349334e109385aeb49fa95182a3a0833403d0e1b1a79071bea0cb6ebf000b141985cf429276114993ce8c8389748ae8c64b47c0dee07319397bc9d034908c09d7ab873ee9fbd8baf696f8107baeb070afde122df8c926ea569665e20497ba1c11d745484d553429a6bbf630c1b18db4bc14ac4c36e1240d018d075c40cb985f98630ef5adc7cd181e06a4bec3fb074c0b41b08da4c336b2e71fa886ece374505c2225d2e1710c21bf40192509df33a862577721193cab86e4a1d8297c9fb889af53e9b9b127ef9f83ec57990584cec1c1097b01cea2c18fc992356956a8ab01eac4d3d91342e8cabf50af64aca55a8e953cbb8b7ae9db506f6e7675ee4235fe20c2174861d04e9fd6bf062a428201fb15667ae87aaaa4368bd99629546156158d6a56580090654daf6a1bb714fe26705a786ba2f51f906e41485beda0ef4d8bdd81a3035db8d11b6e10aaa722d3395ea65d78831dfdc4860c67bd78291e725288775cfa5fd721a7f947af4360e89245038a77b4d6915fc4f1d5b9849446308ea7cf5fd338f994cce94bbced5b61c6da799d555348c595e7bad36c28a170fc471c22d324a03af79a43fa6ebdecdee018c96f1f53a89ad6d7b8de7e3ee029c84c9d6f52076b3ca980434c12ed2a847be6ba904a294526912996a6ad2b54433f46a387c4b10dff053e62e59758c2b551e29c1ad3285df4f45a974450a7f05094f42ba146b07644bf64c45a243d1c0d24f519cf585fbd1f65af966161ec9d7ebbc096ca8e4fd1821efe37a4ea3cd989d4a7b377171c0b37cf2322092cf9caf0ca702941b1089a7f700dd851a040095ebaab5e47834c5425ef016ff8bc2dce727fe2acf0707d1c92134a70b59b32a0cba597c21b9dce19776a138b5d8d7f9c86a1d28edc5ae4f70aa24ea2acbf1e202a8d2823b54b9d2872174d02fd41a73d16029fb0507eba11c8e9829af74ae894bb145c6fc7afeafa78d7209f479c3e4e91bb581f61aa4cffd2a18d600acfdcf2412185b4bb7f3ce5cb11f5d912c0e049bef8d94e0472f51428e53764ec82061900da5428804f0d2d94071cde29259aea97154622ddd5d81a37b8fa8adcee2382475d0f92424f3ce5e15f3426d3367e56ad9afce410053482783ee821b3f3bb46cd783a62fa1bfa09d691779bb96b04f021e02df10d7a80f25e62d81eb29a9c14421d9b9437e44b2c0a1c847d3b1db09509ada3abe70d943ba42f0ec164a58ff8beae7e87f5d34d89608fc5e0af89e1e52a6aa3f4b60307702324f1ccb4356a109e9916c319f93aa0d22cf4ed48064b50b60fe8c4af572f3f26a2454eb32ff77e78bfa9a9fbfff094a207cec993bcac9db1d239e27f867ac5d93bd4108cd497bf535263ab9182eb4a0246d6849c9f36951d546400249196aa8c547d92bc9c0cabc5ab4a265f412d2a07ac25db6bbae3890fd7c3d5cfed70e159f886f6e88263e6a79506431563849670148ec4e83c10757b61dd898569a41f502f78038e6d1ec766a9c367c0c5e0faade95d12be43d4c5c6b7d1f48a1959ab3c71b1d714324942a85dddff96bb34835e9d0528dddb4bd6f58f00d2e80e025a560bc305b96a70d5982d2847b89bc8e782dc42d88bb56bf82931af0bf215ce87b3625980da54bcec3a8d60f5b6caa978e9b2173cc524191abe32559492a8cb2f0db08ca737f9bf98cbffc70bc15a2a0844bc4c824baf7269dc585235acf63d209871d2a5a2b1d5e4721c95b99a99938eff3d59d2287c2d8470543d20a4a6f61cc44b3a9e7c8871e2af11a8b7d13a59e9937788497ec454e500e53a338aab84d4fa4b3298e2d086dfb193e9e3e0dd0860404d63426bc081ae0d23b68bf552f81cd4d83307b7fe978fdc7268b37a1e589982ff618fadf0aa3cb04a41b29db45b3b37502693ee1d5430b370208441bcf9ab7fc1f1b37f095448bc66de73de441826bc1d2301884f175d9fe9239086925563ec898fff470c44b45d81a5160f12df7158818162124cd0e969c8fac07573f9074a3fb7c65786d6af73b82d87bda395689d83ca7af58959492187b32a89f610ba616716d842d25149574933cdc0d61d89963b8924afbfd44d4a920f121c85a5d474fb81ea8007ef24039635a064611da80030d50f951df9a655d9f44b2996dcf47b847490f9b382de91360bca503de1652811769d889f68d41085b271a1c621853955b1001298202c2eaf5dc31f1e489fcacf67ff1791f30ba17382a9148e76845f50bb834450949f594cb13101ac34572e1e63e686900be82219fe39ecc0e55ec4a0af4633d2b582c1a7da7b0d80685836236778119cf2583de7a330ef834f7a4070e1928ba94bc6e1cee99ad9934e2928314fd41b45a9672f460210c3f21f85e61d6b2183422106e54466b34415432b47eda6e29fd990f92a3f9c13a1a030f8ebb16b36f8921a6264ba6b510ac07749390dd295e5b0e0170b942b8741e2045191210e1635f4fc272ce024f35704a048b74463da01fdbd312d926311fcaf377005f984e545db946ff124bc7483cc913d4ee1f56b051c92567c3fd1d4baebade8fbe0a5d67309515caf04ca2808d2832198df6b4fd4cfff51a97f8296bb45fecf47b53f64630232f4bae08c6fe3bf4de7bf4a22510440961ce624d120531beee620858012f4579d82af57c4604400600849cdb5a843e1be5c1bb3495323ab75ad5fa457d8961bf0134a8eea2d0f25fb0d5a596f1722792c2c0dc2e1c6c75b281623dc5bee821276449a21dbaebb887a8d981507c2f461b3d655dc5219af9e8c61d1c52898944be930318f893fbb5c6477e41aac9761a028a4d0ff0ed1d51f617b9c786f0dab2764d96a02a54c8d73e647e8e586ecb687564ac87785b7551efdff9b3d72abb619f2a725db8d40d46d97ad905dbfb3a4f8cf3ddd0e3727728c8297149268feae7df6da4dd295d27ec45600e32976ae3560111ad09d10170719f71727dd0142c5f83cd274470dce1bc1d89e9a49bef24b8f9264d2b6c0f1d3040f85af1c7363ac60ba47ebf5ae1c6b3be8dfbf726e01c742f116165b54bfcdde70929638efd6649f1af14d6c1b47a64f4969bf3b455884b1a3ed6ca1e8c4253158d26353bdccf30c6a628a088c4dd6df9aa28a4bf861979fb9205e055779c48fd8295953257b11c36c7eebe358e4e78a55589cf4063060131f92c12bdbb9ebb99635914bfd56271f047e90d2b6dc5993b5b928d385f2420f5bdd1d361e8697eea105ed2df795516826257aec6fe9b06a0d55f6233e9d4a509ffccf93391f771788e418b2c803480e43028d618040b218d5382ecc71c5bec8f24d84837814560d46a235865f9f2eb6eb56eda6214a4c46387f7e9e6a4d731db8196755464e66d4f126cd106e620ba9b08269ba09b10b7de4bdb6c17606ab788d9011752c835a075584f62d525f5ad340ed4207cbe8f3a31c8142d1a3b608eb54679d6920422fe9cf1add9da6bacc2db4e6ade16ddd3adbb798c55a99cb2eb5faa045665fedf40e0cba9a24d3ed84bf67c3cba61e935f0e17efb774ee15a6c874fb9cdb6b868d7b11b8b32fd685fb87d9165550675c57cbc737a4b744bd51c646d64708c4958be1b01082c39a9ad09c71781ed1d9eaa544c9c36b402103e07d29d8d7e84d526458113473cde2814e14eed667b3b4d0cec69f04015053bcaaf3484796a5ccfa2295e3dd2e08e9ef3a19b1eace9e6a7baee25f68334cf6d2cdbfaac05cd10219bee20793ae31c209b0db693311fd693b3f3f7b57c7d6c190c084c1d305e6e44e1f1e38cdddafcb94024c780460d77d2d6a050958490f888e4b0cfd82e157b99bcac9f4f07e50e2ecc9d9cb0dbda160adde02cdb4b53b81919007aace8dd9f5e62d4f221c305a805421abcf8d25ed713c93e0ec480f35606f4223b0b7e7b9b8bce3a370213741efa0ba5c2ec979debb0b99d9381f06008749c972d30611e5dbf84092e7d079dd230166e1c2403f1afc09d9d30d36c03a5777e6e8c880323a2822b29988251bce5dee174c8d398124a5332148c5a92f1f7242a0e3be3aa554c224da54adf8ce872322c94e0f36ca9f81784fdcbadecdabb4d8575914bf49b33e23794ddbe414bf50d94f6bea1fd73970551f07c81c47c431b7e1011a0ca4f97e715e1e18a9d1efa59450268db34d28c10b0020da47af41e0bfa138121d6aaa9f63f345eda7ef0797edc828c457095700f787973d3a1e2694b875191bf15ad8055212a225c8df9dd4e4815484047b77551748aabc03465fe55abf42754f42af0bebceaae18f1bda80201dec851815e78464f597c00c156b0ceb94dd65bba1412f6ccc0965b6fdd11556ef46732a94879741efd6ea213e2b777373d4dd8bd0d843d12e0ac9bf04c4ee3807cc64d97f963a4e2be5d42d30d4d0db4b9a4f36104604de91283a85a160475d1b37550a9a9659c275561cbc6cab6d1233c2e93a813164ad7b7eb76a3e6e50f549c3e08bbe05bad1218fe04bdf7c5f7d9f744eea5b1cdf76f1f18cb81ba5fa4b9b179e5a3818727221c75cdc56b628e2d17c6ec794da91987d2ccdc4f756c4b9894f813dbf2ff1e79692d81e3f63b9b507d5e281ab1fea2b6928689d2520fb160f75f89128ac2bc6b9e66a9b5b13e1bec75614987776f88ec5d8dd72b2af5970a549fdd0264de6ec41db83536619ca0da0df2636b085afbae774b915d89daaed79dc4aa6ec5c7367befd4e12eac0cde3665f341695ba5586a81e44eb1018a895d9bbdac047953e8c9a17ae18e06176570b20e4f42b6a7a1077827703f01a1c67a82e10e61a06a179ab2d3b75dc50a426d123a1dfc9538d6e6f63cc9e4f32b560a120ade9b6b1b37cfea039017eb09b03e46a6fd2d6618d0f60d439821e5fb5f968acee8c63367d87c79212586d102ac2b0692a94367585b28421cbfd7990c694fd9d7bc3606ead398262668ebb55a232911779a5b4537793989f07d3380e0871f204faea4e7c136db4964f84aece16a53b0afc66ddeeead3c2f9ea7b5886d961f7c007deb3ae89ac86a21122e01a45dd79857d2432b9fc3c347af1990b76f40b63c9cb23011aabc66f305b9b56b117acd789c4bad06a0e13df3afe44478c20d6f41f7abe8274dfaaec0f931f74a5e60ff721dabb02373a083981039fd6de443bb4629845950d6bb88d4d7415a66e9c192f88bde068e7dcb4ad702957179d60a2a51781e779302f71ab2fe07136a41cbd248a4bc51c29ee22b0668bd14e2fb20fd695878414fe6795db5a56468ad6818088caa650905dc49826ade9e2889c7c948302ee495e1b7c43845320b12923105616d5d039a3aae2fa386cec1672050b27f6a46af41fa93438d648c90fe70a46f046a4be9b3358e9b460e2838f546df513109705ab0139dfabaca66a2e44d10b95253cd9c89ca8fd83b2698fdfabffc97f99ffb6e21e4cc158b5dfc7d532f964c9ac7a8c5011cd825a50e0e56e3001e8f25fec0f7b9556d6658c7171fe24bde081797522ca8abf8ab583d6c420b31534a88f4e03cdf47035db41cb8b36e3085f05e2446de65f9945b195ae7ea7e2b720b00d3bc4507c29f308193468f4b176345d6609c4d43ebe20994bf23d2b0e0ae3a6b81f14bb2cb8793e0ca35ea701d425d9db17847596b1583af93d04ab80f5e3833e04e2c3ee0d71bd826d783494f5a035a9b93a830b9a8361d6049cacf9061dcc75528ee5e2f21cd587da2e245375efaec1b49beccfc282131daf32a3c394f4896ee845fb2e66549b48ffe6ef7ee0ed3eca9100051054fae3e3f69b0fcc50107ec97e0cc48acd592fd3edaa5038d2615735d04f654aeec81736f773b5b1952f6999702ccd2551878a76f29ae464fd79ada65f23e8ee702a90becdcd18a28ad64e43758cb08d1704bf4694e3ec4bcebd22941528772413c6a3e8cafb2c9173e3d7561566a649ec37410e3302c441d58c5dd615f3150864f7d712edeeb1d6aceae141b9047721e151f6f359e55d52eb0cd42edb7e3c5bcc9fcd9de4e1a499dee3c73144432045e1ace1e5a5bf9048511ddcb022fafd8e2c2d5923f598990eb0e20e8e716a524032040c8548c7e81eeef8033ce482f4d0de1e1537e72aa8208e90b043321a28b731e0faf99cbc962105bc1db41d72e314cd460d7ea5d741d202720e7cdd2a93a37ba9196bc9647c54889246bf547ec8bf91690023e2fc70a5f1e69bb20bca9557bf2035da91ebc82de2672813af9199f3a4352d1a0b19966f23c5c3756bf726e36c487831e33d31a3d446c9ef9aa68f63ee3ca0aca3160af7d3f11bede6845da5d51cb67e00f95ea1edfabe532aec5fbd24559c958ae08e65c80749873b9619db0eea347798444d15f1dcdac89b07f8c227f406ad90b6bb04ab90a95806e3065b0ab9855f88d0fd7e18838f4c9fd4cbb15db263718f1694e25b14ff4c901872a074c1fa0d8782b70b43d6b278db805a576f18898dbd87fc035a2620453fdcf0b1e705a51ebfbe87cc060e213547c1ee34dcd27e03edb3db23b33eddd21701dd3582f25320f3f1b15bb656bb95f8e761f86be325bbe61e17d73cffad35037eea8a2b07e48b86f3c48aea7b121d920c50e3d964a6f208242b4705dbf8170cc03220cc234403703e6d63c554c75e3ef69f55afb98367a0df4c8253a49bb606abee765662790950180a37833363379ae8275be59db6b7f8668ad41eff87f393d53a547e0df68e06b86b87dde1b9678396c6a155f4c6e370853c673cd0804556d765d846635989f01de3ff0e54def41e26e12fd55305114714aa0a439dae36f8e0649c001d15fa7ba6ef30f02ac75270490fdf90fdcf114688f98fea9d72604084752f707890e9186e401ad8e064f24870838c9952941700d410715139e360462029cf49f047fc01759e0e61823bad546621f10c4458aeea70e231e80b2ad8cae6400fd6162f2999a00c4d8782747139d914c1445aaf71dc9ad80aee5484c7ccc6f36e9047df68261f58700787f1ef363431e1408ce2b37117cb372323e01a47b1332584660c701ab0eb8718d484d879875f4e1c4caa8b920229308579efffb359666ff6f761ddf17220639ad680a1ce43f2d66bf376c2037a0885a588504360f274a2fc26bd389fa389d4b461f7872218db039dbccf0299adf6f1976c528453063fe60e0e98003977ffa14571303120411bc509317d0e260f7463eae30eebdbc61ac9b68fb4fe8125408b4bf4f252e301b29d09583c8183302f9624f1298894e5ba289f9d6f8600ececf8c958623205794cdd79deb79707bec6e0d2fc938127d8f00b7ddb572ac278d8884aba28f806687dedc7c85c55410d98b3f839d201a5c630bbae0c4844a7fe40f0bf18ad350c8c986dcf840af79c6bf150d21240e5dc085f0ba980f1744f6541c531507ad7fbc78cf4f23be63d89a72a26d352444076f741b0dc43fdac3cd704ff106bd233c53d9594f01cc5c64e9c20a2b05ac9bcfa8d5e053acdf14bab54aadc37f1cf0f0e38b45f5a63679644d7a112293eab98b01f8d99173e6c8e0355e651751510f5729603ca85735542d8c24a23a8d5e2aad376bf546e0adaa215409fad393aec7364f8947ce373d7d4c3037fe869c4a0190eef918341aad3389e554c238149a0989e3bcdba69c2b598ff70605f1380fa17b69a60f376b656d1d13ee8ff2f24d0de44f4d6af3825e7095ae5dad28e0d7d44e2ffc95109e86f78e2d93ce25019606099302d9957e8506d56b3221a1a26256e890aa3cd932190a987106907f9f2bc99f41930a32c1cb74c52681a09225f311253f7f3a274a3bb18b45c6608b8268a11f076bc990691397f8198968d58f0c48654bb1d944c0158ebfceeb854c8950b2ce7b4add069de19ff234275a44eea104280b0c31668d1fd143b738215c2a97ae8f218373437795b776c9a337b7558b24e6145a9f422f25b20739051acf2880792f227017dccc20f382347ae4ff68717bfb742c01bed79a5018db6e55bca563f082a4489d502ae714b7b1b1a70e8db515360c65bdba63fd82d683a7afe34bb27dd36b99beb520ab9e60aa326594f478dc14132e53c731116cd9ccb1dbb59d91ab41ae0fccabd0b483880d60497caac993341645794bd6ee0056c560ad05a4f980c7fee8b002d58aa189d6ae9c51ec2683ff2cdf1f5d12324bc274836c69a303844c81c51298c18df01619cb07dcebabcbca68462ab58376e5b2d6504dde4c350e03e11458f45492c06272568bd1f7449e0d80671434452ea8b6977a7df0112670e205cd0a89613cf346aba486fa9558927bd565720e51486d284ee8435abc272c47444e3c40088da0e1be40931375639c50255e1cd462518e8832d8fe95189f796c52c18f68c42bb6e25412aa0a22cb1b6d6643cc0048496299c2f33023ff917da743e6aa88de1a30176b40dceb95f43597a922141aa16388ed0980a39c3ae9ad69f2109f903252bdb540d73daf5556449e882a6c99b7c46dc0a030ce17c04bbfc49b17dbebb748ed25230fd35a1264a6261cf0b5a10be56b267699d8e57417935d4e773db9ebc4ae53bb4eec6abacbe9aea77699d8756ad7a95d4d7739ddc564d713bb4eec32b5ebc92e27bb9cee727297895d26b6c30f638e63cf63792e5b6a2e228bbe861d294718d68c43bec22591c913b5c8c143ac63bb91edbc87a44fccc5c2ee6903a1f2264bee000b82d9995876fb84bbac90bec8c19bf7423319f0d8b9aaa7744e1248091d8cfab40bd3bb059846ed408d6044bfdbee99b4bea857f41303f553f910827b5943e8b4d872d4636d81260e6de9b096b917ac65b1a1926d34278d684f693fac0a2c8db6dab304ad0b412817af16687b801dc78ba750db1d788d67a2e254b7ae167a29a05303f652388747ebd330c343c121f11c5b4e907c771691bc3dcbf00ae742a82df9b3dca503890a688790cc56038eeb7017d614c6f8cd62d10bfee125ac992913f0538b23e163543440d46a2c1609f7244f7b889942179661c7dd61e923c7197d2f701d15ca6c3e47160ef492aa80319484e19a724d7b285340646fea46fba174960a8c1c8258382c470c2c32fc1dcd1d200babf20d2ed59ebb394253af0a1f0438261ffd10802dc316137ab9f0a77633ece754bbe767f1c26c26f26d91320f427ca09ac93e13d9f1925e3f5178382a228aa318bdda4be5b852855207ca2254a142f8b00988ca299b8c0482ae8f89e8e3f4e76478422b09a2f531c0f347f056658b57b7cb626a5a52018fe219900db577abae9a0ca5f0a4034bec83ea5d24e292073659cf02f71492ba6cdc064f21ce4561fcd90639f3814aae57a18bb2865a70c7bbb25996ba5b6e96d6689da8804a4df399ca3b09ef47bb1ca156309f7d23566ee288f3ad1682d8634b0c2976946792d59f16326677eb8f94298dde72783bfd0824483704e37f9d1b53bbb91bc57cfa53b5b553e4aa646543a7d9754d5b300f53223b9b0a1b64850c0fc5b972007c28b7e2455c9d3d053a3ea14b083dcbdea5046a931068a039cd51748eea84d3a29f3e65761570432ede02dd311fd06db3c235b292b8e4e4e20a09188eb999e06a57e84548662ccd057c99702181787b15cb192ec6fa9007334caf3a5b7d2ec4b376ce9e2ca013b5358f1ee73d1ab55a33eec09e23266e8ef6a839300c11e04650cb9ce13f0d647649dde80941a77e20225e46ad4b6e7df8492dc806119bc59ee4398ac8098fa3607b0f067fc2d42c2c60fa046309aafb745c3b6799d4887c1813310dff8129828a68e127696b327c9114b2cd10789d7b8cf02e3dd48cc09ba92f6576bb23c195ac0441b3bcddc53117e827483c3f7ad33de9d30ed57917996234c7a1d565a7afb183270ff08aacd631f73b2de6ccd44e1009753bddeaa7662977beee9fc91be6591871e37f261caf0a13ff696e80ec6ee8c3f60dda2311a614691b059553c0093e4caf31e66a9359cba01bc35eada0fe0db94359ed2d3ad09ce88741495ccc5f024fd08b7ff5ed66a954d5f00f1f84351f6e1cb31ae537ca8edfe208fb9755910b33a94008b6fc715edca8f60781ecdde9891d5bad02cfd6a33ebdd7c53b744eff35b8053d937ff679a3d7cd12f09f8a5cb7f770f245029b19eb2cd1c687e0962572ee8cfb8655eba2a4eaca4c596a1a11aa29c864ac269f2e8fd1fa13bca231ecf831d31cbeb5a6db4862d7b043ea8d2cb899060e319c7674cc1b63853a64e4300d2671db2d7bd1d548c8f2b40a4007d91a49981938392085a8bd852054ca734286b45148d7140d992ea12c7b0c156a6a0492c877408821826be690e4e8c967d14a0a47009a4db9e6273d0f9c8db7fdfcd081f755c50428610b0f12814f3b28cf037f06d9b434b9ca5bf827618622c101d190350a9399ebb4f9173baa4e5fb36a5cc2199d4a36e856fd9bbccd11e983904141a5e100e519cc180dfb866ea1318c041514e01fedb578e4b9d1af0f55d4d78c3d83c828a8d4a3e822327513712ef572acc2a5659c45c387cd625aed8f1ccac2938f54e8b1982938ad4a84b76c238a316f0035c402ddc45d77129f75c931ca25ec0934bfe7dd46c8342418c3b61aaaf16ad0a757c15288d0d163daf34c78750560e6158a4318dce3aeae0f16d94841db4f83b49c662eaa80f3e751176582668cb1030e7a88411b46af26070264f796236015c9445aa113b75b0e087a81c94485f08dd9cc31879e7f2978af3c937c0e648126f11b301d7b0c899b813207e252a108816d61c8d9e10d622177e8868e9fdb8eb1c3bfa35c62a1516f83a96cfa4058e706c8e08959fc78ec9e7a76a4cddb728b1e4c4c102f9f0b6decd5309ae3c3cbc30f9740e40c661ea50d5e2353e3452e88e1ccc9554f68307444741118cf3e80a248e15d78687a505b44504fe4da8bff29a465eb67a5d643b758e8aeb195a5f56c3180a91f652dc2e30bf7642d97b0284eac340a17db9c310d4e44505c1ea837155191821747dae018b332ef0fa79347a719928aea50599f567291343897f0b4a847504edbf00fe10996fb77996cece6dc2874c8ab9cadd17e0e0aa64a5588c3376dff75d1bd54118254fbc5fed13beb1120e6eb3e1532579332ab2868ce43ba64b18ab1efc520384d54af859d71b8b8f13ebe4b6b886249a63f430ad6b6b58bdcecb574f601cfc68daaa2c461ea91ab9ad65234560fa67463a4d6381ce55637b10a35edfd54c515b4c2e95a8d01c0181c25b54c8b619fd78a9ee50376f6e696e79a568db3ee311f4b2404f0828ddca49fa876cdd25d6bafb370f0742358a38b3bce773057d9c085a83302e9897d3bcd17e89fdcfa162c49fa2fb04ec65c8a34de83f050226ca5d910196ad1aaa9fd8d4e8ab7156261589a62952f5cbcefce59048d18aee0bf8b1dbba27b69f8a1202388ca5f80d492ca03dd11e39eba0c6be27982c741edae76d9dcc018364e384bbf466880db1c8cf85d247827c6a975fcbd001947ade6191947d98ac8d0cd5eefdf0b2ca11a55788a8c6fca05649bb4fc32be37914f64b9920ab5720d0480f9282f639f761c6e0ea5aeaba226f83894ec5bed49d4193e9d4ac545c76c268d936e834a30fa00a6de88924537b6e7240cdeac3a2466dd673abcc7a05c3c7e9853c51db243039cc082fbf026008de1ce6b2acdf1056b5c6c43e1a59564876c0c43bc8c499b8fbb4f62d8ed68244b12c1787570c94f97337f3ea2580ebdc920576bf99254d33bf5862c3baa929b19f667f8208c2527314decb6f20fd7656f7790007f8c5d83304b370972f8f5c67114c4024dc6e7c811b57d52804e11cca93e170043006f958847bfb7ddeb54130d64e4b6508250c5be4ee0892a631bba496a8d72878f9f381c3657c839a108a366d2c8a3d0679ae41c295b8c04852bbcd6621b64083f56884c64d1afc6295f373ef950ad58ab99ed2262fcd018943c42f35c08b43c3677ef11f023fdd0a8ce08ce3bb38f2dd4a421bb090c9d308b0226ae314c3e5e7b3ad5f286d0b20ae7044b7796ae0390392143bc789789adfa80025a48be55b24e614fcd20a3e80e5a0d984b4ba0d7ad8cd013609b2a52b40bc319c588636dbb811a5a0a0ffa13fdf734b0696cf84e1ae997361dc00230be6ab83ca430b96a967b28c65ecceb726ab22a31008037c09d90dafa054cf08a352acbc28944a3b9777741a82870b478e5b4a1688d78964856e75d32f0d201f4466d3e67ac355784e887b7721b58c739958e0260605aeaeb742020ebb5ad5461f4ec7084b7d7df1fa9bda0b974a81752c4ecbd3b2d151e4725c64bfc56c4f85b7403b02b4c5168ed884dfed2c181409c8d2956808260ed076b5e75470045b34c19e0e9dc5107e6d4b96af9fdc93f1d2ef1fb7facccd42db837b1a01e92d03f151f1aabd92b51f63278a503502542dbd9aa18be188d1cdb08d91a8751b0d6e8d310e737e6fff243496af2015fcf8c1345bc80c45e73ee7a6c0240f290bbcac6cdb990ea87f9ee65f324858ae30c2202ef8b357d400ff93accc20dcf6d785934258d5214e4f8a9c7a36dc82416cb2bf402832d8fb9aba96ba412db6e1f31efcfb532416e6426d37ce86b8cae06cdb076032e312eb0d713489981735aa481920fd785ef539cca24ee2feefd9410b10440a99b3def5d8222b6f8e39b35e00edaea26918723f42f155d9588c60e1a7920cf02faf20cf479bf833744645d5f076733dcdf85b8c2315d6d4ea60e17b9a73902b4335833412ef22604b6c6cf6ac5048718ea754a75c5079042589661378e618979fd54e3aeda11c1c1da51f2748f03ead7a03f46738c78a99996750bdc101a01571e85d9b59cdace3c45ed019834a92bcd7e0d09f1419a7e805618c0e2b7471af9038a53cb079bd26d5f4701039c352397efd6ccf41cc1c86005caa1fc840fd2f460968f05d36c9f8f3d7ad66cbf486a0818862f32c3d72332fe02ef5ce5c15a381e0f811b4e769dc2d8452d5d69527090c3cb9a002a5e0bad7cdb0f5bd5bf413be8e5b61e0e20b8392a3437cf726da32a4cbe1a76a2ccc04b28f0072b14fe0975bd8010b73d7de15837cb3b944a9eca75524ef9cccb0425e3bfcaaa5976a23c94f5b56079b8aa3d24f0f5f4a1861dd8000f38c184d55e4a612300f5369fed5883783375aebc8d5816fc02bedd4c365de3c9395116c3fc65d6e6e710e15c6234388e825e69edc4564a60ca46ae99f26e9517975f271247117c938686d8bd4f832a21d42d543a351b583e1127d8ae3d7358f1530cd6c74a84b231811e0e8c152bde56917cee3c19143a57c21efcce1fe2dc5bacb693506ad28c0412cca7b9419f187e184fed4c1d9c9e07f11f3d1c905b41b75e007d0b6b61ab6797f33bc8c12ac44955ed1a6798c4277c3b9970e5dd12d46f501785586fa4402104a773232dbb7645e4faab1582e4eaaa05a27b7b8a0b337c95dd6ac57349ce230afff86ce4cc7ca17d6855aefe385dfc67cb37812158460f6efb0ac04f6ecf6cc93d8c82614357fdbb190eaa358400091c7c3e99113a438ae08db13c1d36ff921c92200b18f258be4e0b5c11ebd1a3f122cd0ec37a39d20d3600945eebd965c73735bcc9294013d1ae38a07de5351b03e521f94c9987bc35ab525876ccfa8f5929bebc146dde75532cf9c796dea0f6e24caf5fcb3b600fbdfe72dc5c3b88b306080bbab979513afab039300badbe58b4dc6df079ccf597eb96ad7bfffb312659e2dec41f0257f0cd8cf0e10308e3f29cb69ff8fa316ae5e7f0bff8e99694ee99ebf5569964d116af17626281307bbfc4eeefee0c150e0312902db7dcae1f2bf11ccb0127113bc99c1ed1044ba0a9d2177b947ad04a2104544b6ac8c7f1de2bfa9f494211158828a358a3fff65b8ed601d952fec2309cff14df57a19747e836c97e131b5a09e8c7a4e7cbe2fee98d42a296136d73ddc8ab2857226a001f0eddc90cd441b329c7512d8115dfa344996c9f1ef237a65ff959dc2b9303a896774a63765fa845f04054ad6cea0095c61268869a77abd73f3ab9a33bd3b3d7aba3eb27ca9c7381a3e37daa984b892429023f5e5898f04898024470717f39df76e0ae435b69bba0d9ae72b99b9dd53a7bfe0fc3fabb88774a0b5d1a3d41410a8116c1f6cd5839075cc10ed1ecf3707738b0a184353ca4f4e8f40f41cbcb25d0bbcb659bf4ff029505d8027fba123c85d60d862140d406a24fe62bf09ef59af79cbadbe344f772e4f7d0674d55644843995bda238376172d32e7e303fbb634611b50c5d7d5283dd7fbb3c4f91896f99828b99d676a75c260c24bb43079f5bbca54d552e349d5e43126685d7eef8af95cda840412f4ff9eba5943991db8c85f5d3b7d2fd66a0ddcf6e6c907211b31e168a33cededd586f44a982cda04a2df50ae266bb2f9c8c230aad17527d31d8297a83c719baab8b97fd35476321b890254c898183546a751731877207c8db6d3bd5413ac5256cd4abdab32ac67c84f2c6ca3710753ceed54131a95f54e8649a40b99d68b1592a2cc0aec081789289567fdda8f0e1075743d787f5db81a334d4c6b9d6d4a77feaef5f7f2eeec5ee80e86ef92f24a8fa05d4eaaeb363f2a34d8a860c95c12e15d309c14ac77fd2d4c1bf0c36c35ce4e585a34ad50ce2d8bd10b5963e9cf799341f4556b4430937c0ad5837ad651cdc12df28b84f77a7242ef77a2c3b3de9e3bad2970ff49968c03768c7555d318a38e2d84347cbc0c9c332a0a17cd0258b3a90ee631d6641f6263761d633df23e9d5ea459233351f277e4802522cb66ac69970a98465b76c6fab00cd0bd95b6646c8668cdc800489b52337caeb592e226508b4e8b18d0fbbcd1b1d60d22d037192cd42df1ff9c8cbd904a0c95737da2cb85a944a5d3fa3847beaaaebecbb5f04549b490f54f00f1eab070841a77a8e628b41556748bbe8e3f245c39a76a86e5dbab4812adcab150989387ac7befcfbbfe8cd1168c8e4ff39740d6bfa89401bdd5c55a41d63712d414239a4c6a3fc45900b1f36de3adbcdecacb73c71613d12e87b25627ce24027c9d02c8fa4873308e67761408562a7dd599662d54ec8f9af4522515f5c695afeaae132c42d61484d54d37bfa152c5dcc68f15d332db1982ac7719f84d1defb69676938223c8fa96b1610cc7a74a5b0a2a21ebcb1a005adbfb9adf063a9c40f0f28e31d7694514e44eedea361021eb060f65a2367447fcc1abc072aaa141597a9f0ddf1eedf244e105643a001657af3a597e80a7f5bc5341d69d40da2400b53f6a522926684cd7d681f7d5447ed4d7759af6d5b76701fe16c6b8c97cc5f707f7d57495961ecfb68ebbde8a09c429a08e5fcd8f36d122001a571f184ec2fc5e4d60e1d6339190a07c7518e48b2f2ecb772d169c367fbe710518aec6506f19e9a0a479e8b1ccbcd082f8a35a2b7582b5e282f78bc936e52128d08adacef3435f6a96cd92d1cb71799f7b8dff7d888aa4aef672a9a1af6b4b56d4779d8d6bcc38df05d0e8378682de6c96ca427dafb92dde08e1f605b98727cce76e010bb57983852fe8f5a1edf91f6f32bd242815ba7303a9236a641f27a3ae5305e4fb8bf67f507d8b470ac8bc38457805ac343acba8fadbe7941350fafc53c99ee76f4928682fe7577d2afaba82384cb0bf352c512f0ac74266ff1c6b5516b0954f16a73b9fffd9153bb6a48adb7ae166da85f4be21efff9958094ad87556a06884ec55c35e8b472701c0c96ed9e2eb71a3e4c4a01727af4bcc0a40b8ec685f1ef1461d4cbb34bb859541dfcfd86851e69ec7b1ba7a0baa185dc1c225bafc71b5236c1044183f9cbc8feb11352b6688900a09c944266012d4b7f25670ee57a48e07d4baa151e3ea1103b5d0843feba73518275a16faf2c2d544fd8ef59a20770cf8d14acc1d3950ef8478df0d994cc4ea741018bc0bfd785365335f390ac68c50ea7481b5246bf9dea808a83c8b6941784f7ce24ab6c6f35c0cd9b28eff486958ea1a61f0e0197bf1862d655d7b0d52a2613928f6cc368085fdaea35f959de7409f058f18d880990e2ebe22099954e3f903c78cfff194725128844b67e7689e1ff605e8f7cf0a11d23dffb43c460e4fd987a082420abc7b3fc0ea0e29b4376ffa3c7177b739aff1fbd7891631eabc73d2191f7ee9e358e3366802b59e07f228038c2e76bb7a2256205ecb9f6fbd5712c443da77733878ebe8abe403af6949f3ca7085821320aafbbec37bb6d160ed80e037cbcd2911d5aa20a1ee35bd9b00da925c9446ca18c5172ba04ff74f3ffa06fccff838297975daf016b6d04d0d65f0d2641b29dae6fcc0c35a3cc756ec5d35aac3a4ebb2a034c4ce2eddb0d0fcd9198b0acf9126be48ff43c69b56934556fd9cdb405dedaaa472b47b75223297f5dcc53298ac4e20696b9532ce39962409e44e142925034e6126e53a1865e5a75d1b02c2f7f2a8d2beb1ea50ec917b78b9217ad4a4c7f6608cea1397a7ea30c0462952f1836b7c1055c4a69ea038f759ee87d1bffbbae644244151023b2af31cf402b70064604ec7569e786f35906872032be5d264b185cc3f095263ddffd7c0ed17fcb96359f926ed9f5866702d6635ffb1e668f1cdd2517e45fba98522ae83ebb8dfb4351a29e8c0316b357db39e5d32029491d960a7054985fb4cb7c14331f969f684d3928a25fa728d6782b009ce43b118140a487b79291fcb2d8bb7922c98dcaa28141d5d1285f172c6536aa2e126c42dada0da740202215ec72f3bfb600c3da99ea6e08e3e4d6ca4bcbc0a698d786c8d825e49219281946d9818c46c88b2066835909acebfb161c3c4b03dbedecff942d44e94599560591d4e62f8e4cf799f6bded8859fd7008891273c0d91696ec4730d891dabbb7659afce3891f8fb53a1273cb1e87be22673173a0a6e175060806d6e120b797fe3093ebdb29f639159879c40394a6ae6532e32143d9d8fe9112884409ca0e127f900f74d06c5b174e19337c285b1059d2799baa9a7a7efd85bdcb7b1a0d6b1cac2b746058a005e5a4605a6a4c480606fc1612a4874fa3425f6cc88c2b6b7b3aee9addceb7a33775adfc89dd6b553b7b56dda6d4d93747bd3a47ddfb649dff546d6b7bd9d754d6fe55ed79bb9d3fa46eeb4ae9dbaad6dd36e6b9aa4db9b26edfb36dafc2a1b032f5812e354242a789745d21644370fee52df690e7e844f58804a728127779c32fb61c4f25f5ed3ccdc005677bb348f4d3acd1272a789c2d9aaab06b6862af904f6df07c6eed0c02059ef557e3319e4d7f0539470a191f911519c7a97c708644ef255f0c259001497dc2f8b48dfde55146f85c695441d0e86999f346fe1d63ac03f83c25dfea35bc6b98aba438cd045b133593b05fa66be7b0c42246302799d5d5c8f469ee900c83849c6a20296bd03609276f436dd499d4a3b4c4b743f752f610dcaf06072733c43c87064a0a7335891264641665de573996f9018e3b64614d230e733175b95ba2a4c1bd3a4ec8838617db573c4a7bc81f4b6c0261503399e73b8cca40c5ae4b41fcaae4ccc9d7f14845d5f380de1bdc1ccd75a7006efca559efd7354bd1352ba7e9dcda8ce0d108cf248a455bd601a65c848490f72e07aae56461857f7ea11041ef0c0dd123109589d54d25d8ca94faf527383996ceead5996716d2c8bef22206366cf82551f8f2595e4fe588f6a3906fb2b1d92101746cbf8e4ce0139a180e0f06f413c818f7b5caab47975983cacf3c5d9a73636e271e2ed018c42c04a3a34066bdc56c2cbf8819fee823450b406f3efc8ec34ab822f7d1175a5750a78739ed291865b7cfa5c4e0963164d998e31abe94b8148177b542cc4685cd3cd0610ce2af5bc5fac64fb43188d638ae30c5041af4b7df5d529a006e330400d053fb4b056243eeeea1ff014f7149a2fd8a2df64b8d4583c769ff9eb35d6f3d7af0430bf3905fb8812b505f5305cc4dec51d26463618b16dde0691839d27030fd5ccb303e76d2a4a3715ac461daca60ea57e270054c7de2381108a78dc443dea6843d985f891fe3f250aa90144b3d2b17da57d3078aa284667aa223c213dc38324e9696c955120894d99944553d3eb74cb183fbdae595154671c6f9979f8705dbbc7d9b41b4de3a461797a474e68051238f2d694d872e959983ae605db471160b4857ba8358c3458b4d6b07f10c34628153c42b59d5acde6b344f08e8a5b296ceb688f735db4afd239bc5598af72fd3daf1b55d598801a54895870d894aecb6ffe383e3b8cf9f7add5b310d8ab44d540477a01e6f70c1d94e2546e967ad2d5a3dfaf4d810ef9b15e425f103fc1e4397437780f0ce69ecd1ec11af36a3864f7a8821a5060e3668403bfb780e00d6d0581f693700e89eb07848c5ea678c40ab98d921b563fe23f016031b234ee9868cf93498c1922f19b770b13184cec574b80525ac07d2492a55adaeecbbe9cede08a6ecd6dfaf5d579140f5206769831394b76d4b19902a76d3b6628d0c0e70c520e9c73ab3655fb5387aa37684af6182052dbf92abe16b534c12f0f62e46a957e19b7e0f13e7a56edb3957019e678cb826869fa19d3212accf39b81697a1779a1e7ed695861675efa6555175f5e540dac5a26498033f3438d34a2f6a4b18ab9fa22031e68fd66b2ad8c87a4bef60ec0060ecebeccc754db7994626362c3309b3a1b122061d33680a77a25c9883426624ddbf09f57f4f8cd45760ea2f991a7d2f11685d13795ead7e89648df0c48333bed5e771a4a673dd183e5c0c15e2fbd19eb1ca868caee1ff7fe3b9bab4fe9d225e3bc8fd5ac4593ae2f5b4e222d2f93ac2b0bc69748c3c964e34aa275a5c27012d13a92687da934bc4c1a9e2c5a5f260c2f9396278bd69164c34b84e54ba27165d174122107ddefc884a673cceee35bc196b2bf4170c7266d4fa91017f1ad8b9907f5efac3ce5942e9cdb0682e5dd84404c6fd1ea5277817aeb05fa6120eaa72de5b240f1b679be61d98425025a920217667d9955ef57fd1500020f7ff137ae0d5527c85bfc52499700978f7734d16245458caca24889640c8c48eb9f6979976f2acd6ce94bacb103e74de544295fae3603b40f323531e7660fa8fe564a96325383faa5eade9fc1daedcc18b9507917a06f06a6d837450117080755d8cee85d412af5c5111d29148a4f05d358489b9b015ac862fbbcab02efb867951c5c1ec31b61c4651e07123dd3d9a283dadf55ba7c936769c32e4411c3ea0aecde6094f28ea8d190225e2a91ef5139b2af5e128a84a2ffde2d3e0359e16b771a515d866b96628c58d92c0e43a092fefa6f5dd89bfae001ecb859a4d7ea0529b8c2675451d33db0049bebc35842961a31ffa20596e30ed7c2c16db1fd6a6c4f7bab780838e0ca9dc5dfcbd386b41ec1774929ab29dd7db85fefb4fd3833650501a4cad26513ab5b66493a61cd41ba4b62f675b83bd6053d44b6863d910ac4297106a4c18cab667a6aa50b46bba164c088fe1af16b6607e5a814e18e2685596c0a01e1805ce33692a5d7ba3f4e144dbac74ac23a35a8b92cf17f81c24efb16c356aef7edad7f33457082aeeaa14cf9637b69db0da42adbb35fcb1c85454358e4c0c0e4791408afdee3698efaa73a9457446b17104249592f8cc19ed7b80813c4ab1a1a6283ae6580ebd692e93b97e227443d267e5346107a79722b600c1c7b3ce63b0e057ed337c0a201149e712f5a3e8eaee28672aac7108d70141202e83291c5fd04b4b487c0d15148718762293c522bbb6bcbd55887bca50a171ccfb12a94b57523340cdfbe006dcd3243d79e988788e26ed4b0e9e3e39f8ec1bf7a2cf098ef002b5a95a95888369d1d39877603a55c71fb0f07358ef6eef597fcb080e07f9bf47842e1a53a50cf172ac52d2fb3a2fc29656867afc473f92236998dcbdadd8e0fc784a88825eb9a5fd282bd643312af91e218b674d1302fc8d48775599f30529b983592045efcbe7f5b80355a425d57ee2bd5c46fabae448d71aff0fe3e9762e9c4e6887120903ee8d5c8c379074c26d205c990b46dd41a999a0d8823c6fe128160a14b6a68a5c7bd8cfa1159e60d4cc73920933dc7326054a04ed8be64aa10c09b6380e47036652b37b01504fa7df9cb32ced92b152ebb0a5922dcc400c61346d2e511c330b44c74e378173bfd029c99c4ce1a0b9a3a851a08b28841508a4c0ea4e8978a5eb6902fcdcd33c181ead5d12db91e586d350cc5df3c00816cfcdaddd95d68ebd1b5875af8176330e798c2e3c786c3d7a0da87f8a010a530edba80029d07a7bf84e192ab63b40c973a64a0cb6530c4add0cf9620ba9d887b9b00567d5045d5c86982beb28ec9a491951d495637274f66b460fb53c38f3e9d024ff52103b4893e5f4be03281a57706ac557ec0684f9c55c00576c2c31323373860078cd4393da65702af060a498a5b894db978796e1217d42809c7ef97a492b235efa0de5749ed7f6cd19d8a1ba7a4bcc600c5d9808051e3b9300a742881130787511077f36850d8f054a1d0f9479133677be7f261972be22205a8231de0faf4c499924e0c58759a8472f0dcec54b92cf020b4a6f730a1db3ca364e1029f6d060c74a1e2b8eecb91a0e8805be0bdc94a35e5196ffd3fc25297a0004ad0d0c8ad6e6683085a444630531ea16c231cca68d28d991f08e2572d4a8a57d9803bc49bd7984556c26626692f7afe8ec3b5d6ccfec4e6095ca5394c8b1b04b274208000f4850e10b28b3873742d645dc5a1eb348a16c0383640e901c62d8d16c678637f083f6e8cbe6254ae46b60967cd2977efe1ea782355c7ab149e33ac4979ca195b757c7389e382e46208b2520635c6f72da925d9577b219b83c106cca8bbdc090f1504586adfc56f16fc35c3eb6186741e1d5a743ac1571179d82bf7ecab7149067261282108603a8041516d44460a9790e2e32d4e364e0e90fc4f16b225ee86c564d1dd43e5587ed5a09c8f7660e2502774d2b97c7ff80909b2557983b79cb9e734aeb9905b1e2cb9fd9043e21d1795b6b2b7f31113ba6c9f3c4a367b69e738c49303ce710733e747279ca3708cfa6a543d18f5ffeff17b7a5c2551ca82a0412762412c9fff891e7639e71918dc9450a99bf6690461cf6568a6671dc3fe41819000f8107381785fa743a30f68401f80583bb60011a33d5bc7f963a4553b1fcaa99f8aa296bcfcfa35d1f6125523b308218d2ed1f364714ab2910b4408add1703c3999950d42f99bb4dd7bc24af4e4dbf3c6bfaaf7cb6a4eb3db38ddaaef2523f180833b2e10f4f213344e1d9c5b2691144d959af0fa8bd1c284fb209de71120ae215c00a6c05b642097bbbe6b5ee426cc3b4c7778bdf7a959b7077ee0f1cc564d09a9a94e1c6c6c065e4b02739f7d5f4fbf95af340cafc29f13a4dcbacc03b350df11fedc28f7090473e720dfe5880124d34d8a59e634de0ab833a2047fa2041b1563ae587f1d59bff7082d587547c8168e1ba0e5766696f2f24bb778d03b55ab89826959b68dfe957cef569b5df13ac58e4603f2395c02c287e7db28dd74376675540b79f7601602806d026c65e9ddcb099c70f74d54abeacd0d28197806fc5805c5b4ef6b8134aad2f758c0d79a0291b4badd59ab5c26cc55591670a238474fd197773d45727a18650243091d5812dffe21a6d1497c93b5deeb3f831f0263e8c75dbc581433102352c2b3af7a6f93172c4a058ea4077f1a45bc1c494dc7889beb070dd41399b0a8b486082c57d45797a10ac8e7166335e734cd271f77245305dd722395e2d4cba07b7f531c2d32f0baebacfda77f78e9d0729878fe38f3502888eae0a3cbc3610c135aed26ca494f0e3ae01ccaea9e8ccc1fdd89335ec8e409086196d4d62781c983740d907818451001a69e8b17c8f4028a2520511b81988627818459132566b40820fa1dc8bfce52d08f87c1258eef2a0402956c64a122026cf22aaba2bfe36d4e2da11857de8c316532cc047d93ef9c065d62f81f4f5b8c3312f07c67fbd4e986a3cfe02f58ab9191585c445faf7b2eed01f42c7dd9491f83a6a12b1acf0614551a810312dd0c0bcf1c6c34b289237e2ff15774f44bb1df8a683f9f7e971ea6949892d6ff696aca5134684272ec679ab80f4dafba969e4458a6364b88c006c767df188b9d444abc3784dc161c5ec869b9f5a244533e684783fc2bd16c9bb02cbd4c6d1638c281f212689009900ae32a9bc63c1eafcd06aacdae3d68d25f32b686d879e718a07459a261df2cef274073fd5f5810c9f03552c8aa67840e0390e0e2a124948234c6d038a0ab09e0ad8f64067852c18906ade7ea32bd672233c06f6d43e13c23ef7afc91b283986170e2942b51d796196e2f490c3bfa2749c44e02d61446f73ff24a0c5f40c635af9071bab3756fd2a3a1346c48367da4c0525c5745ef091f0ab41fbca80620f0d31c0034461d170e0d5ab61112c5fe4282c2c87d089bd0ce37959b8662b76ba46a82d6858e6b45bed2cff1adc0a839360eb5858498a9c304d77152e3e900eb340ff63fefa3dad335e423948aaeed87160a0a392d66e227fa06455c467008e0c490fe29add44aaf5d13d98091eb026f917c91e89781958c1bf1727732f2d5a1edad58e5a45e98720a4af669d1c7098fc92d76223fc6f00ebe5d536cb476f3dd643b206ac8b46b2e03182e32cac4938659a39b1d92fbfd1ae3d88617f039950d5a83c5427666c9e7f1894bcd5bd43c282ebb330486921920af89ad170de50db109f30d026b65bb2a1b3c98a907317bdb80384be08eebd9ea4f27314867184ce67352f00845ffe52e919701ba2af43599fd882886230f442504bee70f105d167ea147cc470520cd253b14ddfc9bb129c72ae6a3a7c9752a2e85f5c3689893ea74e33b271c86e3b8ee1fa46d89ae972d64c641d081a53054981a7ce804e247f9465d98f9fb80e6be2d8ce7960a5e6de14a8c7858a61bfc6483447494938dc78125d29070a04b9c1dc01ff67b00279bcda2a9c15405d0c9bdffa0ac570944287cc298a11b43ab78f48b8f802a29a21ebda1d49bdcaa840e5888ad2e582707f79d0d874b05b0542c78365fbb8183b7b0e5605868adbd9157480a2dfa24a501b57f782a69c2e9e4f15b1a82d1902024c0a2355e5bfc5c4d015748b8b9d4cd3a48f6c33c8c83ccd5218d22f1cbdc5bbf723aee3ef3d31c3d637e19855279f6ad682ac7c3b521c911decb0ee93e4584029741225365c87303f411ac3ccdd02f37f991d8a9741761d4c144a4a06a8d171a65911620e9af68cab0a1471079167950f352595467a779efb1acaa6e61e0a39d54abb1201392861ad329bff8534589786750dafc194ce90465597f620cdabd6e9f7f81de0eaf68288ddc662c47ca401ddce5d960129741610e59f0891c6b31dbac80baa9f863ae847a924b624e08ab195dd3ce38e79eaa428795c87ac198060d435cdc8117d77fa364914573bda2ddf075101dfa65cef5768ddc75db67ccd88448ec6c94236fb7299f44186d87003510a50e0e18d29b27d228192f0a4c02aa9661a9e7d41182c5921568fc33a46f32707d326065bdfd573c788b73064f8c031382475a681d98c9f4464df3309ed7a76b6ad98c76134aee3c27ee898a40b09cd82ffd1c3eac5349b20e8a815146d1f1a4b3c05cb5d0c9ed370b1add2011a6944ebaa38cfd572adea298d608a14318da1591aae2402906cacef34897c729c2390e9d4dfc02f03f2e4873997015c825c19cfcdfbc8b9a56f8de14e27e04cfeca4c86e7ff3a47de99742da0b8a22bbc26909a950fd4c9fff947294156559df10e71282dbde0debf6a530c8984d0e55869a5f0d8377f54207e040a58b298a9a1e721aa90635cb4305e321e77f26b4d8b0b70696427f95b57f8ef712fb39c00f5a96574c7f63efaae117538f0163309b5ba6fb56ee5a557d3543f8044a569f99da23f6ea8df0b475d2c0da73d73fe88b98cb6e6d003b6b86cbeabc5eb98a80eb05a0a88c39c364364ea48e2591b6b319e4ac88aeeda78f8819b2913b8a4d329c99f4c37bb3a493e46ef594f60cd30df7335906bf48e6a23dbc0f6be50ad037539080d14291013a38e85a1575be6eaec9d894e6fe74acf3fb84e9c74d6987326e63eed90c8ef274620349ecac726bc0c4c99953ea64fe4ee0fe861f6487c43028245678c5eda0371757c8957c6490e956515c557132318a18618e98581688c0be0b1ae592c99b1d2f6cb219461da4069f8123258061fea984a4af6c8e91f73849fcdf91ba66dce3682f2d4d3a33c2a0d4854571695c86baf52a51382710a5a863ca68098e10a9810870b3d5a0815a6964a3226a1055b033cff7b064504e20dfa422b9c3125caa04223bd5d86011ba1396ee4479f26fdfadef0a2b6d542d2c9d8c86e2d77f61ffa60d1e2d0a452516d20cad08089d87c3b23b950fd463c46111dc76757ad197c3326f286e8d1c18da0ae4c69296087078b84fb50278fdd6258d43dbbd800604d70546b496ed78e561618f1eedfa4a9daa586149e7717aa11541a750bbf4eb8e96376227de7cb89a136f0af85cf5b3088db9e13291dffd33b04b50f416e846ac737b7ba3bce31dedec04b733ce3267aca685e2cc666b6331b3c02995542983752d6d36a640d12e376fc1a1d36c89c475ae42034ff3057891cd487dcb07dafb6737d204e04633ebf3e4f9c72b503eaff602fa0014829a8d017f3f209d74662c82e1eecea2396e19e03fea2f805817a501f032212c86658093346455a69eeda7c8ec109ad12c89e6c72dc9c4b3163fe23866ac7057d7a380a00bffd00f914c66d8a7e42d038751097fdef29562ef63908db35b40d07dcc31b2b57588360a153a214be0d2cc0d1883933931222e95c4c2d8f096a68533970c86401eea05dd711e9ddc2b3836aed9d4696215b37e7ba38c6e090ccdf7fc5e093a0071e1b8b96143f4aa15dcefaa4deda0641a86d73528c44eb4b6051c87e920e2c77a0437ddac7a3975589e65174c7fb4896e180d22e76845fc052c97f90cc8160b1d4b0e1302f955268193bfc0df7d346efe79c47134b14a360ae4aa548d01bf68f1ec3dac3d5c8200a7e39f03366abe74265e4b6fef6a1950fc9683fe30a38d020a4f96198404ed88292c6ed3ecd876d6ece2e05b8432cf0e433717bdb7d14a1d3cbfeccb0bc0107da3594a0478c098dc42b2c0b34d17c9c5454920e4313fe44bb9927665842231ca7e7890e74327277211437206d6ce33f50440d11f044d6c39c07ff6625b99649bd33c7edb5c0d15e3734f8d64e978f2c5e1212c056c1bb86735ca8d44c82b2f2a608babf614a9cac833166f30520bfdd416e2958372c3eec4141a182a2459b7f833f6eb6eac4ed3ed007bb6bc9ebd156effd23bd68835f03dc7e27fce1f82c61b09251f7e51792adf374dbc435cb180067238bae7cee835ffeefa03959250f77c96bc4a817da02ff28acd482c96b51d620535285035861447ab6cd7c02c221d598d15b15ff9f34edbbb2079266104612e84f176cd1d66b2504e2b885e96d3865f530c5528c183f362d0cc2524f8fcfb0e9d63441ac855e8f5b4ee79417159e6569fff6b75d1d381ca8f1de49d6b334c5b5b9a3951af3f9d435652094453ab3f5e830a2a487f7e1cc14fc5c4d3da756a055c00a5fb98afa45111db7caede6b9e49d90f150b0de9acf8d37db751f280c9b15dfa62d2f71608726a1546ac32ff1b5ce4993a6361ca184b36280b43f73dd5040e85a6288002266c159e249ac347e35a53ea08878bb8892dee97aade3748ec55b8bce6bb5af6bee7385f769ac8d529a2084a28d0459430c8fee0324cff9062b938e95d4c7a70bbdf17bd9f21a08ff4adc616881f2f644b4af58101efac47467d759e1b649de2fd4e57c9993695fe2a8a0d9326d83b06469feb5a4dfc822e5f0f5e8092f7e433e026020c1bfc87a9824b5e29295e387e7ea088edac34f4ff3c949592504d3d2444bee3f44a9f1c58d1a05067f180eb1e13c52bceb14031707d2c8bbee1314c3be2b9d9e120ba6f56d36a1603f6ff7f480ce121a1d0efc9dfa9d84ff30a00c358cf4d64266b6949e3692b1e9195859a1bf772a359a9862703221c1d20220da7f58f76b504feee633635e0413d9d701fcfe93f4915feb590dec508d23afedc8ac264c76254f17d2edf08c1df363cadcffe96029bd5b0b3ae82851df5b49717f039663f658d0aa555971565ec2abbfb4a69f96fb19ce23b596b025da81aa69af27c0949245a92d0851738c2ae28cdc2319c516ae283b065c80e478d78895593cedd879c0eadaca034c89aa06ce28ce9a119ac521478c68f8715af9e814f3daa0dc988d8c6d2f12d9343085bfd11366e3a754b884d70f9d0f58b4ff5cee488dc5f38d7130a65cd93dcc8f26077cc4c2eb11f36c3af5846a8e2bdd8c219daa738b662fb89855be99f8bdc0b86f254b5eada76d109c889a65dcbb4507dc56b90c4ce917a5644dc7779987f8ab47a4eff035aba5bee8704f9d3b69e7a887fde344e4784b1d09a719d5bcc04d51c1d5cd584cbef63e3d0ee5065b74d35fdce4546d40380e4390bedcfc48ca037c244b7d80033f6c8d427965977c2306a69dbfb11d70dcf1c78f4462bbc7198e81532a01bd8f4b2f5422da2099507ba4b6ebf7272b7c8ed5a5cbeb52b14156210721bcfa1431218ccf1cbc6ce99718d3634b5f32090abc9ca3201fd60f73e27845bdade950d508598bd280870615534cc06d420b34a5fe2a4746eed983074e392d7e5e26be3df0f1d567ae05905a12e2bde0cc7b5e08466fd1cfec5279cddfa19ade7b2e7c39ca3a64f3612563bb1d177a0a57654095a56ee7466edef89d134363838b74f851193c89b42cbcac318c29ec968821096b69bc2a44457db4a7bc74c4a4b00b90d038688494efa7283f72df052d92c35d45589047ab0e08cc9b9a11793e57d8055a36bcb5235e7e0ecc0b1ac58dc7398c8c13ba59261df94b6d5be18f0c0947014f5a2fccb5e0cb2d45eb8160deb93820b8ba3d8685c5cd4f4dc74f473912f41f92bfc7f1bd1368bc9ee902190a6644b45992daabbdd438c43285239963676729202e226b74fa168e4c5eb154aa43bf6c01727e1631ec8b464a6c2ed6a0d38112e29e1d044b1715de2fa10ece4681311e83ea62686eb370b78923f0658c04ac00a4c0a53b1b588eb73a6ac9c29a23555293ea122e55cb002115f81276aac70657e3a5bd9b8b0f6ace1ffbc41b6bfdf7b70ae01d575ce707aff5fc2d1a6db09def278530a0e9083cf73b461876503b86f1890dab64ef16c2c06ebb54c772c8fb5ae0d2b076842c622af716dcf7e64ceecbbb9579992c646d19685fa4118696c968ad90d93e1007310289c7d04ea12cd98d2f60ae8b74a0babdba781c90f53ca87e25c8eba4a916107d0d65ea8fe8dd79a34487dd0948ff51a003871d48217f83096d958857b16d77f71888110449fe039c49aae175b7d890ee3e3e6c3e23b9fef1083370ed2a93581988e06ccbd164ba2eb2ae71135e382a1c2b14aa8a71d684ddfc1919629ddcb7cc5cc3dff3689f54996b6fd0c442703ea797241527c542de7275ee0dfa5c835c2d5b3c17b99770bb3231a7eb3c5ed8128a7be9a1dc1b49a3fa7a7061cf3284b8d38c0b51c10a3714049af4bb719892721e695672828ab6d5c07899b0470de5fab5140508541c4227cc9936dd2f1141c55afcf8a5b40e2ba9457b92464c84b10503899b4b56418938f0146615155e96d7a9dd8f66829202789b474c35dcbd0acf0f92400512e4ff3ed565007aa03d4570d834e609d9b570dadd92abc3214da5c79d5682cc595cdb88dd2d8d1fb4365ddd1aa75bf0f138e2cdcdaf8f6670467660622e7bcf20e1431506d59eefc72a129d1d280205c157d7fdbbb48f615565173438340d994be416737527a0d18034832cac893b2e1936c0bc7a005952ae09e735925490b7fb903e7d6264e2ebb08291755aee1de917bad8c01d5378dfbc817961624278c467a60e73147bd3b2b67252ded5d3bbd01f8f02f18166a0463b9559192816e54880393bc6e423118ebc4b36dacae9f6c0a6c7718cdde9db40f7bfd7024895dc89790dd669f366ce0effe8e28b195286e30437dc7e5b60ad0690d66144e92af122c56a0c8f36700fe8264c37def88572683581d2aaedeadb450555713590a6c042ff3e9377bbc7d7395750c2f51556c1899498cbb17b210e06c796f34c78ba9df4864b679f7d7957a3937c807c9d56a144320e9c261269d213ea3cb1183bdc83b3481335380dc9a508c6b73c125fb16657a0248d9b1271a9f477a7d6c798422e907a09ae740b6fe88b0480dc90a16dac9a3b54afffaf6a2923d0ed5e52aae58debff536556623efe8a2740f127f1391a186c8bd79b1f4d2526ab056453ca01c928a343c102949f27505b699a58902258562eae65be382e687f83dc3758d7bd5f56b49df1561c652d20bba4dc88854561cf5552a737c43aa95d80b6735ddfd08f036b91e32f79576eca337c158cd6e9188d744156661412aa733e6de7193bafb99b7b335af028674b4b3129e5cae15d0ea662a601d12fe209efd739dfc882e8e3cf95b1c94155cce5770f19d17a3d36c04c330a33ae467107534a08e0e54805d013ffc887ae8463efc13243f9810a4edd6fe5c17f2c2cc8bc54c45bc6dd934ec8280659e4f49f491d94c1d43c81858c2e80b0c2286327975f1128e0325a22095181c20d7f69101c0c58d47d466dd657ed0f9eac7f0f9b8d38d10bfe399d08d721afa423782c1bd87e8fcb017165bca835268b3bbaed33de3a1bc9ee83f2cb4b1caf5626e9ff67add1baad68c2f3be55aca683fcd5708ff369ecc292c12780821ec0ee9a9cda7cde908dd1c8cad1c9062553786055179f67080b1cad44bd5aad3c82254ec84826c4d64bb3258c7cde911759b996e042fca5aa4bbc7600dbdc7d77c7ab5a312a77654504f67481cd037a66abfc3519e6ad4983b3fb85f169b2ac4e1e0174db36c5635dd470afa1de6f8d4485a6fd5793d1641e60f9fcf11aac785b4f0819f545a8b8c0934e3b31e3e8808bba6e5c703d26711e4bc0f47854983e7abf06012a80abd8359d410b5f38abf5f4fee9cb45c888a4e87adf44ae8535cbedc6917c1056d4718f8ac7ea9d229b2ec6184d8315ca26aa9cd0e9321975e88d805bf20d47730bd1524709d04b3084efd0e460e9d34c5d70d1d3e69d120f50fb9ee9aaa7ebd10e1d54d1eda3db03b37d95da64afd92de7346f5354f54dcc997643f38d665af0fba012a3859e7aeecf911cb7276bb896476ebe51e3ac14317123850009adbd50bd915b69a7674d930a3c0ac2fede4da2bfb80684327571fd23af4a99d2dea99e06f61d26a8b894a55c7c34ec66e918b555399ce5e3eaeebf763534fafae1f360882067d0b644b7d6f27dcfb614c9ae01120c14c67f01ddd4979a432fbf24aad9a5d5d5258dabca3553db05b0e242566a90116351b792b1f165364c5b0c4816805358eaa1bd817213d139cde0fae551661e45a7005412879c552737d8b30ce591586df67960784a427ef2d373d6ccf464c9c0c51609338b2495c9fe640938656cea059ec8616d1873d074e2b9108323944a3c9cf440e3d6115e4815894cb60872b89066478a4a942ae78afb0ae76fdaef0f8629ce67cfc2fd66509392a560cac7e5c0e2dc4689e326b6fba0b284b38202a7e139658814eb82ac96d4a80cac378cb729d8e98cfcad41a798df4f6669b163e02c1dac8004220e706a997ca1bfe184ac01e7485c9e42bd94ff29eeaefdd11d37b28c5374938478a8a9853a68cc371e57b94d14cfc48fd18d1cd77d47d448cae41b42529379852e7470b09212d2a88cee00c8daf14b16de88c5c0befdb92321f5b654955d9d97bcd901a5a456f490ba77c7ded76f052b88c6ca50a386c6a4addbc5a6b7f936debd634bb9afb219490c2f75bbaaad23a25d3bc71542138f69b41eb40e68374e603886b65107c4661739c29dc39d2dc24b1980d4f523d850b19c96f428d1900d73741b7195ce5aa17968f2984e8c46c5b3f6c15f5ecd045fb56b2b5785f3f30e5bc69b0da1bed28d637ff760a411f2839a2065c41194721b6100fab9123dad9c74aa7739d11c464527e4c38e6389e6a5f1d5062e8369307fce40c9b3471a9fe6a5beb7039c484042ad0474a32d1cbadefb01ac5e8ba23a6188bbb4c1d51cd8905950db3b50188c76a3841e9a673e0bcb6d60ddf8b8cb2a60bdd1b60f2981b2a439da57aa93f55f0660ff3bd134b7e854d95c8f17360bfd4c1e92a73c309505101e73269e5e8deda37c826fd48a2b4e1378e4cd3874b729b22495aaf47539e62a1552ac87e91a2f0907108898b21255f5e140ffb099a8f2ba5747f45927c05f0c49da052eec0192c364bc68b2ecd23fbb78665d6c8cd626c6a40fd9a9c734e30fc357be888edaf613573ddfe1a32ba86bac48df1454722f96c240fe908b1d562831516ff3063ab49f60d2e9b25cf3c9860a518cc82a1230c15b1722ad76e4ab37fc61012d94a124bba2e05e52ed4b542d04d79d792598e0e367de25cd4cfce79db3b0939f116dd6ba46c3d68ca3973c98da239604143e6e90d17a0e6db0e47249168894ae3a4fc2c99e4c8c7f1a7bb122b2af9afca0a8110d4f066d74f63959ba9257b4091514b1a61a7ab585a7142afd51758c1e4e5856b87c5080038c7af2236594bcffb3804137d52a2a92e1684a57997c2ce3e1040da74ffc08e8e3477d90d4872751d233524e1cceed8db14506f64f59a495d9b726248f404e0742fd0e3e2e4a4d689769d303f76bcac35c86cb08d1af9e11df0659456155041be6610c61a9e7008ce4e08fcb9376fcfd1b653fa3cf8289801f1bc5a791546a8acc7db8d36c247bf4767c11564e7a84f9a85a332fd55a3926310c28eb13522327cfb030ea18b9a8238fc2ea3e75ca9540a73e4698edeaacaa87166493c6b712209a3f8557c3c0f5566d23e24b9b42e30a7be76ba133021dba9ea89ef15a713f3c852ee383ded7176e036876d012715537fba71e89ca2f55ad13568f4e56e3dcbb87001596f7d5d2bf364d280c27aaaa1b29a9ae7902b101c9b58ccaf82fef99d2dc9be32b562522a81b355da2d69bb341a2797aaa8ee0b4a96e52f3635cabe0a9f695b2d6345d5f47db5bf9dea7622daa890f0176c5e92374d905ce089a2a6735a4f4009d0532db1a6d53fa5e7ae51bdeabe1e0361d0274ecb421f5184102612a7f7b23241f207a1bdb17f30fd1fb23b443ae2861ebe6337453717f896801cc3fec60e69806c9e75d8be535c3267c7595d1c4ea15f97998463a5f8fe838273482877961f6b900a5a018eed9803ea43674231ebbb56c66500fab7acf8d44dd109611aee94c7f46051e51ba487c529193e548b70414307e4084b15197cb71fafdc66e718573b4abec3c8692564bbf2c076244509ee1e6461cd5abdbdb3d8f9c6629d60b2dcf9951e9b3c9d118e896f689c303bf194cb586e99b15097c4190b48341629d3e98f4b32297cc6b2f66fd96c5611c340322b6e2412f754cf96a315eb4cc28a557786c23949f93e281a20dcce647ea6aa1a9302dfb18a69aa7880de8f6f8002be60e508650d074f1096b920f4024d84870b4591eab1742e6d413fdeebe2525889f6c22acbc4156b71f0fa0ff5b60153482d0d115185082655549a831955ca8788fa48a323a503b04d48f7abf3478118f1c5e0ea352e15d24e41918693f768403d1a357f4b007aedfdf4acc7572f7df52a90ec8bb8426a7623f3a4993a847323fe38a60a521116315c1a6ee4fbd45e0ff05e80a797d55948dba86d6a882013ed749178a4be21c2e1022adca56eed56883521a88d10984c3518bd1523f529d4491d9afbac9df81907f520ef59e542f33818cb3cd676948a7da787eb69b1cb6a8c5ff511caca3d8160f5fb27977bb01f452ec5e3c665a5eee9d93827812d53add4c4d077e55aab4904d7829ac929ed2fb40bc67297078f4762aaa3c3c964e78c9547a61369bfd2343d7e0b03ae2a716319acf6dfd9b91b3e8e3d2726238af2700e86d038b55a94a63195c171a660c365489bc1f0f8ad55e1f8445ef8acf6b77bd15c554e43adb35d6fe614a8d3edc972999e634761d1dbea5007510bee6e798a14b5a056a144decf31dfbf45e9a8ad8a0cb08a95b6f80e198d197de345803d4aff70dcceba66a807ec7b23c2b55f426e7d62a4c49f786309d4d7de4d1aea86b3eabb20ee971c6c8465ab20f4fcb9695bba6d0b35015c1f140ab054a76594dcea9462c4128fb0a4410dd183f604599ed66cb4f4a44e383a405efcca9cfb2f3cfc014b8085d0106a6d884dc2d2f161c154bbb7eb76a49981ba500f041550b93905f051c6831257329b65660dc6f4ebe9641c15224e7c0a8e5298f12525ca406e3c3a811636113827f8aa55d0c2d513d4e75d47418c5f42b6aee416865850c4121570ef99eb70934c43cd08cb08c78a86a0c2587ed13f3f86c85ad1c3d80db8a0174377761a03c7753bf722b6e55f962041694de87af919ffe49d23763e61cafadf981d2779e89eeabe0271b0732991491800f3cb26ddcb020c438df9c2a757b3528debdb97e5037577a97542ea7091b8b1656650551f126a79b55bd23b8d209f8c153773773cb69c82d5ba277672e7ca25ecb9d269fc02ecb6ca60b092aaf7a73cd29ccdc19862f8e8cbb9e2d39eb6e6999eae4c5a9df07b284c336ab03eb82de1efbe46e4a1a807cdea206259f31127c1ef9d88723c79f338bdf59de62238acce8caec97b49917a24e0aca8bc3a62b9149b8cc046cbe8e62b13967c17dee32e913aa9e82b4ca4565160f85bdd11ecc93b18576f51d8a2830dc4a11db4381a23132a06ef4dbc2231114013061b9376f04342c0ec9d852474dc3ad9006234671b426f752788ac090edfd1c020af6afc418ebdad7d006dcfe9d93d2b4738cb143ca69cd443933e5ae6a6d63bf9a88e552d7bbea9cae815126a08e2348d63c7a8a3a33aa9305b2387212f3e2869f378d897e302f5a0ae7316323dcb70ee6db6c1d0e9865ec8b5c1d79318c2117134a49e7f288b10f233f3c3ca70585fd3ed792b49be7d531f7fdfd1cd3f338f2469bc1d8aac3666e3d84ad1493a10bc6d96dcf24723ff29e46c353a24c615b965f62e90a35e9da3fb15197756e2505d07181d3c827d9fb9355e7791f4b3dc6ab141243267100bf729955516c2f03997a8fc41d5a3d37659dd93d60ccd60d7d2167711125a6ecc820f01e65649df331cafc526ca26b49453b0bfc0444b6c4d6a211a85254d1d5a96d43bb61792f242ad2698d98ee1c2281042661542f239df1e3e8527c07b1223d63a5538920e7e2a2dcec3725cc6122d61f98c3bdf50665937c524e2e9f516c287e3b9fc00171c704f976e0ea43e8bd5d4be74db45b0d19221b084debb282e20f0da4d62768ad9ded1d00d377af8cd2ae6530c3c7cbafed8998455e980ba98fe098d0d6f3d7662d08cdf4b65d2294bb38afa0af032642daf9f01e0b3b8b50e866bf3d2ef295ef7396a19419ef5033a941bc54da7cdde506ea9d67f953ea840d85a5f659d7cf12d702d3a195c5b41982085dd3cf37faed9fad7b2e0a0502aee8eef31c51444b58169d628e19ae7b20186f15f843a15df94ef1f49d409aa487cf013fc570e55b8932e0e1a03d726ada8efd539b6852448386e1ea5e4b02d36e8ec0cc3bab76aa39c090ae14cdc64e9ddca04ba660019373707214b9a24cc6d42be110f816a70b5e108d13f88c14879247bd54cbb01d1da65f9be2512732569685974aa0857d235f45fbb22e80051b17eff083614c117c13a62d606fd9499abe1d3a682bd364c7b9dafa3657c88d4480658f955d0364127654e8d8e8339fb52361cccf81900eb45358bc726381c97889c952e294de89a1f23f12cf3fbbaaf161c5ab5f08496522e3eeb0bbb4cdde54a5055270b33629e0e3d0e75307fa0291457243663f8991c2b93de0852b4239b58a73fcc38a46234a477e8b1317fb47251aa318c49413fe8a0eb797a2a940d60490f83d00308f6011a9609723ab2039220d5f2dc62d5cd9ab2f0d04c16b5adb8352be3d8dbea27b8bffdb2d215e886157c7a77105026eee8d7a0c649bd10565ba23c5bc32210aa5fe0599119e7960e24e8c94a00a1413d5067a16438a8128d2682addcdca248e64948b689b1481af8ce771f774ced136f7822fcce761d1cda1f19d3b7c3230c9203b8917a3ea7107ffde4810d547a17a32449628aa08a687e3ea59dc199a3ed9ae5cf0b3cdf793ade6112fc90c8ce80b8d0c159d8ac5d18ceef1d423e9f2215cdeb2afad216e5729e883d7146a77aff77fd3fafc01f8a0a5b1b5ba25e1082fd2f55831b5a24d28c4098ded7693b71fbc1603f45b476174f95a21e2691e9a8550c00f803829176b7ba21bb51467946544efcae3f1b19080dee271b74c5adafc145090ee32b7b336c26b4b8047d7ac9cac0bbede30f39370a2120efe090bc7df9d97afbb8eb92c3bd9edabc4f354f4692525fe96c4459b18724c7c1292fd64f06ab0818cbb0d916fab464e0a9a1966cf3d175dae858a27c8f43153c387a968292a22df7a7ed923460b345806e8619863584b808ea083c55628c86ed9834e6107496446810c7d9496087e1d8fdc5598870e44622eaace42487092bb56947dcc7066957ba6e30d752f99ee969f6fd3b012446b5e1f8625768739f3459ce5d86451b597e290e1fb43642e3157455b9fa2aa4053bae71d8c3dfbca09d7f8c0bac6f0c166c220621ba1ac412501fe4f342ad40d16660215a581c4995463ef5be98d8045d196eba5e95f71a2a3ac7c2192891e7f4187baa4170220c1b979e6dd12863d30c37f58689938a131d52c1367c8e5c7e25331f3750490915818c43f3fa14a708d1f81d61fd8c96ab9af09a6552f953300c8ed65e9799ca8e4a49fb56e6b3110e7d3e0d9baa93d8f0e65b1c4a089ad0140a1469563b09abb6775c0d820875d61a40d3d75e535d864080b5f5d659afcaf1fc90e98a5eb43eab1d143ca2633bbf65ec6090b86a2f8fdc2c3b4af3ebe68ec43c232450580d911225e652179f3e3ba46bf655066b1f7a382b30477cad33ca961885235a2d221327881171ed5b2f2e98df02476dc17da59372cdf9413f1222eb303d8724d3a42e5171d6e851acccd42f331108e206596cce039a9b0b092130ff168894befd4418ca9db93226189811ae3252fe6b23b9828f4232034c31c7b665e01493ac94e996e58495db96231024edf61c422abfa14d33621b348c208e312418b19fd22872ebf813b12bfc7d818f0b3d3ee17cdcfa7ef719ee8af6f508a65d2e2b6ae8ad17904ec56c61a21a2318206532a476232acae4953287ebd5e276f8fb32ac68e0ffbecb6b05bda4ba53af1c27c950ca3a4efbd8154d1e0b8b43d08922a1884d6e7f0af8fd0351438124be286f3e988c1e9c83983f739547b9d28c3e455b96e6fa67ffc2f9babeb2f86d439b7c7498539a93b6fa9e9cdf814f8555ea792ec559440ad81adb016e551b601531ef2cdbfdf300cb0464c0a3c580fe529f3cb1628bbf9558ba56f65f7afd6bbc26daf8e5343f4335bb20f4dc17b616adf74bd573686c5fb82bc6e189c6dece76540026b163e08a672972f577b9f41ebf315795aa545cefb8c09d43453b2441653740484ff4db7a6921e805aaba49a83d9398d01e64f916805f10a2e837907e716eb0db8af36a81dbb9293b79f4f962df62360cc75b78cfa86df4e27091ecb2bb9f7aca7decb1ec68334da68f1eca3fb650215b72bbec08fef6e79b3e9e2f92f3643a9403457397116161b52c2e8a89dadac26afb2580b5de18b00aed47cd904c042dc41416a2ad417b31e6274e1fd848f21d386a1ec3879ed43fb1f88a515ae1dc06834c15591620fc1021941c803d28adaa9bbd3c54faef292857eb8504657140fc01654acbd171bee0cb019c61d84f567eddd4de7533b66eac7971fb0fa8177ca3e30e46ce025388c1c123c3d83920d32544cb1230fe8fb197ee1f14f0447d1ee974ad45ffbb13c105ad8c6927669258879eda5e5744a727b298e66a5d00978d0fb9c7d5dbd1c48ef504165f732be432355da8198310f9ba48b53bfec0f81c64bd954f92b9018c3ab040ee46659255c81e98bc583fe8b2e9c5de05d59cb9916edca8d4063b999f59d8a577d3339ae7d1d8428ee4f29cc1e1659e3724463ceefe35c3c47a703fbbd2abd5cf9ddf1ac64845d73d27e3d754fb4d97cff9fd83fe511c9f484ad232b82c9d98b3ce1cef24b0060d2b59cce777b19444af9f1f108d7332981381149d158dbab6a892e5cd442ac81d7aca324afd3d625943ee79371089d48c221d7dbecc764e67a737762189ee1c8c6665f763a0bd368695307200e29b7198d5fdd96cbea3a0cf2f3d854c6ff95b10f8fc79153bf0dbeb130b3d631b1ffe557e85922ecfb63bfa7fdf8bb9743b89efd53d64b50c72ad68124e6b36a49ee1167a43da7a15dc30486e384d09cd2f689510392f256b39c6c07dcde2920bdce2655a418b4cec40e509b80c7122d86c1000be8eb723f1bbb1157d178086afc9da3417ff8cc941d870aea29c3784d6ea76d6c4f7908b279e636c30c15d36b47bc86785f08af5f08bcf6b94be833a40ef401d67268726a03ab41f6128ee2d0a8357fc22d341fe39428b443816ecfede3be86b2cb3d61eec79dcfe9471843e3c45076a2cb17be281d7c8693ee001c40530127e46f3af7f5e07488437066cbbb552a5a5c4d05b0d7103879806cee2f57b15fb2edad641f6bae44782af67bcf6ec4f68ef36610a39da2a96000af09c62daaabbd0b0d36c5887033bda051c7f4760870485e0d81af460b584f18b942879ca4bd63829b358416d5a0b21547b90886a4526ddfe4047d469f909fefd547a0c9935fbb1940c0d0fdf1245d985dac420a0fc8a43faa2dfaf327629acef523cd8837f63995282a588d62c0432b1f0377c386f1c6262ed02f45d48f798ce5240612757b886b16e3c2d2c46aa8073be362c70c26d479431a79e0b06f2dd42c0d13f090c13eefa2c7880cccae9ce32eadd54998d7388a636edac04ec6ee209f210c35f6152e32b1745d52d5ed428b8ff6307b95b0ad4897eb31c8d1c9ae44f07234c8f98faac9896923b363d2ec62ae32e33588934bea1c39cb5e5a648e284177b8184dc09dce3f28aa130f2e4b8dd45441f161dec7383aecda54754a4c9c7db8ab958d445a35c1e380c837d3631cd3fd629a411d550fc6d4e892e02ed16ae98d28060e90080cdf3c0c6f73ea24bb6c0a4195b5b8ef5ce15ccbaed8381309f97063c0e24005c11fcc0c89d64a6924a0b8f59663d59784de0f13f2f446760581a91d1874a8cd2bd3a95c97341243902411d0a2c6e2f4431eac2dbfd8af8f71f90a2dca3b112e9b5dc48bfcd2c28ccea1605e897795e3617c9ba816d501101f46415a758a57fefbc032ce94d3248155a38b876dd800ff9ade9602fa745683b1b8a110663d23429fb337e256159c16d77833cd89decfa907d2aaca72e1c708544de2382d5dc8ccf8381ff8b0eb412f4d1bf60fd3c24c624d6fe97773f6985aa135ee50af78409e73ee70b7a7dc2291b310e937104addd300eced19781fca2a50a4e286a62b3c7e81f2ae05d08c4dd0791d1e92fae3ef516d88a24f9d9239452acb5728a675959002b900d2878e348945af87bdc78f31a79c22c9080825a2564a605c5861c050eaa5ec811fd22e8f349136f7ef4055c91b4c69720404760d06d0288eb21da3ba58170264373bd5d0975100c820a9652f708904bdb00e46407b45caeca3d73afe2b807761e57cd4cb82eba1b7dc6bc3fc0192629d22fde11d83e1f0478fa23bd6ff2111a723f23402d6d31558f855a5cb139d0d453af6a87747884f0620dafaae3d539bdfb56044596266b850d361ae9ec2e9606846f4ece6fba851e8b262c5fd691d1551140d6bbd6efa6d6ce9743e5a1f85e026ec0d83645e31037bf2ee78a5dae8cdae9b9c44611dd59d89486dc47ee9a945f49c8591d287930714119b1c600d50eea127d551f09a41b481756626398b9cd930fb215efa6b55b3fb6bde89cd78f833af15f24317f5d97e3300c420bfb17623ab5df871e4483b7178c8264ec672847c4bf9e0926c2bbd4fed31904e6d56e3d5b20febee8bdfefd1b8063584fdcd33a810ef4999120d58ba52e7e076f2ae60edaa3d12c98a7b752a90a4eca394746efa0913013ea0043f0318d70009a98e6397338b5ffe21c9971c276a1d7c18245ba75396c7705eaf9f92c9dbeb3c2074f26f940d09b9509fa4637140065c12b84dd6ad2079fb253568fe250dff0b375d69e25e86bae82090ec5af6559abf7f6d42bf78b061eb1b79be983276f7fb68ffafee6f8467898e5a65a5eacc33c68da758671421e2b1e6912ca535753ffa0158885cc7fcc814543bdd2699a4679942f44f2c8471811b0754086457c823c005b1205a9168153057b685bf3f58081f8ac361f93bb7760fabc6b577816d70bac7a38c60d9b843cbd408b51fbe56405317ca5c2976fdd6e11e62fa297a40439b28d4da394bf0af1c30485aee04372451fa0aa33d4980444cb490afdb0473d05b04863b1d9f8a3745dab1f5692d61867dcf7b8a4939f81bead6a69039e0296a1c7e74ff079bcb32bb4fd3e35a5bbe3ad3f1bbe878133065b11c19fe61eeff96a7d21c8853f35db86ff87a20612e4c80b5fa3d0fe0850a8e6d225322a7a4d5a32ba228e1e5bfedfdd9ba25bc23a4cc967fde57f1d3fa5a8f3ff5aa8de02f17d149c3408353f31ae62e7c29e5c8549f93a5f6f7b6a49018c9e034ac8fe8d5a405cd5a803d95ba4c83e37eaab37cdbdc464cbf4ea763031b5e0472629ac92a945c2c107aecec81b1673c77d3f5a35fc33c0ceb079805570315d054ec2dcc53fe9053241da6194bd081e2a248681166bb9bbed96524a29539201d108b208650854526ba9a5d332b149ea5a67b3d4b5ced6d19cda6aa765e284fb7850f6e5c6c3121bf7f160ea5ac723c2715cb6fd0c0882e046654eb39e28ca470e04570e1562269922d26e93bad6c9ded6979ee43e9e6d52d73a9e0f77d2d19ccead670545510445d0061cb98f47d6495d5b09115b14d52207044770044770e43e1e3ba96ba2a4e180140441b7e99f311f35b961c2d93a9ad31999710447700447d0763257dad9cc11459b4913be72ff1514358a202882a2288aa0c8843ce13e9eed75c27d3cdb2b2532c146f4d2a675fac591e9d409f7f1b8608c31ae794dd147369c8e66b7003ae13e1ed73a5b8d8ace804eb88fc7b5ce266974a8c9df547db813d0cc4c7134b75e43b116688e842f51b572ad56ab2078b8a5aad56a45b3c25c6854ad40d7eac84a5cad56abd56ac569e084fb7836ad336732e7fb67ca4b92c562b1587852d73a1e4e1d5c5a30c618bff237675e2994a6715eafd7eb25a4be5eaf5ec2f5f0e5251b37714027dca77a264dd130c32c9125b24496989a71523fa8eb203e5a096175cb8327f5cee6e194349463712c8ee5e1b80406eaa69269e3a4d7d6713a3d2e8a2c9125b24496ccb593d9d3e93accbe24cfce662dec507456f7a966586485b5d304773d510fb8c389a124b5188aac309b9c2eb044d534f5ebb522e2a68629812d19bde4b91b4a2635d3f2927c6c843b124a326b5236f3a65d8512552cd54aa50245500445507cd184af195590156bc7901611d088eb480496e47eefb7545ed132a9964972c1aa5045833188410cbe54abd724e2a4fe999aa47e23f80897245493fba74d56a956aa71094c490b452b95b922cf26b945111441111441fb6a986aa66030984a058220c864dec0c40c822a213049b183b06972150853c140154b079a84f15130f76b9d22709f8f94357b64e2a593ef9f37b389973edf3f635ef27cffbcc2a98ccf78c9bd1484aea8109f46bc241fd37061e825366baaa649fb761a906bb1301e47a975f83ae93a48afba5b11e8fa336f235ffb48d3e44e02c498fbdd36aa535ae7c2eae7c4106b86c4395793d44f83434e1c738b3541d68ccd26f3c6279369c4a76a92fa3b4256fdd367fac749eaff0f85381aaeebfce93a7bb6ceb4f33c3bb9a4c51e5962ab3ec4c2dcbc82a2525654a7b13d84eb34c1e1fbd7c6a6c9697aec97b49d4541cefc84419330be133063306faf8ff4d1c7fb70ce7eeb7ac857be52ca2b445d8bfe83215dde6fbc6f396e7c7739384b85b4f22faea9740e98f12aafe2c93cc3bbc0cc36fe3a81b3f1345e6b97ee51417164529c194e101f59978f4478068db75000730c6f2bccc25304d00283cb33bc47ff712ef9e18fcb325e7a28cbb0f185329759585e3acb4be738b1971ec387647f003c8e4d93cb38c9bf974892ff4c767fce8bb99018938c9b70294324c95b46923c0849f21780f7b9d8b4d48c92fc91ec463822d97f86272408e7b90ce07db849f6c7a1003b48923f0c2739e89584065043a343f60f000ed9391e9d9d97c2b5d8d8deb7cdfb7a84f2e75b6697d93696d73e20445c96ee4322bf1089de5f883e0e84b6d1ff79effab7ee856fee6a1bfe2f3c20b40dffcfe69f4cc63feffedded59cc472b2fc9f03219cb73db7aeb7ac0c86ec400089080dfda8f6467925f7cf3cffb111ff5f671f7edb32b5a868c8eb3721b22bcf8bcd84474039c7f8def1789be8618ff899ee5bd13a93ce965d644a2fffc258a2112894422ef8bf12cafd23140e5499e10daab889dbf7c64d32c1f83c573e1dc4beddebff2335a6419e6c007b3052c362efaeb3b4870bdfd8bf7ee7b51a3c6939a4462e96a0c77720d968fc1f29cafd1091183c4f231585e88181f2306ce35a4f46ad4f0be184f7a2d06a9594831384838d1736838d16bdefd9d6679d9781ad44ba2ef565abc1922b884c37c74cf9728f1978b36288708ee9e119d73f8b7c8276726cf9a2454c3cf10b88f0c19621438bac36b72074ed230c1955f7c4b81ca2d832c9d504285fce2db13f5f0e259deb706f4bff8215efcd7ff551a79a30e6971c069e2e127ce31622c71c3a6f2361e09eecb62349e831289441d0715a3998f3c83f4f3338e8894651c1b34cff02c4af4a49fa257f98f44123dc901a21782a4d25990e47d9f6d4c514545f43e1b3fe3351b9d45c5ea153526fa199fb32dc70ccf85db62db26f26c8d652e1dac7cf4c9064fa4f2f264838884392cce10c99041fa0881060d933c89fe868e3a4934a500fd97e52c4b528d1a356afcc75141e6b4320fff71c01f723c0f9ec726696edf5b0e92e8b7173da9a33e123de953bcf4491f89489ff2dcf6a44efa00bd0dcf39e2e224bd26e9059c0d9e0806f43f40efe215f03d3a59f40ec03eda5ee4713eda3c8e10383fc2e27d46f8b603f42e409d3cb5745d9615d0a1e492131272c9c98527f2b7e1e52907cbbb7819ddf6dd09c1838c17fdd6c910fd8bbf10752e7c347778b98570bcff0e1d48ac214b24371e982da037c0b1f9fd56ac207fd9aad3666ce8b2d8248d33bbc9d9108ec69b5c7c0d1c6cf817f71baec6f6d3e59663a33d70c8221cb2102f5ef45f0f1cb210fd2fbe460f80005e869adc79967e61a3ebf7ae071b6fe35bba0f486ef9462b21d7de599ec6833a193f716008b939a0f32c0160c9fe59ccbfeb3a8a250d7f05c85802d49d8dd75e8814d0dddd2fbebb2540a21738e0901de3f6e681c5037532453696d73edd47f3e7b3c9f8cfe62d01faafe55f7c0d1cf28bafe12f3a996d803a3f7dba01c45a3a99650ce03b2edeb71c221b3cd156a3136d8f43d48fe3fb5d74a09f716b54667803e8dc4649f627709f05639ae378652de0becce58519971b9fc3770b4cb58ae4f209e88ae4f000e83e1f12e3e308f938473e8e92ccb94213f2694ab42b7a78939cc36b2e1d8ebfd1c9dcc39be4e864ee9e4684e8d1c39be41c5c3afb37bafa72fbe1860779a218d0bb78179e0f170ff244ed3da04fa097271b72e884c86236741cd424cd77d181ba2c16e4633c0b9324b6a72f84fff6d66574fe2fba1e64c8f819dd0724cff86984f397f1dad68918e04fdf3f9f6ddbbcafbb7bf19f7ef726d9fff31aed7cbaedc58bae5f6efecdf8eded7bf7f5f026797bfbe25f7ceb6496d13358dc9362d46071568ce30481134202fd1fdbb619ffe2deeaeeadb7de7a63a1327552980fdcfd65151ca535131fb975f7ae4777eb56babbbb7bdff8c8272abbc7bc9ba8418d1ff1e6b2cbf9edeeeed667bb5394a39ad29e32f37d622c5fdc5b85044dc280b1048e008c6a6b953824a9b47209f7f91bf1987852cebf389eb272589cd474a635020377048f266640051e60d068f6fd2c5d6ffddb0346764f545f9e7a38a9ffc5eb7b3c62dc0e4e869d2a79481a3d0132e4eeafde15b87799a61da369d2d15b40810c6197665700337d2d8503f97b6f7695364fadb76d6359f91767616921f24613a4294b4912fd9e22d3cf40204d309909326541a6f423e072c90e98d70e981dacecbbd659ef9d73ce39e7bc993711376759b37a254515e2a5ea5d80d534cfb9f190653fe77c510ff5fdabd763e66c85010c98f63bdb131e3db608f8880241e9e823dad24c5a49c3fad536ad848306eecb529e77ef6b994fb5fff095b7d697529375ce2e5365a92c9565aa5aff7a592a9ba99997cd78baaf47cb129dfaf4678f963c61e4ebf5923e5ae95a8893e87d7f4f6ffd69ae7bb0681a4d7ddd3cb75f5ad7b9f66bae84645ae6c9b62c95d5cfb22c354d6de324fa9dcdfb32558ac7fbb255a6fdca522b9d3c6d7356af5f46d4cf881a81ed73e03cfea320940011c4105ea21c4e9ab2d0e7506ec99387f69f1c7b68dabb47abf7bfce9e4894bde887cee38740c7cb3cd10f9de73c043a5e8f960792e7d75a3b4df386e87888b3abdd0744ae36bcaf48499abfd275ba9eb33bf97eddeaa5be77e381fbeb61d9ce310357f110b866e2256a2349329f88d44892cc3ebf8afdb269efa6d8af7e89bda22bbfbac19392e42b1ce779e8ca4730d374c4e4e1a594c74ee58d8cd5c8d7d6c99cd292cdc478c99f6e592a9b41f9cf672a2f65ff8d8e04c0c57f3172574376149a1bb227691bde383a4482a44157deb74f79adfb86c8fedad665aa942e4bfd80db7e66d3be8fb83892e98bba96821cd1afa16b297a7405c9a46f90106af1f43b89cad3ef30549b46e56727a15f8dc91ec64b73a5c39234045781ac790f386b5ad6be08aad27d1d45a6dfa2fb402cba6f256f28d98c97529e7ea6a2334587ecfcec300085022d5943f13a3ea2b457315e6a560dea88980f1fb9e735ea8858a67f44a33c1ecfb7f4bc07d4e9f012f7f435e7fec47bf1910eaca4e6fa94abb97646d47c3d05348dee7caf27badf00cf67ef39e57bcbc1f9881ae13a5aa7e3bca773e1a39011ce07901327c7f5603854091228607677cf8d87ce9ea71b0f354f2d076e7a266cbabbc7f359100f575fa688a7afc874bee7c88c99777efe4d56be2fbec34beeed88f111f576c4f888be7f01eff076f8883e4c86f1d2e6f530d38ae974fd9a24fad90cfd2ce5259909c9943aa5afd14d017ec44723fae2d73325240dfa810c06d90ab21264292470f4bf2c95e9c3b48d0543124bb2302ab959f235934e7635734e0e49743a1d18a6d04b49db051c0c92264a8ee0d1a39b880f3031fd3c7af4f7ca4b43fa8de86e2c5fa11454f8d0efbe44ea4fa10f75314eead776f0921057f3fc8e902ca13c7e17b2047afc2c240e205432fe13594a79fc1c5962f1f8a72cb578fc1e892388932b7134916c019246ffe73874b40d23aaed84b8ff792deb76c0f8a833205a0556017981fe21651610447f13e97cbf8eedfba43bcf5daf1db3c37dee5f78bcd0fcb793d9c3751f90fcf1ecbf4c4f27f3367e120c9f2c43d640ee1d1936a25ea066ebede0a36e9a971d70f0517f2d2c5e7a1e3d22b9f942cb51c539365587cffda5bf75e1fc4e9f3e7d4a2be595b552ef0526c9d4f18289f1920ca5923c9194a008f90b3961c54dfe7006834b6bed477eacfd5869ada5d33221b98f071cc1111cc17152d73a9bdd3a9ad369e9b44cd88da375f0951bbe9c6ccb381b279bf8dacb61620811e78cf8114fa25aad5630316ee96a0582e09015112347522ad60ab682c1600d7bcc851cc5a3c70cb58e38176ab940100441188842a15028141ac2927ccc855ea552a9708f197a954b15aa5e5ce8552a958a26894a54a9542a954aa562a9542ab14eea9af4b1477004477004c74ebd928c1404416f31c9a8a445ef711cc73136d6983c9c91de301a95cb8787539582b158ac59030b592c168b05637d08c6b281281f73a8170d0ae58343c5c016ca45148c43a150a856f842d9a05a28140a8542a1504e33d2386a7414cd089a21899b1af61d6bc562b1d81046701d8351eb491c73b1582c06b25a3420088260c7c0162b168bc53a06821d73b06360c73a06b266f0922fa65c20cdbb4260e658461c3143297923fa2b25c25260986b52e2e84af5984af9aac7d498ead14eea1abe361c94176359122819e884fbe01b8e3edc09e8260682a730ccf005410b8237a10886acceb8a072d724358b141450a53eb58e2b051b5f7ed382fb4ec2e37d3e09a9b1484101617a7d6a9dcd456db84fe72e548ac663a24d4a375f2cba59e3375ce7307f75b43999cc2563e794aeb3cc559eb84e9e348e6b9ae4c946096c0c5b2e57cbd56abd5c2d9503c1168b019ca61eafcf4a5d34e16bd56ab5c6981dd32d8db5e48b035b2ecc857e358e2d222d56abd56ad18cad91a60596e184fb78eee6b35221a18b8dea8f848c7044f090ccc97c56ea03cb8509f57eebfd8e592c969070082692dbc5c5158bc562b14256c862b158218b15862c58086385ac8f0deca4ae75367c6d523ebf5bb156a8f500f919f7f1e079a96b9dcd06b73e446d5cdc3a9ad3d99a26f758abd5a236de72d1e0db6ad9d6abf57ab5f0ccc46004f4927ccc85602931954aa5800862ca2629295637923a92a4c626954aa5c05408a752a9d4e564a954c384d886a5520d13c209f7f16c93bad6493264aec0111cc1111c4fb88f67d33aa27cf90086df6ce57e161ec2d19c4e10044190238a49b08604d009f7f174b63048e6388b25b24496c8126b74bc4c5210556a92ac902d9b17ab45040a14d009f7992b219c16112f794027dc87fa4c625f9e8eb6b6ce743a3bcf4e6d0c5040275cfd74360f6b08e73514d009f7f1cee6a1618d166b7283d24d2643723ff56c9de99ffe74284df8f2180cf113eee3d9a62472c27d3cb86b6c8610f17cb893ce088ee0088e609ef642a149cd5acd6a2edd5ab79d670fef17e44e2051c98d8795a4319b8a865d55f7f7cb75e4de976d91de719ca4af62a52d502cb52e90d2d0235ec21e4d627b9c0f3a4ace3aed543be9044d8cfec075e2ba81c9523ad75bdc24dcf08e23936b853459d774d950d29e419e90349020692441d2a87112ce9d2e70df1df14ade50812cb9e8a3d834d1f9f766ccf7c34266684308661084853a7dd6e59a268bb93a9f90382807f2fc59e325e904120ee4f9cd175e452104ab4076b8e03a32577da7ca355553355573a50aa25279a9065985dc9f05a509f235cd8d97be195e265e6a32431a499aa60625693e8d4a158225c85fd33c610bf96b709ae80f24693e12fc848b5a171d29ed64fdb0b20400121a908ac40562290642a071b6fd74b25dbbcb409330be7bc3849befdc68bec8621fd111ce92e609f3dd45def0dcdd5050efc3b25d727b7e6f1c48cfd944c685f286ccb39b90e79c55e4f94ea9e03e3483e0e125fb13f55a73bee528c2fe7d4d043457c85a3bac35ec9a98979a04b0b659e248bf7aec9bbea297e4f9b56d47360e6d7abba766def739081fcdf9b8a356e0e8103e9a937af3deef217c349fb33294a10c43c9d54abd237c3469c88597de4bf4e707234ffa94524a3b0c33ce0e3449002b7fd62632a5e0767c720a7717f5208164b9e52882be0c3311f71d93e458e5231d3ee0d5ac9d8e9574e9d2bd950a07f191abb0ca4b41f04a5229615c953b5825a5942e62969d0190fe986fcf4791cc8be9979e0f1f4092a071a2ece54f9328f3440fb8b75f7a3fe4b7fcf644d98ffeeb89b29f93a35e6899261849f277c94e2369bc4693303e8f2adbd7e47fb408942fa293a12faf0ae425c155e26a40a4ff5db0d694d7507a855998c3299ebdc916c51b6292ec8bea672f4f96c3c9bc1f5986c2f14428f254b30e772823ea05ee6d08aaa3cb24712e434c53f617a784dec5255b946d95156399bb7bd671f7293899c7ec9f741e763e768e47a35128643d0f7a94566d5d56b63775557795add6f1aae6859eaee86ad5ba2db056d0a37874b42090074447104a6dd11bedc6e94899f8c8d29132a1378e82f21205e45510545b2010080402e50061cc714c38394993b5c178ecc6be56dddddfb6acb55f6f458852b4ef8d08508e22b40779a2940f1dc6bd7d7fb99d2c15fbde0aad38d53727cadd3b9d47e9603aa1e788d3346f6219456ea2140f06e38b71f562383e42de84d93fe98ad49f20e638cf5a8c27772dd059b3a2bce1b68a6cad173e4b866ced14301c507dd05bfb281dcad7719a50bc711cc7711cc569aaaddab2a215ad6845719ae40936ded8182adfd455a5fc8bb7a6499e402b4e92ad0ff272e08ed857ade13f8fa7d617c2f320ebf2917dfbdade5a94d7b6cebe7c641fa5b3a18fec833a5be3231bd67f711b7a09e52de8eddb178ae7c2814020cfd2f8c87e0e9c7565cbc44b61bdf1527ddb24dbfab5d62d47b5e334d5515a719a6c2849f64336ccf66b6b9a28c61c170afd8f462d2db595ed6b58e55b3cde40df9d55e223fbd3c2b2b550481ad68a9286ada3b5a2e8a57e5b7ffbde8848f9ede54644f52cd039e53d5f5333c4e256d95655b6d9c7a6a9f33674bb221090a7fba00ee67a32329fcf5ea6733b79c2f8e372fd42b9d6d7eebdf7af15395d11cf6bb543bb567133596e39523c118c8a27aacfa99ee8015956dfc7e7b3af5e0c7ece733c1f9dc70fe474593eba427c649ff6cc381e2adbff01bf8d4d92b562b6cfea9c004694f25794e2891ec0f9fb319cbf9c67e1c570dc24a53cf7404e9c4f39a17437833a47e5ee24e763ee733c1f4558bc0ffa37e55978319ce73c1ff3533c1ac447f65f1cecb944965b0ed103389f793f8ac4cccffe077dceff981895b593b716dbcce360dce1b84f2874f2cf8d46b8a5c51bb33d8dd3244f37d9c6b2a5e124d9efd807b37d19ea22d9b74f579364ffc5ad386fa6c95bf3354df72de76dea95ad081bada529cd5bd3d431fb725a6b5f7399ed7b6a922c27078c8c8cfdcc93e9d824d9e7783d4e92fdacbb8191c11eacc549b26e5fceb7138823d18d4d41e81899bfcef2fb7590df2edd13427e8ccf497ffe7c39f1c4134f3c7774301e03b3a35f5a5ebe0e29a59452ba4ff7d7410230542bccac6528066eddca1cec8073ecc9c75fe0fc3f9a9de20e63ccc1e4c04dcfb10b9efe8dbd54af8771e5382b92e4c0595854d230b1639ef2525fe133b95bcc415a6c25ed838f1a076e9b8f3b1f1a06460601f2bd91ef7bfdf76d90a5d0dfefe40d167fbf852cf9f0510391a3fe6f25dfff481c2d7392ef836449a5d4e2ef535942f9fb58e2e8d4e5e4fb2d71f44cdbf866be7fbdaf874c92b39f303ab2c0853eec00224bcd03e9c34b0dfaa81b47bbda46378e3ed2361a47d3b48d7e5c83b7e259993c0449a3ffc4fb3ce706bdd4497cd43c90a576428e5c8da36bda46af0c21e548e3e8174de3689bb6a18a82a4d13f43b9bf504cd2e8b73960e14949e3eb7cbffb4864216e6d2764a9a3e89ac6216527f1d24a8dab741e0239ea6fd179073a0d2fcff77714dae6f3cdc27312c8517f7b3ec5fb5c6a9f67cdbe0580e4fbffd58cf2daeda4fc8b9758b0f0becedf7d104ac74e52402d47a07f0165c06e3ddc9620efe5c4fb80646bff65729dcc9f9873e0f30ff809c422da072f514026d10193f5954be0971b1232c9a9080564927e19ea98a320d140eef458d1deddddddfd211752ba7b64b763eaa5979973cee9dee2f21cb595d63a2ba53bf8887ad893b3a6a04f92468656dab44852bf48d2fb89e783c994d371125f5bb94c3d2286c8b4e9084e623e6be56bc79c734ad9ed8089f1d17c010113b343564a43f9fafce9eba84f5b07ebe9e023175add71d4ff5c9a7a2e3e9a3ab8576fca397578a9947a08e78b05077da572224ec44b9fab3e3cc44bb209fefd1c02f779ca53330e128152da747ef56028bdf756fa3bbc74bd1d3015c64bb6beadb5c547f48ee8efd0e13af8885e6fbad0f94269893a0e5b446769abe7e2a3171d6ec97a94ba641f2e3a7849a3012e1cbe6648c2041ad424d1849809b4509ba3855cb1c7e170a146134d10f2c4757500b040a4880db6600625a2aca28a3164e1892a04e9401160e3edfaf29361e6bae005af915a3f9f1666713c3c84c3f13e5c394de3c06de2e582d73dc2f6e9506bc5de7579986b82095410c035e279ec796ecc9e4ff1d2cd1ecf8f3c9e77a13a795e0833b29427cec3c3092be0c19227aa5821613c7d9f85fc8db0054b7041678177c16b64db9e8b226fdbc3f052fded47db875c6cbf832724218510044aa410cef060a4e23ab9702d19a689eca60adc2c3ce446871f488246be9733998c1c0fb73ccc0a9598020696986b42ee7c8a97b6dcf99097ec77de45e7479d6fe9e44e1522c89ddfc14b27b9d3f91d9dd7e125ce77de87ce63410a24597841922c5081641cd2c4888591a9c6cd89c3b9420a47be572842be170b4ae41be65096d2544474ff76ef307cc44958769926fb610286251c48c29225dc38406b0a695855a108b12658d088e45a6bad5503a0bc31733f1531a0a20c1987996c610a264a48a6b0c20856d841122b8881c50720b879cd1821891324e10a9c7bb79024df7befc557d2f44b41855ca560a456e1074e8081200ab029728dc2e8de7b51eefdc24cbef7de7bef5582865c9f52a108b91e410a25727d171b136ca0022ddc200a2bf8c0124d0baa28c640a384897c9de04e80b8901085325841252ea185d3f7b9561c649af3e10daca0596bad67633e92376ae670a2d881114e3a2a140aa58417b45092998a56bc8062e600503c413305250220a780031c53a8a289286e90c38f163400857c6df05096905cdfc57eadb5d67aefbd571c824a14508c4b40030fae30aaac10921be83e75960216f215af0d57877c592814ea03f75ac1837c6ffd7befbd1773271b560d9b25642dd70fb9781b28727d18a315e4fa2c5e4240aedf020531d7c7c1a505b9be0e5e9246c8350a56c81549ae48a420835cdf872a5f1a17543620c0b12555d41851420f6c5653685638e109354040be8fb390ef77bc04839335493cc18a33840036240612963f0e87fc2e5b60e24d38e7028787b8899e9a3e4104a2988d7d3857aec4c91f0ea9d3a743ae2f658b9724122f3061efd787f1be1e52ccf5ed8d8f6cac0c5cfdcfded8269e8d39810c2cec8d97b0679b685848422a072790a2084ca4e054853c25921190204f4e9eefa9190fb24ae234bfc569c40504ab073a806203349002144e534a91a77ce2092af2b43737313b8038c9f38770953c3ee6b74c0ac806c20082320ca107426e3086d3a4422a4f9ce7ea755713f7c318b54c930580708312c02045440c2938bd8879660b9b4d1049421976c0042e0461c1694691e77331c8f353bcd4c933043ac8b53eee4491eba7d40fd520d79a5c9188200c2e729512870c17ce3366b142a0eab2a6d131701f66812f626a92645d812c578b060c5d93245f449a4992f9c3e2cd34619677337384cc69227338d864430a4da04e5f7d0e0b9bb430dcd09c38988a8c9f622c650904cbd94b9a2f66dd1508702003b7bce42d1fb17c888f1a7b7848eb0685ca5ff570cb47fdd7c32cdcf2126c9a2e0822f90017b27dea251cb27d89f32ba4716560d6eacf56992a4b65a8d8cd98fb61e22ba4e9e6a1c1be467cd4b8e5eaaf7ad7e5a3ee8b59e034f5a9ffba664d3b2b533170dfbd01963ba809a406241ac88644039997dae0099fda9cf4a99ba0d64e4a12761fc1879527bddf034c28099526be441fcd6f7c334d9c9f3d6a7f936a2ab69727cea6fd0fce6fff83a6fde6fdf8b13da7bb471afa508876cbba3eaff23fb4788ff7c3f32d5ec5fb5124c6d33f54fee3c99353588b4b4b06bd755dd5a0b7a82b54030e062ac024b85807d94543064e032125b2bbdef323eab9fc5d5f8be89a2da3d17f28a4f2aabb5ceef2c0bc5eaf95170c86c5e25f5c5be9e86b92e6b3e85a74549c241a17ea724dd554a942d4753f2f16776c69714749732b0b4f651c3bdd0d611886355495169ddbbae06d5df0a6aeeabbf7a67067af0adfabf2516a2695ba335785f19683d2dadd8d31c7c18427342fd179eaa93f752a6b92e80de7de47635905f42fdea1638b86e55a81b3a6664559d78b0851eda72efa9aa695ffb8288ce51f5a71aa0a561465426f682cafacac78323235bce7656ef8cf4a27eb0b9f70d553f1bccac7785ea5060f15f379cf7b3c1f3778f5063549f3819c965079165d11ffabf2159c268fc70b3d985b58d5c7aa3caaae87b0e16381cefd73ae30abc8ad4ee4e4fd6b8be68741acba81955b1cf5bcf0ee78c3ca18b67851c7e26be856bed56ab53cf7e6c6306aebd4a002f37c579edfaae95f3d6ff9e886b78603fdc771dee2bede9003711ce77da03f790dd439e82d1f11f1d6c957d0c909be2fbfe30d1bbb3f98311ec29fb3e57096eab6a6e9a652ad542bd5922982bb2ba20822261a50f97e1144dc2b50a85c97c89e76b723020914113e5028228e40a150b937e081ed3bdf5bfdee2e131fcd5bc51d43ca85ba15e1cf3df77223c23d11dd3a7f53d374c731f5e98a4040c27c3c1919cfb77899956771bae334dd300cb970ebb4f8ed635afce6f928e2efc3e3fd2812a3f29fff117a2f86c577bee3f958f17ea8fce7596c9ddf3ea6f35bc813f97b9ef39daf5eccf62b9e0f154fe49ee8019cf7fc0fdaff763bdf709a6af889b9ac12e6f937354d357876058643de98e77b21142adf0ea332ee64134bd042a69d565f75cc15e669d137b4e3e9236345cf869d75dd7c3af5669ab60f8538ee4557d334c7d94281b8e3d33b5b18dd61e325d205d047b3b3556dd6041f4e71366f86a16aaa28134edbfef33f78bee3fde8bce73fde8f22319df778a21f9fdfbcede56956aceae46c1a10e68e37dc8de743bff2171529a7a3379334ad6b9a6e6a92e6a7529aa7ebd34dcd7953a93c3d1eed7a21cf4b863cb106f2c44ae48957f515ba3c629ebfc1fc26cfd7e8f8d1589e8fc5c07d77142b78c3fa7a79e973796377bcaf1b4e93863f9ca6a9ea19ced0cef0626b02abb2533555d7bb2d6b2fe8a5be2d7bc10bded625725bb775895c10851b5d14e909c8a3709106bf754d894d2047f3b9d752405f534cc07953455d28a07ae2fd0ac3d72bac09c39a57cac91d29c766afa14c134c55df9b5983b312ce3b8124655d34db933b4e139d20eeed73b2eef689875733531787a90bcff0e5a5fa0ac3d72bac09c39a57ca89679f4ea713f57b5e9eb68ef39dff417b8ff7637bed3bde8f22319b77633f5027aa84a33179f2cc9b396ede14b76e8a1f6f86af0ee73579aa59874f9ea2b90b39ebb293dc7210d19906a32da8a48cd94a72d4a1a111000000e3150000280c0a0704a2f170202699b2f40114800c708e667258a348b3248c5110c40c42c40002000100008cc0cc000d750060c0ffb4c45bbebdf79ea92503e5deeaf9c94a24ef39b0ffa0a30241d9d16b943ebaebc2dd238601ba62bc6e28f1ff9a3e7c1822be6056b02b471d9fa3e317a0e849ac58ef8e5004a6cc5df337eed1cafb781b3534920f33847c6bc0b4e3f33dd415c1693225ade8fae9d83e3da16ad6de45a79a43a21199e9c51731d68623a969074ef22acc7e923c8d85966207ec5029d4dafd20b6d077b3eb45afacd258bafe0c24553a733f4751d204d2f505b116bcd51997385731b7409b3d9706e071af2a863265f0365cb5dd93609d3aca584aaa2f6b2c46ded9aeb9e84b8e0dc06928e8f217b250e67512107df5982a62a0510c6066c2609122700684ed2e72668b809ea78ea9f7a97a2e42f9fbf7f608f4579e3d187fe236bfe99a19c243788d05085752042a20e4ae3843b5ba0030f02b2ed52b2613060e3a875f8be0bc5e3c7b3f8436c05e7fd8c8a8d1ab5aae8c12482fd15827026ad2291b9b3155d8832b708152c75d2a09efe5c2eeb0a3afdff580bc9d44b74a3f73bb4f3a23b9b8de2786d945305d55cb02aa9f4b53ee906d54e9063e33a5aebc4c8d1282eb78bd446ce65d3783194e6e26dc30c53c8192db1ffc73bc4bcd515c933e03682d78c466080b1a4c22ef072600dfbbe8bc38f6076857a46d733234e10eb9aad132d2d45494ad305de79cdebca09dacf515e86b30f5eccc2be3a7b7bb73d311103c9e03a0a734b116fb122cb7ff8317b9e62be1c0a2ec4809d03ad935672289097e09f869fec8366e5b4000bf649184e31a52922a24afa9a7c925fe380cb376704e2e792b2ad437d7a40da394556c991c81095c49b181c3e0f2a48f023d675abffd427b96e64d30c12c8c8f3cc0be24071702f465c861bb17ff297598b4698c1a1421b1ec880e53245295514dba77eb833e022ba351e12f174491bec8fd4de20fc3ae68b36f09f175c12c697f15e017cfcc79182db7376e7a703c07ed0b837a8c48159e24bc712f0cbb6c5d1c20fc6dd8283963d489c64f181d65642e430b3a704c22eed2858dce7917ba1001c0de69f51c7534e2b8d13054935c320a1dbba07fda8347c397bc761d9e9c2cc92ab882218e457d3125822a375041ba409940dd2e989b5df9bfee91ec37963a582fb6e4867f2aedc1f5805e7c68a7bfd047f092628b22225246ec79c20e52bbd8583f5e835b089352b8e7967996a4c0700c2f9997b382eff5ec23df1ae183acd50603b860b090fad307c2a8a84615358c0620c74377cea6dd118749a65fd9d529590f80605c23358f4bd0f7a288c2e6615f7ce1bad2cc433fdc6d56bef35dfd38fd5d1094a932b38743568e4a3ddf338e0e368da5397749501e2653fb9b376116a0fb06c52863648864cf2bfcf5a82ed67221d7a872d228cf5eb2919ced4f6b24a29ab93264a93fb0856fc21f4e984573e03588837ceb81039d3caf5b1a484f774c1cb1784f0c18708cb0cf387b905f8f2319e02487b54947125fb288fd9845db921953358e08d09fe78cf473895f32299f8bb7c090cf36e9416a6165c9e188c74984a22c98277ae1aec3c1fd4f6709fc7ff69ee5de519f54d70e38d5ad574ed792837a320edc1242bddb3374a911681d13397e55d52debc2aed9247eeef6d2b7702f9d7e6d300349cfe064362c2c90b66b5fe13b7a9463d81f2bbb5354643df284b1f5297769746197885685b9bb89b780311aad6577f5bf4c7a77d8922fa20e08a5192c429b26b3e5649ab8ce4fc40b63d7b15ad24e91983c9835795927a84aea1608f87609b417cd3f01143a23909ae97bf413ab8b98c5d4e1837dda4b40b37409055046aa740d7ebfc5a84f45875846d6bd209fef23a12e298be27ab29a51408af431ae65541348ae430122456aa680901073f7988c8f13096811fb1b80e519f4d9ead98344f402d7f7a384aae406858e6c3039ee3dec6f51cecb955bd9ca7ef0e6862ca1a149a960c2eb44821f453883ebc11fb0cbba4afa13a30f43cb9b86af9db1aaf839684a2de5b7adff63d0a9d8744ff942bf574b69ae849432468ec38f3cfa8ad0accf60dbe2fe517c1bb23e477e4fc9c31070f47d10ba2d563abee86f12bf2f3414c6fa42c6d8278008d35ef1cffcf3797547202c07e4a434532a00282701099263460358e847f019234205ea648cbc5308c1d6f88d810757816e8a4bb09b133703db4d992b501103a51eca9a0a2e03dbaf7a606185c01b8d4ba0bcfd396a75472e62eb7b2034ad05dd50dc82d1b9468c5ce7af1c68e25f1cb9d5e10b0cd84a37f9ba43a460021f4f3bbca309bb53328897b2b02f7740406bc522732425a6ba2cb4008d6e2a902f49c7eee96113e82052ae6b17e2728353123dc0f54a1ec64b72ae5f64fa9e49fa088ad2651e46819b4b8afd5c3fc758560d205b7d18a63a0fd57600b45e143b3164263e3578c67ab5f391b16d49974d81608493a91cac2c1e4f40c71a7bb47fcb69675a3ba4b27cdb593746f63e2d1f06974f9694bf4f52999cabf3296e0f4db99755ff1d59272fb079cd6839272bf7094088ecf3122c17ecb0946c1a3adecd6fc02b8b41ba010e89c5056a44b7681481cdb237d401d5b0f4f503e4b963f01028b74dac8d1272c5831df5b3acfe857d2c956e5a5853dde5b17a3b9835280f4303cc7f6540cf9740b5ced3e77100fed34ff788046d456bee4a02ea1f4cb253d0c79c6f552a6cb3e4ae39df09bfbb5b06230bc47830bdca14441d2d8d481efd55768dd838ff5e663fe15539df7ce6bb2cb3f70000431e60969522073e556e821cb194c115a9bf3f128266837dab424661e88281e82f25486d96d9fd8e35f81912f4b2efdf36fc9d98208bb4b7b26c5bc1ec0144aef059a1cdd60bdf9df29c00d778ef55321e9ff6d7e9c8824c6542b406e4a6fd1fd385152ba11e5d1f8322b1441d38199a56f02769d64afa215427c548609a68e68743a219f173782eaa3101a1df3f67022a6d3bd005f8e6476016a419bce9d6e077d891b0cf528ba8ca1d1cdb6f957c39f735cbcb38e470a6977dec50a6bb0f3bbecccb93e2a6bd9c9440ba87db5cd75d6c3d0f09018e7db034bb616db0c6cb30d058c4374e7b0790397666be4eae2ea2202dc6778a92ed8b6c1fba8ea51651e50d73b613e5ff58e240520e87d7219a9c2d91f80e8677702e09d0b943083e047ebcbac1eeedb16011e1a4d51d5d93baacabf7023250660dd710895a0442122f4d9b471f64a2cd9c3977c13ffaf352fd68dcf6dc1011c1a7fdf5aed98c8d84ce3a2d44dca49884a6778a8a380971e5aec5700d27af756b30904164b5967a0e5e43b4d411bb35c5fb2356c24bbcf8189b4c4c413709ed874c8b163f6aec554de510be02d27c3a08cf85903526bd3f0160975afb58666bdd8932b2ac54b4ce57b044b450a260c2937be346ee1c73ec94d2886eed3005b6b99b42fcf4f3c850811fe7f62a240f4c9b69a1f82eb342686e09b3c80a88c80c3b100bdd722293e982b904f71dd8aa2b2bdc08566bb108b9967f00eb7411fe49f64e13830f6ddbc69483f0103b3352e2d13d88f38cf976f2fcde6e4e1371c8780a8f1a4ec5cf0b17485ec34f1c203cd88adee362e5214586ded332e6d25ec4818a98d0cd3eba52834ab596cf864bb7088738428f0950c7a85cb95bc79cb8562acca80fec01bc1714f6079dfde726accb8bb29b5293d9a768c2096c88644045687c1e1312b18a20ed21cec73a8224269cb92a742ce8cd8def24b9526dd898f8898453b38f04f6c5a645ebcdad3af18374d41cc9426001adc1c45d327d53153a1553fe299eff59c11cf13489d4f7d0c02366e57d482e787900be6a994f096771cc2c56a10947186246c8776b9bff16117e2460f4232de2ee4b40d85f96aba0b74e35cac3d12bdbc398933a16ed1cf5d963d373c3dfb1031cd9a4d6cd798b3f5b5c9170de8c841a689713c7bf199c692fea2f31c13500bf776ac21a3a569161af06fdbe63285eba2188106b6b432676a7cdea09f7ae1c8caf6bd90e533b7c24078edc8eac99010c8c0225fb05f4c4b421cecf6ad60894ec4a9ec854348b338b62205772c5954e91f4d037ae2b4a886ed5292590c96feb473fed27af048c4091e96e750ce78874af12287d5738b0a6a0d776d04aa0b4c601730994c0193943538b21becdd1acc22a1b2e6aca8571632e80295ccba77483da2940c32e3ec66d31c4cdb99ea8d8888661bfad947e4db447be453055514fb078ccf600860bc936f7e3e1fd11a3224baee0ce8652a18ff0b2eb5a8a8d84d924cd0c583e80cfa25f0de1b86f642bfcba7a86c4421ff8949997e864da4806122bbf008b819a08e39de67bedbb3c3724ed827b11f5987b1b68f970dd79757d8a0d842e8b6fa4fbf4568867d0886e5e66501bf2f0119153ae027657827656aea0bc8d7d0081c21cf240603db86ebd013a518cc454836ee7d2c1433ef983905bb7bbe39a7392cf16cc4a0e14c945272d71262ea0298705f2341528d9760e7639e3592eeb1c5d3c37e8ec328f5663c74b749c84afa36ad8a8472618a4fd7e21615255db9f08936b153c6d4f1cdf37026522c17d98680e371db4cffd054bd017bd7675f4c71a659a03e413eb21312b6df127b987f352e9aa7b82069cc1d7010ea4f4d1b87b93b2782e452156ea4dedda458c5e896c3521b89d388e4234e45dd05aab78b5229f9567965a72ad086da3bd4e1eb33af2016a27c38cc6acf5a0e04a3c3801531a5d03c95aa8606fbb78044854fca386bccecfdc7a61237c564fc4700dde8243df12474d2d7242f6eec78a88d3dabbb86dee9d8ac5d82448fc31d25eeb9fcb216f695cfe4af72f416621897e3a4fe9131e853606ada67ad5a85371018899a8c122cb47789a45a6714a6f89753292a1d966150054416723d070501f7052dd14ff5859126ed63cf991d07ff3595aab6a0dd49da0d0992dd9579dc921544712e629d7b2440671a1951458e0846ec9e7f99f1bc522108b3ca1001626ea9522103210d13fcc70ef222c45d097953b2ebc704da2db0ee119110ac39c93df33d3355be354479369f976f2d62d194ccec974f5953a79a0fb2b819c818eea323b008c12e7744e4eef45fffd0a03b0ac3117f8f7064a8656a9668d9bea7560dd23c63c7350aa132255f5d5fd23f2dd1932d128acb7a7221c813995b285a56af1c725a8497fe8d6a8f5f4e3e40980f11fbf7c9235ac486ea3db3d4579847451f1aca459aebad605c45906d26dacf8a42b33a35334a1899a82086386881eac21626413a58b025219c45ad577858ed9f91090d2356841011e2644dc9ade588d3bb992036ea27b3d5b443f64e65f15c253b65052164ef17c1974622be920ebc63854870a1a1c1fdc6ba069988bc05634b5ffd68e2e83decf25eb87a98f62cba5722b2e7d23a585c4f91e9994b80ed1f059254ac8561cfe38d8f191d65250e4b6d74b4264ac1e3d2c0c5ef3b288ed781f5360ed7fe977149bb6e0206a176ea0127aff657d99661b30a3331d54d40c7cdb593b78d9a0f75db43feac9b8522cb7fed91c7bf2d5fd113f289b88a35dd4a91a7da661cbddbddde701c541ee0c667ba515923375f38b7a01c9cf131689b5c3b8b3d15592f632bc28c2dc8e4a60a379376f26cf4802b1b311c6e566b77229839b460e206a65392cfa1e6e9ff576dcf2d6c4305090346eaf2d1d7f2c58f7b2393d4b4031d427008f337ed97591379adc077cad7ba700656c9d8cd30d47891f902b08346e2ef7075520445efec1a7e0f00e20138b0acaf512c25995754f0cb38a0c88c8a7738e447bebeedc82b2f519900b8a35c4a48438a64b45f4622f95a205a81ff58ef7396a8a3f5aa8eee524bd2b1e9f94d72ce0554e659dcc76fbff56c6fa14b6190dca458e4c05134349ef31ceb16db18e3fd54aea0948161b0a59d17629dad7f85f127c3627ec2b64007756e89fdc6bdbcb1572a759356d595246c0e24d4b538efd2cda55a5bace0df4393a36ace12e6e66dd3b155cd503ac490be46d671f235276a67b1d7f3807ddc34c98b579d588c54dd915efe04053bea8032caa29277c9a0fe695f05ce51fa3bcdaba138c52c371285ec6baaf4d49a1b0b244f7fbedbf8ac8e4cb2216658c99ffc20da9246f145d91e15c9b2813cbdbebd1cc8c28375a64c416b5e4e6f350fe7c5cdcee6689c9f642806326ed233f3eed976285fec1bdce7ede91e234194f6a05ba380b9930a6d4b64b47b5a42d719ec40c8a53b06e35141e0e4f6934dfc5952cfe132953f47f2218be596f502768a3c7df9822cb2825a397c59bc4d1c9de1ec43c261143715d12e66860f093698407031040ee293dd2319255f51b130c2d0ee2b2768e71f38d01804ee38b719944978192f514132e6fdfd98b90eb89663efd75a356a3d234d6d79e03cfbae05c45239e19713080600d7b7b741a6cede83302a8246835d49d43d1772bdc914b5f193f0f562ed8c0683077790faa8380dc3dd5f88942d12b43b1006ebf35e7f5c1a370e5505dc5c36b462f602ce6b5c98dbdc82234d5652bfafd63c3ce35e4134fc7494913cc805a43220f40e55b7aa9e25f8c838e4505ee12c6826681a705e6aaa11842f57a431318d5b194f5623d92da4be74a44cd926fc0bbbaaa3cedb455afb64f16219e8c1a66bd261b533f8cee8ff905e9ba89da48e814dd577dd24fbba3ecf6e13d763c1a7d5da6e297dae17b77a28c5431b7bfb775c5afbb2333ec7014283f294ed1d590a6a119b1be6f9b742587a0d76614f27bde90ae88a715eab3c2b4469b3875ea8a51e012c3fa91691cf43c7c5431eaa712bf550b2e21980d3aedad38b89f2f896dbe077fd08f7aeab3f418599dbac32a21490e5423b8b6f7f0f291f250d96486041965ab526ed5ab8e0a9d46bbe59090bed32c547e45c514301b89d13a8ab19954f2fadfc8a04abde3e3ada57691591a6eb459b221531adff1c5920161962930894cae4d925b985c391d8c4ad7e2eb026f9dbb2c36b0b939e9658909cf0b12d87cefa734d2b5aed378238399f4a8ad6f2a2c17a88a2f46851f21398dbd541cd71587071a9630e7e380fef694ff782c4f63c1167dbddf9d4660e978effbef35e0321c4381ba1cea63789bca89de7b4f2314f89d9f07f6f2436eae2fcc5c7d73fb9b674c5a35c4f6caed3db83b487a4a5374aa610ebd996841bfa30ef8cee0e491344c4670f7aa7f21d9514db3d66e42b94ab930453975d62ac2f10e5cfc475d0bc45d336b1c788708e3562afc83fef80dd3cc7b3a405da64f78e2fda5eb9ca5fb83b15799362263f57964156b12498891d91ec680d12eb396ce709a0b5c550cfa3df0707b3096d317054a604ea3e2df4c12b0f0166f83b9a1833bfc428bef3f8930ef83edcf7dfe8fcbd1d678cd36e198f9285efccd5adea240e42296d9d28d1bfaad97d4d388361d78720d626c89dc3f183fa0aae9450e50e5092938c97ad56c32066a7471952e94e330ad98cd44b30806a7feffe7e631831cfed302546e00f829f195d50e5bb71fa00072734768246d3738987bfcfbf962f651dfa4b0b866062b7b8c5ba74b964f2ce7d092e6bc9866d0889f936c54d85295c67518c9153016e7469d9329c9474e521b7567828e652828a6ac1250d1c2765ea57b0f2761b4ff38e92b89c73c438435627c40320280712d4aeb478208322ca18ac341ac26521c143d29067c2d1d62ede08ae11aace4413b9296b08ed1fb3d70f29edead416e44fdb464f9d3a9767ca2649436183338d23a5986fe953d9aebe713a57725caf56917599b76c7ec8e1bd1914a6d7c43e7a0e8c2105c9667723ad6701ff6ad10ebf7007bb85419ab951173ebea0ddb0182ef3d2cbd29cc78d0e5a3ba2c6a021b08a3f9ab9bfff3ffb9827a44888276f9dc655957a07d4b8ed758238660750d19a32da9461aa644018014afb7e0dd96baa5a219b9ac5cf6b7f09f9626fc74cef73c54b5f560d8a3828474656b63b185c790f0135f85431970334a3ae813cb7e77edfd13d887c4b2e749daa55c3cb6459cb6d134cb1fa9d5daa5c680babd9dd257b1fd4de143f32f3f9be667306edcec7aa2032112e683256da9941ded8050ad3f561e551ee29fdd512620fe771d55f3f0c7da58566c794d17275270339ec7eeb004a9af08803c7c4ce8e43227839d3d304c2c21ac0ffb2b2bf5698ca468aa178be64bdb8ce3e55b125df3b8f7f788d053572d68c87fa8013016fbe52b35797bf1001aa5a08a9ea9f991db1ff4dfc88d34041850ca013af5394bea1c08ef2656ffd9063e1744183b75c1bb2d58fbdfbb4a4785702e00fc084a10285a16c234c3ff71454c073c4c4e14c18beb8021da695a59de867c040fa8f0dbec6544e52ec83aca725e4a6b71320d5db11b537ff443e524ee7502bfa77fd1a93d9e699c88832e1c27129db7f5a37d270ab0e2ba1985706c374514b71a5130c4f68baf9b3c54dd9477d577de6db1abe612937c453852349217026c717fdc59780d0550c18c749fa6bbc37d2dc12ebf82ecea8706b9f122ea9003632d1baa3be40512392aae316be82918618cab46c7a8560e95e59c0e2dd59f9009676c46c75688535439a4d6595d9b9defae30e39e320b6ac43e15ecb3343ed50027d17cd971596c51ad14e18423359b7bf29588b07f2d70525c8ae85b14691d48df939fe3f0818e219fb224749608921beade644c555a43e3c1ea24cbfdb5a15d4d2ba16f0face07411b2ad90440dd3021787409b8d79a3d86034d1c5200cd84d5471f1c2e5c80978079ba26b9ecac4b848962534cc7d27344853a12707bfa157ab6146009a79113cda9fe278567b8d09a33d7f86c16325c16e16508d07d4bad284844dcc53fe8e1f2bd785b79b53081ab203fbf908bff1eebc1a35de1c2279608a634f024438ded663c039df38831e5921a068387acf7098681372e8a8a2f3687d93acc27c8bccf0dcb03fe9c9969bf7468337ce4df77113bb315e12832ce1ac3f08badd07bff7087efdce92465ad0feb21f6d3337fb4feda677f297a4dc1b96e33a43257e2e461b7b72f611c7ea31e1086234cee440dd0b4454717fa69078da5cb056ea5d78749bb43e04a4dda556a46a508e9ad8b886a6857c58d1a641c3738e30d58f3b7149f9590a4b812cb84fa1d1d6a59e4c6ecc20907d55634c39b684659086e2907700d1873352175d01759198237926e3f80ad896204cb2f4d464089a2052d7160c1038f5f6683ade80f51599f3fa535d88d068086d1630f23248eb531728b45b94bcb0b112732f2dad37b9676f552ce56dd6ed236ea88ff2992857e1ae07a6525c1cc76d80ac29768dbdd478d05b7bbee69f003252ea2b1d7bec56b83710c8a4565d822032c46c5cb8786dee5f6b120558f6006dd2980d525eb7db1b0bc664faf2f513b2a5fa3c41c6b130eb435dd732ecef0884374d23f40a47325ec49fb289097dde445fa514bc996442503624dc13f54338aa675d548f91b6578d54272c9975e5d84233061d41899662866325aca63598c2a554786ef4d942c72ef15c30fa687e4f6dff8bb86b1d1563aba87b97c17af365a9114d44dcb461f4ff8282c6d1ea61373ec724a56fdea7da18d7177ddf1a7b31edb5823ed80e34dfd33c8acc5dab2da15b80bf2497985166b03ab04621aeb02cfb66fec8415d33a182c72aea394f83f3dc8636b74f047a32d668408bb07c159058f9a5aea6866b192b15c16f40618437867cb7317da56837f195c01cc0897c8616444273d234e82d0405627cfdc8a0920ab6315a0e747cabf6f12cac1d909bc26c1b33a9b7e8db2c3b4863ee016e57c126a3eab6e2400e607f86712b60307e0aa1826135d71efddd2bb7646ff8fd3290d6e461cc6559ca1e51ca18b9e8a0787d9fd0ee5576dd1be58ac60ab895641f72b1e384a71dd4cda330383326a21ee2562a2a090de80781d4712b117d048d897db262d09fb16f84d39c3a21e34694e95fa113e6023621c1dd98edb152f59e2a5920e407258f723ffbb3b121fd825a708b92101b3a772a9699accec510459187117552d99800cc7c1dca4d9152814fa10689f1fdedf6b495c18bdd6e0adb2620c76c3f819b7dd1cb02255cecb55bc78e58cd8b6d33e7744052919a17e8684e80dcbe922212fa538e759c96528a6f9cae9e7e183787e00fe822bae02e1a12e3ca8c88db1c6817e2d7a6465f1270c82f200d43cbad88ae55200970403b07c1c2fdefc098f070fb7e3cfe317b85950f6c705174afe0bb0f64d9105f9185a18e8429b938b84a6d377320c12ca06f4d5023d57a382ee8e2b96ba8c0dd1ed6f053c1d08637c3178212fb6e11de8dd5104d5990b9dd627110ec985a2aaea0ee67995178fe0f5c28e4ff0bfdaf6abaa42a6b0eb64a5c4837be160f1fac37e2b29b9170c3777a232cca8a1b809265e3fb80b8312d51af2eb4d92bde7a5072f713cad78e045dd7c4eb341fbb6e3bf0c62d4b12f09396f77dffa549009a20a72ebf434488ee4fb588fabe0000e919501bd5be2534184808bf5a5c4489aee83a0f6d828e7d668a121f119c53c5ab446c9e3d4538f70d81506ad979f308adb65edd62890934f3843abaee1b4b8f38fa99ef6c839ba2d2d6871b3330fefed99b06df14817c834730e0016b79b7092803bb76ff526b5889c4418a3097beb0ddd022ac3345018f6b4c8b69f2f749520bd71902fd4605687c80b7c6964190d4b972dbf7bac0d640725a007c85e90c7f1197442133d95901a24813b9d91ed3c984ad09fce2c55f21955794f90413622667e2e89188e23b314f5c90e5a8d6a7b4e4be71eee746f8fcc8090c462ceffe150f1daa4ffbef9163b6c6a86cd55a6c5942272c401cb14e2b3af52ca06b07c96b169bdd68b39488e3d48671b7dd38a4c7488a9015fe525d41c2f38c683faa4cdd57fed809e8be9c8ef5dba2788fa1db2c4fe750b1d22a047f609bdc1935b322aa86e3df642f048a6df5beed2eef94751710695a5276bc125a199bed9a70e8556ba33a18069ae7a40f7083c892513bff3e44adcbb365c2c5d276b22bdb81618d7345a82030b6cb34085d04d8d2c72d33cc42567e3d5d1968caa1737e1a436975509062a5f49a73d371a386bc887e21df22723e64761d0abea686aeb003f3f0dc008d2ca92211ee9c3fc06b04fe7421b2565292c8521d612a52a77ec0bd37fe498b2ccc422cb05a6001510992efa31a637914a1cd993dae9ce26bdcc63576f83691b7c37c008eed10a66101bc6b5e2b512f3e677958ddab193d95ed563e7b48f8396a0153a883eb9a7a8d87a9c14ae20af5ab05ae6deca97b854ebb7154972cdb724f04804afa8566477cd63193e573edc04d2e79e778389bd5861ae915b7be309f1a5aadfc16a524433795fa0d474326fc18b0da475db2714ef32dd836740336945517289f541bf7585854611738b5ccbb0fba20f8e59eb798d8e8684222e0dc7a2b127afa8cca056eaad7211ecad69ea58d5b711223fea819fdd764d087b8f7c53b845aad0bee5b0541d66fcb10f99d97688c39ec9a5f0124452d6d294c7b80869c0837d2ae2817e8ba684f80365c760f2e1763417ba080cffe3b0351f8ade2670fcf660f3e4b0f9d9d95b3b7a65c99991d594a6bda60f348fe10889062a80abd217c518c072a8020ca827e3f00a2417f0c84aec692df650ab98c7bf6edd76ec75de02cd5fdb8e920408386221ef02ba3d3ae2f00d9f8445b88733b8f0507ad33c29598bc49eefb4cdf3b79c8c6daad7112b7fd95df73f6db3dff739b24da84003baae96c0d2c229b9225df191341c041c9fe95f4acb3fb0f5f2111dbb00e228a363decd4df7825e055168454dee094de41a72c8348d9e7df7ee2684fad74df12da0e30044d833d8c6720e55b16932740779b10150decd92ce5cfde862eae998fb61405811028359118d7d82e38af2de7049a9df7bb135b93c5096094d6e3e9813facf038e343c6b0664b349cb354ce0110e0e8f1d3bac949c741ca337ed2cc385498516c194ea6b6b66cf299b79bc364a5df6c4eb32865b5acaeeeee7d5046c099d6086a133d0c11c34798b765837d9fae67f52cdfb2dd33c877b845e51974000fbdf523194376fbef40a8fc657f737a270927c82d844a647269ed3b01a5831994b78b7cf6f27b08e311e93d00d16a66a7f4290e85aa42946c28c54c4837c9bb37c21fbaf1e4f17ad51e38d98f175fb7cc00cfe5e722fe6c2fa0d3aea5507e8d7bc98c5b1e2bc8ad8da1437a5b21824e1c73b6082b4c4686bc6d720d89f7c10c2e50c0bd1ddcfc0fdff59056ec48cf151fd11f209dd706587d32ab4feca289028d505ad0088d292c719362aaf87bbe165816ff68fce1e2cb5d81db9c422de069293c3305269d06e9d23f8c36f966960316ae4793d8f07873073ee6ee99a085290d37b59dc41f8cc1d79f06b6bfc8a0ab0d04251a22ee6e2d093a4a34a82970f4f08c7c253143f94342360e7c7dd91eba77dd6d4bed4732529fe4341ab796ab5f6fa2cce07196b34dea1fac5ac5861ea1aaff98eba8cfd07f9d3399308c945ca2840e19331c977642ed74915ba293aded44de9021bd4ba4310bef0c2d79bce94fab8333ffb2f917bca349ca9db1a53246607e608c73b7b37a98071886df9caacc294ea718e17fb80172a5e531655028a2957fae301158a94d36af80a5f8ff15594af4fc5a1feb12db9e8667fbff05e8f648b1a2f75479899fe9db8324f0dce4794e5c9ccadc234f020b5950b4a7d07276674ba086c85f53a88e4cdd11823debdc7bfa1f9eb96f832f0b32167a336ca17a9139ab6c32af317b3f661fd63dac9d6107c124e4aa6b46ca44e723f9c767ecc0763b859f431e340cdab97312541119ed2b1000d52a43bd2af29b77ca0fb00a8b5f8c5c3cc5d86e27e0e94bce880ec1c7e3a1f156f472f710b3d2f861634e0c4313ac83cdbcb19d94d1696495951e64a498812854ff2bb5dc7d90fb78cce123e0577fc65f6977cf9a188450e1b9a1c20a871866b5c8a0dab6c1a52c87f066df4c05f47b7d3441d0e8d9ed0a1c757247b6fc9558571a750d92613cac5ec3bf2e0db9c035610329a7feb3dea09d7f5060b16f7f6cfd6b14400ea32d111cf8124f5b85040277eef69ea376a59f9913050e3c024686cafa08e41687202d397442e3942c52da4d453e5d6592767def3a044dfe71d104de1512fd88862eb9469909753381fa9245f6fb6cfdda0d5e56e075f29052c98538a49ff3202c87e81c41dab504ed3cd5165015a3f3a4e704a96be447fc32804774dbcfbb77555890da6404d38f809d377204461507a1d04c1749836cafe3227ac4490cd3698d44db5784742d9546c0472b9952265f72bac98e22c2d1942905616aa16b7d817fa0866aa6b025bbb7885581244850b1ea38b5b610f0e3d2a2ffa218fe8e983892e719fa065d9a175c64a85a7c04de55a4a7e2c81702ecc0828d2995290799659f00bdafbb7b8ab9beb55295948bed7b026a2507a06a8a8cff66281bdc3efe4b68053dd93c4d9ee83bc8f2e7978472344473502a4ee71b01b279f7342be3ea564bf084b5e6ea33e7dbafe52270adbde575f6193190ec52df324684f94444b45500f3f4fcfe0fd9ba53486c52efe80fb2a49859be96d489252e32af06c10742169fe05f8ed82183b8b82e47a19d8eedba31a25697d1b7197a76b0c160d76eabfda294da48bdf60fc5bf84fc4ddbcf5ac982ac0841f22d358ee84b79ec4663b4f09a488962bcbb3df4305198269add52de5de9243d3bed4938219f940868bc8a14845092f5da302893240301493f5944ebcd09d53993f1acd58bff9d5122978d2c48cb117e43c953a36260dcee5965881ca0b7e2fbff1a20620cdfcb9b5003a0ace8209edb3f61e34de476cfbb3ae295cb0a20ceee79ecf67e937d8902ea6b30aa4a459b33da7b5069e452f6940b2873a3d6071b490073ab62f2e85ab1dcefca9f8cdadfc435220c1c11f68bd89009ba9b49cf5da8c4504db3c2fb278c795fed3619830e536c9af2358e9781c49427511a70f731d4b7afd473002274336f065b70ef26e67f0772a65f4c279eeaeb62b1600b2bc705488d918381768c91faecb4d6e06607c428612508759e1df8fbfecb1ea7036aaec07a57068572ecb385e307be23178a47cc87f52295d344fa4a3de7b71ab09ee515fbcdb5af55ec2473ecb6fd406a0206ff97f769322040e27ba84cad02c9d1582d8a9539762904686692c4f24581e08b410bcf808c1809c1830d555b2b6aa392f84756631565a60e55c05dcb43be0ecbedb301017e1cc3d55e84d9871c0d04e0a041ab4175eb62e38f65edb4ad53adfd011d92d0e40c0de35262d274a3cf4173e14f90aeda2adb9246c5739a7b72e2e5ebe76e8efe75b95ffeb673e04f8c8911c9d8ce31f486b151ab7da061925644f7c3335372855745c4c91df32fab8eea577d5146da6f7360e5545ae694db44a43b667ec88e9125128a35782035e2135a833402595d9444934ebe5c0573f3a04d64295fde821a4166a438a446b7622269b7f00fb34d1ab4461aa82f42b92afc9ffb801ef7abcb3f7bccbc92a4ca8572cea9028654b96e827c2ce627c1e90d48a094051be3ab3ff21a2d8273fac130f56a03ad4d0fac5883c1647192e70cac91474dc2cdf993dced974fff01f2d322f3c910b0470a03337ec2427f21d96851ff24536f5c69b4a358795fca8f9357da58d0848ff4c741ae349c421eea63ae510a51bc2cbf1269eba13b424c22deefdaebf07da83acf09c0ff217911e126fc396b68d53d6f80bd46e8bbe7d20f1072f10a9ef1c621ffa7eb8a84868e12b73d25d0c06aa12242018da533eaa8f1d0a162adb34f0ebbaa8225ae2381ae7f85cde4dbba5cb5a0b86f041141b31ae40305e4d6f437e8867cb6ca1669bf2679f6053633814db537e45fb93f2c9621bd3608a31913f9873144643ea400681626c7dafed25ede215f9375fc943411e8a6f62128f2f90e4ef013bd8e0222fd3fbef38786683f9c0e8d67436b3e1e9a440bee9c6ac3c85f03ef33a1ce1b87bac5124d2e6f995fd58c308fbddc6ddebdeb1b42bcfebfe1b90422685e3167163b32d0bd7961a938a9fc9ececdb43d1c3b274e459d9db31ad5b33e69713dea657a32708f222595f990eb763418159787e1330b10ef5a5cbbfcb0f8cd4aae8f7540565d7eb569529d32137b48996af2375864bfbca8bbfc0c5fd7b3e0420564b3082388d2425e9e706fe9e6fcf99a421090ec12f76dc4d7866a89fe9954048504e3b61c7f33a7115f37a20e25df439bd2889ff05e7f430b0d7eac74122206a1fe6be8b3b2a900db6cd0774dcc2e3cc5547a78ac540c574f842dda7918db76820919ec29a5a1b38019f1b91eceea854e467c9c0713cb47555e0c1b5a0a338c117f792382a1ab02d876418bb924a154a01f99d08a9e771d17f1d9b546eb17179427d8ce2a89b222f5fc771402d681b34b09dac26a431471ee8f28613b1bbd2fc4faf9b01757b1d2edc7a81ce6d337e207f4a78e770ac0c1042bf877da69f2c862dde23e406006e2c7e6f422fe255dfc5369127239fbd22e2838a3f598bd483d946f9236a5d8a63fa48d7d6436e19048f62b467c3c5c1c7fb93f188cd74532607130839f74f7a6ba52fb12c7bffa2d35f488edeab6b8cdbdfaea91bfb299a6da5cfc0e5f1e2bfce3e12fa91154581baa76741c97a4e0ae620e335bdec64cce0cbc684329593f0d4001b2136e6627db8c03c4a5c19e43ccb1e12b01bd408c04b438b6af22712c37314b3186def8ed766a62774e91bd87a5523070334d3556e83687dbb1f009ed6184c2514599b9b753b420e5c8b7836ff274efd178af73d8468594bf2ee521d0f268d05c0548432a9fa1dc6081457374b4f4413e2e9a0931ed07e9b5b6397383d2d1cea520d60fe0cbc6ee41ae882eb4332e09bebc81d291444c46f4de1b26f822c118d1ef8a96570901984e823a496ec591e19899a2d20ef25701c0254b09f7d7e1481d1110fce28befb029af70eab941d9805bf0572aa85868757ec650189ddab1c13457469d8cab65831f417266b33978e1386c4781c7273586fd4a1dfccaf7f280528a37d890677b12437263f6c65ad95198a302345477adc157a5093909f8b182e533e554395c0130ef9ebda0af8980dbfeed094e1406ffa061f81cc9e1dfa60566d5f9d03e58bb4475c440e0e2c7c9a9e37987eac4efb9a6de4b5a4c09833f5823e146f7c03c59c148a8fafd534b0cd231f802e0c464ec908c907c0cc6571a05a989fc77c7aaad2ef893dfc8aafa374a39d7a115cd9ad33cc7112358801b0b2d12a084664ab67f313c834b7f1f647dfddba7a5b71c6ae27b81a34024a145c6e93ff3e97f661adf704eb8a5f48f790c281867dc916ac7d72190efc12f0128f896198de1639449f023d007fe626448399c35056bfdc560ca7621b684b8334002563cbc9d887419d9d1bb808e7860353cfe105c745c7cccd674f7ccdf6f5ff1e80a3780652628649a5436359b323e5e9a54a482a3407289734021026eb9a02db9b429e73402e6719dcb5ee6e04bdff84e8e1489df261d0cb3e54b1d0c3e296a1d2ff2e29a32dc178c1f2558c9843542d5bc81e827465f4a7caa8b54df92830436de39d1d541508005332c7bd496f197bc3b4a2ad7e490207fc3140046d0fcadb9d1ee6f11bd52fb64f59cad44f898d6ba15a84bd2bd2b9f45dacd3fd30946c359679d87367b5d7ec1d2868f501c950c4d2cc39eac5aab49b635a2766e5f089941a06001be58a22492d14326364b2648d49795c3816e4d35b8496611157794ca10065ac07582a263837f716785a4fb7ad0d2854c2b01207e9a698349cbfab1d965f9eadc6f22a3ca36c0d0a4d9f750432e62ff8f4f46d8bd7526ca2adeea61adbeec56e6179981db654b57c5ed14067875314cffbaa8d72b0d913715f76aa186f4436ef8c2386f18ec76c3b2258128fbd67bb8d72e28a1de48fd41728523bd244e12b36619c6d2b598cdd1fdff747f2ecb072183a26226fee60001cc86785e7578fef0b3091e6aa365146a8378defbcdd62f5c855555e24eba209359d908153caf5fc0d62c094fceb6ff553e76becb2690eab47e79062214fe750e0b5c6d949092a3a03c6aaa30ca174cd3361bfa0e0b000d43cf9a4c34eab8fdfe68279a6e141119cac1bb9c036321c42d3256068df16c20a513ac95b230f99752e6cd5e50c579d71e473bbcd4cd3e2a9e3a0fb662238fa1678ad98200ae6ff62e771d840978cf08e2b0287218ac73cbf9874c0665e66d19867327a86a160f8e7f8138c813254e7cf1aa72e59d5115addc118f411102aa50c047958f42ae131015f66a6984acb9e3d2a56210018b095d650348e413df11523636619781d98893fbabd660ac5bbebf94d1cef008198a39f390a7505550ba900bef33ac253d068467436db3c680f907d69a6ef8c4f2f03b8f7d028b16d80545b299919d7a6ea64349c7fd50425b95788305b0ca23ad8a1af34a8dee5ebfe848ea5e0a59fd2f063c144a875595df3daa3ab35e85d20dd039088245a9c94cedefce5f493b6367222659f70a772e2b4d5ce352063dd12024f6e45b1c372634227683f83b05a7668a6629f4f4a1831a047c4c5f4a20a617766b14af6140da0a42846d9c81f1d8ebf18dabad634bc79f884fd04acc0cffab270cd53640a3eacab54d51f4dc6d0f617daf44024c71932c99899f7039ac9b19fec80a10704a5e58b97e2f34b5d0f7c3faf2d1a4267df8a929f5236a9f2c3ce39e2553f84437caae6a87dcd32b269de76f24193bbce1c8f607329eeb3bf979520a1eda34c53e3137bf4610ae5c9d4ff94d0fe193161b6405ba9b588f40b1029f5013fa01b0ba8414411d72948bf3e12be2c226645590ddfa68ef97e3a4ccae5eb4510deb86e81f7448d8703d137e0f74c8fe58054f52bdab9e1c48fa64419550aa75b717eccafae67d001a02a6e07a89e25aea2de137100c6df4361cf0118d1bf9c6a092c7bde02c5f2f9cfa6938845e0a7dd77094f9cc5fc2fb0dc7d17f418dec28b39b80d93dc8746ad8edb9d2fea8aef6c462c663ba114421d167f7e0f13d57a3f606d663c6fcc8daf88043f53cefdea7d3c1eea7d0b8b1dfbfb702ed4cc40effde4d3a27bfe4fa6a1d04283275aaea8b8309d2649d5d4f063121f5582f432b2893cc8dc10d79ba6b481a0f54fcc8c01accdd0059b0623f34b926a495c6d72eee04c7e690c0bdc605bf15bcf3a0b1bdd0e8d0dae5007f350d51a3c08d7f02eb7ec203b457a1883be1b2aa491f2fb070b763d5f8501d6287eb821d7ae45cbe1f3a3ac55f0e0c4b71b063340ea20cd72c0d92120e153a6b22ab7eb2e9abe4f7a9111c045d69b339c17b6d6aa2dec46fc958519a59e3ed886edc58098df2a12fff5a9fa8ca998d1ce721ceb435ed1ba1099e1b4501d4c6e2a7f7ca137c8e82df51fe5281d94523eb26ce5df8d8bbc944dce17e707c836f7e4b8a528b1bd777a7bacb66f17c1a44efb377994f5d9d3c6daef9e3e33ee51bffe1c69de5318100d2c3bbf9f59c0830c4693746b5f94658ae995d6b97681a20540fcb62283683065ca16aac222c02db2818a29b4b85f3cbee1635a3be620ba8a5404d5561423eca6d0ca95a02d0343ac128e5d8bc4d35fb59a994f7ff4a1896800b0db43d4b6326c445573763dca566a8a3c06f545168291f8edbb86f62ecb4a0fdbb75af4f18d6b678b8d055afcf869ab216142013ce684c1097eeca5cafdda61d855df46cfe5a115d300376497dfd799014f6a9b3b21d85b7cee8d2035d8ba3b85354a7c03d94782de3fc185268b739755ae1dc2d002c7dbe518eeca970344c94070cc5f345c140190a5997c1ffaaa83cca83df22e0b3a0659029c2cb60bd53a3128a02427b4040ba1b65c7092d940e0bfd736baf56614c56ec3e888f2b8668d281522981a83b3fad835eadfd1728d3650d0b0daeef45fbadd04a85920d4d9c66f0ffd0e5e758866114ed4ccd27f80f51311df5ec775ee765cca6486550d26bc5b19c1dc5477adf5e5cb51ebc08f0ff528c36a0230d55852a7577592ae29299521cec196c167686e0b79e5affc7c3e933ef56f84c347a3ac8dbc70ab3acfb5856c028442533105a4ecfb701aced2aaa5bf9895ca1e336889e29219e1b1aa157b13eac589607784a196eb5d457b44c98646a88bba3a2155bd749de809545f17854e956fddcd0224a24001baef0545df726d069282f82f414eec20c755e3594bcf6c32381d6dba3aa8412060a55ee7db53492811b9019b1d403ae2b54ce03d3bdc636c8279004a7af45e313d33389c15e9feb87f1ddfcb899fb5da1bd43610913dc1e9b79b83635feb410660b693b68927e73ca79a600856bf5ae6837ebeb7f8e2ba4b715df41e49ba2cc9d904f1f9212669ab1c81058de2bc73de77bd9f5dcf39c5e31d987a369c6bf5ba2de7e58b9f219838f6b14fb5137080771931e207dc31f65a167e258178fdf039a998cfbc3db6abd105432b9103ffaf0753f48bd490521cff18e16b0da388892e2b3dfa24ae86b45ef84e653807bed79d69ff56a33ee789406dbf3a51060930e5aaad073e9e2e2cea0202f5cea8e93fc8f86edd6804cf5e3ed98da04ba920395358ff8f3a5413b40fdaefd21e3f8edecd0bc1acca70ee708a74a6bc2648da50b6e0a2a186f0307f1ce85c0f786c0bcb69081e1f3f8a9e0c49cb29be5e603536c2f01b59b699bbe7cfe9c4dfc3e3195b64041fdb3ce45f3be2804346847e775c8f96775f5f907c0c183bf1ba8efa7b7286d155eb7c9e9e4cbb9196ea68f9156dfeb7b43303295428f9d4321520f3ba9c200d41960b281eae8ffe67d831b1e79f8d4f044080b2ce707a482db7634affc9f69228b85cbc7711f044e0b1f78f09080f72d6b70e4b8ba99097ea61dc3bd3a0d25e25a5bd19d5c8bc5d165e6e452a22b9e051c73c425b75216ceb114ab1864470dc1acaab0e6f8d218e2f8e7b919748cdd6b0c7670be40b069e6e1272deec4d4b72930e71ee3daa0d2d6299825d4908e0c68f61215a643ed4972146d0e304362fa59802647d1bde6532074ff829d1169635a64673a5aa0d0c219577538a452132ee4e65245fa82ea80a3dae692eee39a0b85e55924e141d043967289661caeb68edd2e57ab3e437be133e33f088918228c9bcdeff7390544bb5e023d247b10e3a48031c3c3da4aa3325b8049a39c6ff63b5a8aba428ae67230978e407c0d05de0a1ff55cf15ebb38ce4920b28c29a00144141165f01c726bd2184c9884ebcfbe1032ebf2cd724db7053af6556042486b84d44f39980723e8ba6c8fecc610d298300535631c77cd22a55a835e529395e38ade7cb1085e45ef2037d4887a8069d008399a15ac4745c059a68ff5272765770d6e16a409da6cc0c3bc3ec4088ab3842c674d8fde6b86012978da6778a15d3f786c8cdbf6479385a0c67798e27fa81543c3d08458d4a0a6e2d1abfa3189d8745dd949314f410d308cd671d17d1cdb86f71c0500a24a755022dbd166cac8c044c80a2de6109d2ac4cda2079c8508c75e3a10b49af441c0b348a72539663e837c84d223b31f376d7bafc950bd7e76e6274dba4d2184ee9b4bb70563b104bb6bfbca3b0df7691273a65448e0c2c955035e0b3cd0225da098f34d43c4c2c14ac6b1e8c000faef285d2418c4752a406089702c18c12325607468b10fc03916c0181368ce8a9ebf30ae7643e0031240f55de2502ce432fe621e821acbfaeedff72fd24793ee88ec17212b1675fec274b38c1dd67e11387a5803d04c08830486a64652275a41a1c862e41ddf74a24401fd224d4f06c7c9fda2c669f59cac7841cc784942cff83e01d50bccd8f1dc7b13ed2f26e4460ad1a4ac6da0a5019987677cc91fbacbc8fb89f3d795f72f7e6c709935e451180b2aedad5107bc51cce603fc88df4561d15014fb84398bc01cd2687c9967c5e3bcf03b0a89e24be927c0efff2950c23f77edc848745762fea18d961e0e4aaaefac38f3f62eef208abd94549f7bb2594c457bd824717050e8882553d57986e744f4bb45ef1648cb151b4832d038b781775f03d45e60fc6286e229f2318ddaf0c56ac5e96b2fdf182a6247841c27a0d00cada3e771b043b6480f8e1ad474bb2fcb4d5c4d3026ed67e12d964abfcc3b45842e28f108ab903ce9d45ae06dbfd1de26e237e9c28c17ef1de81ccf2ebe74efd0efd70c74e2e3d6b8f8e9812cc0dc6ec8a7456d37df81594aac7c60590559494feee75e760bce138c687ba65312b093d29398c87a0c13265d966b24998c053eaf76e08082152760e2a35d49063b9f7595e135dbc858d429e3c7e81aef71269a58cdb63820a0c8c9b593aa969b9e2ef2cd7444adf5d730e3fe1f36865421c6a2420ce12b9ec28caa2624601e7b77e8d9d7088c92fa14defdcd20fffefadd703e62e818ecbe8a744b8d13fa3d0e0fc8f9156b7e99d2d49ddc5646a3a73787a7115ee2e346c671df8f1abff7ba51bba57fdfe88ff60719ef1bacfcb4433cf03f7dedab389fdcd7ece6b1bb21713bf7db9e3799a4fb46bc82ffc852326387e85d6bdf63b6387ee375d3e052c0694e1be8b0b5745bc80703d65bf64559ef3be2c23c58a95580dbeeaffc04f2fafe01ebc0d1d6f720d3d159ec3f0bc78a2a13f8a86c52437db4a3f7c90e6d14a3af321463b511abb75a3291e453681713c7ed49e4f4bf79bfbebe5c734b6b4008c6915159a7fa23989ee3fbefba080f753515fcf70fea2d56826dfbf62bde14eb2d7c005db9041b305d78f85c7a6d1b7d0da09019563848338f9342c0fc6671764d56b4b29155175aa7b063aeac5c912ddf18006aec9f803eae4d8ee35c2db6aaf61cc790a118b9ce7e2084c45577a165e0d2c667b1b1c8235fb3f46e87da3209cd4320deae6f0809da67545cfd285ac652733e4fe09ab6e74cf7494ae82b373a0de5479867ae284dbd67b35a12166e906debd755942415cc61fd88de61dd206a79fe6f5146905df91c748b81a65121f0bb6cc54aa6bf16839336d46ac40f64e9692fd211d25b649265602ea89306e29d45f704b4933ca4d2d813fdc60cf760506c98f0d17127f1e16804ad13bf8cf587245bfe2d458ad71043b94ee149742db1a1ee2095cb27e81c8f88e651a999b1f731393a25720f0d36a47e69a581f82172a22c4e9d9196e26978f35080533193f8b48814fb684a9d4d914677204a7122bc2b23ea9392891509d5613d28a3914de92a30afa10b25a570c1131a565cf275213a6ec616ced9864a3b18a3fea369cab298a94743e910752d8dc7e3f5cdc3ddacbfee848aa024f7cb29b5db4eef04a30df12e3e9e2de356b1288974cd81dd4bc2a74ee762ac8031f68006d696bebe920471766e41604f1319071e5d298f6d0338921eeb1a7fd9046f47dd3cab5d307c902a21f949925a3254f093230356816b7ec24e600ced4316ba0f5f5d9284a0085c51eb30cbddc14eed4685d5401274870ad5e150c2d36ebc7fac9140bd1f62ff0e2feb642a6ee213cb5315767a0c12bab73118f1b7f2d09589b21a05eef8c102fa04aeaa62cc87b4724632d3422ccd630466d676e8a6ddaf32ad3ec031e5692e3b605da57e6c817ee2e3a129ff0b6894ae8116962dcebc26ac9a8622316ea6770c951354e1117e3ba74379ab4663941be9a3e046551116551d843de26ca4aba8cb44f0bec4d5cab2823aa9ea25f27e416644efa0a022532af4513dca0857435bac01a263b97b6fc2cd07e9b18787fbaa735a09f5d913be272a97752cfb6d8bcf06eb8702bae5e9b60912f7fd378954d098034f1a9292b4ac3ab384b83fe5b3b29c2b28b9658049861681bbc0fe4feaa6495221258ba61e41401395b691b41483ccd789698ad0e54ebbb87eb7614b83a6f09308fdb2057c2779d11b8414e2e2a3adcf00e25d8b52698a9689c2754138c1c64d9c3c88cf5e06486e017a732d46c8695c426181a2f2a8114b94a00b6e9a2e32ad90d1e322b54760007151d71e76bbc0f5fa545f9a4a7767f634afc55ec27e5f4ad096e58fc77b0266af50bca0ad268b08716f36009b60851360102c3dd8027d1a189f09ae5ca32d864ebb62218b9b45b73de0a7ea9fe0403c1d2a76b0c1a35df90591054ec32c481db91f281b8f3639966a679197f0260dd4bad4dc48ca574e2844e353c91b0c36252cc35910f286130adf5aaf134201c7002db81500b62357a8b6194cdde8a479b167ea61b5f285acb0b47a7bb3be6f2dde6d8d6ac4ca6dd05274e1f4bc4a22961f034bb1f83725faf0eff76d55fcd244c0d2690b30524feb4ca6868f51e9cfc41c19a4b1b59f452c75f08d9be54e9dc5a30d0952a83d1975c4b3962a7c4cd47f4d6c985991ba44a7d4e9c50fb7814e87658410961275ca2928a7eda386eac44f3f853911c5a7dff51abd917be5cf6701eee274a755869c023eed49ac07fe5db17a02aaa6fe858e424a874c43296a54bbc74df5b2a782a60f5f01d48c0662acf4d5c63a248fd39b35672bb39637697cd3761b772939f56b15b89fb9e8d60b1b56559fe4ab9adff1d2802d4145941556ea6b266a31dc3c7e370dbf03ca9a995939b62b0963f0839fe09533cc57521bab0bca12d756f6795b3d8135a0e2babaaa921eef8e1cd3d705ddbfbadd0c39105db383d4c9209786fb5cda30438f28ac23a6140035879c04f70511c790baaaf32e5a9bb36e0b37a57ab92e05b1d17129a70029d007b75d652e535cd4178698da79a1672789885c4eb1fbb0d8773fb3aa9291d6a50b1894c6013f3ea0773e0ce5ed526c464304350993758a184cb7d899475f951fac3b872f2d2567645385c4fe8016fa4ef675adf4e476aae7a5e795a3e88055e84fce1657253b2b43cf974709b73d5596202b59f0fe0d3fe429533388ad0ea5941f205859a252f5b88bd6fa4bed06ab850101d4491f47ca442110041c2059c84058dc00fdee611176a837e5ddbd5d3e0ce35f7843e4d2a8971488f232e539380f4600d0ff0fd420c38129691bd6a0b66d4f65790fcfd5a6bf901fa579b66f7d96862b8d15af03dafdfe27f1330781d823cf64cb12cdb2c2d05dc8ebc91a054706ba9e782e7f3365b3084ac13fe7657d438492b9c231e54046e3e0227f1da675ccfa0d00644f0904f0010f48c5ab059d29f70b42d25e721649a2591cb3de8fc5fe00ad87ff82f75ac86b45689f9486855915f76f817b01074dc34f78c808c62dc47543641672501f35438f263c97dad371b3c25b16e47521b462ff2506aa120ece93b0f80e489c27ce41aaa41f72554bfaf3eda0e08f810df62f6ea10f2a939bd7cea9d613c10de3269e063b16120fe7174dded8423d1d4fe4b16a493c524e7458915982e72a024e763fbd58226e62ffe5c8b411dcdbfb47c7d92d0a6c9541af287bd2db92ce7509a97fba8feeb02780852010035e196709d8796974df3ff6c6a841cb88fa67231db691b0238b889b70da38d72ffbd47f963eac9cbe852fc76536494eb3cf2018ba054b0afbdca560d1cc985622e83a9ecd536a2699ecbb54e8f10d57a8c071347249b1afc883e4846f2065c1d8817a1aafdb9535eefa94d466a97de32c1e20763ec06944ddf0274ed4c15eb84c7a737c6db552418506a27aa1528929b638075ae8cf2c8d9b00640033cc5128bb86a331f93784145acc7799382e341b97577b8d7a48eaf062f1d2042c93adc3f8aa0598bf92354007535dc64e2118b721a646f0787608c0329baf160f7843fa8242f145c357aa2dab881b0513f97939b6f0c21d728e27bf5d9ec753e54d8335ef650bfdb4380c2c4f2fb553991667dc4f38e0d311b631920e9d892ff74472f031e8c3946e73f1e2c42c62fec0fcf498ac8a15686bff7b86d15408bc62aa3b13950c6d44e45ab9cb3571a093ed5379bd65b68c519d3794cbb6cc6edcd9a0d3eea2f17f48c45650cee9a2d8ef0ee2b4266d7070da68771cd74ab9e37b65031216facdd2d196def821769bc96d5d6f349538457c11a98f7467d1707f3f7404ef6b7370f6496e8148122758331d0b46e70328a324a04e7c0ec5c1328a726d48e362c30c0053532b07a8ba1bf00fbaa8e93682e26559da5e2ce23d21845d31608cda2939e59f43aa9b7fa8ee2f0730ff0c91833e5c26f7eff0fa16fdc4fa071a1c1473c0bcbc42f2b1e013352eeaa434cf0ca81b427497ef68aef1837af3de41e083a09d4b673c7a80c4e173b1108f054eaf4c0d8f51a9a5b85d82ee4e9cc289904a37ce3b7dcbfcff26ec10130b20446bb6cb57a5ea2114e4b7eb8d48b1c6d659bb8f69acd1168e71b39c21993c1fcf04843531332c0393a4cabcc9ab57ff4eb449476d75e757ca2523787ca8711d61065cc8c7678ad3edab8852007198ef909e03ad400c07e39afd520d6c399c43778a8ef02f18a3bad4c1a8b05b3625c533cc968321cc30c14313ac99af21cf0ac5f565580564162bfccc0ef13a9a652e058c87a6458ef99a98fbfaa3f9c76361680670b7b83e2248c1b73db73d96c92fdb464300b313f83dddfc16c2b4e7923580f63cf55c4c93358c7e4c9967f96e89b66a1b82e49c0c4cc316c8e51606c5f2818566a48974014c6e495f0571cf95602b175c0b948d85994d5cb9751e3ccc443a3cdbabcda4d50e4e33e893f37a99552de582db3ded76c5e17964385a12d5306390e201e9e600bd607674b99f8de4a20a8e4aa8ad4a91ee10dbcc48862e687c052a80bda8673ad998321cd6035f1375a7320d65a55e68fbfd841913a99421ae7caae04f686982ef2b1aee9bf6f4638d44bbd3801974d3ada816042ef19433e1563420edb0b119b1da29486596e2c5421f1603a4b79781324a98bd9c6646a2f095132bd28f251c4b2f55e0bd4d144433caad5b81fda5dcae47c13283457ff4d2df94db242a6446090eed20c43be7d23bb64fee4ebfa5bbae31c867ea052fbd88197562638535233b61157ee79e2b10dc7328a02e26b713053a4305f476ab94e7dc421a66817f5eb26b47214deda0d392d83e6c480adb279496eabc8d298c46807bf020aea8fd082165d1b4bb2fcbe2eb109d35c4d9f960608c4c17270e67722d6060ce10160d84f66008410604220bff629fee87e8c1d3ce62cbd3582da4511461572e819aba606c44cd50635a7f28de4acd5953e0d5fc6289ae30462a7f0628b8f717eb19902213db26b77a6518adb48dce81e53566847a18052c4e9e09a6b62890dc089ff52ed19e2ea9fae7d7ea1c03296c4ec2514da8bed72ecd51199729f401b146912ada462fdb702df81024ac60278e1176828c55da65a878eaa350100f1e6693421afdeae579d78d4833c009e7b27738b2e2564985bcd162ed197e9ff9c160aee2855ad4be173cff6209657f1e191356e9193d0247f25d4163cb44d7530f23bf98ee5d85c69355b0f9efd11b86eba9e1ca1c07bff1e166b92b946c8accf51406b032497756ada09ce1322c9e7947824122ea05645fe403f91850b8148f23942902da761ca13f3100dc049842809032a6352ea98ced572608122bcf933025a04208126492c222f382bae92d05fd7ed233a1ab47191756b279d39d40f870bd140def478b2dd9a937538ed5b7fee8ff1171b7e031ade09cd83ba2b98f60b34c328eaca24460ffcb31691d53ebd7b417568f3c51caaaf42379eee253d5876957e2281e1c2f75ffee73557deefa955477666ba0e021c96c5b1bd13e194003b378943a38628c9263d50711f4dd44c2bdd14208cb704fc2264748f6646e4dbdaa5e8e71a97efeaacef3e1dd0c2a1db7be392c24217e6789499c62a738425313b3388d227d358941424aa30166aa1e3869d649c78eb10e87922e380fbef4a76229c8b05f70b25955241d6a496bc208558c534001abc20e8e21ae6398886430847d451ce1d58697598efbda000899f06a83fe53e1cb83b681bf2807ebcfd4e128541b268c63fa3791ad20a7f0b62f1d918fc3c9f67b8048e49650b23e63a95e5cbf9c8bd57000aa3aa69de053113ef19fc514b7410212ab79b1019a0a9d7a57abeb13484ed96dffc2648b5a651f8803fe33308bf6a07b28436b0c2f5de05a48dbcc5037a6c3860cfaf707c27b5111eb4c26a946297e6860e85a16693111c2b18b90eae58d6edc385d8209e77071ccd1002794c104c85c4bd4d73be0e278bf7a25e6c5794ea8b593a84d231b9ec4765a0ecddaf2fa89e5b5c3cd3a2cda432fa92fc016cbd2ee1250d6545127e2786761cb06e2175978d8b687681498a2e8b89bdb588a71dc33fbc531647d2fe2ccb331edc8f2067f36788873a13713b9e3b475d5c48eabfa8412620d3e789f02241233f9bdd53233112180100c9bb2d8ba6f933102170e76c632fbf799b3518669a76cdba3710c0140ab99d018653d7a7b8cd192c1d360442e756829c49897f2afc2f633b3a9cb8f94fcb883f5cc735cfbe790a87ec4501eeb32d7d31022bdc420a84d590bb17bc14ae8d61360a03c438a95c30d716e6c3be6231216e6b0d4227b072cfbc7f14f1afc36e96c32233bff30830baa2faed8494386d1f89b312367c76c8f39d99cfcb14350b25cffe7bd08bc184eeeaf7d4555b7f9a6a8b3a26a70bee54584bb9a9aa1497a3e268d16b3914037f585b8632848cb37e84eedcd02fbac5effea5e1053391c0ff6bbebcb9f31342a13831ae3c6f63b41ce105181374ccc425045909c291d84567cb6c9043eaaa54d35acc07d7134961ef69368610c2212ba24c83383f919ec2d404151e259a62166f257bf39bf5e2c7dc1d1b5cf4f68633c1f89058bd52defa00f3900c69698558b3803078ada6747e17ffdf55bb2844058052a89509533ca9d528e35fc883e444917fe9c4b0e01a9058233454d6395b3e3e7b32e595bf09420a368cf5c5d566c9f6faa3ee9ad6cfdf58ff58605893867e1dc4a1e2ab07c041c42629178a6ba4e02217290ffac44d6b9b2e425b87375c89921f373a361c62e739da3ef596da6a98451c781784ea8f0b2270f1bd49b6f54f8351bb6ab32fe834cbd18631e81ad105d48f00ea86cfedae400620b0abdcbfe9dfe80f88835bff7ec63f7404f6960b4292fa83fb567ff5072facc7c65c50af389c8b0abc7543a8549d59cdf0163627cc3415f39b7a30ebe976fef6a43a5418ffdc65b1b3cb5d9cf578a7e119aa9252417a55a95f73d3e6a0808667d7d9c1ed6a08552dcf14b45adc6f3a2ae0902497e75a02822a63931ff1109277e26743a0dd99fe474ab703350564454d23544fee1e523c74fcf351d6d6e50df45a8dceb9c82303802274ef711981c6d7142014592ca03f7ffe6ba1e8cde5d7e4a1a77a81f0b2c0e02c935a30e1db4e192078a10e0e63360fa80a6acdbbc7379366ed67d72875dd44bc2b7dbe57bdcfd5c18e02c19e4c7355739495f9f507c215dbcfd0e7047198bb814bb4d967bcab7823484aa3b1349243fd552876e39a54649218ba6685465917ccaf26ace03182b9f9798f9c320853dd8b4ed3449c73eb0bf1b93b9434b204e91298c651e4f692b394eff8eb9ade5169a4300b51e4bc24812a8df0041efe8e57f20a392c80d4376377a26b97d52edaef586385ed345a232c6ba60676537f82aa660bea58404d13b3edd9dd222be18afaa5a040f013a2422f8a1bd02a43e89174afa0be18b1b67730ea98e5c0b0b009828979344123d1bce889fc2df2ce96c189b87ec3bb78a7f30c21d3e62c3e22c4fceec39e618b919e23e4df7ce58520b43c9bb00dc0c417ffb70cc77d3ba2f008155869ea631288c230055aaa3ac17df46aa161ea7cf83de18fa638291e6924a20d7c83fac5fccd1183a8eca260c843e69a6d884f688ae5babefcd6f215ddcfa02f1af4997931f982b7b941dfacce487116fa3dcc39df476a5f1bd74f0893f82ac055887162be67a6071240c4aaf935b1c38224aa02911d3f5d9f875fecb79c14663abccedf9bb4fe53326ba371387185e4c7acbf0c40898cfb1629463410900957822a2c589c3a071a6fd7d8f6d246c85032a22afae5620ce34a30ef27e7d0c748a86e4c622d7228be073fcfe2c1b928d114a44ffeb23d9281aeb24ba0b8074a63ff50c8091be7d0b40810019c1ee358215d5bd463cec5022115f82434b97d8da5dedf4475d42a4dc7bcb24651b0bac0a770a1983cff9cc36187fbbddfce8e6be9b7bb8f9879b7f70e56fbe804e2bfccd47e814e7370f71f3103aa5f9cd45b879159b1b8fc3e16834af9589c3e3aa35558fdd07e3dfad34da0d406d98dcce9eb6a1043a68e040d204aa091530e876c7077dc3c76a585855a9b9f2d9857295d891cf18e30d280e9706cee78c8739dfca54ccb852854e525856b63a7295182d3ee79cd3ec78ec25de4a63e6b19ae1959a388ffd08d3a1618cb13543e675e62a0c9a1d9f37f89c331ae367c7e0735fbe95d9fabc65a6c98bed76e325adbe3c0d61b164254f0e05543161529a712769c753c6b79b014a145d26c5ad7e3dbedd6e189341f2798b0c9cdc99b41e68798183cc8e28af24387255f398c9f965066ce93316b0af6ccb85a1e5fce5e3695ed268c17ce3833621365fb82f651a8e393e1fcd02502a61da04ae480cdbcc08a2258953054bc4f839bf7943e2317e23e5b1159fa4d2866412a4abe418f20a0e97cd1c7bd2c489040d21409a7096f8186337790270451665db4084621a03d06aba4f2785c3058d465b83e585cd8dc7950d90221b378f1d436d33e573d5a6ca8c8fa0abb1246598821e7b081f8fabd27ae5c6cc6327a1d322318c69fc52930eb31539e8e40106ddc6077d3ef8f6e531167bd2414c4d18a05b965763e4b39739a39fafd4847d3e7af3c47dba7acb345a1a168fcfa4217b5c3da05a2e28b2c78c9eb033f90acd92cf46b73a345a99175f5765d48cb932a3f521841e544b72500d9128d53042a5f44e336c22e9f075b66587123249124b63c40fe21e2870da2cd14ac144546f46c6d068345acef97643221f9381e101bd2233454b32280a0e870383072cac4bbedd7038b47e3ddde812e2f47487c58c0ffa704d8f71383028acb6c0681560435152c5ed96bfb68c014372abe816d815959cf38f9b1bb71b1074855645b78e5ab06c7d3da5be217b63823b93345afe916f372e61babc8c78e0c5e643971e62bc246d7911a3e54b11f40bb1ebf7a546c9148a2c7a9c64e06c90c7651aad2b2c6c6b0b514c0d0b758b8b920dc7dcd13ffb7699e84ce6fcd6ebc096bdd6a0ee16cc7f33f25c2f68d4abedcbf5bca817ccbb5ed0a6eb017138284aaa5c4139c30075410ad2159559b1aa001f6e1b3aa042c597215627682463e494dc888a5c3dd973ab6ed5279392925498c007724e1d3c37e2ac100eb549fa7cbbb9296d607969baf1b809ce4fb149cfe3a2d3d1c3875ce7739e71f6d84b8c99b01e57a1014643cd98620d2d31367ef879a36cb6aa1de9721e7b60281eb53e7315bf6454701bfe3abf1c67b8514ae14ad3d90f3716869091295f86b714491863eca54db6c1a1d3058c172f489030c018db30c6381e63ec75e6b3571722063e3048d8b96222b4e1e4852ee79c8f8cf99c73ce39e72d25c0c22ed882c70b972e305e521f72ce395b6979726347ac441560d05d7cd0279473ce432f9f73ce39e78c054d162c8fc3681932c6b8e2cb5866a8168d665fc5aeae0d8a4048c4b048c9b0a1c28b2b5dac70edf8ec3eb9c865f6596b048a39613150e8a8e222b1149473a693f3d6632f71f1c863240c0314ab583953b462644bf14a52175a972e396810b7903c5af81c198289180ba1f3b9a855dcb275a3836e0414316eee1461b18788d1b2f031c225cbc5b19885e6f6d96d42ba232f401737596c8a1021eb5a1124b58415e473ae452caf0e741baa4c2466f6f84ee4b97acaba326a69629580683a308d8ad10c635cc318b309f2f84c9e66345a918a89cf58cee42de70c3546c42bcc96a4996c55e4a524548f0f5650605caa158f227b7a48e96eb73660707ebbe1704f61d6e4d07aec423a1d381efb910e398f7754f9f2a081302e1370c4cc88534c2194c7bc3edf6eb71b10bf81c70b8eae0e38f48cf11b082484575a9c5991630d8a9bd4cd69bd33c93bcd6e3739a80d276a9aa006d0b4c5e8d463e70425b57282d3c1e31b431e7755dd7c8e14bb8a5bc4b0ba4e04e59c935c9f6f8ed26eb4f2b35b0f66ef993eb89865a94eebd3f8d2aab1a3c699c77e44eb9908b2190e8dcfe82d67195d1e83b19a3104c3d4e231d0e3ea8464b283c4c39ccd4021c3900053e3842d91734673b5da3263001d605645330dacaa04d9e2010f2b1b2d2d61a4bcca109590b81046a355c5113e9a370061c9a1860c189aa92c9b84436952779e888739fb074da399e99005e05382a4cc9a275e35d4ecc9e59aa15028988831ae82c3e2f397173b60e306a3289a638c13728c1d0fd00e436bd2603144aec4b8e1709ae1c6a24eb3337926cfb2d3ecb62546f839e7937673df0f3a3c7b7cbb65a84ca35930753ee74cc37888faf85ae306e9e50b9913ac07fb608c693713872d17efcf693429da141556ff7caaacd3b8fab74bb24ef3a21dd11e321b2bb00a4cd6672ff339e4b953f487dc56f5434343ee1b1a1af22ae3b1078f31deca92e5b196198ffd088f00e63cd44a68156b03054f18176cd084c98363c841799888d26858706461410ee073467bb5986d238c64f9e215e7848c2dc37a5681caed06a5658beb0d079b9ddab31423ca4d8d2640f094c93828edcad8e79c3fe7ecc167affd6b91339c2b9f73cee7edb6b51565eb844d48e7e2b11f6d15bd3c760c3e1f8f9dc35695358f9d834e373cf60f1e7c30e3b12f006f5921f3d84500d169ddba22f5d847e8b456d5e3639ba42531aa73dfe35b11298cb15d3ae16509ace8b3db3a155a2afbec479d0ae073c6448c7d3026f3ba398bb32f2db86c60c363558ed2501a8dc51143ad9211794c7394c6c3441a8d85100d407850c1848a870d3643f4e03b786c0b9b6d50b19654ec291322048a123be60230c6678f511aea417c4ef5309186cdbaf5ab155e9fcfae1a9adec73bac48560959912a575399545675a34cbf4ffdb3b5b134bd2c766ae46636bd249643b31f61c448e4e9860f2e709800cd2237bd149e997e939deedcf43bd6697ed3f48becb4d679d3eff1fe4640e12155a4326a71720568dea2e997aa539d9b3f6e53a7446efa65eab4c29b7e8533def44e765ae9bc3922851e1d554d3f5a2471004d6f6473759add5c4008214494609550bce9f3a65b615b269306154534dd56996e914a6ffe88753a3466cbac99e99d5491942c50a3cd19a41e13617680e69c37bd894f6f7a53755a7bd3f3fd81608f0d33395c8445a68065616a42bc1ee7250e676454542404c8df32fcedb6dbe9745129f85594161622a2e1fd65a820343e6bf91ce4cc67f7e9f4c3639c428c3fbd3c5318f3a7fb74aae1878680a8f90b39973b935740a45c600ad12af6b6787f673268f30fea1e079df7415f053cc4383ba6f31846fe618d28bd8965844b832b2378b65c1dc102769a9d5903579ce4a851c3064a4e4e461228265ab0a83489c3c1cb70aa06a8a1e82252feb492e177a3cb06182550c24cc1a9488ce7799a5752638fb70879eef4f6426ec3f342b61712729f90901f09391236044892a383ab245e32785c0ad9e1fd9dc92b9f3643a03cd6e031367b76cd79d638cdce246ed1e3cfdd9f274651de9197999d2c481e4f5bc93f3fc8c1c74971f64eb33379c2b95d21c181cfb2a020b7817d5050f6a0a0a0a00da6e0f182260a1dac3260d09b0fdaea3af241413e42a7217450d0d89ba6d9810de71fedcb59a453a876b0d8695038dcb3385c2f889d96a3f20fdccb51f78319ea08688f5ea82235a09a9e917294283343d17a41ddd90b1e6520ee05f3f0ed96d1c6a3d9669bee0f0fed08162e8cfc6053a585d40c6030937dd006743bb3c53ee504538b3753c24c71736b617d73e64c16f1f2048a3069d8a9ade6b9e6b64e6b2ed46985afd5fca8e6187c1e3e7ca0e76bbe804ef3d7bce6228c10a256abf90955bee628748a7eade656a956f315d4aebc5250a1d1b8b038c01597addfd774005dfe2cc09fa715be4df20c4527050c362978344931b6e69833d49617176c29e2d3e1113580342529620345538c36f9acb940310f13f110e32e341a026e93b20d6dc48a94bbc7a32d0a797f0a10e3a20ac712d59958a7b6cbb70799755a953aad42265b53a7edb6a7a0af9a5e27d74950d8b707710519838e1549e86f55f1db8392eecfd644ec5aa2d245c309b03d48a9d3a0a64e6b54a77538154484f1ed41549da2766a7a79f0381b4b9a5524dcdfa828b16f0782babfea35a7c8238b4d12293380ed40519d5a2edf0e34bc3f0e3bda749995d9881303d80e44ecd46ef976a0aafb6b009c2d3aa08089a2c20ab01da8d8a9ed327a1ddb81c23a35bf1dc8a9a677c55d01f4f4ed404b4042a0a68a54e1db8192eeef0a83404adffe533c765ac53aadc932b34edb7fce7e9cd4b4e1c0f9a1faf61fa99fe10fb122ddbefd07eafedaec27ea1f30b6448cd493326f6c00db7dc43ab5c66ff7314bbabf6ac50885cd892566e29001db7f943ab55a844c3f4d9dfa7cbbcf574dfbebcb27ecdb7db87c8c3ec78a64fb769faafb6b64d0a7f8ed3e49f757c1a0209db0691167c909d8eea3d4a9cdf2ed3ec2fbe380eb28634a53978f1fc0769fa64e2d966ff781babf11508e5728ccace4214304d8ee13d5a9e51a4ef9103b6df7a1eaf4c74e4ddbcaea6c2c6956918250a8fbab585c449579397a395d01b6a3519dda2bdf8e123badc54eabd1ebd8693b1ad629faeda8534d5b8890a76f47975021da549180be1d4dbabf1e0651a56faf55dddf0862911a5774c894dcd802b6d78a9d5a2bdf5e3b22efef83225be66cb92992f002b6d7c43ab5559265669db6d7ce3a7552d3eed183eadb6b529d0e6bc48af4f3edb5a7fe9dc964ed8798594da926b4faf61a53ff6cc076da574d1b070e2e1aed58917cbe9d46d53fdc84a5d414353cf2edb4a9fe5500b6673b356d124de2ecdbf358a743d9ac22a1f7d74a4d82284dded0e952e44619b0bdf89dc588434d9922635b3980ed99d8a9ddaac81872a6e430911c3a01db73b153ab65f4eaf4d8697b0e5bb366290bfb576b3699541a91420b102db1274a929880edb8d8a9cda28095b2a82534329abc80edf8d8a9c5fa768cbcbf11515ca8c01207059e2e32c0b65492656651674e6a6acb94a1face1da774e9021366080c60fb29d6a9bdfac6c0e90a718c972d226380eda759a7d6eadb71d2fd553c778e6de8404993030b68ab844c4d9db6e327dc8e7fb463a94e4f6fc7434cac48b46f3fbf6a6ac18039c3befde43a8d54fd3b91adc17a6329359d431ddf7e4ef5af066c37edd4d45a599d7dbbd96e26fb57cd2a1246de9f2db2c0c60d25214d72985c01db4d62a7764ab1d36af43a7ad5f87633cc74aaa91522e4e9dbcda54e85bcdd149a4d15e9b4c3be4006122966926598a400db4a41dedf88205352e899522645460cd8364ab2ccacd3f6f2ac532735b5316c0caa6f2fa5ca925891cc6fdbd42456953aad42a6b2e9ce77856fbf5f354d41f5052f57a7356fbfc6f67bac48e5b7dfaafbb3493b1f595a5f8c71ccf400db527d8fe0ab87893234c25ccc01b685f2ed17eafe8ade3ce9a2b18718a50cd8f6c9307f77b653530e90391beb1428d92588351d1472ce60b17212db026cefa84ead936f10a672e820736407902fc0f626766a892374d421f3e48e8f343f5600db3631e236dff8dbdba9a60ea855965ad8209a00452d2716598a68e600db32f9767bacc9b2767bd6a9939a6e507dd63778eb3ede6e87dd1fae0611f757b55c71a170e2e4040d13d02ef98a2574614cc2a4a6071e604f0999bafcdef0d62b50d30dd567bd6dc72b020806109d0071d3256c889455f2d50b111d4db8b0d9b2e209b05dd7a94df2237834617d3183658e1422b091fcf9ed5998eb65a10474bc590296660a9e33435b8f2ce90ed8ef72463c0f28918343059409154880c17c24f70647160b6ea7c4ef769eed80f99dfb6cdd69f23b9d05d894d1d25a0363cc146b44e8c8e7cc48849985c9c086ca2051f5bb0f31a4ace46c0969a0b0456e3633b95caeb7ea28fd2ee77240b99c9e5c6e0e99df79b9dba2e3e4775a6cb95c2e97abe57246961c15151d1d9d3e7e5716e5772eb4db9a73e3775b9ecbe5d05c85a3b4456448990dad2c39a95cce6b9757ac64a8da2197cb55a4db5b652f7e97cbf9e472b99c9b209fcbe57259ced8ef763b0b39e9f8f8c8b11f61f0e112762a5870ec228c80f156ed82635fc1054a42ecb6a9d35b8fc7b5c7eed8ad14cf7155d11ab73c267aecf6d869cfb1db307bc68ad924766b76a5c2c6e3dd630c1c7b2f616fa66ec28e62cd1b1919b98f4dc71b195da5287b2323230c30c0e084d4171515159d30fb22172a4261e58bfca8d3fc4545bd5ecf44d7f3783cf72b132dfe820b2ef0bf70a1f7c15626897d2e672361e3732e94731d89339ff3a35c09aacf39864e0fe0b360c1c29e16bfdbed767bb4fcce8576ae4b82f13b3fdaed6ac0a3a3239c775ec3dc089b8a79c4de84b144724544e418edf099dcf9d1512fb8dbed76c5ddce8b8af4203f97cb610b361d082b60c4007b41a4851860d0ed900ffa70ceee8458e89d6646bd3359d4f3ac6503daa3dd2ecfd6e7bccc59e969fa5cd1a6d35589597a1dee753a5dce75baaa3065363452ea73391df1fecea45d6356df399adbe5725651886830c3badc8ecaceeb06f03addb93ba116a01b83a27374a7dbed62987d91974545bb5e19262ed115150df95d96db4f9c1d46be2be29d6667b2a8a88cd154a12843096b9063c0a038134b0a397746378a5cd72b2a2a6ad3615754c4cbb0418bccc68db1175f905146503a1d151b032e7c86c23643757ae1ad1b190989bfdbed74bda0fd9ddb7e3a12a9b6a6a8b91184a6235bb2f322477745bba2dd95900903cdad30aa2241e93c8410224ac051e369414fdbd168349a7be894e61c745ae1699ea18c7a735ea7d39dc9ddd58d1a8f4d616ef86792066ea424c9f1d1648a550a421893e179acd3e97471a4de7a99ea78782af730110ff1704b065565ea78d1252df62cafd3e9686ee214b96eb72b2a1a83e4755e766ae1756ef1991b2bca34e1b982ecc21608c618eb7ce7a86ea7739cae779a4dc9f51cb014551c43e308671a6d066cd2864f1ee730c6e713194fa3d1dcc76d4f923ccd85685b4ff23c4d83a7d172543acfed763a5d1a0eba0c99667f60e2ae878778972bca19e58e5cd70b1ee98c7011de618cb79c1887702671cda5d2e58a96836a5faf5822cfe772391c1191d6d2952722222272223f227227c6c7bfc73859f5341a9199a3d1683404185943a608a50b0e1760d09ff6e383bea7d1b0d368341aadf8b41c0f1373b91e26d6c1d168444429645d296993e66aaacb83bac4c571091a0e4c621caf98ace9509bd4f06ac2e6b1937045bc7aec269c80c29513a7c7be824e7f498f870988a2e54a16251e334a00511f8fbaade95117ea343feaba4e891cf52314759f07d43fa0fe818d477d0121748a73d445407d04d443a028ea278c79d451e834e851b7a85b25d451d0a9ce515f01ea59297ccecb4e3bf85cee96bd4e870505c60a0bcf910d67a30acba899747f67d24cfa1f36486854643cede6c306470e87cb5d15ada0384546a5d068408c3cea256a7565e2d12c5b6ec307b85ae4d9212cc3a3caf63051da1d9cc356564c8fa268a6eaf2c1e0cbeee1c307597c3e7b082dc20821b28b28e104b0cfd951d02991675fc109252bcc6e9b2c94d867dc679d67b752d9ed9425f6af027389e18988c2605c8ce2f41863fbb95c918ac5d3ca63d5976236c81c2e5e60aa8c9958010cbae5f1411f0e0a0f73b9274e47385b8a50a86c398595c0228448912063a0b482702b8870452753b88a4f5a00653499c7671c2e3741d1844a1791e9b1579128f605136940493039c7e170b90fbac8a4cc07ee2b4b3d5990fee6f790c127e96d9a165d56dc002b075feb902fd58081078fbe66ccbb6ef24cf38e00013b5a6fed0be4e31f345a7f685e3bfe1946e3a11dd8acfd01c1040cd94d6f9e50fb5ae793db67ab7936bd566befd345b8d5a1609e95abefb5d5042afee9413dcf5ed0040efeec6e34f941d3d1920cf34cbfbc2e936f427d396635c0de264a6635c05e1fc5bcc6d86b1fdc12e0aed56e0def6e887bfbde019ca679817c1cad3fa8df9cb39fc17b9d85d58077bd79d9a8dd0adf56bd92d5c00c7159580dccfa262f5b61fbcc33dbbf3ea89f3f20988e0ef13293cf873f85babbbbbb77e3656110b3200f662153fbaca5aa1d72d087cf3ca1f6d980d882f878ccd9661bea8de0c3f7cddabff56ebda04ee7b7dead77f3da3fb73f20dcfa478411dffd0158c4c8016d517bfb6940fe5a3b9c29d88ea074edb340745538adb911f61a8431165ec245ac243c9367d959d2896cc25115a9fc0c3e68fc23c49f6e6db787ad96abae8652089b8e1ebd9933709417d43dce504114ca6f137c9fc1eb0f0800e0e127fc23c996c19b32f853a72514fef1b62c3f83db9f0664f012d40c4ec3475c5691cab78ee75403e4a48a8ff757bbc8f0aca1830249941260af789b81e71275dee2b1b7192c8aee1cedc02642fbb0691ab18bd03e8c4ddcdbf9076dc28e27828a7cb317829d6b7074c7d3e018f0343c5a7f1aa0c1776ef2768ec33906bca07d0c70fed500785835b08e0b72f038e7d03f7c749c078ff30f2a1207c7f951a73cc761e854c8715e3bc505857e38c739ce73a73f8e737cacd0c3c37c3bf4cc9e0dc45f5fc1093e133c7cf690f3dce421e720bee6262fe8014369a305f1111ffdd6a3396ebad683821cede16cbb466ef272979785b9a984cdc883596894993034755a83b59e091edee807845b0629fd2c8704206481c7b30f94a134707b815bf7e078b8c1ed060feb94003e80e36fe0f507840dfc83466ffdf0419b9767de7afcdb0b81e93ac73a9d9bbde0e5053df8eb9917b47dbd7686ca549d1279cd816c438e91728ef6821f4e1f45390915e2d9271a6aaa30d4849f3a2572eb188a68e8ec612b5dc8bb857840a6ffe478b576085623d60bef8737ddde7a2803fa07e0971734c183cf5e7393a7c3483113b6ebf54ca7666f041e3cb2d39adb1a3461008ee21f106a25013c787303d36d90d2f14f0b3c0016b9bddabede87f699de3c5e7d0d7817088067bb1a4cefc0f3abc1741b4f84f699ce8117a27630dd02cfe4997ec433dd88e77561c70b56e49b26af1d035e7d1ccfe701e00dbd8817cc5c6f7d03cf04e507f151e7f3417cc4f01a78c10b48107cbd0fb6dc99cfc01381ef01d00b41066e9e751ae44b6f474c654de9526669ec0ed0b6c9437dbca2d9447b35b317bc9e817f70af09bebf51bc0c7a18785b50a4746fc2c901e5f8c5a24ac5e76cb3e974ee509de24dd731f6a663100223079b2c241222405b42ace601286296acfc206382224315181b0d27ec0861c24394229ec850228b8f085b787624c18a91078a8912604023a8cef0bc6043440a901b257cee77cc666dba4e6fc530346c6fca59cac2513643680507b04964a84e832e7cd5f4fcfaba10f6ed17b83ab5e0ed178c178e15a99af9f60b55f797851dbc504cbabf1129e64051caf2854b8b52a71784f757c5c45022e383c51e357480ed179a3abd00757f236248adc93adb03a6041560fb85a84ead9ee1d40562a7ed17a83aa5d9a9e9b965cb9885a405b3760bc8fbcb494962df6e01eafe3a60234d18185ce6ccc8036cb710d5a9cdf3ed1686f757c9b87849a27842b19404b65b20766aa1eafeda45521996ab2d3cca00db2d143bb5788c5ec74edb2d845970aae979e5ca5b0f5a78fa760b4b1684169a2a5205fbf6a3b3fe65a8a08513df7e54757f950a19ad1373a6da4c4901db8f8a9dda3bdf7e64bcbfe09b3737d050a1e3e609d87e74ecd4daf9f623e4fd8518b3460acb8c23759880ed47629d5ab3640a65fdc3c0f62327353d912039a2faf623a9a3e111b122d5ae6f3f82babf93183c8afa7623e4fd8d68a1d564091d2a394e8cc07623b14e6d9d6f374adedf08e2992a643e7c684d6d01db8dcc3ab574befd28e9fe7eea1cf1caca3285461460fb9152a7768e90e9a8e9e9db8f9ebe6a7a3a9d4e4661df6ec46564343a56a4aafb3b4fa3e2b71b25dddf08296651685c2d55113b036c3752ead4967dbb91f0fe3c881dcdf60811c34307b0dda8a9532be7db8da0ee6f047b9a0c61e154038d17b0dd28aa531b6738654494f1ed46549dd6ecd4f49471ca38fbf622a8fbbbc093aa276248a65c0d81ed45519d5a38df5e34bc3f14da24b18ac1e30d1e2e607b11b1d322253642ba70308162036c2f2a766adf7c7b91b1d35ae5a5c4b71779756afbf6a263a7ed45619ddebebd08d929cddb8bce148d25cd2a1206df5ee45453d38e9da2a76f2f5a2a12163555a4deb71725dddf791629158f9d56b14e6bb2cc0ccfb7efce764e6a6a922123b51bee881589f7ed3ba8fb33c5c4765162669d56a54eab9069d744e7db774fbaaf9a9a55aae8c2be5dc7a533ea8e15c9df347545a5a64e6b54a77538a523caf9761d55a7d74e4d4d2448cec6926615e9826f2742de9f49248a7d3b11d4fd6138318a2439ea99c3056c278aead4927d3bd1f0fe545022693586e287972e603b11b153ebe6db89aaee6f048f252c5154e8a0ea6203d84e54ecd48e1989de7c3b1191534dcd21439ebe9d68894848d454912e7cfbd059fff090e8844d78040c953a5a427000db878a9dda36df3e74ecb4d63352c8bc21a1664bc914b07d48ac53cbe6db87925dc67cfb50d990939a9a31cc184354df3e24d52991b70f0d878815c9c2b70f41dd9fd9141c8a1ac18407970e26632dbaf000db73629dda35df9e4bde1f3a74d2c3468e17142fc0f69c59a736e9feea96a428366e743449a10ab07d48a953ab46c834d404f6ed434fb9af9a9676ec847d7b8ecb73b963453afaf65cd5fd9966aef8edb9a4fb1b41e498b467e92cec1805d89e53ead4a67909d02033c423862b0b0cb03dd7d4a945f3ed39a8fbabc7235f80505d11a9d102d89e8bead49e194ee5889db6e7a83aa5d9a9694986ccd9b70bb50b25cd2a9211f2fe4a3131a8fb4381486389110c4b1c26c076a1a84ead996f171ade1f0496a4d982a4cc112c2c60bb10b1535be6db85aaeeafb6a952448597a72bc51cc076a162a7968cd1ebd869bb9090534dcb2a6515a1a76f175aeaf4e6ed4242a1a68a54f4ed4249f7571a8594106066c99528268e905d01db223f1827ce160d3b71c07e00db71c74eed986fc721efaf8601f35182ce8b143e9a80ed38b14ead98649959a7edb8339c939a964890e0a8be1d27851be2881569f7ed38a8fb2b89445c9458f2fe4ed0430a4e5994122a16c0b661be1d97747f208cbcd1b1c545d29738c0769c52a7364cc8846b52f2edb8a70a5f352d9d9cb82a182b1c2b92eedb2b54dd5f095556282a35755aa33aadc3a90ac41fdf5e81aad3203b352d499424cec688befd86bcbf524949ecdb6f50f767bd849991f16ad2e404d87e8bead482f9f6dbf0fe4414d991e28a0a16a53060fb8dd8a905fbf65bd5fd51c0cc8c2f4f6cc4b15106b45f46af6317a86fbf85ddd6acb9dd6eb7a68a34f4edb764f056757f756c090b0a070d266656c0765bb1537bfc769bf1fe46e0c0a251a2ca5186121860bbedd8a9fdf2ed36e4fd81e08d1c2625322536b14ead97648e32b31c67362735bd5d5d36aaef5f3168811d91fbc293504836db0411c2384208b0a28a72ea4bf39ef7bc5defd34f29c25802928412c0923619b5f39e8044411205148441e1a5b22cadc498a79550059a2cd6fb1361330bc2a7155196249400c6ec6aa87f7a63b357a227dc1fdaab65d983b183569e90cb2a66336bbd13c044655ed9bea5b2442246f6c409c889343f806593288cc2894c9e8042ad6f46aa870595f558e62f515743cd79dae06e08e3082114e005c4fdd53c7a2c74cd65fe326b0d35a935d4570098526ba85d71145d9b999e40dc316506aa06d64b5f12e43d2bd61aea4f01c7646ba81facf66110af86fa656904314215fa5a75e6e4cdaf55aa80c8480155044f8a143488658ccda4cbe9cce909b9e28d19e05d52eb7994612b8db6346bb5d52c2ff2abb7187af3d0d449f29e22e6edde71730c2a15318ef0b0f2062acc54b1cd521e1d41a62d4b5a5996e5f04b339f3cf269db63039b20708ba62f5dd70b9a1e38e4b39745f808914d43849411e991a524ca97aeabf2e599cff3045a0d2e2076a83c41a3252b0db04c12a44c7284e40928a07b48d824fbc304453b89cd56a0e5d9ba85ec8f4ff5f20784d2963f0db05f3b542fd91ce5c9a1e5c20b161c302418a318c7b175adb5ac582d4290081224c985860e951e86f8ebd5f75d96d883d5ec12638c7bc1ea67ad26f8be36d65559bef01184a6d564bab875f932b184e6e1eac58c37bf5ac510434ba2e6f5928476deeb20da77ef35791cda47763ddf3ba5e76f791631c18830968024814d9e29a61430d8d81d25514f5d228c252049a893c4898c5a35be294362c54b091b06228c252049980367d8e54d79c11ab22363636c17e6b4315207ccb4000219c238029b35465c74d18e44184b40924096a6c88e2ad9c88d19a92455b42211c6129024902189604195442090218c23ac0133044c8e2111c61290241c85c8b971732090218c23887511d202154a7a45e130716cb8044142c7e706c79842d59a1f1b086408e30871b200c922060d12612c014942f2ca0f315d3f4071acf818cba89b628f3d513510c810c611b27acc18a203d3c6ae7804f15aaa9d2090218c23bc9102458c934b11c6129024b8a1da71a50dbe2068634e748c29436b11bd129024d0c898e4807372115396277a9e6b96e45012718aa0f5781cda67db9ce7b9f594a3e76b9f0812cea848009549e547ea87488d73962c32f448e166f5d949ddddc2a651258b4b9c619c146a513ef7b5aa4cd45956b50c6003cf7b6b2befefe5b57f08ba4de099c0eb1b55cc8f1958eebc910383c491aead9892822e5595655926f9b4701175e59663cc08579725c3211311234b5e96d45c1637cb8496f33c216ce19967d42f556bb68a7a884a538ab870e18246495bb146cbc51695227b681e420011e23a06eed58c1c5733b8dc6e70a04b528519333079aea4744e1bfa9ef7de5be2efc5595794baeca4ee6e21569165054f912dbaaa85d3a840b307fbb8dd10e09de4e3c4dce272f6293ccff34caa70ecb393babb85403bb6b2fefa7cbdea82e7de6b6279f0a1bbaf99a9d8aa0731b8ce34fdde7bef45dbcf3358f66acd60017862c24891889c316486446e69aad0985a4362c5d510183460d87c6bf5d2daf266db421e8f4597d38c2e6472824cb510a1edb5c056bdbdec7b5ab32cb7c810c2494a014e95ac17512c50a59f26215da6c89059ca5878058933432b0e54ef6bf16bcccd5357773d1dd75ad65a4b146eb6f6b86104103855a6b8f898025222850df5be2d6f97656951e8d3dab037c4234fa4e0a8920c03c2e1db6b3d7d847ac1d2ade39ab15976c93381c357efecd85e191d720aa01aa7d10fdabd5a627f4b5c8d3a686ec0e892550279f5436b8ad696b34fe1799e6712eec9013c744069f1a4858a45fbc8529395752748868c2c2d3b595b4ad926a4cbda02529bf3734589048df2b445c169d1a9c224765468ba978324b0b1b256c3042169c044c142f4c2a2c7300bebc9d9a7f03ccf330901244e28dd7b2f96ae0c7774eee3e0e1e86bd18c989f373e48babb8599c94bd390283dd0882d358f241a49392c00be16cd34f9a2af453339b0eca6704c9d152de9615322e4674896c1b0cad092250d4cca80965efc051a0e895a30d99222a4244b51d50e891e5d121b15a6a66c4c88e4725850b2846149170ca6be8c8634764ba8869888c16965b0c40e062460ba1468132b4a84ec9284f1610245d724c9518b24477a4aca6040f254124d9dc82971520ed1a990e4cacfbdf75e2d263afeee59faabb3d2a2f3b7af565a683eb0406ba7beab01ab8a8a3835948afae165afadb550f7c996ddd4be6aad656a5f152e29d9a415a00085134c2881045b59f682a6d9d5b4057515d13e0ce48c438c0042841016f08107f643fb6ad933edadb77549d69080aa5ecae098c205650a2c09a51312e57fbe16850c6300975210f5a0d983acb1a3ec9aa50c72aeb02f84356cf75e1d72b05e9838fb149ee77926dd7befbdf75edcd7adaa301e4bb6a0efedd5f2635e0fe6bd55cedba7d15746f1a181a89954c2b2d072c6d8a7245196582ed47ce9baad2a2765d94396a599305fba5009f475ab8ac8a35fb7aaa0ce5bb342afedf6a9b52cadad6719b4b82c6b2d4b7bb1ec387ed149064166a500ec1c3cef12b700b068d1a30e942d5a5cfd94bf8af8d2add5e576b43d02958782f9dd337b65694d503e0ae61db4761a2c6defde6b6b366f5f9f7bef1d51daa6e3bc0c3417b5cc081c2a46ee642515f75e59a5f93b42889792175b50c92830c08b83ca111819f7f5ca8acb037dbdb2caa2e3f556fbb5ab5d0266a66482ce902253c61b7196887859294391a48cd389aea2c4c4b79183b1cdca9ef6b56807aa042ca68c39dd0932546aaa6e8a5cdda891828962940d0cbe6e4dc9f3b5af5b53e494517db69f370594202df684c11162d6a20695ab61d937b07068f9d2e4e907170ddf94bf1e7c0ff4b5885c510a216321cf9447bf567962e59eb706658d279aa493325671487797a50a26497f5d77fb9696496beb8a0aa35f8b40b03294b5b5ebdabd3d3865dcdddd6d767777dfbe16ef74f921668c7befad1dac9f5e6bee9efd6aab1d7afd41dfdb4c68c510f4b7446f6d5583fdd55adfbad51d75daf7bc2264db4958b060010688b2223190570d20a26a60bd28a6b3c5f0206cf567a9da3192e1a132acf1e406539e3b55fef682d9c4263645dcdf692f8b7b89e0c9b245b6a28b590fe09d11a768478ec96104a408127c453bc717fa5ab483f5415fb25c63024d42a7c2d7221eb02fbf16f178a95940beb2dec8e0c2046c191fb459e1b11eef3173f86a3b010e4fa902888c3dc72c245470003b46324899cf199f63e921d8ec3720df4cdcb6aa246923c5c5501492a8a707fa5a25ea0512adddf89eb7bc19e37a96f7961e34cdb6486569c400fb1c3effbdbda087f7d5aeb576add5db47567bc0ea234e8b51542f735760182942a02c453de92204aa5ae779b298927563c2155ebeb02852c1769e6ea2dcbbc204971145d43019b9ba96b8c860547833c74ac948170d5c5d3366c468813c020c7abff8a00f3d61de375f966de2eccfd373d69fe709367ffad18942ca9f8ee1745f0a187f3a874e3bf8d33d70f02145f14ff7e0031538fef4059c1e820ab23f5d846aac0d4d64118059af5c81194901ab4e1daa7661da4c936cce9b198ccc66ba7521c750a2c99fbe3fcfd3aac4983f4f134bfecc52a48e8f262a6c94583a2d19d24ba03df17890a166e15875603bdd47737bcb4cebf9da97cb3be6e83c4fffd0e9f57bad48e478d3f27edefce98ea17f1598e54d7cdece9366de235c18637c664cc3358c7a897aa5f5eeb54a8a02802d8ed4f14da3921461b22948171430985ba0760c8563c7904fbfbd1367263d3f4f20b3fae90563ec186cd51e25339fe7793a690385eb8594539bb3599ce779fa87fbb39de79973ee9da7ad17c4d81664f6dc87c17b98773a06df79f67c1e9f7ea8e46b99ca7a1222c3d08c0800000000e3160000180c080805c3711ec7594ba11d14001353965450584613c722d228096118c530061140882100184380414aa9aa6a00fa02e15cba740bdb9de27b689cb616d16e0da9b8cf0e696d3c9fde8a1aa36d8dcf880b1865b918f24f7a6c7a36f06deb9cd8db602f7fc471bdcadf10fee52d4fa005139864e6154cb5ebb7a77c589a0d7dfbf3849cd2ea5d2c590522176e51482d7a012b2441ee17d47761597b5a807a334b53af2b83a106e2a4ed0e9986f557ee271d6e010cd2f1e41978f8d5020cceed0325ce36a67f9bccc36dcd90593770384cec3766db5f5e1bed8d174a0e501e566a5e1a81f7dea2836d0278238791dfeabb151414ebcb80c4175cbafd1c99d8d826089dda287d3d0e8836383f99798ae82c6d8ddb562d6c084f4fa793fb7c1aba16f7622481d5cb8adfddaf3f09e1f8d8c5e6a5a264ef3d1cfad1084b99a274554139db02a15e441a24bbaafeb1b04b0cde9bc58ff2d4b91987b10ff8dd911a9894f109cfa9269a93884aaa8d4c7897d52c2e2619ee8783df41abcf3784383cd190b8e309c365826b482121134171bc3f352baeb6707acfe20de8f380596a82a9f0de11af4a46f1042d06602a85cab1636f5e490c8f936ddaa2c45bab735d93631aa70b22bd34c2449d8b9829ab229a7bc9ef6250af168ef6bca86321286305d365c83fd83730a69b69725df5bae0f0749e983de8a818bb61a1f12a018654b9ed034ff004fd6c7de1a6cbc51c5fe709987b222464611187b35b2ee2bcde923724472c7a002a645c825386572aa762d12c90a07609be0e40cf04562809dc88054d5230b08a6c313fcc0c9ab911ae13c42616751d762e4309bfdb70bc72e8f87dcd7410c381a11e42489d1c611d4d81cdaf5561d12bcd938ff77692c73b8004b5746376ad4e0263eb50f7acdeb0e47f85c381d243e77e07812a45e445806af695dbd711f1aa69e1b85d927c92ed490a2fc617ad3de1830a1f3887974fffc008dc65c6935a1c77e3ad8cf12621de22d7a8d4551a29c5d1afbce4f6c048f867eec90c6eb834ad46a6f5dd503c6f7982847927743ac49a3176ae038e3674996890c7c85e42c4182b84583e053b4e772eaee0f2a143fce55de0b7a2ba8437ffa6a92c6c89a5b8b545a45471fbc6aa5bcbee8f23a408221380d374bd57a8e419b736ec422337fc40ef5bcb0c267c22848ace350835b2c40d6f97577e97946cfc0ce894554368624237380655856970e4d408134f1b852b302c1c337924480c34a187ceb351c2328c519bf70cf780d99ec22106b95de9671623a22fdc77213320973291cb0342ff873b1e86039982759eb356bad6ad8050073d6ac6c5a562eb8cad0c83a696fac399ab274620e8b96806633a52acfbb5adf7147a2615f7ca0c9a271194d297d609d2d7868f14e09494793405317cb7b7ae8ae3370f4888ad8e8d2a36af84b965b3d60331c759e83c16c3c9890858de44f6d628cfb6613556d2ccf131bdd2515251a988cd2bd004b242ccc2732ce1908e73ee77e63a0752c02f61b3dabeab8b4a0b359ba0b98aed0a453eb6ba321fac98a7d38ad8d9a1ec64ffff864e4d64b17a1339ef926f0216ce0eb474fce0a9889805de421c047dc36cc096154b27feea56e3d37023ad432c678a4eebf8d148d5db44055f66b5ae22e35692b97c699b8a3b01bc6db28133b9ef8c5e94409a6eb9ea5a4ba01f010356a74988e83a33283bbd13df183705787c68795b228795fc1227864a51200791ff74d13ac213e3fc5920554f47e78860e5a3f19c4c509dfe64f2ba3db5ec17e56489a54014a7d270d730829a0edab0ed8c308895dc189dc067b38ad3c4cac91aacd83f203b4ec719f9e84d0e7c4a84233b50fc707b55f901fae0a4caaf05b8174e042c71c26dc8449ced05a18f28d027d764f87e7a1f4fb377d97320d9f9d1e2965c1bb33b26b74c1a35916a726cd0746f803fe8ed3143a6af21577335c9c15c51f173fdeecc77be7f7162a2015708b1af7526c595418143ac81035ba5c7889986d70fa9c4fabdbdc32641758882e606609b72794ced8d44f697b141266b6abf41dd77f9b71b3f08a5d243dae934d82f0ed52df82eac547f20159588989f01fb4e3bcc827712ab94ec4054d7234bd9700542866893e5f24f9988b87ba6e3e02748ea541c8c6191fdf91b9aa5dac55b2863a82aa11ba39c1e40aa43177836649fb78e3178174695dc11a0bc1e018a43149135601eefcceafc4ce86bb39506a2b749fd05ef0c551274039ad703a46ae8423c437473933b06752aa0fc9c8907a70ea03444a1c001b6b9e4dcc23aebd27f2df0a047450eb31937b85d422ab3f07da02a422792723c22280d51446c006d2a97c6e41be43148a352114e1a429b9423beb40d72acd2580945c60c58cf768eefe214a2520a950af1a301be75e43ea4756bd05e9cf88b51c3521dae089a21f76a772ce477e12a851d00e5f4c0521cae509221f3ea8e2ce764469f9d8f61f08a078cb0783770f81320cecebe33f844cdd4c4a0d4cff5e89100b51ce24e96c17235150cd1e96274c73812c977872143e65e7e411901aa12e8c214c7034bd57045ae86c8862d7f0ceb5420ff39f107428d47691891b541600339dcd9c949cc2d4c85243b8779237b89fee793f8d6807b5d3a7fe09da04ac1f60de7902b211c104e24b047ca3fd3c04c622f31004ba585902fb07961f781713e1827dbe28cd948cc67151846a0e41f74fc8549b5d34d7227442bbdc5a8520200d5662871bcc7020050e50484e157d88b9ec1c9437a77b56bdd8478fa8be9c8a79c7252606f169cfeba5f94d1c683d02cfaea15415f4e19e8c3efc4a0b856f95d82cbe4aefb9565e6da97831262e50b7054431ad80ce87f92b956db19ae6e4e2454fda9298b8caa0abf3968d2f8f30b7b9d85f4f196bef8e9823421d261da8da904b33e3eba6eef2638355ca7d262238adbd36e753e29b0789cfee7c68a1f31d17af180f27650a7f87b4afb52ea59d3af7e9ef39808cffdc234f85f9388c1feed39412564ae83af7d2eead98e7d3de781bd2250526486de479de4fbe65ba71ad6f72d205050c5866b17af9b04b5a06e2fa72d2fa603b1b1096c27a0329e8755bc3e8067cce89ddc73abb884e76ea42fd2a10c6eec1b46404c28657d458b0c7846080c510f867502c5422371ab8ac2d2d6a2d5e58d71621c182b586e1769d275b2e70f2bc48f543fb5b166941606537c6069f5698849a5cb13e9c73d890366578a6f9c3d168e6576ae5d1f6a3ee681494d501dc9a7406e8b87433a33f5e33951469220cf6cdb54b615c0fcda11d885031a4ef4860cb2b86aa81e4ab9e3b298693551d1b9c28db12e4eb7afe38c2a0e18863031b9dd8c2e1e3dc3d428d915659a69d49847a27b4eddb6581e9eac2cc41b06d1ae402051e4f0bb9dd99b0c82da7fdabb32af4d089653e7fc5e718d8308cec78dcbf12c8bd8729f1ee2d6092270bf8c221869cfc09070cad79f025d2d0d92550742ce38e11c26805496ab6ab10ce9c3536058d0a79531f6ea39cbf2b915a89fdea1027b04615845d0e2796d74df9637f317f7fef0eb582e7503311de7cac0ea39b926a14792ff36d22364406ae279ea5d910c8f09767fa628f3c48b2c64c749df3667313bc1268e5908bd54a0cf2bc2a209464b2cb0b00b002e562af1dd6b8284e5da237c8f20ae33aff629e5baae39386f27914ab7829105de6d28b33f428251293898abeb23a80d5b4171514879f350e9b2c9e176af2192eb97bb70b890686cf481ec338fa7fb89805ac0d0f03b6d452c250ec32ba3a27a2dec5ea1b5c229ed89e92f4714bb8f91152e63cc6c2fb202f18fc128c9319a528a94b829bcdd830f18427ae1c686259f60e1f4d08486b18c8a17798b5f8d42ce5e335b2637a83778fea8d73193525bc2ebaf9f7f3e56d69dc2848f8b5e52bc296e3b1f47623d5da2bd8b5fd405bbdd3a0f981f58651276929061a2941fe3d8c9c5d7076a6b9219d313029f94a42bb014e20ec78ce81fc5b826212ca7666d39be8c2b6983d8b392451348d58136abc15a4d4d7610d0f9d9880e625839c62e30c36d54ceb5b4d6faa911aeeb4d4881936956350c9d105d31851ce72fa3fad6daae0c8101b8929e1f5f3cbd13afc68248c2f0d46e2e96107b14fc24f6a9277845b52ac890f10f4c0d8064dae903e3994e4e036f2763d477e9370a3ff67a5c3ae6babd8e1ddea26eb36041808aba7ac334a99454d1785339547aa0b879424eb58c997e98d402e67ab48e26dda06516a01eb42f5716cfca3e794927e914250a98aa872265ee5a0a1ec6916c728a3b4e1fd3c4b009347f7b4b14342e04227f4bfdd762ddbd8d7e71f5d4cdf52fb3fb538b081821c1302f315a8439d6f94606efe0f8e6810d39858a870eb996f5b1e2dc3f3e0d4b02f57becf6f00f14659c44de54b411f813c354914b6e958ee9d2c2596f57481e62650590323463e59a586521950f95b98f0f7bd666dafea8c00c5d84e473b654de2d4ec92eed0bcd9b0a2dfe0e829fae591594b5902d3b9aa8815c1e302f241321b0c609bba6dca19c21df135c7ba405056f71b5914431518011c7ee3b90cb390a5ac322c188c6d87434bf256f31dbb3a30098198ac183050a10e6d27c3cabc46ac3890606bac273ab25b146c52d51afb9d7a891bfcb199311c52da6d7a2e3f8ca4304e096c202231eae6f511a8aa5114ee10e27d6d9c5efc1847fe03d071b2444d49cd249b46d42f404076d08a8aaca054bea94a1c2d2cc86f00679054b633c60ef9046a76e535a3650c6360e2985539f46d041e94539c45fa1a75da505bd2017cec92835fa14186639bde91ced2b55bc0071ffd8298efbfc5f7c376899d74298e0f494ab657bc5e2c21aa55784773f5f29ac20decc65c5c88ec286885545d4f1534391145da98cc1df244faeab2890f7401d0a1d5ea9d5a9d58ee07cbfd3416189650bfd02cad391bef30d0180261816fdb81b181bfa82453678bdd1ce3d31a52db1dadfceede85e656039b7a38264558245a5531c3480b19d4869c62433e16a29fe4e52783f29547f77f8588650a9cf8c148a4001e643290af9f36abc6f8d824d5f8152a5cae0d72913a80eb6d0e327d2dcf761a943f45ab103e5c343126a53c0f5e8061e2eb90b2fd0805e908e0aa6d857660a0b505b0fe5c2ca8d22923835c87ba140a1762bb37f677499bb5658be175990174351641c7af9e22e36fcb230412de56ab30a0dfd62002de2364093fe155729b041bb0a12b92598d82615ae0777c041d17d70f87f0b023da9801b8c47a8511ac60e4a0f0769a83dd695f25940d8532336d729b55ca13054811443ec40b91c4d42d90191be36432bc530c2ea52afba9570a83f2be02a6e173a9da262156197c4bb4b1986d52151b93a58625fe5ff0615af21740ae5265b30241d7b8ae0e9886ea8f3869652cb141642a51ca5e69c3315f3b37ab95e3a20da19720c9a9a58987beb220d46fda730d1451989c9c00d4cc269a0c5cccd16523765e7e8f387d47ab4266b151d67811f08d847b0226e15bed8ad24b43a0d1bd2a70a29844c7d1cff675825fd1e548306151159a46831b7b109fd5d6cf27a5c4aae41bac1c861a11655d9e04def82aed70f435b1bdf0332349a5c497851e3cebbd15e9ca49af99022cc5902a423dc099039a0c0d0131a4099500010cdfefd09b0c83a9254775171cf8801b513fa4c0703da95d200d44d04d6a7c51ffafa4ace439749a77b9f8423909f6cc30829808c6d989340e68406a00d2878d0e340a18e997bd2d3688a9597550059a5a29f0cd34300cbc9f7430f96cde1146900c0988dc78d1db50e84c1e4424a2f70eb9e1269e7ea594b1c3a006c9909d008b9e0a84e1646fba24e48b1a949b4763990c8435744019a357378a2252920d9d7b0d5688a54a8265a7822e96cacdb51d658f0946a99abf3a0e7b058f2a57ea0efc865d8cf5b292c1870693a54000e8bd3ef4e0444b6330c7ded8d78e0a0bb8f18073b659cbd30b4ef0d8ac9ab1ab8015bf944f8242e6114e1541cfba8c6276d2af43988978f6265744b856e1a5e53a80e068e4375709055cad8a88561beb42d504b84fe1152013a03cf79dd3a1adacfaf8545d5a02a1da36ad862f0878c9d795f0d812807be20a68da55840b0de3960b08b12775a8b6f012fccabb5260866e9acaa229a9c7384decbc49b6b4c026220ec6e42fffe11d776691ec7bc077e6c551611463d079aa115564f9cec200cebf2c7fe30738409d9b0c8287313d299a730afc21dfe38c4084be59a70000f5b9c0d03dd8ec8417fd95a1227abd17afaca58d9646a5dade936199cc94384b3835d9071ebd97d36c108b926e4807c86872a5d7a0a4907d5da70b14373729b9e7ac68c8ec78a97ae4b17388bbf14f2c8c977157cf18f49d34db0741377af5428062fb67d84c04e9a69da49e178a67388e66b24dfee17a2050aee3203a0263551ecd542d027af604807bad49fee4e58d48d3316bded578e40af5b4bba13dd6e00614f0934d6ad42922f801e8db4218a956dfa6b160b132db0b080f61d4fec188f6fe3e6f6fe8b72d96604f8eeb7ef0935374511af341cda226a4d4a08074c8235eff6156302ea434470098519cd1464a4cb5cb62b45d34bb13084b972ce2227ed343737e4cc29111565029c6bd7347e634e0c524cf7d35a30e6e9f06a5bf3c5b8bc5c722ec8fdcce4bf0a29ca295d8e967f010a64dcbe7b829d38e67da70348b99d784aa64bc78a1dad59ff5651e0b66cfe83cdfe998d13fb5133fc901b0f7d00f32313dcf9790fe9372f88df98d8b2c152331a61ae6d6ab44a6a9f6abaf0944a5e4d0ebe6c346b43a2e168592098e47eb31b5d41758271cf75a4384b22833f50a90eee228b0956da24209d7506b1bc807f0a5c6acb8059295d5b238cfaeafa2ad4f32c31c8834cfa25a092500b249aba11b7c05f87e64ca97d3a9a9cd12eecbbc659a4ba0d87e3a480f7b2dcd9e68057b5c7566eafc8653f85bcf36b10053c358a3f63010a0515204a541973abc43112447f359713f7aaaacadd34609d241b336547626d468ee51f047905fd0d483bcb19f9211bcb9cbbd5faa5796f707e346cfd61b3b470b303836e0beb2d2a4e6f7e4938bbd007157c7a150448325609befa561e816a149cbfc03cc2644c36e33f1abcccf980113007a16d30380514a21514738c1eaa343253537bf64ab1436c5a5f4e87d1601c8ef6498cd757efca7f20bd3905fdc60eb75acc045e62e2ad952ab967ab7939387cd741f795beab145af3b4b3f08571d1a4974d3c1173e9f6648262342253b3c14256bed250e04da5b81716b0fdff759f6a0979185fa336ab7ecbce6841671f84f2a02f7d24980a92d32f294b2130aa313c36a65e025b755d7a04d6106918d01b8cde574bb3723bd85888719cced1ee86b91d75e26e121bed46c7585d905a6323ccc179739da6b6dea11be9e7367e253472a75fa941e915c4afd4c7d058c645a13043972e1d690d2d0f5d0e8dcf7c58f79b16033bd44bbb123d397a4f2527475e7b7a4c7b7d051afa94ffaec3286caf742e4c18ebe8d700ee2db10f643fc7401bab495e3c7c6067b2943e0af70531a916a0d9f71c3cd1b60847b1ab831d77ad4b6e5aca36f4bc4345619a51f8812497936a2ebf615ed5aa610ea1d5ef71cb90eeb00be690fd0177843f93a8e3f60e2e728535d543b2ccdf6803fc3ba7386a32d47d7159f51edca39fd6e3b0220141261e277fc1a10817482429d39fa5cd7744cbe76fe29756037c968adca5d8e5ebb34cac9921b21f0916b5d3a01062f2df30bc3ef6c268a3db4704434294575609d07b47a06c26e2e92dfe22dc590b27b42a7f29edff168c45ef0ee12fe78d24780d35510488135af7a0c0c7e66e8883e7615c333dfbb08ae981adb19fc9f25108907eb1a707c47c20f6f245db109793b6e6832bbb847de8a6b8777149ef10392fe1e4a62ce4beee56817daa6dd9b2e03ade441d2fbc03d46b0c5658359eb512e822aa325f74fe1e277cc9ce3b810ecb91a4b37664f4266e406d19be8630e43876bc08edaad9b0082d173b57d37d491546d4ff1e90591894ff7a466e2c92f4e3e92bd11e295734abd4e097619c366114d451536aa21c0c439fac9411e85e3d219e7f85564a2ca494e7b987ab8b85148bc75a9dc5dc403869288f85a86708e8c39508d15d55069bd362ff49ed057de9423a1109302b3d0df54c64a489ab71b49f71ef0aa64dbe97b4c3836168960ebcfbce8a66e7f15c94d54f97d068ade03129a7c2479f53a158fcf8ead715a43db1285862b4de98105d01312c24e72d0c4b9b86e6b5199783bc365944049f235b4a73a0f653743c4acfe742d04e4a838b8530abd1e401a523d8af55599d4ae1caf8a5746eb31003733d8797d2bd9a3e6f2669e5519324690e38c21cc32f1c6df658e15ed5b0336af37047cb8a6c3c85b0b757819fee37652a4793abe7831bdaeb55a9452caedccbabf10c2a6dcd78fe47b15996b79483385656821680006eac8ca26393df04e594199391efe3d5c0ad52364f4b8f0d7a4fca01fdf5a13b53fc3240fecdeb5c101e5ec36170e5eb2309118df291f79170b4f45e6a39076de56a0249ed147f48eeddf4d70cc68cc68774cf2bb23f45cd39e9be766cb325ae5d5726cb8937cd09e92cc2f9158bfb3d57daaaf49544357b98176135dd179867c486e6bd0f91018f3f3ca4985c0afc967e491517d5763bac7a9aa807a2fad5bf6017bda1a7983a7720a0a657b631b03325cf7a2a11d2e25d297707d5c57b0ed642b6916e08b275832d4f0f8047082ce28d27d2f34b2650ad300ebc10580be20784e3524d4ab646305eb6d4aaaa40bc3ab5782859a4a9d7a9d127cecc3d1023caaf30102b882a411630b75031addb22ea82b863508501651c0f1c390d78fdf067e6736fc565a48b3b4db4bb6028340120b050a9e06e4bbebc95dbef6a41cea23099f36df6ce7db187d003a0fed6c1408f4bd7ef031ec4bb56a5454ced988bae03076220a655e96de759e7d759d0b3eca06e36b6b8618559b32a2cc29fc0d001004777cf398eba910cb8512a70e5711076663d9ed9dd57e8253314803957b0a778c763e164506313955b2766a35d8e6b1ec644a4930891fbce6670c2593fa7edb1a956806b7fa031ffc74215e43232d9cc1c80de8224dac88701b29dcae72ac518630ecb00a64048ddbf5dfb90fbff0c78126fe867d05fa6f2d705d4b1e53e7472cb5020c3d24327f37f45eab3d16e10eac0942f67986385cf91005e9bf8e9b626f7f9bb325f11752041db9e7a8a83565b536dbdb2dbd21dddb83567c107655cc131433d8b70db1f002e9ea5fd81a3f77fe89731879325230311e81f869f27794ae06afe0edef8b515de61b7030415f54cf794b2de8f1f807a4f1f28d4a76122916141444b0e383ccc02dfd3cb7e31c3ecc13814d5f94cd832c04452811546a6b20083bd294fc0634b65cea7c8c10f94bcc4b3b27b7adcc39f39e128af01b07f5ecfd0d78bbd912ba248c4a77f74975dc5a4e507e5487c2a42b35af33dcf42e69d4f3b05bb55789bc1e274ec71f7616ccac865ee6b7289c2f6859853925c47d42e1dbd8a3b1947851a6934c9e73671080907b4f32a10553c76e831cde8df40fbe44d9e8139e71071e653e616898681c830dd73523e619a3b41997ef4bbc66e4127e5a9306b514e9dd5d5586a0b45427dc5c3ca364f4e8240872f47986e40e8dd82fb77a422561aec70e1fa015e4ca203f499d8a3619686836e20ec41b47985308ce0fde911c64b855b7e29ddca1dde8df3978055dbf06d54b4a235829b46eea1c223d85d1a512fff3ebbae4a7f998ac806f33a90d5242115b46727c3939d18b4224dec107b7adf1a50c2960e218023e0ee081041656662a79ab50f4109ffa9d15820a3c839b5f0643b99012990a0d362d2c013a5a966ba2c5104be1a707c792f53a7e8e37ab8b6a425c0a40e92727da89881993d6db526271d565fbc79c084b1e4bf9c9315762c61f41694576767ced860b4e4f65c494b2ae84868f1b2bb184f53d314c1d6931c9056ca99ebc11b780b78bd6954bd756d59d865083102c48b9ee1c07aca4497a4693c558cf8a91e29882dfb31c7f5f62ec957ebdcee14a01b4f4f98b91e02da6de657a531ffbb51eee99daa845cc7ffdf1f49138be7a3a08ebe4c1ba2c25fa0c38373905953fcc9bca226b51ba1c8b88b0038770e6ebbbd3805fdea5aae601ce9e5846481c2f5b810e1d0a2ff340f20e71dc699f931230ddaebf793b304433c06ac3198355f61e045df24b2e19666949be1df7155d93fe34a2dab1e63d0f31a4f9a935c2f944d02d81b477ac2bc88f2906e864e9920b96ea9384c7c384e94920947be42dd14dcda6466cb8b1b80fff747140adb326db27910848bbcccb32183bc3792eac5999c205a006100c34e2772bbb5f053281292214189d501f1e588de1fbcd96b431bc055adff3e823717c1c507f6af10f2d511ecff12ea6b505affa408aba336c721cd0c07aedda63e8d444c9bfccfa6bfd7aaddb0534b654878a459db399f36c24e586a13f5f7f1f2f685fd9600c1ab67d1b4660eb90313e433028ed085465e39c8cab56bb70d0128ef476fcfb478b2d0e63e7ae05ccc22548289a3b5a3ee7605a146afde153e667f46d69a110bd3889050bff510640e8552443c32f6f0753a9bd21307d14038b8f1990669946bf5a834b6891592c89094565be080eb44a6a8659d243b700eca27882d2d3b1229cdf77bb9f87c907cea01325050c2c33bac2465e7617eace74b7e0fb1bc09730444ecb1420c4c180c3bc8de3ee03b09def3dd5194e748f501033b6fd4686d4cb895bd33aad633e92f2635582c8596f64760fc1f8167fd2b138451f12961a75cb6377b1e3e2ad7a5cf6b520d8afb65b098717c4a2d83ecd32004ec17d3f03cab96194310f47e862e8392ff0b5714aaeea71735c97399025ac968d3c662c866bd32a3578e4bf256ee3ce31e98e2a4736805819cf26bde042eb203a33d651fa88923aeea51ac17e48e3e26fe13ed91feb2d46d14f623ee29c502eaab987954a3a470c0340ca28b5477a4684ab05243fad03e76d95ae949d2ee2790fb22c32063f07ae44425cc40d141aa5dd0458b2a90800bc22c72e15dc7c2fb831beb9d6f4718d297ac40211d77a100def01f51821e44b22e4caa2095bb51fadd994830f53fbc7228214f5519694bbf68d46e107620588cbed493ae1bf62dc2b2b4fe92a35b8d3bd05a22a9169beb0c6dd9268d623ca34d000b42b1b75ea34c84369dc5d2a6095828a9ae01dac1012c96736ac6f57fd55c0886fda174d775093d3a698e29a6c45287c92d77dde5118e2b0bbcc1577acf4b693cfdc20ab64c0f7249b1520f96f3cbee05fb28a0c2f3cb547440de8d218a196abdc9a7108baf78379846bfd4a28b27c1d4afc4f4b04f8312d2d843d4a9b416b746b06a201b0e7ef0871558e8bb26ab3a069c4f6c2121cd4c74fa010743a292cbb9040fea43bc3f6c80c0c91db0637ce925b35aab5d563fd4581f010a298d2753c48d6e6b6b5c4dda73663584c79d25011ba1a16badc1b649dd02570bdf192a2c868bbb8e300b225ccd73c2dfa34f4e2ff752ae77ef1c1ea2f72b2f52206aa03f35ed41dc8e22a338c6ce7efa799456e1695ee4f640a5a2fb6a4760c5f34f001cdb901528a9771da908c3d07c6d6b6155a4fec0d7252f6e5817817095285a4211bb80faa86d331669502102c1b8bd208c6c7c131a81cc2840e51a83eeb68e1192039d28db26d09d49215720ab80f2f63ad47ef226bfda744578227b0f9c0d231464868ab3993951877828ec4304372bdaf1a8a39bdac4ae947c194efe871120359329365bda81b344269de834d4ba6be73e3174958385adb876d17feac5872ae32fdae35339dee1bb3308eecf1d01e3012dd51597898599ee27420072337e8f8a1c7c1bbf964299efd8c3bae952e5e314c8a0c95f585c64413039d3157bfb0a4c41e5c0ced152385461cca218892a17ce43bd830d3e2038533976109dffba40d737230f490eaffefedcf6182d72f522c619be18307b69f06882268a65368fa65746395d11df7d2381cb47c3660c008be125e58a1bb59bb11d715a1926fa33bebd852603c1e10162739612312e63986bc4536c1765a009b39213950ab7cd7bc4544c2ac3612be28a128b8eacd92e346737cfe93bdcba242f62e829b1e37961abbbe970a99322ba4a217de84f272ad92c1abb5731c86192f24b3b1977d01e6992e537849c54230c8b510c4bf12aba4d5a5921e23182f6ea8d143ed9c3aaa46636c3aa140f3777e150eb0ddbca2e589f538150e9362c1dac9bb659020e55810e5a27054f66658071eb91d917704ba265fd58310d6e70a00b851ea6e4094bc82bb290c45775bc67632c20258d56d0f5c557645dfc879994c52d2c3178d54bc3c095dbfe6e43b05df5d11f7e4e67ff12906821781e8a7f594424d30ea643e01180b6852de607da27a3a7ff5fdedd9461c7c4dceecc484cab386221fa74a6b80b4c2c9288e3f2dd56df591c93c70c762ef971ee5f15c97f0c5cac7728d600ffa7f24fa0399d1843a4b78d49b13f0dfe1d78cb43378a1d214eb3250f35555d28587c9d2347abd546c13fc8c04c43f8a69b14837c3f8965631fb9a9b71ccb620a6b1da6768e61c1fb88d117304b6c16caa4072bf8ea39378bd7a6e450156b159c1f153667dbafa0b9460508532828e54c895e31ba50fb383f0edb95e938ec47e71823cec0658a7ca0320e74b385d0c9cf4f3da0695c729f75a7b0f93fba06dfb9448cb99ee6cf3488090565a392699c9df3d1b4eda9c02e1beaf5ff42de4cdeab1ca502567e53b39bf2534878641acd7bb3455901b61bec9c07c97d743594c086b03545a72ef9e0338c61f991746f2087d61379326189d15828a632fa776273c1385f715df1f678c1aac1880f507bad24aeb369ef55c7fad1f82aa7bf3fb0f896539ff5bf9bd6f37fa462779cb4d17535d27dba54c35dbdcb1439554af4bd0ca9ae1440b668b95aea6a2b319207cefc4cc1ea3cd9add829223bf23be2885af41de4997141af8bde142efc75eaa4850b0002123c8fd1bb986ad5773f3ced0c66f4ebf3bfd6609968aeae0242cdb6a86ad11fbe9a739a0955557b14143b5c718d17b32d0436bdb9a0448cae45b7da13ecf5ebea270e9a2b7209914e24dd7095b754ef8cef52c5d66cc9066458c193e65177e64346e66a81dd84c89d3257c642aa3f47902f15dd0a7530cf94a8b8160c58cffcae5b399094fab47a7acd1c118ad41ddf978f583bdc320c0efbd085e4e1664773f75381d3a0ac82d4bfab310c811c9c1b96d7f17993636ab06b85a66b51edb0de7ef64d14337b8cf625a278d7c1c6332d453a58267bcf4ba0612aecacfe503e1d10443f05189c2fc891d401e5461c741bcb6512645384efa1a09d5fd0234ae96e90ab421b96219a6ecd7fe364cac809eb29c2fbf16051992f489ffbca943bc5a455188cc37e4968e8d96a8b9d38e7b475cc151dc23ec0b5f3910d95530db93b6a0672c5748800dbd641b3c78ea24c69820aead6128fd79e2a15875bdf79da541ded6813097986e84383e0b0ec29ed499079a05a2494f2f1673d1ef19369d74a78d009dea8082e9ebc3588bf1934b9bf16dd4c86e4281229864007874cd37dceb3762b8ecd79db4e45f0f3a7e2ddc1fc14c5ea2a76a109ef300c17c082f79656908f3d759c06d7813802064ba14996f8eaf325a05ae0ca84786ed1bfb07046f92453cc8cdd77c5c4146b15932ad926a0dcc39b46c80a35ae8e0bc7901bd35440a825bab1c9fc9745ff5a03270a69f2f0f7c04d293e0c3f1d8879fcd83651cb9960b6fef8b3952a00696ea3fa297e3b3c99ce58865863f0e7f632b602e70dee6bdc248ed8b0f3f329b84ebc8c3998789258a9ecaf0a87d6f1b4b2387f1dffda360d0816378b2b74aaf95b01d8c23b08387142a964f287a04af9f5f251a56cae484d861d15a2ee0dccd777c166297ead0c2ae6e35788b24009cfa0da32cf1ce8719660dc9721099393fb07786ea6d2dbe994e9c6ecf3d6c245b3e93a80157345e5c296e3b690c0cb9e7fa063c63dd46599524910df9bcdf7924c39a202ef7b5f3301b9493cc6a1476d9422360bc67e7029910945bbf8033ac8aaa7d1b6f07ccb5d8529ce6ef42f6e6877560c93a7c5d1a6d167404f2b3be85ac7a2043b591eba4a093b910a76adad825f702a44ae4de5928a924e79a7b1d0913f37c6877e9fb033641025fc304df3c6a5f72274e1c9c51d0c630ae45ddcff5bc640854af29f6113300349d16c98ad9c42616b47159c0530087e46bbe59942553fa03a093e69765ceac1cc7d28c61fa858cda450ccbd3123654bb54bce19910c5c80b9fe6027a52c35d359a1ed11d17765b004bffb24721e5d60325457bca1925d8b31210ac42cd7bc5f0c8b0db95a72224a8f99cec4f31f238c46550c6a66bf02dd2a15b2cfb2d979f55e4697bfc352b141ae4959253a1f9544845c25f47cff8e16368a8ebad711aac2b95ce85d5324df8b897bbd214014694e20d81856c180b8f8403c41636abb5bc40669db02788ed45b4410bb06aa2faddb038735efd4b8671a83d036aa7a554eb975e2b74003981e71dcd6ede51fe4261659e37f21b8f2db7d4522568d1d5e77daa1ecfdf46e4062442739916de607a78452f24e88e8f62079e3f7a6db7aca95b125220f22e8b9b79cfa398f09bd7431480a615b00f818c91e94383772859c923d790e7a1c817492095c1e59e00ed37f940d091910223c7d21c800621df3b3983d6f27599f42d16d2e4a1dae8ae46da2b3159876e256ba507d51b265ad8bc2bf81994218d0ed5333894e4c70ccf7867beec51a7274b898ce7de1ae053a2eb65448d02204669cf02c903a98c547863b839c43afff09ed84e4163de8d34cb1aa992afe0889dc9525e09fa2a0d27e5c920cf8a71c00293ab59322e20bb878dc0575923c0e001984584b55010e4d093e9a914aa09afc02c985e663acbbac629b9c5fdb3f97e0d1953ed77beb9557806c68f54a1508554670e2036c3cd37904aa46747f736d51fd4b5e41e98d16e5bb6ad88c5e3a941b3504f48b8350c37e2f415d1ca29bd5f0d505fcde0e3cb4a5abf5563c7eca672ceb91e328b2b248c5fa04d81ab40785876c50d3fa79b47152668b4ab977ad1f2276963111037159b278d04d1b0ce3fb013ddf2cd9f75c9745298859aa476ecec802ebebff76d9c09744e428a5c2c0c18487eb07b1402996667f2e733a6b95d52b46eabdcaea54c626538e46e5d2a846be9f78900dc27cc63faf72b0786ecc98bc0be9df0d73b0e2e4fd745698892b4746e1d3a67db50058a95b9f392a2c14318bbb87d765dbe47cb4f523fa616c8f911fb8c35f8f568fcaaffa2eae418fb37cd0495d74248070392711f16d9a98830d89b6ed883f008e6a5953f91c690f99b9fd255b3d7544fa04b3fd4d42097065348b2e38c642b5b1ecbe1cdf637c4d6a4e7e97d52f210acc4f2cf3b7d4f6809101a5cadaa4aae8507df1b460d3b28d9ad04bc264f63acd759821912a82cf8a817401558608cfff61aa236dc30eba07d9d44e825ee78bf4108ebd16c4f1900a01b4f6fcf7727a61610e2243c127f66c2d4aa8f6b4dc658da540cd36b9e7faf5d3879ac17d25267e48ccc18b5b7bb08475f2e8e23787442b4ae88cc1ee8c9f44fe361baee08044e55f3d280770efc79583e2659c81dffd19edb89ff7982a2fff12d978acf2dbb94ebc81bd4cec7b4fccb0f24fbe4fe4b2a27a47cf9623b07f68c2e68d3075461eae79e2c3e6af0644748a7f704e28bdfe412ac66b953b04b000b91e3157425ce0b2fc5d0723e8e5a77599045d9d1b8c36bc666dba22725d984dd4d8ee16f09ad95cf4956ee2c576acfec5e2705163f9c419f0075ea26a86c54a6be21e22d5d5f6bf386c0303482c7cbb436d8356203470311270f89bb5bfe38f92144bb218bcc0c6bc9e9a534aa786cbf2c564cb0407b1e8887f4d3934c6728693c64322e493c6616f1e1905a5b3805cae33f0d9dbdc702e020edab203e836dd459e4bba1729e89c3f5222bd24e134aee78b793d3452dd71384fed06365e14184f7ee0cf7b0e11e58ec549af95cdf094af1b1042b85987551df4bee5164d154d7d97f82e5a1f1162e36f76f609ac00fbe8c774e3b8d337bb236efe6ad2fbffa2d7b4d2e2b3e49e5805fcd21ec7cc715b9eab46968b6d0a27271d50afd372beeb545289e25f41b2ea17499a54e06e6cece15962f78c5f1369fdafadde850bed06f94f9afdc020349b02d2336c59dbab3bd7dab0a08acdc0206885b580885d7a3776ac024b561e818986471c7714e5530bffc44c55b9b39c583fda64c90a55d00adbe606dcad4e5f25cd8776ff49baec662ad06876c9038d9aa6495bde85f035b267a1d5b6dc491f17d1f6c7dc6a0efaa3e5fa0ea709821a4f84848104d26a7c47538c7faa8b6edaccf9505fd26e27906502e72d8817931b58695023cddd0cd89fdfa208cf070faccb00463183a0d752dcb6967ab2c1abaa51cc6ea5de5543c0ecbe02511f1226e6c7ea478cfc4e2933c4624eff01b8837f03f1d702e7f14a6e379b6f9634bda7ce5a4be3f6d5f138c1287949bdc8c6d24980ac0a92ed40783af3f73d314eb1279cfc2f96ea298f0f808dd2bcbf259f83181a4d0f7fb96aac8001127805b855447f91440e8d8f7e80e7ef011d5400c42665e805b9f0ed9d843e76fc4fe3efcfb7deab888418b43b8cd34f4f229a1c53847bb6e29bd2c3f3f6177f4a525c31a038979e6e384110da231245f593f744cbd92451b5547675284220473b2d98a7080587d462ddd6d76cc359de3c1253be44b72777d8113c9c1c3cb747084f03e1928c83b1da1aa5b97d445bf36023599295004f3d47554610e0490e3f885a3d52a66ab6086a3c5a7e1be80d1e1e896c825a0198059b58fac7e1edb95acc9f07db708582f75e0a3c150a793b1beeaa64f2887ec5691eae4fef15e3c6eb49ca8c32414935998c161eea484ac15bb0f1d3d1c59cc778a5dfd953277183c6b08f55602bd29c673ff87ef2b9416b75fa481da34e9db8102bc9ae08052d2cc9caf74a12f7421991220905dd79a7a0416a37c2ba91f3eaecdb742abe821635ac926d6da76152b7bf065b970074c5ac1449b64c86f3518cf7410624c7c7a13b93867ebedf9a482600d36e7faba150e227946b0992797a9c388ec940df46e831dc2907371884090cd39d7c0f50dcc16efef72ad3c22ac5b3d301c40f27236bd411cd7d3cf103130926ece6e5e39adfafeb07104ce5dbd10673cefe0523aa2d74a8608d88615da105bcc8ca9d94c6aaa3bc4e182b64260266f5966f5ba6edd4d722d30f9b2fda106af4fe54de762facc3f1f8ac0fc291b29cc282745e71c1c6086400f7a5cbf3a54b331271f4a9965a4775b8cea086f4fbd722b2c8976cb7d455bf858d12b9ed89b7e66034b0b8116defd940125784c61fab762ab48346477aa593c978335e8b9d2033275c9f7c9b0dfb427303c91210b416854216e89337ab0a3f9fb9827224b20d11e43091bb874a770838fcb2822cc09f0b6f3a45fbf847ed399acecaec78b748425b2b10e68fadbaeef5a8e0dc32d7d2a498fdecd29b0e55b3d416b4e2a5f96a3c10e14c1d7d20a7bae62c38773a6e347926a55081f7076009672d50e6d8525391a4e5d3f013cc19ebe811fe8114a5af8364d2000b647099deba76e483f9033268f06ad25690cb38620ca3cd4a83902d313662d891fc29bc8656c6dbe12b4880ac5b8426abbc54702451aec028ecbf223158f8e51c7dcd4e2bcbabdf7089e6a5398afdc197739072bada5276ed3135a61c5824a02fb3e9e0203ae43abd03691b1516718f13ae18665581b408531df546585879129bc5bf68950c34c96d649afb054f7112205f41fa8d745661f57e10d829d7cc70fdbec11422ec97a32c71f51f7a467d0e05b31a66a1418bce811749d2357d3f458bcdd72dd8446d23e979e5608c683c671616f47a127323d8c9e61b61e1d454192d519324e7c5eb610c2770e5a94e65e4b9ad690b92b93f37f4bde566e3f5af79b9dbf1050994113364c292f524a033138ada48e862dd79e480d87ba0b81b4c8b412c2141e9331be14ba015bbb6503eef41c30c9fe6b1428911acdab48ad491b5f2348fffe9a5432d502dfecb7f8d4250e378fc724604d81742d864e69dae40c07a4114c60ad3b1ace146b45a9588568f2665aa13cdd98b298c332ce3a3b1465faf1fd9e300d68947f46a092a2e4f7d7f830f0e8e23ec02d4c9631d22cabd246621d50209b9518d479bcb6de02e2c88541676fec59c6ba7b94ccce4882a782627a118a8f6a682bb89d39fc7670562d8aba560c664906e80cabcfb71ad544a61f164a12de14f32417609bf6d9257ebc7f69dec831607da3d6158d5eb743053e23718acd36010118bfd0797fcf973e9ec346b72299fdf378269b708adcc0e6456eb3f9f4978c93657f79a6380c2ddcd9b514791962ace89a25189d3f70566ef8f413ee6b6657a03c03553702e09c6faf5edfaa1dd9d23ddddde621646e68ef305b6b97e7f9b962a8c4c93dc7d821d5d93fef5a225ee44e09e56f1f7cb5fc2b6c6322cc94ee2a07cc0223e013763f7511d655a4523475894f2c7e60b33228be1ca0097f7e8d5cd0ef61f03281ee998f811ed370a7211e64a5fe16266519b241abc0b3dd07ba6251d4531ccd93a3cacd3758f0f077080250ca1f5cdd2449cedfdf2d27c7f7fd2c4ed36bc90165f1f2d9b2868b909c333c74409438c5ee9efb170e0c23fa027a6976a504c7786f7901b2fa58768345d3786427f10036999e9ffb953d17f52f92fbe72c34df257ff8813a6a35ebaf3f89f8c0669b81796766e0f6b274b36ecdf06688ae6405e8eb6060d1c2bdacd8c5675c84817429fdbbcda80281f41dc11f6ed6fcdb3a48da640489e6dba370fd2134cc147eb73d17a0fa28ef644c24cfd9ad4f425532a0e6da579714c2aa145dc55df7a7493216487db8f8890a143b6109c589dce0abae533fc0c9a641fdd5563c673ba39849acb49775f06dabb9c8ef15936366616f1cdc0d8f4e7a9cb3e9fb7e3254439da9881176257405b84dceb1300395fd17ce39652c6ff1e65c8e4f448dca1eda33d206e9a96b0bb202246b8a9a91e6e57b4a3383d637ff1c1c0dea3aad489b2cac0bf9a31ca8e3346cba45e279f2dc42e0a1fee73a4ca571564840fc559625bac5a1cd686d3fee47b473f20f4813e3f0c9dfdc40f52be6ddc627faddb859e1c41b2ef671a951a067412e90d9aa456c4a2cbba7186d889e1275a39b8d82140be3eb36110980b78e3cfb14de0b59fedaaf92e4cd60947abfe7f6c9504e3fdd1e4fd6aefc6f1279e4666726ac278ecc31384577764b0856d4b6c76a4ca10f320e2abb08d90c170bc33416e0ca191024354034165a46f54ed7cca1aebfca4d356b124ad34019b005ac6c92e89568aa82451f2007bc9976932c40176e540ec027ba9dd7b48d48ddb4d70c3d42fa412f46c89fb91a9868a77cc2db32f2a10c8f87b7a00cb3821c580d3c0a1e5c7b3829b24b553d0dc1d484f44fd9f1a6c885237859482819cd6ed2298ff4f0e66a5077baed9d19a355fcf36a86a914095f61ce581ec5e1707733a2629b9f25888cab0931324d1ff0d7bab65c02cc1632c47672fb764df7ae44926be266e7fef7dc4abbffa067b03e42d1cb7677ae0a9097c3042c72a229dc39afb1078e516a7977e5deccb05e4a0bc61e6529b58dbcb7113aa2a28d2606c632d08b9bd44bdcfac5a5c09b082ea6f0e075c3a9832c61c472ae6eff433fdb5231859fd856b3718d41b84df78291c9ca71827558fffa5f1c881433e6715ca03398f646a81a877b5292dfef45152aabe309645a8d514875142be494144b1e0e965b396ce72d7f5649da32f210e0ba8e899bc18e2fa751b5c38452b267f40be87d5ca0538e2bc41c53fe9f609b34bfadd39e1ed51f34f438870950285201a002c1c9cf269b3105f297b3125dddfea44c890b9464dde5bdde9ef9bacce75c7676766887c752a886af7135dc8ba28b8dd45109c8d51a4b24617205ef1451e82d4e9c426273800f8512c3f66776fe00a3593818fcaa2cd5a50b3c5bbf912b1bb903e85cb6ee74085daaaf981b8f3fee72955a05387c7cfe9001b95f2bc817faff514001eb2afe623b895851d88dd69c2165f2cdb02463d17d9c283d6890d4f96ab124d802e48b709ed5c015b3bab05090c30f0fd8fd5f3f6830117303927805d8ed7887def8358e9eb38677784c8bc4074bad3ee444965192c7faac0b3907aeec770946ae38ec4504932678a46f1633e1c46d693f5b99bd69f222fd9650d477900d4df7a0b77590f5da30fb35ab634583795d536d88ca3737351f3f36c1f21595e937d95241fc94dbf407eb770e43216ff952d4ab80fdebff9e09d4610150030024d7d63ad5e92e3674d49983358730bc12e209ccfcce4db1b0fd9dcdfbdd186b3d21058cc1223c7483493ae2f098b497b9f8f1f0f53dcc61ae839825825cce1446f2191906f4d7ed67f4f071ca039e71fa4b3c2c4da8b6e7ca8836d19ab7dc982483f2d860103e26a6179ec0a58a3cfbdc9dcdb95ca088189b12ccb036757adcf31411ebd780e0e30b60d25170250d2950bc8a7bae9b3a3e8556ea173ccd2bcfbd70a4b14625d0d8b72cfc459f09066a2ed9a6fb10ad078b7be6eb1f5608c0b2fb6e4cf8d90a21ec5c0cb6990f32fe46b3fb3ebb73ec7737bd10ff92c10303fa46ed6a1daa54be980217d75cc6db64cf7d765f9d1594b2ae27f921f5601e819d0186c79ae0677c7e99e7a8c0651ebfef3dce9b04792be46f5907fccabe3f6544a6931c99176aa9f2896b4b3ae6306d9149b5d040e0232dda275c222dd6ec13f357bbccfdf51a82e16613611ed0eb06ce8e239428eda40f369623aae1b9ce2b8a7218cb0f7454a79cd7e648a73029ee4f99f226583e64f18d0967b4ca3bbf231edea5d7d454fea834f460b5f713277730df839035f31b428b81dd97b04bb1399990c0964d20a80e6027dfec596c877b67dc6ee7966d411f7b98d0b1084168214d70c51a19a027d768df383f7314ff909c4519690ef3388d727686c1a93d1a29f238303ad91a1ebeae2960653b57c20f18248d705e805b612997053e962356d05301e070c909d0a1a0fafc97f8994d1271109b925acac5cac6361b980c347dde0506b4e856a5f11656ff75baa026c133803928278bdd41eb672f63593b2b98fd391750fa52cb9a0402a88bb1a15714e062a15bcfdb4a0b65453ca9989e4175614baf162a696ca7ea5a498201f1a60fb74a8e44531976ed1a8610dadd7545cac36f16e47ee1eb81a8e29bac4470069222a6752b34d020a7436424bf0064dff734615adf02990654236051a5f973a64e54bd877067887b0f8eec1bc9dbb069c4196744568e5814e5f2ca98d60e3a2c7e59fa3aa78b9aa3659e816c83fa761943b64c231b7adda3d2aaa8afe1e361506a08e062e4c7e8f855709dc761be05ae72317c04aa6ade6fc17eccf5955467cff16bd4736e8c24b17e352b781972738e8269ebdacab38ad9b1c54257ba59759186b118fffc158a1df2b986c210109234477a6bc3a1016eb65e3ecdd6d6022914be2e062511d0d3b0cc800d82108101f4483394e857c5d6bc023da9d21a8c68371ba842070db014703db713e8bde00b883b795b3cba96d50b785f47f183397fdd7af163449764fc5d5472262721ad23f79a3bfcf09f8fbae514b5c141ca0e18389e81a48d4388035ac95c670aa00c3d0e071fc0d08bce558896e2710dd0003313911b6197704201c6785b40e2ad6fc25fc6814e6959120b8e859322ff7ae482aa29dc0e47662682ec5c8098d402043548484db3bbd1faff5fe9d50881c0af7168b5e76a6d8c27f586339b2c297f488f1317b0371d0960bfe8a45951751561b813e23af66f2903e194226a768f82dc21f90cb4cb7a3b7b63b0e23331e04fd044aa7c27ef991dfd3da199db342f9d7f6192a64555739803645ddcbb29cc1604eee7e29543596312a8edfcfd07db32e76070e865940814a89ee997f9957092f6a0b0d1d204fa04aeb400d34ff58e710691a0140f4d681ce4be51fa198e21e3064fb268521de3d8dc0de613ed627d56e0c80ffdd0bddc2aa424074007847903fc04842d83a7fd5f4b5ee0756a49da9bd6ec3947278e759045499d713b81c01b61719aeaea023a4476e3274114ec701de7fbe005ffc3bf5e0313f9f6b1e4ff12d3d07078d78bae1eb644c0f6d12329ff7def6a1cf30417cf748c18ad667bb839d2f4b870f936f314d24c843491470c156610034c1e240907d637b7783e18079e6e8781534518018c2bae5b0c491ac80616fff10e8df68cd7878aea216d776b4024f65f2b4312b3fb2772d481f957f7624f81559b7c86cc59125f167f805bd15611060b384b6e02e45b0b322811e6c65dc2888b39a56817adf79b966f07095a731869229cd48378e8a525eb116769464f461d3c3de9b8ef22a16f55b4a42841104866e5ff51519cf3882004affda8955790f8b69106f9d9dd3f10d1273fcfdfb2e06c29c391ce15bc1f3c4ea1768c2015fc16ff97a085c3431f862fc37e899e4c7d745dce2be6ea4cf7137c05e40851ffc864173e2ab6074655cc58d560cef41eeaf22e62d91fa1ab4a5ee4c8478ca67e13d67321c0be41d38016fb3bfaf14383bd2aded96c35d6a93db8df931c5b9ba7bae53e2e1c4809391fb99a26857ad3b8925dc78285229e171ffb18a6b211bcc1ed3b127814c8e1f125a6225bb2ac70d03a84ce914dc762df490060d7da956a4c31cc400f07fe09cc3d5e4cf60ac128a5038001280038426a139422d149d677b20de3789badf72a6bfb5e5d41d2e970348af4a4de22da74e81587a929364e1d1fb439ae0fc9aa8956f01fab3fde2fb073220076627dac4fbcbc0b1091371afef4cce29ae0a3e57a204a3de53a9fa3ed8b3cfc9afc9688fb3a31505a75f42d285f672de0c3a198ae227014b227490007184f55a238dbf9aa5601c2b671004c2773b6cb753920a93958a7b34d700d23e4376f08286c1d10080e09aed8decec86c361f338acc3a5b6c1a18a97c808f7f8eb7270ff6973357ac5b2231aad01a28c56c3a9b74c2182ad746b21e1ce53acbe1c9fe910dfe6be7a6618852246e71c22c15bd030a5e3c535b3f5f4eefe6963e4950c10b66fee5e6a895f92bbb234c5542abe13713be2d5abc84d3129035f4283e7829caf8bdd9f0e7e486f6c7fd3af6942efd920ee1f58374ff2a75e0aa6f69700c0408c1f4cc46b1404fbc27f42ce14f450eda1cfa22db8bfd0c3d260519642f342acb540f67db618ff2833b6ddcda74f60f4d4e34eff73ba245e224c36a360fea27627c5051c2a2526fa9668b1fdb65be6de10b2a1a1d805411dbcd7ef201c925aa7f4b744105b67598d4c03e43261642bb9b45e2f9032e1d78c2df0cb3130222a88a009bafbae62ff6eca9571e1bc638c14683ebd4ec1ca185eab531e3f7324953e129dd705449ca12e339abcdbc2ff07c53eb8e2cd133c23b6867352aaa14f13e1e04f64acd44ea16f4bb176f57ad996efa0d714fe790b0b1c04baec00687236f75dfeb8f14722b7ca4f28452b2d23e83cee6826fd6ea71518aa3757b082f407c1c98476651317c562f9e8d2feb7599d35a2a0887dbb08db2ac23d22308d5d4d9d8c3acb798c688dc7786689ab76691ca14266c7939057df08ebb3a31133a6cb57fa11346ef0bfd471151ef74dc9a8e35659d275851f18538ed90511d115a5f1fbeb724ffa19cb9d38e3d3c9eebed29301c2aa431e1d6832ae374152a5c39851873120c51679fa502c947caea4a5f59a7cfb8600052403eb5fa4e078c78d02f4796b4e020988c3c4f9d5ef07d31f8794b751c926747503a295a327b485a898de8c06e1f1ba4feabf9d81eb2934c7f2216399c99fa918901eb66a13c8201a939db81ffd6fcddbb722b3ff3631d3742cebcdcd2bb700bd7bbe0afc5ec9244c741f3149b2c46f608a702530244ce645b78bd8ec32a291357281b65db770588cfeb9f41ca0219803c01495d7b870714e8e1ad95c546b1cceb291248aede7f5025119661a75f0804c19b1ffe7d03accddce14b8604cc0e596974d23c0a09cdb27c3ff008b1343f3de097b585438a64eba01590ebe2a2d891eefd63c387cd8a2d0bea47fab8d34cf3ceeaba02ba5a8c399325b03c730321b859a154586f84d96f034a170247b93baef6d7137e23e817e36083d91468c4f9d0c6744b652250af2b03f8ab833207030f473e764fb911141cdd28dd06ebeab226dd514a65d822c7e0d86c962e6cabfaec2889d8a5b5631f5f51d003dd7c1488271f385eecf68c6caa1180216d400466960fc9e182409202b971eeb0a2f85869d64fd0ccc4880ed0b9de4f5a9292c45f9ef819a172e25dd632bdc63a7ddee3f63a691a665b5c43ea971ec1de4b2c800ee006870f3008840dfa090793079b75e8aeb8b9615b55fd7be6a4907da8be03a604b90da81ee29c142b8a70e4695e069a64ab20502c8c3bd783f9294c336f5aad605f0c202050c61708132e1193a0a516d9bc9097b9f98317edf7fd7802b2a1bfe62b044a2fc7486003db026fdafafc0880c79ec61d262319a9569448b17702ca99ad23e030c7ff3293070cc55b9b95f6024bef59bb3c3a5a00082080fbd292975d46b962b46b6c23ff0ab2a8cdc3b11a388e8da60625e08ab8138afc49a4b160fa0984a9307ad243175272b5306ba8b596d1ce1adbe6435faa23734da7e4e05bed6ac35870070bc39dcc6ef2ee475a29bf06801a58501bb8759c23cccb6014a380d445c708a205607ca4cd5478f85d9cb395ace801afba7491974cef6bd0cd2613801eaf52f84da9da8b5dfc33c88b573b0e3c260b6384c30b16dbe85e568103b160a865d14869ad0d0fb52d7251b5d5218f541b418d4a2f989dc494a25bb0315045b041004ae6ea75e398f43a887e1bc60064348f5e0e854fa303939422fb4782a5518b5b287046e6fac1bbbe1713158c2c107053642496896c6acf1b88d466483db8cd018750235ba27add16a76cb003572d184157458b96940d620aca9b28496cca6e7c9600ad6bd26a2dbd222866932be0862ec42966541f09c64ddcb7377bc650e23704ddd42cc7f058bdeb8e7fe5edf6f2f9d86fa51b60fa1725b6aa50533a48b26f8ffe9b3d079f248a6f74bc77377bc0da593ba85131dedae94c2345e428e78c7345b2fa986d6ec214de250902302a717c22324f448ffa73985b0d904c7d8b3040a4989c8901292092f84ba57b2a25dd5f1dc1defed715bea03f3fed474701a2d0db76a7282b88cac1e8cf1ce39e78cd51463fc1b88fe9efb7b7d3fab76677777779d3f7fceeeeeee9edd89dcb1b5eee5b93bde15d1a1eae79efb7b7d3fd77fffbf55ccf18b25c4b6746b9d73ce3967cf9a6aef77dc55bbb55673ceeeeeee9e1da7a3a6f6fe978ee7ee785941982c1ddaf7a22c50df23ac07e6124a645f2f39004e3b52d4d64695ec89106d2479a08b0c83b05c3514b14204ba82057b0a53e4e9a805a6eaf9f48402037d5d5ea2d6ec82800524b14e8e3dabc73a6b9ee33bf69665591144591ae3a2b95626b754215cb3cb7f714dddc23789acde739a7b9acdaef65a0cadf975ef345bbf743c77c75b127b88abfe577a7b3127b22c1ba25914d4beb7704d972bac841927e79c75cff7f67c2b3fef2b6b641a7b5014638d1dbbbb2bf68209226e9766e48d469ce5cf52e6914757b793013102434665ec8cc69e023d811bc605db4c0a653040c6a651d4967a6c81665611bbba5fec9a2e9b14d79c35eea083010a20130cb78819241599d816d87132b5356d66b5d01b3011132befbddfebfb110d8988444522a3dbd255ebe41f6b2e62b1e68c7f2795bc135eb837d7cae48490424ea156e829e40a41855ea1e8d6ff0f6b754e935bc1d7f9cbd16d29723bdd9612b56e4b3f4558a185102b0fd0618719484fa2215b7d75e504038639410c943439d1742106d1d6525107ddeef532c302e2c0f32e8a82a8617fe18c5a6c4bb712c8553b16b12ddd135042269bb8dee7a8e218d6cb3943f960a81f0c3584a19030d4124339618c31c6583b4e7b93ec372ed7cae49e6bbad4e4cf9c73ce4b521ed6fc7a0649e93aea44d5b53c77c7bb4175c3ea86d68d2e1c343882387470f46460666a727757e6eefe633ab92d8dda5334aa9a958bd60bb3cb6d6993c66de9aa3af243059e7c3449d024c162703465810fd74c8a3cd03c77c75b5a0ef3b3101d0021d9197a471c89b800636b838f8607394a6b67bb8a79ee8e972e3d153f63f9779d4071d57b5014215aea5cd3251aee9ab39e9165add97bf801bafcfaa5dbf15a1fb7a53f7b8886546b972e2f9f739612a27abdd5477605c5988c9a4388e070c5922306405c470ba09c59d1d7be09c87006baf7f67c2c0bcd94130295aae2d4900834ac62860a29435a1410a00093126645784c4d38b1823e208316475488419f46136058ecae8a42a012696f26fc95900501b490b77d20633d034044084202764f8bb410607f5d215d1a2d4686b635552e3d6b24906cac30a58039e73c5cb38c29050d823a4ab9c009d5c4127341b489e42a89499c341966416e1034e8559941d105aca9b306a8847e670aac159c5f2c9006a8f5e3b67428460b49f75816dcfbbdbe1f92e17f2f4782bf314a8a39e79cb3ce9e35ce07c8c1ab4d02dc48a3d367e92026c9bec92e3b1f7dd464d7868bb4e6ecb9e76b21a194c2da70ee4089ba4466315b43a752c92c26ea5431a3660b248f86dadba8e7132f513b7828d5a44092bc909bc92c2614ab716ef2c063a0902cf885bb5134d220c4dc781db0a6c923937f81b354b4eb3e3cdfdfdd73ce39e7ec19e3b4abb25d267733f4ecb0ac7316548adfb4345ebffe6f42e6bce37e01183a1e9c4c1e34202eb83357f7e6cd7375cfaedbad24b972a2d5364c39860d54b4ab29080f6cdcab242c0e3cb4c05acb0722b1a5810d118bc8850548c4b260b6027cb17e4450e960c4ea52a169683fa0a4045b1e16141a174865c6c1557a7032f3949220e32034a6c466a24a0d6041600f1cb49da135728445c5c9e43c086966183a4041b860d050aca0018d91a9868183b1e95241e03101430d12f972a96098012a604d915346971cd9d9e2640eb0a64d1924f2cb6b3cc61928e4171dc6bc9826d21f638c31c63a2f2520400192dae5d24680a67779f53280262193880a02d0b53c77c7a331642a7a098053cbd4a300009061646e80a0025294e943c10569c84c468000e7e65a999cb3e834d2983b1e3c70e4746616040a34dea6cdcb84e5b3f942820465b16963428425d69b55142030019d1c20d494864e62840730a047131ce85a9ebbe3d9283aa51ab41c5d675503a66313b001cb92b1a947654538a4b9b0a9d470364945a031a14d6f025292c3122b283390d8dd3d6865867373ad4c2ec6704652c2c99188dddd674cd5644be00cad0762c9360405980d3768c2463e69a84c511a3e1a3cd3482389031dc36943cb4f2e8f0aae21fc81e0ba96e7ee784f449dcae4ee1ea3e4c4b674b7aebad2c9878bef1818c28c6fdc5fb7cb18638cf18b011d3b8a52625a6203d65459e32ac9bb755730acf596cf9a833af018defc487e886a60dab25a6e25c1e94e04363a9a1a5c0091627261b96617dad532eaf315b89f2573ec5c2dc6cff3aa71c595646a45b2c9975ced4f45d4bc9708614f3a54bc8559f2bcc9cb254cd47d82c8128d369b2f6230d1e75188f6809dca774e94dbd2292a2b2d989c2e181d1a08aca95b90b0143183b1dfe4bcdcd07cc74d78e172ad4c6e2f75826b7671e70b8313656184c0200ab0782a89aa216134a35cea44a1f0f89a0651cb14a83011083b1867d83dcdfb896de94e3a19118419a1d3241bd2f830484b46b126785d5d0b63ec05cddb9745ee9a7fb82ccbdee85a14b7deb07639f4b3e6774ddd82ce396723e49af53f87746b69c424831f0bdd960e89b5bddfebfb314750b96bd76f54416cfb4b4825b41a6122488888a712edd30a276609a2d6b04f1ac5788dd3e3b6d467ffb82dc519725b9a73cef983fbfbbb6b2db401618c6bac18bbec0618638c5920b3c618638cdf9fa9dc14b4ff327f77cf5a87f4aafb43c4b674f75ca47ceff7fa7e14086f30204dd0e82c3d93409d462bf3f7816917c21dd967dfcfa9aa4095c76f8bd66d698be756f533d9edb85c2b9373e1aa32994c9644a6fe4bc773773c16426c4b55ad6532d9cb88b8677fb149262c55fb8f6b00555821878c1e2d2984325e95062732b0a078ae10db0f2b2a2b8a2652682658a09314e7110d450571866ce6e33c399100b935939d885ae02046342a1591c18c492525b37d8238d3408d31112db1f1a7298c11a8a03016538a40a3da04c8270929a24964150409d8e48c0aa8517242066cfaf66ee0f77489d16de9f16f4b90ff295cacf70b976b6572cc0c42f6831ac6e2fdddffefbd78dd2c98f4bb2600504d789a191825e5b830e375ab1d886cbfd36d69fb74ffc605fd770b2bc2e176dff926e7160d4236a5474f273dccdefff7fa7e1bacdc966ed0dab4d71a7b1399c6bdb9562657e3d640dddddddd3dab39bbbbbb7b76dcd54a6e813a6e4b7b62803e5a6badb576edeeee31dcfbbdbe9f87d6ddf5efad7b79ee8e6703b579352d68dcff41fdafb3317bb9c123b6a58f44a26cb7835507ad0e5d5aeb9e10c90ffd41a68619159a684fe33ca101eac4668e2a3344151a285265c6751641a9ccb04e1f1dc0174bc4a96aa627ab1b2af982a1db5262f1768151ef0092f7eff5fd36138f216de4f79098f6e7d36da97b7b42b7c6e91d4750b6bbbbacdb52a07048bcb945adf77f3067d7f8ad6be48e26ef3245bd2937b4d63ae79cb3d6ed3c828717eff7c718e376d590137f40bef0d26dcf5ec523b6f3eaae5dddee15cb20482603823c8a618fa5d019cc479bb27f3c9734958a65327b61082327daa565206cd4c9edc770df8220557c4467371f42248f112a34aceec063c73c77c7cb80ca6da995564c065d378fb76e53de7fafefd7642aa60995d634fd1a49dbffc2e55a995c17f1bb8a1c38d16307548d0f9305b1c9aa0935d2dc98ae28ce069698f0b03d8e1805ddc96cc2f52102ba1d0a0da2191356b9428ca2092170413178b0c4870e0526c704ac6953c612acdf5073fcba1dcf6ddd963e5d688cfbe2d75ea28675cff7cb41cc51cc61cc71ec113dc879fba0725b6aa515e3a32bc50fe86da5134d7beff7fa7e40a0405e20512ab646057479995a71ddcb7377bc20418238d18244d55c62423c6c25564dfbabf77b7d3f1d486e4b971ea3c3a9f63baf5f5faa71f07b337974ad39750b108ebc76ed5ab7cc0499ca3539e7cc3ab1d8b346cc1eebfd18bf2bb36658b4cbe48c3cb12dfd232fcbd62fdd916816fb218b600ad1d938587a64aac1d6b077a95fa7ff1915edfad55abf8b2e6932aa83f858074c6be6fb18c82cd7cae4d265121554cf746059132207f97cf5704d97cba8350f57b5421ea6513d1964cdfc58a0e3d936dd6533886c8687d4098c73887c26197a65f8d3242b4fd2f2a42ef7de101398febdbedf11d06de991701f0d6934b1ac7b79ee8e97d493e493f4434b1aaa2521b9bca87f33d3b8e7fe5edf0f8610c610069106a3587351959c7a4fc42353dddf18481e63e9319c3c4694c798728c43f557925ab37695688299f617cfddf16444b92d9dda371954b424d10ba5212524a565b0e77bbd3d5f8b548dd6c9632ce7bdc42e39c1cad60ac5916d07664a36294a968cd5c06e4a2f92d5ec861416c940a16958f0eb6f615cf33b233ad61e81fe9d75ceae29d304ef9a5ddc9d6da9e19a115f2fcbb2383df931cecdb532b934baa64c393e6b76d13a8daa2c3efce35c6323cbb23c44f5bd7dae29d34dd1b5bb4fa9af0deec9ccd53661836903f6bac642966577d224d70ad9bb4c3c4e6b76aea95b80d954a013032703164e50160d207ffa71f1232403e1e286c9c5ce0320740e877f1dcfddf1867c867ef06bfd62e742d13df7f7fa7e4650a3f7fdc8de3abf2f7c6e2f7edcb36721328d87ba88687a6ced6e4473330afebfc6e5d02f5c1192dbd2e5adc8c9dddd959eaa5af5ecb85619026a6ba1a2db52e34de858b3f9207419e203bb5500bc3162d96dde2ede9b1934f646c7be199d373f56d81bad991027436c886393720b3ae2905001c26901bb01191790e47a42a9e2296ac19eb3cc71ca897acc43832584d36d69eb18423c6b390744db04a143b7ab6d16a724c13a70fc7262fcdaf78e55838d01c450a8f57ae7abd732cdd5ed943b47b21d102a507a41032952b9b38302cb505f639c96e15cf3638c1dbb3f63a4baea3c77c73ba259b3cb3ffe47d1a2559c8ae4d4be5450ffcb3cd6aa1264dfee921251ad908736942077743b941d5b31771dc6afd599ab98c6e55a999c0492c3d7c1d477ce40f5068004924eddced5ed5e580b19b29d719b47903cd348d043d821c021c221c6b4e2c9f1758e5d9b78b03feb72ce44964fc4e989443d91292c4106a25d1e4418e1e080e2420d67b40afa45157095f00217d7bd3c77c7830ef53b376c45f0fd8640b12d7d6b4050706f55ae8a8353a4a6c887addb3dd0524a51af5c1bb32f723cd158c77c2bf204a2e063930c152dd83db55aba95132d67c4ed4a98b322e586457472189e041155a4bc51b7a52c503824de8e14f110ed85e4880489c4f9b057a7c4a56cc3b2966e4b9da26e5953525aeb136196ab3e1392d6c5c9b0b40f225ee39cb3122daca40b6fd1e0ada0fe77ecf895f9bbb887db230e28b7ada3daf3bd3d1f3b03b2896911952f44a8dcb45a25f1e96db2637527e8b6542766a7e7b5e3fceff5fd48fc9018228154a2c8dd75f6ac7b1f41d67a48d4c3a21e1a6b46bd9f477b2e31c4b67467bd8d52bcc63d43ef217a4fd17b8cde737c79ad29d8ef019593a8048c1e2c8e0d0800231a0410410582240ad358ca8d011400091bbc5c78ac8c543c1a1046616148480a848181208ca3108081188ea21810834953590be969e5e004b47e714917a511e8f1523eb788e988b43d395cb3b4afb09bef5006610e2b935f8ef59b0b22f783d4c3177569a71ffe22a803524e22a01b8f60f4cdd5b93d7b0cbdf8e64968ee084706972e9258bcd2fce1b8836c7411840404a0b91481202e02bdffb9555fa64992c3ee54d8086dbc7cf1fde05762662e96071357893a130d4812170c5c49ef1b41d8e9e153f803372323cabe58d33eaa605ab1c607bb027a5be0d36c4e43d2b690231617a5a3902234590f2b8df034211b0ff772bb80baeb562246c0526230a045baf4da9a92ba5667c479158ccbc9c1c183e7f682072eaf63048a93420874c7e8e7cd1efde6111be712f9794205ea4acb6059f0bfda661874ede1f4c6c8efd0c1d3807d3e0af904972f88e84e457be96a87edb8f405feef54ca2677402179b27f6f614d2e27d50c6835aac2a7c7fab83b56f23ab41257f38673fd6ee47581a247b7a2e040c646028445388a59b587d48fad701564766e370e95a6831e43f734d8412be5679e1605cb89ac952676b7a7d4ff2220f8404447a894313ebe568c76a27643f19fdab688df4b7edf5f73a4ce0ed491a34c5f1134decad97a8d93a878725e3f05f189fd1c1efc8115f34b35a045e6f08adf231d4e4fa619f4d944503ec447f8d494352254e4097bf0a4044a5b214fcda48780e1b16de921ef3d6b9f4f136e11cc84e88cafcd206acb72d8592d867e75e580c798ad8f209bc51e96d12884668bbd984096ae65e1cb52b756da18a9d544e57590ec19240b88f773b4650a78fb9503ab4bd69b43ce023895f7704b0b8271232bc8465a080030ec1c92035e8002fa35a689bef3b4968db074f2781b158aa3ede24fc4dad18b9c67b338afea48d4fca900f02455022f2b8b3b72bcce4353e313f7868738ac45f43feceae2422b64c232f48f8d438c3b1e401bf27f9daa4d6faab58ce408a99f2829841f6a00a25e12ea3f67b4cf8b50fc06085fe7cdf7e14402458133740951589904f428b23750b79cb45c82c23a77b9f629a6af52205acc895b329015623772f0422107919fca5b7f4b1edc5feb44f826033a19882bbce8451c0a0addf0109261ac511c428d9f58cd3eaa1ba22e53acdbbfc950149a07bb040a74af63fb126a897e48fb43289da03b291fde8b426083cd0a239db005546c780407cf317a24656f34f6e9d60737478e78f4dee44c3b4b90f5638b16aef7b0ffabd431beb482e23d97c58b46f3ba648fe892010badbf0fbb3fb39bd9e963129b5dde24fea5b06554172134e9b178e241616b46f98db01eff18018dfdcb63a60528121794ee9820b6c61b939fdea0ea2bf8f059c1d704a06039617967024ecc162ce621e6634889c1cb1ca9f6def9511d354fe8596188a8b13cd001043a5b9ca47235168d3cc89f4f77afdb53d0fd3cb6ee68d49596693475d647b11e3e754a4eedeb808daedacc655186d46754cf0b1fc6053d3df3c3ae9198a88ed2492e014be228d0e15118c3ba4b222b2f556eebcd1ee2127af9b861bc1297cf7bb6ae76eb4af2a0f55c48792dca8b0f3e8f02ad0f53648c70f6ff1f218ef1d3d9cdee95ce59b8d1c552776aeb8fa28544e2194b736323aeae53dff7dc27169d0ba9cca32826e49a49d333eb5f04ebd0f50560289679b4795930fef0921057a0394a8c8e4002ef1c632d6a22dbb977929cd7f6ee57349c730bc9a35d26f0957a122a01321d26bdfbf72354e3c8a269762ada46110acbc660724e9c02e4b56087407aafaaf6529d1ac96694d609d36e356964b879a7504608384d8335b3a995fd9736837cf1c83ed8c37164264b342d446d929a2c96cc88c1890c9ff6d9584ee7344c06c187a6b42b2d632330652f5bc74c1642453ab6b8446850819bf909f5a6cafc543649b9666d1288a02694100c39f3c8b42c0aa238b82526845b5f5770a4263c1a8af0e8f5ab8964c69379d98b0e885977bda2bf1ac7cd4d1bb78edf609a128d9370e3220ff1b72e4ec64ab021d4349d100dbb61f3b37103c21f46c8af1bcda5d730ff6a63bd1175c34540e52c627adb9853e8385031f6c578cf608780c0da3502cb490fd9bc104926dfde4afafdf53a9bf381a839e424130796aee0c5e82259d87359b1b7a394d4fa4f5a2e6d1a4ebd1af2a7eefec46a13628330e60cd9545cae6e2d8255ef8545f68c5bc67e44ee527ccc96fb601ca3e0b735f113781b9b13dfbd664c2c1b10229ca5bf87cc4bef525638770ebd5051916a1afd79724d98bc1063c3615a0556cf78137cf73cb6ebc7798eb7a14b4b01c40e4ebfef81dd306aa4caadc428bb27204d591fa2c23670a7807beca3902bde6f3cc52a4b9c22d4d1a9b65d681aa127868be90d4a9cf1d8f95365543c747f28315525af384b4d59e728cd70eef92ca6393950961db5cf2f84562ba750268b9469103526da012e7fc16b3b296829a7562670716bfec35c0d23303c7a83ef42501a05e4465c30d3eedcc39f7c31dd656b8667fa2633aed865af4c23418cbae068515103ef7480c844b78c2b28ce5158a0c08caea926588c0cfdba2a98f4c37b8e064b7769339653526ca443840a55b6c7ac9b3bd8617c0c51bbc9478281c84431ac8a6fb940561948f302f27bd46e26b929fc494b28f366f00c4a214077afd8926c3d55c9d2e10f2d02738aa789bae6df6a97f9e69c8dae71e6969e1800994c56b5503f4b8f18aab257211dde924f2cea4a7422f112d28737b218747ea9bdc046266e4ec9e2feb44a32b53deeb6b92ed31fc372b066c57c0375997f2f3c76db90be0eb4d86dab2a2c630dec373b2ec042e8f456c65473bcccf12d5c9c493e6cb4cd303309fdb8aab4ce89664ebf00fd2b92a0d4404f9abb99a91f6baf1e38222b18b28055e8dade4500de6cdd0c285bf5e504da25811b6f5fbfc283ffdd53517d06912a8260d0090c1ce9fe00fb1053dd3147442797ac64d18204b3bfafc9771c49c23709ab896852cf1ad1b537f6dfd71e8d6457b6ea90355a1b82846a0b508f2c9588528fc49ad68e46f27860621dec53fffbe93dba9d25f2b4d08b9818124f82522f0710c637321765a3a662a15d55cc114b70048050a55e385ea0e9211cd714499239e5a166145722b861ebf013607aede3d760d7d5fc022dd3e9baddd88e069800c60c89db1e8f7dce47c4d40148ec739e3c97a5e20ecfd9b5429d4509e509d13eb33b0c7af4f86267b6fb427b7b97a2d6ee417cef3694ba205f440d06076203f50baa9ed05b55345038c8c17b78ad34771ff7230541c8be21f4e82032bc1ba1fd23429bc12253ba82d4e707974e9d5cf57d5647658eb232bc6d8bc9aa93796437bca404a7f86291b0b688489a0f99dc1620dc2bfe87d30c07f73b5042259f309e1ae4f5ef4b9ded3004ae02393f68a2b61d582027e3cc28699a4e2f9e42831d34791a8885a0a70b341c30225918be06f29e3da4245b6c6dda5239d4800deaa1e91cdb8112f8fdcc055a47f3d3b2efe1ca0d288cb0d60e2f1f220f976a2a4c516f3c1e1a817793e4d8e053bd30b7d3e18fdccdb0c89775cd4abeee224a54252d42b704b1275178a5a160e4750529a48b20d73c0e7175b84b11f2d94e119ccee50e41b76304795c6247e30c7b55ec2e31713f5ef74a61ef6d8c374aec7688051ce48b9679aeeb91df1ae0301d471a5d6922e5af770344b8e3f7ddcbc17e41710f75c42d3050a69d8c3b63b0170b08b7ceda0c2f21e83e710efcf685062dad2f47482b491aaa375813d2d780c28a1887fa85768b56a6f1747bd2f8c10d882b57a4d36dae000dfefbba8970b5c92c90275cdfec639b723a073d065b1f0b63e9f8a25a761ba200b6fbeb631d2240fd887fd04346443dd9475f37b7c789ef511bcb431dce851222f250499b9c351437008d52da80b98c6c44d115715a8b80b0191bd4b453b47836caf08909d85de53d6126119d26c3513bf8bf5773b45b3692d9e66e8f4a87c74129e7f70b32cadae7786b07e8f469d314a4a76bf90cc44ea6d305ac8a560d240a32e1625ed6e9855a0a31d240c0a40d2ad353e487872d8d484b1a3cf0a246fa9cccaa61d0080e9094182a44cc8388e343a9b37626a043770638f86b0348b0874dbe6e72f43b82300e05fc1197b2a5d24b6fa1c17ff71ec5c3ed7704b3f5597d65a59a7c3bef1e06bfd0d137f7017230c31c6c33104a2b57faf79abbd080bc0a041a31d713c682b92758ac15cb92a0a69f30fcbcb503f901d358dabb81a273819e9e960daeaf0e79de547167cee35a0b354917511267c8cc96f82edbc6b9e5d02dd0536e6ee6332569f3bac53c4ab556b408b49a90d6ffb42e02f6d911ab0ffc015a889126e2faba872b2a362a7b49aab1e2e461f0aa6afbc22b22afdfc64f445b9191661d1a3596528265b9519521099c047a7c2077fdc709f71b8718a8798fb35b4489fe6ecf55bf2952231153f8eee2cab469cade10c00a7a281fd19418d7f3b027b7667cb7e900a3745ba1238a87e33584b915c7441615e4630b516edd0feeea21f8e2153aff6c42361b504b8e98b3ec1b5ae56782342f4bed9e26aea729fb2c0837afb0b515a7ec38d00567cb7c0ab5946113ad2fb19e755c18f666b9360e8920e77c75963457df47a18798e52c963a27c7c6b750f0873620166cc0124bdc076563ff034af1c6cf318648e1988d7f8505e3320ec28b35b59ba38c79680683e519363800458c23af3ba72d64658dd79eb5ce0719c3d100d9ad85cf509af03a0efa9b35d699c0f1af4f9b6472c40ad8dd9ea9b45fc19eac0cfef732a12c4d92a1fa72bcce82206572fc6125187d39bfb3422c3239ffb012488b6969bccfce23c0f043f6a8f4ba1a98202023008ea3618eef6c4f995c082ca7178dae487973c5abc3730f8474221cb50227b538abdda9c445e3cab6f0ef70cb116d320c1c4c34051bf29b04d48c1c169499aa7ecf09f19b733bba9ce9f6236df1bc2483faa462ebecbed66f2569bab4c2454d61258ea03d3dc4b5cd6aa6b8d2695dedfbf44413f782b09473872e9c44dc6e3ba53f73c15403812b4682f4d9048f432ccd1f5d0f2c46794179657a44e654f8a216e788a82b3db055ac60cd9561c0ed480670832087ff8f32d42a4ecd92e0ba9ef8218fb1d5a55daa463b556fa7e878bf5d012ace016fbe2097c9c1a94ea36de004be84ee89e6c30b853a04b8718b973b9ca12817a0befed18002110e20ef2637e145806f704dd247c52a371cda90234df47b7a4b2461a49bef6ab5b351547d0f0b861469953d343e0a4a07e9e0ae11fba1b0e14df8e86770d2ff3806783e6835e9dc0ce08ed59e95e68cd37a53fd21464ce9bc6b7098db351e5347d3852b6ac24214011f94c8e6cf2e1aec3cf9723f357da5210e445e16dca390ba502ece58817b1375d033c3a6bce66fd417f03f5510043e418dadc2f95da2eeb679ff112b134aac020088cd98f07f182dc71c94627851b0a02240dc779f699e1911c6e857ee6378cb9844838d0e3873f7335a0dc3a8cfa1a133bfe4231f096071d751366fd3f89bbc1635aa4bcfdaa851fe6b124bf9deccb09922a4d6320093cf5c63ee748f5314f29c9f20e8c28b16a513d2b01771ecc0143438a2554988b522a298093e253f194193e194eef4eb54215797aae5a6681a17ca6352df0d3c09cb14553622437e06bec82711a2268aa306b193e139cd2a3ab7a618968a1266e94c034b8370239ec3b0bc2885c9871c2e95ca01cc44f25ba5912ed2614c9e89f0617a0c334f6a8ba435ddfc8fbd2fdd5e94c08297ae8dd80c811285b11f807afad4050a33d34de75e739789b33ddd291fc927bef9bf9d3628c23b212245463273527bb0c0997c72a12fee9364d27021a0c0c4fefd88b4c80376134dad2dc044a1d45b8e65927bc5f80cceee8ddbf8c9080afd2937a534691bffc0774c9a30b9cd06abb86680bf6ccc489dce2c0b179093a4d01300b7deab07c88675069ed985e1822183dd310e56fdafa2703550924522c12bd10c72cd22c5cc3285aa013db32b1fd057582aa683496580344d38e4575852f362b07348770dbd7b227acd128bb7f4a0e221d23b07aac56cd790f2dbf693c89ebe82b7d019a0680ecade64babab7dee99415c5ed8b5a2c05a51137b78f83a41b88c6dcb094c8387e0b71369b7520e5e34bff2ecacf3a12683ffe4d9c5bdedda65dbf9b3c548ef6ff01efd54e00afe83308e2f1355ca4640c86afdf215209d43080754f52ab123ef117ffe19869b97486e09d5edf4b728a94b803a9a0f25eaaeab388d43212a4cf3f5c740d6c9ac1d7e2c93a5c1f283d3acabf72d57e5b6a33e8f04479a48ef4dff90752fadb8beb9116cbc1cf98725c29c2df0cbb1aea4397787d980a3b5b9088a223eae466f0b5a871b45de4850d2cf4ae1023030ac8e6d188c229b642730624dcfa5493880dc4da198b2bc324439337e24477783be3a9e58857c0878e6ec8f65091635810acc3e0d5cae69817b9e20cd59e1d6217e748a5c2630b1c875db0062c9e1e7e2048fc773921ae3c7de02beb401b467f1341782ad0cd0ee09c0e0e5b36f4a64d52181a41c53cae973b30d4c37e9503119c5daeac47a7942173f261c9b6f11304a6332d234396ab7ce859c2454354b81766139135c53940c7dc3fdb670b0b09e03a0cbf5fdaca6b4f22038b8f1490e881be55192fbd4f0c9345ea53d03ee8003443dd3e0b03a9d8600ad44b614b14bbf1bae990cc08e4b91a7ac0d4d0ae280dd5c6a3f8ea054ff2fd5fd436d11d46a909071e53e87d5aa1059ac9467e294ea29ed56ec73dc546c11ce58626c9c1d13a554ea50497d34cb43048d68c23a7474d40343d3387cab4d44365965371680eb02b1923429e0c0c0667d141f72028fd380cfe172def92691e61c9bb637e79e3b8f03980fdeb18a2e5259a47ae49a445467de01f432f3a1895cd1ba4704738cf332b8a220429ddbc4edb5764df040ea5043db2c1c6d1eed46a8bc23b83a06c6c06c3ff88bb97a1cc31125428855270e0f69b510296081c2cd6439e863f739b6e5f5f14adc1389fa298540de83bbe945a6501b059887261c4b43dac2223d4a31ddace7a0b216285a00a610a4401f536f28ef183692355941a088ccf4ad28be77aee215ae721b3c1b3f724a096b6c5c8bc525fc974db41a4e25cb86d27716c12f52983d08db52959a17c830efed8ed9cedf1cf5e46af8600d7efed37a00bee37443a15b619a6bba8d43de2258e9b983a00d1c501d4679904a91479cb70d3ea3edfe2663d1bcbca76b7a09ea29b22312e8bd9d3b7cf4935fe94d197c302b2c5035b88a5de33077786b13c96bcba7ac7f260989e21366c085aacefda5b440a6592cf4c00c80f22e5b2409e15b377c6a0ab68c4fb97506706be2da33f532fd8d520b863b6e8e9726310973a5735ac633f82fd12bb5237144ba1af6531ee243d915b6f98cfe6b036366d2a6c67e70220427e2bc0406de063fcaba16b227f8fb3a86b773a4679a40cacc021fb51cd2604601042992f14ac3393b980020efae9040575948c6ac6fb849298fa0dd9188b3399ca435105af0b456c03bd168581251f47eb149b856e2932b078e81a8f11b63cb64e457363402d35705f50b481b5e65450c0613d94619a912ec33213ff4339c13510bc1506d6890c2264303994391047777306636106a993cd32025318f38d9370b1819a9f120eba24a36a90c2587378709f359de76b827458e5a85ce05014a78033b96e188b3623ade2a4495026c9c733db209039712b213a9dcbf3f92fd88df6a4b5a705223c602d1ae97deb84bd9b10fc36bad8703563a63aa1adbe1d0c39026176e70d523a5e4d30385c80ffd22579221a52c95e577c1e8ef48e49d98a0ed75f3bc996dea3a43cd2b80debba5495f20190dc292569bd11a6a40936f1d21140f43a83e22de381a5fb8095d39cbbd9fe79e2beec5764fdb05e114367feaa2dce6fe5fe9ea3eb9a329e51f16d8ff36a57146240e0864728edad68a156e8bdb66b74b725a4fb1c6f84a42c5c827d6718c3c1c36e6d7fcfa40bf226d97896fe45e4ec236146ae69c715c2e8d01d8adbe8c571f7c68747b3cc784fbb5ac98b57442922b145c2f8add8b1f1ff7433b88f805a103a42db825af93b47d32b10529bf70142ec9ed702559a2dea67f38ae9fea080858c2bee9b9d0af5351833f1e3bb56bf30e256c3b199953242a459ab6c6db7705871f5799c6ed2882e55baa001498ddb9e1a993666759e680ffa49d63e9fd7e63b535ce6eedcc1080451106adb9a46860ae262e9aea98a8e2fe887f428dcdb015626d6469b23354f09448d82199793cc3a399cbe2419392b4bcef434fefafb102d36102d6163b6c64e1184d22a3b081a023369f0da8903acdc08ea21caa869026aa94145d6847a412608f48322a729bd56e0e42b49b351c51ad5c6568df71478b955ff269dbc7140230bad7c44672a089fc974a1fe6634a47bdd78f0aa896159096b1f233941b6ce366e35a277ad7cd3c72ec91cb53e983c92ad1f4b56144f22d5856809d3517d94bf9843b8a8483eeb425830e69e873a559b7e4b3516b3004cf5c4d81b14117c20ea21769cc329a14b7581f82481c68f1e293958f9ba02292352728c50279abc03eaf18ec6db526ca6650ba1568689dc15a2a5f27359242318f9bb4ac8170f32d79e87ed53c5384091675095187a76403017c141643f4a3443db292be4114c15a2b2ea08a16dbecc2d357ebcc4f722d247f062eb9f72c02efc27340a2722677ef3a86145e01fc3c0a78ea7867b2e1546eb0f31a8564a8811ccdc6ceb92dc455c29650817b5f0f094ae6142ac49b40d2bf7d4f0814b3d28408a495a04974de3ff41d1e0550cde58e9a7a0ac83633360694367a0d0e372943d09cab35a8ee50ac34b93cdf14f371834cff83b24e052cc6a90deb2e6a0f10714bd2367d65c57065eaa8625e2f055e5fb36d458f7ed29d89c650e555858727208b4b1bc7242c5c0b00ad6c49642e7888e95018e3c4913b956a20af1a39c19e71ee9dec9b7d7c4be227ce83329de155d8ddecc95dfa96f612994f5150d0d435c68fb7b58ade65789d3a5309450291459781bc1aa5055751650ab2aeaeb169592aa8002d625afdd16751b598fa7dc232df304823398d3a8c964d0a2eec953286c509eb3513c2ef9a3be1a5856fcb982f7545a933bfaa24283052a69aac36225aff1ab63920b7e38294610912ea3875f6adb7f413f1d21b89c20f1354b328251e79e47fcea006cd2611079170c8b73348aa56059e658840981e09ca252934d7989cae93734079e2403117a150caf67b48860c18b482f52e08e76c0c496c75ef9ca8a38796a259a6a90de4fa5167471f195f3002accac58266755e5f20db82de52ce1a5cdb663fa3784102d4377204659b2fc9b62045566a22cdc6599e712268da01c9cab0de424385e8bd4abadbc249a943146f77f013ff288955b1e7b653459f3527c1e5531ad1416671a6162bc27279403b1fd62c2bc8a52cc0a5181014729407e3a16624349c6997871e1ea04b9e8b880932c3bd53013990c3ad435a1189c3f7f3a12325b49564f5c5c70550139c95885a8ddc3b7eb8b2c4627d4c989c18f3459c12ed69b2a4ac93348d5d5e73a4bcaa9809fb4a7353dab7ce8805e330e66c1a5b86637fbeb85461457598714578f3ca22826fbdf5296ed8275d7161f47a834994340c3daf77d60282b5fc3f70bcea314d992c9c5ae3aab26e35d95577ca3aa17a8b493de0d6456a6722996c561658e2ef7a43fa3668bba733d9ea3087d8b728a3e556d8b580752ed430f987901d80b80539efa34e168d3130b0655f946730265dd7bec2e5ee39cdd368e703d744ffbe81c7c47fdbf0efcbb4946189cf46c7b89ace78aa7f6b0cac92c007e37fdeabf07ec0ea1325a7f65185f3274fa802f34542819d453f22bc3f021933e7df426987fb610553b0c63e44e454fe304061358ff0e0d8fbd26bda7b7bf35a9f691f704f65be10d62cb0576265df654d3286d97fabd166a85978caf5641459e8dfc7d5c22f754edf14e2b67ec70d5a0cf94aa5bf1c87c9c6a92042b80a20f283399a7ba46cdd3184d24a7771875c2a153093d91a3d7211eb315d1ead251cba50e018580c20583b871f58ac55b6b06367533b95e1ffdee66a50124fa20a1da02d4234b25620d1d6a468856cdda8eef69d9114b5a42f2bea2dee32a60c2ae0eb6fcbbef17851d174affd62e795d6c12c631077c7da2f569e78f14dc4d911873d00a0ca987917a93e0acefdcabc7d9ffc9d7cd788dd8819f341f24330baff2ecce5104009ca18952525a63f16887d871fa961355a012282e8f5ca52d53bb6c0b76b098be3a6b8234637316c2e9d59c7ccde71630c4940bb6cfa357d6e800ccd2d64cddc3c4ec13184680523d5920d3639935f44d5369abfb7623643d24dc4d4dd1a683ef7b6bf0d367fb265c02cfd918dcf3983c7b399f937cf53880656cd7dde9fbb442b5b931d9a2a35d0e47a3d38ca841eb843f16282552b1798049a31ada95d38b446f2c4ae5092ee144e650b7eba59d1fdb05323a023476220cbda78f82165b8c53a118b49b9704a5d1d1f802f94f7d91cf22b2191cb9d979e744951ab8ece7c480da986520d75a55bc1f65a0b20cfd9f8f9a5cd027e8068e95acd17b13167683ce42d4f35aff42a06e1bfabbb6cf9923055c0ac89ceb37a879a323508fa55ff3ba03751662199bb47d675f6d3b3bb5481718736c0d2c9d1cae0c020b4610ff0ee90738595a55047150cc152adb6d0e64b4e99c7cc7c7123e1c3f26cd39e3a9153a022c52adfe9c5c043b8534928c810dce3fc9057ca01b8d023a1f8a3cb8bd8320b275632e311ad815a56f82ac3556923e02087236431410a8c666beafcd0db8e2112ca914b166f2fae4f39c0fc8de87caf24039aea8c413c95c638dfcc51d01720ad86c1087d42a1d057e8bb125c12404a847a6f3b594d4040b2541be350a48ce0b3cc63ceca120a3d3216657a487c699c3a0065dffd8b8eb8261bb73c669b21b22efef39e4ef9133ff3ab2a72630f9348a81721784953c7f5bf4552c7b13c89d8fd37a985a8e8cfca119ee3e370308c2c0bafa66fc77f5879408032b511178b5585194e60f426429c9e91dbbbd2a0e0f084ebcbfeea4c24a3146b39fe9bfbe237c36a0d2fcc94b1dae9d88b05415eea47ced04114607e93760d832a77fe86fc23d88cc1628c3ec26390604843ece2b41abcb989b9a8368c4fc0953bb02f1291f248e55711dff888db73138cf2b236c57656a7206309c111b65b604dde0339f2ad5e4f61e67e778c15262d48012a38f2d8ba08994ed0258c48b740c91b78fbc421ad6be540a6b62b1adc2a209951b085406203a124640191fab0ae2d82ccdcf3812dadc263d2f5db34d95485d867de3d5cfc30a1a857175dcef1b89236c9c7cdfd33e0584e446e03b69ce9f823c00f12bd3552abced9428159e1099af310555d3fe1995519c41eccee0d6f6048b0b89a89c19cb894dea16fd11ac4ca80b3181f601235821661c859d95e319c66f02feedeed6668d8599abe8560abd5aff12c588ea787427f3308a14697480e214bd0b45a560b0e6632f0a8d549235eb92138d0050d44e2ccff3a1e494af9c3e6a8577ce8c2f13dbd19e64e2c0e318b57168c785d7cebbccecce2335bfb10fcc4ad45ae9ecf3518d7e4989c43809af8ce85d6c66982883169475e55366033f66a73e2ea8d5be1f9e0575b7dcd169a51b544d8bff1de47c7657b83a0754f90350533516ec50315f050f9c26cd6a90664a71899ac5e1740239c2a88692e1602c39b17c82f0b10bc2271997494ebc1cd5b6cf190168418b512fb9907f7c01b0e0cd78d1188f58a46ab0a35d031ddd47b7d91e3b298fba9982d8a1e78902104388d4975653509f9091275a63e64fee44fbc31a6fc4d17c9c790951e4085c510f9143375f76c66bf985b69ac23c8bac93b9f67467a1557a7357daee5be5daad5ebceee9cc6c38df7df1af7d8c1e45c756707f8a21f7cbbe8a7965625788c0dc586030c303983592b09a9135262eb793ac2b9a11092eb1c3e85314f499a4cef4fcaa2c5148af01a5bd1e9200fa5b14aaa84dccbf86dcc453191fb7b78ce2f3873611a4ec040c194498b5218b2e4d3421eba78fd701d32673c78aa847d0169d444e24215fdbc744bbce020218a2960132bbe12f93d676045240ba24462f76ee9e0bd78ebd6b9887b8c994cb571d584580b43b097ad92664fc14bcea8808b5061212435edc4c872da74838916bc9db9b3614b3dd4c964f7ae67ac64e81d8889aef176f484bf31ed847acd89107058a5482b075486c7a13e0bf92041967ed08c4b6c28e9b15caf320b1f49010cd5fde9b733fdc0e9fc3551e8d41578ba7451ece16cccdbbe21066dc9e737c81f22ed2a22f62541443baf45cb533e641c438934097a6f6f3168e39af6e8ce2774ef0f325af4f1014a8e4c8b09a48bc156d9ab7442e090f5bcd1c45a533059429088f18254109240a2532c92f0e4e09272a97c9d5f67a632dc467763839f89c88fc6648615ebc7ccad9dd9f820203b225b90f56dfe89b6cfea8719ea30b3f6f11ac4964216e2ae5aa64c816856bcfe672456c0c17fc9be4fb09ebd8d68443aac93dec4607095c68f12aec3182cd7050b788b26c1359c5d47c33ac91e5b69191405ede365af93fea2a7b9307e69345630912a50d8ba91e5f9803996a03e82ce9235e6f739ecebc7bfa235af60bb2e560e5ad7f7c7d1bf0098380ec098d196d9b8b4e34bf789bd9ca205b309620a628882ac8de56d2c5416c306b124f07641b51d614bfbb669d7d436318959295e31815ec6cbb5439ec09635f4387e21f467dd51cb2c4c16869e224d967f00a0b176bc38b74a78c7b2d2c627ca6a47a6b0414be5bca9dfb12558ed3776a2e0db89ff30d404450e0a42a1df20c2b1663b758faf19bbe357da58c094cc8590e67d59516181cc25fd6a253f7dd182dc8ef9af11c0bd671f4904223311647670b00d1f77b47d0799c81634899a7cad829bbf8c37c0d7a93021e4e653cbd0b9c60870815e2618462d210a1e89859c472e8710037fb1c0c34eda38e446a1d9aa74876f659c65c5eb5fe0eb25865847e6aade83ba7c4a4198ff290799be809aed48312532496d934f7ee4749077b1a12fb6320d4e1423949ca86c06686de3ed29c744decb4940835fd2651c33f8a285346d6ec372801b749274c3220f969e8259f1f0d69e46a702a75035ac6335ef4826e905c1dc4071fe783d2ac8a1230dc9aa3f2bd88bc22b3716699e8608cc98329c558b290ca676ff4f10a30b0a10003e803dd268d6644bb210d30649b2799622af7cf3fc21ca86744a3648309e143420c7f04465d403eeffd0e4272816bf92f36cc0f377f7f713e6230854a35ccb7bc2b5d538a72dea7fcecc86123ae6ffd9e3a86747e110089bbc2db7a07a843f6d727e917e05b993717241a6bb61381922203127e43ebaaef1ef239bac3d940b26881a4add6f2bbab03735ef342bf9086d5977c8180eef5d848a95a0a5a5ca76594480bb67e811a85236289a83a381e15109a720457ab98455fa414ecc0a6c85a86014441034a608a785930561aa5036ef5243099450ffffebc84c73ebbc9956eaf56bdcc378430ff0e00e13e0df0e838cb6ce7094e59775ca7f7c34101677ae51a4f015b17f529b487bad5bb0846d7bd704cd4a4d9924fc8267b6fb9a594522699640aef07f6064807dddbe0bad5a3b8eea66f70cf0ba4e16e6e542b70dd6ac5bd0eae7b120a5c8742611bd7695a0e0ec7254d1c0ca771b3e3d79f7575eb4de5542b12eab25fadaf5cbfb68f66b061c3860dbbbbb91702e2757136e4d3b79e614ecc349d9b9bd5ea511a0e3c6efc0e071eb7bef6ddcdb5aef5129b21fe91cacd8f980dd78daf539f524d43a1febb55bd5ee3ba9b97c5eba7655d5bbcf2baf2d139e70b5a8d8fb1f1f605cd440198060e3a6ee91bfb517a6bab96a5a3d65aadb7b55ad666fa2bf5a6c64ad67eadd56e4adafd71cceccfa06462de47c76040e8b5cf9d73e3af4e27077bd2c3645afd1b9b0ea4e9576da78d346d8d6dab5fdab857597d537dd44c95d96e6ee5baebe9eb3caea32854af56b7d3b989978d19ead387dfe45a78d9ed49eb7d40257d1fe7613c1bfa194ac51ec6dbe14bdfd145719cc492d783e21e769bdaed5aca959de21e2f700dbc30182871bbf975d5d7ad7f7a65bbd3ddfaaa1aa7e515031d13c3f22384c3cdad5f006f211daee987a157964e77bab293917a6bb59ba51209f66ffa6da9cdbe5e1b0ea86b3b69d5477339f8b56c451c7ad5275bff84cd502b2793d03a225da23af5da8468f6bbeb9e86344efdc9ac607fbd637f3dd17eb8565bad8d2de7d6e7447f9a6ce0e7e751a1db9109e3d64bb93130304fdecef5f508fd69030c67e2babef5daacb5f1aab5c90698dcfa437eeaa3229f6f755ab7ce6fb47f41ca1db10ff38ed920df7efc4e7ead5cf7eac555aea39c92ee24172bcc578e8b305fb7ee45b931764a600df461de475fd6d29f6f6b98166737cec6fcf856e5ba20f6ab0df6eb0f691cebaffa1767d58d6f8df9ee45b9160c36c3f5953b521fe64f980dd7bbd6b2319c654fd6932c6b596b49a1b9bd4b29a574c2705c356dd99736f93ea0a6556e48af2286fdf5d5f69ddf2969ab7e8dec09ed88fdebadaf4fde4ee462fb32977ad5ef94c057dffa8721e0aa4f39cb7ee56cd08f3febc7b7be632e93cb9cd094c06b5da48d7b00f3b1cd7b0093eb94c06c8b1f83cd60fd918b9b2f83d9705debdf93b763d59fdc9027758b975e5a190b62e5052d7e9d75ef5e9c0d06f863af007f8c6b72ebd6d15bfd75f5e37cfa5b6eddf8d2cd07f4214f3a884937994c5e136f2b0391ed999785b880220b1421d4651b40b1c41151aebd3c0509c0f88991e28b8e1245ca900f10d7ba3cb483511a3c3c5145d1101ec801104129e0728410971e6e7659a88b2f7a5678e25e38f0e962872ec688527435cd7b276a873b2e0ffd000957bb3ce4c5105da2f7a4e01bce1da8ec506587257660c10e51ec9025420821845076fc0187943c1cc5c083979e187c7e628c7246ee4097543cea00113a004607ba74e08b139f184b0e250824a22432d3184229ba13e9c1a869b88723da8317eda707f5f3f33f5156f6c90f3f42f8200c2892cb84488a961c2959328517212755a8a427b8a209695cf15141119c28411750b29055ccb490a32144370c99220d2c47514a4a9d0551b60b4891089191a222469e74c6830f45514a2a8de881111554406101b55d1c49f4349cf021a26431824aa908b650e183193d4894a0a00312d92d483909c99223254b8888c289c8e24460e1446881104208bbdb218410429725387526e46808d10d4380849a86818628109106b405f53f5cc50bbabbbbddddddbd3deef064664a8c089191a222465200d4347c252886146071f7eeb6de2e671931f14252b4e448c9929f2853a63fe91f4070dbddbbbbbbdb5bea6084d9238c8e383ac28b94299c3cd18314294838c982c7796005102dbbbb6d5b1f776f9fd107986c6b4ad330d095889232cb4c9c150995a0eeee76771d5840851c0d21ba6108125a90e0820411900003892e435081810da0184288248cf001173a90ddad0312a69e44888c1415317285057d258a2b59b42b58a0ae68f9959452870fc0c824ba24f1a58a4f152852b69452ca96ddddedeeeeeeed696891089191a22246948842892c4a60a1841625b83869d9ddddeeeeeede2ea4cfa0d2854c216a1ade5214c314a369dd494fe8e0ed2de717588444888c14153142021f12402181141250f941f5e04410bcd8e28c21cce0e91d5871032cb7dddd76777777cbb8c5d4488a961c2959c2c40f13519898c204108a892bbf0a7a3db2b5f8ec7702304ed0e5045f7a4022020f60e1c10d8a7a86682d46d322913f7cf1d2450c1e10a1082e4ee0f1d6c175b7820aa0ebde3ed4734595d2344ca56328a20a4a0a1334a0410854942ea751b068c92c087ac81082e534882b4104696428c1aa400451a7434cf1c1b004911d1d116308624b15540c407889c214c30f4538a04de4f403465c58d84f88142852a46836584210ac10421d8310439ae98a86651891a2ac1042b943941f082184107a7bbb43082184d0a180104208217458c6191449d19223254ba8f802448df004661239325254c4484f143db14740259548961c295942a918c3e7fa77d3404687220ae968824cd2286408d10d43a830c2d1f58fb13a19420e4da13eeae9e929e209274264a4a888112abc2c81e59a1145068b9c76169fa3eb37b8246d2345458c5081c6968e5c48fa28154088510742a046b8eede2edb0c204449a9f8c2e8ba174d0a008c30c2155ec8c04b1421b6e8401868c4e950dcf40072614948c4485111233f00011121b416c29845ed16523484e886213e5c8134fcc30e668c36b60cb4298d14153102254bd330165206285aa49c160a0f657c51c21967e0a00c26b416926bd9ddddeeeeeedede4310362485972e625cf0a509f3e7a703567a604a942bf65044a5bad3273d4f3081853238310a6aa71ed802699862a132f4f004a129c3cf96a91f58fa72fbdbe403e576eae766f34b4759e9487b190c487c12e9a309861483ba98715e8d5eb90ca846e968e37b749404eda2b421c34cbe5be3925cc3c6c59c532d28ed3b791ecb31113ff503732c2e03aa1950fc79243e4c613fa49cc168e0fb1897c660c2edefb22bb79f1b0df93650efe384f2f83bd178546f4a78d1b0d0c28ecf99b151e33bdee2f39e4acf35a7d3c37e9cb87724b7f44aef754708dfe68e05d1ae3b06e435f13678539bc634d9fb66e587f2a05eb5fd683ca88c48f6325bc48268979491b818b7be366a98b4ad44c612ba6c325b6a43bd3471242ee3e4f6e67c329b3b9229612c1d515ae5b7bd21a7bc4eaa5bbfd3f124af9a94ad48305ed66217328801794dc89f8c93fae19515a99fdbfd8f7132205ef5b3f65dbdfc9d75f93b5bdf7aecbb558c007a4851c50b976700ac2f05109233856e7662869ecd0db8a6bf6be1f2c5ac5c6f7df1c1fa523a8357fd25131453098ddb2fc4b483d00d86fabb4b4726e926ff61fad2518c2f4d50e2c080c42f71ec42f7f7c6e6384a6394c8e09afe6c2b2d816bba4bc9cbedb77a6ebf356d516e7f0e0cc86b627bd76e3e170763e59ac718d03cb65e80b20bf01ffb2123d7add4a569fa1f0b421f03426fe9886bfaa50ab4d73ed6db1e1e8b02bfce24cfa5c472cd8631a0792c6b810b2d7621fe86fd90df4c137fc38250871d29a7c27eccb77456cb5e14a3946694a4954c30f41443a90ca53394522aa35348693f4adf8caa6836a94cbcc98ccf084ab076fb1c386ec7dccc7d4365a3460a35231373823195ba1bbae6a40cbbac55e994d1617333373333733337b77d0e1c3754366a701993d70436cc90ede7ddb01b42f8b8eeee7ec85ded7a77c3ee6ed8b01b367733a361ad5cc2d9995d2ed1eeeed11ffa60eddb1a7ad6209bdda35f2b67e00721c70b239c93d28acdc01cbd303a01d94808a72efbbda7419a0e455a829939c39c2f18a5f8930cbdf80e8642b8ffdc6a555640e56148e392324ff910429494912daee16faf9e02c874c22248d3744b1f69ef57fe72065d7e28440fe69a7e28662d1b82e338a4a1574edda55328218490e9d6711597a5cb76f8e03f9bd72305ea2e9db66cf7c1f3e6682348df777bc965aee9223a6cae8f6bf8b5d8e1d05b4a8fcdc26ac535dcd21b1ea057fc4e43cb1f5cc34fbb217497fe0e00a177295cb644324a14fa735894720d77d71c1a89061ede0edb9fe41bd5f99b5ed374f9f935aee16f8d6ba494d11936e9553a2d156cc9c3b5c969249d1dbd8a1aa9dd25d4487dc17e2e2fd6a68d55333fc66ac01734f898593a63ddd9e39a02d77c8e1a49ce5c93820cbbfda2efa439ec190967a4937ed715ee688ff2a449d8ae0369e00da47129614b14f4cd7bef3da6327c49e9b09939660ed3cccc50ebd26b2ebdf2ee2dbd6a2c7ad54b402a979f7695cb2f395393a13dd6d181dfde2ddf120f0a182dbb1d973936b5d65dba187387b0e55be6ad9bb6e4d7b01fdc0d63fb75d1fe9dacaed279c2205cc34fdda5d32925840ea5f4e8ddee6348ebe6a00bf16e49a594dcd15077e9b4a594afe7bfa79c133578232537f5ff1c0c1b36a4bd7a10420857d4a58c971f6c32b4f7f2218430d2383784dcdbf709b4975d7efe8b6b1e6f40de75e61a0aff69af9219e51afe0767607c4560e8e8b4ce12a8473d84e191139393fa4e152f8d83309fbd6d99c95f31bf9bf9b8c78d1af770d585d9c33cec2bdf4a18956333ccc99d3a47d534f0d438aa5e755f55e39c1ebe66e2ba26d7f4d9d6e9b8993ce5002f8cca4aaecb7ee6b12d734283796b6130989af9723b6134f085e12a3643a9341f8342836fb11fa67f1890ec65de07346da8cf745c99f7d12796f98e569919191546035f19ce4acccf9813a7a3571af780424be2b73ff30b43711e86ebe45f3fb74edbde356d8fd1d2c677665bd7e4666f2dd95df79a7c9a135effcb28307926af31d0c11692bdb950cee93ea74f9fde9bdb7e8f514a6c8ff108c20821379faf0042b8c57c578688d0834751c214685c0182255ef0a47f70211a495cd8040a2fb4d8c28328aee839014f7b2145103d88520481826bba2c451053d2e096f01f05985cff1a4de28380651efd96fd2b3eccf55fafb76cedac4e51d1962d44449687ac55bf6233b0f0d7a31a879f1d0c157b187e746da85ef153ec87e554bde2d78139efa706cc332c3d4353cc5bfb7ebac6339c91493d43d45b2b638c4a98700b314ad9e57600f82bb6b0c3c3783bf2af16668d0d3bb81aaeeb4b93b15167e52477244a7630fccbed68a4f495f4b5717a18b485997d77f9d1a52f23d511021a227a1fb9eee6d6ef98083b324e49dfc71d89cf29e91b8f8a82b65c21021a9a22446b883fadba635aae6e1d003889e375a8f02b76306a9e5acfc27659342ba480c296a3dad47000b0b019ae3f626bbeeac04c7b86b15fb26fb29c0d170300aef34b6b64048a31c628b94a7fc7f6be051658b8f15d83ebe80cd769a497e13ad4e9535cf09e9ef9f4d766f2691aecad8d9b2626f5938282f97cd7f43ea069e38b63eb72dc2e0322dd2e03ea322c9d094a57fad2997ee832185ced7d74968a52cab2c829893772366ad03e7ee472881a7792965edd44bba06570394b0f35164dd45b9a0b7596e2cea6428696220a1a6270807ea20597638626161591432122bdedabaf530977ac56eeb065783b2a2e34bc9d197480b733b13c9bfe2c41439763828491debe3a5dc7bf8ae8d9a8b65071793b0e85cbed9f41138b9506afe0f7abb65011bd9d5217dbf30389839ddd01c618dd42ac06784f27d3f3fb68263d7784f4dabf779245a2110b42e2545ac450282b59de8ef5e5d9604143abc1c572fb3309a38586f545e550e4cc66263327fa31a457e65b06aead9b757dcbe1cecd2f89e19b5bf7dc1e942edfa7a49d96f2c1b31d373a2c34641fd74aa3ccf5eecef62477caeb9c8c1584de2e03777247e44b29e79472729dbc9d942653294b62f996c12927693a0946e9d69d395cbf53a65ace1d998f42c56845f5a46cb3927a18a5b5d7d63ca899f97866646810da16a86f2d0edcc959554da5a49cd3519f6d56aeb756b59259b93e5e2faf7a5d5946b38c52afd6e554cb1efedbb29b6d49ae356db0a575b32d876b625eb984eeeea69b6d12d03e3e671e3d0729dbb23285eba4d27199dff6ae85dc9dbd9b556b5d2e49a48c944592c7cee2bf2dbea665d55a974b929cf3b5b367534e7b019139948b245363c37135b8637d611b20b847cc0d1ccadb89195a2186538079369d7ac2356db32acf26dbfa4e9929d12d4ddeed5be90c189328d1ee0f37f524f533a77097379a3827f57363cae958e8cd2932d74e3157c40c61959ab88e6a1cca9237deac4ae39c4cdf32dfaf9d3614afb42ce8f6b766e466275e692fa33d4af3130e3d1d467955ab3dcbb22c8313deec0aec393ddbfa665760cea5314d86ca4a30caf9ae9457b6f1cd929436cb925446c7b20b756549f88451a25436b3be554835d4e6c384f64e9e07f5d7f6f33c28cee77a27cf73714cb8bfc9b5cda4f9f3d55ec37e689c8ee69a3bc7e3a6bbd1b209a394b1bc6e3ef5adb7a492172794c7c7c9f3f838d1784a67b00bfda532580003e89f5802284fe54a47ec42bf5401bfcea6c47ecc9732fae617ceb62ccb99c6f4d76632e170ddcaf5daf5160ba299dc04a3ac96c582b86579613523f9dc71c34343bdf5dd4a87857888df3b6a43314d89c6b4695b37e46a3fb351a6297d6a2ba18c5ced9fa9b4e46aff4aa42f69abd284d15ed5d2f846d3d6c92e03177e9366b429e1d3718a49e294f045d14c30098c50c28db6164b2fbed251ea89c7cbdfc94953506185d50e1e5cc510633183fa8eb3a47ed8a69ff9addc1a66ae327f79a7bc9e81556426177247e6bf171bbe6e276d5664643e6e49a215949581d0a7bcaa8573660fce6cc2eb99731d0664bee94d5bc70466b3827aebaaf65442bd0985b228eb2e3120ae4d9f1fb11f24d7e624f9cc3e4af9f192dbbbc0a516b6495e496db31235702977243e49c6c88f90f4156872a37c5c2323eafbca8332f32949a4247edf6dc24aea499b15d5c7d467a9f7942ac267d54cd604aadb00f619104a66263523839a7ee77b2b8de353c97459ab624dc86982b9f8df95cfcf4035b3a2d56bc53915ccec76c69d622ee61ef0bb28e7657a9d52b8dca970f9bb154e5c03ce8273c03ad8c9f11d6b612e38e606b7bf8331431c0383fd4ec78e140c32cf5da47c602fee062ff4c67e74dc4a5db8a67f6ea532dee684fb6cb21d78b8fd386ef8c0385912bceacf3c50e5034ab89c3ea74fcf3208a10d9437be571303734aa1369977ec47132593462a7931f540ce85c891b624a5258cc136fd1203426fe426bf492fdcf8463965ae20268245d0a883e1ba9cf057373cee133348064baf008ac982cb53c8a174121ae95e5b8c90a927cacf8d36c6085d534fc90bcc893cbe01f8b22b3003f2c7fddab72c0392c9806837c46085d88fe9db2565748f573ba1a5369fd4ab3e66e8ea4a473153806eff14ba72fbb110dd98a0a10b14838515fbd37e661fdab7aa4d9bd9545afac7e354442aa21494cec9aa344d0b66b6ac4ad3f43750154fce2b5e47e4a3b6ec059915a6e94f6534680288fc0c069c5d8139f52d182eabba5de9a896be948e3abec47e685f3a22994a4759a691b2127c3bafcdbade38f2f2adc238e9d54e6834f563b3209967ade6d73cd26ba45c72494821b52edf66ad150b42e5b52c0b0b422f5511d4763add88c365adc58250bf76beb5c0b5b826fe85fd90171684c26ba152a69f3b000c03e25706168605a1262a5e4c526eff4ba12e2c064bcd2a970165407762995048ae8b81c16d2cb7d3a650c9682b798134556e9765b9fd9db56557204dd37459141996db9fda8052509aa69dd0ba0cc8090d835cea67061a0cfd440c16ee114b4730c7b2e5523fa99fc82523ee21533f42978425a0f2585ca92109fb31db4269a6ab6e8fc74b47250c08774b47a5ab6ecce31b5f0b9926be090b02d30f72a0b5927c6bbaa415eba1f571b3f2a3f1589f6d567e503cd64f21981333340473ec37d56e9701d5ad014cd39fa1e0fd70fb4d5198b8964b7d60881098f376986d3ad2ed523f242b55f0aa9fb4592b6c16568b47042dd534ec06cd62b116e79b8da269fa49d80fc9592c43dafbce62b9fd76075609554ae3d028754acb2959321331d1f55516741985262526afc907400c9cb9b5054d0460295e0bb771aedb6c6cd3afe3c265a1070aef9f7642a970686f47068bab32e0501d8000b7bffb29075f80109e2c5455411980704dff6927003c6a58a1fff5ab80700f1564783b3a6a80e185dbdf352aff8fd7d67fffeefd81f8cff97ac22ba3ad1263749a18bd728f0710a3bb9431f230bbd035b931ba9431468f2e2593e9510acb3a3a8e2fb6bbe964d3c5dc0ed5a162aeff3b72e21affcee6360c004e38c0986a6022602aed3049a0a4b5509a804662414342ca684814c8b0559604bb56c02a7059152e25d64ac15ac0aa3aac1c2a45a15e804e8e2e99729b1890b1fb2b331073708fe8376ac07178dffe1b14f52aee11bf29f42a0373f08a478d0a17252300d40e142905148adab7116563a4717acc814d698c29142ac6f73721a907def0a590246931989be6a1be944c6df43028eb94d023dd31312b372f90c147af5a8846979052cba18ed40d239465c484839d49b806c975410b5ace4f187950870b7930128357fdd48cdb4f803eb75f136e2f2109f7e83090bc9dfe72cbb86dc4e4db685a6d54a77cd8f482274d83d248d5aba65d9e97db4651726d746124286b542b8706eb9606988384b90ee51b12c660c2eb813a5c23ea5b83f103726dd44656fc5964fbe4037f0d69f42ad9abc5526850b3b01f0ca1cf663969b5ec85d959d2d142005eb87936dd2300285c7edf3a07bc6ad85edcfed75cdcfe00708fc601d7f43716cf660867083a5c5ce82e6e7f67737907ad83db3df4de107cef514c2b49b855c88147e7943de2db6176b6f1d7a4bf8621005ef95a470dfb21df9a2e9813a4749e623aa68a6a94b3ad682d8a8c62accc76ab50ea7ad8835c0f7d6103bc32c2205cd9439a09267e930885721061992fe6193c012317304aa1f177b3e8bed762f9594717836efb742f0d37e365d7337a3bdab379cfef8b47c67b49601cfff70373acb712f6cff5d1fe761e18f4edbca3ebedbc2ecfe6ed3c2f26eef19ac035efb1bffc7a12d7f5cdb823541f81f17620d1d1db815ababc1db8e5bd26700ff803ae793b90cbb3798f81a1a56197fbf8bea0c97fd0bde5fbe659b80816b9d050afb0b8cfb30869cc34f2f9480fae0f88dc068e83fb7eeec0b9dca2fb1e6af12deef32beefbf7f007dcc36bc035efed789667f35e4b16f77dd72f3293297fccce85ee7be6c831908eb18ea05eefbdbbd77f75d37ad5ae6933becb934f8c16fdf7d5aad1ab3be79c9ffcfb35147ccf4afc1725705dcfe43581d075e0d5d38073bf17108137468a8a84003e85900a0f17ba6422fa80ca97232831bb1882095b50d14248d110a21bcc10c10a4ab0041144d15028c1911862780e1128414b17f1c6104634d04265441142a08415d4c61421840008a15a83089191a2224700c108319ec05249786104163e7344174630016584140d21ba61081e183125c214b185113a2001d384140d21baa14a1653bca096089191a22240369822034b48d110a21bb24cb9322b11222345458690620a08a690a2214437104183229e4006f523a028e20749989004588a10a2e24411556e92d039c4eeee77954420f029600025f142aefb35f42827bd56e0f6b9fcef09bcf3a43c9bfeee318171743cff338377de9467d33fc5cbe57f64b018bcf3a83c9b7e2a63a8f0dd4bc265a0f7c5652cccacf38a80aa5cfe3702def12174c42322cb1382713ef082f0e13de951f17380776e6ed2b8fc18e01c7887c7b3e9e7918427c03b3a3a635c4ec20e0ccfa6bfe007f0ce3f102ebf031867e6f919c03b3a7428806de09dd54a8b2b76ec102200ef689d012eff0b8c737a7e1c0e00e3c03cbf0defa09e4d3f0ac7c4c2ebb85d8e7eecbbd23531cef5d7652f777dc4e5ef11f0ceabf26cfa1b680a11bcf3ae18c138f43fc03b6f89672304e3d4e7f6e1f2bf2a6fe779a1f955952b6fe77d595d794e9e5c7e342b6b6d5de97c410fce39219c935a9502996f2d7704be95f2769e9727a5ff51793bdd43e5edb48f9307e4855a5e6afba0420a3a50e871e2e3039d3d16ad56a5766e5608cc792b609a7e1848e1a5fb5f90171f6fe77da9ed3361a5dcf63970c0c901f83d67d7e4567af376de170b61806101727b2fa851a7652bb5f6bdb538fa73abbf63c74c396aa634e9d631b9b6d2176435b11ef6c372d6cf8dbe0fe8a3aded08fda9bd9df7c5a25432a698130ca4ff823a5eaff2057de7dfbda078abedfc56aea340a8893b025f7e69eb82f8edbc2ff6bbc7a77ffa7d79af678a2cdab6007e2fe07eec5571fbaf3783dbdf3e0f8afb847b3c17f4cfdb792c785808a95cf7acb82d83db3e2fa87120ac96d2b7f062ccfa1764b92e5e6ad5f806bca35c46a1c9eaad008496ef978e6c427b491ed53cb6c727e013961b67e33e070e7e958d1a29d48c4ccc09c654e2b4cbfdfc9e6197b52a9d323a6cfe8de3384f824dddb0be43b14cfdae449216a510b6d0b7df75f0cec491820ee4bad4edb41bb7ff51f89aa6fd606753f99eefe3a293b807fce61a7f6f273d0a47605947a72abafd9687843173286cb3828a48c714aa5b0a0af6237babbde953519a94737dcc7163fcc73db887fcf890673807f5317bd2664b5b2a4aa77e9ed04a33a4a058a98fc291a3beacb55a177d86f92ea0dfa8744cdb286ae9d0cc000000008316000018100887c482d13ccf621065bd0314000d628e56606a3c154723518ea3200ca2186388318600400032c6284376340f6a0c9159e26f958c8946352a6e85ad78282bd7892d08c3b94dc0eb68bbcfa18f7ab0ac6b54116163494bc300cd1960aef1122963a0f595e73f328844a58bcb84bf27f25e658b76607bb3231827bf0660eb844b6d74d48b946712c6398c0c87452c67fdb7b428f9e441c9a662c7a4d915d097fe7902ddcad22439f8952351ff83cb09ddf4f690be4aef885d0143ce2e712f28131ceaf10d0ac88d1045e58e270cf814ded1d5ffa713a431aac9a3efba2bc2e6bbe4425e2e0798acf0ae2f505311fa680cb9de5c1ff5ba7328327116f8c9a77f30124ead38b315ad56fa19f4246ea8da2d532e822c2ce7bb434dd62d91e86a11305e42464e244bbfe5b6141797aaedb7e19c33f3e52f7cc27721875d93208585b0ccf076fb5b02ef7d470a4d7b0cae2d2cea64e2d9044402242226d60c56c005c4f6a2f32c26a93f7fafe180bb206e9090b46bff491a319395b400f02c697d8c0d08104913ef01d18b940ca7981c6049248bdbdc3278a94336afafaca3d2aba9f306a441e8b5d3e0c689e36db4249370db974ca294815cc393a581f41285429d15c6e8302a6de14f70850e0df20cfe6557481276aba7a64ba848012893fb4643c6c36510916013c9ecd27463309cbc0c8eca1dbe1845109452913de6b97f57bbdfa2d12b1f8f738226f2eb2a1ef645bdf04d2f9940b6f1b8ec0b3e111ffb5a7680f622492d22f59f7d168302da1374946992a901682ff5a0c8b4f93ae280f68bac69afefa26aefbc085327693a0f4832b7a873442440642f1516687f00de4658885e2a4b5cd45c528913ffa175863cd0dee4f8dfad5b229959f34aa37610f1f535bab19079f4fba39a13642b25b81a488003df64380cfe9a87318ae164205e9cbf254b68fba59fc825b8a53a659c7ce8a2665371a59589863d3007a1247ac635092c08cd9769598714b023951ec6613913f10253f85823f348211654ebc9199623115c318d07e319de09b440a89ebcc338a41cb0b688fe3c9330870605cd18efeb04f046256d0f87c6fc956210802bde3f677a7bd891da947d489430cec00f6a6becc954cfa1ed2790e36b056571cbcd4fc1d6fab4271b82f3087cb2ac7c2aabb7cc57e0a8867f0cb36fb365952ef55751b63265d1f44a2b78bbc2e606ee60c2c2f28a46f979fe389454a36bbee630995ff90cee3286592a153d53858a58320449405e36a3f89c787a2d80e99c33ada0d01d47166d76c63a1ac78d412d7b876da89486becba68ec5cade0309bbc382fd0f6963a4dcce756a6ceaad8cb18fe699d45ce69526fdf89ac84b363668ea546a5c3d80097e0641ed3300bf1a2b39b67d133960d285414bef3b786cb60afa4fd050d637100d689761f3df8379fa9591185fc06f360855983d3e75643c245169336fac3560025346d1298c6a567143e31cc9005c8549e4f50ce3860fe4b3fdb81cc18e5b12c90431ae0e6d115152ab99788040e381a9ef9b0deb4cd04c287dbf20abae17a2a0651ebedba186df9b56886f7da5ade0e5ab1801e6b70524db28b6c5e00b5515de748fff1314f3fc4c5b6d19b4077eae8850876e471f69b3b0cdd339524050749aac9b2bf3aeb42b9f88e68015c87bf98d82c5289e27af1c288f93089e2bb9f2a41877c64d6f19e7dac398ea3102a325422a3797da266fb5625a7a493628a85781621e14be1d05ae5d9976f3c474bc763a1b3fba794e5076ff909a671451764a3e842c0db42afa02d1d67185c1fea1d24ad381470b07ae531eeda9bc854a4cfb06d6a8489ba089399ec66bf27f4d3595961bd2608c21a2fb415223148a3f3e734f1a649d8914ce360c9553de7122c365fe605484b9f09c15342d44962bbdafde2a74f91a46d8d0f47b968fd2bb813a14ba2f3101a2442e6489bb2fa3851ffa8d186820d6af0a489a56ca776231d93f0f2a1821e005112b27ea541e6050a3b05d2cd61eb2fcf508a99bb5cc8a7865f5783f575c64b82af0ed03fdbd762e7628e4ce419369e4c141d20b80a2577ce5895f304d9b5becd42f5ca0ae4b05f4a4011889aef61a4c572145645f6d09ac5ab55c2af2e7cf08599d13148231c235dffca91faafb0cfbcb5ba96eeef5eea02777669eeaf40a808c8cdcca97561dbc5a91250cded331a11152938876d36bc28f7c8d6191c31a389fd62657f59c9a797c6e6e5ec014f4025b23117793c1e8f1b9a7922299da5e6463efdecc384ee4a408c265de0e8ca1d2a8b7d44d20d0ffecc9c8d51b3d3b9529c71a3bb81d9797215fcd16ca5d33ce280c74ef0e6ef0ac5a8b503a9306ac656cec0208524db51d7c80783f44dc0882db67c1650d81eeff4f610f3d11dd5b1a52efa5d1a86615620d5144f7118d301d8501c27cb8377181f89390a6f1adcf1eb8fdeae7240d49f045ebdbd516eb2c5c11e859aa294bb370ad506302e0d719cd28a1476869e53ab5b365bee3473c30e82d7905e027801fca88cc0755c08d05e0e38643ae9230c0906be7cbaf0ff9a53cb4a6d36f5a037701afa0d033d6ec006602f63bdef08c5d3bc2f0b7f965bc20b9917c1ba38b1fd573fa435d4492be216bfaa5e2b011c229b5201c2f31b347dd93d89b133f7aa25eaca2112bb8c5f06f2ac3ea3e30498b64cc783a4130133d36e2ac61890429acdcb045051cefb947d468d40672bef06de09269cfc83727c17afde0983258a04e0758bb51e7e0a4c5d74958008d90d5b3c263d09011f207fa8781f6f493edb7063dc44c0e9408f0e25987e22e5af748abfcf90bc2fd0f6ab6c26c2e65ba25c2a5883c73844115d3d76f0e2616132561f7671229e794fe38b0266b8f426060d57dd970ffe8935194a86a3f657227f878de0e631018fb05a72438879c6d4de05ccace81d67724651c68bdfa344a67bf2da95c3165e1af4359974ed8755cf71a51a63a233eb2d74492b5609568e37bc50276bb4ea59e7d8146f6231923376e8ddfdd67e16131c955d9d8af5b673de7a9c2c14618e4e766d8a86e332a01e564eae23219fd0316662a86a12fae616edae43649560861906f11a3fad591f5150176870f16fbc4c135ba1e7b28e4db891f91864e65611230a47972d62f5175a1ded185bcbee1fc0bc403680431bac383657b02780a1e0084866fc07949fb6ffb5af4148159187e62414e872bf68cf2b50c3d324a14763164e02c6766960435f9c4eb3f4c0f86f439680ba7abab94652906461c1741a9069fa87016fe31097c970807422028e13c2f3e73e5663a8e631251d98f8e6dc23901a26e89bb9933f360633bd924d5a9b33d775726ab077ca246f13d5e680c3f4a8441ea6b2f903384b09f79a9278016fad73883f61c060333fe13686f96c767783addac514c05d894b92f870ab65389a2a24376a38953e62bb2201ca5461f4e96e2ed34959a118ae73d24f43279161b828fe3294fc3fba6ba72285215f58e0f417ed2e9f3eec47bd597077eb7c95798d339efb85d3f5ee7b76ab80a9bdefbfa82e3e6031501dd9997488cc5515189c8f5da00966d04ae50d3c1f3300ae757ad391d14b916e756434d12d5354c091f6a6a9476a1bdb843bc40dd541a162d0544b1ecc3c283a0823adba91ab80858b5252f9673e54896c2b30e918def6f7d1ec8426f83612333af84f2b2355f1179b97b470326de75c53107d60305ecb840979158adbf2712b5757c6b7f62fa64e0157e0cd96298185b73d9c0f220b5d4d941fce0cd56160bc1f736e5d1d8a07f947b192411ab2b2845a6d3c8a5a65b4e2af5c49416086419100b96a38e09e367be374a85da2bd86527f7ce2d7bf17cfd7375791517c8623863833bb5237a450fcd455ab080f0efe54c44d0a6d5f2bf1fbe6b24e00cbd9efbc70abf723d3fe20d7bc8947a44bfcc5305878fa81bc63ab18585287ed9cc38fceb642abcca17fefd3107f8c759723ebd8600cb8c8a8f33f667408a428230c784c5852df427eb917ed65086809aef491ba4faf5e07834fe0c7c31fc03a96a6a1cfe0978497ffb7eded2acb595851cfef4081d84a6b35f3f150fcda5da661c2bc147f3cf5752d0146202824ae91bfde72d717046cf1e568a4fed9f8f546aa7759b7154a65fcc3f4f89b2d617ca083c55049332d27e365a83d8bd3fb04fd9695867c391c42046a713d59f9af7c83dacc31c7e730f145ac617f0cf87b45eeb20ab2ce6f00ba38960320bd187473b8c33eccf48ea66ce32d1973f1ea18bd0ebbcfea7e60d974b164a9c29b08926eba7a33620630728fbdcdc550efb449c35183c8bf791d11c8a0f192822f198a51bf6296566995b58f7ab01b1e4026d239fa3ca619fc6a1068333e87e468f691368e6493b433af5bc8e344f0ee4cb7dd6dc62f583d10de2a005827fde6ed238e9c0e832bc07ea72195f06180dc862f0f7343760dfea40df12d75a9e0cfe81357d6c17dc4e9093e7e42aaaf3a71cba2a063f62229ecc8121c1829c0ce1da5564d105e59ab406522f075e1682ac7368c43c1f9eb4c1f5b0ed6276008f0e8661e1ae4b789be23aa263427e83cfffb8ac80cce975235aa16d8a8548636dd1049cde93b7ef1fd36d8d4c00b36b1e379af720d350cccc8b6060d92ee0012dfb830789d5cb7123b009c310775683cfb86b481137deed9edb1c199cdecd5593f43693824955688b84af32453d83a717b9bfbdb2eb92722098ea03c79a466fdb44f4e65274be255e6f8edff30e23d9cf9413dde530dbe83f2c98423015815a5eda24f09752e429baf2f56428ef944053612dced849a43634b02f4fb2ec34f1596b2362570e19eb68f343e4269f5e1e818b90a4d1972e65e49df7975ba6f70813798bb1ae807fc2fc22f931422b5aea59f8a9f4597a6021c4f53e597a1b1e08fa8b0f20af7c2e09ec0146d858088e97f440071c6af6b511b3833daef023a4e5c431da8882a9b57356a4b241dd06d98870e3f41c038d13ce94b3f5cb4374a91a22d6ea512b781fba34c6c270f6d3db9b378e04653b82f9247e73987005b2b2e1030343a6df3f7222151e2d780e06f971ad8164203c6b55222ae8346656607147f962ea8470bc602742cf6f3d15ae00e81c0e03e125fc2303b9ce8b26529223dc189c8aad2061aa39bc0b642420f2e12166daad6e7564043e7d9d846bab84aed967db87438fcceff995457a069f84d4a737138a2ec2897e468b08596d8a80de20778b094d9478f883c4ae1f19fd69882f46f15da81c2335771af48411afb2230fcef8fa7e93aa77b891e85dbe0b3976eaaaeb56c855e9a744008f6ddd9308762010e55f18643438a2be81bb2067592ba32e2d7ae1c09eaa42a1ad2dc2d6a88bad5ca8de140e1d1ec7e3adc4d72928c6c43acdf4da50b06785c7bbdcad7b7be30e2d3b489525a5ac87d4096896a34583ab378f749f44aeee0b3d0d309e26ab7fb4222477083e6b33898dadadf386da9dbf36be1d6f0a6fb5e30d4e6a081c45f850b5ddae0e53cfd4a53d428b9ec88639376294f203be3d14b79e3eeaa8ddb82f3333015e19161fdd7893fd2137de399c6b41975560afba3630db96cd14e0af7d1120d18a313a5ed91b4b9bceeea6b430a7820aafc379590ff99e3bd53b2b88ff70bf061bfab93a8b81e50863aeaf494b1ff025daaf2ff7449818e3ddbe363cba45028362bc85d81b319049d90ebd980fd05ff83925ada0372534709047d00b650e4b8d107478ea9c6af932a8dff811cc80df7ce8b0a1ea150b807155945f4fdb4621f4ae3bdd82a550ff3214fec5dbbb47ea758ba4cc1744d996d0e6151c818045ec5948aecba68fb731414250dced3a8ee0ce3236677bda05983a98c53b5493246479ac13e688dd0b1828e694f3311b2fc9a6ccaa3b13885245ce2953f76f50c7164ee8dfaa0afbc26f425db2f04676b5a5a6c59bf422e42927ab4f4c9f03ee67bf2211d6bc5ea4fa10e1176014e255750b1eaa3e1dd39d8a241c130e18fcaf8d009017fe3ab97d9abe553fdf1444347dbce8ecc6bbcf7f7324868a2f2047e628a069723b5ccd98c3d2e4d8defe4935f9ddbd5f3243dbcbe3974c30e1d76692c5d968bae5f45f059340ea36c8c8036f16900a4684f7e454589cb0b2b9964e07272e49799f8d2b84f5dd1d822ba5c9bbb6be3c09debdb411c09350d0164d1b25d85a44a00f21b69103cb02a46ea483427ffcc77b68a4d9b884207d73a69d98b4b485138f53ea11ccf32e48aaa5fd34148d2d0e0b2095fe78981aa6275ba0a21f860dc4cb8b1923809554e10106e3195ededfdcda73e935c2db4aec09a8461d36df223bbd1b79d7ef56a01ad8e930eda4dbe75a8a5647f3b381637c39a658388c2bff0e8029bbcd901f1a26331e4a58aa57e160bc2c970324a7401bcbc0c8c140e8dbe19bcc34d1b6e1e796377f01577ea7c361a22d428a831039bb4170f3e6205046fda23af38c817ed325a59b7fbac16d2311ee7758a09e3afe65bb886d6b2939a8c43ca6c85e75cc2e6d85f02b3f831588fcd60f47103d313e092566fbbaf807709952bdecdbefb074d20d108fa83f18559b45be5caa8beb26db2124a9bff204a1d7fcd6fbd7363e5877f8026b3175200da914456def87c5c54a5deaf3515f59634f5a999acc7c2590a70645dcb8abacf671736e29bca7f78f80f56366b66d1b0b5f45f420508e666443db004b1f22f7855c1690900622f9a79a6173121734784b6d1b79789d1d3f9f14e86d772d9c13b62e96613ff09d0a41a9c6c02f309c409c418710bb18c8b8edd89b03f62c2e5752d9eacf1f37dc8a3af33ecf06b2b818a568fb8050fb5d70b2be6e0c5037abac11b5f69f6cd54b964934d09baec1d028f0bdeb683662b6c109268c0730b01e34810bc9ade5f5d2cbb0a285d2762155daa470fb3d8926d4c87c7d2e8931b1e08d2651dfa7dcd8cd7c50c988ce744b4786eb253c5de3087cbf3d5d9514441e34de254f84c5f132cfa424839a1d7cb40b918658f35fbf9b17454297f827a8ceb825eb9644d4abcbc92eb7979c569410019d78b8371e8d192b83b5250e6e7b45b9c507a63fd94184ab49e1eb40743c4d0d5a655d1b2ff42af0249b4353bdbad9801751b036c88b8c6a7197251e0d261f164c0f7902953bcb6f4b285c60fb781daee29d2d0bdec05c850c945d30f7352b4f9225ba7e147c9cab7257c5c4921d502f64a2bdbe0a57b21b74ab621f2544868c3f571c5c4c4a98fa4305cc5c3e11bdb61898a5723ec51c503f29f6ba40c1c8935e8924dd8c677f29bb6a49933e4715b9dd209b9211cefa0c6d10064c42ae531b269c9c6359296ea5568be1dc5724750d4a94c36f90ae1df60131e1461db42fbd20611709d734dff61f9a79cad64016d4d4289980588176fe6f22e20cd0d8ab4d0f80fa6ba8a2f8e9757d4e2e793c770eaec2e8229a4c57a3ae65d6c2906f7cd01358893c140815cb1cc8e736ca8b200fbc1650d93096267417523aba0cd546ad7b1f463c32a4526d31a9530d05c3c85c21523a7994c116c6fe5d98b6dc95c27e81ad5dea2228f595812141b0a111873b3bbb8347fd94117e928d8f58d4ae99a7d28d5d18450582362e9e89ce25244753490b337e60e5eb21ca8aebe0c478240f6c58da3ae24ab26b20b6167d4765e916760c1a13f64170d1dd22887ee7b1a7c4649ef561da17d19da7b2dd369c11a1fe223065f7e597a364010a71a3906a88b4bcd0da6ab33553dc0177591e4ba142fae6d3c2a5da2608e9f495abda9717b72831074d20b656624fd87a22470d0c8a9c79c529188478b01c5f75c19742c35db390c69c7893256a6c8b735238816df9078594c614ac11d7899a5946a2b463cf64ee3485c116a66a7c263d01015305161416fe39b358b8cb0f56a45018caa699d4e40a085fd89bec9b79175d7ded421b846a8f24f9c27e3ecba3300b60f626124ad6ae1ba4a7a7297788b723d59936127f7bae0f06237207f4d5cc11b1d869ac3406e1cb0c8d2b1e87b639fe780c3e935d06135e3a1ed600da104123bed6feb1ee5e866e474f9fbc23a25f9ac82616ee876436a24afedbdf653aac8e3146514195103db154324a8ca8b12182a06ca15931bc61d0fc779666a567fa15f0c7fb48b7d964ce8e9833381d1feec35538641e34b4477c6333488e49554494c91cc561d21e98f0be4bdeefc34fdfa757625fd9493431bbb38014e815cdb6438998df5aa3d81bc50f720717a71a247ef2af5fbc1e7e8809207fcf4ee5076761e029c0d2a242d7bb0ff6e077618c94203d4c2870be94509ac6cff59ce86031441c5980b452206903617772fbea5f67e55e4a6e180f4fe18e2f095c243b225e1aeffaeeaef23c0aa521d3ec1379fba9843539b5015ae94cc7a5d98c931ba2fe3559fa5b6350e604daeb6521184375321c0752254588427382564d2cde6e3187e732634f9c8726ffdc15a929762b51782c0ac10d8924a07d97b7ad81661b78426d3317bdad5475be810802a15eb814820c095c4e40c19fc447bb068df8c79ffeab539f0e3390b94b783284c7de8e218d9a37169c5033b3b92801f056334cd24dad0eb4e121fec7400d0a67141887abc5ef18e2fb55abb63410a214a0d230689d609d5774f89b2e89b0cb0953dc55061bf6a3ef81bffeedd802b28d90718c2c8098b620ba89dd2d1d703f4e643735518fc6768c47c6b94effdb540cb957463f21b542e970916ad6626092fd246f79c59ac3703dfb559228642d5913185b528e869b13334156dba51c592dafccd65e93c0ac481aef20c04930d55db926567b927a39a268d02ce867f21b1c59ffcf4eae899ec453285497274b9c2d20ae9c1442cd53990dbbb53136ef417e8ead9f1f6dccbf03e69e2dc744395c219d49a8924982110a23ff9840ab57c8d2d17e1d13db961ecda0367ae3c1906337373475d2579241ee975947cd9f1422bfe3f53cc8bd5622773d44d9b13a46225499dd0b0c05d915accf39706e23a05ff75a9f6396a8b81b5296b93845106bf87f0db5c7cbf8dffa8e96fa6a2bf8969709c7baeaadcdea7f7e40b65b15415c46140121c16f3068754081833c40f44c8593d701fe476346b9a97a67acbf2cbc04abb5364ed37dd071ee97c6f33f7db330e1600c03c8035f1c882f34227286fc8bd7b280c4a98302d6966b04fcc345e8c2f3968893a2288bafbabd54a3863fda36a4c62ae151c0666bfe7bde192fe36f19c94b549de3cf7426946b62c1fc59f1de059f1d9f7a5028c84e4f560acdde8a73187dd8ab78d9d5528c19c771ac771983a03f95a3d0765d220c2e499f8fef95f94c2b5fefd397876fa6f0a29535885ebe7cbf09c5cfda15fd0547617fcde676807c3a9ed54574b99aed00088503af49f9f16fd5c142e03118686f93cc5d2bd6391516dd21a149470e06c72157f3de85088dc0af2bb2c76356ca9c4a363804921e826c04b4a7642cee35232cc63a66d8c9fc94f18f4106d065eaf99f5a5435232ce01d814aca0ca9eb2c9bad42435cfc7aba39371f566174eb60b381d779e370bed44848bf7f31bb516c071080b6a90e930c4734ca80dded7358e87e1025b4f4e7dce21025b55ac045afd48735179569f340186ddb7e86321acf08efc1edfe37bda33f39c20aa40a763e7f458aabd3094e901ff1c9146d845a4f21f9b9eb4d3efdf0ccd2e76c5a2744261d1e532264f6c7086ec4f44c85cc493b68b4985ac717692d114b1d4418b5671705e896daf3d8a3058691717446157b1565d961acad2292d782e043321784c19806b6867de03d9093aa169f07e3777ea96021464076c51385c50496154dc84b3bb3028cbe0e4cd8398a69d208ac8ee5f32c73c6157055c9c86268419fc622369af6789ca35c983d3a6ab6689199a01932e220e86b2d8a55118353e5fff0895312ad24a25bc9fd9388b2c1856e6f2de8963720060aed568371f5288e81bac81274521f8dc6d7fab63d0b531b627f3520b2107a5434e48d399005804215e6d1b1b4b3f2a687c630910c33095486ab947c53831692a0228a3223048eab70a8a663e8524bb4cdfa36d93657cc05a925d1109b748c96cca9a676dc20f6a3d87c99a7e1f711596d47f478e9fd4cc14d3d608b04b7e7a56a07accd408927c2761bae6e9b582f552ff630a286aed9509b483d666113b5eef12d7cb78af9dc43d2fa158deb76705ab25317547aa585b185b3d1601748b92b73f1975fb7cd365b7a4709723013e34f4ad9c86b7e198daef71637cb7edd6a137d7a97d6d04d42432f084413aae111eb9bcbe39694fe8ab9ae46104e96e137987f1d6eaf9c43cd751c474930a1c80db98b076acd94f11b4b2d3fdeebc50885b9a0b8d96ae070346b98effbfbe4f8f194fc5e85be60b9f5a1447f17bfb99e33071872340be41cea32cf8b84cdda3d04bc744c9733ae7769d441f50fe26a8c4da3e5ae0c38d8116bbb54723e0350cdf3a11a50727a604ac64f516788d6f1e731f2c49cb401edc5cb1fa44ba0974470a48f375d9638021c75ca0bccf499cc0fd499b2c35732e87a3868b40268eb2dc86f750944226c34aba7369c022473cdd64d0169341ea572e55dc294e6a5fa0f9007966675c375fb1cbd4b1c2ce3d74c6b831210d590477904d28c09c1569c33146be648c5e05d0ddcdfbfbc02922d1b8b33b31792e9fe7bb808ec2f5d7168ea1b0d159ba21b372a7f1a0ffcf10e355a0a867887310fb32aa6225cfc239fc5949315271a301f1e6df5909500fc66ef7c08a77926e100b335129012b13a4be52bef7ded2032242e6ff608e4c4fb758bd953db00b6a2a788283474cf3f8ad3c784961e083239160ab34eb51be3675e3026a1e68ef31ea2fc75d23522d8a9b3296087aaf70ef7328cd9cae7d50492d30775a9ee44f014a70def4df3f70fe176b3f46a815208524fc105502d529fb85bce8a8bc0f5d78c1a54e18de0cca57a4fa4d8c1c62e89795064213cfcb088fa75133d50bc17ddbefec09dfcca89fd0b5a459e807c3f0746c711262ea6daa465489af495243831e20185a800772daf9a81aeed91d4b8f336feeed0c98c80c0cb9ab9ec811ea7c47c57ea7a9a8b633f74352b5c695b082ab29b51608875afa20ac9170f3b04e4885bc702fa6f9d5a58089f627ebc791868353901bc62dcabbe6c7bff15b2dbd76041fb40e114f24cd4e9e21129efaf4acf3decd82f451ecd24b26fa4e64ab2ae29a649140c1795230a35587bbe3b6a66f95ef70f2ae6296e3b6d2083a5d9428102011eb82985fb1e0bed463182d0976c765e1f6781c5e12257f0bbb030cae0bcbea7228bca05da1cec94d66168185f7b81514c3cbe38be09fe1df26ae99b5f739d74abebaf928c31164a4eb0dd7a5402a800caa445b829b92cdac384957e70de4ae5ce7bac9e4244e4bb79469548b2e2c237cfb1af6a323a9dddb8b3dbe844b66e7b3c12d6890c1d2f64309bc266fea4e1ad2afd9aab439c43943937d56de9c535b796c392bbf583797f3c1250d4647539166ffea76d8008c9264bad3503d0353fe4cf059bbfe645d0ef96c7b88f95d542ccc5cfff027f4eb6ba4d62ca12477227e09833ce0de8379efd087bab0cbabe8de7b7827de29a9bb8688d11a964c11b9b448e1b0c5d56b10ca8f76714c707ce8a9e08bba7225e4a01d68ba5e36c896f475744a69061985b1b4087e0f4f2c829c5d8122bfc276d7966e3d8ce9ae1de6a811d1ceeeebcdb55fae4f7a7592b9b827606928d48abe9d7bae0ab03296b203d1bc7848b69c6359d34b3fed3b755248123ebfd615e52e0be8c0b18d776845c31d9f333f1493cdd7305fd6945a70e36441f9fd8efe2d9bae4bb8824c01adfc1b51b856f239ebb9c20f50da8141fe17052b8c89563d43cd8ec4644c151a2cc0170665ae37d174f289529f605eaa83e06ef7d4b76291ff206df7506e9eae9c20205b31249c4651a9cb85f2cbab593a405c27113d74df38a9fdc2d7c3783067cd03ba105a841785bd3dbd6ccafdc34d039e1e29a340b3a4a2672add99b0b796ccee040bc51d6053393da3f7d032c24029b39bc30e2d55365049105e6a39cbcecefdf6ac70f627bd51965d0158d344a99d4432fcc841f0f96307ca52e0eca4b8f464a9e318563cf07e6043d46e8462e19f0655626d41788fbde77b82c94e6ae704bb5c5f2495056635aa9592c77455df0b10bc1d12d587fe96ca9b15fb5c650fb15080baeab6607ab640dfe568ad74c414366dedb379a16fb3e8a38c3153a67eac1ea718a92017a1de099ce8b7aea270055a9066864e205fdcdba608938626005095f88796f85ca94738cf8820f2dae45a1606b7f318538c14147ba31c2c8c3176e614f7e226e96652fe4ac67f7ef0e9981014d0cbc8b04c41b7cd0ba0e218a54efd7c7405d8902f71efa1087580d2707bc3d6bb4cf52c62124574ffbde27138b15dd141073c100ed9e49e465cd6dd17d0e34c1fa5d7aab4309cd9c132ab4792f6ca448051e9e30b3054beb6db080da61c488c289d70357c08fc6ba0e8d9a940d432c9a1304b357d2da68067bc354e141c3ebfc314f0738992f49c902ea3fd85b54eee8a6b429ab7c3211042611da8d089224fbc1d9d8c71b49409dfa5e8aa1a8b87afa132f3a615b15e0ecb4faa99ee615453a70793c5b8870c9a4ea6026116f39f32fce0f3bd630e9844f99cb3044934b816f9b975c098ec3b638dc809bf3b1063c7919ecafbb7783b162c8ac4781e21844a6288c2a782e05197f90ad8e5924a4aded804da98e76ec8d8523660ed44a79d84792b9e321d66551fb907f74932c8f5c7c97f4190aa90b9c4091a898d6f05f6a99ca10cd021ae92b3c9fb997e037670cddc8f1c08357f0533c6fd041a11ef8da39a2d593dad87c713e081fbc12f57f567bf02b166ff42b423e96f9b25c63eb1446c122013755faa06a404a2a0dfbaf8385da0ddb0503630231702bdf1601dbe3b9e335997f98f22143b9c2a42634ae730c82b82f03339e65f68fa4f6fca08b3634c69885f5cacc5cbe4260b15e069fe666be6072d0581ca27ce46566ad3a9465e515ea30d56b4709305a1415386a51ea5edbe0c2237804eff2cac92f1efc6b155eef1128bc2b733d2c9754c510c4a88eccb9cea18e4b915f1a8ea28a6199e8e9e0ad36c10ebcd2bbd6c345a73035442e82e0ff704905eb763be4f80790fc4235056bedea6b78e9a5dd766d57fb1f1073409a893be60dd57c0fb75ab61ed986f69e12c51ac0de0e5e36bdd4952f874b3ed852dd1cd86952135faed8dd4cd4e49d86929331b3d844a4b8cee5b3980337551c1b448a7bebc072d04e702abf2d14d4e66c91517b4352e84ced0180fff4e5628bf1b65be7cb56cee3c412ae0eb8a7c1c381a3d1b830141e8959d1967dc1979f4e93f3ee9d8b73a059fd3c2a7142dfedafaf4f99e2223ff674d6294d9c992e56852492e0c707540333f8c88214a24cfbbe17582f7963a07b1ea670b4a71e78c3a43a8aec832d921cd7f3f6d467bd07f7143e0ab40fad40d36082f58dcab134bdeb90b4a2a5c61d5e10d51fe4566c0db0ddab9b437171c90535395e407189a9b80d4b16014c47f86658d0b26a1348bb38453f55c0900e5408fb2f246d83598aa618341a577599b8eaedfba0dd160f040eeabd9bcd9d8ea804532d6f046019a29c5e7bcfe502ffad9de63c5e1886a3eb01c736107e36d9db088341385ced2a65bbc8ca0088da63c393570eda313eeace4dbf870d089e8240e431b184fb1da05b2691330a8f1708ab7c7c3585b2054f6bdf1d7983847e3b8792eb03fc90ff1f2cff1a83f3ee6c83dd8df849c3f6c5153126d977629cc38c2829ae9e1f3990ac9dcf0e15b1f5b347f40786175496d984bde71c5e8f7657aa84c646bf8f06813f8e14b1c259a7880f0bf5c08734a4c58a6c0e6a235ae462df2db8de52fe815547a566976d789cb65375c30bf16de0ac56f2c724ea5005e2200c5c47b807e29eb85d3f8c8aca8d77a7b25731b8ea002fcdf11ebb2d850c904573da5fe730e5d66dffd6f100d630af92ebfbba7b95a603bd4171a35791af7595f3c542915482d7aea2cc603f766536f81b890a947421c8af27422129c52308c508916c01e2b9e2ca77c9aa476e517c2f0f72ef25f6f0c589b13c0e2f5f7c127dcdb1aeddab398125536eb805adf1c9602954f30571b9009fcffe15862d4a0d2e333a37a6216613545de5ca3603d925cecde54980bb73034721b60cc122ccca761bc1357091b77422bff5fb6811572178a1e718ec8da51f85c3ff3e4c7d07ac70d6180f2d107c426d82078865f1dc744f68fb83de26152d9cfd8ef7e2926121bf74781950ff1607a244e62e30df300c9449471eba314c4e950616eb763840f48f418543f7b6e74009bf28d5824bd41a4f2d86c627ab2e12c3f9bd8f1622f002e9f907bfdbf030976511faf2084cc000638a4278135c710fab7d1595e453573565de6007a76c0dfc6895bcd10e568937d80e62be8da9467a86befd5b173d6d23499de180df349635d8912999463bb852dbe00753b64673644e698ace21e40813019492844c284365d78c8fe4cb26c2e58babb866e9ce0e6898ae10407ddd30329e00d00ca94e6292d4caf5cfe28046d1f65b5b08c7d1745f4408ccb36a20e45d235939d507cc5da7e73ab6ed9621757f0609828686f7c9a6dd89fba2c0baf2d4d6fac17dbf73f99c33a96f68d35a7afeb408bf104074509918281378387f034ee2c3a6888908731a4a1bbecdb57f19b659607b5411bc753395bdc0c3aa4a4f2a8495be8673194cb02284434f6a12a895c44c2d36a4080a8f9ef6c7f94185127876379303779e566770364c804b49e2e4ee144b82f1db3f0cafb9b596dce77b9f7f898bc2900675b64ac431dd0a9efcc1773e945715f1b8b620a5e742c5171e4fc8779524561e8056bfcb3bf40a60e602c252f1280c446b4beb05197dabb36cd59f346b89590148ac55185479c826c16d43cdb2e9a758e46bb6c9e28735519c65b971ec4ee5d07e0629be38cccc1c0d0f969d0c98e193f56f7b335c3773c2793e64374b1dde812b51a6b58c3333c5d2db59bf7d33f973f92bb786832f805eb05f883b58158dfadbf124a0e34af5c508936782a2eee3e9bcd62bd95434571a10fe000550624bdf15500c2281b3655d9879e0d1b7c7ca9eb77c52fc96d8e9eef908ec78f8778206dd0a65831293c805f85de1db00d1dbcc0fd2b12422f3c7f6ac2adaede47f3373d769bbe5ac4b23369e5ca169cfc20ec9802ef9af72a481c053c2da79f006cfbe219570ef15b8cbe81726c5cf8da4722e41a4254267ee9ed337f4648b8b06ade132c0aed445a885b68a73585f4e9c0fd0772d5e6d26e4bcc79271ce208fb5c1b5a0cc0611ad4db6fdc026467fb77aa8573e16874ea124ec93246c3a6880e90399348bcaa2b037ed7910f56798ac31d4ce5218a01e2156a622ab457155df4627a8aacea08cd33d8e31b7e48d1b3f2f545555ec15964e7521d9efc5f10779544e9f4536043382e6d025fc6deaf8842543cc8bc334321a1b61b3d62fcbe2dae7c7b035898d85c48a473e4d23b445a7dd0aa7bf12c8db7a507e2c912005c5b5c3effa36ba8b2501d4f387dc65cdd632f444464899f385c468121190da05bebe9c6df2391bb5b76174dbeaf3d7dc6bc4776a4b31794ee069dec68d924eb3a2c1a373949665fc721e00d684db2599b14528ae3c54ec008fab6fd2941679c271063597697922f98590ce63848e8db7e40e67971f974bca5a31949bc845d3b884323d834fc40f075ffe0c9f710b088f4a345e745187ad084bf6ca06c83e7485f72f133b551ffb408a4239ac8f94423ba3e4de600e00de9b830283255c8eb58ae4677758c7d79052d395d327a0e2d764b008b74f35f5481cb7609cdb1c48dfd465e428b489a5e157e3c72835cd652f49ffa75c52dcdf6b655d1d1ab89589def0047ecfa494fe19054b4ca110b5968645ec09582c9c76460480f281a94b6388ba00485128e5cc65a3484180648b07c084089331b0015f34c620a87dbb73ad220aa434cca9396613d57625a80d7228aa1205ea17b4decc4bfb7f0cf680faf5937888e615ab2f1e95f8363e6c9a2903b1ceca382c097bea95aaa601acb9dfb88d0810c65aef926bec92515e03acee9475ef65a96acc6430f72d53d39a70d2faaaac7a91ff3c27a58513d88275ec24f87a28a66420cb76a9ff2df80b4eca2c6922bbe6d99ef0cc469225057b522e37c88808b86f24c0ecfdc3d3b411dff799da325e4f1589f297d06ab13bd275c7858a08740dfe5d887cb8d93f773c4acb8dedf21d285f7bb93b7bd5348ea93507d3b3c345cf268814040c2aefe0102022955616fdbd7d4c058ffd1d041f15e66c9d381b88ed03f3804c9baedf4cc977a37a00243ab25c21d9ae5cbeb1e55206ce85ee7b816ed18f8132d6fd1b2d0bbb90280bf79542490c74eca0c2bf1b455f88f25b1665aaa16f2070286996f4a0fe26798f1805a53fecd55b4013959bacce2177c0f97d185afa6d19736751da290ec801af30a829397c0b77d26470a0a54ca18462fe4951ca81c8c4daae877ef23f2702deafeab9ac7f7373b87b9d8fc3012406d37a8913165ce0720af768315042fb1da120639ddce956fd277ab756210aa054f9aeee22bf58647660bda1049f1620e600591786dbf78a42b0129efa5dc904f99384065eb4adbeab3700bc15914a442a531e4887b84bb653b56c02907ab3b1fd4a1437f26b6c40d66d707ae466f1d6ad004d8f7b9ed099fa4d8591613ba508e4fbfb341daed8f417e7c4ca8e8e4c013c311a0571a2f73dc244ee4c72cefa42729d3917d3283f0175033e14d9b48a5f52d168d3a338c0116d94bb42a9bde50e7333cc178e9b23ebf6cdf45cb4105a922e185f8e0196149781a9a3cae29d5f9106b7df7e7a6d9facfdb3d60bd8f0dfeb3143a7df0f4fdde2a282d2f8e05ed65ff1e539318b32c45093e2bf45ec016ad05b9438d6a662409456cf70a1cd0d9732208c3411759c435c743d78ec7e9a6ecf46b7d9d5652f7a7063f6bb6778f7d4acd6895e1b5c93a8ebf54efd9b9ef022786b307a05f722618af15d2ae0de2d432909fe8f9c95f960841f7be1f25e2fb641c413452456e8427a442fe8aa6692e57671df338bd71cd5524996f2a57fbb50d7caef4390d9058c25542b58132eff215af47c635926909d9ea1737ddd60eb863881e10e6784780378e56d2978c500b6b18d9623a02aeb910469f7e01b9cf4dce285ccfb4d98edef93f8e4b7da4036a6316c2ad0f9f346936cf04a8c199bec1ec1fe78d48f9e40f07c5a212f1e184e30d48b7c72a95ca9d9d5e3f8e6b9d5823ac7bab7b7e04382a1667ea3ae2dbeb1a463cb078fc155901da1bb3a813d8982f925c76de710cf4a9e7c862283f666ea890c1245b96f7d3a259fc3513c62a6f048535058193e5c58e382470cc2e5a6a6c623751906342307a100d081095c4a2096b32f2147eb528ac91c85b603619657d0e69046c02b86d7de56dc82ca34ebef21b9d98768ace66bd678075817c1ed5776750584b255a45d973d7158779c23aee129a91c6064865bc36a2d7e9d6489445a82a1e222563f95b53e348e8301682574e3ddec2179d353d95e29f7aaec7b9d9629132ccf77a897ee11d4e4289099c101b94ad5e35d6f5b1f752b22cbef02e61a235fcae23124f3068e25b8cd56ae94ce0a618618da1573a0dbd43b5af03ae4ef4321f9bb59281833c9aaa02757ac85159ad44ba6419987127c7b66be26d649bad939315985bc192b06b067953c1f833c8f1bf96696bee242fe26e3774ca15351085cfb2001d72d1695032e93196ec1b071c4949991cae16776ec531c2140ac121cc20c9b0d73d0ef9238241ad2e131decb7679644646318ba874cae5d5edae1b92d167e75872176aeb5acc18e7ad0aa9d8d89d02b5e0b55ff30e66b3f58cf6bcaa22b36377f10b046d1396ea1e9f321352e8944bbbafc27122caf4367384aa2804bc73fd98777ba3ea498511764e8ca7898378571ff845cd7ab87b4adcf3a06ea5fa92a07a6b4e972d70ffb4b532ed54c37dee77a306b2fcab70292edf021a7d5f6650784d6652ba2f1b7181f508cbd600d7c18646bcdf015e08f6b6c6e925e05af20a8acf73ee308ba149bdb5ae673bca9ee49c435890686021e62da912ac418828e972473abdb1b0241c4018f98fba0a878f610323821ce4f60150d45ec8a834ea987f67cab9c61b1113926138771759c343e78b02128024495afe16b1c54af043b26611433d2557d25d8f15b90842c60ec82ca56778bac698366c924a4989663f3c2528036a477f30dcf9ba0330a33e46c92de5606f198770fd0cdb20ad818a3f62399b05885b4d5845dc114af9c5c37f3570ef66ac498bc2d3350dddc024c21d6934c05f58a165c199964c2494f06915330e8a085c38fb58e3ccfe04b433ecac53fff2a2bc2595b5d2fb06d9638919d4baf94e4c953a284d6819e03213a8e95f007e4c078c5d1a42dd5306ea5c1d8a8719c3b5d5d5e39c074d396ff6e3ca20dbea5636efdfa1aa022b61ced06a56fb1d9f4b8bc944dd0624728c5ece7d24e184c73f65a693a4411f9bc639e4ccf2e1e1572338e7741a5a07e68dd4206e025d06ffcc6f42621282e9e9b36bbdeef91e6eb1db13f4369ed2437fb98c532024fa183aadc1737aa13e27904cbd4e328cb7022b3af08cde708d637ef15f4cb5752942060de24c3ed7a12dd6351f5eab795848688c56f072d9e44fcb5294893d866011d9a906437d0144cc90a38473d23b6a111091f680cdea29ade6fa4ef3dacee8d1c1d75f4e68e52de4a7910bb8dff04fbe8d133bd6bb16c807b38e42939d98c2db488e10c36cd33c78a08769279c8e05158ac7076e4c011d6c4b0904f4451bf2c308d88b946674f43aae4f92f04618ecacf4a552757facf96a0c5d33699251369527109d6c729beeccfbe6c68e0685cf9a81e1c835feb84f71751805039070a5f4c15ab42578b7b6742b324795dc71a4723543dbba863989d028744289a8d99f4ae23a44e6021322aebd9340f06714ba14f0635be706607a8342377b8fc630cb2370a8caaa41a3a9c992891ed946010d2d8ab14adb06158b4c06011732d1200b7580af1c984e67a296c90192c1a48e1000581341293dc0d9c89dfb24368b2130b10a786d0dba8a2ffe51214888e5443965b0ea488221ad9da111a0e9d937a4433b46d68f963c4176d43a6985cdb9b3a411a2d2a8c9f62dcb11021c78118165ca962ba670287d12715bdb25eb8941c52497b3c78ba87b87dfea9ad7177c4c3982e4e316c6dc6f15989eb8e6a7a92d16ace122434d6ce529b417bf9fbbbe55b63a2b575357e10e7ae2a66a7a44314f5dd4fbe48b67e40c725a53ae78e144996e4df8e40eafa2ec1fa51f07f8614537b2b5cc55dee6de8a610b8ca7ec175dd7945b5a536ce9657abbcd2ea51706ad422adbfbb99b9101156fe6c0969784acb74c912b70e4f3f679915b98b71c9dbfb94a1e151284abb813b95bd11efa7cf4bea15da3bf7a60c5d1fa922a340c02b5af552afa163671b0eb75b49ff05eabe21cbf1a5b73b063ee2d9f1022480d1c4878089845b51bf82a45cfb7ade864a9e7db43e8b839c6e787bffa92a5d1d0c6e7039699de9c2cd2c280ea27b6b5f55719f9f832f8d516fb4b08826ff4a837c46d8eb27c7b9ead367f1ba67610b1f976028fe1ec5a65eb67bb7ad42f82febdc3da2790ceea03251d3e980e2ce19b6f26bbd4b03399d906dc8b28e7a984900ec803ea8fd7e3df83a9856421831e89bced197ef8605c1476fc6bd0335bb66fea150c9c0200b60eb64c2fe704ee04cfdbf8378677e797be7199f5a87a6be51cae8d6686d5fd43777be81b288bebf240c8992292c5767475b6b1f73d7ae6d1c6cc9550304e8ae15b8fd2f6abe1dbd3e832ba88723e10e844d9e60c49ae9ef44504915e0201a49f0578f4ae38e8e8b7cc802dcad9e8231c39f6ba105fc0b621e9e4fd1c73cb419978e8230e61ac8f96dd888c3e30ad50a8b21dd6107c022b029829338646f3b2fd3ae835f2154fece43f815bfab6b6ff1f902c6bb173b952f931dc92ec1cfd94be297d5ccfbb5da7a7316d0c8f59c8c3077bdd695b6de546ebdda5dddc0be6ea1216a96cc6bc9b7abcd5572d58052db50139930902437df04dbb29e2670bb4cd71c7b276bd7bf916379cd1db732ab7272606dd7f94da368e4e3c75fa921866e4b2933014961bf43c72cb50bc9afcfa5b00ef0cc47853dbfc370ce01591d2c2c65c8d5fb651a2d2b70d1a422e090202e4b13672e1dc050108a6a58eb24eeccc2c3f3013afa9a5f819ac5e658ee7de77873cd0739c8d122be328d2233be8cd5b1670a98a796160c7dc4f2232c491fadbca02b3a28faba69b1114c840c894c9e1060ade0b705173e90ca51c2f80d7307a2ac221471b8c96e6ac33c98bcdb59445cd05dee70361f0b55c889433556fd5694b163d4695d9992801ca75a5aec30da0cb9a9ec4d3579bf8d126f075434e8b1f2bfb5346f3bc3a4f4379e366065da7ac5df7cbab1a8e830a2c01b2e7e1b6da42abe962d0c79abadc2c1f2a7ad2152e1097ca8013a21ee590191017a385ab25f33c45aa32c26ae6a7009de1e91338223a1406fe5398ad9830263495f89471d530c629ebe97609311d843c4ac0023b8c64514f757e299959a80296f3693140813dfe98c1789ad47407ec0ab7d5de6fd5bc1171a7211b9a6e5a209ca4dd2d821f5cd02de15ce7a1a65fa49ba4b9a73c472af668c8e9d3db38adb2345e121ac077f9be5ff0742ef12d74e9fc995d4ad9ccb0839b0cbe0f2bcd3d5b2aee9b172f5ff7492e4e4f330be5626422cd583b121197af51e7a4f09584398e699a5fb610143a680e1876904a6cdbc00534683973ebc2100ed0b6ee7b9fc39c52f8ca3a38c8ebb0ce39973113efc5e7966fb066fdb4a58d244bf5c9e95b675f6b36b3dd8136fc320ee33464365c84784a2882c14e5a803f1a37110e9af7221c8588bf71b20c17b34414ace69098aa656b7a3c97422fd7fb72a8f12b3bd59ea5bfc47c190f339313e9fda756f43c420600c4aaac6339e9bdc9585e025bba2e358a046665e9d84afdb30dc225e649b4f27db74493e3d5203d861eb9c843abb9d806bafea827807cf123c1d91084f6b24101574ac61e4fb2dfb909984b6a184f8dddfc0eec2d2d1b5020c03cd1137c5c752b87962cb970eb57a1dd109ca77388f34dda2446e06abd98dd3550f1547d6cea541d6eb99bc606f4be7a11ba0df40749ffa8478ed642e7af5aca22bf2d0dfa63a9d25c0020cb74e7f34f2cae0ef4d5b07733b034548125e3774120f1414df63aa5009ee7036d691940633e580ecc68f233fe0eeb533e18b809341d3413efa056e583e7266c118d457d14cd2fe9353cd52378ea4a18f6ce070176064aea1482492ced343068d87023f8c53837aee24bcb7fd83baba94e89b06bd602cf06472cce0c9e490407bae1da91fbd373c7db2010e4e86f09f95c59580b49d8459fc978b6cee11349270a631a74c9b823a3d50d099309938fae3e1535dd2416affee72201cdbc66a98ce82e6117a8b99b07bb8708adf5fc0f8f8c0d474ff7961146d1601f46f8ffe9c4bde96421f9e50c87273bc75e7c25d3e69baf230b3280fe47c5ae8cb9576fb1f56440a5d164a961227c6dcb8b28db61852bab813ea9afa279b5589d5611fb9022672c1c8f984364f946ede6c5b7abd6490d96d7312ef15670ed65b4ba2b5b84ba9563da2b7de1b9adaf2809cb5751d17a231b6372c440b356b540d04bbe22f05caa69359c19108fe5ccab0c9439c87f349bf399a700a08e9f207e038902133be1954ef22dd67c8e38c22010dd742bf40464addf4adc32067e0f181d675b4f894c62414dedda7c9a821a920e22201de5c1ff8288c89a28ef59fdde8621d7b057165629c816af3020e8fe802e99e17e879145008bb34e2b9ca862075ff58a1ffe34a02656031b76283e747be54e87b9efdc939879afc8b11f514b2c047d2d8cd00363166451b0741104219ff95ac52256913d36520606503a403967907bdabb77d136cbf6023226f449bcec805992a845c7c03b54cab3d1d4182c25b93bf1b6d071cd69dc6f1abc2b848841656f2b051ca3d5f6952128b89950f45a568e3e91d86e66fd556154e6b32d23a8c139b7f0ce61c0c57969e3797413ce58d3971be0ef1e6b008f717a8114512018bf1d983eed6a4d6ac9e0ffacd0fa32b854dccc6a6ba8cce41e1bfede71ee808e4cfa67339f9b65937f308d2d27eab15698d2676408a5a6dfb1e5d39ca951938257664ce9ac2dba03954ebcb788d8f02c78809a664d30df0b02169342d9fb0da05e0fb256356ed090f71b7110f890f77e54fd2b752423d3aaa1cd69ca984eff37309b77c46999ead051b866375ffeeefada79cc3bd14ebc738d453832ef37efe476ffaa947997b571c1f08a6aea79339e65de4b3b13540e7a1fb905d87813157849f35edb68ccc7d2bce71a31f9b032ff826c0f032d721403504325e50e6c257b3b75fe816e1099896301e716d05069f4b727f4ab580dbfc2d6d068e9bf222152b45aa67048378ef8b7539b9f49bcee491175a8a6a8f00bd3cbbffd954627910c0a52287819e42a449e87f7f2217f381cc83e64d9f16ac426e9bb843168b6c0033925edea0c0df41e2461d37ea7fe2e105ac959d92b95979b69d351dc36f4208e5b7ea373cd935431fe549e5430ca38625077b12a8821ad7c35504417f986ca96d136971f82e5805d6adafd419f9594fa352f32043120aca2486086f92026583ca5506084a051ab93e8073c9215e39a68be300e037daaa3aba7d9464c53e2f347051d02d7fb9d2a4e957984806ee0b5a1b2c5d90e0d81bc01a67b913e613824e9000580362b2e496ea2def7abb03b8350b57bb2d69f68d51fae4d08996488b7d85736e5c637e5a9a51d67a3e47d99c6566c57c537b4ecd9453becd8270ef0c20fc4898524b864cadbd3d8c5fcaf8e730eb0887d87eb357458d1b8f7c5379037b238bc663acf3b45255c451c4fbff46d07ef25ca41f342bdd3084e26b1f572ff7860b40d21f947bf0f4603bd877a273965e88751d0ee2758c4537b1e0868928f523f86411b39dbf99a2fb036f0d9eace4f2ec3ec80349e0be9bfe4f49f4f8e2494aefd5c7842a9e842888c8aa0c069e89c34c3f56ea07b56a6e924e78eff4b56ab0a3dbe5637c5cac4eb1d94c97ebfae6927f293b78485a4b7138c5d1c98afd823f895226f3478976f595a61105f9a85aeee975313b1a89489a8a5bedbc31a2c86ca95d5615a7a181dc85e535413d15de2f2ef0c4d67fda849e595f758648fabaf984565b7579838e11555e29f00cab97c32c79a9c990d47bb2b78830053c92c4c5086a24f17aa5684dd69aedb74d761ebebf87b6ce20ff74eb8f1881d9d00fd1fd3a64c9a3341300cd92dbd7f35e9334231216b1eaa385abada8541839c3605b8513daff818be4171f75c3410fcb2b718205b568a1b969e87b5f0538360206594f613ea5e1c93063f335234a3af6be61d3d3567d85e392510a70732f7ea54a81e9df115590d8010e322782ac2086d2b26ad239b8055252338c9081f6ed8d9f383d9e0eef5f176416afdd079cfbe0a9ca47333592ca342795ad57d2f8cd1c2480415a9ac9ef6e4141cd6272e86c4ac8c1a6c45d60986dbda311250ccf2cba31f4a01f951b9126258aee193003919b79c3a25af713c6a97f23ef8e0dbd5fb6d05ea6b58bf6f0181020191ff8f16b699d52293e68fe58ff41ca412e72e0c5d12ce4728e5a612a295924a6d488992fa2c76551d9127853a791b4f6024d0f62e48ad3d03d7f50c9690625bf34f4b0f3c2bc362887b64daa600d21109d49d17e278a0460e5ed5a85b92e990e48391d569c422000fe70c988c5f464211ab53f0502c09cba387d5b671e7adb3b0ecf818ce80f77053830247c13458072f208cb64e9407875427f9f31240ea4abe5210a9a3ce479bc46c309d0a9546af776a607aa72138733645b1c2576f17c13279664d0d583505cf435a6c17ee464f86a3de2e16b3f04cd56e172f13fcf89830e2e3097391a7907d63e1fefc77a500ef8d63b3c84030e153c9e00437a4aeb3772e4cc5b370e3ab954105a7404e04500c5d1dcc93f61694b4107afb1f50be8d4eff52d64f70b3b25832d6d4c9a3da5bb03a42df7936dd7e81f0110714e492a382efb3966cf90c2b171bbfa1db84523e1851879146fef87fdd49860ca158163b572f11329c65a0116a94ada9b5699b141bd1924962a9322f66acd70d74ba018a457032476e2be9a36777f11f01a1ff6d43b20cf33bc26d6633c884eb5da0d3bc5c981dc28d30a1cc19ca50f32cae854b9273efc65fe7914e450a3a208839e6f9eaed9375d8dad636f3e292689d3ad6cc8c8f71e5d2046942dab8b18b50e43d89c6ec490c5bc8f4b586eee9a6533d07b5c7940023fb1e79bb539185bde2b243d063c11860819438c47a3ee454816e2101e0d6b30f65ba73f6b30b0f234045234324a315e9ba43325a0b4621c6aeb44d9a4b9f4e6b0b1d878da23f5b787eb1f5389be395a8baebdd4b7f03bb647d8308d81d3495b9655001b62b170f10d599c8c361ead422c9317f2195a9ad8a998a843223fa5ff27d513b604936ec2234c962f3ca841bc8a3b580e1318a27f43b67ef4f5c829cdc0975e37b398b5d04e414cd0c5ccea1b78da4dfda22f92888369e26e3feaee4c6cc011801e1bd6bb20829888804f89adfcf60b044bf23ba09c35f960e8da4a0d027939d965520725aec77d3581a58f6d5f2f26f8ad7109d77d8944fae33a506010d21d1038d71675c17f0125684e3724b5026c4518508ee3e6222c75e086b22a25dbbf55d6b76857f318ff098bc5e0e5ffe946c7dc9cb449eeafbc31cc113353f90d34036676e880145e156780e553c6bf35310abdb240f34a0b88b2bc7fbeae53a2006c82f32af4d85469d19d48a910462556d55925bcffca38c42bc4dff0482812353f38d54501233cc17eb58e3ac753ccf3391f62c9ab927e43132428ff2979208bb1c66dd66dfecc21f96001244574110a3ed218fb2c65b22be9bf128f59f4a60e79a71ff66f5c676609501868c650afd2b7f5c873f1eb14b257b3184b937e604e521634797ab0312b962d1b29ef77801c57cb5c7df36e587fab3b536028b45866b9bdb21110cd5ece9020c03eb2af70a7328ef1bc40f354ad247218681330b4277fc494eb462f73dc3c5e4388d8f5da636fc6810235302a0bc189e867378bc68c91a687e3fc379c90a69f734cfc9e1865caeffe93a1931ffe2bc93d3243483ac2f02a959c94aad4fa8d55f19f0c38879bdf15c45f2b83d5983be804d2542efa7e5cc0ee02dcd1f93b174f642ee392eddfc38f50ea9ecca8f31721c78321153649c4d8fd56ad6d2b7bdd6dea4860733a5013b2dbd8fa890df7abe3b97eedb55dfee0ded430d1ddfb135a33681cb3cc827ffb2fb3fc7c0b09101cccdbb96c3046d588029eb69720c8c48d1bbb4394f46a5e8259a396646a6406795507574dd0de1b4c318ccb31a61d6f2a8f5cd326580983e06680dcc37a1be5e1598ae653344e24e5cb4fa674720730092d8e350a2a96139c68486fefa229c5f971d44ed9a85588ca285195e92cc3a4ed2656be4aaf3d462d50cb0ebf59b9113f49b3047963c0faea64c5f59abc3bbb689f2641166aab52599529ddca292346d790d6c46595c10aa7d1248d2770f678b0b7cea696a80d2cf6614cb7958ead72266ad0bcebe9dc967d29e25801a810f775ede5229cc47e096fdad70a89a23338b0a444769b4be3e048159790dddd1ab534b65776845af99c3381e0fc9c055c4f704d52e3530451fb429d32de818d9ab5ed660847f50953dfd628288c61a0d2cda66b0219dfeb8cf12ab64aa9d1a65e072a97089fd972196039004eceecbdfb7f65d51e6923f5aad64b0b24cc456b8d848c9d4dd6337117b9f50a77c9e5a9b350887b766479438c47ac4a2c3ec048fff4f8fe8ad5e8269e0cbda8afd8409950fe003d1e3c51fd9a1a11cde9fbc542a9158d7cec91737ebe1452f47f65e9a7478301a00e739607c267b68ca981a58db92eff59e97cff1380494bd0556c6412bcd85f25fae8c39647eeb24bed6430035b2f0c97251a9d73f928610ace662b210eb18a081e49036d181619452103d64ff35cb8b6d139ef9960e3d834bd4f06da529ca8a275da7204b2f896c95d3f5dc5d67c4ba17c45cdc1761d325caa4c61926c8cba9cf92268e12c64292c035b3b242b8dcb9414aaeef713a06e1cae8157aa708e9e1f3fa1597809af269d1432522c52f9930c09cca5cac0b56a50edcf1b030a9dd943469403545841d66cf15ceb21eb4d708c44a2badc2d992d821f8ee365c2fd409db65410060a9c3a5956b4c0682c7c88ad9b2892882e83ead50951c0b05345887483263658586eede6e638293f902f629b9fc2e9de47e7a0218832abe4ce845f0ac3a26b1025721a6851577abb07fa0b4a6db19f21539839e47e61ef4e5ee0fefe694cde35f71f3be091b49cb38eced530bd128b4786b1c36d4141e465706b5cfbd3a01c32958d976fd4a2adcc47c5c871f6e32a89ac05d9fff6c55978b0e6ce0b067ad796ff091161e03c24cd442b907f82483e70faa26bef4855fce7a8b81b887e30b3dd0812a2c7c89064e317d0a21a96d40c55495ca0cb1c15d1de7dc36c434b8a162268c33025acbfd5e5c308eba9a0e0a2f8b0c104c1efa87044f0d877760d07675a1a1a2b29b2b6ad3cf0db5ef1b5c1513275d64c08d0110f40df363463a7b1108441d6f226b7627eaa29682f5b4837fc7939ec67bedc2b112da8e5cd49b36d9724b29654a32a305c605580633675e407dbc9f0f73598c5a959cd35312f346ff4e00c8d2a14ae89927354fcfdcd63ced4bcdd333bf953387e7306ff4631db2c4628c2c45980db284bd0664f919c06ac03080915c46f25380d233df358f4f354ffb182fd33c53660e0763dee8a741e27673e773079b3b1b28534cd9c780178cddedde2adb2a9a19d15573d61d4c98f08b18f7761cf5a1355c8a25eccb580f6ed733da74a77a46abf8989ed1d273999e51a7e60163e6a058e60d5ac3620e598a301cb284fdc762b05a6e9b1a6dcafdb44acfea12cdf5acde9aa7bfde68ae67b549f3502c3347e561dea8d233faf494eb1975a25c92f0a49e551c2ec9977c29f77b0e7e6b282828a81b1930d0e66f64c0a84dcd4b65abad671587b32df5ac4281b274eb596562aa3ccc1c558879a367354af35424a64e7f135252ecc06091bb7631e442eeb731f8d318717ec555283dabb9e66921668e8a254acfaa537b43c99529fb4f1b63ec19bb4fd6a69e5923b54a7fcd51b2e672bf6bb448467a86a53ad9247b648de47e5be4326a91e47e1adaea176754aa3941f0a967b6a84b8eda92fb9fa05e8a7ae64b68699eae22f777177bc514b99f355626c0e47efc25f7afa078527d7d029f5494861ef863dccaf4a77ff4e7a4b34e6bcb13832096900eaa11d2d4fbd1c2c2613ce757ebe8fd0e8ff298fff0a9d679cc2f20c914c40c9e8e406acea134e7e9f86335f4340d34d0fdf029fa148a58f67f4f673e486e9cc1cae431c779ec4a79ec8af15807227d1a02fde8c9e1d310285c815264d94fff474fbeab558ff7a9666808320181513cd67469385628ad777dbd6199bef1e58e00be8cf17c39e6fbb50b7abebcc9f70ad90ce04b57be32d0e4fbb3672ccbc1df4b9694ac388f5526f0a19095a94ccf58456a3d6311350f4ba8672c23cdd3335651f3c83073b08ee60dff0d9e159601c087b5ec2ba12bc675fc6f0884f320ce78a5721ef677e732d62ee98bcf97938a4c8932c874c6973732254001466a0438cabeccb1dd60f0654d5e7211e0cb1899ce647a5be1f892c56a62ff4b2faf588fb31b6f0f224b8cc79c95d4b3b64d9f245bcf1a27234b5f72022c657fd6ad67fdd43c8e832c3db39af4ac75cde3df24fb0cb2c4347f4396220db2848d64f9342f9265ac27d33c48963db9fc8868fe7e445ee84183ef853cc25f8d358738045ae17a56899ac77b566dcdd3b30bd53cdeb350d73cfe44b8b08b6ea419ec95167fc5f0bc5aad6825ea59b823f20b75a1fa8a2ee1ae67ab772bc29d981a5f7abea0c65ff0ab114462c6a08c00ad3438c48cd92ce3a7cb847c1802d91065d41743f0c355e83d6965ad1eec7983fea7eae92cf077385d916510482fec8a71190a8ef3fe778783637372c86b39187bc6c0bfa40ffae2b38ad8bc6f5024fb0f600487e819412b1df3e711c00dd6518d3fcb883faba8e603f07a001065b2f41ce3632c23d9295db1c015183ec84457f4de003da02f8aae1dd455caa801a9640799ca19b90499ca4a33aed0b942715948a2d083ab4c94ce564fae77e67bb057aab1a3608f3333c3ba38aa63e3ba2e5f8fca37e7af0637835be3de7b2ff991ad1b5b0a27861fd5521ef34a546d332ca819ff91578a88fa804c54c76f25ca9d716c7c1802fd9852f2eac31068f5330499806c3c68630c751ed2d0a69bec47e37ad5d0ef296b3d7d3b673865aca7df8a31654cd9f7942c7f4c29201d43a9907e54b8a33afe11511d7f9b1a567eb9685ae20c2b5c7de18e82e12e83441ef474561994c35f85ab3004fa285094cb569fcb6cbc7f6883fc113f1b1ffde89472a7945c57e595cafe1a643082553ce65f6304311841278ff99323f8e4a01607698c2017077550d45fc6cf20817288b80941269c71e61b90a904a3b23fa88245b94c45dfa5e847a94fd176c0f900f6f42989824fe55a83f519f118fd8a8a9c6c55ec973b385e5feac81547756c56e22b5758fd7a7f7845fe117d44d98db44d45da902018f0cb8cf9bf46508a19f3778d200ac02066ccbf35825266cc5f1cc148140d792273841658c218e1c5694b1159565004115472405c7962450715285541a252c39419a48c60089e4d640ea08501c214c08b8e2db32c398ae880ca0f103e4f643a104009071207356c70c30c03b861480f191e2d0410e686979d2d01c802802274a8c480b0f144031d3250aa8184410da40d338c360c793234b4b820cc0c2f395b70b2dc1421830a0c089b27353ac4507a21b96aa0313243cbc81091cc8c16ac30a197d516300b56397d2ac042783f5c9cc5a12ea13024873d2c27046c8d78f492f0d4e35a6b3d8a6b2892ed579287134d6c8ccc3266a70c1110a4a0cf89e79c78b4f6ddddddbdde5b6bfd3166ea23a54e8574d0f5aa049c38c432c7dd7d5eaed35fbe72adeeee3ddd638d2c27e283743e6db560395fc3f36ac07c622c7e2d23b653f6f4fc68f7c8b097836a7b38800110670535606a7ada04f33eda247ee90e7a7764a2d2d19d78cb889dbf195fdc7a9ff78d2ce0ec51a8265c319448a1a03c1ca617091480386b2d3b105c28136d22cfa73a0a855b0108ceaa9e7d5e0dc9b233d581e01d275de132be4dd4e78ea13afe38273ec1a05e172b29d31d93dd3d1cee12e16e11eeda70f786bb381c13f5f1a4dcadce4aedc6f85b9bb5d9eccd667136cbd494c350f586a5c41dac8ef95a6c08ca12619cc8046bfa5c85cafee5a88ef7d862454f04fb72358f1461b07fcc348588c7f28ec1d4d6384fca3da9eb38a7363ba6092a7bc550b56928f75b22da43e597cb343c96730ab184ddb1c44dc323f87d1f6b7acc82aadc3f274f69733f0d6246ee77f730d94ed6956a640167fc5f2e973d83bdaa1e65a2ef4f593d6ff4eff0a9aa51ebc2414a8a888a29a618fa1215b5a5e68536eb7b97ec52e42e0900717a9041a66d39312603f10ce48f0381fefa95ec006d3efd201a1da76de138a98214d9bf015ef9dddf7bbe8343470dec32ffde3ffcdd8fc41ef3ae75eaf453fa95e6140a2c6d93b35e12745cf1bddd8dbbad4889f81215f1d36817ea28afb5d6d974805e6aa1a8b2d64a62c74e6224e06c1288e5d4cd5ccb24fb57f71ef7ebeed527099c3ebe75c64c3801fbbf6064f68f2d65ff9d9e4a577929b6e3261cc9fd27b8ecde2b75e655f4d34a4f910bee2f7a87e12ffc0b930b29e8a53e8f1043850a2f7880e2b6a379144f4cf0e599fb020bcd02629771a0661fd43e200c21189220620a2949340fe836902aa483acb751d332b9ac40be7c9fda5a3fcfabb5da9da11d22cd43abc57fc71da1e6a1ef594ceed43c5629114baf90bd94524adfda6b2db563ed9da1bcc39477781d776abd3364c79d218fd97aaba5352ac059e9577cef1784e35efc1b344f7dfaeeddb1a7797cfafdba01bd54e8d21672758ae3527086f7eb7871e4199577f89d61fd1d8ec36395d611c7a5f9ca7073d7cabd72addcdcbd32c4102f184c5c89ab177672adf8008233601deaeeea8e9df2b879ce1b340c41b712c51a02f5ed495934ca5a299db5f55e5c57d5f370cdf98775f7d3acb51ab1d8e77c4e0d18dd4dd8aa5b9c4e9c38a1710495c583ca11f1c312fdf2a4c2e589af94f14375bafb87622c8ad4bbbbbb9bb6cc5faa872d4d7e901244163b5a4973f9b9bfc67b0901145564f7a64aa078bdd6bc619f06859606eeb434f7945e55daa2d4cb0273b6e3ceafc0a4c09c2160023302b3892c49e480e66703e4983e73f6f3d301073bf96de4f919ccd98f53a6aad13cfe7dcc66ce62cde3bf239a40755c670216620897a4240936a4759aba9a18af8aedd4516b2da5ded45dec5d4bfaa0dfd3b310700f8f04abe362cf45d3bad6fb9e85e0f5b82494408179c33f044b26fb7b330b0ccc98abb6c8fe9f15d99f040acc1c1728a167270c59d2abc8fe74429980afe7b289df044a71ed9a1679b0f5982ed35b94cd459edf58ccb6a277797eb3a09b8ab2c1e4f9ed65ca58ba2e797edba80fecd6381b502f1be6ac04f2cb1e419edf219832d5cf6f10cc9909e3fc960186393ba163c8f37bc894d5d47a9681f2853c3f88cbc0a93c2797a965860e9f3f80396b28b3e420cfc7e13f7e63cac49f3bde53e60d00cc593369d0b2995947a11144b9252770b9256188c0316cd626e507294d4c20f1793bdd14db11b7e6c3cd09babbb8a2a71c0c452811050e8b2820d1114a5c51bf1d0b42db951fca5caf89cdd6fa68b5cb71e1a105366ca2b526a80871612841c6ab55a22946465ed31424285e105fb85bb7bd5ebdfdf4eba84f524e204492ca7ad6decfe692caad6b82daa2a9a989195cbbeb95c05b11e5b694e9f2352404da6e5472f932a2abb72cc49addf1a04b38f946979413d8de483f1c5befd2ed5c363a1d72986221be5e4bafdbcbe6fb5d52d4a7e6fb5d39dfff22a23e387f23e3679ef520fdd2a5034157199775d5e572989ad220d4e5708082e572100362eaf5865f467f063883f4c0f38ca7f9d790ac73bb724f9a11715766060d48712e43c8f7f158f6644f851432887f3ca66387c7fa7f5cba95cd653337b4e49a7259fffce80073a60efd9c7167ead0c719754c1dfa373532d581d1b7195753877ecd88eb8cd1778d73c628027a9c90c112480669320da942900c82646de2b1db7def9d98b47e8733091fec90c7e74b92aea8fbad317c3a7abf8396ae31afa15751adf9e8d279ac3f7b8fbdeb799e85912e1dadb75ce7f227ffcc1c9d2dfed0034cd62f62883c97477ae099be4be78a7a11bd92dcc765738971d9bcb2e392fbc755c6a3b4f255cbede56b28f7cb08b5f7c76525cee599fb75e05ccfee3b982bc4d2a5cbc5c8f3ca105064b1e632d9cdfd740971859acb9f992705914b8f9c375a67bde9709f1d504d8383ab71d2c00ec40ff4c60d740662f920defcfd6c5a624a9e61026eae5768c8365fd72ef77757dc4d012e2bf10d0fb9ac57b6dc4d6ec45abe63e74ae608c1be46298a3551a83a39ce79ac573697952e5d5e72d9e77ed78efad41bce8dc9576c91eb08f6f4bfdcc7a5739d7e0f7f49bdef39c3ef79effd4a74d97dafc763b11d9613f1f1b80290ef6fc463aef4ce5c7fd4c83836215e5005bd962106d05611e74fefe64dd91f539ffe89e3f588e3913822508fc4f19ee68368f883e078e40a3dfac519d6ab30c2a405118368942483ec506226354c0ac14f3f28bbc8201aeb0771ea38cd18c2d824ce8cb1f187ea349e4d6443511d7f92650271d268dfe32fe753100d8f41b4d5ab46d57b230b9dbd5f8d1fd0ecd5f07f64902029501d7f13c85a6e81eaf8af30c2a4a930c2a4a97e8449fb6a73e7d99a282c52d9ca260a47cf5ef87854fd6af448163aaf3e1c55f0bcfa1ebb89aed0a35f450609a27a15d93872844913ea176ab2713feb0771d23ae3d9f992962c5b0ca6b58ee637880aa1d723a212b9185326c42fe7c010e8e370597d229696649a976eb8617c3de8fdf0d2073c30e88729f59684be50225346290b324a60bc50d275a1c4c418252c5c28a9a0054a51b6507a32a59483164a4ab2502ac24289869d12912b967c61c592a92a968411b3a44b98254db060c913982557a4960841c5121fa658d2e4cb12a5a825475e9684a0cb9221299484a153d282289454018592a827946ce1a224892d4a8870424953134a7e8052c203134a48b0849224257a28a9c16ac9d65a6b2df63c6badb5d6a34a64c8a2c485246c6390b05df1649be208db13586c5a8cb015e1649b52840d052bb0e188b031c9d9905cb1d960c5564405b6215592784125091653924849491245539225864862841049aa0491048828499c009104871424b1a120c908989280e0871e493c906b3d41aeb5d65a3d4a6badb5566a9194f10189165090b0e00912299c2081ea01c9113824564c8024081e9040d901890e4d902cd10189510e4888704002c3ed08184c8e6c518223624870c4cbd21127948e20b1e4484ec991216c474e90e4c80e488e2c1d398294744404484762383a526ba3242eba28c98a1e41d297be21894bdb9094a58d24ada06b4892d2224862ea102499a089924ad034241d69102419e90f24cdd045925ee81990ba681990761d0312153d840445c380a4441341726a0f20516921a414f410a41efa05a45bbb8094a46b48378481f401309084be2f8ec87c658eb2f8c81c81f9bc38d27d5d1c31f18d39c2f27171a482af0547513ebb45b6d65a6bb1e7596badb51e3d7af24d1de5f06971a4e4cbe2a8e8c3e288866f7744e4bbc2e88bcf0aa3a9af0aa3309f18a32e5f18a3263e16183d7d608cae7c5246427c5418f9f04d61d4e4fb62a4f44519217931aaa18bd10c52180dd1159189a2480b288ac23c51e4858b8fd6ddddddd2a22db8d65a6bad1ea5b5d65a2bb5599c28a2092a504030f164091d9450d28294a586248a660853941c397ae96a5174b620869c6c319e2c15a89b9b52c4566bee12b9e0e1a618e12427e5242586e250ea435e64be33e1d4e6bb91e94479fa2dcf2721bc98f7ca104c72e951f2a4de2de5b26f31b373f3dbc9653526e983de08a133423ac87a2508814b7c9e0f5221a23feec6d4ed25abc76aadde65e726b190ce9c3cfee40258e7d3bfd307056f2ee95772ce9f73ce39e79c77de3bbdefdef938b6dcbf53abe755afdef1478d9ed89038f3cc1e0c6248f6b809ffe68382681e11f182d7db9149145d42744979acdf62115d36c37f3d089265b7c62029b41ef4561857cff3bc9750eb87ccd47cc93ebc9f79878337e177980032d79b07c4d2a573e96cb04dfdd7b746224fdba1fa10bff30c81c49b31b4aaaff32bfe2849ff7e0bb95cbf0422956b1ded5310549966af55553d2c0281ef915e5006c70f3a8b6fc7d263cae5eb7f505d16df1bcba02c8a336a1d53a0bafcaf039cab6fa4a91fe3de9ff5c1fa316415fc99f7fe860d88f1f5a73feb2f59ba2cd5e56b555fc9b25e1204fc1fc9033fadf7556349fff50bf0c70eb824cbc98cbfa3ea55ef7508422571eed71f719e8e3897e4313d16c416c4b6838eae22594e448ffc4175332ee9c31f933ee6df3a969e93f5f535fc40fcfb34e4314302a139c64fb282efbd870d003f46b5f6d68beb05eb7b0db0242533aed77beab97efd5ac91208cdf77f3cd6f5cb1f1ddfd33c382580ff8e34af52d13c48a1587fc918ef7a30c6781dfc18e3553d08132ccaaeceae9172f1d8bd0fc2242fcdbf2c3969fea321cba04c55a38ffb81889f66bc3fc3abfb1bd6135a6e2028ab1eff7cfb37962c7f501dfebebf2afb37372c274f47d61391eaacee5525f8e4bbb5240b9df11c31e9e37e20defffe5e900442f30f1df97b0cbe07fd371094efdb113fa5af1a7960725e0c1e1c4b21f92bcae5eb29f983eaf2f7f75f5fefa0df283e0663d902537e3d39962d34e5d78f6319c4965f64d63163860c08ca3f87465a0d58c3c38926e1abde5c4f5987836007a2a53a6bbdd77b08f4c343a04a32a9f920b6ec7d1d4baaeb41bcde10f1d6d77b23ada48740afaf197193d7882bce6393a6fe9c321ca319eb2f2912b9d2a75c5fb817c4fa25bee1266590ecc5ac2b89ded310c8be37ce4cd9e0660eeaada6d51beec7b399df22dd8a58ceecbe9d8a2c83be999dc77a66ca6333f7efa015276936e5262e4381ea727d815e08f4b2adb72d5208d55daacb33532b3cb39bd9cd4c1521f1d0934b8bcb5eca1548f56621ea00f1381b5757940b0d1a4c6e1e3fa8426790c9cd7b37ef50983c46ddbd3969bc1f4f141287c4da8f58fbf13cef7bc209cce47e9b1cf5697d4701d5c39d883a76fcb8f0d3dab9a6c49a58136b3f3997aed5447572364e1e6b3c848786f0d01d237adfd93b40c6a30bccf4f00d37b9613911bdafff3df879503cd61e39019b0fc93e2a738226976ee6a87189b1699ad9e10773c6d6d79195bddacc2ef7d71b2e8289f0d0d06a657369f15818a20bcaf5048658ba74aea721ead3f29cebed0bb1c4434556b6faf545eaf3f57ba84fcdd7ff421170eabb13d12a8916e7a80ee84ec41a24aca4081fadde6e62ed7e29d65c3afa249638576bc65a44756c142a973fb9706cfd1db14daef54375c88825be795d582fc49a1c2f8789cac8a9919153e375d16404af74edbc4becc9c8e9ec918da130519f9b6f28778ce8b9c4b755ebfb1d2e824fc0e65b244e8fd6cc08274db4d607d1c0cb856883139b167ee7c49acd8deaf4d717e12b7f9010cb7afb11a169e1eff0fae58f0d534b04a785a44b47bb2d10cb95cda5c3ad5fdda84f0ee9d2d5e0962886e4dd429cb974e96e535aaba6a285e3a4d1184b315b3ce49a126b3a46a11d6e0dbf8e2091a785e40eb5ac4f735f08f47dde0b3b893867673bab739eb113f69e35d726b5de56b615ce46ef8a6965bb53625f40ced588d323fcd6b7c820383d5a4178989852a3b5c8ab8518440b3f88a6c2b7d6f4c40d9ead694b11c64ddff714935ea8142b98b0921832453309010800f315000020100a064542b140122599162b1f14800b7a9a446450194723811c46310c833108c200280f00000020001043885184e00020e13b90561d1f544ae1206b39ee5117c0e347c43645a3f0bc4937104dd45d8376677d1818998f7adc178f1494a6e58841ecf78b706b055ef94b5edbc1c4c3aaf83fc9687fd5a461b6c39c5a903300787e432d75df858b17bd9c244c7fc893af165e5959ed245254404ae6ef88dc7aac930fe6cb43755c1f56029849806aa423ef8ea7a70cb6a87415f0d81035c8838584a44f22d1e75adf53918b27a2101fbe3bd599d10a9825542a6a6f01d46b5bdee960b146b83c9065ae3110bec7445aa275160a27e4ae71cceda128c5bd1666320385f4544ed9224fb26d8a876977c999ae582c52815ec805dd36754454da02d100ab25dd4e5061855354d9ac66a2101609897a39d035611dcb3a542e8066026ad085bdf7e4684d6488db435ad43513b253c818e587ece1881e7ceece65e8d8fab4e382bfd9f4b781facdb0fc2c19dc420de59e08586277c3d869fe1688fb23852c24c147849636841327a59767e32506e83ff325cbdc8ac2b968aef3acd341547fa969604db23c21989872c824e2a89d9d6bc124259825eae19118a3304adc591ab5b9df30e1fe2c82796faab8de41109fe066b34f45f1371e20489bd66b528b94fe1601db0e05cfb031529b8c7d3c14a54328470eacf7f653fbb387a893b733c90e0a368ece423185054ecd8740a6b8662c2e593c9ba801f879a79e2b48475b36f446d1ee29da40dc1d3a6aa27b662eaa708c21d78d55778ebe44d46bbf3fafbc490f24e907551dfe1d4bdf278a60beab253b74adb6cee9fabdd1a9360ec187b3ea21a8e88c6f363f46982949aa6b56085417ecc47fa7a6b44105c64fb1d6b8f3c84008e25d8d6b1f563242a1e771ea20c96c37ed762b12d19534609980762c803e95f844ec223c07f5acfc2f634ca6608fe852ad9ed3ff4f2cffcb2bd35e2d4bc2addd83fe9c3e8044fe029c75da1be51a5977f8da777fafe73a5e7391ad20c4178beb13e82f979b046b443b503e85422a0146097fabf4b2fa3b72c290f54280d34982c24e0f3e03e352088a525115c866a1bc6245fbabab13e721c117d86b8d847799046709d9723b74cc626f2cfc8812d1ce8b03f656c659ff92b4cb3ada28435d2464f98d18c12a0f5aa3ca1586caac8507aaa5e7afe9246a35a6a3899a61b84bd14265b4a55f10fc7aa3988c22ac9368832a766cbdf143ec1e0c65156277317086f341541e12be407f7a6a13a289c5fbd5ea33acb0e4aef6ae01211094514903b444e4c3f38c245906ee1dac343ca51d4d3711819f42e7cd8bcea266d59c55937255db57fc3b7d23091c1be575cb50edd87da16dc0dd5c379bc23640c8d65b0892f83a337eb410e642c9df80fea19ac81d9b2fb015937ca525d5b44cc9ee25ecd70b0834d21cb0c5d2e106828ae48bd899233975f2525f5e13469076af0c556a5e4d877697e82c3616df58a0d0a715860f3f449a251e52cee36f06733a27174344114acf1d72e7e55a076bddac8d1e256bc65aa2fcad0c853b2260eef71658d88492ea927058eec9f3184ada0844448ae203239ff118ea41baa208b5562dabae940b8983407fe0f81fab92462151e11153c1b4d72a0e220d1efd61ca1c5ceb6abcc35e917aead56692365f4e0c68214b829d5a6c6dd3994e4c9c89ab2b580eb82fb4004263b7628a91289c408d0ca514dca925093abcaa7292d6a07aa08a0c254af9fb38bed10ebfad8da5dc5ba3d7a44853ebd58759fb0f5ac650491ecd0ecc0e721e9bc34cfba31c925d0398b9ed25fca928911be7d91f18aa83336ada5d231392b4d081736bf0f51394ccea894e4407ceacc56071b3829807d2602811a1a4e249c0aec2c7266502644a7f10d70704192a204e8e67c4af38ee933ece90d308d28f35c1bd5f5e0ac5a3d8ec020555113d93b23e09d40c2a36a195681f9c454b3c8fa6ef6b5f0ebf8ab09f7e8486b4577d16c8794da591f839d386fd870e19e3e9b81e4ae289aea77142b0641a4a1da2e715496deae4c4c8ecbbe88e95985bb30196898329562190b2349e05aa6741f8ae50f3785b4ca70d18f1cdba597ce9e7987e9fefa489c80f6bd5886f5e5a77c807c95874195c1c3dc187462bda5e83a8685f42531b4271f642358faff20aa3ad7140acf348754b67954e2e3121a43f724bdecdfe37b4005f1171cd2f81efad0b3d7cf81312aa823b5e60f1b872d17190e27cef28b4662468b4730214b6e6d410272f4b796c6af37cb45fb91a2de539de1efa4bf7bc7ac1f5719b7b1e9f31d0a6b08952c74ec2c505b5e9143276eebee1d8263a6cd9f882f46dc1f2179df3489b18be97bc4f9b395963bbe9cd09c2894125bfbc3c4e1630d74ee8ee8df0f4bcba2903e166513cac27539c07f0908d1ad24e346e351f40482d71a09d527e8a08b6a665e613355c5129d8c65c61a7da8df0ae8dd11576c752ebe0f8375b9a185cc2fa7e715f5b3de44304e31e2900e9209217d9538a16b6d4acb171285f50eba0d54b3a8d7de6e18d261c5842481e30cd3194f17a8c8e0992a83ddd50f8e855c4fc25193778415e84e1aef4c1436e08b2b4dd9cd233dcf3d412c3cfe2d6458d52c3ce96e854359f5b0e0c5fe9d4e22a940b4a8bd6567f43e766922c23e8a6c8c9b37630e3143b61690f60db4a2953a89f556102482fc46ac2e2357e86b32ac4181f4fa45fade1ad73d14d33efca6f78e564fc8aa8f293681a2fde25cdbf5f343d49562fd2bf09753b1c2e20239d933e8bf78665cfd551ac2068b6b3aa78862240b72249729463e46b60adf36c1601c46e7a16cfbef5a1ddcd6b66c54a726c46169d5c3b38d21a4ab5f61c1625d42c0961ede49284ff25eea11702569e1c1c2eebdb0a2fd7b8fa135707e85b8c00114d9d405a4ab6780fc5240212b829216c0b8821623c2323002d9ce76b000d3892a6fc91a62c61a30ab74fa249c2a5a089d307efbe4d5b60b60656bada9bf0b29727ca505f04e941d7863af76c187cee36fde90c50586154854adecb530300c6d58a2590275b3fe87b392c97c9363242c80bca1b2f8b4a1b057767202f266720f772ba9852edb22aa4b4a1852e97940bd43c6cee86bee6517b2bd7e013f9347c67d01be6617b152d194154caa951f2429faf5e784558b051080b2c4997f8825a337d2445349e08894d215e7c893ca6bfd68540f87bf6fc6dcea1131e1e093c84394cf2e19efc51436675385815318888dead34c246f4ca45a234847ffa97a93f525fe31ce2e95371ac542aa025007c1de656d4eb3d36fccb03eb3a413d1b02c0f2d9a3048c5ed799c98b6d8d0d0af9c62ea8288926c42ada895df7ca5a976c385d24a037c3ba13dd0a8798bd08884397d995daf50071b9e38b88e55066b5dd51fc013b74e608efe7a3aa5a52057ee1f685c19cc28e0635df5c52ebe39ecd79ebb9c1a9974aec2f27afbdf1ef3bd7d80d1168c0a9c0febd9ad47b8fefd373d2d3a570c7ec28ad83f4c1df5cbd36936679cb60edae4c932761273878327348417d5bc9ea6241eef00fffcebbd66f40e5288b7c1048a239d676cc4e0f3ee011248cfca3e1a5b3801c1ebf4d05ff9ad4ed79d3cc3b5158199e1a46562616ccdd6014e18af24652a2093e042ec210a045c237e6bb11a006861c57fb50b7ef794a8ad44d7bbebe873c1d3e10e37979e036359cd67998dc04a8221a0e0be9af44a03f56e697136a0aa2f74ad8184879e2ca2016c17572eb0b191df6014c44ef1d8dd0a626fe35635125cd459341f6cac788a476d6bc0c3fd1b3fc2fe239b76e7f4f0ac1b1840a45bbd7714388701be31e59bae040c1125f4e7f183e1a4958fba6c8fb459e6a515700e76c00fadcce25d728b8493b1ffd3da240a9067009fb910144ae4ca8c6a8eb27a622576b69df4129a74403578ee507794912e9f451fafa9e027e516894194181ef554c3b0d1d1e1297dc9947c8f1fca8a240fbb3755aaff622fd6c3a79b59dd86c4d6494c0f375572169fed01ea570e9eef594a00ca24f3a272e27c47dfe73ba1ce453821018adf1130590e36fd94b86c9fe06e96c1f8ff5e97ca932bf208069cc554ce72a8e524b474dad6d5b46495a3061e8458137c56b405edca3887acf0bd12b20279164e61c195c43624ffd74b67ed0f8202a7f92ff1690f23fe8e95c56cd97dc10bddf5130d6afbdf5dfb86bc7d4bb8a4a6471b67d7def2f4ee3ffeca4a1a73061d7bb1a431c82e6be896447a4ac00aa44a005d8be614c13063da07c2788e9bed6713a34103ce05523a1d8e1914c35ea431d0776fd885431c8f2f8a899066aad614228404a7595e066469e7d6e221ab747e23566112114d1c06ac9cd093535d8ac62135898eb54008f11e806826d725ab2d8f0dace81437ebbf77734ffcabbd448a26b3cc15265006cc13541a0556e7043cc7140ee63310e47f740083df899056b2b6512851c2b6a13f89dd8082a109683f15602b98004f2c7a390829b16f0d02e37d215d657dcc98aed5714740529dfc9f08ce6aaa73e745c8d5e1b5d210b5e62b71e0262924792371944027b0750e37005acf7721bbeb1d0e5d60d948daa5d02d1805bebf86c15c8419d025aeb37902451d10912134c28663ea133075087b354909edab042e41da3cd3a3fc6c93797ca119f9d1137de4a4225f872daa3a3be328ea31c75d25cc568f61e4e17e3ae040b83306fd64ae127b9e342c79c93837ee926fc0c7624c2df22dae0c9ba271f40e84608e9f97fe71a2b20160591904ad073c9147e383bae8e718bc6ccbf96dcd33889a7e38bb7304255a8f99d007cb95c6a72034fb254c2290858731afd4d3b09b3dbfbeef464def9a28f4375fcd6d696c89e77027b81dd7af71aa01c5433ef5e882171904a7414cfba73066db69c744f71a8127b7bea85525802f85e45aa7b3930cc1b04f794e1da5732ff79aa3c1bc79b3a73540e9d3379f76b1eb0a13d95cad144ad24e0876bc5430babf6f895dbf5be933f85b71391b9a5aaa193dacd85dd14aa74b7b8dc2e730702d8b49d706749caa71a0a91bede555f5f41df5e3e5853b99ff0fa59abe302244391dc5e35640709834f02382e65b6a6467d44128219d1cca4c0110e0871def2ba4e2623d540dae97d3c88cbed88a900609d6d85da6dc741284020d11bb0cfd74204bc1f269f2fc57f33545e0f0e68ad55832e9a7119e0bbc214bac8e32dfc80428fb337e6cd2283a9d406316282e954c4c85f5dbe863927322167f644ea9112fe4c897b01f4894a4d25cf79d6e7da714dcc4877a9ecd72b844a20062a3f0b095cfe920aca348fc47aafc8c6d6d89683a4e501ddba5f0fb00407fca0e5c0b514b9a73ff5064642d1b43e444efa99b3754809864552e442ae215232a4151c17b243343923030f8d74b8e3990a18cf234d3e5e7e2dd2156d3782b9938b3af0e142c9ab25704cdb8d9033b898aaeb6c50d63511580fe6cf7697b0cc25ca10b4b0292d888de47cd7923e13122159da5399fb12cb7d56cd035d7a11353eed107102330208eb4ba434cc3600c69fcd101070085086d27c28f4c1e05ad63d65d276e7acdf61645fb134a21b059648f0649bccb059ab19aa5c90b6f8e8bae0c803d6dc4e4e42156085851b86e02aa7c75c35645155eb9aa2c80cfa5e14915d87c5dd1379342bdc13075de531dd463b73da04b662475e006782844462c000d46e1b44b0b6cf8ae4bfa1248725c7a2a7201c2bcf91bdc3f314a05ab1d5c66fa5196d39076ebd0b0409717cbd212f9e42c99f47945e389eb45e97130c6741567d42263cf275b523df508fad7f0c2e66a54d1db64b97dc856fc1116bc78c9bfc1044d75e186a6da4e30ae5ea23df11d492726c95c48dc27bb97790e8eeed779c0b2d0cab34d95dc090d540506c3091547a3f62bc3f0cdb27e787ae7a3c3446ea8fb60a4b11edfd427ea0e53d47a3e8d76a412413377578e08ee12bd6b9cefcb48d95d3c6ad369092947c32a86b65caeefa948ec50748b9c348040c7618a0d54df2f495f58e37c4855e20caf99184a228ce9dec20478170b4e00279b6dd0116e8b82c553c9dd6ca30996b290d7a3642fdbdf2ff3d4967b0846244d01f4b1fc53a48b1bcd35ba34d31e8ffc46629cd2e6dd48cf08aa0774e5d86855b3edd2b7908eef8586f56cee2338d0df27c2fbe0343d1f1b5388f1f62df8b58d0101785fb71053787e54492e002283d97f22f9714ce99704a56be017939a528ee81a8310987c67111a0c2e84084e1f8a62302f1c73a31b8a1308d781dc10d11904cd77207fa18468992b8a6fc48844ab64ab8647aeae2f28f69307e1f21579222ab37612a04e24d0edd26782649bf95a89b70bb3ed4b2e25bec62ac9e81321c0e72a9295967e2578cf092b79421cf583a58cd665f2f44a545133c996ae82d03eb98b07a136276c664004eadf66b9e09beb34699066326804797720216fccc74e5b456e92488e0beeaa7a413e459b818d5a11c7013d0d8357ffb679c5fb3112ad53c1275c6349b185f4da3afd9cc37d205bb3092b32d60fd68824a7ae9c000f8442b776a8db56b1b076a568b6ed0a404458d97f8bf3ff0619f19ed728794a895f807782d9d076d1ae0004cbc0f904bc08d01c0aad1dd1f10cf8640086ff40f5438a7bffa6fbcf05a48380b076f33c507d9882cf0f0a94aaea0198838bde5c70db719361ca372cec99b03d4d51aaa7381f336201d85adc20e45d4e475d09aaad8fd35d919516aee05d75259fbf3739473d33d97193cd731839b2e9aeb85ce9d37cf1d92c88597e58298c6cd9be4824472e7cc7087a673e1497041a772f3e6b9a0d1b9f3d3dca113b970b25cd069dc5c135c5054eefc0477e8542e9c3417f4546ece3c17048d3b77863b349d0b27c1053d999b33cf0585ce9d9be40e4de5c291e3824ee4e69a724100323bee22635f96615545acf27e5b0666db4caf9025ad7f12e76b1dd89a4c2beeb3f05c4f7c2e6a04f7fb646e8e3c17143a776e922b14958b738e1b3a919b4bca0581c29d9fe70a85c0c59fe5864ee7e693e7822273e74f7285a072f1e7b8212770f364b9a008dcf9b35c21c85cfcb3dc0ab9ee4966783409637ff6604d00ffe9d29ece6ca1c43a376b59b32d9e536b395b9274665cb2cfb96fb75c5330dc8f4cee742c9717342efe2437a4241747863b349d3b6f820b14958b3fcf0d2d9d8b97e60e9dc89d9be50245e3e29ee0864ae5e225b843a772e7a6b940a37271e7b921d2b8b832dca104714717c205151817ca41dce804b8d081714717c61d753017d4a05ce80773a315ce851a803bea00ee68c2b9a001e742339c1b8d202e1420dc5105704713c4051d0817aa61dc680471a103e48e2a8c3b4a181774642eee3c379296886b3f95cfbd42f0e03a458bb997a7985c75e83ff75b1c31d7ba13cf2993ab3cb6cb84cbde51127f3e7934f04292387df6bbe4c15c11970633cf5551e3722f213fb81fc5445cfba97cae05c283fb2d5accbd38c5e4aa43ffb99ee2c4dcf78999dc05d497eb5c5cca759dc6e05ea17e711fc5845ceb8fb92ff75c33f0dc8f4cee742c9717342efe24f7417ee7248321990134c54a80fdebcd8f8532a143f8ac3256684c21754f0d58fb499e06d29e73dbd612f9145ecdd6f25a9dd0ba5f5574a8b20aafb1c0a9c6217f0a0379ca5507a8eb6dd2cd3d754343bb78797748aa2b2775414fba79a7b821d0b938797748b22b2777414cbab9a76e2844172fef0e49baf2a42e88493777d20d81e8e265dda18fcefe71a34006c07e3656355a2004d83653eaba91475ed7b9c0db62766b74113fba77995d7b43f7dda1ebded4b57f76ef3fba77195d7b43f7ddb1ebceecda7976ef3fba774cb8f64db9ef8e5df746d7eea37bf7d1bd63eada19bbefce5df766d7fea37befd1bd63eeda99baefceaebb66d7ee73eedd43ee3d53d7ced07d7f76dd33ba761eddbba7ee3d43d7deecbe7374dd31baf69eddfbe7ee1d63d7ceecbe73c07567c0b5f7ecde3d77ef18bb7666f79d73e6bec3dcdceebe07b5bbfc3d5ddf9feedf47d7e7d9fdfb76ff7cbbfce191f5f3c14824ed008cab16f91cdd1f8c8a49008c2418c6c62ace2a941341c7aaa033ec7d69526d0928970fb69ede49e76d1d5b5c36735fade4c7820101e2cc576fd94eb96f29718aa37fbbe9442847aa5e622bfd0df53eeb960a85053bb26100af7fd52ae1a6b25746ec7780e72b59c45c1b88dfb74b403d83e365bb55ca2e7f0b67dd3acb64d756ebf65a49d66620ba832e6d3edff7680699e50bab06065f690fc4f22e272aaa57a70d4f12fb933019d3669601adc14e9abc59e898d9a329190cb21653040b9a4c06483c48b7408144224462599ce9b586b043a17337d613dee78d139cb101bf94ecd7a8ec73bcbc001ac58e2c77f05c99a3368175e4ac537f1d09a339dd3ae47f07b8eaca5a46260ac00d06eedea3a96b893d9f7efd79c63a1927a7523dede2e30e4b3f30a624002021e5d0af291e6f477b80180c8779f62d3705a5f9aee6be860959b60e5606839a896fab1954364b076e1da52c770e8b85e0356b0bdf45452d49a1a3065fc576f9ba928d12fae410c3fd3ebc0969c41a1c914cc96a630b9e27d16991072e12c72a13f4fb15a9818960c70d56400c6ce2bbd4ed7e4d8a400a4cdbe512411342b7aca04e974bb637dd61c2a1d72baa481147f50b8321560337be39c5fd9a66e0aabc0a482de4d89aab02a99946eb22db8d71ec942a23addea289f501074ebea79bb813bee99ff44adcc34bdefdc51e46c94c463db6fdb56499b77a731cd033a631e2b9e3dc39e79a0db8dadad0509bc43fdcc12bdaba3c47c3e543035ef331b33a31148d93c68965698097d3709e240fa184f890f0a8f71ff68903336db1d47c0dda5f20750738257afaea463f4896a353b77d69234c12643fb0dcab414ea3dcdbcebde884c7bdb7d006c477aca59512b2dc90587c32abeb2e37a8cb005d2bdba9ad87335ec4d0228fcb1a5eb3b7c34fb22c7d6a0d7eb8bbf6f6d684e0279baa7ff7e3eaaacb6d95d5889eefb323702f67bbb6b12c4b6939173992e02f40f7a2f1bec9713e45584e5556c4119670bba86caa1e4755b12185f108edc9a2eaa04ca0d991223c16c7732e5ae5d297939f0c21fe702230ad2c7a218604378ad29791986c7b97b70143ffada0fab9055ce653dac03b70c1855e6fc96e9031533dfd1ed5c0a1fde5b4389b89ec4b4bc468da641690f169afda18e17f54fb267c84cb6e21b164b3fef035e31bf88a337e29c132a2592e70e31c5af76d9c72c21654d453b83dc1d41ab7d794d2384d4a06023e2947275cc9c0533027453d23b1d6f0c20840d85eea48ccc005af65b04448d6879a222ba9f8c4c948b18f447899ed56b3549573c53c0b61009f58a2ec1b8100956930bf806d7647613c9acb3559d54e3bd354b777009bd98c7840b60a4864f2ecad70706284c7af6eab004d78eb5ae00e86b96a1260e597baab7976585ec77d86d07163497167b93937b24a3923398a8d92b4612ec95d54894dbe37914d9cd172155662b3cfe9d56041f0b1c48375b9103b1bb8bf34c3e61ae77c5459c4afc1a3e10eec3a9add67b5f675daaf357c87a9d4ec7652c6222962fe4a516e69a47c09ce4d170c6fd7d251972479689a40b617f47e11ad721bcf91ceb36082e8207f0ea59773578f88e862b32178e1f915edbd93a8a1cc8568eade3f2efb18f7890fb588f5811ab8f60afff3533718f650d21e246f3dfe9b9619cf767c1c2518b70cf26ab25f490135a9b0babc3509e32864c5683909bedc155a610a9f08c688cbcfcb731a31f0172c33d00de688a15fc1e53de1bb3ce1d145f0c038faaa805f1d26e46542fd197b224f2a47e11b1d2a2dd8c025ab9565a5ad0e04bc6bac483bcc4756f57a630e19b7818d6d820c41fb49a468ece6c4e720b861c120ff61ed74fc6c37ae719d1fc8047b56fb8544ee217b6a997b2bf0e93936b58c19d92881682e48cfdb1a441f37c3ba06df250fcb0a31e30cab6d1a24ff88b9a0bcbc9606dec65c0e05b16ef12ec1035d40b2a419e48b90197e4d116c9501b790f1b6ca27c846a86d4ce3e96cf0ebbd07a280ef21773fef1e0107397ac8902533e13787ef91646c9f70e4026e59291afa1fa20dc04fd2014fde001bdfc3dce9efcd28c83bb894323f223d88b3a9e853c441de51f8df43de5af80387b9483c3c04417df9811dd376819abf0483402c507fdb75cf771bfdc9dc463beaf0a2e276ebd9eca3a71a50eb666bc70d360ebd383c19a416ece7823fafae22d6cd56d583ef10c9575d26686a35242fa8138721f37a434460c9d99fe6551a09f9dc8918bdbc322927b73208ae022c58ba32b9cb879d88f851f5fcd87b1a29d301ccd7b3ae913acb7da0a570b91857611c7607c08ba00bf505108ef2128d0fe9ba9ecf3ad2bf679668e6694eb49deed2a4dfb4a157ae466fcce81f30ee31222d9504012da7330ace09c255687aa6c0b63485dad5d702e6e027124aa5e7b2308b7911e8a3bd5844f033b1bd854ebcabc36e8d0d1ceea94330493a1a78dd28571b72338ece27aa2bf89a8d1f4922da4b12b027030af7f340dcdb1dbb8d608a512f8f4262227e0d632c5c3a61c65d758485f79b9eb6f743428ef0ce9d051f9183f4608d0e86e0a051db7319d459d6cef1c05d2fbaf3ee88c939cff10437c39e4b2bf91c4f4787c9a5d16293a2bce1532e24dc379db26ba35343d022d05a96647cb1841cc7248432bef320964025966853d204b3547bfab79130630087a09a5c1b30714d674ccd329a6efcf45bd2e823895e92684795d7beb85df30dccc4b38b965dd57144808b9d8187c33ad58cb5a52da6348c6add226d587a0d84cce078f5c7214a8e110dca648ba7b9a051a1eb03dcf40169ccd400ca4e21af336ab4731275f5f8440a204923ef2d5d6101aaaa369043dbbdb3330819218bad84438b5f0f8b84ff3fb8ddfe8d87b3822d7c1f143009dad13792ade24abc8cc5270b62fe75a60f9771c412b34dc894999d43d4acda917ad6ba1261f1aac2ac09a8053b731b1965ebcb34db03db93463a5b072af3d286d8bd95abe5f5f94a0f4834e94d226c3f6321f2136b764228cbf6deca2f0de080c94d5ff0ac93d54c61ac664b3f67c4cd20fdf9ab9a1d28872d97da7c704df265f689612788c7bda49e1b7622ae6a1425eff9c48ad8dfcd69976e9a501751b01a1a5e82a3d0583ff1541a4b97419363b67412cf2d38ddb4097d6d055ad736998ee960303dd17d9708057a76dbddc799a56bfb02c84bc8db77bd640fa3ec4ab32c322a536d8ed9ccb2a387e4b4abbeb18140133ef4fb03cecdd7c8e99ffc2724f1237487b259801c3649fcab91b4ce34cd1367e22543336dad87b87296737d424a5c283fc9b611e67abd92e317ceb563dbc8299253375bca2cc69f0cde7fa16d83c5e7f7745d52a30f5342ee9cfeb2abbecc9ddf75d9cce89be160aa8e8ff063a79377d4c1d21c8e8cabc67df6d053f859e9755e88d396f4036cbfa3b453d77dd4377e9091aae0c838d3e14ab5fd8acc0f37419a78dfc83a2f579f6f1acd69a43ce05f76493d30a1c8a0c5bd1bc81b6f1e2d3da3b29cde4618918731caca7380f17d4fccae5056f476d6e9a6e92d253eb809929e553b7ed78638ee2b58d268d4cc6e8c99a5e12027a78d1e34a4291c6f05bbdc7ee3ba1079e0a3fc3b90414e08b96ff6b66ce2019b2cea21994597417097f3ecb1273b606ed7f96804b03d412cb908a257a7e5d54f2bb08c0394405ea27cc5c5ebdda2fb8cd011515b409d84722046100174fe991c236653d6eae4e5886e5ac83d45c7c9b8275dc06447e6250d14143ffdc17dc621eb1e39dede2b000b5291f4fe6620839d3ba19853417d653038c230c2da852d3d308411d956abc4b855350fe47d55a6d333ea019b28e10105a01e203afafa1ed829cfaf1150f065151e3f776a41751787c17bb0d12c60e3ffb3826b3853371dafe659ba78b5478ee5a9623f220616cd7f793c6223e81c8efe19dfcc75ab73ac360cc4a2256427d5467e2bc01e041823b84b28907218ec70617baa781cde6759e41eb860269a3718ba8bee37153bac68ae89ef64d31fa4ddf24367f0779fb7e182379dee90f924c162df9aa8d82460526df590f49644c8ffa28f291fa2d24f029c7ae73e7928d19e3bb190443607cb78e63a614a2786681be54c69fe845acd0ed4dce8ed73793370392bbb84dc5a1c30149058dd439b5e5cc3838c2e610c6c44133ce369cb1c9f56eff2770e9d44c8386a3b6ba304123f839141970cd2528409af34978708d1badf314b4edb3726fb1dc4c5370ca7101c151522e2a20739cd2bcc2c1bafa6c3cd205771418b26e1281717bdb3485867d0d4356f9841709bff98d7cc45d7af3f48b909842cde9b65a82481383422a397b1c1c45920938bb61867d54e41b02e621726429b9a1bb340712d93b676060dc268c44737c88849434423cd74ed680f8db471a2678f8c6380460e1175912f604e8ebe38750409f90b3b03a2e5fc0b7dfb2902c20aaff0feac2a1bfe6127228c699c5b04d3d07a6862d9f7594d8ac99756914446e2ac423292629ec9080d72afc0a95286900497f4dcbf1ad9b17e2df8dff029fc7f5a14eb48c414a038e3459ab2509b3a95381e579a3d4d8c38cbb662a485598c3456317b2300dfebbb2f8f2732635adfeb6283ddf820c1c4b67b58dfb3388679fa812ed22c213b4794c93cd1a223ab7fa101340c6c6261cc451aa68fb1cc43d4173855e490808e55abc90afc0de6a29e99d6f9d5fa06a677890fbe119cc412d1e115980f8feb7c4967468fcfff896f94f8adc42e3096128ed68a89328a6685cceffd2c9e85cc8865671b20740a7e8518121dce7133e8ccb80a6b122c054508ab0785b2c97e2c3873bb517b03ac30fa9304adbb795a821278381cc5d8da1af7879700d8d9ccd72dcf61caf13d8d83ed2776e026a6473434c6b8c15c12c40ff398941cd63840512281c692ff233566ae76e2d377bc9da5b727102f03f7117cea4b577b07a2bb67b68ac440af5d4dffc390c114368cc5f01b3c3801118343e6f605ec4406f5c30aa5a6a75c2a9875bdbc6185933847b4c3b3abfc7409f0578997b232e09af2ab06d64cff10b0b6898976fa3f88d5b47925fc3db55d5df8fba6bd1883451052ad753c45b8c970826cd31d45e97cb968ad5407724b9dab4e71f75c903ebfda1f8e05bc98104140a6d5e411c673b1611b6c4677c61409120dc843bd5676e1af752d7bd02bc8cdee49de2c6ab5574085d370fb1fe204edd26142312d47f09bb45438a154051f9167687932a148301e91b3695958c6874ad30efbc3ab766ab142a88533c32a9cad73a6bfa31616ea7636fb39dcd5a58251b71317b380e03373e7734ad7cff16bce5636b51f8336c27e246d7cf6d4c7f2b0bb2c01ac4dcc9ce116546cad85514868ebccca22f4d24d6099a81a3a8912c78374c1be388f6c5e65fdecbceb7ab904791578e91cce7bd61293ab469230ec1a54adeb5b65195f4da0e33b35efb925f71cd7c38d756f0bb2a02c3dfb1a4739c37feead8727387eb0611e39b149d774e34890cff3f84f3b3005b7db28ef99730e4f8aeadd9ab68e3b51d107b515f6b7f1bd389f25e7809d6a56cc402ae6f1001771dfbfaa116cc96ad991a3bd1084d542838f750f46b1986f8f7c6a341d7d46a72bcff0227a08b054ac4450ecd77d36c890d568973cd5fdbf7042e567c6c3beac1bf671c304bd83291c91be45b57f52b81dbcaa0567023b178b404f4ed2cf2c422e07089adb6f86aafcde2dbdbc3eaee5aaadd87c37bff551fb3a14d8461ef91e686db07c4535ad1c5a32069a1d1a1e47c158121a9e57154e874f39f68f2f42fc81719834f222951c03e008ec06030d0120f1c970687170a1f719848d6d3ea47c12110ecfe2ca617e0711ea290be25d24918010114194ca061e76e9932286fe637287c8f85647c8c31f0983474c079d76b79d67a3f1024c2c07eb278563e5aec7d5e14dbe39aa74fb53dd39dfbeb2951f030d04fcb804ec315c758aadf001d130573d70578ce1a1aa960310500466e1ecf34da551670b26d0275aa1cd6c6b0c9de3ae130e6bfda4d2b7ab12fea0bcf9faf01129dd4c140e1da47d15da691fc40daac1a919067984d4f366a7fca0aac2c9ecd18a79a152692221acd48d346a862e0a88510ea7580ac1bf02c593c1b54f1fbd8e2e6ab87e66863db796315a0afedc9424169ba589b206a65c1a0b5a7606b5e8b73479a7890224b16534c594aaa4f79491630bb0a6a4b9d3531ba55f51de8b2e6d77f03e4529018de2cefe534132ca93d32fe75e88f73501529536d295a46d795c6301621156962550cf0cc833af2c6b5d7ce291520132ff5f14228163f97656085bd5a4528a86025dc09eaac413f9aa4f2ee9ffb3fffe4cacfd08c669590b57f1726ea2cdb63f2b0f1854e576894f502f07df2efc16a6891e699080ea6ddf9bf727492409773e0da0e6f58d7cbc05c52a082ca18435a930bf29dd7e336de164aa1ea7be078fa956b09b00c601f377212c325bf8b6be9160f5130638e9fbd075a40ed2b5fc51edca4cbf8602a9370bad1e4d22fa975e1af4d1e69b3a6a516f20f9800824195f3bf87e700c16f06cb14b320132d2ef20db8740d1938860966f8b140fa4f841f5005d3aa793ac1b2c10a519878d10a366520d10e0df34ac560306be31b8d6b071e8b10465caac7f1d92dc7c783e9e4d7966e6094a81a799b746e9e07097e85234bc961a405e6a4285caaef935b11573466f796f2ad917fcd42649f9511dd8952bc69e649e453bcdb987c92705b3e0c0f8bb475eac0ba12b44f628b5689afd2561fb0f61c1fa9ba344b1c8b7b94f0c9a87191cbb2839242b173c2c692ac7634562b994cf417d3714515d74f16a802f13cbbf4105dcc77ffcd2143afc2396e91f0a93de3a35125cf6be77d2c5301b19e1961573011ffdbcd6d1415927836819efb8c5df3ede09b5e8e0bc17dc6445b9f922ce7bd03980fa7bcf8dabad9c48c11c5e7fc84c295721e51bb8f71e24ea141251060ec0e4aaf33ad22cfd34bf9d6a5eb3153854cbd553ceddf721f0ce97f110d1fe6084b61b7bbd11921e0cf220ee3060a6b87479a129b7f5235072ab584cc6ecb86eb1ce63d736f469507a96fa648bd68f6978e0b6ae7125846ef507dff9c46bade269360ecc190773151c303cfe6130e7a62d94274483053c358c853c9a5d85571d75a2a0f9605c32cb48666d453cb813e4936a291a53a02fa8c7e7656cd79f2ff1c2be033b20bf4df1380b28c787f46280e4f959c9174799ce277ac51f6e238d6f17b5129746cb02daded0703bb43aad392fa9875364ea756be0fa382cb4901e713aecb1a39e092e0011e0b306ae3d683023ff8d0c967b8c5b64e1440f4bdcca81d0dfd396a50a8ebe6e038ad703410a156708e9d554deab6dd9a57a58f3839801d1a62976533fab7fc90e060d93205b6942c15516ce3f21ed084a6c6ec0ce73a324fba294c4d2e98f198a5441f5fd73e20a65c9e3cd3ee63ec795f6c9020f21ac17afa9233a2fa2aab442fa3c1f788b004de03f0613bb239421f24326950af2117f8ea67058e585ce0b3e43a61a07ae64ea7c5f3407204b39550ee54aef635903533b8e9e4a6684d3ec90bc03b24018c9a74463aa4b891d48132b1e764f6c4bd46e7eaafa5e8b507481140f7aba20723dee6a3f78683e93698f3ee3536ee6fb60eaecb8464ef9aa2f6a8b45902d9f1cb1cd02f83f748ff53bec3b178e055573e0ff726a4c0c507055e04e10659afadd4edddff88ea9db5a0ecace314a15577ceef7bbede0bc98634f875c4264ff3efbf0a2ea41a2168b29ab7b6fe142c068b04919a9507da0070594b3e513335c9514d8de4df4da1aeeacce24abb91c66a71774a9f121ad26e62c45b9387dd524092b4678b317853a584d7da0d85a2a4f876a39929a2e35848ab4479a3af1d816b6553eda430ef41b4c54b4941e1e2cf3cd4ce165b88cc4aa2d6c849c5f669a94bb6f4c92c661a0763880d4c8af249a246d98b0adc2f75f0860149ef5c7b7cdd75ba1c426c5d665fb23964dab6dba7b922919a4a2ca82fa856c6baef89c769881cb01df888d52d6b4fc27f70f792a5b28edff51fd83dc5f82661f6ca2f4db10152b7469c53f664713c433646ec177e65aa498a7525efea5c0a2dd1978714a4782d981b63ad859c452f89a02d6fb86da1401481a732717b686a8e80b14a044fcb0b0bc38456f8387bb11d1a08e16d9bbb67b44e43857aa5b472973f1780531231b530e6a11d6471d3170262eb266c664c1befe013e081dbe8428b0fa117d2a88028402582817752114f0e710c7a42ac3f287475a0b568d3ccbea0fdcb326d651c29831be9136ed5db7e61cb64153a80286294254ee1a8d0a0e50fba19a8d295a62455c669c4d2bf8cb652b74e632bd69025dce65bb6b12f615e3339d4da1dae80ba78215a787f7f43c6c9422ce55d56d180fa0fceaf5e961e874dd89e54ab8d45395a7d1c16f2d58f2bcc5da5bd333f257e61d68a2aa5746bb187e13e7e837e89502ae616ad0bb8fc52da073fdcd859185ed784f6c81f319b34be2e30b06be11f63fb8db46df62f59db1603f60d6ceaec4fa9fde1da2aba0f085b07ec592bde2dbb066d9294dc62fe694d655cb8d61d1af0ba14b5fca30ab4ee35c923e98b0157a251ffa99b6a58f61e957a3777eb5017356989346453fa5c8048bf63b295b4b156cc26a9c7afa6f4ad07db62d92f27ae3be4c65b8cb330b41e6bdfa27f29a81fb0f844e05aeef04870f5310686644e948282bf260dcaa464249d14070dba1449790831815140d84b28640a0d300926de5f03be86a13c5f04ea6bf651dd7be1376028cae6c87b89d26bf51f7a6badab7ffadeaf21b29bfdd8490bde5de017b0f600fd20f277db6eec50f46ed6d8a61f6b4c16017245152873018bea7b6a57aead60e61f7c6cc930e7b7f3f6037cbf8bd9711b33e2426fd649de09695f12ae34c1a93482b973f8095566d607635cf9a6f917e3a3dc67ccbf33ad267ebf3f5721f12accfeaba7dbdf9dbad374a6470cce9f4a7c73eef7ffaa13aeca7d77b7ba80ebbeac26e3c3d6633ec327e005712a75bbff2934da5b20c3e5d7e3fe67dc13eaf7a3db52fd8efe963cb5eb0db03f6d86332981e764f19769693eb304d6da64fdd520f407aeffae9c6b8aeba31317e8259268d4f9f36d3cba4b1ebd6189771faf920fdf4f9f588716377994ccc3afde9667b6987f3e6d3f78744ebac3b5bf374aab3aa26eca7d7d63c9da77a98ea663a2b9d3d6f569ff352da8e7aabcd847df5453cbddad5fc72aceedd7bd7baeaaf6dfd5e7e3f528f71558f59d6168b5d9044491dc662a75febfa7debd60e63a7d68fd45d5dc65b3776786f5c1db6bab0c34c97cd31ce7295fdceb259c607a93e7eb565f7b1d8cd4c3af6d35757fdded5897418ec357673e3d85dbf3657dc04ab9e7a8be2db6add4cb1eaf71e665ebb7accbb4ba5bab1d38da987910eab87d56a33acfe54633fd97b95cd3258f598ed716fec50f5934749270b7bea30adb239c65f4fd92c458fd3cd321ee332690c7bec50469ec1308957304b3ab5a6cfcc0437c1322ee32c36cb6019a6958b0304c1cba4e74997cab0553a944d238524953a842a70c4119fe623a5499a0e29ad86d2be20f3f2e810c81bc03ef79712a2f78788de3daf93d1654d972480a76716ebe6108f80e3aa647ad87d86c10e835dcb0dc16e3ebe978fc1601b6c83dd7cafba776dbda9b40e55bfaad9d13c61c9d371290624f3c049e210bd0c63dc7c572b7579cc791ef3a54f43ed525f29ce5cd0125a6d3c0e8059d2cbcb2a8d062cdf36118878aa77dbb2f01267a619b6c5565a0ec049cb000573013445a19e274e44a11e1c2b2d0d56344c7551a757588cc3f4c40298b9a1f94287e4fc014f970b2a492e489220be48a1e8222fa33d488108b670c3132c2fd710e5a5ebe61a072ccf8d01cc955643105fb84bc9022c03cc5d141bba71ba8c381c2c45575d18076a083a2ab8374417f9993b1acc511cbba2742e995108302e418a0f8e4bf8c2a685e312a460812b2d02b1a5c1063781e9e724e17a6a93b0f0a430bad1a10ead04da84362a5c0e77c55685b3d986b81b0e87b382a301a2407568b5fab4ab4f2b80a2cb6f2fdd3454e9b0873a148a35e42b7da5551b2aaac0f295a74ae99700542a6cb0e482acc0f23aed43850ece75c7878a22e05cb3a83858bed2c905b54cd66060d967e0828422108dbb4abf7455249655b07c2699bec72fc7774ff77e00ab298c30c2a837090b574a6fccea1dcb14461861ccb8c374ebf46649232333ba88fba243e90139abb4c8831cea5056e9300ce04633c405a92e2f852695348042f3721bfa7cbdd500b6546b5538f5d6da4da87687e991ad37d305f61833886130d8cdf5f66e422abb5139aeaabb51917116195fb919c453c64937b3647c7eb40db5acaa9eb7a14da84358ede9705ea9badbd0dd84ec46c50ba1a196453ab4d190b800f6a9156088e77f00eb5f4f53d6fa2a4fb0bb33043a34e92634e92634345fba5690050618e3990e4d95eda14a8b40f4908e66bd6533932e7e419c4421fa07421bd345be53f737c6d26d17fae560ad6c66e119c3e69a411936572958bec5e65a45ae61582257d694294d12169ea64b69a71ec2590a0d71a31b30531a4a43c1d38c5e6f66d57ea9b49b9374387f2526098111cfcb059deee931f344e0d168f493cd129f5c4c3a6cab1c950074fd359ffaf7d6654b0442c6a5fca445207e9f3d0ec4206eac431083885d9e06cbb0f42eebbd4569ae5dc2048cd9254c408f44ed12fa974d2a06b54c2a46019687551760f92511374ed996c7b0320eb3f7fd72d9c75a5c8b75d1775044229999d90744ef9950cba61c8a40c4b8bcacd232d6e59b2602b1823d7bf20d3108d8a5ea990567c9811884eaf27d2f86a574286f427468091350a5ba2b1e53c1a4e74da8b220ee20dfb2958ab8c34dac21cf5ad98a136bc8abecb431d658c1a426545acabebb5050af8fdf903eea3ae1de5766f40f886e142544e0d3a598c1344cb3d8cc8273a579a0cd289cbb648572ad225722f0bc959133ee9e373f2d94283c3033eb530b457435d05746ce643ee04474226633b3d60145f479a144e184bb9359fc80f435d057a667dc39a196c530b264d2e17939a1cb05d97041dc17ae0e67ae67be70d7c976a3e87f40cefabe26ed74c01c6b387ae368e60b17145d84e68b04e2389a04524316387341587e5e019c384b20530f8e32442d470d30dde096ef1e80f3dbce9a2e7d9acec7dbc9de8e254d018ab8b0a471f67664101237cb0ab8b74b91b7d31ecf86393980b9eb11eaa4b844725a017c0911c999e8be4633333ab2d5826b00dff94ca1e8d2afe19e42b9f311da3c2c3a6c12801e8fb7c301f0a61b69853975cc2b9161cc285e9c3a9307a7e9c67531725d953256d18887241a79a4af24254927c6974a3a2b229e5a508de78767e82706c59a94dd7352ba71b2e7a474db38ba715cd7d52af248dfc82391be4f9ac0af643281e0698585c2522aca12cd9074252a551a38984013c8882ca594d3c2cc4b4e4a29a59472db3a00667ae3064b1e079e674ad2f9946860bcd38a2c786a52a6ceb4a28326a5dbc6715da5b5ce969592368eebba5a451ca9ab55241a8d3cd168e47924d2e79148df572a99a8fd6ab07c89a664026db0b4a72f1a0b2e6a3f5df03416bd53a59fdc744e57d1345586a44cf909f2a226a547da482b648edc9157c81b6923691dd49352f9f191dd7352bac99e93d26de3e8c6715d57ab684447a3d972d455916834f23cd2c82391beaf5432811404674bf02b994c20785a596141a15229d5ca66189636dfc0f22c3658502852eadb21b1b4aa6f87c4a95aea12ed19e756ea5b4308de0f200a4f30cac01a5f268a8819db8dd1c671a39beb26a235d25751ada28f6ad751ca5d1c1d761ff141d2b2265a46df5f6c97c70978d01bb14d1f7a65ece171794498697944209f1e9f1e203d18e4bae0c519992507cf7b1d3bfa4412ee0d770fc03c83863089000e01a45d4f874400e9bd49fa01ecb2e872741f66ca2c3a9c9d143cbbd4ef783a4c03984d7fe9688c271820bd29675e534e87f3269c0ea70907bcc224d4e1fc3c0378af67be9870a2cbce7c61b9892ef3269cf938596e586ef07c37e718bc1d2daeb7136b4c2e405315fd12db344d3893ca148a356650b7136b4c79961cae055e9c718393a3b3c3d3f3031424d44334b41c9d1d9e9e9a4f90100ded066787a7a7e6d33e9166233c0bac1d8198a7373f3d95fee4f4549a13d45369d04e4fa53b71a8a7d238d453694f95336973959f3d3dbf2f7c284d15423a349496b3834516d4e666a82644a58a909010155a436994c6a7ce972f4ec081179801c7c32210513ed213ec0067560e9552e7a47942b74b7b6af4915e8ad3614be9b06fb677efadebbac7d3d4bad63881a24b9fd63aa43d540aeda1525a164f391c5acecd4e4f7cbc54e7d29c0e4f90d321d579a639d48a2b333dd5b954274787f6486919e502f7e94e37069a403f3edd15bc8eafd1a90dc5a122553734875af112d17033ab501a5117d4b24c79e6173d81421aeb6f08d12ff10c395a3c8126ea26d0f4625299431df614a2b1cf31c1932f3065c0f1b3bf1c925a983ae505c1405f30b7f028689802361bba2f900e29ad757b7d8e3edb632a91635105a70b7dbd5924a4430a440891aedb2e8e2720905a8e5270aef494527a7a2362c7512f4019b91ee1a8451ab41051d18f3398c10e07e544d7c66671641bdc25d2e18d0e29900efb386c921998c3616d34c7ddc60d1c5d921998d3020ca003f9e70b90e8426d8498d6790590c3d30a20c5208e3d559e803b1a48df38cea01e17bced71469e3edf4e6d470b26bce1468b2650810b5f8f1a72000446942f8882d0450f156660e56801c6163d3b5043cb8e942510410ca69e1b2ade163020818deb304d9bd2b90424d06c394bd842e884042a483b48c841d3d935797b5061a8e382be8041181ba765b18a18a5f04527816149a5cdb0b64968cce72473e248d9bd23b9acf46cdcf001c5ea41c6034cd23a8c37de1240fa2c6936f2466606b561b3c436dec33b1ede7d3978104203cbc7f8e5b8e1c3a3cce1c33d6967dc07dbb40e6de267fbe666fa7063b9004adc363f804d6b9b1a9b65f0ece40c1bc3c487fb707180edc3bc2f1ff489c6f2ca9a4be2be1c3ddce3c1ca2a3aa43e9c871b374b9c67a0e233a95f5c37dec3bd1bf13d58890303f0c68dc3b4cbb64dbbc44b9df92283a64b3cfdbc19c4b9e28ee30198254d387588320976fd386f0f52361fad6897787a33cbb60a64bf2086268861fc0000f0f810008f31f2f491c60e03786e4c80003c37ae41e33b0ce00408c06bc89b7b933592a66557d274189f250f364bccc33b1e7c380fd70234b07c0f39377ae8414a1a3ed0c0f4fa70516087f130d3868d180076090d80cd8d021c3f009bbb05389e86cd2d031c5fc32ee930016c966503882e6d5a660118a6f54d27a1b81e5d570a98bcbc16806111abc348236baa65d261bc4e7418df4492961dc713e101a406395415044d211acf678b17ac80d2d9171ad2a1520547187bb2acbd8e6866ce0f8af0832bc060147b7ae41635d8d9a20a2b443b4060f4b821063a1d00848296c023060f6809406843a53e34478b38007d345a54e9c00e56b69d9d220cc1270c5a80765a016c4a654e8b660b15e0441f2054a02d5460063a7be2594587b1d621171d469f5a87f19b0bc02c6bb5a6cd97d4e37b27be79bcc7774fcb48ef5a47f031ae34507bd132d5e33ba8fb8b96bd1e618f6f2a2d8bf1f81eea2a3d69664dcbece3276ddab44cc64dcb66b40c008f9f382d0bc0e3a7152da3f1f87945cb08f0b8c3a38d471e1e3fb368590f8f9f3d2df3e1f1c6e3676d72d17a7ce7cc17d767ced4c1b171b6a6cdd339057c152e372c2b863a5c646131d4e1d53e863adceb4f495351717773133e58540c75780f168ca10ee7c19262a8c36dd81a431dbe83a531d4e104b031863a745dd77557890cee6858896b5819c3f03ad8bc458105106548c346ac83cd128702902e56e2015849450cfb293003ee04708fdec41aed62230e6d96546429d080bb07c04a9b184a5a943551d2c450a6496412c37ecc3a1193c4b01fc33681241e8961df65815898e8d2351c31ecabec0d1ad1a58fb2e18cc3582890546318c30efb067736b41a495365888ad017415e00c94f47ecc1a2abc409dc0981e306ae97427017ce388c850249b85ed6cb2abf1e1477f7a66d64d33a8c5732c30803cf9a6c49e7cda9c99973861e245441e96c1d9f9f96491ccf4306d18fb20b1ce5140e0da01c9a2f4dab4597f8982b96351d29e0f851a0a09d1624810b5ee96687a6670a17c8f071393b3c71f03103692507488b1b1e74345aac41091df82c504ead0653f4d000069b2888460739b50f70c1045eed61430c967bea43b8a7ae93fad153777427a9738f33afa6eae8af7e7d9cbdfabe9448bd7e48eaf5d59db03cf521ab57ae42aad7bffaa2a3ced957bf3bebde8b85c5cecc5eaeb7fe3acb73157af5676ac5322412c27af7b64ab0eeab1fa31582baaf3eeaa2d34f079016aea0d2861c1a9ad9eb2cd66b66c64a7df4d447cf55a835336badce7df55c85eccc6cb5127a0d9133ee4ea208617df53873c2baaff87ad557f715ef10d5eb55574626ca0b88ea41e26c0837a40233bce005351a1a5acf549782a69e355de4cc62043f800214bc50dd0e708fd36566361ac2bd9490b311778e04397396ab50159a2e4355a84e97179078b3049a9989eccc2cf218a0a66716677216da903168927070e3c8a663945b0ac098258f17e79424f9e59034223f9b943ec5f2170af7b650689f71f7669c7296f2ccb4342727fecc489ad1c5cbb1499b93a14a58ab481e896596b59e0ee551386e418b026e2a608301ce2ba2e9b00ef5b44ce239976c3849886387b90a51d1c20859601b386a618411604fda48597b92487436cf8be4992eb4c6913c92466a22f38507953c5716410a21ca681684608512a060f9963c34882f92877473c539c0f25d0cc02c6992d6c100dcbe23e63a84e5ab8c0e89aa60110d96221a96efaf0a51a943429247d678b2e81739935808c99c2a54a9f44b9c9542af49443c19e74a5f07742865161dca2b79cc001ad1a13c4cfcc13486db89b4cc0132a4b2b79c96e5f82f9690458e966f2296dc0083c221c930ecddfb018c9e9704863daf7b0198ab10ae42f3455acf3b676b3ef05994bee4f1bc1af63a576fca2cda4506499eae0a15ceb10602d07bafa17b7dbd4e38ce5b03eeee6bc8c809f7d18970f725847b79dc7d79570939e31e67757465cf7491e7e1913d20cf749131a8893c8ff813834437b84ab1cd6cd4005d2000948f5d003c69b630e158cbd9999125bd4eeae5b9eb248a1027917527e6cb2b9efbcc6cbec97c79c5fb52a2e31522cf5d997a795f5146beef2bceccb806325f9c988f3f1808cf57ec2e8493f815ef24ca76277dee4ea2889c708ff7d55d1bf2f44ee8b5315d70c0be0d1ad9711fa0f2c7f1f482753badcfb74e1739a5bc717e314e137c31c2910926f8829452b62b891a1354a1de93ed8423136e62c049301ac71e10a001b33ae4be8dc61af176d13d81ded4f03ca9659109373c55c002ee93a49598c39109373b5e27c2910946184225e1c8841b2f6aad552462c28d5064420db6c0f1b6ac52f0e4cc93a42dbac8e812a5a8949b60254df06c23742820b581c4061295388a20aac3282ffa1ef013126f977123f350332bbf05706ba3e54d7225cd746912963749877d24cd62e139a3949735344993631a70d344586298965684254dcbe48bbc9197f1258621082d88a2043514210b4c98c94b222d93f23a118190b8df6466d63956c13333f92322d8bd26ca36ba33b691cd21963ceae461996c16c811408e802521e1ed7393a2653c708e351f1b1a0edc534cbf1d33583f600671ff5561730e4478cc171bdd5f0706f01d8adab3c203d2b239ef451e47bce38d17080fdc1db7d1da711ba547acc1035e8cc18b294193d21d9896c4cbd3e0c8d1e0685fa3388038e21fc0f86a0410899023da8b29f4913a2183e0de5f225fb6d3e708073cfbf259d26cdca1af8c486f8c2e598779e50f5825d4b2be13b50b70c911fd2283da25becfa369bc90425df44ccfd923f269599c38bac7197798f952ba4eba7fefee4bdea3dd2339ae69f2e7528ee338d139da83b7cb9a2f238efb28c749ce13e188388ee338aef40189420203983afd36e3de1cc7711cc79d38d64dddd3f5aeb762bf8f6ce9a01d5d47474747c4711c773255903bd7b4be691c8e4b9dbb0bf59c4aa5bec9a10e535cada9c794c7ddb3b2c671d43b77eed207b579db46b92ab8770ec751ca9de368341d5a67daaae8300773355398a670a2df1cc771cd71df12fa3a5d09bdaf533de91c87c36d1648776b6a44ff5e337a69c6bd5610fc395d20a6fba237d5fba2f7a5c477d3857c37fd74b07de8f7ee434ab72f7afba2f52cefbef29557cbf2a27f29c18d236e1edb2b3d3d05e42e6f40da14dd83c459776564ea4557a6fbe8f105c4f4207166ba32514e32a27fe09519d544895b44010aa64d81ebbf0fa9fdee4e66e93ae977cfb5f40c7297b4f9025e13502d058131721cd7c46cc45d746b884c17eea3cb83070e6e8a7c709421c5acac9f2ef6c4e3982fb3ce97ef318efed90ad67fafffea267d708783378e6459d3a5bb67bdb633b3919d9975d33aec2aee6400c6597dffb53dce5edd6d4c97ee5d0e9843dcbd69dd3b9faa051abcc03d548043d7bd5aae0ce04b48bff6cd74e9ba4f2ec0dc34dc3db2b638a3bb31934a4a57e02d993b2d3f69adac7131a5bcd2a7d6e19c55246b2d1bc5ae974a21f14124176096b5882987e547c4c647e425c4f45dd9735f42bc7fffae0ce9ce9ce932efdd49335da627bf21a5385dbe7b33b3fe847cf7ae8cf7efc6e93273646c390ba70b255d564d92e2cf4b48fcf98c1219067ed1f999432acdd79295dff46cf704ccb286bb1ab831e18b0cb03013d6ab8728f7453318a6e7005ed626cd7c9939d1653e67d2e0a9862b26b51c9e3bb53d1dd449fb4634388a4e00ce4a137feec3aad1e0a820c89a3ad365eed84d8766fae01aab878786c56a1d9dcad3a177990670bb7cfe6e442800f3bca1c1dbad3d1d723438dc0d4793af3d952b71b2f2f4f4d42c3aec21dc9b5006b1dc826a4fcba674d83df2b7f664b1fd5001e6ca33a70073e5a93c358b7ea9b3feac78092698f5e6837babe1ce992e9d379ebb840988b72f486e9445ce7c21ed98b81c8e935b1802d740aa9901776d0303fe3880530505911b41e6a6f8be44caaf8b0e7bbb9fcfb7f361612a3d9b4c9f8fe9dbf7fd74ad20f8dd986ea64b97ecf7f3f97c5d7c3e9f4fcbb8ad44b78fe7f36959fe6adf4fcbf227e5ebe2ab7d5370ffab7d52b094967d178a173f9fe802da21a630c208630eb3d175d281f9d165ba8f6ef7d18df28a74e65913fd9488b3d99c03f8cfe7bb992fdf4e74e9fbb03e9f6f8764064b2243dca14faacd17d217edd29914b48520900a25031849414dda91a41ddc1ff1e0fe3c810be20b29badc4c14c4b98228dbde37b869d0c521d109c02c7164943d4b31d6885be0dc50c0d2f62ccee81bf3014dd9a98e90e5abfc372927dda88c4ebc3dcb53b96d32e6f9570f4a43b3618ae3d743d2d0f4e0c6730a900a1680fd0982d9b326e6cdace70deead0a3db85b2620713bb8df3201c7030e2748479b5600698bd6b2795fb5c38ef761f1e01ea000d7cf7027eee0d148db85854bdce438ba4929373d55869aa3f3056254876ac09d069c475370fffc7c3e68a5de45b672374ac859fd6b48ad97a3b9992f9c9476e993ba6716f71b4ca5f44be9f5a49b4928d8e8dccd33e8cd345e4ad714d2187d868805f36ee6a8d44ba5e216cd67ba50c1022019e01b54efdd0a40afcecca816c03cf2c1d2a36700c14f2b802ff9da38cfbeb2ba8deb1a2751e415327abd13efe0bd2b7a8d93d1eb475774f04346af07e34b9e89c42fee42bce397bc93fad241fb92f7c55d25bc9b3ea4be74275184945eefc474ef4ea2d02ba4c6d9075e27e04f5f017f3addc94aa7d3b576a64b4b6ba3717c367eba9f16cdf57e8b76d9dae1eee966beb8ee0a95f70614024b5f8001fc5a3e31fedcea796ed5f0c6b574708cdba2c1b69b41975dbd45fb01576c9cb5684d3ab15c2d1fdcefd60feeeea6b714d461a954a543a1de6469a8c36ddbb6ed96844a41a52f4a41a5a09671a7d14463d37a2224040ad55af773da992efd5a4130ce3c7a06d07b3d9df5f80171b9281ac05c1a1202855cb6a666e5e06b56ff6a3dedcc1716ebe6d169e745ba404ef7255917fce942c09f560e5eded5bfcfcc4e27efa7cb2b04fc7765ea057fda992f231e1adca6d70f29fd2bbdbe7427de4d406a6871365433baa3151b04a4e634fac17df08e40a1f8e57829e1dd7422de3d91ef7a072fc43be89d5a3d9f9995fe01f9ee9d3ceb79f5d67b1752ef5ddef3bc253ae44b0939abf7fe1ae21d3c080a5521dca900ec74ced2b56ee6cbc827f5a81ab25af9eac619ad3fb93444a25f80a6972efa807c9716a4c1b4960d8f947e89edc42d6240c3ad1bdcdf16310002cead2c70b7a61cf974d1b216c2a5a196e5124ffd51dd177d9cb5707ce6cb8b5e25e4ac456bdd743aa8bbb2f295eb04bcf738a31f11f0dee91744ce66a508da58e2992f35dc43944a3c11881aa46760ddb1b9f6542b67530860ae3f98524a6f69a7c31e01e1ae3bdd83bbea5001cc2d9acec88796baaeebba5adae93af2894048210221df1f4d41bed42c805fc05d86166dbe7441a4d9a2d9c643b8d6daf5e7fed0ae3af325ceba7be2cceb481d0a4e5005b77064c20980b007927e006710f2910a762485b843ffe5439e9ed2608e062f51222ba6f7a86d8940eed0df6ecbe3b80ec5c29222a54e6d1212962d9d9415b88fba622776985b58e07e8c354e00665a738f0a30539b9a272a56d28531071a2c6f7703ee68dca2294522914814e9a4c15e47aa3ff3057cbfeacc17f0968632eb67e576cf4ab675d3a299008cf805a446f4d14f58e2972c954e37fde095015ffacc2c97864eb786fba6d780b7d563b23bb8c1cfcc7870df54ba7ca974f0de964c0b07778b66b27156ea4a0072df1131178258a32ffae8deb7db9100bc1ccd74e9d3cbd15668b0f703484f58706900738b46ef69e774737ad2dd55ea41eebad30eeed34d871d496792cedd23d913cf69e784c569e7b4d3328e92408e76f484d3619f766e70ffb4d3322c5a76e2e95316dd6dfa72c8eea714540a2a058d7cbc9b3ebdde0d9d02e6d290473f25e2cc7b2928baf42c05cd9fe93283e650ad2058eff471c520c943b3d361cf968d0d98e7cec867d405c7cd709f239f0efbad1b9d3ed7ba69d17a1cc192ceaeb48d7e9eb4682d6bd9948670b79ee07e698867be743fd14567be74b54e07f70e1a7a7216881057a90760d7709e3b239f58a3df8d60e473433b42c40122f8e9c151063723a5a0331cc7c3c78b33b20d6c85e319f77aa30f3fa3c3a637c647977e83a1041bfd05af5301d8e04bc87c7cbc3239c4f238caee09986d60290f147dba6708a4588153382e414a09308deda10ee3a41304587e7ae0256424f312d2175d746544efcfcc4657464e7113869b9914af21a3ed33b338239b7a486b0063ac6d9c795e24519c8396b07cbd894070b85ece30c0bee8aadfe74a9b7310d24265c29cb08fa48055feda2a45246137b3f09783be668104b0ded84f16336928b47336ce62d5664aa53900c3082229d05e30150a66c14b201ff40a3ee2e78d396dca013cce9b048a0275ef0750f5f80199627a3f8097d6742863f75cf30bb036a5f5ba5eadcba57aab75552bc66374d67a736dccacb09f4e7dc0aeeaa7b75e6debb3c3542b6633c5a91bbb8fe1fabd2749ad7efc5c97d2aea534af969bdef2b6af96c7d98c7b5eb5590657d5692ed7e797c46166cb462ce4f520f6f524ec8ed761afbb2c93c6af03b149584fe2f1cb51e4c624712349dcb5ba59e2d57bf596dbd556b6f3f901b8fa8e8e8bc3741d7259af6573ebac542aa5ba289b2b4649da759228b8a1388cfa977418f567d4ff589017ea29aba4c3acdf2661ddc5aa435588f5887fb05e844acb8a086d30140cf6f90139cc7405b14a9a60d681d81dac17b94a26cc32e924ae1346bec461bac51e39eb5ac0c89778578bb8e362330178242e718dfcd5d26b00ff7a8301a662b1984c4203a75e5e047929d6a350abf20ccea9ab50b106a2117f6a76e4145a6e2c30ea7fc4526055877f33066630ec4654876954ea15a8067d290055875d75636037f218d85b60465e836ee4308dba990646ddab37ac229e594d70ec4d6c11165b181b3bc6baebc6561a0c4056b5b9f5e6139a81515fc130ea2ad453a83f76887a7d6533cb6610e79a93d0c0b0bf8cd8d78f7aec5e8b8502739885f9765c815af66ab111572f5e3e508f095d81b216f8399a0eb7add6e1b649e97043fd0a54cc4688446b99ebdab86e1512ad00e40273afb9b8a0464680b9d58b0a74552a140a854281e102174c7f4fc05c85bada5bfecac0c431aeaff037d74931ab3aca723d9f8ed655f7563657bc5a7df5d4ff983dc70305e62c1bdb257695cd1566aeaceb31eb7acbe6d85d4ce62bf63883e99575dd57ec28008bc0eeeba6a10d5ccf91c72254452ebf1c2b944fea2e4a039089e74a830273ef07b0abad3a5acb2b2d7573057f33182bf2d8d783c6d8a58c7538f305e62f382702114b3d374ee23106c1d5e40edb93b0e9b02683a8427187ed5bc3580dbc886d1ddb265fc2b2eecd299e8cddd3808579cb1679138bcfb24b3c661b4f91896aea145a8de362bb9020f728edd61f7beb7fa6f897758f652b50eb5ec0f47702506254cf33c7c3f50481b12d0baec7456b60e4468e7a5da5ba4a5bddd9baadd6ed3a197c5480db5b36168ebdbedd96d5cd207ebdde4a3d5685628d1980a9d80dcd0420ea2bc1470210151b12b20188aa412ddb5287bd75cfeb19272975fae9581d057bcac2facb01bb35281601b61e3bfd7ec4deba173f1fb1ff291b13fbefc5ac575747fd36b54add1cfb1312a7ceba6d3d655ba75f8ed68d98357bf7e540e2c9e875297663ac113b4c579fd8cd484e449ed180add1c08d82e44d6c4d931b25480c92199213d142f2885b0791b4902079f7f540726f749f0d1bad982043d8520fc0206fddea73cf55c2020cf288590783b0820479fd7a04b942dcdac587a3c3adfa549f2e5ad6f9c06cc70529b6baa9ffb9abd5b86859ea769f0d88ba1767ec4ab1c71e43c14c953df2975d22b190246cee6480b7336173f7e4c88dd86d3b4c733c5c163de7107b805c1797965b815a86fa0654bde80f852ac2c6d991226ca5d22edbe7143076d4e397e3c88ddd7a732bad438a03309ebbe19eb42cfccf26f4b30571385c155c0e6705a7c35db16d58c89e379e023c6f59dcd8362978d3e179abe16de3026f9bcf0ecf5b1736b66d0adeb6cd0b20bc3dd39fee993c36d9e91b28fab892e9f761d5c01ebcf1d4f2ace96d7b07cd17b9b30a0a0ada09ca9c4ddeaae0ad5bb123b1bba1ae7aa582b2adc76c1d62b26157cce58a4994ab0c67c833387594cd7f29e230cf15ff31bee06710ff37a3de7a11165b181bbb19f5d5594f6c98f566b12e936d87ebaeb72e615497c147dd0d75d5ad421e0af514cc8cd9d651b60e31691c1b8ac52e34d4b288ea46c52e19c40063ab17edb21df5d71feb2aa22bfac5db91c51e3350c1db6f4cb0713d5fece02cb2026f221abc896cf0f6c75012eb60ddc505fee1422ca10c53f00f8f1dafbc497ad96af3a36c455dfe8542c94f87ca75b3c4aec350a8170ae5aab429a0c4a8dfe5b212a3ac44c150a8d76decf736d2cb4aec9aab1853aed5f6d5b72fc74ae875734ddd0cc652973fe66fa638163bca661954ccb6aeb21975993466bd75abc7b20318c00770d66b1ca659b60675b809f120accccc2c0820fe0b7120de1f12b10be587cfefc70f17020acc9502e641dc00a74159c230698cba47513662aa33c4b7d32be80ec5c2084fcb3211476511ebf937214f7d9b5d75592ee2d3b2dc72d6332ce7b811535a96839c09a096652047e2451242e4b095c7082bca99d96e8808dbf10c613920408678101b3b0c62c461b6a5e5458a5c488f2f51811f71e24690f8eb88bb7c7c1ee0dba7ebdbe7ebdbe76c08f5ac23efa0352dcb3c9efa9695b8eadb125fe523673d1ba13808f8765a45cb3292e7f8769ad3b2ccc489f8766a85101a09b0554774d305753a1d6e3f80e598b0b143264e848d1d127124367688e4396cec30c78d18f991235f6209254bae030307f8cbba623e7518f0edf38ab933e4db27160dc8afecca0b7000172dcb08f8caa76539016775d1b2ac80b77e1ef02dff388f6f79c767df3ebdd0f18a23a2f9c1e176d8d8e18ecf6cec70f61f3676f8e33c6cec90c7156063870a78026cec300147808d1d22e00bb0b1432677d9d8a1ebaf13b1b1c3241f62638716b8123676780125bee52144bebda9b42c2fe05b66c051df72031efbf649d3b2ec80ff5b7ec053df3204aefa9623f0d5b7cf9b9665099cf52d4fe0ad0ca5c99bf8f65945cb72064e816f9f392dcb508af813df727d52e5095b6f3260ab0d056ca5d284ad13b09d046c1701db41c076b5ce01b6bb6980ed6c18603bda022c47c472432cc705577bd243d07ed343c05c193a83f986bf35b971bae0e071338a46e6b879c64d0fd16408236ebe21cae9219a7cbb389eebec6616113787f843086d361b6dabd9689a56a143284bc4b721be51e05b13df727c33e2b2d979fcc7cda8097cc7cd2c095cc7cdb01d4772f38c089c09085c48a5e978904a43722095c6c493b85988248004f926e4db8f6f43bebd1b6a19039438023a043c015d02ae804e015fa223f223dd026ea46bc08b740e784b577bc061370bd1d15ab6c4b777362d3bf2eddd4dcb8c7c7bf7a46545bebdc36959cbb7773a2d6b7d4b1df6d7cda8d75d37b398dc0cc3c0cd3396dc1c2ab999861337df88bd0237e3e871b31018f8c6e45b06be9deba2654bbe9dfb6999926f15f8766ea8653deec42f7033ea02b7c0cd2c0b3cc9cdb0248fb97946ccf3cde1016ea67180fbb8f9868f1fc1d58e3812370b812d8cdd6ee287c4cd3318891bb14b38f9cbb644f1956d69e0319bb25074f8888dad8ebc8996136104033126abd6919b83dc88900d10f1da80cc8b383952a4e54338014201274964e066233fe2644991249c385919b939890ec885a21271a1a8430049e246648cdcbcc48bc81829f29a28416e0ef2216484dc2ce4406428d0c46ba2247173066e64899b97bcc88fb4fcb581d7121b3872a120d54469b93989bf36006403440c81812fc1e4470e6bd204f61c4d5a5eaf89a2a489134d5a2d4d603727e0af2612c8d16ab281bba280b99c388f28949840143f2e70f3ebb0282c1085cb899b79fc47146014abd7cd3f3a252e145502178a2a01257efcb581d7cd2d776de0e57a4d1404dc8c804b600309b83901576203d7033551262081d744f971f305fe6ab9d902771dc6a3b6becab16a81b5c05e1385c7cd3f9e4389af9ae4e0a1e42d4e1c76968dad70c5add744a94012cc5a19815b170a10024958ab26576980b543030a888006626e5e9da5816b40a5811d1a88c06ba2ac6e564057ab02be6ab2bab975559395ea355188dc4ce41168b2809b17700834b91ea889120108bc268a026e8ef9aa7573beeaac24178abaa32ac088d45bb1b35aacd7441972f3902b60c7cd0ab81146ec784d94d4cd15782b767392b37e7b07dc0cc59978c0cd0e788289d9ffc7a0b8f9017fc201678289275e136576a1e8f0cda9c7f051168a0e4329a236e0e659d5e1a388235045a0741431bb59c7911481e435516237fbe8a2c45e13e5013737e0482e14d5013723a947e0180ac750af89d2809b1df02330929b1f70263012265e13c5c7cd3e1e3be2a8ff42d161280778e2425175d406cc0e70a120612830a90b0529f5d74461c0cd0c7803606e6ec067170a107ba026ca4cc76ba2f4b8b9c75307b8f900ff6166069860608912272e60810a2489c914b048de8465e213b0482e01cbc42360915c2830878065e2de0d67ba6c5fc2a67ec4fe466cec452cea2d367598fd5f36769745bd6553db59f697ae6cec5295455dfa002be40eb041de000be40cb0497c0156c889d820578005f221368927c00ab91b026c90bb296181dced874de26e48d8113ec27258e04013a8601fb673022d0b3dc007b093051ca881817b586e045a088501f380f98e22ae033f8785027365e40ce6465828455c999ec17c66a1e02b336730b7260a1177bbe9701be26e4f3adc8e3280cd3398c904628f5d080b25881e1c848df2c381b015a8c3c63fbc06b5ec879be755df7ef30cfe513666333deae61ab3f992769da40ce2580c857a86e1184a49931e1d8ed9c77eaba4c333a86571d6a00ac405b002e10de545cb50f789c6a86faf403528767180a8180a45855a167ec311c033a51280673a84375a056fdb5683b7bcd1ecf36683e3e6ed066f7795b0009b06471c63785c903f3f370a207b21800f3df06063871addd33dddf362259659890b6025be6123a66123f6c14adc030fb6b18d1d2c8709f05363ebf1c1db4ff7d0d06100db76d3e1f6bab900ac375d2d62179719942387e84d10a5a9423a5c6cc745d0769ad0f6b83dc15340d4ffd89d55ce00a2fedbf9a09efa86baea3995423df5fd403d26a5b2b5537ddb52b4e9a2faefa91e431da6bb5acbfeed1d172d8b7d7be7b35df58b037c2c76f331aabfd8be51c1db6550cbe29f4255394cd35437c6638c81ba2329a1ed6a1d6e1780edb8e8707b006ce7d3e17600d8ae8b0eb7cfb0dd4f87db65d86e4a87dbafed803adc6e6de74587f938f61f751a65afa35ea3cc75d44951d63aea6094b18e3a2aca56479d1565aaa30e8bb2d45137c7fe5b8562d6562a1dc61ebbb5e5562a316cae3878bbf7b27d86186e87d926430cb7a7a607f076d5e400debedace7a03dede6203deee4a03de8260b1652366452c7a03982bade254da56c5f64a65439d470b6c628d8833e5d1025a0c23463d65e38661dae3b17ddbbe7ddbbe62a75087db59ecfcc24ed3f6d2766efbb79db47db45d6eff5941b1863f1bbdc024cb61cff2d8e4ce7c89b30ab236d19d553adc68b67906f0b983f0d6d1a2cbf6ed5d6d3b6bdb3a1adeb89a0774430a3923a568921472e64a21673892d4c21770080183c3068f23da08b08f63db2e6537aa17a25dbe1c386452e4915058ca9b93dc931606c7128488e1f7b0657d1adffb25efdbbf233af48e00f2e5e82e0f2d8039c42d4427fb1cb7d1e830a471d8bc2c963c9d1c15a850893d8035da0fd601c71aed0aecc5ae0637585e8b2fcc10bdce0a9074794329a537369c0fc0c943df590166c98349dddd4273fb7a340dee2cacb469e9426b59bc36b2091a807d7a254f0c92b496358d9246afc4b289e9224f6f963d92c74639e3e54d87342235d27d91622d075f88730e4d674c43192817288d74965ac98c53f208418809585e3e8b6857f2c41a330079ca7043718eb51c730ad89786018c229c234ffd6bbb2f25ba731f92fa4cbd106ef4944c3df79999a7aa334252af2c4fbdaf9095ccebabcfcc72159a99bdfa01919bd22107d4b27bb3fc013cdda3271cf325ce229650a8384a88a8a2c31a8b83460621391077909732678a5843ca8fb667269b84f2ba7cddd8a34877e8001c9aa7679288e6da9ad33873db9eb8b76b15a0a9bbbb3b0334a64fbf1cde4f96fb696e4a8731537ce968b38b32948c44aab5fb957bd772402b96fbb9cfdc0f96533a94bf87e95af36ab1076749533b308504811c4194912e391d166bc83ec621dbd2f2185fec636cf9bc5f4b7a17b40dc920381d3028dfefcad2a57d7568be541c9ca18a3334d4dd7428716c6e47bb0294f7997276a541ac3188a1fcc95617c450bee399f29c8e0ca2e2c81de42598ab6c41ac21391d2cdf4501abcfd75780b90ed5a15a4544d31e859977d925dd6d36e15c714c9246d2481a7bb3ccd1d9e17e9a9bd2b227360e085c59b1121391018ae75db199e295579f969dee289e9e5efa7a7ca7377739007bdac627d4e7978365e8fbf6fe72b0fe59563f464f5277f7e7fb4322c69bdec74e6f6ef9bc75e88a689438f159ef6dbd4ffbbdbf1ff4df379bc17b16c4d3fbe7c50ebd4b3b9c3fbe7b378a5eb2f93bf803dc7b9f15dd79d145517adb8a718f236db6ffd9151f2ba7f7ac13dbf779eff3deb6744f7e0798c12ed1492ed149327daf07e9a27f96929cc0ed44fe9ea2f72bb7d40370de1ff7f4c6dc7b37c632a1f85e7aad8f530f1be397b6b4de8f1f12316edf6629706f9444bf73ed7d3b9de7fabb7936edd7211a110d15d17438d4afc23af5d8ee57ba67b3133fb697ba1c80f466b97d3db67f87995e8a756a23f54adb61db5fa54cdfda4a6fd1d3bfefacd25df7bc8d243a8c25fa0bc4deeb24d1ca6136b68b77bdbf4437b3f0d67ac946176db10e7ec6b0fe5d7e3e4eff4e62d98d542a515a8a3886febb573ab5596627f0e65d9444c424efa27b3776b87ddf33138abfafee895e12954e5f2a9d76482f132944146f079f67e8e99d8160f02a9b8f60f0299b9dc0e0eb101586aaf44b9ca128edf8f54881265b6b38004fcfb5d24937ef2d83bfca45e9a5d77e19bd7411684bf1cb219329ee0eabb48b7c770350d2a80dc04f749285322f931ec99a769117dd57ff4a9a3a142439105de44350a900a5aca004e90c240d8802bba08a537186ba2029e64c4a8a9ee1a4e819500a39231249a01e789e890df10d510d38e64825822177e833e0d6731483286e01f508b6441995d5d56533dee5be5042a26ce5f14aa0e20f804494998a8841b0744459e9b165081c2f840c024644949ddeb1dc1bdcadad2bc410b106094bd68d1d2292dcf037231a9138d1773337ba24f9e520fd844936667451c7ec98f409b8cf4981bfc3f4862727852cf6ac608e92b89b4767b9fc745c00e74f6563e6b9c39c2e90b29885c482013cfa86596e8e028f2e2883f88c90d412812040ac61e3bb37461707e90a217720400462082de0be3105dc05be111377c410a80a110ab88fc30943442074c41a42c8208c8889b229316201f7fbc339f6e0101d460a3cbaec2fc77718d2cd1c267d1b26ddccddbb997b7f3ab8d77a2e5f004fcacd9828b4324f5bb8218b37dce0188eb5a12ae078f2e4b402381f6db4e06bc5747b8cde0329d821ce1593b6d974b30228e5b78f1edce8361f658e31c62863bc3622d70621bad9b881c3c61761121a73ce1b5d4bc731cf8ab0988a41c0acb0fc29ca562e3f8a33ca50972f4df05d0c22c9b3080f20d6980fe50ef352142371d8f00128bad1e18499a9fb63880ce757ec0362387fb2486c131dce0f60de8824f3a177f092de13bcb7917e00b71b3be44de0cd7276a648853cb2397a01b7ac7efe068e596bdcb0bc2f1fdc131beeee0cee74a32416d93961dab881a3c3be8d0e9b880d236cdce89738937531707c3ce138c213a65ab9dcc10b22b4f3309944eed0c73d8456621a5ec07d30d0f8f11ab70013a9d04304228923e29458859e9be1b15819622d2d646889112328060c3606d8eb258697cb150657abe5458bc502036bb5fac24aa5f2822a95024aa1505d40b1b070816565650b2ba7d39413086a013499b2602a95b050fabe9f8f44ba02eeed3ca687b71ec51a7384b716c51a73abb1c6ec4b1e5dac311b6fe7116bccc6db79b46cc3b1c67c8e3e3fe4939833d698db91e83e220221257763ac316547207a24bf11a8fedd8b37528f51680a8e5f0fa87acc8bc532f8d16854ea98efaacfafc777157815fd0e7eb472af492ad08e783aec1eb3320b2b7b3aec8ed0bd24fb807e00471b938e299d6298062dc5425ce0584343153be0581372c19476e95e925f0edc8d5efb051c9de3e1a9bd94a0ef13a1972667a2f70589d47c808899e83439ab8fd345fe7c3de0ebfff72c7f78b26859ec9deaad7fb6f41fc0ef3fa8acc4b712bf5adf37658cc72f07ec65e5e8a598d1555322912f30f80fcc33b804be3efa5e2afd1bb1c09b6e22956c8cd3638731ce7d488c6ecce8afbfbe8dfefd1bd9cbb2e489d3c1335939783dd45f1f7d4898c019fcc5388b8df91ef18a5512c3312d8ff81b2989e19697be1c2df7e267bbd985307d13ade8b0733aecbaef47e9dfcddfb9ef07f8d1cdf9bb1898c12ba3959b58febd8e7efac9643a68b22b076debe4649998d24f2b3d56aec4e2c911c0dc37b87bf360b1c362b17aa7bbc7c23257541fa93e1abdf499feddab24169b592ac7d23b2cb6797a8785d458f44ef3b00000000088a3bba93efa724099cfaed3ef87eaa39b55f7c2d3d23c7d7473e9626006b3fcbb273f2e4e075fba796626fc57bf9b4ddd870478f3e8f907cbbf6f5f8fd2596efe4a0208808d2b56622fca57025d86787d77c910f9fe107af9be4efaf23a919137ca8df22151fae99e89c6e3f743860f1696c78fb572013c7e3fee577c0ce02b3766741db089866d9a990ed6c7fd3dcbfa9071969b67b08c8336cbe00c80873fdd25b4252c40003ce24f0000b80002602595236630006ef8ed387dc6259e715f3e64fc5ec66ddabbbf771a8beeb15f44f0d9fce802a8b8755a362abdade81c2ffcbe30fc768c86bc7b4b5d327d7465ceb7526b43151c6b54aa7467e158a3e2056e430d6ee1586b430e2e7dafb5210b8e746dbe5f29dd3c834b9738179d30308384e9a57ff613ba560e818f1d152993746dc4fdf5003f7a04617af4f530bd34badfd0b5117b3e7c231f463eacf45879e966d3955874d87de5ca271dceee9e27bfcf08e01093f4992edd617afb7e7435d7670430cb1f9e2935201d2f5a96e513dcbdebb0c05dad93ef62ec0250f0a3bbb2313b22b6b79f9f1271d6377601f28d29c99d46e2bb31df471f1dfc6eb62f5df9e4ae4cefa44e69e78a52e9df572a954aa5d277f0fdf5f80efe034ba57fdf47a3d1c89aaed461d258ee74d8fdf689c6b0c7ec138d59ee499cd9bdebaae8b06b592e7df4eefbe9a58f3ebae9307dea2e813eeb8d6cfeb000993406bfeea0953f262ba774d8bde302f83d62d3949699ee138d4d074d5f0ed0744ddf8eefbb32a7c3eea39be5930e3b9d0e25b9187d148f2e93fe011cfda786337a01bbd13f8a65ad65a677279f924d02fe5b79c93e91e4fbf715eb63e2d2419b04fc4b89c4a54fb0e59f6ddcf2c6a06db91328598963c01ef1f75d1c200c7699347edd970f8951ff7248ecb2252c4096124b09af6e0ceaa3cb272d43a16e8a5f8e0ef469a6b8f491cd337874d2630f41d3a7b72676014affc067f4dfb9afc7e82ad36994970f89592e31cb3f9b6356feddfb728cfed91216e0ca23065fbae93b6206af5cd3b743a542fd644b3637369f7da2f1f752e351e926b047a31b53fae8f2eb51fae831cf8037cb60f09fcd147f975fecf0fbace9ca1293c6a3d1a83bf81501ccb286bbae334d016a59e91dc8c5f7eea9142a75429d44a22a63b950eacaf3e8e0c501ae5c26a7d3e8307d02ede81fd84de941ecfd008e46371dbc31df29f63efbaa1d8e3e71638f2375a51d10c797835a893d4a32d951e9bba3d31e82f4d16b0f313aa987f03e5a22447e5e199970ba749777499038fb74e9ae24489cf583c419e91987f7386b92d79d6449f74e44ce4436ceba7b69e74764b957bb5d7e4ac45913d3a57b69071d04a4a6c974e94eed6bf4f9d1e9fba51d80dc7d7ddb7d7df7058493b3ed72b69d745fa3f7e9bdfb1add97124d3f44ceee2239eb9e4bd19b0f60f4041b8ae7797293534a5af1e4628cdc9c2d25456d1b187bd2a6b3a980f194dea6b3696f5ce0ced5d8519b8984972391bd9d72763d420b84983ed34a2b86321fe795229c45e95b69af80460b2a5c50b9c19e17492320dcb3c2d3f1a6403df180f056d3e1c6d1f036d4e1b655e1b280a138e00a40d476e48845a16e57a329008b7813d4cd3218459f80abc34c140cb7dc9b6f008b78132dc0d43d2f5830c75580a93ff57aea30adc2b60ac5585774f3e180a8c784a8dcd0684237acca7a8a6643a3d9dcb068363743270073056add9a0eba50815487fde5b230af0460a519613dc62c2c161bdad17294459db64c3531eaf5a6d2b0004a8cba91df0e55fc74a4fedbaba3ac4b6559977598c9b246feb2478abcc51a3172158034a7899d4514b1468efacaa2ee7d3a6297d4e1f6c3ee9a2ff88bfc573da56afd673d755be4f7856ab9b097eb05a39e911620cc3462f3ea75b30c7e7dc5a2bdc5fa552eac168e351ecc20868afdb1b79effd4bda7627fec313fea30ddb295f616eb6f3d75af9542c55228140a5551b15b6f542e958b0bebce16a8a865d2b808ea723d2bcbf1541f2cf1d13aeaaad49fba5528a78ebacafe681df5b39effd553b647eba87b5ffdacb3582cd66ab55a81b118576d01dc1e71eaaaacfa4a75d7f36aa5faeaaac7ac9e3a4cbb6c571b3a764d23b7c85dad6eae435548153129954a1da63f1e11dfce678b55e9685c0df5588c18997e3e5a47dd970e897f673c0d58e0b2c4a9fbd2d17854337a8261fa52b01cc90960eea02a221a212aa85b6dbc29c05c85684254aa88682deb36e0ed221ba16dabf18008b1eb55310242cc020b1c705817f68a613801c62c138a5329d663b1a3502814eb319b8454e5b60e89684435229ae86545372dc2b1a22a3adc58d7a30163df5e9f542b22103383b93e16abaa9b2bc8626154edf3b805c7da155332577ba92e318d307411d100cc55082675171718af3e699913a8ab5042b07422f5d851a75f8ed445d91c62d86f6392d0c02dd58d41bdf58d068e49bdf51814aac7eba8db62f30c6eb90703a37a91678a5d77a96c8c4a75d745b1fe2257d92230ed3509655ff73c94edd825eed83ba68aa93a755b8fd94c2306c650218ea11efbfc7228190066a2bac4f3f3b1e9e8b04ab5fa7315f2b1ed74f8586e79eab0c35e36652396b8c546dcba950603730465b35dd1e176967da17ee4a8c3d817ea7ed1856782226f7535d6b7b7acc7b299f597900779fd36037992d75b8f9f8f256ec4d6a1d7ebb0c384b02bab82a8f40b74e6c11ce798a29101040000006314003028140e09c682e178300ac448891f14800d91b056744e1ca7498e52c620648c0100000000000000804401008121e085e5eee7bd918f5f7ad19e4cc4dfa350f5b184b05da681c49f407000c05e13a71d6d71294e316defb203d3aa2b78fb9c922c7093994a8143e8961c927e7b90c3727a1c464561f0b69e4738505d3d5b8657fc088a6595ed2e7cf12faeaa462e9e8838e0101d0de506a1f4edf08141c5d45b0176564eca012b50b2eabfed28e0ab5ef141a844f13e6b8130fc81d9382e552361502072c43b9112d0fe0e616f92fa625a75bf3b9ee74a577594485892057eccb298725049cb7c08935273c62b21b9e33edee9ec487b24e4237160197d1be1c14d3ac5f01523f2b03aa0e6b926ab254d60214a68f5954c5231fe55fafb215f37a5963fc77c81e9f503bb2baf7632d761e663bcbb69488e3d935f7e3767923d8b1e62a87485211a8990574f686df61be9c9f07c6939662c57381e65df7450d228a9a66df27667a28634a1be6ef517e8b2c364e9fdd577c7dfcde9414fa70e54f16553e7d75f2aecb12151bb510c9024289ab6e8db15c2463b35fc7a0ef87419cd8358f18ee74bb4ae4dbe3ddb0af2e328684270e75155f5fba653860c7d34d6ecf376aa8bca0be87c2c0bb1883a3178ea7b40e4fb48d88a76f7c3e0ae25c8b9f9f5825bd9674017fdabbaee211e57a58efda8f15efd503b850df41d6362aa80c4278b55bc3cd531c04f993e4c773d14cf3c604b0725fc588aa8904c3b81f760ecf0e7595fe09e6ad21ba8ac64235045b35b55b0e61458128523bcfed59ab07c2c5c1f1095ffeaee221b3313cf04207d75cf813b31af08329a3d3544ec15d41ec7594219e0fcf52cea65fe30f75423b657c44b0806c3b92de7185cb50a5c0309d9accde049484128e2abc2085295a996165b6f16565493246050b6215841af1f54b9918002f2079a6a2faa57bad81e933366cde03e4b49a2fc7e227767ece4661cb3aeb180b0280a6b97fe0692886579e9b405084b7f915f85e20b7c523966d0c41234c9e99d60029c4f6d387a7e61336271ec95c1f84b1cdaa0256367e85181aad71f75a4b4ee3159a93519d127a11a61150fbb35b0a116208e53f374d01ddcd304fd48357e5517f45041a7c48020dfa5dd3bd99fbde5766f06d99af292354970abb41a03605ab6a6eece6fdcad8d57d86045925f354e4ee5d4a9df45d6914f75ea02a86cd0da3659b0e12b8f22b22a4a769a0a181fab307cd9588f1673dad0afc49a02a9921847d8ef6206e55f4c0e379499c9f288f80129c6bb4f5a957fce14f04e31f7bee5a538f65d2aeea385e83d2868614ff3bf38ab474c7a2a7d8d311c02f6b34e278aec58c3711f776c26b20e4eac0476699e82253d434fae1900fe953c13db4ab6b1bc744d157a25c372d25fd2c2633e65bec16302ba751294698719ac56233ba7cc472a3b8176f15d67bbb017930f1959a1e9c0b7dce6cd6511131c28651a885498acfdb6ff5ecac4f6807c11bf16601d394c1a324bba2af3697afa1c2620c56b2135ae724027734c2749b911729886e707815d54206dcc01e92a71273d94ca99c8c1460aaa881410506c7697030d278c353b18f3353289951a877460fc94d1aa316ad2c209f413d0edd30fe3ec531cc0713e6ba1e1c243bd214c5a684902a032f35e569eea72b97939f49c26b11c2c3499a0310549d9e482b44a8c34d995c63b94b8dcad96a5ac35a60bcb742994710a891b73596ba30e216794899cb85a17455c03f82e20128efa85a2fc6ee10e99e47a5b2022d1ae5004c29b4d70ae3ff07560dac9c50007968f828f9f0e027b784252157835323b940af61747b25a110ea1a67b5163078f95a81d308f0366e2a0c210a2a193a08ce2c7b7697bad80372e8df5164e9bca57ea3173be01028852c259e50010c95ceda50d35836404f52bdec754c4b018abfee524dd6e45d3c208eef2b08f407b060cc501be1ad0e9b3df78cef634ac2e4b4401e937b5946a5f4325f7f290672f635df52aee519a9bb4e87c26a05361665426626c0efa867cf72c50af8d84adb5a31e2dfff9790fe12d40243e26c7ac04ee0eb5a8981b5250a924a0925666d24b49245662795a7c9a132f4e1b6e54b77e46a89866d6259b4ad3ff8e9362e7e6dfe9e9a777c0c047f1c3adcb421678ac9956ec8f2d22aa178ade776b8277f628ef9241b7f0d54929b773ef39781263c2479d8e83c146d5c61c134b935097d7c006d77ae87ed0f686876eab61b3cfdc6097d71ab3ce08d011b975a125a4bc21d68c1ef3ce7c36a152acc08ac5f59c350b82121f2c94c7924d61658b8aa95c0dda33a346a1a2ce61b8ec907d238fc0936e8aa80edf3d363bac1f630e8b6091cac918c024104c9b31b6cda7df1fb711d8e607cec5ec01fcbea991daaa06d46007c252b38af9b1c627ede0eb8b2bc19ed5fa4b58dc6f4e9b4d9894f1fd9284636dfadc0f8d4b55e2015fa150e66de474c4fb1b168b503c43b0ed531d69bf359b643ebf453a1cd052d2e25af3bd6b6c484f94531bb2e26c61fc87f0e0b87b9af1cb1d883104077594aa5f8dc70047d7e89a9876b6dfb9ae51df1bb64c6b87982d849162d97ab453b8c632412094a803629570ca6fa0495904841e818b06289bd846f88766390b881c9963befe13a274401acf19189c83433ed47c46e7e819f0f92aeecf241aeec3f0c639c48e0c26f1b1c039dcfb3b34ea572eb89591ee08817f1b8a21aff8cbfeab1e38723827c49a7a6b84ecf3eeb257d5c6d83367e404af1865558eb817112529e68f78699f40ae282292727867c97bc585aaf4b821ddf7c061c4e56371bf0f4e505598c698344476b87e86bdd79743615005b7ac470e3a330f3f42a32c0075c8a2e294c4a6921a3be89a3a54ada6a43291f6dc44f93d0edf18059669545cadcf842990fed582bbc0c0bcf008f937f5fb3d386213ed60f9c7e98cdba12f4d013cb294afb19f00c4f2c74adffeb14f615cf6a1372fdac428748b4adf39b9f22ad811ce147154e7a3751854f027b223767df308b612166c6860b436195e89f802e8dd9ce7b1415cfd9c67e59920881b2bbd3185dbce169787ed69b49e182bd6e50aa3b55c3308044565d11a756709a89a7a0172c2bb456aa0cec5a5ef120af89e9e58f792c0236b97086267ebc5e4ceea09fcc4214e097d8649d54aabe3fb7424b36a70250f5d623ed608ac26f7861b378272a0a6b1ff22758199e4f00a86e62850f24f270fe021d275a8dd2a6f147f9af370e7309a6cc586462634b6f64c3aa671d205dfe36b6243233a0b5dbb5d182776c42dfffd119bef664923b9c445a3424b90f3a8eefac65bbca2cd78721579bdc94ee18a1037feae6e8e82581a763badbd2fcb3c8457d2665936c6eda9a09307b5472c950915dcdc119b6e50f4da037aa91739528c307f69fb142a4766b638baf453f5da888e7b5a52bf5e7a369a93b0fbbbe58378152f241d996604788780a7290f3dbe133cc321886012f2516be2052939c728aab3059a70cd934c04711bea4dabb016441b0973930950ccdb1a44d1885a0c450e4a813bc12d5d3449fb6df270fb8efe4a52789ef434e93bae4f121ef6542f9d3e04068acbb495df675602fd7f32a12f8d70022d9bfccf349835480f2a436927592e97abe62a436f13654286a93a6269d590965f4c1a4b888f3cff0ddf237881d897a41758b2b38cae0f503a2f064c309b5cbe0743d4bd5ce17ebcaa1ffe709971d4a87530c0fe5c0deb10204cdac5964955f9aeae3fbd596118fb4027c844dc84a9fe6d350a33b069810f127e7fc363824beb49a6cf83ba0856e05683c3d9a990cad9c627af8297bc88c07a5e6a54041eeba13ab833d582a42b838dcfc4bb40d4a92bc25a427839c68b9d8b4132da219f497416569fa6101db0ed500f38f8537330f8b4f5e056621d4e1798e10359bcd393a33f57eeec27fa9667902c5d21d82f6a55c4586dfd1c5d06f53e0e4bf0a6fd63e6c12d62695dc587248830424083779062936c477158794dee378d637b755e28631178df622f6c60c9e08405be3c87a4054399f85ca958c12d1f4ca9ad4825ba4afe5f705238d44446d3334eacdadeeb04f6ebcae6948236b2b7631f5cc2c8a580758b6ad907a816c157af08227d8a78001a899d25257429271c34e801ce72ad35082ae413dd32763bb17345afa13fcc769c2ee7cdc2e7d091865963efd639d45a0dca67e15ea0a32c7c62b33281a1133be4a30d272f8cd80b133d9171b987b57fac10fff0ad72b4d8f258a1430ba0b394f4db2865fa227d18fda12e65d2b197b99f7960469c42eca7dd6455f776b735dc9f6d5da193f00cef0184e31efc5511031f84390760ac61a68d82b38570463808bbd8136714fc22a702c08089d977084337d62e110126434f9e43b8853c52169e732654f9aaaa9982db52b6f1dd772d1253ea23009161a22b137ea74b59a8bb47b88519963ad7cc3943420dddc2bc6b6c14aa0925e997b3ee593b0904983bbdd78cb12f058b393915975388a389980e29219aab24ac36897f4ea9911fbf0cc50949ea8663718478441cca88a762abb3bbbb8ad69100ae96823ad7cdeb12c2d98b93b70ae9bca8602570dd8d9685db412abe6c26a91d85c4762a558edea3539b7361c218ebcb7800d58d4a24f04d42b623b34b95a6ca643d32a5cd0eedbadf4f2be56d052c794f2d594fc6193404511af52c9f121cf597398d39f73074955111e853d01c99b4772f82fc71cf0083cf2b737aa95d707384024d9454463dae66b8937437621149df9a7d6fce3fcd8d4716410b3a7229c79d7f00699d440dbf514e7eb5be16ab313f512d14c30199eeb9f0b780027899494d0f8653d65e624e6e30e03199c0603021bbd8eaf7e4b3240e24999e1e74bab5753164ac875f96d88e6e5bd29d287b19e0970ab1ababb230a6db9759ef992fb45e97446fbc393f8ae0b3cbaf26013fbc534049f71fd4a156ef656eb6fa4137c619c72aeed36209801fda3113bf31c412b72d48cfbddb51ebc0770bd23d0b4aed9bce2c925d2c1bb80014ab0dd0d99248b710e3938bb7deda35b34d637b79bd9e7798b4be3323efdb9418c8ef9ded5ee5797c41767a22ca06becb7c93d4acdd5a57143b23f8cac0badcd03089933647f740f6176512983592b1e73816400ad9fa15bc9c082dfc8ca37dec25183bf47edc1a76204c53c0804648acdfcbdb6d5bb89c0a72955902fa865afe8a332f39b2497e783c192ea3bd7e709ab8cf52ec0bf01838cb8c5dac1effcc9921ee7e805988ee5381ea7416d10ec03d6bdbcac3e8cb169d61fa296dd7807dba7d7cbcfae3230ae7ec7504db57612ae0c8dcbb0142283a6c647360b03f09ffbdfadeea0112eacefcbe047fc94c4192358c37a27e0a3bf51e870034858a99087196e11e603b10b798a188e1cb55c1c9631b40428d34a8907a6fb0aec39b6119e1caad82d152ea261797b07ea1a0120a2909cec77aa7b6d17f98e52eae395bdb097ea6a7de6c5a2707174e843256fa03e5184d8af353d10573dff11b6c70efa2906a53440695a18809aec8050c2ae63b12525dc480d7728a69356596bf1b993828a15549ea479e82a22ee0a08e690e0542272b4e05ef1401d4a5e598319758c0a8f2989e1d4a60d01f6395a360a478bd6a60e254fedb368311da526be1f4f082cd157b276650833e0e4e5892b6bba69bf5421c3d7219e155e790a44682039c8d2875503e9bf206fa36d20bb3b19d7ce7f63cc0ae80133318768c01a964d8fa45c503ab99a8cb7d03ca2eef5ecf55045ac7c9036ef01766892e960e9dbc83d52410089e3b360747c803e1dc301e6f90373f006b615d9979b4ccd206450484f10bf4cbaaf4acc5884b51c893410a8417ac1acc70b9efe2aadfb6a4db0c821fabc12aae1a476def441bded346f1ef61e394d17f267737ad7156de453931440c58f91ee3c9f0414c5d55e65a156005224901b4110d52804856ac292ec586075c96f92e12c60f25e142136dae72bd43b594132f5e6d5c40417bbf9478a03fc2144c3e81ed137c903d96d4c2bb938676e87d8a887d7797aab591fed3ac79d55dc5647b3d5c653ce2d82b2cff9ee17af60ca447732e1ed6c28146c32727596e3d6d315f08d10b25fa50585129447f6c6c176632c1fa98afd1cfea50dc9611bf142767260d466e25e0c6f350a4d6f651bcf690b2fb41318da9ae0820575ce2f7052fedf40e48cd60d81b588fa011bb84c1a36b7460d6b379600303815c52d7f5cccde461c91d574959e20f3aea15fe120ffcd1859f6b408c3fd2b25c85cf29ba801efbb83484f1d84267d6bca781263639463bfe1b7cba5041aea6caed4cb7e10858a90e5689fb723b06fde68888eb475dc281bf108e0cc30e139ffc378025adc7b04fcdf423f48129ab1aba50b2c072819193eb8606b083d8d2e97213fa617078a796d8906337b84330722648680e4708fd5ffdf16f90d36d952d3624d89bfdcb83c9c5df13cd7dce7a7e89aff6269ef2f65233747096b012d2869ee4f15aa923398a46663ab0d6e25cff029ec1ce0fee0d7805225dd2c8fdd39166cf3a410bb002aa7b606ea60afd3781b699c0d2afe95cae0e247cfe666affa47acb9678aa159df1cc9d3d730400379d08dd39b9b13d2846045bbd0ca94d8d292c8e1d7472e969f9c199748ad16496b841f607f8ce07b6796878abaedc755d60c6ca42a00722660fe30d1df01c95d043a2558d7cd73f2546a22c1d46732298b0ed59b650adf591ca176ef2d4a5144d09e8da00293bde1ce9cdbc0d4831069e40f4150a1aa05d7f20521a41b449b920fa2567f20580552584bc9994c681d55ecf9571588aef5342755daaaa20047e91429b40d5d8302a42308a76c3ff4e13286a5442773c4989a5c017de7533a11eff15a4ce3a05dc898310ed86424d5ff1d6b7ed421594333d1060dee2981da545a8d3d28391ac9a0c8fee42bd9b765bd274499590d9a9d24e3a594b52014cc39908beb2e8e3683cb75e0622ea27b421e96dc49ef130b53671a2e6667bc91f3fb0d6c2dc1eb46a05218c3294db47a3a5c601d147e3047c9b002bee407ab8156cf5a1af5fb7223e2b49efb5cea494d1d13f59745b0b052dec1b3e9f2eec9de5c5553b29dfbe1286119b0341a3a871223c46b0430417efd9333bb2df89ee10c9fa0b864d0bef996b01dbc46099d2fbb91baff560f7b3def03e1b88e71af880dc371285100106678df3849a81c333b703501a9a511c532682209af2780e4faae12050bf71e7ae04521c5925b7bfc7fec9e0f0d5886d7058ebbd2b68ff9c780f9eb5c17d667570a720cadab91ba9e36ccf98565939ebc0e322aab60fe2df5eef92371a17b835570e5f6846a7ec1c2f5470bfd11f48f656190a54c078230b86146a696ee71f982442b8a199d822e58d45515219c7522ff0c73eb0c155cd8fc8d38fda9ae605ab002481549c0b62c911079f75005eeca2054eaa1a3508e31ed4fb16a28a72faa1ef0188c736b419cf29ccbb022909d4be94df5b78faf247b4cffc15fba4d4969e9067fab7419191376ec80121ba1851c8fb8e55e8b3e78747b7e5570fc3c26fb052d2ca683280e362a9e7388f83f3e30ca352219a0179df103daebd457fe91fc6f4952ef71429d0e6e0b5c8d40d7f5cf5125d363c0ee3e3c0ce79a1596602b84d9af753350a8d7d20f3e89372e77b09ecf941f3a50a54fcf9107c0d0f08613e57f0eabf2c90d9cfd2fb5c214a01df205c4ae053f9218cb3ac543b0431dcbc90510af5c01cb24a1cd099156903c7eb47b8d1f213ba02b51e546860d14d44cca9601d159ed110116fe5b8708e655a32692e5be59d7a471921eb799a8f05eaf428866b3bd2bc75927cea7ac982546ad5307133714aead062747110e1c1f7c2e75016a9582537d881c70b72027dd418bf5899a9b3c9f1946ab5ff590fce6cf01a68fedb65a18b4a4814e7debbefeaf76508406715c76543a7565d451822cc5246047e79a049bb8c114640881cf41944e362f239a09a1bfcef86cff4891dd75c736019a4d3aefa13f1e14c5e49efef5e6bf29b209f1bb0ce989aae66060dae14b84e890a0e725cb93d9de772eea03b8f35a2bf8a9936f645177b493637617d8491195902db176916a2b6dae12c3eb95cce735230fb728febdf418a3fa453ac72798ae1bf3955d337aea179ad8c2458de70b5615ec5e4e8e82c1644600f25dc27897133876f8888c70ebf347ef7e97d2e50638bbc62eaaeb314af4bf0a095771bb7bf3d3848627583fad720f2e91682750d0c77dd42daa9e9ed752de21b9ee37f168600e1d6644029ba46132cb75774fd96df3bfa16f9dfd1531e74dd73bdc25041f0452e3141e193613bc4d7082b14cc00f799334dcb0fbb8d157b2b7fac831a4c14c18900756ba9d26a06a1d8bbce08cbe2b9e3835c8379694a57e74190215d746c9dda585c9080f1f23a83bf484ba4467789d12c8d17d89f2e181c9cd30daa7dbc22876c43befb9b5133da764c6173b356efeef9fc7d9abf17f1899d72ecc3cc5bbafc099c50cdfc03658eee76449afe74c1ae5857e5eedd8994bc0a07df9d3c28ad87a59d63427860f2dd37b27280a7e74de8649fc67772c2da2029b9dbd6807a6df8904ad6bc9600ac876584ebf6e38bee41e8ff862cf644811b125893054b02cd7ccc7bc5d82e7d666ec1c28ee1364d2ac6335b8314cefde14c392c32ef9dfebd02a3b8846274c656de33c176e28043c1ab3df799b69bf849d509fbe0eec7cacae0c514f528a792530ea477a34d728af822f81405c771ae5ee745805b28651782c9911d1ea6bae84cdfbb1e8daeef4be62e5eab55805b5ee23f92cb69a087b5f06bfd64293cb340923a175e5a2c260513392f00cc6de63ea14fd089d265a302ef719ff1c7c3c00f8c8eec26c6ee02bf347f39fe299efa3ed2d50528d94164f75a49a7d3db7432be5abc3a519f719972c98eaa4180d1913b295dd32adcafe3169d2d9b5b0920315f125044774750e4601145db176d2bf466eee0d22f5db0a8f4ca8c78b57774bfd6cefe4b6b013c27a453ae96dbf78ea76ddd362d4da1dad876ba0e7e2f7d5419551ee753c14d1447d3fec516a8947cac624c4eef41418aa10bac94cdebe0bac3c793f7afca2cfc57f6886c6c8c76e0cb84e0ddc33e3a63499a013a8ad30607b7cc74f22771654ecc1f33004ef3021a3a9e100b7c2dfc1a5e92255d8614fedaabb424cb50857ea11d4b4815e9de5449719ec166814c71fae4d4def81f9e8a8f0566ed6930a97c770364cb93383deb7447688ad5262301a8627a067b73f430f306bfe30543f9e6cb4f00e089eb6ab66bd297dcaf0892756349d13d2abc9569ae1415a980e869221cdfe238a0d2416c0e06fe8e8ca074026d3831c2d8022d2ed3412234e384dcb8636e01497fa7496a2e73c22958153adde6c197093e45482a7219f625dc5465697a5ad0c27a9ed7c26bc68984f83edf991539d51315ae6162a991bbc3f58d1c29ebcfef17864b20350ee1dafd790f4d72b98353490c4abb57b8f8e0cb031191276abe744bf7c54474d260c9be2acced0c690d04bab38577ceec53f03a07ca4ee4a0e1389f92ff299ee20c9cc588c632246cfb4346a80ad1bee82495dc5a46fec97b2fa1dc4cfc537c5ef7d8ff075760ffd64a1cc465b85d239059fda1392747c8b90aab52fa993c4c843b9e0ff3291e3c364486d8e606446a9019600a6d84dc0866c0e202b839e08ecd5f1bcd02866077ff9c8421000444120055680acb158eae249a1010d08d437bbdb7511a66346915d7cb50a7a37b04e5ae046568e84231451bb1910c9231d8b6dbf054a116f36d45f711e40f3e6a1f56b904877976fdc3e05cb24dd2e1199bc7ccedd420061c751fe0d45427de45ac0678ec02f3534fc6b614e04e77c10fceca184dd96e021eb98ee6e223e58b84aaf4645ea4a42638a2e922783db1028add7e4108374e360ff3bf74b8b955282878368dc0dafc423f584490c0297d372646d120dc6c15a9b5ad4f6df70e681d485e9b2de10b8963c17477f1c69a1e04cb520ea8c0ed648dd50539e077edd7f1bb8e4a625256d87890973a148144f48bf49f333b84f0b3911c8ba79f42fbac68b6d95a7c2ae7eed9d9acccca4adeabcd4c167a0daf74e2797e69f9faf3507ed241ffe2e45721261a3b0ef1e01ff58e3df08ab796c3931d4f5fdb44d6d7787d367b071f279ec593ca3d8f7d48ce1135e3fed7d232f5ba1f46ee86f1c88e763684ea5994eda4b15c4f7c028e2f567950ea51bd09a4a5a84abb49cce646ef4576810698b2cb33d661ea66191cea04b8804e0703045083ad3a014147aff28e20996a9709cba85d56cc3ae0de2aa637eec489bd0dac8fad4c02675437aa764661cad529e1f90163ba9811aeafd9d75b8d5c66cc8d0e1cf4c683fb2d820f87f32e4feeee78dfb6a118a1957fea73722b7902ebde949f3cdd6dacdfec54302c2d236041cd11127029f59883a0138b496a21b451c9674e68709897c64a51002faebe235c2850b0df715042d13045a6b2a9ddde78357611e018ad86254de2036d4eb9b90911d9f50edd6b2cc399d483634439c1f406b7126b1fdb50709e074b05aa7d8e85f18173faad9a2d204348ee9d16d66fa8f5c176783483f577a64543ef53fe70150849bbe7ae1ca81f26435742d480ced8a790b81c4d46771e9ebfb8526ea992e156cc66649c6487550aca2aeed34b230c5a29b64a0c85e3beb99dacac667f5911f466b7431dc72361d5d7b1adc7a7f2c07b11940746dfc0c1615f1a37b714f5bd158d8fc1df4c667ef7e85063184ebcf0a48a617d9787fadc4b5d862e97c7faaa3105e9a05e2364af216c3155ebc75c77d7e6a58a52b167f6e1753ca179a141c456b8fba02012d35bcf892f9d70a547486f90176982c6c2cfd3a4efec31ee7fc206b5e3a1b2aa8d1d308145d1ed0ae4ba755285945272f14cc9143aab883a875335bf5f9e6d2a26e7a0c564e86b0a181cd799ceacafdbd1ceaa2a3975f369d565e8eaef1be4304643da04777f8339c93a05a83d35974a1ae3d13c27442e1d23a6b3948f96b9f673653c41c0bef904cabe35c1a77f2eba88606de6f35c0ee6e31cd0dba5770704736040a500d30294cb051b273ca8f138f90bac541a31b06f1c05acf894d7008a4f361f0b0959bc2320cad803cd1344e71a09c3f2648fd4dbbd61dfb85e1a2c9e83014e41cf1354452f491be7bb70ef510cb1f52609c9360458a776a8ce6fc6c7d6360a55668f6605ae5c8f81020b93351765161562721628b4e34b88c2691e989784dff4844a99a04e739f0dd754f33eeb7f162b6f7120dc6aac331244962743f626f91d041d6c259d0bbcb3005bbb629dbbb2ca9e196ef8ca7eaef3368e73a90d54276d2076b6882f436a2571ad42951f77cabc43fbeccd5e158a734065b7f485e608b566363e3b93dfbaae50bbfcba6c7069bbf533371f86b8c791dc510dd8ca6d35f6cd65094a2c7b05b7dd5a2d2ad6cebd131013032827167683079805d013075cb83127ea3d85b32060bce464cb783fe875b01e63e822e469bd9c09e87bf8bcb514951fac8c0f867cb4c31d069f77237c7d5bf60efbdedac3e77f4ad7dd1ac8109e1d64bf1803ee81280c63eeaad8c6c1e758cecba3042a5ed8503c4fada1669fc7051ba61c22bcc4f58c6bef2b83addd8f4e9e6ba0c4d1fff9d69f553afae2227e8cd2d4f2662dc59cdf3fe1b661c769d3be3715e592bc360ae3fda928e0968ae60cc21dc8198a766b38b51c1045b5ae6316ee137b885ae0338c1d6fde79b3e88c8060fc164981142b13f663470aaf0fbe6084208b61e6a7ad679e6dcff4c4bc12ed01d770f058fab57303582d5b0e02c8fda67154338f08ee7174ddc2c869a3c88da039c8a4d389d9d31e1bc6d36c113e7228db6885b1a6ead9010bddffac051404094c9a91c3f3025cf8cc60b09e75280ccbf0ab5df73b6d10ca554f0e2883f06515d4074d686ba8fb129630c8be923ad9cd1e06d913dfb804a8f68ad9f39f97ac3d391bdb57186a7d38e9e2ad637b1be6b7bc076e1deca64a14d6e837d857407f7069cf1cfc60d4b0b0d486d7c593ef2d9be35841cf67d1b15bd70b763084085d85dd05883c2c4b52d45feec842aedf4ce1a2a3ff2d2853715d10331c85d0ca1e40d780b472b70d6db2e983c5b06a828bd5c0a296fea77572d35c1b348545d36c1067c979aa0f3bf9a45d86785789764307b57709218441f9c8dd36da91c21463e575744273fd18e97984296c2b8a380b1047cab8e5a18091f82511951d2a2d8a714d2893633327da4885745c2c10466608cdfb20fa304cf6455c4edc67cdbfd075067fb4151770748cf9ec00ef638bee71d0824b593faf0b244a721a049fce40b1d3013de3591e7f5f8e29fcc06107673a1a91d0650414caa3f35fbd930572a6d0a974f64c664608c6ae7d14265323a251d4b4670d94594f8b378bcfa29c758d71de88ac6b40f5135a1e47421e408cde4474e2c7b6c8e57d206e7044f7a723c2cf91835af2e6628d5be286a2cef0c1f5a656c0050854ffe8a7b4a2cdab13731194372edd288673d288748dbfc435ee547cecf2271de8c922c281f6c19f7250005791c144603b39f9fbb6c10f876826c1acc9aae1e37980ae757609b8d7faddfedb385863343b047ee3c3d6f94de0354097e9259bc5ad11ba429f2487f88cf9242606924b027ea519d0eab3650b66bd450092439f3e33f72fd4b2cad38404860e50ba7eacddd5cfbd059af00164116890aba23616be52a3e1f1d51f9212de116edddf41ed81e4cd8a04d104c6093c647e6b0e3968a71af0693d0e16a3bc1c0bcf8f1544d95880e8a04782ca9d8d22acdc08617544c533c17f8558d188286c1e416eb000622e2c4e1e0760f6d9310920486c2af75a2f8abed04177397533cc0e4a73f2461510c8d4d15caa2ce90fb2c593c80e075155d6a9b5e00a9949e82d558b515a63d3e7a3f86c2da7ef05f3cfa5a900117fdc9f36ba8f5a1e6eab115bad979ed304e1a9b2a66b71f22c687e2e3d153c7fa752d7542d003dd4aae153ef01503010e2560252b8f5596956f2f0e586ad3706724651db9c68c10cf36c442be79aaa248277954a4ee2468b54611a2d3a56315a998756e266ce53cb5ee32ed49dfcac37df5ca76cda79f1d50c76066f129c3b133b43109b798092a1fac79851855d194f0a4597582132c1435bd5fb46e49e28dc7d36cd599da7019d7c8b23e759c84c9cc30aba0dab34ae6454d0f909ebb57009a0ff0eb23dc6e943b051fc065640002c3684855e69e6f8d78c6bd2a7fd50bfd9ef8805a08adac67402f12b14765db4131a3777281afe8c3fd1cf688c0d99127a400da7f771257570beb1cce63f48f67e056c08c8ef58f9e3617eceb59a44053d3a8dd6a25f411eae081bc7128b93ff88fb7ece845ab1f8d6795fd8813f7cb5715912b1b321bbe0b0b15c648f0c81212e515d245060b3dfaeed404d59e559a1143285108c20db84686dd3d59062864842fed8e4e55d07a2de7dfccbb458e0497a10cdcb78592cbac33fa41a9e4396d49b4a6e20adb22cda780b70290ea704347030ae2880dd7afd32439522f20d853d91d1890695af92a141108769c9a89cdfe6afbf0fc1158e3053fff286e5dd8d5bb744778a0816f966526d4c3ac747cfe70d44cf9fa9e1552b6e071a5431f88aeb24345170f7404a3a5094aa2ddcde84851281df325caa21c5aa38b318314b0446c0265f2dc28bac0ef5e41c5ffedafe4551499fb9db600775ade0f130704571337ecc43207d047972ab413692d9005223e7e2591758ac43fba1c3d520feac1ce7e0a647cd3767cfbd420f92ad11004aac6af01d3bd86ec5e0490700d9cda8423bc375bd22d915c28518e160e047075143079ffa0d7544338c8f38ba20cfb6010a56ed2c4a8a92850936b3f8e81f3fb231c801517703ca138b47600c89b0cf13501c93d39c61cf3909b48f86b407df338715e93eb28b360dbf3a117d82efa586984b08369035ab769ae2d4d93a54883ca5a392e1b0cb6475aae809a825cc9e4c736c72191932bd60d87d860b68a66a8726d80117a0f2536270ce0c4345492da18c614d05b0084af12cf9ec1b66e12c1044a956663259a903c377dfe56ed46670950eb75a6071b8d1e700e6713593384b15496fe689ed7aaa3fc8739f99f8a05e6a381feea67992913990429666a1005be73feaeb2950ce5e016b791ccd08e0347a97317819d92bb46e1dd27142ef9ce0a3fe21d3c8b4c7c3e47dc13e2e21958b5b5aac9ec9d6614aa6a3874261d938cb8ebc19a956d45f1b51fa5504773137d39e79feecc6c859e4a671c9d6f2d75b0abd7cc32d638f07f1a41d611fdfbdf3910f946fec089bff04e5389e97fe06cbb93d949a2bbe241b54f54d436abec94661c37167ed65198c4a2ac81635dee0e6446b55d25205fb90f21aee5103dbf53f565e735c6d5e4b44cd60fc44b5c0563d6073bff1e539fc6c1784ecff5af0865a8c42410cfe353ea9ae6b926824c1d3c75e942f1234b8016ca79477813d919ec80ac16070c5137ee0e9854fc73e5a0efd3de9451d2876343a7522f00a347d85b1a3443357fbb924ea79b16bc04db5c3fd4f2ce4d388d99039b09c87eec284fcf634d4c3249b49f30ecd3cd2aa846f1d3844802b1859782b9d4a43831b20b40a48df0b69eec84efdc9ddb40653f4697e0ef5ff32e1ab338976fa85add5a654664268ac80142c3ae8844b3cd292f85e171c3ce8b0676783e20119fc5b2273e9c8afc5a78c0a0ca56607810a483f2e8198fa921c1bd0f58aec81c41dd34f7862ba2d7f1c12301692d366cd5ba8325f321efbc0f711303001241ec6a10a81b5d2e60d95fc77a479545b7261ab09ce7055d4550aa04a8e2ca9a94215105c9c86a64c97b2cfc4daa1dc79270c599391c3a6c36c93729d57fe16c47467dc6c419110f150e3ec2789374ad8509d25a4f1458aa993f61ac2366bb30a436b62ffc0c8f36043e1963301d0f4f9b4ee6cfcde39fcd2118b459856d2d606e7368c30cfc6b7717709619977ef3309d7e03002b6f1da9e88dc21b7a703ab716d2c607a83ad0d32c2b55c0cc5ab06697085ffbc47585b8b460a61ec8d82511e9a7bf03b804eaeb40c9908d5613e0671c637e1d706879a3df52d1e081601e0f870b76379eeccb917500b34a7262d1b28a5981f00139178e2b1e75d23134b57aa59526bb0ea14e82c732dd893c8fde83ce741e1e4b06d633173a2a6af64e75493f234a8f0632ca98d439d9910d12d413f977a1b8f4f64655bc0f1c83888baed204dcbae3327cefe29274f58d0977da92a9ce9e4ffe83a78d11ea8f8fa4a7f13f02c949a2b4a66ccd61814219f42acb77a6f23ac9f1fb26961f87bbcb9cd7935004098084f0acd3894f6db575a97ff88da318bf2488e039c110f4d15514c801249928e5d20345e2f586f8b8d442d53c2af619383bfa7016d7cec1b1c3c4aef0397b772a55df9a8d9d0b0623474c4406b8a71e163fb8986ced24a630ae91356e999eb880e85e1c8653ea983d24619fa2124fb7bde53cbb1ceae39d4b7a510c4e8a89d3e231f29b0dc32dbf71c23c995a5844ee8cea17e2e42d98c87ab0e93c80f08fb27768c3882ccc3c9e5d9f00d14244af3d804434261092c2c436a0ebd8d304afc1754e021338492b1b1140678101a17ba72237b858f590386d639840b4b3259916b12a221757d14d40e5888d5a84d0795ffe34812da06987f19a7ab14a6d62c6f1d4f7852670cee939ac078b88ec1920888192d7b1537a6e1cc4be2e8894a503fa0c8129f1ae9921078540878a44fc72d0c29d88226fb0a909b960a8157ea3a18d42e3c1604a66099bd621c3bbd43258f05bb144be52a1858ba3129d5b6b513da0503d71cb05f294d0d9d47b02547a8c1be1f40d9d4322e31375ddcb25776f241c5e2d16aff72a1c83c29f12860ebdc26c15c2223e10af190cd3173de580026fda7faa6a0e1d7890599c8868696d4c5ab0f6620c851094607085203b62d0f168e0b1c7997a68598af51288fb85765dc5e3d87a96502b718b8e33e6f1718085f9f1139bfe5f49b665e0af1199ef339eb62f9de2bc681b1809d9d4ff73e44bb70bb65dca34fbb4e143e7ec19937898b259b5206f29b83db911a0e57395379d4a80bf23d07203edda4094127e34f265b6793d5bf5465c8e3297467967c200a5f166d047e6940135797e2199b05fc613145013fa6834cc690a3c9b98e35c8cd49c82377afec210341d01b649be278746cc62660aff4120d15545f205608a265b52bcba1637fd4a3111c324950811988c18fa0819f35efa1cc1fdf8071fd5ef92d8fa93aedbb1c3647b19570a6503913f6383e6a3bbd6e13473f4317036be6f5a823464f4909c147b7e0086aefdac1c0e5cb45d61fa7d8fde1d4d6cc32af7aaaec6429cdeda0fb30d293251ab6a2d4509b9fe2a8e5c973f0230aed4227969435317d272e7d99abcf8988cc1212cdb62e060e4d38cc43ea757ed55afd8c5578fbdb26f40d45d61e43caf6f2a62238f36903a2b95f790e6fc0af4c32dbd2db1f6f87cd4436b0bfbf05d93f35748cdcdc34d21067c141220cb5bfc106ccd6fa5cd95bc61dc694674f479ced7623f2b4561aa4adf49b8bf66e16c857f2dbbe869d424dc642f3ccbe6c26d665c8dee13a3ca6573024f2d46d4eb9ccb8c76f3a2da15104a4e8f4c6ee013fa5d5580a6e8d1ce4316ffe272a8dfea405bd7fb4e11de3a641d1e3e2126e0bb9ec482bff0b850326b62b540b982bcd35aa7964d07d955dbbc5a3d27b4702a8646d2b8ad5ae786328e04f8d8aec21e13f97bd504a8d705110c5e76512fa184d2dac64f11296449fb310f6aa6ccaeb51613c4b4cfbbe9d424e1a9e7ad0e8df05dc72e1474626870813b4bc750bb9c0f8f0e6932c2bb2f7b1115040bfba501d2661650019584c6dbddbeb2002579b4829fdbb26b1f11ea4ecd07821acbda3511cf6a27aed2d91e6926a10a9d4c1d32c4e146ae7f30a19d25cb1a17c911351f4b9db282956e0f65724fc6b7cd232c6573cb3038ba4dcead46b5e8dc77332c90677aba2358c0acf6e54233f812bb3aecc3d5ab90855f91ec1b594efa953298f96d47103b8498217c4905675ea96fb10b25c4a0461d08bf877a32f67a07a7b41664db80a0e71168a9ec1ad881f19c6ef004c3fe7ad54a6983fabdade128938916f9fb686d2e8fbf829211b285b35e757bc5073e6b61432a864244525a0a62b88a9f7b8dc085d4a6e1c1c99922539b7387484ca80ab4508fca102eef7cb42353ab32be19b6a281f625a791d091702ba6ab2545e94801d6ca06ed6ed7c3603aa9c648c3599e1ea8b6b80b33f34626d0165c315a504aad910bf511e82fac86cc44c3432823dcc7b103553066ce522aa187075db791ec8b05162edeffff68a26e11e4082e36bd3923488b0c1e6e1c7d1fdc85df580373e338fec7f4cf06fc486868e1275e72e94d7a312eb611f48883cf62726163ac43ff54a89ee1b7ffcbda8633bbfbbb7e161f8dfc52f176903cde08992a3a75701f664ebaa7281150fcb082ec96510f5f8c89aac19ea0871557849397130a063cc43e88e2c1688687b24c15b0d7cd2311c323b9b30c2709047d4a6d0ce340c0ee4ce9666fae41144f425b845f93f3cd2b6357d21e7c52d0253c6a32d521732a9993a022145eec78f1f5149a79cea13c9eb6e88f7974d89700ac9dc75d54454b4ca2848b48b029150a6e5c20c2e350ab35fcae8a3b4328da31839b786342eff118fdef7f5fd23fa7b8d5c14c7a41ea8e1219c73e87add475640184f340e6cfe1b7a57cb9255f14e2cf75c2082134fce98916b6439e3261d4f06f71367905fad53b840b552acb0583c9e6409aaffc6e88fd892a5cdd619924fcf1edc3bfde6cb17ab0346e82eb51268fabf7b6e65139676d1695c5618bc7b8bf51b7ff60bb58f8b61c86829a637456fe29f2a4aa93ba14f1b13e6da845e649f3e4c015e352f726f78b4d208b76dca77686e1dc4c86e1c0041250743a3dd4e5905fee6f435ef38f70865036e6fdd89a26bc26585fd5d5d3cfc8cc1f55311986737057227fd4eea188434bfa47d825329e17e254c219c4940bfa78bbd4a3c690efe0f02649f18a77bb5f9730c098fd0d63e1e01000b5571a3e3cbe89d1d174828fb45b037389ec14d49c8477b1b9097c9bf90667ae60c4dd9c477bf10b2668378816327e775105cd7e6a73da1f0509cb09ed2fa723b8026ff08df591e69625994205a834d605903352908405c47970109e1286a716a56e820eb91caebc4908f8421a78f14d11d8288e01991c2da7c505ac2d8185ffbeb496ee1ebd4e88e27ce4c3c38675a87f3fb1aff5a3dfe652925ab2baf475b484e64fa5729de8edfed65a549ee59a54c4a2b4bd88a946dc9ba3b6423f3544b2706f120f3b767edeed7997f01ed59c971f69855e0dcd4a810915fcfda7cd8bd108150d55105f4f45e4b799e0cf4bc35ceba525bce3f13fb3c1cf0949fa2831f32d728b3a343f9461638e77917e1b89aa7f7c957c86296272846a6a1a9d8e592a7e6ccff9f61b2a7f32060ee21d3f4f341b6d84b1194424ff4d4e9abcec925d9c2c884d56fa0ef21d0a69668a1859e2653f2563527b026c6b39f1e7623761b871ff295b664a1653ce96873868406db4c1f5da001d99e978b22997f244607514c6db31e1deb4a6e45fc0506bed9c38961bb08b73c557108be7d121647b29994dbffeb269ad11308ee8d108f12128fa2199e2d923341cf9a0b3d502b47ad8700610802632a0a274cbaff576e389fdf73d4d771a3821e7dc1fae5419fd5b5d6c8e57a16afff21cf992ab987ea7ad51e7e18254d9dffa81e85029950e516661c27f6ed128b9f591d4dd5bb0365440775bd1b4d80d61a0bb323cef98508d8e92556d41b540322b1af279491938462b34611d573a708755bb919686fe7e3c28843db1793724619b7fb1cb83f748b7d12d41ab8a73ac024ae7ba71ed18afb89c7e35601f9300118a8524ef3a8745929b7cc2f5015e5888f3f8fd17d69635131159ca8ed738d4f2466fce35fe93239a66411bcaa69c162755d13a2cf88b021425e79417b425cb606f79abf2fb52f3643946cf56f004220108fc4f2e78f5b74ebd5f7c96fba8e739c5143b34ef673243ac755b4a6a5774e0cae1d384bb4b82d13008de4dd57cb5c23f311394801733a879478eb4bd59fd3c46aebf6cc267bd5ec33786e1999e3350e18ef93eda90a37690f59196a5d5f705af5a03c4a15d8d669b9f464a7f50966abd376ef1b2556e5e63bbabf10eb034d91f196b26eaa9bafca1ace0fb175403499cd9c7f25fd33ad59cb0a649173eea4463a461423d72c8f179aeb7c5b3e0d77d625a08bdee38eebb823ad5db23d60f7c36da195f1d2ea5fe03e17766bc06417003a7187ba807c5376b420b2f3498235378163200d827670f541061238aea4101815e8bc6148d117306259ba950b20c39fbb3501fe3dc213add5ff4ffe119cd1b370f42534603242e82cdbf1cbae20797a6cd4837de8fd1a543cd34beaca21ed0bdcb54d426fd635f8d011e5db9b88014446b432191297cd6a9195c7d1cd8d7fa9ba71bb05678364d7f0d33e26e0854fc3ec976159be4cdea09fc076fd87ad5f7ac2f4c8ef083ada885b01788fed4f3c7f313683b30176bca3af82ebad10d131a1fef1eaf23cfe914254bcb260b06a90b8a54024394f857ea836979df2dc2d935651b4fec00f349c6cc5265f445a47863c4753e0f20fc59c43f90558ddf42f8e664081f92aa0bde7568bb76f159b75d76f9393268bd410b89bc62894bb49d70ea1015dfd6a813e939ce5b0c495309e46cf7a9d07c10f580a9dd37545a59ad8b6e18425b4931b30b4da3c9a3c43c41821b9d2b5d682a26ac60de80b735250c6247d97bad82b40a258cbc9630ab6656e15957239e83583524ede521be59208c6967f35714edbebf42ffe102b041bae5161044dc2221e45f5d09a60347cfccec6b21ce0f805f28122f3671a03db79f8ae3492230b85aad8a18c9dc00a1ec822b140a3a0c3dd8d7b55b9ef1beee911509629482429924c70dbc4a0fe8493a1b9283f8f9fd5719e2bb222b6f5840ef1b6087dc72f6b42ed5fe5eab7ce634e4de97a4a80a77fa539aa9e55965e7fbba5edd6da874cd6c7c03809e717d7c8f39c3b0bb362798d599fc214eeef709ac1fe6b376d46afb74dad45998e11d35bd83ef0a6ba8019b65cc7bb073cc4f270d2b045208760beac210f35d76c97a393333ef9a84b7bd15693fbe99b363c3a1b846aff61c56eb9c20bf826a00284aa534cb7c8a43b91e304635aa62c9cabe1bba702631451a7efbb798ae62d1509a4b52bc034a13099c02a3901819c3b2f6883190c732b6fb0044760f190b46fd2ddc96be409b3a6f2d70b29c2fd125d18f5d65c6d164b6ec9a1f8fab316beaa7c1f4419d401ad7c94349a93bbec7a9f39c5da25128261125db06f037597bc1edaaeba409463df088b8fbff9862d3e4f1ec60590f96c3cc238aae6ee7a588b2c8e35744bc984c2f4bcc57150279be0cf8e3d7bf77474f8da5ffabe48fa4449646ee752dc4138283931005fa62d37009309030ae2219368563f7d8664307a10bd01b3907840674bd7a973ed4b5cd82527dc4dd8096284f29a834a89224e470a7a49c66b1e414dd380dceb90a0730bbb016d1afb781671a58eef5d5261433e2a189be8836084263069e9de86d5fb3c28b142c6720a4b4f67a2636b82417bc36e9f5dd1d836eed9993933631ecc36dcf2321d5008526e613731669a1f13ee20f088e04c2b81094a808a200ee0bc13197ed69ca1a85ea82e9b8dafb47ede60c5495e3103ca89935a430c4fdc9c0465a90afc02e48b88b352252e81b3992865bc855d332aeb6e88f0692213f6cbe63a442b402802761d06c455384426ec6ef92cbe53e507f9271731633d4971d62acd832c258ecff2f9d66bd6df88a9e2199fa5be37a91f4edba52532e1290b90f4f4b88bccfa1dde381df35e3515600a4a6f1a71a5376a85b86a429e7c2f2e245a1517453360b1ca66397c9ae508a9fd9d1206415b02894ec5010b5dab02ad74137688d2541f2ae283430c6089338cdc5f045fa1567d6068e70f76b3aba888f5112f050f746a151eae0e0e1387ecc84ea6437f094398ba0c772a8edd6639e7a6b8f55660b89cffdec08c8377b0831eedf2eab8ae3cf7d0ce084565844afc87306af3d509ef2d7bc21243fb48a0a16e2c6e9e1522bd3f8c8fa538df36205802ec4254a5e42a631052fc1a3842988a5a6e2d67f101618608e3c8081400b0b1f285e5d1c0d8f0a2847ad1ce2e2930c6d852dcba50e7c4b95da7351b92e2ee8141e918b5866748702060b4d4a3da72ffebc52f32cd8a5da47fab8c2215892a07236cbb23ac0a7d18107c808132c5243172d0e92058d796c60348a2a8a8117fb50490a413626f384d542488f9c8d2275431a9fce16ec67e5d9f642d4a936b6ab15fe72fb3040c1f8c0e38690b6ef1c114bfca0af1bf8ae0f860c2bfd7ed336482833c6fb80f86e893b22cfd3a883ea61cc18fa38a91265acb6f8d0a5f227064b4f98227c622915b1b45620214dc27d59e14ac0c7e15299416120d0b2820dc36b42c90c297401084ea6df9b9cb27433f1b8c5e1a16009dafc60288983377a50d9a915aa60389ec77974140ef6d731d5c1625cb4d5d705e6551d4242c1a480b1d082df66e92d955011be4e7b8cc72a4534f17ea503f67cc1e37875bce41d2a550d860a4149d4a34ad8b37d6aef146f3e44eac18a34e8e58d0064e69503eb08caf075e05af2d3b78a85dfae6651eb24696e617654e7fd628d5b5cfcd189fe7e0434d44cb2110c6b50f44da8a49d3c95f9349429fad1ac02416ad73a14c64aa3ef317908189f3cb5f8130419c92a227441bc73887bf0c6f0f79e4594292f3e084b8216aea2d1e9d84027c1258c9ef27b053e70d83d6486f18838af338678be3e8ca827a811e5dfefea46169a0fffb0f29031002173668f6a97b14a413e3f84eade3a5ab07d94d118904abb15f8fecce15f545090edce5e4199b5231c22e6a39d5e47974c444eca945a13626cea98865f560c62cf040c9a0471ee1cb3134bee3019eaa8233a072e4010f38121c637476d7a2640cf23b261477ae754fe215dd13b19849bc1e12e70a0ca7474004d739c2614b5cc5a5dc827c42b6ab9b20bacd0b2b337183068e3738362a296a25632d6c891d334b20b6f6abdd4a88cdcd71762beafbb44d4ee6b386333308e9a208ad4ba76e57a3ca93acc38e3e285b45b6c8db1183cb004a54a66d1c797236f39763daa437357df26851c3fbc4bc89ca174c73888ff56d34b572651e9eae543ddd791e6efbc3fd54d516cdb2c95682286e54aef52dd929dededec6784e44cd863c7970a246ff4957c7821e4ace3e3053315b09e76d1c73fbe2978ed658111ca94004a7e821762e8e4f9108f94a611b0bc67336ef83aef98595268bfed950b95fbc42b610a9b12e04c99e10c2b9745cd23cf6b6fd52d7b6ec08e07a795b5dfc388ba05632e2a02caccfa716194714ba983402adb3b208110698b018692a412469f1954f7e4a41aad8b4039cf36969a64095f90de880d2d1deb785a9cdc43c07105f2afb50e1c3fa0e77446b6db7c087804d30c5fa425fd89490005c3c054834a7ef641b74806626aea08acf5f534e538b4080cefe617623614ec23bc96557e3b96f557bd8e71f1f7b896f2e30ed7adce177993a922ff5075da6d7c83ed8c94efa5068a6575bae3ae36751821224d8a134c91534154a0db845abce6d50ca31e09202cdbc50f67a2df5e0025798c1882935c33a6e0b1b4646a1134d52d2eea5d2b58b47c45978b0e5923791c25d7ef994e8fc05ef3b4aadb3c1861528cee53fdd643301343550644470d57b379f933979c8e215e7855adc3d5253f87df59c882209770012382ecf203a3a11e8a00a9019bf9521ae90ad47b5a587befee35d969b70a36daa136ef4d858aed036caf4fcb835db1161ad5151337faf2d6f308a337b1ba57748695558dcb0a15f92a3aaaf91d2a1cb638e735c09c297e2fe8184069d86f869f45caa475c856aade2e680dff62d6bf9c21680d31ef3af134601150481bb3da6409e2310e5687e993a434391513b1ae26aa054996f7552ac944ea508587337b336f5ac49d70765f85240087caefee8d14fbff3a2479c337d6e09d5c8c08cae8653390283aa2ce5f3976fed9c82bc2c68fd79d2a7a4bf5da6a5c25589e8e213f7614f09042633dc9d0ea2680b10fa5896e0ce142e5647c0744f62ab8f003b84112a42604879d8241eb94a896ac255ff3a6201f9b9c2b8b333b3f456a17665c310dbe63b77ff655f62be42897c73867b4d563c562181bec0469eb38c132a8382a5490abd1823afe5d5d0297c1859859dd4253033bd07980bf78071ad5dc84a5227dadc28358cd6808b02b9c4ab49d8bd9e5785b9ccdec63f86aa794e36d9b7a88426f3e6b3605b274b4bb86fd9455df392604ceecdb585907b827cc3953df0f025b7ad94e1218a30597baa6b5f1c2ce75d60dff3d92698d3e40d4d0e658fc3285a7d7014ddc58d5d56284ea88d7267b7213395a084f1b2e1f2c198a98b0f2b8347e51afabf544d8ab9635f797bd78cc32976abefcfc2deb210343336d8149b17766a0cbe5fd08013f908b4e621b9711498e0957883ebba6312a217211353093e4a54fe2576a7ed5c88c32d2a6865cb93a41a70278e062a9467a9cacecd41451b21310efec5d684c8f6b45b08ef695b561f87e1deb6c4d0b272b93222e61a5bdf6c0aee68faccb08eef4713eacdedf89226b43fad9090e89b8410d5b692ca85c0cef29f32e4f5bc58ba260e71c4bc103983e8418cac8f8a072d4574c4e9f4e4e59453e5bfab5d42c268229b7147d2656ae3d3f0b722eceafa8ce05581a5f7d4527d3e714dba7c773a03914c2d170123a1bab489fd0a01afc3ba33f6bb36710615f3b6fa01b7cdae841bf5d07b3005148a6519fd716fd9f2006703988c0696f2f621b90b21932018b425d7b3d90208f0006f66178a4eb5fad806783e258a4f400d3a1e38e9e748795c36660308693080cf6b09fb280c10393caaa138361fafc6ae188343f78ca138acbcf3c4762163b9f39b3bd2864a56bc7cc1da2747e87d12129a01a5ca5f57d997304e01729f40337f362745895838c479c5f80395e6d30e5e7a300f0b37fc6cd75c8703189bb584e3806f3cac0742c7b46559b5622f07c71f01ade522980f3cc91dec1a50eae5b1ce1a22cbca4f939cdc2690fd09ed3d85c4b23cc93b1dc4aa1c53e7347cf838aaf5262000958eedac4b3ad3e9d5ce2a5e4a739898c0db8f41c826650251a21e3e0a05ce928e428cfc1e609e2e2b43e8f14c10525dd6bfdcbc529fbdb61919eac249e293692f55e054c60319c6fd23be5a64cde0c3e9b3c01dcd0c40e6a0de21a037aa7305e2b02b89cc6ae87c40364c47d9a1adff1ca1dbd4c07b0e3830f48e9c69824903647baf04816b09f28a274e14d4f7f862cad97a7ba54c6390e0cd3e8a94dc83580d5ce4a8caf5cd08bef776846009872809ca035fe56d03da1d2f1502f1e1be2909437c3bab1498117cd21d26c048d21ade440e5b5c8087a089135e72191775bcca95fe59fa40673f7c5165d1eaf43004dc29367af750902e9af4f6be0e1149b9444c3072aa090ea1d0d1dfd04c992043907e40b6e50e209b90cec0a6087cb31203c34206a1004a68f79657b3ac75ffb1278abae28d6ceda80885ec144135122c4d0f806612e5dc3df22efc37c4d736b816683c885582f041e3aba68ad81c26faabb46060b5562a60aec2ada53dc04cc1449e439b8438751ed73b620577c823cc7ab9759443fe32d28094fc8b0a79e3c4ca203cc56917ab04889b27c8be42f31606d50bc61a758595127fa647ac07d050ddb6349295fe6808d885550b486cd5201fa8558d9a480281218595e7ac0284c962432f57d5e8dc95fd024bdd52520d55fe019820a519f064f303463ca589ea26de03ac0833f62299bbe74b0e4406376c996ac427539d0175ac36f92d282d768da053e17981888a4c49c4602521e913334829e8baadfdb8276c198990aca4eff51691be0f51a660b1f5719155da8d4037eb966204a9dace4e6ba428e9882c623af098a694bc42e8f76d529b64436f363e725b194fb5fcb68dd13480630621c51907ca2299bf2b81d87058066a838eff0d3e0648c4ba29c129185bde6fadd2520c5e90c3e9c1f827500bb9575081128960b5ed3759cbab0301799f42253d157d1dcdc864d6da06e9df8e7abe1f08650ff81298a4eebe8ad48577beb0d083004e8ee2ec174e687cf4715aa935994cd46019ff98390973cdd34ae05965d02ea8baf29e0514b4e15dac39d8a9a858efc2677d3e711ce0486fd899dad0e0b86e31a832e46cb4a72c00b98de6e96937a27e5d3d8e3a588fad77e2971b5dca359e62f7429e481c028a2ff48ad21db98328216c77af0f8c7391550ba73833a6146d879b29a4852d12148ce9ea0ead639816c3810e542e74757f7450ec412d7128f968226f240bfc4ffa28b506f57f94cebba689fa1af8de1a9018a51824565ff84f45897338a189293c79ac081c375149ca314d777ab281d57b790569f6e792e9a2060b4ab39b65fd9b3e9f68a7ce16915d15e413cac33b25a2f737f50b42ff1081f9f0ea2d51081b84786b20878a23ec9624993b7c2cc5882fe04021470bb96d3687eec9f77a5d22e0bb3576d42201160a984b2699317ea6512245a81c1e07c6114a14dd295cf9075042ad6c304d152c27b33bb32e295b0e60e1e252cb43cc2f1d3cbf08f0d1b87eaa0694c50e5f83c1f965dab56ae2c46a47629331a2aba0b412de364ef20bb8bed1d177ae2c4099fb3a5996f21242a134fb7199afb22cf1254df6d10a6c094a5003a16f3a4408f6a121ccd45cfdfc40ebf13474ff3cfad09c25a029317f928331c3ae222d377b42fb771eb67645438bc3ba96f11a667a0533f75255ce71ecb420289f5970531873c90642a265e7041317b632db49ae57ce1bc07522250858d6bcc3188ef0624999a14674ac2642fa8465dc121f5126e2b15c1cf1cfe50854ef2b8d1a59dfbbc6668cde59733f4f04f92b510355e34ca5eb6d0d41cfa9fc3939381d48445b4a9215734df4c1e94292ff83f3523832d943552e0bcc90bd5aa710b40e2bf6864749b79d744cb51749085d4992a92a8644e649e5b7f6caecaf9647dae2a04538dbfef1b2bc517ce8dc458093d681f8247064954e3500814a8cbbe9b3b36f59a354dd05f15b4248f18d0541b24fd5fb8a7a3054cd0b779bf2385c6ab642428aa01344a30ba0c1481da7373d39cfefe4c6d0e85ea801a04befd5dae8acd37d4365973edd79c54d71f1d72578e25c89d9226216f1f8205b716cbcb50ed0ad86cfef9d90b60b048a16aff74446210b62993f78b9438428d26c5f0dd44e958d7519e623c43755a11d8ed6d0c13e4a3346ad52b5e98855c6e683b02d89f10b9a7d486eae9450f40844e8cb17a9b811602061e0240425e86967400c9d5bb802ac706b2d070b8facf319acbc0736bb982ce6d138add0a023ef6beb8b750db3643512cf24f02eb64147e8251d42433a5cc77afb2c32deb10f27417dba80f18ee35a2db22cde05ae8e1681d16c16c8a44235582e03a808e58f4a8fb59d959b600e9cb2f5d3b02141a51bc90f92d8bfd1d5e48fabf55d419e77492a0946258c5365fb526e791bf965f1b79f3d65a9cbfda1ba57cdd32871ad4fcc3933a3f0735ee06121545f156cb59eb8f1d6682165b7139b383e8a35c34ba556016fab8089707e244cbe8a580a73b090571dbac20603d4f48860eb132f5215c98ce6c0ed5a51a134f934914a7b005c99fbc2599d90413e9942e621d20fd74c2d880eb29731233cc02fb493a20dbfb3bc1196fd2f53c60e289dd1a608851a3550a17187a8b29211020ccf68cf1bce1c74eda31a4c6700015c8df5c3c4c00e1dd1f84021e8809fcb1d7dbe23a922e9c0d0193022bdddd05136449a3a25b823f12db608f4f87db80b03888e55c1b7988dccd64a2811d1da3d803b6f96011b87a2f632600b00205f385ee1a909b43cb12cc361457d52ee09f74822ddb290cca80b7ac24c7d11b823b2d5203867a638252380b571861e42a328721f712e4046548b0c78960b5e9557b7bd4d7ad44de48ecca80945adbf93beda8372d562033ead21b8ba05ae0d99016c08dafafc2ddf255d9d86b203f8466ead384c47d9ef5a3d8061461128ca178ca40617a6b4d295a301635ae48181991e5a7cf60e21a5c12d868642d7f640c3e391c2724cfb9db5f3255efb5197ae065f9666abe4426e0263eb50f99acead883a71ee7fe6451ac65eb34d37a1d52dabb04a485b848b7ccb1e152f348fc8e5944b4ce4df975d07000e948218b4ad56ad5aef8c70552a20d9d7d6022d1ac2df8d06762a403a0f7ad061ed0c2699578b2b88916981d2c505ba3a714ff9f505b21a3d92bd3e64b41222b685164d0ef13f4121b9c9c74a286c8ae1de97d0a5a4bdeac1b1840057353962a2832c9b180bc8c8cc2ea10a55e689b6015c5cebae6f198f3953dbdeba1201fd82cf7a9c2cae3af369342c961962bc646e8b46df80747046ebd1c82fedcfdd811478fc45ca5d9a855c8e2a2dee83165e232d5085d2ebd71391836303fe380ed0f471e026a9711b6e832f16e3f166a38c63315b1e4a2e3b13b9031760623faf8132660c5726ece4fd70097243b71f4bffa824e651b6fd929d92ea79efee2fb4ff73fef11f462cdae148b063e634e7852b7a6d5540c70042a5a65c05e4a29b914260971e539c6458dd01232e04647d21b1c1a53f54fc54d58c7b17a5c86d1d536d2f0739935f8c153467390d303602d6a09e8228ff7d8fcae109b459ffceae16ebd0c588fafe25e44041b2483e163e466ca12e2b0d4a6fd1c0c6094b2a28718c66babcafd1b6539e0f2e2b63263334b6b4b23948e314fb1056199c1b7a4f65f45a8d0b7f56ff6c5c3cdea05b2fc62d640b9d2d6b3e414e8b2da9e2ab7ab1f47d84610ae50e966b6e530a9a7880d3248b98b0986abf915146db6f229b5f2081c7d1fac0cb8ca3aebdebcc48213f2bf62b01c073046bdf0b9067eba24e99155ceca478bd2f74555a38f1b6e076aeb51e8588f4813d14ab8d9ab5b18d1363d65580ba1adaf78f0f4ed86f4c469b7c310ae720f4972a7aeb9d25c5a024b443b7592cfcdbe8132ab471ad088bcd9141d778392506b9dcf398cb95477ed66cb9200b811164137d88395aae567bb079505e25fa9c07c6f487461678c324471aa261ebbc8e00b7890d14a32950bcf85aa7aa9aed3d908c0c1654f1d85a07fde264410afb4e3a89ac7520de2007a49413b50ea4ac71e8119fe67608f4c1ff52d0236e50dfc67eb9b87f11848327e1ba73a2acd36020e0f5c7a30c5a905c3e4005fbbb1f9caf624094c0763d77f2c0eb50345ea6a653c38dcdb06dc08b9711d0562fc6e987d0702f4123e01cdf721103723199f4ba766b2ec7ac05d8043b9256c6b3e4842950c6801c229ee9752a7869329cc81c325a98540527236d89e01343a5ac890a423f9e154abbab202e15bf342a0db6c6ed50600c5f764164b3e013683b133ebb0e6b3a6a7c44c2c0ae3b3b503b3afc7a085904432878b6314943f4f0ab97890feb3de114d0ad455bd2b82a73e8bb092e21e09a6e85298a58a441801e3e13e775225835a30b9f98dc354730ccf225688f531558d45b0114cce14274f1c4bfd7cde93bbd797e85912e37d38a0076e4bfd334f98ca3da117ef242f1bb20108aa874c884e2ca3b0f50044c2b8564d786db25b44e1cb1b34d6c6d8c925d73dda2ff016db29b2b90855b389bdb1fb00feba16637a1175bfeea7db91fc5e0173792d6d98ed74582d7dce340e09a85020d70c221e5d6b1d989a949a9c6b6751fdd1a01bbb89b02efe21433bb966bcfc05d1fac8adcc5f2b203128ca51cf57a6d402cbf24531844d0994495925f68e3f9a936480a950b4379c08f9927c5c9850a272dd6a50370d5042997d1c6f898a6fd1b6d13803a704f74b2219b90b668127d716ae2df48e2d3c75eacc860cea7641474dc5dc97c9cd61fc84c7a89d63f0cf5093e3de22b4ea5e7c742a11c50be56fa4eec86f6196b94266f143478428184f9104346613f3eeaa8cff26335302a7411d005e10b59f9666400c6351448adb5196d43c8ab63d3076c96ac5ada240682999d4fc4873b55716aba144b2732d6485faa548dc1d152ef137001931a1b1c8436e523e3d2f4f6948760844b5a647c8392ec9ee40fc4aac42fbe443c0034fa202d90ef8ce0261e32d3e9c5ef93b35efc2a1875b54898578f9369de3e04b85a426837429799a8e6049f68d204cab108c2156f95368c3df14343b82035b22f3b70f64d0366d740d65e577a5d59aa4c0a103a80e520996aee50c29d2b6ad66d35504eca719e90eec26a2411e9514524bcc745aa24e207a4fe4b964b6f38ce178d6bb3c84939eb7552fdf9ebdc63891c0253c548b44a27928d394f572cb80c3004f75e1da021a850c8a31f99d6b08f95617c61e62899a4f9751c577a44e486fdf52881fa06f104b300bb7d464d67c01114dff8562ad85347e6990188750c35cce27b01206e11486378ea5904b5d504d99728ff1e14453eb54679ea047fd97f8138254ca45c9a973a0f16ba6429531a6a48755031ecdd4efa60c42dded2700d0662658fc74cb9fc025b76b91454ab2dc1d5db03e0f15d409c40ae36150eae4e010619260597c94a9c94a9af6bc18c40c3baed00e66b2fe4350a2c41ff5bce770d8828021e932c8ed0387636e1194552e5334a058feb35311f464620efb2a63f591130aed86b5cce73443f30fd1435b6853e229cdbe539d131f1130e722eefacc8815cc277183bd628c807a54c872b8af844cc263b1cc400c491ee0f50352ba32545b5135dc2a39d5b03c094f22b4025fc0c62e8f45c547c87318525666810a1bd15cd888115710b7c56b1e94bfa781ee6b70742713892cc552e90202774a44971aa255f68107420f700d3eb8836593ec20cb401f67c67f212fca595458b8cd59a0fcc1c30717537378fd95746a7baba4a54c47a325fe8b53e7dba99a60cee543f42284e1a5450b0f91b9a8640bcabddb318d3019b3c551a4092c3990733f2f2acfa8a2c6c87fbd5f22c5f99ce2cf426d945f3c12241d0d65f1b23e6b69fe88e56a74cff3331d7c10909e6e74ac5595506d400c7398752434106751bd36000d258d332ace8b1c3d507625c421607f89e93927aae7df1f203e98ce8c931ab2612d5f38679ca48e26d66ee2daeb91cf4d5bfaa57de0ccbf4e1d3407a166ffaf7c5981bf09d49f735c93ef5f79271c0a85c9a0808700274aa2dd771043b40f8be6c79f93eb4b77f92fd71a1b05091aa0d8c2f2c2fc7e9396235a09be5b89232a10fbaa2a84f61fd014f4702b2efbece30041b14abe6bc9057d18b47bc2a45cd9835769200873816c52fc5207236f171a5fa6814661ef1c3623d727a69f4d9eea6095e59cd86bd7e9a93b191d5a1d715117616ca9107b9bedf893d1f533267fba03d51fad8717b92beb77280ae21fc208605129cf2aafcb8c088e918d402720806b4039d86c0ee2f076bcbd9270a27cc72893f0570899d8945f0fcc11c268bc3b28ade007da4208f2f7cc62e71800e7c2a2a29141231d2458939258c6d009b49fb0776c3c57c9fbad8f32ade372ce9fbe9facd43134a51617c3d050e3d9ddf873309a79923f35148f813ed29803390b99bc1ea9fd2b41dc08404e0da1b11d20b7d334c74c85222ccae07db7d1fd46715fbabacd711130bd47f8f167272639f9c4ab9ec332090cf1b6e39da8daccf919d267290b0f2e1cc16fe582c641d9597855adf084ac0684df9801d4e77bb30ffd44bfacc84fb84313852b24a277c03ecec31eb9641780213ee25304924ec7a0665efbc0b6a382721326ebe0bd23cddba5744b747ede995a6fc288f3eb61d57882e1baa40b871950ab8120d029474148f3e020e96f6045d7547b1b26adb6394f7ca95f803ac3ef2f670d412a0b0999e1ee7a25445ba6739a83fe281511c3a06c26365590a4927ca1f4643256f9f5b4dbd7c1b2bc60d0fd318d8d275e671df01863fc182bad4e479a6c511a494ac0234728b20e4fa90a4884eb5287ecaf54ed11daad8ffaf093dd4db28f6663bd7733324dc46c98f8aa6362ec5a768c34eedfa04e4f9631d2170116f06b6e365296baa90c1598b3fa24de64aec892035c97c76362681dde4ed515f4096474c7d30d64b8555132aac85e0d25186fa46c75c1be78a52a6a29817e6714d3dfd0222a7443f4cde01d9ce283998fc23b69e09d17f2f60535237bf66397c924646a4407277d82aeaf7cf8a0065b1f88716eafaa4989efe7ef463f1eb608b0c7f6d135327328535a09a49731efa024e1c50adcb4098aa0f650a2e45d91d5906670c2bb3f228e2e7560ba379537ccef874af77601fdbf91c65b0b3750e8d5a065c7ed1ec99b5b3c542e85006ce541f577743d7fb4d0c4149a5f1910b74947de024d37ba9c048b4d3a817ea5440fb48a74a078f68aae7b7872bcd6c60ba8a82ce9abc3bac8b110a471a0ec1e751ca15585c82ab217986bed23f286aa71b8343e684d2046a1b3cf4ed7a3d58887f5fd52cfa021f77c557bb1b93c1acf32b46936fff3c018aec1c288949ae4b8295099d8647ba93e6e4b1578a6420d726b44e99b26d501850eb0039a2035b5d1aef65619daf5f5203091e4ada4946c19a470e131835503202e551fcba7e3da335d2814c88ce49a466ae5342005c8e68873a18be357a5b524261108da06f588d303f03f8e0cf0e7326136efcbfc104d44fe3881af3b3e068b7ab207ecb3ca66afcbb5bf502790b8c15c3851d75b4dfa318dd49b6261da8b2a71d5609aef8163d078b53754ab3ccc0568aecb5313afd582a513d6cfd1b709fca29002a17423938339b486cb0b6116becf0451acb188f2b169f473c64881af144facd64ec59e5dd66c51f69f56cdf8a0c7ab3f6ba0561e908357f36fdb5acfa8145576da7078ff1d47092edefa00a471fca1727af9a248e7f738b843fa8b95dd3343ccc8b6cfd8aee5cc87de2834dfe93eba6628b26594b64ee1e1d4f6d184a0df2bbdb91daa3c410fa009abc54da88eadc4acbe1855dc515ef083dfb8695c11e5207fd4313c1a87af9ff105d41eae66c1ca9e2f5b0ef6cdf64a57ee8fc8c9c4b971d87e262e5a43a7ae16bc7e16c6eaa1f977f1886846de76a50061fa67d1009612c7d55e7cb751ac294cbac6a2657f34cbfc3957c8b3cc9201812e35bda05b8e10f55274119a34800a454203f89f8507bbfa1e57cae43f458ed4d2c717da52122f99d055ed2fa6f3266d42e1e7f52323c12fa012df81887a1e9a762b4074f8f28484e623a5a10c62927a18fae5d855f50b3d817c2d91a856ba52b29658f69b5eba8321cdda075da427ca9b278cd75456cab1b3bb2f8abec7c3d507eae87134a8c7b8743b6f95f0e5124c469eaaf0b558624eec82509d0a07354e538ac3f24ef0f71e06cb4058fde66390940a8da159a51996110fab11cabe220c116a16a3ab5639fb12dfd5adcc8561abd7c2bdeb59d1e88fd925bcdd83ffa9144ee336dea5349b6544ca9c55b77e170941cc76b5064bd100e4be7f188f9746d1a1b613c267896a141e99e1f323e50bf1e81e0ae93a10520f5e369cf5f4675636616f908fecd5621733d582b1988a502c5ef698fa7e4792623048acd9889d1142430fd762d78fa6f0758a801d7cae2a3821779ceb5fd70e3b3bb90219f1e7b6fcc40a6e9ad921451facd5667af163f6855055d3ea9bc66f1b65adfad0297944d39ad930756bff666f29bd0117121811bb3fc443d6c77c77e846f3aa04004754c8b4e0652223a701c81bd2e3ba9b15b131129121499777ba68fc38fec17da3a41d7ffcde712e95c6994c1f79919e074d266f88267e23b80cf28bbab56b3b7884851ef7b7aaaba91437b847b4927755dff125406fbf358863bc9874f3008569839e9ca3e98a687c2ee52d911b8cd64056243efc1810179128c61f3a9c12d28d2c99bc1e0a5e696bd883f2343e4dd486674141594327f02c60387e2c15a953b0210942627d0d99fd06fab1eb379cd47d7734f1757b718cb3a98830c5010bb981a4ba1e123f33df7831a56888d1ea428b786dbb649489f3a3d4d38810cd5c44d8a3132ad06dcbd61240d5d8dc4bd0171c65d48830584e186704efcd25a17fcd2780080e90b0aa87bcc52158c418628083875882c3dd778354d6fbb75beaf5bce0154a5355c8d358c9401c18df81ec30c5fbb67e763c5ff222a8194d67a45ee79bea3eb9627a60ab1c42cab2401b8a151a3704e54ad1c8a0b2c3e68235a4e66113131e8b8250c798a69f83fd113c201833e6aaed1b37fc716b52a94de8446c775fa5f03c70bab405792c7924a41dec2de4517b836364b8ce863ec7624e929a84160edd8b815d34bf4a99ed7f041e2f5eef4aef180a4635175f26ed5ba9c6015114515d81a968a407070b216d22cfa97a8d8f7909f53268181322e41f9df03062e69a65cd07d8ee59f09c5df0f79b80412b4947893943c3c6119308f3209a5b476511eb6428f271c3c6053790295d66e4120c47e7f6f1e5181f4b4f4f48c2f92f015bf65239b8b2d0283be45d4a4266b2c69da4ea367d78f3d34675ba3887efa48514d31d5fe68104b5ff94626c24acb5a7ce3563f032e8e3bab2522c0a7f6155b8f36cbd368020129e3733abe9683c997271da196b86bf530d9a27015f858f3a7759263c8d0fdb860dc806ddb9ede89174a33a29bfbf6d3cad73f56a9ad91cc7e1d32437da4d73f09b75675dba9a29750928326f583049e95febfa518e2c8183b72954b1adcc2222b22bbdf504e2f5996de550cc81d5d03a6dd764d823ce374f893e3c82c92d391bf2ffdc82b72748c177e436678b272efad98be5d052cc173079fd2b696838371963aa30d2c0e23f2488ef9a9db4b4479ec883ea6cf28cec5e225d7eb69b7008566a0203ba943f86b04076a96bf830cee9c69759259a6e80f7a9271026a838c1e63c55e31050ec45eb2dc57243569175424da976c6b7ed013d462961b804d700f6cbb4bd39a7fab7672b29ef1c9f03feb9a64681db1762f1ca1ed51eb9594beaf9eeb57dec372093acdb28921cbd82df9de36df262bc8eccb40083b9b8d2195245d92da4aa4e6ff47d0e4947aec4c5f00cfb78ceb69af6984a4ebafbe843901583f69913a2a1c1fe33024044e88711b4dc4f8cf9a38b712ac3c9d399429fe75b150a45817b6ead6d2a0c212d496532e37e0dad40124c0251fecff9377c0d80028d66ca12262ae3489c45c087651ffccb14023781d2ff0a5109d62c53a29ac930b39bc2c0a47c3578b77636f213ce363363d086d7a73cc4891cb1b86716286256be11de5096517e329425d481045d3f885b9ca78671f29efcf4400fed8b7bed454e3faad85a88729f4e374e363cb2a5b99c9909dec026a08f434868395a439ff26c69a09b0722256479535abdea53060ddc4593da1ee4cc40a13b44627a64094e865bc64e6fd6d0e49c1641052c078f290e52db1092e3ec7325aa2b4a50de635cb91468e509ab348081c28dd4a8987d8a182d7833eb886cf6c34348d87f6ec8228d1587081f8d0296a1399ed7a2f80498e64b73032ee46c9a9da214e2891ce8d223fd32567e454950011318c4308d820885d8a376fb93035beec60fa16315cf3cb882871c9b8e32e3967352d89f210ee4b5d358ad94514296185bfab26a36308b2ddc60570f70fba9a4742a099f0a8f743a613a5771479b553312187df3bb88f73533e2110449ef0459a9f57e1f6a0bb4976b046d95895d1d66007b899df73b833da5c7b5d095daf61590ade234a6d5e6e5f5d3a9d83ca419bed35d151cac33ab62f8a343e0a7672d08e1b0aa8313e01d5304abfb7538ffa4dcd272cb240e8940520721d1fe71844930e2cfb124d014a13dd88cae874270a6d461db525356c75e1d30e971d9a36e9ca78ed6729b0f6e42e7803baf0cd2a2c62275fcf27d4c81393cad07042d1356ecd8c43515a38b5aecc1ee062412c7de56f056cba7189bac31a79e0f0e0d0df8354313c175bbbbb52f1a6b15fb48c295593043b6345a68a66f808137e8455b388f7a0d426b8e13ee8bcc69c2d9d22ed872d7a1ee84ba4bb8b2718dcbc145799010e67ff2410a35de3091102a65e827a11b0b1b75c3bee187c4e3a1395d810e4e4df588fdc94941a25866e635b33c6eb66fa5610261043bc1afcb8f3d91e40c1f1c29cf211c66a5426f7d34c9dbeed38f0f8ab92724b22cfc58648478626e4e41caa196722cde035eae84bee3f92c6ce57d6a9781a2b9caa523d9bb62a0f456959af408c3bfe8829de0bc4f2bc1168c59e409d382b797481d8f1a1d3c9edd765decd0f08300bfc9f73002f11678fd8b6d503aec82f29a340ccf304622af335e86299d68711a597241023a18c404cc29c4a2e243a1162df725c47b199f92f5d641a2136fd9f71a9a83f42cc0c21f082d8eb5c28bf00d8e45516103b3d0f96faf3fde0083114bd24fb63eec18458845835aa8243e70d71f8398458fd3c5da4168d7ae41ead93ffc7a156f6d69bcb1cd6af2511260186d11f2262d25aebf5107d3036d0a478de5bace62e287b213efd8641010d152bb127e5d61cc56c2c6f955f1b78c895b592738c85d6bc4d2738be608f962aef05f258a55ce1cf2ad5e0cbe0e1b69c0f28c6382b0f5e0af080064cba51c8307496bfd21338dad7e94a5449027a2e3fed23486aa31d65ec141638d7f246abdb47355554f291a8a216613280cd6ec3d7bc39c7eadfe35a9e6ff29745f87a2c9a9b2dc217b28d6e5d2819686274663594a8e59b8041a72048a76a8ab1bdeeefb9d8fd4feadb8df166d92d09f7664ec3fde697b8c52d81d495b90e2b7c236c9e2d4875a1a1e27cbfdb4d26bc0010864cb28512a108f679f60ad40c1078831bbb53e643f9a423a801f42dad16fbcdc2c2109401d64747cf090b2099b79e10230d028240217a18007fb9c0282881dff583987d65939cad29ddd2ebbe30edb3f2ebe772f21c7a3c06aba0edb3b9c3764c362af00732fee76c6999415dac23e0b3b80247b5909a8da6600fa5d7cbfad5f689c7c0406ce42b647fc7af78b3c6ede0138c12e85570508645e33785f84b353ba6687a8c82de02c7a5a07377c6f6891bca45a079e898566342b2b6c0d5070ae5540103ae9d9982fa1a55839a8c3295be283bb29caddeb8a25aba4002ecde37b383e934537d1244c2d644fd8d650e6d4b9147ec5acaa08f27a4af961b5ef9fe36e3793249a959f39ee8ce6a3e6bbda0785fa5817bd4643b0af55a68721b9de2a39c66f877cf5864939c067bd8a7774e13bcc2893368367d07a3604f7bbd04c5ba4762e590ccc6bde0347b5b41ef9c18a23ae6e74c0486bb27bee013524c0dd4e6b144dd72110ac0a1771b934bcb0f69d1f7ae906071cc84f2f4424d82cc6fa123f7a1d3650c709154461e0ccf04a5198162114ecf14714d8a26ce35a0c40569c88aae1054e20cb8d47fd13698f504429aa0cb8ac6142eb6daac36b2387bbc9892d045338820a20632a4951abc7cf0c6ada32a6507051514b83924fb9638bba9dcdace9b37245b35f87ae34beaa10578f4a86c52e71bc47e179e8b7880342327d0b987a687678cfae5ec532a0dc90b2ed103b4103f25a9dcf03c12f7f46d282ee7cc41fdbcd117d043e38e99a1a39a4fa4202cf9885d10aa15703b4421f344b0193b15b4dc8b800151a94518c922860531a484b6fe6ced81c610996a05c3e1fecddc72e4f7345e1642d542f0037245915e22c1124bd450f7645758d0f5740edd4697360400b8f99adcaa01e50b170783804451e9dae0de28a2fd1b2b6aa89e71c38f12bdcf809b9f391616e6c154de021cbe0d0168d0bfb41ff787363c6a855faf5a01e719053c70f4f20f9f7582974a0159e9593d596ed4f6e0d5a577e58ec5c5c4040baad451d095495059083932c2004cb9de8f8e5a4017a337f2b6d8955af902160061d1add4fb705f18541dc1a43551526909d351b0f546fd4c6f54e3341594bf2a80d2086b3005edf154f8da827af1a8c2ba3dcc3a50d307f5c404f0f58723c3373abdb15cde12fb32b7a5447f7b231b3ef69819a71f704dde24052111a75eda564b7cf886a9a9faa47f209b401fdfcfb16475dd2e215d0f9b1bd586be8744122335745cb11f2503663378fa3575010ae41f75fc63783c63d92cccf5a7fe1a2424aa4497a0c3ecee041e94d4d96bc4be23e1f3e63a5e078c38386a896e769306d9be1f424343f1bb5b9bb3fdb9fc96cc493fc1e6194926057db469a4a04c024c6ac59774cf7aab119898835a91514f7c56f812b1e175694ec7d1487c89a119a57717ab594271010a3357f32d50c7a73fe35959b179e6e3a55fbb7fff14b0124623afa5468e43f9daba375ed1f3465d74c6cff4ce733ab12fa8f554195c9ee7cff05998b5db7c8b9b9e1bb93649da539e80fa56edbab5476c03e7b974f8d6d4e408a4ed3b12c9189f6c1402d88269971e07b0879fe3ae2fd07c4ef263892b839a22b0e65401829d68d571299c79a52d4b24050ca37eb4510796a267c3e723d17294063a7f0dfad2305bc7b21776ac95c6a7a8510a5d5fe88784ff85049960a35e7e03eb0556153d80a0674c90c8e2434f34096d895ac4e989c27d00133a6c718b3605f6567ca3c13bf6c3214a558906c56736b051c0b2a5747c06d9b59ee425c7a8d685a7127099a1c541cbae083ba7bc611cd3642e19d56057c84215bd39fec726a92889436d858bbd60b6f7f8cd8c4dfc6e7ec0d1e463ba830786e2f29b85a12e5bb6236fa5790c1bc8764c6d0bdc14c42a8650570dea31762965bcc3f7a3a0be6d9b4f1208f62d5fceb9075262df211b59822bfb9e45adc4c381f4eb00ab6bed2bcba3eebd236369adef79ab3a2b3e697f6adcec6ad0ceef8ea6b7f2ac14fc7c9a809e2804a183c9cb24a098e1ed28a355bb7737bd9cf759e60fbe73ea2c5e74e9c35e5367d1c7d475d54519690c6859992cc5e01dc3b6e65e3023b1bd4a3aa4980afda9ad455d1f89a8d3d58527a8f15c2566372277e5e88073549d3a39f2cd98230c45d827463fd6ec6b7de66df63a49779967d0298b880935914868b25f1ff611dab8964076929aed3a700c24015c018ba2dc5deafd6eba2ede5c6fd4f061aa5f267dd30422b0dfdc3a267f0f2290bf4204311d2b13b324fd51e65a9da7a3b0093302d991132a52ce902a5fa33fdd1940cc4dabc93340ac67a079cf400d9f81377d06cebb539dcc0fe2517369d4aa0539e74cd38bb70e36cccc345178290cb0b09682296142891bbbb059c3b496cb575e88212d0d9a125092538e8039259181ac4add2bdef749beb625ddf3095a80c4826e141d2452ded4dc339afe50aebd018dde51660e24b7524da346abc3b5cb0e43f9359b9e5da54f647af58296cfb49cc8d75371a17da10a332da000911a99d3a2109911b904b6c3a5bd38719655a3c1c75f6a0468381657f415aac0ff974ea534f50aa9dbec34c1166a29be74aaece8844ac9bbcdf44a0a295481528b9a8914a2b360ad57191fddf45aad85ab1b7365876050c58e1f44d3118a18bb2daca74711b640f1a4a053360a7b16aa4e6f30121f8fc2983e35492e49c78e0b228cc4e206318c39ce7014c3b32d4bd7f4febfc8aed209551939f2862282144252dd68fff7048e2a763ca17e4819ec2e69998a5e6de87971cbec3208d4b1049e2c84270d5110785526e9b01ee6971e96e4a6660a2dd5e4ca00dfd68cdbc75ed0cbe4992f54e1e043489557bf79d9e7c9421386e1aa394b408fa20b60bc8951c35e0df7e25900a10043ad11d21a21bb114208d95bee1d6c0db30cdd0cd7992e30ded998615c97ffd389eb19ca85ba286e6f0708f2705d9ef481d7344dd334da5d151d6657f2c15215fd8a3187c3d974c2793ec1d97cc2599e5070061af93cf016a9d1054d9b1af7a85f190b3cb7bd6eddf4fdbf456a9c7bc53c1ee0b9ff28db83d2cefa2deade0c1e48b2b8a32cc711a946fdda3aa18ec92236ea57253295501a133e20148347d5bb708f7873dd85bb3a24e62e67d374b2d1e1038fbadbb66ddb369f2801a108db0f7ef7a3c3e074d26136a3f836d06e3feadb6c3a1841b013caa89bbd83dcb52ea8c36a64eb5187ddf38f0e83ff2b68bba12e08e95ea0c3a81ef0a822350eda4ea86d6ad4b05d50bf9e75426d137f67d3123ef0a0e63d6b284df3344fd334efa8570f75d4b1a33ebf422a42835aed6f7387ba6693005def413de2e8f1a0721022187c9d93fbf47838d0e6c8048377d9ec321224490e1f4c60f015c020f8e4ca510bdcbdceeeb6bbcbc625288931d061f0d3e301ef8f0e6f2e1b31cbc6d7ecb3a97e3a699b1acf3e9bc08b72dd0cfe3f14d7b03ea488ae9b9dc02e10044197fda1f83a5d4f29d6febbaeb2bf678128065fc30ad578c53c1e17c57346ed35ec11a00c54598a29f57678f789518ad478f434548deb023eee4c271d935dbb75010fded954c5c77abdd5a843a17ad42fd633f0ac67140a3ceab97a4980ef41dd759d66d92ea843140b859a4aa8a984ba99f5bfb26c3dbaad462e5b895423a37efdd92b917eb99ebd1eb15c77b96e37d461f6a6a07ecd2c77d5a8b2628c2b963dfa5c58ff1eb10bebea68cc7aca238e2f3e9b54cf3c8ae4b33409940e3fe7508cc9ee3aeb11ec6c13e9b08fda48ec30b434aaca9b210326c5d436dd346384da66eef0dc42863415d2897c922514256d339be6d1945ac825f20aa944562191646924e55952218748214e703e5ee5632811689baa94a36daa114cdb74413326bbf72c6a11975c81a346e605e74ee9e41abee3ac77b8791bf235152d3c87a68d6c22e563c0b8b9957d36c91b716952d284334a8433f9d6cdb408afdc7924af72f422e5e616569a3611885569dae4c82438bf9b37d5cd9f7caa2ae1ec9e8d46d306a6bba06943a50c964755239cbdb46617d42575109809859212dd1d364d94412f91653771091f4a441f4a2ca1d3612bd1fdd1264ca339447e227933f8e4e7cd5b37940e8bb049f454348b2651379d33a8c39e44b87bf624ca930adc9f53680a4da313d489ca6aa67131c618354a1bc3a2edd850e4b93994114d2ab0fc368da41793f0f5b9672e28e3869cb4d602cb634bdaa683b4186a42e4a4e80906e54808cbcb0e91644bb8e5a7bcdd4f48f8e2731fe18bcf1b6645ed4798fcf1f8c81e9fef186be09f7989bb0786e7a3943e9077ce9629d286fc36bfce6e17b16bdadd6ea41fee0fcfd8d2823339c150c5a0cdd510b00b2118c1133468410b30d86928b8e9e00321732812022ba4c10b465f10c24ecf01371d500045087885a3121423a2cc0678aa4a70e449159d7550f7f58474110730649d1165599605792cc801174c28aa820fb4c0620b7260811214a34ec99329f0e4704c6a4203ee8a2982c44005590802113a34210217e220793085dd81a6ada86002a51608e106444881169e62f00322ad881560d8811674c06206285843c3810e5328e982044d255134032b890c71c0f332fd52c131a9890a524a3a1f8e5188021166c131890c55c0dad0759d342289747214a1d3f444057e08a9d1c931b5bee9771eea3fec0d4d153e89b71d355ba38e793c3f6c4d05e20c1380480c582c3529add5ac50234c9657bda29e7f30ac3aea7e51f6ab5e9dd9a857ab7a8cabd91e4fea113fd3aed5f2a60c8a31f39ee7356d62daa84c6de35a4c525ea8dcec2facea29567596557deb97eaf22a256e49677ad4fbf4be8a49e08d49dff6e8a5ae0e94676b6733c573db5af398d1d75a162ace276394977544c5f9b028b0c74dce4db31167b28a5a23f6bef987d6b61d01dc288aa2dd1ca7d38ddb66193cf187a31780d829227cd8adb2c3ba24e6e78df7eb3072b2a3501aa98ab60d7d14c247ff478a9d4a3a704c70b4b99931f10588378e884c5e29a00c4dbf5c7af4e9e975d1620be67bd9525a577c36dd0e8fdf948839111b91414fadafa1340d1a04254b21bdc3735f2e687bda9e76622cda410a9137b421b931653983ae52ac6beb33c4a6a40d6d4cdb9266022c4fa5eca89166027a0cc326a5b562b67b955d126d48dec09ebe244a389fabc33162cc39e7053adcd83b6e7b9a363e9678a85d694ddff45a3a6ef5c942a3c743e73326a9f6ba9b9ee595b2509af23a6ed5e461c7f9bc7e7ba9631ef621efbea68aa01e3bc6eb5af53a5d04b5e2baa6a626da319d3b899bb67a174b75b1481cc3fe3841e39ab783c669c8b030342e5f69d89c634ee3e18ca76eb6387597cd1d76b94edb0675d7ebb435fe04cb6379b9238fa68d5007191101964850485248bf62920f9c74270505050dd9c1f9e6877978fef0e73b8f074f1b28158ff5adacbc6869b9be1d7aa8b19ae968389b98e33304064ac98939407c5418480500310788cfc440adb6f13ec566ded7620ed06a8b3940282ee600d59803d47531078862d6fb29d5cafbe04af57eca0b9517efb7585aefbb7cefbf7c405f8c9803b4d9dbc3fb30325adea71173805661cc0142c5c49c3e0f32ddfb3dd8f0c103da6a620ed02a889803847ac51ca0c6f5fd9b9803d4e1c41ca01b3107288523e6006598027d43c41ca00dcf7e167366de67c51cd5bbe57d20628ef7be4ecc99ef7bf3c526601b969bb15c11c7b21c1127841b7a6139212ec86e507ab0dc159c12d7592e89ab824b6239241c12674416f95242f862132cf396fbaceed3d5fb60f7e9fb4cdac2b2eadeb30db574dc7b36a115d7b305755e7d8f0685ab3dda9387f57bb427f5403a0a14dca3396107d21908500b6efd27c3df7768405bc27d5b377f174805b3dcdcb309f1912d371741ad6ede90743717c939508b11efe6222f076ac1f5e60da80563371771a1cf3f199eefd17c62dcace179815470dfadc88d1bf7c54aebf2e8db9e240fbe18cf5a53cc912dab8ee398e28c7ce58efad5c322862a8c18a103121212244992545145529212254afdeae194a25cd1af1eee8a2851a060796ea95f8da38e8959f79198e5724745be1833068e10bf19e2363a7f3db64d10af2a56870660040505e19dfbb0dca7e63e40dce787fbf8701f9afbd8b88f06b4253c730dc424dcc3a3c70364e7661f09d48259ee0384a5e679167135403ccf219b10103f3c4fa2ee071f9ea710283ed03ccfa1158d8de729f4a443799603b1d1c3f30c62b93f860032f31e6e066ac13337ffd0b0c033cffdd4e40406ccf2fc93e1990ba482776eeed984cc2851ea80593ea9e89e1f4344a9431d30cbd5e979846f0e756efe1037b784b8f903c0dd8a8a9414ada85eb4bea6a6a6a6a6a6a6a6a626ad494ba22549a225d1926849b4242c2dab8ec3b42189b5216d481bd286b4216d88293b6262628a4c3863626262623a626959751c961d65472c2dab8ecb8e647076c4921db56447abeca8cb8eb8ece8e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e94949494949494949494949092bc28ab022ac082bc28a9a9a9a9a9a9a9a9a9a9a9a9a9a9a92d02434c9b4c1f11b6fb979cbf9eae62f89cb9324c17137a51b37e7dec9448790d0213a4487e8101da2432dab8ef32e8f9ec41ca5fa48e7478526d3649a4c9349c3add4a1b4e92b84a44d6bd13143daa6dbc9a7119198c3248f8a949e282929292975bd7f6f4a452b57d5ba453cf8b26c6a25ab9bbf8ebb975b1273e4df342fcecddb6773730bc778dd206e0f8939378738cb26af478c2851a264a0169c352c70b72346942851b00fce7db8fba8dc87be468912a585f4abafcdcd7f32fcba64e99679495bf3a3977545f5d3f805768100f949619a03016aec23a160ec3f19b6f11f15eca3c2b55fde0502e4a7c33f1c0810c53ed209d7ff50ecc37f52b0cf10d8bb7c0bf58bbb407e56388803f941e19a0301cab08f4cc2de7f1a0371d9adba73add2c3cc55309c0b04c8cf87699c491d48b6612ccea4fed3c23e13dfdc19675297b7b132cea4feb21d67520fc26a7126f51abbc599d481b05c9c49ddb3a83893fa0fb6c699d47db05d9c49bd5a2fcea44e63537126751b56156752a9f760c13893fa8c5dc599d4552c2bcea4be6253e24cea2afb22cea4fec2aac499d4a95d8933a9b76c2bcea4fe59963893fab42d71267516eb1267526fb12f7126f5b6ae3893facac28833a97736469c499db38f33a93a60d68d712625e33236378e61337784e579b0b9abe1a271273a948fb13fa6d3124820063ce3a1fd01850a9af064032ce333aed395867d0229899fce8927fa15b1ac97715de631ad08ea9a1745b77384de0b585cef0f0b735da606842f6f45455b844000a8efe0636e5b9c3e9898340d20eebcecb0e3529fa070414f411a5190907cda913b33882fee480c78105f1e0ee42bc511cd000892043194299902e9022cbfed40b2400652de90421ff2a1a0459e00cbb7f090031e62d4c0410d18313788718546e10b0d1bd070995183192d3268208305860a98d60e33d861e5cae0aad818d8172f7a4a0c18c460c178018c95cb052ef065c8cbe7d20217550b0b5a522c2b60f15a44ad6e45052b5525052aa8172878c1a50849d9582760692b13ac322c6509b0ac189672e82341cc5151d514312735532388395e6389eba550cce9e2ccec98b9614cbeccab35b9d0167cc74d55f4eb4c5a93cc1b132cf3f694c51c70d668176a684352166fb891c79ea40df92a2a3458457b9e4c26930dc6f7b5fe30bc9986890cf04e2633835fc13caf56abaf6056371fc37c75573067bdc2d8d9d4930913d6616cc419c761dc449af3e8cb96647cc3c257a1acd0e09595e395d6ca8a0c3ac23a13c6cd1f4cad67dd1cd6af6ea6c171d34738838009044b70cd6c7d9d1e57e58c20589ab99154ec6462339da7c12d852e9b514578fec56654123ccf62338a29a39e724d922b531fad68427852b172956a537f6161b89bba35fdc2000ccd0d47b194303bf42a160313d7af582726aef747e216cbcb0b08821c68b757f0d582733671335b513957ebe5982eb7643a11f22d71b308ee197795e72c7b4fa652844a96654c66113a393a9c1ca6354711b372570e714b2f97cff8bc8eea3097d1b3c96c9a4eaccaab4deac2098e5ac031a98b2138a90b21bcfaca6b6339407e7c34ac728bb41e3d01c4a4a01995b7acd011959b53aef229fe6d20c5a6ac8f868b50fd2b22e2effa68f8dbc16c4c0a8a5e0fd54582b91d12470f8995ecb3d925f5a9589794caf74f25ca0b6c65a708778ef8480ca4f21a71975917eeead0b0ca55deb1ea75c954b6ebb09e655db27337ab5c1f0dd74b8fa7bba08b9d312dcb379b7fb01c4686c762b3a44c49a6a492ad5c6772df84e16e0681907e525bc9ca55be4ed2483ffa49d8e1fc8d922c7bad2a2bdf33fb232e657109bb6e8e4b5964c2d9cdf5db8fb884b90bc4255c6f8fca5f5ebda64ad464146464845f7054a28113ae54c3e2a3985351f96655ce59199952bf606e9618e6b35e98b7bcc2d84ca9c3f9169b251df9609eb3a44cc9759a498ce7c984295bf2e51f4ce80857ff7fd92b67b3a59e7ad4d3481b3e9bdd89747434ebe7ca733d77b3a50e2753f67a201fada7de8c694987f3cbd95db1dc92a5d9e2e1e87d67a5cead1c68e2954717a089b317aa83e79eb2dad207e4c553af4f51a99eb272339872d5ca8f572ed0c4295f59203e4fe09e1777751fedae5c171ec7d98f572997ff38ebbddad640ca5711b366acd8ef9c4dbd66aa4cf51867b2e66ce32a7d2406f2d1665cb4034d9cba75d12e0f0d7ff7d170eaa9eb23a3e0ee3e320a5e79cab2fed9eedc7d54f74762171e1bae3de3d5fa6878f5171668e2d55936bb7007c233de5917eef2d86e5eb9777567131a33ec15b42b4c1c3d1e3b5c4663203db8cbb89993aa431e68e2949b35a1783b8c6753c5e6b8845d5eadc43036e21decb59f05426f63d8dc61181608c53c1eee2ad6e52e4b3bff7861e05952bf5a3e9f29b550ac558dbb3a3547db7058c498792e5c2186251c1af0ccd13671e78aa538338f696a6e58eca63a77abcd1bae2a5f79555951a9d27bf123f18acd2e3c62525e79c62d7d3b3e6e49bfbe7eaddce07aa00cd76707b2f29f897956ae8f86555e7057b140537567933b9974387f265e797b3c567e7bc49d2f2ad9a0086719c4a45f3963829b44a51a44251b0cf5cee49ae08973e604cf261039c22baf59e295c798034485ab2a8f71867b955ee55480f844efb60876cefef868f812476f07ed90e3b468955b6428dcc1ae66858fd3a25f7932e1b288421cc92e2a079a987bc44d9363326de28e1047b2cf734b228e88e3888bcae5b161eefac828f59fe596a87039af9c7bc6f1e8956777c5724c1dce9527c1dd9e9573ef5939b7a4c3c92d49afc7cae598827cdc2377f38e887d345c0f34715de296b44ddcf9fcd14fe627937aef555219fc9de3ce39e1cc2d714b5a15be95778f9eca753a932fb25ba4f59c7a765db2ab9258b92ee0cab39bbfbf5049825bd231f355e217d625bbead9e59632264b98b5bad9a55895b21173dcab672396a17d87930a5f84e92738fbfcfbc57d3e9c289b33a72c7b97d17b44d68149e6346de651cc984c9b6c29c6cc674cf09cf3da14befce14e15850cb21280d12764848333d0904316475664c104da25a94a8c5c219ea1074e54d8a00d5d8c20ca0e1db08e12d9afd9445a12358a1198adcbbb699ff7a7c396c7ee4f87db8ce9f827fa2501f0445fe2b8a9a179c209f99f0e5ba6c3fe13d87da2c3fece900af40b7b670cc3b0db5b7422523a279db31fbf61bd4da1a6f5f2564ba6f5b2851c318b1f53b86295a313b080c210380a9171dc60cf36383e88993d460ef52245a553b15f8ce9fec2c618d3fd90376a64cdeaced78bdddcd3c789fa1a7923c78dbcf10387bc11eacccfd71c440f8c819fca46197a4dc296565883010104c67ef801633ef880311a1a8cd9b081b11e7ac0d8cc0cc6646430c6030f187b1172d69872c64c39c34923cec84963ca3963ca883372ca9872c24c39779872de29a79d8f33727ec69830a66bbe4c97d932e56469cdd6ca4422e6a8c419f9398f984f7981730fc6621843acbbaf0f14d8d7d5c49cde28d82aa6204fa335f85a6e44a7c340e1c44fbf9ae85704b228a59432cbe63d0bd331fd3a6d2871d8838f3e1fc32c91f5125996a12e1371892598e853792a29965d2626135937e77522d0cab2263aec67cf9e3d6bd92fa5c3febe9496a49206f76b6f4e4c6e70e8dc28a1c9f1d56838a49c386e5e5287a3f2d9cde4ec111db3dd10cf18763fec1bca74dfe0d069b9f595e9b650e62fad0ee7bf140c8bd3f8a23388ac081f12fa517cb32736e7bc5b9c99cd189d72a0d89cb3024a72672a71c49c9b135fdb1f8a7ba31913cd93cd37d104d74466976042be7ebe461ef5f9ced64b23e72679c8db75388fba35539e46de0905de3eb72fc1441319d528de6e4d4af67538696a4298be7ceba55f3013d599149548bf220641503b08dee5ca51600d05a2ba249c75f7e7d6e1e4c107ceb80c986707352c332438cbaac892709629c1f94e29217c309f7110bc371f4c4c78d46b4cc594e7a55c957a73b1e2a96c3701a1d8757f68bf52542bcf2a5537a956542b2a956ae529af2bb6536c37b59394bb5c2ed71ceaa6997d3ee957cbb3b7ea316c87a44bd22ff06ed8f3bc241d5287e47a4671955de79d76e87af56c377dde33c52eef761dba76d4c70e73ea1dd2133ed5ad4f3a0433efe067d3dc1ec507c459accf942d52e359ca732ae53df59e542a7553a99b53ae7a4db193680e09e930535df3785473680a9944d453612971ba51a1481bd93f1ffe038d0d897b98b9ccb6c34cf9cab32d7c5da6858f65339a3b6cd80cc4b5f189346d6a3c9b47d30894efd9cd8dbffb50a1e0ec34960eb161691177730b7333377f9893b91e8d1dae8d01e365250575e9ed40fd07ed7f29157166055a76d76dfe700c0d325502ceeec2328f5a3653212e1bee68c41c45e3312af7ba0ebe0bea57ead9c10c1e359da6d36c9a4e66934ba3d4e381bacb823fe83a8db4e1ba56e5adb3d35cae5722463acc3e6d8e8c64a827f5ebae6346ac7097fd41d005dee58a1e08dee50251d7e99a0e5d0775a68f86c11ce49508eb352912f17107cf72fd4b69a74f23aca9858f75d78f424da527140faf71ee66f0ac0b1efc7679b035963acca6ccbe04dece2bb66cdbb66ddb88b26aed54aacf53a9c7bca2c34c4887f566aa3b973acceedda934a434698f0bbecfb8db039e7bc43b3c3ba522e680ef826e61b8b028b1509f77d0522ae24cf61d2c2dea30fbb5744887d1de1c03778f71738cee2f1feeded2bda534576ede52aebaf9de6dd29cf0b9fe3b8f3a9c48fd72d579542752add54ea479348dcca379949a47d3c844aaac1b842d50a35aa3f7d7ef9ecbbaea5936ff5573819ec7e3f28050fcfb4387faf5ddecfa9fb9ce7afe5dbfeb3d3f389b3afcffdfcc62d96ea80bb2aea3aef278505df64ea81bea5774dde9c402ef1e49a2b25678e0ed012b6859456a9cb3996b27d4cb75d4d56c3b75937627b7f9735d978755b64392c17bb743ea30cbdeede4f1545a41d7abb7c3e5ba5d92267cb93a21e1ecd5e94955d26196290d5e3c9e9614be5c8daa927ee5ae0a9c81605793fae5f2ad91e0eca80da3404dbbb3e97fafe16b2e3e90a5751e0f0b08389d748ceb9f4d77c1e001047b58fef29797b3b44ceed505f5ff28dbf38a42b158df50f5b9f1effa0ff206eada766fddee0f3e7b5763fd2ed0e6ba812854feadc1e0e6f5406117e7edf0aeea4e0382afe95777f02c8f07acb1d60cde4c5d367f38081451b858a7913732083078d6755d67bafecdf6d44781419b2776bd606da791375cdf6ebec1b9f55f9f897b58af2a3fc81bdb9fc1dcb8d6e0b7ee4f6396c495f5fa0c3e838f5e8fdf75b3bcebe0cd3c5c07ef3af8d3c81be07f411b730dce2b4775de8e7af07af5fe206de495fbd378e5b55e6f87eb3d2b2a97eb456cc262b1582cd6751afc05cfb234d28676159bf21716759de9fd206f685e3df824ea5de0fd41de001ffbf5eafa7616ebfe206d8038530c5e97edda51ff41de00af65cf3be8ed60bde7c5ad5f79497498f51fe40d16f81f543c1e54055da0cbe502adcb759d06abec34ed5b8df1baf4f851dff107c1a0cd5462d75136839dcbd6476f0778d65d3608067f1ad7fb83b4a1e9f46655d76c77ced6ee3fc81b117757d988418fa7bb375f0d8e5ed7f2cfb64c27f0359e37fc9ff6abe5bfb309b44e9c3acc9048dd756387600dcbd3726987e0592c4b9906a7429c0ac0730b89e70fa752300000c08701d0c200f886f4a2434647a643c763b7704e4e8e4e6c1d9dcb357c3bbc89af9062fe73696ede3460e3e60fc8cc128cfbf070f3e6448e9bbf0c60e0fe70818bc4cddf8f1b809b5b3d97e5e6e79b43dc16b837a8a70a5c9b9b6f9ca60d056ede708c0b71f336811d09e09f9e8584f308d89b5b10b82ea207dc1a0eb805b8324adc171612c65a3242c60970730b1bf11937b78cb877f327809b376cc451d7c7cd2d2c23895b238f8b694bbe232c76d4e112a8b7bc6cfc3a2d0c5f463dad5c9a5330e6c3a3b7c38763d7695b6fee23ccbd887b54f40b75ca614da4c37bcc8297618150236c86c1b1392a894da49024229bc4d8dc424dd8dc3a36e7d80ca304003647997ab1d9dc420db0b989c0e01c95d0b03936c9524885c766d9c4e6165a85367b4a307d0dcb009be90f36870bb0b926617a266cae4c30bd026cee82303d0e9b3b234c9f009b3b265e10a6cf2c026ca645a09e721359023bc238acebc182dfecdd616bee8ddce951df6e964698cddf9e5f30f6b83db75ed8d2870363d8967fa460efa0109c7aadf59d4d02f57a379b53f076cc668ab188c1476fc31848c1a99b7fe01f291b91e630ac876d223f02a35e27c77195b318caf66cf7478d8eec281ea87bb68f36a3eda8c8d0147367067510f4f5095660616464480976b2ae1fce54e5e9c8f1957336c7bb1e475ca7fba85fdea5d566339a31f4db76f38f14cc1dbc6dd421fdc2c751ee085c8415454d1809a90e452b8a826c7aa70a7943126ec131e90d4438eb7db3e03b9b29ee8e799718bc19e732af9e053700e2580ff40ede1c73ef45441c7324bce3f80cea178ed32e0923ce81d10507ac590f5c8d6fdf678fcbd8ad3b0e0b347d340cde8d488714ac2e6057c3e6ad87773d74ed2161c47f24c6f9f476e0bc6e1a078418d2e7d4c7634088af182b0a4375d85d380ef58482425f8f2a92b6c1c1a40a41a94330ad45983ed2c75c8d60ca591e6b1872d4afdc54607a8a298604d328386355609af48621384b799ee73501ebd8706c9618e715e7c38e3c9e4f083bea20e8a7f80e86d441d0678975b064225e533a257b9ee71d33d221dd703ed0bbf99888dcc2cfdf8e773311c78e88b01812112762dbb979fb30cf5d817fe1f1801852bf304cb14729128ef0022bb077eca85fde5f3230fd0b195887015ee371da1ce0323dfc00d600f6b32d24bc4be3d543a2bb11af5b8763731ebd1d3ad7719db62e20787968183cd0c4e0fdaa87aa38061093a4188249ee719d896323febcc738e382f3888166e782737568d8fbcd36e73a8ec3662d66bb2e55876d2d3ae49e6341ee3836e218eb522f8f0d6ff7d1bc9b65f1ad96305d39b514e079c32d4ab4b410e0791bc0f387f3dcc22e33cf37369e6992780e7d3c5f00cf2dfc923ffc9237fcf2d82f3a9e5b3ccf1fd28ca1362c182f726ef33a8a02f1d835317080348ffd960d9a31f4f6720ddf8edfaf9c74aef302dcbce95c899b3f9d1371738b9e4544041127c0cd1b111fc0cd1f11c7b9b985739c0f817321702e809b5b38f771f3719ec4cd21ce6ddc4c83f3999b6f300b69da48ca9dc59de7e68fbb8e9b5bac251e1da73ce7e1e616cf736efe78fe42c7573abea3e3f83136e69c7e06c59ce61cc7cdad9c8337e7de457a775fefb78bf27a18f1d861006eee26983bcadb61c481268e1d2271733be951e4ebea2b4ef55e7bd888b3f7232c50e35adfbdc7eb0b8fa7470f4b71775635e22c6f871146dccd7381d231f4d565fb0edf2eeac90b1f1b5cc0e366287011af9dd7bde27cd8151dd2254c498734a9438a2571e2abf68756d121c59074488dfce0da75aff64787370c093beac2073e6347298fa706adb067a4438aa4437aefc833aa828e7fdd6bd0185f389eebbb6ba7100c9d760e0975f8ed33680ef5cb48634718122c49bf705c171d8dbbd7474c6160600ef39a0ab253a863e8351e7c3508f5d4217d9e3bf8c077b613429fc2fa0acb792e002e42095c84b7c33bd8e51abcbd62de8e0dd7ab61f1793dea31bb7d3b8e578be1b03f6a70f61d363711cc5d87cd3c36c726987b98c36349b5541de6f5983368da34d2d6488dc485af9320311921b2a4abc0dc732361faf65244f888b85936c11ccba9872b836f8d4b367cbd84b9b75287dca5cecd2d84b9af90620e003ec49521c49521e3915e463d8eb8317dd24b22f51b1505629efad36a01605171389a2b2b47d8d1466f5031af47ea375e55bc1ea96f388026deb6a9d3386cb5376c1daa411d42e968dba09e660c7dac4198bec319f5b465e109673b1aabdc2ad421bdb6856f0e695af8c0e71984e9b52c3ef0f4f3cbb9ade3dc2c89608e3b8c73bf81c1dd0606f7d7cd2d0ce3b5a85f4fd3e68b408ce1ce3d889bb79a9b3fee40dcc871f7e1e68fe6e68831dc1f1313136362cc6ba09e9ae088f3b798bbe4a3f1bc3515fd0a4faf333b1b716823b6ef907e8605d2322c1089f30a09d3c3d89c82337684e977b8363791db0c13c3e6a80486cdd145ff62b324d2a4c5e6166a59a12f29a39e7e7037aa3ada1baa8bd8c3f0f62285b542d236e18ca1df3aba218557604aa45f184869faea81ff5ebf1b45cace112c75fa1ed22fd56947349918191d1d212125492293b013f4f20a7ab9a49b4827f4f2090da245d04e4887f4ba788fb8bb1a8efae6d9cfa6d4e1a26e8cda76c369838a438ca10fc15682afae60dac49deda37f8a33f4a338f89e514f983e2568dab096584ed386851463e8975a2c274c290b09d316a6580a8c283a080064904e8ba20735f72d30b32c6b97925a3b3b5b405e6762b6476a8f769316f0897106b3347a3c3a8dcd2016a0f45977768bd7b2cc9e238e387a98052265b62362a0194493134aeded52e0d6152b5aa8a8c10d2fb8184ae1c208b77d812bd651cbe282085947ed8a8b2cb48e5a908b31e0b62db86e1db51f1750b88e5a150a70db144ecda04edbd4764cc06d5770f53a6aab16705b178c42c26d55b8aa3a6a3925303061c3b3ed872bd851abad810db82d0bd755476d2684db7a185b016e7b5c53a66d9b82eb8b8edaf904958edac6d3b665c175a5a36d415c632bb2a4729024a72f04999232a1c6242040d97d629c99ffc930cc47c318e6c2e33f19f64d46c19156793314585e6702897146de1c044b9f89b320397b7cee722843f3a57c35e1b411087bfcc124eda8f58971865e6a35dacce628f0697c36b31b25104d939f11c79bb10ec2f9092c81e610a66ed8ee663b1feea8eba263a3727adf6ecc89dc7303b5b62434148a0b62bb6f40dbccf55b1374e054811cafc0fd1c9bb0920a967013883ce1be126d4377ba0e393679ef2c6d8fc7f1767d64148cfa4f3d771f0d04c1a8a3ec4f0d8265145cad8f56a78d384827ed76cefaa0b8ff4cee679e7bf76981ccfb441184e5535eae3707c1d5d3b1751675cf76c73908ae3fa25ff5ba6c8fd8bb7d1d21b8719feb3eef1da65fddfd99b83b376f775d7ad477ef6ebd321d5a182f9c289bd2e1e7f4e5d64bfb717dbfe63b590603f1d9ce5d5e1f0d04c1db75d1b1e1d4351004ff04c141549bcd324bcc71366ff7e69cdd5962eee6edf5dda7f58102733e13732e3db6cde6fa0a0485ba3e1acef374dbaeda0e34f17673e66e0e82538fda0ebe6845d113ceadb602064cb0dce930cb60ce462c3d2e0564dbeef47c343cb7d3ed024dacf93c81e766b38b77a089519c75f12e0f0d75d4e5401438c699eddb6b7b3a3aee357b677d6414ecb2f576e7443d67eedb76316ae39edde69e5bdbede1bebd87fb4b87ddeab00777ff20dff6380f94e156bfb25b4c2dd0c4f3a6a44a0d55688a70a72f9401895efc911d11c7eb33e7e5332b34b4c38e14d1a9afd014df69218e6417ec4013d3472c6f91ec62d747c3f4f416e91ba30ff2f2aa84629cc13186f1318a0e32a934037d9254e01c3e0145a6d964686a646a60ea6723ceb0ceecf71b896f5460b0cca18eb42163ac3cb360b9c2b2e65091aa0ce223b600c4991f3295db3c177c12734a481b45c81b4b30118098c38038d36725b5aaab0f79a3096943de8880b4216ffc9036301067fa4c969654d046cc926520fcfdf2e637216f38216d4440d6081b77377d1ec0dfed914ea05636889c4286fd152b51f0c2fef42515dddde06dacebd5dfafeff69f9057c966a5b06cf640077076cde341f1f7bac9d829196754390a89affa629c511dbceafea9e21c9ff20ae7f89459708e4f3234379c94524606673208363ba57e325de81199831a61b0237cc426f927a49445c823b05b012fc048da130635c2e42e4e9a19331f2fd04fb2ae370ae970be0b026f17549f584db226dc3326aca2211d4eee76445d2794822f67509e5a5a5a5a5c9e35819f3737343461988f39cff3b821585eee9af1199fc1cd38d76df872c6246bead7e438da84c3f9b8674de067fe64ac6e069f31010faa606efe64dcbc618e3b68b3a6ce9a644d2078b3a68c656753bfb63bb76ddbb60da3306858712eababa3f1eae033285993215a903634af11f52bce6b54b4cd8c51e6a45f31c90d425620276ffa355f3097c29db64dc6e4dccd34a0bd01c17bb362a2fadc21c6e3762d095f97253d5beabe6749f39189ed883a9c47db8755541e3ba126c3694a6518e2a1fa444b4b946ca1041700610e4954a0022b30d58ed2388dbb32a116aaa00861b0e20b22c8a2083188430a8620835073e247c3510a52b0029e384a410a38c0399444322e58c309b4404115552862c40813059288664de8d06d9a8f253a945d0ab048c308863809d20269670a29421484e7463d157461c593235c1a05a21464d99462ce39e7a419a5946e749a60ce08250e454ace20032d9cc0829d79023cd12084a752129e93ce8d0d5d46916c521409e10d3ec4f0613e982cb1a4c41214c91456a8a6e4c49629c19b4e3079c2e9e7892cd34e402913ce805404362055b1031364410a4f80b251345c61dbb21eb07a892c71a6a52036ade1080ccc90852abc20831224010b18454283b76d9bd9d6a4061db6b465410a4e300a95d0d0856ccba2539665da0d8982ac00075548a10516bc01e9680e49010a4f4d6c010579822f48283621018dc216499a9c209b34a47081a254821abc4009505040826805d00954c8b22c0b4a1575c1054990828b201075a1c8143a70c210382a22165650b1032068810b1414cd1138610e4234e4a0c2d18a2c62f0061d74380316a4b0c151189aa69046821d9ed0c4e8095d2832051dec4c2994a88085acb3b894655916448239ad982998737e53524214ac704217f9b30f41cb29eaca85632b82aaedc60a8c4f9372a2a0873aec67193338e6f460871bf2c8e288f482630a8e1e8e4996b03097e40d9945c442cc915b904c1d4a2658d39b557dcde6d8425f66116f48287288e8a807734885b3249244cfb6a76c8e38d32f583299363c128abc81a30dda29a89b5544c499aec30e107c5bee206c83634c5fe38218d080fb181b300dee7c8375e24c3f7ded490d0b34db0886f4146ac2fd4e0a2318c24d1385172a866118d68d358649d98d4d0cc3300c938d3586cdc61ac3300cc330ac9b69beb1896118866158631886611826b33967b661d89c3f1a9b18866118866118a62d614c5bcae48a0db5e27c315ec6b8d1ae2565771f9b73f6079a6891196811c626d67a0ebefc618a6118f6c69a7037f6b6e2ebd984b13756e42bc2f3e61fb408cfcb0bd022dcb747dead434e074343b00cc2af2dbb95aabc927c726aa21907a4382ca1b4432c2c9a22c0dd4a9283121a9ac56d4af3502adf2ddf30c0f968d7e1b4d15effc59d6fb37167ce396713563084e77f44a01533c71d85ba37f294e31e391c3158cccd94a14c8713bb211cbea6f2d22ebea694d2fe3e21da7dad8b4fce192f5f50519726d248637c6cc9868f7e1ee7c37e0cdb380c85267126620c052d624ce470c47d2147dd47a81106e7a3537bf2e5788c7dbbf1d953e4fbfeebb0d5ea2f76d2f6b39440248efd2ca54ce990e2182f2fb75dde968c29f334e2141cbbf8221623a58db9410ae9272aba205b4a2713472924a18894b23b090e5248820e765c3c97549c2f4a3ae794923ebdfcad9456cacbd7dd9352264a279df374ce4dbefcad9456ca0b9d9432513ae98409c3bffc05a6857573ce39b13c9bf00f7abb944c5e2888a6d391e9f404cf47271f4d73b6a6a6a5ec8df9871684ca5515da916febb063161dc76d98d2739b76e9866518761bbb42bb14a394e6c419795a0407385c81fb9bec26dc30a26b8b2db6d8628b2db6d80285863ac54442e7801ee7c3a26cec1699f3da4fe848df29beb37510f1b2a71c418dc21596305584c1f9641038e26c3f6c351d0fddcc07f3cd4871e5183dd060696530a35a2a2bec5955b119d817c2d069e1bb428a522b3601e71c8c9da9c3e29b02c68e390163c7a6b51143ec99c5b880b1572c60ec282a7000c0d8e90b637f060263c7b063d8310ceb8718ed30f7e50c31c6756b3716c9fa7e9fd091199db420f480a31444c044c3f968866a2ca5636445d9cf6bb5389b3a6deb23c237b3cee3c9e4b76dfee8f09c1fb771475dbe3539ee45fab25d7a6c18e87077e9f422b630ef50dec3e2dbfa55a46f8c4fa769b624541d127716b3974fe808c528ce2e3a249677c31d163a22fb3b248ef7b020535035387cae1d12cb56c57c48314494285176b657ccee88982341c4acc415e7c3280abed616bef8be75c83224e27364e721e488eb22c7a46943339368beb9821a61328684b18d5a4d4bc3d731befaa86d1b49db448ce435323ad270cd6c86b52dbe3c931c75884599433306d3d0f0156926f866921d2ccf2a30760c37bd4bf7c4588cc2138630f65e6a2dda267e21098b51808213c65efa280963415120c296e09ddc1965ea17966530762c874edd06ec314b27180b01ce2fed21d1343518f6237c605f42de904b2426a5984317182b8a64c8b10b18cb5bf77934182bba79e6e69075f3598a30f6d68a646a23b944dee81b441bd8312ecc2c09afc0d8536ebe128c9d7573ababc0581b750ee4128ca54e3d9e1f1d8ff7cc4e9c65a79452dada19be4c9b68664d5474f03651875dd443baa887748869214d5db339d5758fe27611518758137551d8614f590f6b23337cdb358f87d3a243ecf2ed75a79662ad0c5fa6a8366232a2d72c4dcdebade910c3ee0d0dcdb4913b11637d690c698c21d534c90463b2c987ba92c38ef351edf686b9e0dc4618cb9a08465f3ba0508418469c5780f015893ba060831813b10bcec8f0658d61fa588ca1c728cd2d18ec856439a1461a9e6d4e6f47e318672855611e4fd742f8fa55d539f89a0685aa691a9e1ff389a76f8462683e19cd279a281393e23b4f00dc4e9c31f1be78debbbb6577cb6ef9d2305eeb53793c3fb4259e8e6f217cdf47e7f77d5fcba84ae5209aa6659a866974b626354d53496d26a8f21126ffc6b7752f2dfb2309910e63f751877f744de41a09d2b2c9307bce39bbffd3b8ef914ee9ee4ec1f22e52b6919ed48b714e249d0ea494942ef194cc3931ec0b4f52382a7da109866159a6040623253008e1161890b6141c95c0c004eec3add6e8206777df7477776f65e8eedeba46820c60688184eb6326637b3a50374bec09a10e2b85a24339d461a5f790a05706ddbe2785c4991a95989a7e4a2b318ab313d8e341bdb31aae52de223a94583cb249d5571dc5f1ab55eba227a5cc3c1ed557f6c8f63a4f6d4ff7f9dad92c3b9ccf7bedbaaeeb549718edbcabdea96e131dd66b4ff87af3746c579d7a3cb6ab5ea797c4f68e52cc7bc6300cf3300fc330ec52ead1186377736c4a592194577428e93b3b7134bee9c19e3ab5997ee60e77c7bc1eaa4f9d89e54d957af4b4adcbc1d7afd8cdd1a1ececc4b16d56efda59895756e808867d622e9de5f93aacf53d84af32d12f171e189ec7ea5b1cd3173186735873ea67111dfae8eebdbe2525048f7a9eca53799ee751aad23c1e4a63f5bc1e341dd294c7e3881edee7e7ed99f71e71cae331ef5d798507aab2f72a53f7fe31d1617d675d52574763d58d4087f54d60cf2ea16de1f3d161fda769e1ebee88c3d4e1ebeedd7c5c6bcd5da7eaae7a8fea6187f53eea1233a65e757dd8223aac9ff6880e6be7bdbedec7531e8fe7bdbb341dd6cb215f11fdc281eb2b6ff535e3c0d1af7eadaf8f53c909d7c8846b0d71fd7c0d4cbd3d126905073d5bfa59ca9ed8b339e7c4deaf8d6554cbb0eea697a69558a29f9dbc144787f3eadc1b8ce345b14eff200b330eb4eb17ea45d4f8c3f797f6f50b157218e63eb959c41159e64343591f4508291d817abfe6351b6388ba97b267cef96e971ed9fb4db1ae5f4d81d003f91c549e361052d0648b3f7c515003d3d66ff54ed3c8bb23e36910497db4083471bf7e26963ce6fd99d8dbf1453c77442c9f4233b1a81126a710e1ce201032917c18f7cdfee8275d037a3f6a30465f681bfd48c13d7e60ee180a7bc5dee11eced91f29580ac66e4f0ff7e1ee78f478765ca741200463dfb66b61f8360ebb3ddb6b967076d4666b6a7eccf64054b4097548b7a11c01f0f1e8f158ccf2e1979d211e3d9e2150a8631826c375aecb3cc65712cfd8b9d7a7a07ef14041a135e822f11caf02b83d5683fa857ac26c0de26c5087503cac06f5ab433dd520d4d3ad4118bfbcb9f85ece3d8a9d7336a3bef3e8f1ccb84ea3ec8f0ecf7873f1cd78463dd520a4a52549fae5ba19559f310c7b0f768eb5d421e672dd7b7559561216121224d45948fdf290247179484892a02e8b490ec92ca4a0ec08402282a105ce87c4c8bbde918b0a715752155e12242329f08818d998e1c165e6ba9c0797049cf5e49de2c08103070e1c38709cbbd9f33c4f014c7c011cc7711ba0dc1314940e29ebc93b9d91e141060819999bbdb39c3ccb7a62397997b94ec73873736be63c0071f3169ebb67593296f584f5d42fefb29e3a0c29cb09c57262b1905848584cfd1242e654886719199967d6528f8c109685d4a18c103232370b71d7ab1096c5d421bdcbb2962c6b4987d475216cc4946371926325e9b05f94b5a45f354ecfd2a25f0c383d8b68e5b472ead711479d868564a45f2b48d3e64bd22f5515fdf2926cdcdcc2e1cccd5f183e02b13aeac9761276e36135246c00acf6a443fa1c02b09a13ab357548e95fe859e8b1d598e887b0da0e2582082288e0e1e1e109800a122a3c549250e1546c546e54362495949494141a3468d060b971e3c68d96969696d56ab56ac0696ee333e7e1393ec437a4db6c48e736a427b1219dc7cde191d8901e800de9427ce7f8f6aecbfce52c9f71efa877afc7504faf1873344c6d94ae789dde5bd2af204ebf01fbc36d6c4a081ff79bdbbc4e8fc7e6de7c9c8d95f8c66a4e1dd24beda9438a3463e886591f66b196f296e3f9c32f6c9e6f02a7b2a8748b968b833deb14a2190100000800a314003030140e088462a1683452443d6c1f14000e94b85668501b47411243c618430800000000000000000032356900dd9a180130e48d893dd7e72553f3c4627049d60fb8a557d4e4b9fa6a3d1536af1e305629e5c0bfc27ef07ed02218dd1fd1023498fde0861f1c56e51c208d3e5051dffc99eeb7ca021c04a003835f9a06c9cd540297cad6726dbcdd4138e6fbafe7a871240f579f8c2bbc6beabe1106aca1bc2bfb6f2d7d644a76c894585eee87b10ebc3b44688138fe09651d1e3ba0d9c95312b44c0f381b35166bf55fe63dc9d53bbc26ac64e2b75845f48d5ad50885edefe01f1fea25a4b00b64e46a15acce98fe7bdc674381df7010f40fee3d23590d170e0d3c82d38bf247a4cb2547a75eaaa2348eb5f4bfef3a2d767ef960e9623639d1c6cdb8d1b6e246895e56ca13f3a70b7913486c52015c37ba79c0afad12b5f1c66bf86a7d45111c1c666cc16d63066ed586e9063dadfbee82d2c32f2291de8d46dcfc94f286610f1db5afb2da8647e2a497a0e7693447838e73f889f640ca44f9cc9ef0fee24a968f903b1f5f4c99473996bb2117120945b14e3500078245b11da858276d3dbebf1c96fbeb8061f86a89e6043d282ab2c05e356fb8fa1449d795e0ea76126d76fb60c79854067de74ee77cb0468ddfecc0f9023f513c317679831d6a8639836ce2937ba5292ed75a6ceba5fd726e8b8f07aa66a600fe526affb64ef53a0245644e285a21f21aed2e311890a66eac1311f8e19f80710e121bae96da7af5dc6d3857672871dbbfa8f094c7e346afc3a19c2185e9c7f8fde05ce56468648519af72f82730bed78cbaf8d1d873b24048061ac15b9cf59cab5a76fb6ba9140b80f86eafb1484401076fcca6e08c883af1d69c25af9ae70582b87a25144990a5ad25033163025c901478e9f57678512115f0df0be0ba4b74997e3106def5998a80d0710aa83a1796b29b13801f7474e740db5d8a9bb5d6b8de3212cf7b70b0844f09c28178887da773299081b34e74faeef4db69e53001e5763e92c583a3634bfe0545610f75eebad91aa7fb3fd1dbfc495dbd56a00de5cba81fb658b1828dc252900f9840885335a27d4f16bd93f78d47795534ac9d51dbbcd0b038af3a7a2d2261a196daacdba6237c94775be21f4565aaa9af24365085e5b835417c88cfaae6ee6b48837a2db524bcca7daf98edf381d1168c43c9b54dd4ef2950f3449e8fece7d17b69c82e30a0af15560df93f23340b00e603580aa95584af21fb1b2fd19b2ec0edba8b7cd3306accfec0c6236092ce1855bfbaa86e41560ffec5eb6324b479d4d56f46b2ddc22305831efcafe6f5396f2938494658b3380b4a0926461cbf8ff8568039390fcc265862a318bdf7704c0ea4af7bbe5a4824da6013f91064f021cddcef14226fa4e0cf2ccc020a82c90ebfdcb12c38029a5f9a390abf733fa2f1f17b0f46969ef2daacd787dbeaa0ba7241a9831a6828182e2402272ad0d8486c6f96a5f5406095a387647d10d43473dbe3398ef02af574a6ab7e2ff38a05f75e45e9948bb9a26c72c6306ed22a679e21c61cc36b144a9631c8baa14f18098d9737c33598f5d57643cab50f7d7bd9d97fca49cddf3f0954bd9ae3d98ef5e4b7ce4cdee06371b5acba7e62c9dc8d8193b1c723967607c095623e61f97c972923a8e6f99dab197772f6b2cd0e58483321a94b492b756e91bc867671629d10413b0aba244934735fc7c1ea3c27ed6024de4275b3b0efad983873bdd325efc0a2d1551a557830130174ec96fb2eaf335b247ba4f81199a8136a30d9397478f4656af3efede2ffead8078f6f15d188c8108716fe6cde50ebbfc32262c48cdc4db77e7ba1b9fa9d43c279ac72813e4b94c65d7b898fa9a18751bd617e5e6617ced25b64c0d8db343f2fc7b527ed947ec590a18afe89dffdb44b2fa6b96d4d024456021d27b6cfa5e646a579678c1915ebc34cead299859fcdbb50eb376bde507b0927b986c30ff45d4dceda3c3afaad735da3d8755bdf58d8e7074dca1c88dcf9779e1e69a85bb9a2e05c630b4aa7035d6feb5d3494d47a8417ab50156fe1449b7eeb49e3266359c9030fb42439d27ec0f963dbba9e24ad23c961be774327a981c3f6defbc334082989e7fef5a8de9d69d597202cbe641a32fbed62fd720894f0ea79c86679a32d48ea2ba7f528ca00e715481ead1fa6a42bc250d5c5dd7b8d008615ad6da4405d618c51141530721e7e1428da3d0d3de63d231acaa44ceafcef30fb9c146d4a995340e8a5f0e3f8130f63bd6cffd29e0df4ee61529e48f4ebd829a4b871d551a8a2d3581cbea5b5851f535be57e207ad56f003d4ea18010c1a252ddd6122dd851a865b65096285599aa529d5986aea44c964ac76077f986d6e0fc4c9633c6ab2ccff2d5dff66afd34289a5f60098231659b334eb048a0d729122bafbc35542db184832300043e0788f58c4f7f9aa2cbc5ffa93bff5f33731bd32f6acd0207a2a2665a813434e547f67ead3b9d6896f068bc5ec3e222418dda534ecc504ed37457997ef39474511555fc45ec95f38ce51097511db8d62db4e9784aaf9f56886b4dfd1fe2cd5234162b249e670cf8b36af183b076caa06d8fa6dceb219e3f5eb05b1f78da7499cba1cd522e06d5d71a693eb9d4b61a8ccdebbeb66afddce39f0de93402717bbd46efd306902c0a767a44c2460281448723abd3804b229f4c2db50e84564778b270c6e06725e2dd6bb8fe15169f1f165e0395e5b6f408ced5680b9f7cd9dc40cc4692e8daea5b28a590b518bbb64d5e1a6495a4ea1e026bf4f8d3ef57b19d0015861800e411b91c65c21eea647cd26c3dbb349f2d76f1385eeea9e6f2e139b2102e8d3eca113f0e4be163b8be23334e42d9051d7987cf00d6de30a6bad1db62390bb890b828605644962fd0cc5c928d6f6cc480c4d9e028b894fb02de84ae3f54893bef861bf7446bdc187a18e2536455b3e89a20ed6ad581121d624b6ad4c1faab838393d79b50a5d58f61148f99d997a449147a707feaf16958c509bc1c5ceac0505f2d20d5720dd9c2263f5e682d0d1770ea0a3ea16f6851012862e613209667a2cac55490221daf7b15902f917de961f15802e1068fe2f947110ff6e277f28002c0f92de21fa31a6e65475ada76f44d1870ecf95d556677cdba2a4869f445dfe2b01d16a060efd690541f8aa090fb5a23a98ab4f2035980f241408c3823a6beed30e177a094b1335b443b0d4e6b64726a6a42ee6f24cac0f40dbf2add314c3454ba58189b636e1bd49f730c4b3dc2e9233b105928b8741ee3367c62648e17a199bf6e9b11cec7b6cc33640fd1b597caf05366afc4a20c04d95dd2c2005d8837b59c0bd5ad5f2aa32117ae46d27cdfb309abbfc16f60c639e7fe465a6563a50a70a107f569baff3cdbfaa5c874e0d157cc03cd4cacc735765ad27c403575b153d95d3dad0faba3f4a7c58b85ebf39a73dda6d407e24c68b4c24f13ea9f384debdecee9cf9c284ea0523f2932eb0980ac85ddacdcd68069f6c54facfa753c8fe841caf4d90779ba999a55d23be53dc6aadb9965075d4662ac47ba3c7d2b227bb6d4c1d4e6bfc7989f4e761d28a14e59d2b27b333af3bc938ae6343834f0de4900f1f81c54193a2ba4d588ee80e085ba4f7f6e86246ce70bfd46787bb3e65b85d644cd1a80f4e4c67d5aad46ec3b5574be401d3303eec9ad9dea56152b35a39b7b930b7aa6f80ce0a28e51e9be2f43013d97dfac90c7603e6cc6e17d0b4f3367b0feec32091c32d19cea5f8fac06938cb10a7767fe3bf2c24ca15e729e58c429f908b89d2bbbaf4c96e86d57e64ba01a4d9530eec0495555f2b55d317034eca872547001eb9d2336a908a7d281cb0afd8eab0cb7e8a4427db4ee8d8e1eab9118d97b06473088d2aff746f7824dca056564862bac4438a7114befd85c8821dbca11b7bfceefa29e2588a60e35028d2a83dcc2886b2264b4c6791c46293e1faaaa91ac084bf311dbbe053a1db3a3519176f811d6fa1c7f3ce55e519e2b6916b3eb701da6b42dfb171a0a8b609ab0cdea3f2962e03b90c6c917cda76bab9c83967c22809d880f645720de3b09d241575590dc285cb133722faa13a669320d2687e255818e4b6c392d208328405a521c24221afe59e745d5903afa02f6e654e0f47a73e226eedee8c49d37baf7fac45055fb058d5f97c5343573531d079943f6b84f9bdbea38c45ee381116edfffe68d182d99aa044272bde79fc07c8048331ea71cb0a78beb512e043a38f0890e14644e62b1cfedb42034de4792431e7cec113db7f77408e7752945946db90778be9771004afeb79797ca5ae5cb8f3071545474e0119cf693886ed096f5088bd67b68133c3fdedd6b2b28ab33926d625b429cf1650b8db65a64cd05bbde0dc4978960d71be104b15b1ab462e210035dbfe2d7acd188d68d4d0d2a1c0fc9bce4875bba801e8cec378a5f72b2cc6b40f27a1174886817e1960136e9d9bca395955d20ec0ca52ab3544d1ba6c220f218579da4754c31270816a25db6aa181fd80adcabc171f26ae1f8862ab48905927d28c71aedba59aacf42de31927ed5346e14374ea3c3c3eb55c06a2f98bb798b1884d14499a0b2529ca9e1db26e05889e654b528e61eeaa21f9020d424a5e7eecdbe8e584bf74507c10c66b5d343e5f869f559b4934c57930bd46cd0376e8c2de847c621bfa8f8f284ec5094827a468e39852d5dbc6eb50b49bfc4fd64442d6c46c5dcf96a7676b85c3c9b76df63888146525e8b9faf34b357450c151661020e9b226652e341a5d8f87dd01620817933ecf4acdadc3ebf46a90343a51907259528554efa28e14427529c42049a2235244a8924517f1afdbb4b94f12f37662201f18d89bc19ae0777407cdcb367dfe0cf3d2f60d07ed2242de06d9a39403c5c2519fecbf251a688f37d98f1fd37ba3e4ad56020ab93810826421feaa5d1001d3a2773658fcaf43b9c9b39bf3f1ccee72fa2c98b31a5f20a6586a9c0ad8f5b39a9d6fc82b0de6b7d0709a3c8fde946075ed01af090cca0b052b7515a172e2a9d7046b816d6845c1f611449dfb046606dd65194fa6cd1e3d7df321839f3416191d9c445ce81e2a720d702c6718f29efc29e5487267941d7368556d50e4420aeb9a724ee5c531239650be1874e6e8f421540dcc1849cdb90ac375e623bb5bcd759bcd837e94d1e2532ea0412e96b86cf0c6a046312b33d36eb28f0b59c0b8dcf8a111adfa090ab4309f59abceab2c348f6d1e669c5537dc76c41fa546b82574e7a616f182e74f1080407d1a89e7f23d11cba80ed8d09e1a5b6a3751f7e852548a6d8844d1df952315a46c3c95ba4c63791e61469290c7d11717c1e9e2be1c68cf3dc4e92e11dc708946401cd08b8e9cac04cca74ee3156b642ab39f14b97a0cf292b3e1489e99430f979642e23a0330317f2f6ae74340a9e232cdf54ab9adcef4b5247efef874e01227020738b5e83c6d6aabd877e3e874650c5def4f4d3bad3d7a4b27778d79f4faad422b7f3083423a0673daaaeee54d9423b5f81b85560f3c67745f519d45267e6f1ee20dd778fcd88cd780a4d02b82a31bf5cab1f862b81c993a12701feda764620ba00a5528fdd2f1a6afbb7b7d0828dea7fa51808dd5f6f24223001ef84525267aead2bb1e6e227af3da2b7158c4ce23f20535d5df6bb160ce31f16db74ac075839da5af7775e26334a0b619e726e880aa96b1900d1d6c3319bd6aff084a4eff12a06c2f25660be813939b29e70566fa52900ec6b4475d5e29756b68eed74156478b448501b775de2c770d03901f4ee3105d5b11229f440dc796db284350041d9e6dd15daed838367b9eb76ddf0a8ea3a6f882044242674c8059fc2f081ab5f04153df905227c9aacd95bfa75ef135edc22bf24a04cd6903918fa530b3292a2fd1c5c2fb23f3c6b0bf712150ae63782091dfad046b37a5a7552fd6edfa37c6c6048f9c98e324f1079027731985c6bbaf5289220b56be90864d6b840cccc99033b0712b1525c184c8670804a1ef696b8a307a41213e9bc220247b3e8a0ce5f20be378427b2a13f675c128f5f7a8e005735a0347b28404f5f0c17c8d74b1d889f53de47e686079196feebc4621acf36d86be2b91c35743472f2eea2923077fabc376005c02820bd9c1f5b230c6b1436957817363ad1bad13c942365fce0052c4f28eb1393d6102ea50f30805e87053866c63b5cba876df5463a154092e93e371db717ace6bdd5c4246a5104efe3a1a6c588bac3ed8ac2211475021fb0116ea47dcec9f87a186f21d039ae913784f1d7e0b8446e661a1c4e11ce94297ab352f3a947ca270845e5da568b5b0fe7f07400a3f0766ed95361526a3cd80720dc2fc4c767180f1ba4e8645a629cc0656e0651b8c652304d9188334779b694788929c613877af3dcfd38d95100d1504eb9502f889e452da75a8ec67237b2d23fb8ad14d58f3a4bdd8a614c3806ca369635c726dde082b9d59c1df79b99736ab527d60325c819bf4ceacd9862f870dd644696e37fea0f9695bfebd273bf76a6bae013afe8df35527083db8557c2d834d6e10e745f1274ab540f9a4c53486fea70cff42f9fe4d4a667de43e4ccde64711cdac85016527dc1ea6bf88dfc9c7fa196b20194bc720c8a8b2bb611601a21116abbc41aa65bb28cd9411b24071290f0c4c13b0fb391bb8ea9bc58f6d9fde3860e6b7e145d64f06c1b3eaa016500151897552ec536701e9296fa9a15a3f4a8a3f5e82c3ae1b7ade0d539e5d338b9342636f61adfeb0d7619fa95a3ff5933a95be676385e6933343ecb64b4877561385a349ada0e1b74fe1f35791acd286d01f5d411dcb89c154fb21d4041b76803b5e22f717bfac8fc42bffc05b8cccbd6c6ef572e4e31312b1361a5ffcf36454f1665fbb569252bb5da9fa7af15a8c5d9763d5ac98a9fd0cdcced4836b4fbed5d39ac644d6f447060f8687b1c073a30dad30b0d9e078b01daa237b08079a9077483fb73a0903d28a42d038c31e00b2fba013bf2a0919ba8be3dfe968afc401cb2979f6c573700e13788a37f655bfa3caa898ea9529e060d3624e9f69249e1d78ff3487c66ee1a2b02bb57b5f8914c6b6a825dfbae8d2deefc4310377ba545ce5326b5e24a41cab77c330ad2dd691633326edd70961d138d330940e3a89f95b285f20a908f451528b1edbd8b41e498a0a4eac48b306ab404d715dc8aa4bb2673f7aa883b821c5c16ea6d668878e46773b9339c72aef00010b4074272286f230072c086d6dafbcd012daa17f96cf007a530e62e8e0b9d6b524f187f212744f482c59106f87800cdefe6d5a53aa327df083d3b68fbbf306bc334a67aab7cf7ab4d50cb5960345aacb8d9f5ee9677be2c8b5ad67144c392e8383a1e4c2160afc1b558f63453864feecc2aa6d7735692d5b13a8f2cdf922c1d5088aae752ebf58bbf2b1f133d7de24a9506dd06df6d966be4e7d26d736bbe3bff05976e9ed34c23f96702f63180ce3ebdbdf6baa7dd142188947a8f2169fd0f201a8d4aea0c303c39ad427bd13a66070980f12d6b8a281e439b91e496984141b1c4b00776eff3ceb26471d08c592810c817389ff1061734fc21fefb3180ef6c59fa00434f03f8c11bc21b8891c6c18c0faf7dc31fe7c9c2fc5973baee2ef26aebab8eb476cf9e9ed11cb3e6f15f25bb7f0dff5cb00d00b22bccc68080304cf92cdb8033dbc8101ea05f40592f188151145e2fe13bb75a275a4954d60975a8bf2e0acbd7ee5140ebca59873b550e69dc0baed27f5a88327fa5e2ba43b000a07bc995b97ce10da0c4326e1479ec3175e0781415594d6a8ccda273108e34dcdaef153755b46050b9eebe235f283cb9c0c019f94def7dcf72a361bcb94ca69dda51759eb32f85640e373869089c30c106556034131e82fbffa3c189b1ee2d769e9de05f8dbe5ec03bb2840e8cd631166d796a13c32aa2fa9dde0b70a9d754d61a9174eba4f9837b8f3cbf6231a178138c7b2b5dff8c70d906292ccd9a3f73a1badc0168d1ba353a153f62223e4f923ef623abd4092bb9ed9bff25f3bef1caca07d8acb9ed01c28a2279745452cb488be4e9b7dab7c442244c999a9887dcb2368c2708cc501260898702a4725d9e405cc9a6d08ae313a068a1a3581f6614192bfe7ee0828756fb6f3960e4ca26e360d37a0bd203e4fe66d9966c4f70c3792a67dfdc54116d4b725ca9334073e5f31fcba04536cf64e7793ba210c7bd4f4ae1994333b50c67ac0b17630605c3744a38ab9c121b235e98514e07dc2e786347e90ce9cf5746dc3ea36d6a6c9f36d06cb809b2a0c658563f70b527c7d730056396e86b796c47773a8207c11ec6e89192072e0eebc1c528cd0534c9770a4cb98df74bf8cbf39643c87a662ce8e6799d1ccf97a00ef8d3e2500edac8b71a99d487c785e591d611134d40ab177dd626f3a420c349359ac263011122f0ef130ac880dc29ef138eef40d809994e0e334b860d3349c9d7e5cfd405abb98b541c7be933a2ab904cb63da3e3fa4ec0ff48894b29846b84c8eeb9ffda9d39e8bb4d2fd9b60e32fe77ea73b0d040690ce4ca63bcb7f3827a6e037a02a0e85bb7d4fcd997f0d28daa03dc8af27987ac2a2ce26b8dc6fd18186276c888d3bad13fb8adc671a2d43c8e6a3ea26bb69437d030aff94a84361dc2e202fd7fe1012cef9f77ed26dd5ae1f28063abb75215ff97869c59f04baf145f1699498daa8607aedaf72b4b631883ada1975e58fc5a2401623e4222cf205ce737692fe4843ab0b71c922d380786944a4c022e7ec14ede0529f8d3f5f0e96354d419641d84570541147bc9d7560226fc2eea9bf73c5f33371b9b2fcd03accc6e313a4743847b9da444031ed1d4e74beaa04729186b0442f1b4e10144eae539423ca5602f37ebf0e771a64156d03ee5f125a7fbdb7e3ff157fb6e05806e711f7399787917dbde56b29f56656e97ea0c0e80072b71aef73f9ece439448eae866b67149f05dc9656767cd3f8496ef9a6b56ff261bdbf922e33d01b15ead94bed480b4e52993042c563d13d3050508bb09ed827b0123e5c7efdda67dd6fa97a50f60335e6da77892a2462e988705bb575e106acec18c092f085585bf34c4be485e3b9e3475c9b787e845323ea977e14225b40cfef31beed67812327f89a4f1c30c18229695bc20ebd200843c24475004a6525e9bea073c4a7cbf0ba1b21ac3804e3f6ba1953b076fab45a669bd3946831e44843284aee4a20b3fee41a34432a0d6840785b555837de88002eb6ad352840a333bc837b3c71f282b92c66fea8420a957dfb7503d7b0b1f00b124c8c80b036a7bac765f683753f5c75758fc03cccf027412c30f2e5d53d5417f7234bfac43bb5344d0d839f6842dec8e4288b24434374e8a9f7af04a61e5b3180e114faed1335d5c4884ad9cadef76d785f911549a1717f6fde955e463456ee2e4bd0618f04083b6b741b00f4801d3b03b63454b851c697c00c7456c8724acad044c759b4d8bc375cb83db775b36fa2cb78a4896c8de4f5d9280a117c433b6bed65321ef8995eadf670f139592d09fa2d481b731edd609579fa23328ef54f704be80a59927601ac6b231c354cf1e79fb5ec0148d064c77890d76ffbcad0375aefae8f9fe98cae9fa1593df9ab96067172561600bbfd39ac820c0fd1f222cf1104ad774795b0eab800c347bc1f0685eb11e04b343c2060f989eca2a44111baf533d9925f036c1664f049e5cc292aa0d85c2e33f07da00095547f7163c3e27b42ad78410c5dc31533a792e1363ff6365b738e48b4c12756784bd66f1ce71e91ef2a8f9fce7495e105a1bc8ed24531a8cad1a88425800f8b93cdb02d21adbddc31f7c0fadcad3767f3a2b6987b3ec6cd720776b0d0115e128eb8a076aafc1bae192a568e32daf03a58981a4c2a540b20ce2a51eb2a0a8f365830fe48b4cdf5656348fc409c40d9c3ac009147c37a719171486315f555698e1468bec28e78c6f405e9ff0986c639b1ce0cb0408bbf695c42efa0d03276d8273b6090a8d8128192e32563d12441703d93f21d4933f308ef80131903e10a15136903d40c0f60a3b765000f3798f9c7433543f19dd08a35aea759c5494f3f595ce33189a0d3dca6b43afd849196b733e014ab89343a1bdff64d513834d63aa4b8423a113c83b04eebcf007ba07d12cc1d1b3f807ce106a992c3f488c61650d68809fa30de13f408e8592bbcc0dfab1cc318ffc040fb43744349470282fcac7c022df17ce86f99691918935dc9426e78fe4913b409c72e8877324974a3c870131ea9074474743766ee26bb98d23df94c24db5b1448032535af50f1b54b79206744dcfc74944cc67222a9b5c25a33d298c4f511408faddc9366408699f70260ab03ac6484651e8d7fd0f419650732d149f03f4149fd41dfdaf548d81dc74d19a3a18e8e2c0b4d4af04cd4407c31f31352529fdfd816dae1394d43e97249db1f863c92d314f5f04a57ee2185db015eb17880075557577538961acaae21ab40471199040569f5e44777ecf72f864a24b996ee3cbf4646eec6e037e160a53d66bbd5d455912e5ba21d3487037c80d7c9018b626687e21a48ff029a7215a654a35332c897beec371e918ae5f864bc71c5d65989a61832d77694129438db41e3f008393c7d1066e1d2bfd40b10a4b4305050a3866e2f5e9480462bcedd9f56e55be30143c37b46f721c6a4e7d362d89902590cb66918b0744b99382c908e71f7109eb54acff7624baddeba365e117e4aa16d9d45dd352dfcd67ea1233295bc27babd0920ff9e49242e4e690282b5c8dc21a8c2af666898ed0d1e8c75899ec6431047165936f2da91f072f4afc7dc953d0d67c4f35aaa57b22a0be8ef8fd95c913aa8ce1414587799f2969c5703383eda178330559224511a761ea0a0de0b2c1fa7ef1006e07ee80a4c84caae0f06be0ebc5f77a1a6b49d0ff0f3c73664afa74c6f537fc4888b4ea442cf588146501a899001865a7098e0c5209c02dedde8bf0eb328c4a4689a07d83b7820003e120023f74265b615a3dee43afeb8df1692320f30654d849e08e5f37f53030ce9f5c9c77e571386d4f6d176edf0371dff869298b5ef7afea7ce0783cbfc401be0b1c035d1c253fb4142c814a96b0ade78777042896bdda84431ac2ae62cd399209ae1f6e15ab3418b3da91b7b259530c534ee6a4149f9dade5b81947539b82396010adfc6f434c00990829872e071bf8fe96a3c3518b80e4d1c14a35d75f8e9ecfc72b1d7e1191deaa78d4f176be187001aaa4d0d1678878bc3866641dee8a0e9acaf824c918ca889d5f962421700407c86b5361338baba77c1b46521448a9e986086927247fed91cdbebb16a93570b6229e85378988200ad83c14b099ac83eb7283244fb81852c1a4de913b5a21531d2ba379d2b203c7d6a4184a2067c7842fdc80662a600f97efc43a38f733d1996d4511552881536d4ecfb02b0067a89fb8800fae3ec75020f68f5db40790072155ea7b01fb222eb0602e2c26582c53ddabd27702c76dcfd40fca1334e6837aa3a2215f0125a518c7cf3e13366ea053757085db5f40d370a0cce983529459d334d93fce22a82db8c570f318d72488296909468f212e1e33edb6d8bae005eca46120664d47c0d9d558f3e921594b4d3da8ff5ac1620eaddbabf12dde28137845c5de65be9ab30267c694c0d72ef3d1369c5cfa26ad717fb67d2c8f93eef69842438ed725c9729d7d9b87e2538589dae9f921628a8b78cfa6bc7000a21242dea0529df4a92a26c7118e244ce91b7caf16a7b8a0e6a1b9e72bc1ee4588c69457ee1580e199fad9f3cb48817e42ed53434d3af65b440a32385bd063962ac12c637347a07c073d338015b3f20b1cc560a0cf2e6251ed7b876ca8dbe790ad8744008900da7bdc423b263ebe3e64c7ecedcbf655fdcbb2998a98ab8026956b593776822378d1675157cf0025afad36879875a678f44ee9432e7abdb33856bdc770c11dd5b02f353662a4a93d7600ffe64bbe68d06a590709eba0381d1afbbdc926f425ec67f83f8bdcf58cc8040f7f64eff7f1e10d0d95259444417df01a1b38f35a5a1236bb4513878c2833a65f47f7a6d5218e5b88ccfb551002631b9130bad26254a33ddc0aed1d08b1ebb99edbfb1b65aa7c7a7ee7432740609e10c0251f29dbd609542719bb50675b24c2752c343a36e4849e8c695fe0ec34bdd81a497867c755fc117299288646cb53d60195c238c381c1f22e0f462d66b2790b00ce05c8bf3f8224630a46418ad53b1f75e1346c5c0009c573e148d273c3bc0b00806c79d64fc5b956bf5017a68023af1ebc6d7195a84c55e89231f43fda858ec06fb12d7a169a62f8be4abb79ff0fac068eabeff37cc66b115d317994711fcf6d9c5c06912f1b752d09909cade9728d38d1556c678259f602cb402d699e917e4350073503843586ba5e760f8b967540009819dc953a99c392efd3bd82462bc1f19b2a5b7d0e44ddfc718cbe5f911cc8ef764ff38dc98ca6797d2ec6965d83bf24e37f6280e72f4923301fc0e0605f553b667ad58e3ee9787bd56083680bef594a2d01404a8bcf79083fad6c2812a06c67aa53994000f2e7382ae5a95bb170fce01c2076bd3c9a0bbb8a9ac5d3c1666493638c062afe29813ac51755e01ddfae47675cfbfebeeb814cc8cdbf00171ddb0943f42ca8b8ca71e82d6b9dfeee56166480904f7671396baa0dab7bfb4b8b3bb775871b9cab67cb6bb854980b12814be2abbeedc9c47578660f279b9ee714e5361b6c3cbe142bd224242a3b0a7743f31f9639e5433417be0aa529afd8095e3f84666893755bfadae2ad92f9b41853c844a9b875e20da5aeca125b27bda9afde2be72b15e438559c0b84143ab7c840c9245dc986ba8d577aeb8f7013608efadef19418d8ae4a45a0c88d45b16c2ea6dc9152300168b67335aab4cc55b5078da1770b995a39ea17c9dd039bfb8414a8b934c30b5417c833c767070b9128ce5e584968546dfd39e973a12b0e7b9fc71fb28bedfa5b436508c711e4335a0c1a8cf9925ab4ed6b091b14bb046fd1c0fd4e72494d490febd9ef43a7698e80a645774e5b84d4a6f2ef1ad71516d220bf994e9fdb98dfe73fef27100cfcbcb0642dafbe2cb7911dd88101ceb834de04e7947a2d392c735c392e6ed98462cd4cbfd79e11c9dfc54c8d28e22e302f44c6701be52102749aa3ee3768c151c794a8deb1f8ca3b2e2292305816a6fabc8c7c608b873f5581f22628e2e7bc6990d4953d03cea7e5e6ecfe40e5bf06907bd4e4dd3763600c375e5999125dbcaa824d7c908acd00b0988693f78563ba701dee9f51e9f5cb3345abd0b1015110d09b1663a415403cf5d9717f63884cf3c2f63ceddd5527d8b661b9057cdb083d4d99d8b8ed663f25d30402d49cc5561b4775e8e2bed1b380f5e1004872df4a7603e31f45c143b3ba2cd4d77ae67bee6ae80418989c07e657740f19e47f30f51235ec95a7cc2d988778ca5f9da251857e348b4f1dc757b6f07f62428e6416245e1e2222618b547ff7dd91c89c236bc6b883df210ee499e00b062c4b6fe51b00be663b57e0d27d08ef186c25fc5bdef44c4c2012d7432fc45017cc50ba6b9c7dced1083236bfeb7dde9ae8a7887615811f6fc6572c3c6569df4ae162421f5f5565cf2fa2c3c4ac21464a731bfae1713ebb140e013895da6067299282273cd7c827065522dade21ac94bd325be51047c5709db706da7284234dcf6e0c31d76544649cd5c590d36956adcab28c9d7bafb889c9990e94da1f899c44f9361163a052e307056bd04d07d2cf8d94bcb92f69ec23ad44f51d1348bbe3cab1206943ee97c61eb74ed44a12c17b76c6e65726f2767a3c130a38a93026030e69e337ae216ddc6de205b8f583eeb7647ec3778c7b1073b2b6ff511a8aea6de0116aa49277a5c461d1ccd2fbb6f0ec60445936bd0ccf7fb3f2165ba493b3a3de4749028840044350aefa7b0e8123233db269fd45e9b02c76388dbd081d7754778ebdc6d837d1703a724027a5e623e7d3f97cb7a4b5576ce7c6a767a624ecfadd054bcfeb6fc349d5548ba2c9519648d53e2310f4e90581203047ff8c5a5035be61b3564d78d139b5f780fc66db2393f8bd729c3abc0c0eb6a7b70faba734abec3e7e1cbb49fe2dc5011e823da3ee59c14afabb356612fe3e901e9642b787b9914f8a30e743158f91cbc717cc1c42a57da1be0191a5b3fd479cb66747d1f9c3783cf55e544380aeffebb979e4ed707ea6525927d8623283eabfab15b34b664c5a38653c91c51e6065db7ad753756a733663ba807f1e2947a6526c2b90856065d92a0c61230385121ff8a9cf5374f5fec6c00b759d6a5b4ab1374038952f9ccc8a0206f3c6d07d4eca8683627cf7d82bb8265ba9c4ad1750a6a894a4166b74bd051dc646f31cf542b949cc0462c3f90eec8b898bde55e41986c973c91f3216d011e72d2c6db5b98f8cd9e4ed7ab18432e6b9eef1013d0b18326e30c722e4430ab791e56091d11cf454f106e0f08bc1afaab443459dc110a0c630f9dbb6021032a59c1236d08e491e260f03e970ff90039159677ed105516368f49409492bcae829c754568e305a8e1a587bf050b7f78db685315b018fc4bfb20614791f53c6c83911b6c94b9381237630f78e75b4fdafc4767bd0eaef2d679603011a375349c0a9347666fa31a4b55ac30b28d5a62f6b60e20d2e57d3c0ba3f3ac703bed0ee6b6e96f775d09e66378e52cf617823368b06f71f1bb89dbdcebafd0043f9a5d0b08690952dd8c8ddb92c3af17f1070fb404cdf9d1529668b8d739473c1fd1c15214371170e934218b6e09a2c66fcf225a4c4b0235b03cc950fadd6b7b0f1b37841c5ef9fce57bff8a50185b9b9450ef9a5ec4f58e443218ba6a2265337cd8e13eff53c0c168d206ef8cd6ac8e23ae14d7d1caafa70b24f39fcc8d5fc919af0e2684e18d3208e64d136b37245ab065c54ab25913519202bc0225e200287d433284a9f4705473d495032380e275fa12f779bb378e52d01abd85637d00eb7b18bcd2f7bc8ce00e46391003c7087d86686bdad1f14a158401d2ea4478aee14620c0490096467f4666b2b3c02958db1b17091e5b904396ddf3524fab506aec9a1dad1bc8307da4d38e99af680bc607dee6a549b43ba9093972461e1ad25e15fff842e573f949c104c6984edbd45c7508dc5a50341cb92c229e1b881121e43a3713f1c753e1f7e413fe7e8d91738ceda5133f0f20765acbea4d36ee2bcc898c8b1b7b5e046616c91b56d9950c64334346a522cf2a37b9dc278750c65033291b505b407fdaca13710d57206c7f2ac18c43bee013ba10a38101fd8a6656eb499f8ed52c45555644fd65208871eb728fd48c60fdb8dbf11e275be8728bc9900ed77995a841919a3a512281114d455c5b81fa2ecfe40ac281df5c4ecbd5a828daf47b2cca04541c7b68d0419cce9931e478a293ea7450d3e4352e99e136ed9af5392c6e53c888ad7055d9308a169b171eb8636bf716550522b8e80ff7eacc4f924738a083983825cda8de193e8856eae61adf1ed1d30d3fa74802c86df5ab48a243c0434a01a3e0b3e24a34756bead8776800073f9558cebde028efe00bbfea11ac6d87656872461bb366f34d5f545432d1390fa9e3c29bb17607fcd6c7a73d11c69e99d37a23331f0d239228b75c78397403fdd0937b58c1d6e3a2d4399e8c1cfc174d01bbbd3cb683b8f79e7f3578c831080645124750d17a9672c564ec43041b1620bc907a22be289e85225d2fd9a3bf6109cc4d506c593dda9b95ec7156ff33c65a787494cb95251751f19c491a6b8d68cee57d3f6e67ab05ba21474ce6f485cbfad4058304e20de7420e607115957de8ebd4bd9461524506231d54a0c592d3acc5411f6d785e97fbe59d10bcdc37937a773da48ce7e216ad1d3d7aa6f6c29f61cc4bf3c18980a2237c6cba382c58a749ba5a64913f6734e5aefb6998f0585e37902f099dbd7fca5e8de9ee61135211d72f44fc4898333f17bd624d21954c1c0d72e82d5626954e83dfcf8a570f34048e035249646fa702bcb34634c36621b9e0d92ffc2dc77afbca65cb547a959406412dbf952ad13cdf89430fb368c52922488fe3be53a091b7ab001463a3e0317cc197ef59ab548865e8bc51bf4ac830b38f45c103926a2c5515e2f2bf537bbdc1230521d6e6e04e6204fe59ac45007e6e06e5635fd989b1d857eb90bd376312a339299eda41395a1290f375ed9524fe9e2c0b8590508c4cc3023a82f277b0146c1d2a3ca6fb128d54f0351d59c0f3663096b721989f8a083bb0df05738c49fe631b53745c5568b96d4f1deadea0de97303fb59628866bcd2c9e60655630b3f585ab9ac65bcae94a44915ab11d5cda8295a1445002c704ba25afb62405c979a6ae97d50723a2f411e8d9cc083dcb5eca03836940dc02225ccd6b15eeb45c780355efd0f9b7e3fda56ad9e8ed04a9c174c818d82f218a1f5fb482acee97a9846a2e8cdcea7b7e55e740e820a25b7a211b7b117358d9568953bb2367e84991bf19d1f04fd7c644f8de3455d88a8d6e9695a6a6e51ac6662ee91a057cae4b5d8b3a8912e5aca3303222c881d0df37b6e1b84ef4bccd39a4b8ca930b7dfaf4870234b795c6252826ac524cf7ab04b0cba07306aa4e5a2258748311e3d47cab1818144e9172d040f43972fef4aa570478762d69f0444677dc45c664525b0af05058d08e36b5ac661e3c045334f98ac024d5e188c00a1618c82522270c3ec3ad5e6a3b90289f18e909cfbdfc9f4487999ed2bab71674cee9aa3e6b1c67958d6a6c861592c45d48dc756d23bfd859496cfbff6a4439bb9b78a211a5d7016c930d27955a74cf7687bc9e1a645c47d65d0e5b25d5b370438277066de8d5c5cc0073f804e0b93208b41e92cb4be87ca31ded4737d7fe71bf082ab32ef92e63d02fee903b6dff893fd0abcf91a5bf704ecf10da0fa3d54dc65e45bb5a7163f5a9a9a4b96778e09cf73f9f61a521d27764bdd82d7b14b944711c01b5c980b6c02bc1c41906b44a3a058f303b0101813e1cec7ccbf559b6f6b353682a343b86041c9c497ac784f673d23e46120b77be9aeff58075bae8c192e39f4a3ad07e0b4ad6234b43e3cfa8c193bf924cc8dd08b881359178273106c078d2f7c07dfe1ac473ca6c232fe29b5460554123246a601111c62c6f4a99bf8b87f38a80f56a5ba91b52656b905b1e160835c63b8e7c1c6d4d3392e832d7a03746983d5e7d0f42aee4837a9f6f17093aeae92a9d5d20c119ba101501e9d9adc4a7ffaea07880e14518c21807ee1617ac0ef46fdf7f183a34d23863fac7ed4e72b1553397cb2570a3d0fb81fa37c3a9dab30167e965426ddd5e286935c771f070c06e85a4da70f7dcf5e00f1d821ffdbb4c35f4b13cc47d39f1a4f7d7d1532acf761dcc1ea2bc24f6b644a3a94ef04305a4e450811c1e79493d9439868f265dc3fde412372701f603917c93d491d9c247e1f4ee446af7e45ca573e31e5c77893802a324d2f6dc66cb11d49d88985234f581bc64365998fa8b180143b2ec7701d55061d4b81dea803faa4dc778df98c7d783ea4f68c3f5ba4f9f6e5f06f34585dfb6094fb302f6bb215d7d58c48b7d96485b1ec9dfd7ad0ca6a49b5137491abefea6a85e115d1d8294009e4841455cc961e147af6580e88fe51bed56f9fb7efd206d21e116da9e7ec5a28a735d4f241ace07bc8adef668f5572b2b51da9876e22d052a6428f4b147476803e3e6452121ec56edfb9495ea1d18ef0dbe49c8e40cded42e64cee9c86bd0909bc23ae1d0c1c66b3f465a5b51636ec07ac73e564c5345af0f1bad68116438357e74bf6f8604d25474595b05307ebc109c3a33857c1f4fbbbeac1be6a522fedc7b5be53e5ff0372cfc771b90cf4c032672c914c26015aa09c1db552a78160fa88a6bd10c66008529774c160df55fbcab0cde5600c61a1509c93b2c8fc89cd5419fd57a4adafc69f15b84fe050118dcb175d2416df39ffa77dc5bc1b2de0704bb396a5916852be4f941a6f4e80bf97f135ba2db332e343c04d611edb946f55bcbc2056016bcd98145520e28024bcfa830b99f9427b4a1c9f0dc6db9d6ef510f8ccb5fbaada49ab65e2d7140c3450038f23647137d9e4f9db471d0a8b7b36828a9ab96f6fb969ba061a492bdfbc61519c6778599f13f84fdd5bc65ac1858aaab7ca335c3a394a76e226dba0063cf9a316d0bfb7a01d7f37290d2b48756d641178d9fb0d8b5751bd76e29030498c27f382b751a382f0d2b9191b41acc475a6023f649fa439fce42404a4dbb9783461f446cfb3c6f3fd16f77a532851b5f0c5311c5fbe11828c26aa5af6d6f48cd526e50fc52f98d32b85c06f7d8c5e8a61be669e96d1b462ccd6548ed3d3fe4d044464c8875e5974672a801dcedbaf0309123be214328040600371b64d1d303b3887089ddd27361a0b87d0c33832edb4a900da3589c2c4f19226df9a8486cea671c35823256a4239885d3799519afac0b77cf7b10768971d7345cb443d78930fa29fa48408d51d4c9e88d05cc82411eba1549fcb4de220829180a3e02ff4cfa5b9c80630cec8548d4fd8e36d0100fbd51334a2c1310c0ee29ee11c103fe3ae462c0e68ab7c089da10fe1c645df0c124d4d84bfd99c33c2b5c89036936f78261262b7316cc852289dd0025d4d06310b79012120f4fb35431531d8d0781ff5ce980148789a4f051f84fc6f574fb9e70a26c3d80f5d893fe7b94b2a233af43cbb25680e7bcfe50a1c4169b3c3c97f1ed8da12d82b218f8494ab8dcdd56b4967d9b94c842c66f6225e5d58d711708039adbbd4ee84310ea3e9901e86c23fcae6ae3a62b9d18235c96e27ab4258ed4bb75c75407c5e05ed6c6730a4cfd7d65507a23d72ac3abf28d01b4e01327c1ba31041c7eb7a80d06cf34a07a33a00d4dec8bd2883fc4c8682c9dc46cdf7ce8f793a19c26995bd3fde15a7d50322e4933c03814e3c0a77ab7e207f5ce00ad8ec62803c4096a606c4f669827213f3168ea1402a4f497702bb06dee8cfe0f50c58119e32b6c9dbfa96e93016bf54b9b3c4114c66c37dc8feeadbebfbad93a15dd004d5a4791e1b57690899194d977fc28a03a1bdc2837f23ee30becdc75204818e441958ff38c08e57e791d81945006c6027d256556303eafd37d9496b1d6c91959cbb5408a649bb13d5ed2088bf0b93d60f9b17ff6eb03530b6e4fa11e98fb34b424b72d6b2db848a41b3319885a23e903e0cff32b199c6bde187c11c409ac9319f64591d961cdf2c5a1ac93347c101f4d1e5f52b81561e55cbfff65cbc194ef46e3991b4e18e6e5381617ee7332994723131f6cb7c0a9daa1253db6503629e30e8ec7bb853eb860efaa9ccb465b887fb601f9535b4fd9bab5a8d0a9f678884714b66de33d929f32974b7a3657fe15585f7692cc13075221e6b0ce1c476e4ad38803bb595fdc038b22c75d32bfa8245275583f7784529ad8d8d81fe52eb7c33ae4553fc350bec24b99bb0a48b2f9939cb9e4fa7490c25cd67a150c89869e8a91729cd04c5266930ade45c631342e1c5b054b897a3d874021b6bcdd896071b2136c198230af6076aaa63e6b3309a90f11a43826509f1ff879230d24f038cc96f50d68bb99dc839a13825ad6fd005cb91f14643d93dbaa822b81021a2c7e0e1b66ae18a3f1e17bfce66a9c4ec86e9f3b964ed1be96165573f1c051b2a4e169866c282304f91034d35157dca135d72b8346bae2c6a0666ded1fec187ed78580fb1b19acf9e067b5f47ffcf8901ff1cbdaed3ce90ab632bb85dc292d73ce7b4f2d9f9649b87d8dfab678cc114965df69406e0982e85f58baa94edc3498026c7b7e7bc3fbbf048ae30c12162079a1c2670a507f356e48a9b06f327865bc520d5a377074b14738425a2ec4b4956cb177b3adf48f8773ff626ec45cd476562110fc2852cb817bac56f1062458f999eca748bb778339e5c6adf5209f73e7fd78e8405f0af1c44b38305525dc03d53938e55a4416c84b16646db94b9549ece92954d9712fa5a0d6d539586f8a9ecda9a71b9c4692966b57dcb2c5912a12665510cf30019a7a3fc39a5d883fc0d562dbb9260221c24630839d2b9031b8f8f33b0b4092ebdf4fd9f4b7c262d828029010e809fce63d22b29a44e2866209dacc5ca8e05440403c1f909ddf8e60b51d84ae53061c2c1217dc54b477385f2f95dc8a7defd38460b477a28dfbe037a3d0bcba8fe1fc4b90685d805f9a0bdf7b6acfad858704e5af68fc8cd4c8047b694ba44499f4096b99e69db944b61db83aab13b4531a190c5ac03cc9e3c0b62d14f47a4415637665d101bca5f4debc73851645e50c211a0fd25cd826867925457b101805c8d3c7a98d88c65e1e8ead29f525959a8d31fa5b727200b5911cc66c64e659a77e084874b421d490f24e8dcc14a60dd2d2d0b598631ba79f0e6b5474754327086d6dfa62845e060ca8022aa41b713699492df3098b450f2027c6795c102c7738fd6f4d986b3e73c724f0e526f864bdd3919ac00ba3cb4f0e27f2d54ba8e451e905038018b9ebee7ebde4c32284ad4e7af53491ad98de8fc1640c50e35ba59ec72f6618293fcb8a4af075f880589201d89f2fa9719c393077a3ea5b8feeebdd593ea57a8a5cf8b226c5baab3a84405628f040059e080f13b8435e0e815a1c11fab216b852d1e2b7bf080ea0985fdcb03bdde003ab912c46dbe72bac6326c9d5fa6813dfd4b26402ee128e56c9ad64e9be99204a8334f4e1e1ca8debdee293dfe14cb6295a8c7524dfd57d447aa59f76755e2169e6078249417e8ef1c9e375b4a0c4001bcf25ffd333ee7ebc8517a5254327238289da40bbd3e5c8d4d5b66b0b422f7525b493636dcc7e04df5c806023468c132c4357f374ff8d9587d758698f7e94dacf7bbd0ff9baf5f17dffda684cb04e03f02d7179ba3fe5ed479b5a9d11ef15d26dd29951afd28503826f0c8341b170258568fdd1ae2023d4f6ebdddd071865de7cf9b425182046ab4df5ccd428f8151971ed093f8c751afd735baa4ee655873e38fb75aa6f6013ee056a2d5618a72f43de10af75a7612ffdfe54a14613f035f68b3b992e8f953d7adcab5347ca5838d8bc2adc8d685ee8c0a907f1c578689452df2ca3c5839fe04d5e5f1ca94c16810e29870443a5634c6a4c6953d72acded0a3d92c276eee84650c158bdbc7a4907c162afe6d84c4fe3fa00c0717634087ad6e00d9ed5437f90dda1511c6ae2b21db50f09b76c9b84eca056783e160d36d28663e0d9376dbd06b6592216346f79e64d0ad8bf3c554565aa93e597f0fe5dff547caa75036e8540ae5613ee249e40596b922ca323dcb6135a584b8c7ac5f0e5e05adc3bf3cd55495565472d7345f7650cfa5063d00a67c8b48446905659a7c351e9c5a777481995cb828859573e36d32b05d3e531d2238b5cebb21c459e50ee0bb57f4753d9e52d91229835c068227bbd230772495c6d59d2e033833c1d592ba650ca2846d120b73a3f8a0abe69a7e2f1ff55eab3c9ab9bac03c9675c5b9ba9bd5dbd10ab28d975261f1d9a2f6f2f36b45ac4bc9d6e238b9fb03dd446d70f8bab6c919a139cec5d7079647e9f59216e6e297ff82c6529a86fec006430649864fd72202494bdc56df6aa7cc9b60021dfe8df96ab48724ac6cbab384ea4de5f4f63ec955413685fba52e314fda2da367afbb8a65ed10caffdd9ebe8c4e483ae4a73677046b6039d69c88491b54d06b6625387b68da5ac88373fb89e248cc79d2121913cf1570ed8f60eb1725e1171b90d6e9ab6b0fd4756a7c36cc6bf4295682c5a7849570abd2a263ff341d97101aee0bbffd89675b98a9dfa695ba7f089b6d7f7de017fc27361e27f62f17bd6f916120ff43ca30dfdd5c658fc819af171c34a0cf0333e91f5e58d50710efc4b3cdbe42cb74e2874756f3fc5778eff1c81045e70a0f461e596e61cba8cadb159e243d9221dcee10b203aef0edf6c89e43ea151efe1e194db15de1f92935bb24885de101e723bfb5ee54f2349bcfd244b5c4af6e79929118e38a5e736d636c6f56a7ebb9c2bb09484676822b3cd8710e5778ab7b4a85078bbed8e358f83033f61045e8901d9e4520a32481746617d64d8b6a58f0cb708d9a3d1ea0472b7672c23a529c9e4d83b4e3a497744521cf09d5c81fe0b455588c616a559028622c0f8ca327cdde243dc49903b53804a92d9e276122b05bdaa07c442d958a7de83c708673084a3ea1cca2c36b6b25a6799cc83f97efe41897f0bb7decc658eb7711d8e08736dc2c963cbf0263da29b9e9eee3bf36220a6fc3239d1c2c7522ce594cc44272c65ac23ac0656044fabd578f712652092e06e75d1b7ddc4654f12841d0c298fc0513663b4681986be4ba28ddae61244bdb0bc930112b09616238081a066605d100737198c4f8cfe86b0311d3322c49c2f15b346dcbc6b734d02f34d3532a55861c3a5378c8281e620a0056518c319ca38057d87e77f0327da76a28f1ceca18cc03cb7b42df347c1b914883b65fe231e1242bb3033aac1b1910891d876a9ca33b04aec6d941265c58b120409536034e074a2868e57aea388d2546d24fabd177b5089c35cda981f7ab8850eda4767bd504b172fdfabfe05cba2ad2327fbd39dfce544bea1965220ebc530e346323586ae95a3b29f82be1dbafeabcf4d91ac1334ba56b92b3d68b525c808974421df54db3f6094901fd81ad7c9aa202f0e99b915964b01a4665f5c58cc5be34d7415ede64d08aae8c8aa05910ffa5b833ed8fa1bdd14f91b57151c7d0ade8d085c4e89a2a7aadfea33a99e915fb327e76c0dad19ad3eb1531da512f99060299df455ace45a8da1ac2cb1dbc688773f30a31be588b10bb043d5cec2d5981b2290eb6d4b10707c59c7ac8f2fa275535d2488bb4eaac3b6e72ef6b82dd7e0b2f89f04ba1ec06a180a5083a7f8490f19a1d8d36e13011b1f1aa14032fee0e2b1db905e97f0883b7c6745dc42b2f139267f86266007b2e87ec634374e4f228615def41b550c88348718a6106f744e279242fc1d2242b871949d31a43e973092e6db5a9401bc3b618aa3d5bf786bf580e1eb5ccc974e1794a7c1ba738dbaa241a141111f446a6b705f27deb03666d9a2f24137c7620632facdb10ad064c7f9845c7fc0f7b90e368eee5279249d860a53850b24eaa88f13ac5c37bd5835ed69e98cf0ac58117597e8172bac8ec73eb553e171a8a4c6b36abd68f3ec638daf22bb8326212294eb4042d9222526e26a266a3b6ab36658bc5aaff0fd9c7055ffdbfc4d1870e94b52ee193a9c6b767acb14fe1fd0e8f92bdc63241ae9a5f8434e43fa42229990fcfe5dea518c1c0b7c6b50fe21afa901e0d720d85151b9a990c2db5511025099e20c6dc6e14b041a64859fdce5ba0f5bb3d22321f80e6c13a72bc685584ef40392d33f407cfe736940d7700bba9d2cd7f48773734196c155d0b0ba0748166c944e8a548c9181b5917e4c1b445154adfd71c2709d3b5341506820bf118be6f58614d1bcdf738c531c218342fb4034934b41988e85d059f534ac4b2e2f47d2569f5fcc53606906a6327f227a6c6f942fecc8e4c164b37e2263eff0e31f4cc2b92ed172cb778d10d532826be4351eac6e29e3894c228aa9476e40442dcfce1ecd02c8ecfe92413991890b98456a8ffe303159c5af16f45ccf43ad4063c6f65478c05717342a83f79b232735231a2f992108b87f608a95585670c14ab1832d624dc9040b1d2300b721a786c7b68bb83fe8c90b7dc45ec4171385bfd54976543ecd6aa2a281a6d41acdd5a33592414125f7a046ad101eb25c075d0092c20b1d0971209bfd4307d0479fd959b053d5d264447028570be9288fc8705260f1e3470d36aa2d930a4b284fb8f794d0d54408cce280e7c7f796b08e8b779a36145b286b4600a959b3ff66ffc6075f722e1943b1da2f107785a0fdecc31636430b29929b98b34b8a10d95a843f8620c274182fa4f6c380ef76791ce6e1b677baf63e9f67ca657d257a1655f72b3a33a06d4adc61e2be86d1e3b35e977ef9953358f02ee6c64350b3ed9ed3bde7859f03f1e264ffe3a4c30c41c996c85e0950820b6c074c92e19abdb65790eaa870880d86e0cd9e1c0f8114e63ca854601208820e4347971cd1b9abfa16d1808336f745916fdd8e599c7e1178964e2ca2032692a0c8b2589268f3e942c127e16444d9947a319a1cb7ca9b79a2c61f301d10b26858463f9019f84901392b30525f4ecc7009e0588acf39b08e304a1108f2aef417781778ada455e5026fc6c216b3d12195ad2544102788433b353fe62e8d607b5ec9452dc2be78ef1732bd4c9d8074a21aa2e0f211607b896045baf2cb8c6441d0fee393b19ae138d54a5ea909a2e9785afe08f7167a9720b8fe806cc7813baab10e00f479649ea01834cefae7ab72127e2bc6c6fba6513db2e5610b5149c836d0623027a17036669dc0b9da9a069bc0a1ec0431ec0d1aea5b4a02fedd0e2d51ab91b2c8ee5014b811abad4a27e85409a0adb23f2ab2f4c121c38a3431c70cf6c8b2ad2bc70be8ccccb523a54a0a635b9e0090237a9a12d992e1890fa3fa7b1b08c02eb6336d93027310fce21c3ca6c0a617d7ade756634800adcf330741f5b312dab1c59c90702362e533afeda3c0ce6dda3cc06e06c39181c5cba8597b9369982221f7184f68de02e43ac9d66fce3788def78fab93d774d5ea7f41d794a3bc9559adc76b9408b64c09a45ae4187a3ca1144e1240ba1ef4ee0e52560d02c037b641b1601af0eaa19bd505913da233dd165eda35756e2ca30f347c6608501cbbb33683cbeb390fc69b82f8df4ceaf16e90d0c72b1b26419f56f4aa0d94dbb0198a90e3db52894ba26a8b0fcddcd8b027f48a15c4ed6d45f1c9af0bce1ceb18a1596c2ed3dcacdd152088bfff3f496b036582ea14bee5c8d376189c80aa727a118d1d3d29053bc33bcd67f0ad85fd32c4e14e185a8316a56b90c5685692beff740deccb210b0603f3980d36d07c5f4b043e4b3b221351deadb604b2a2bda377936684e335eb3e0eb9b7064a10d9ec5bf6c61c0663f5243eb095e1f8f5490a87abdb8e1afc7a8495550eef7c8b83c9820723f6c787fa87d5881347d5e579412b78f9a435612a1ca32b1057979914576e5bf5c409ef0990c049c00b7c1f2263b9d8e975e0e65e59c040aaefae1b0157e1c60f481314045527928d6443aae68147e29b84bbbeda0d61779aa128ba7a19db1b62b00b8fec2bd9044d748b68bcc2470b4010232b77238639210a0734a2ff2334cd7d30444d9a711d7b9a508254dd3480d3c6450297aed9f0ca04c330b3bba1ea73034e0483b117ce12c86ed2cb319881351c40ba562e473383f633f2c68ee4e5e6579fda669d247985b4a5343c6a9727a704ca6b44e161f696881f839860987eeb4f37209b8543758efbbc7bb6403157dd5a9aee10bac36f4d101f44b024f58ec099b482aceb0e416fbb0ef6cf8dd71fb5b5cd9c8dc7a5a583649ae1da76624901dd5f25cc6e5419b762cae29e8beb29be0e7d6e3c96a9e5623f7bc503b80cc2c2d05b2230b956975e111c8dc6008d9cb77a91181bcb744cfc6511e86b399190f31d7582b57573a70cc1c6e37bac520254b75c49baa567f93e8a326de9fb7e4b126413e75816319156ac68804b20d16ad1ed561135072b892e1c75b25c7742d8513413dcb937c2d76c727ebf5ace2799868bd93f14ad7a2e8f9cb35223bf663989dd4645a9b3e0febddc70b7b696203476b83fc47d241ba31d6a9e95eb914e503337d8aa514d545d817a2acf62cb1854a8cca5890ba2bfe9c0515ecf248505aaa0f2700b56aad3aeac248f5e3fa9702db6292831d9d6c584afb12323abab4c69d375d4cf74bc847df44fa87c2ff64129dad1e9aa2ad2d49a779479ad7d4978a6e5122f43af55bc90e3770306a22be9693a631c806e6ed3768d4b929794563340c33f5925e5ec11c1ff23476b6aab404117a93856cd59d5c7344e47ce1d6803adb3dea652be4c6be68f3993753752386debe2d2816b1f05d817f32cf5bf377595440d9aa3343e8e530e965d2ff0f2074749fabe3ab537193bc63a8e0a032eea415b8eaad238baf774757df2908655d403c11b2614c592f89beecb0a868a4ad56c2547d77f1023a0f3487c9a7e5419d883159ef97034cc967085fa02cccb7a80852e9dd103e0e3473ff0a76e3d814630839f6dabf22a880c87ccde9c84d4188da1a5ea70c92dcbf3ea7af3f0fbc7824b35680094547ecb3f39537021e14853625fb1a6c0c723a90d0614205a01511ceca54170cbbaded737d58c3f922cd3a43bec1e517709ac8ed0fe21b49c65c4b6795b73a6f53cfa779e2371a7fb886085b1cda7545dbbab4f4f36af4a17f385268c71a6b852df421ac6c80cbb40f6f018dabdba04db3dd370a67ca5f8d586b30033e5c5d5e15f78d9c34bef15af787857ae507a6ea85c85e42b3b68b86881abcc116047263c4aff05221039340b7f51ea7ed0c30ad0178ddf7abfbd3f7431416177bd0bcac3f0443aff104465def7655d621c69b76e57ed4ea32f6ee1140fe227a5ddce9e98384884685489c571b4408ea0a955c9dc6e39f5a79057275b243ecf9adeb86a9070b159be8e64a6a432d11166db28c954dae82de6f14d4a9e03b5c2b08f19d7a82e3286256f4a8d4b54f22478308ce926bcfa7ece41848b4143e923dc705cf103970e414b3965b41d66a8e418a3b6fa32a99f3f97d7a46e0701de1e49cb29bef33f50d188031d902ce931b733d590139d5e1ad89af6f9799b7e2ae63d31f8725120b080608ec1b0aa9cfadf458601d034664e6129482b000ddf70eb03b101afdaf4ee4ff4c0f18d57189ba476d81ba1f213bdf9dc8cd9c954d20e12db2ae2aad590721c8c160d673f634b37394185aa3fdb914d08a2239ae6366d7459d9d477e675c8dc6cb12b1794e0fff8d8cfec7c3180852ea08c179a98d7e69ff30abcd097f5cd537746d156cbb13ca385757c67b200892010b854800075de8fd886834ee78dda7a4df5d3353037a99569023199b05787a3f118d6683344ea0b84fbcd640c26b757ac208b8b2e8dd59fa8d982bfca4f7610dc04f47fcffcb7a9cf898336cef88e5102483b90bc146a53d490a9107d4d30bf534e501b8a0112cda8651dc06b47a0b015a67342556434fd54cc096ff74e51a2145f765a4e539cac3cc1ddebbc35434e1d6744dbfd4c8b0b71b38c2c42201af2a62e087254a73c60ac6dce04cd78df9ce8677d3df1f7ade24dc97f4bad24813f2db760c4f39253143d7c1ade6aa7fbf8b3843eacb3e1f9f76d31bc611bea4ac0aeed9b015b8262d42c1b192304ddd1283733481d51e0009b91d330f85df19445cdfbfc82c8ab83406751ad959d4aae43ed1acffcfb1190940a3baee0cbb1f96c63cb7ad6183965c0df590e12fe11fdccd732ff9c5996396fc07e761f1b2adf4e241668702b2d7d4dae5859262b970dd73dcad9f684b053872f7af781a1279c14f14e854014c2ef435ee5465b4ddc30b009c6825ea43efca4cdc698134c39d921e6b61166a75a91fde01776a9e1ea9ec2f60f2f24bc99b437ee715b95b7c49d40a91fd2de7a5cbf5dd5580c8269f4d28f80985adcae14ce66471b995d67e018f645b3e2324f15e9e9e243b48e8d96e01fc566bfe8b3bc10588c13f092d475b8944ec0211fc019e5b2c813f22a09f88aafb243d5b79acf73e920ec1dcb716e4c1e64b3fd4632c5825f414e15aa995ce8ec49cef02ebd230c2469121684f671e83ce5170a6628444ba4eeb356bebd209d9c286e2530f8adf2513d336f78ee318e926de3e01a03c6963b7f663580615dc5d7a938f12107bd798e390ee41af7ecf0341e0eb40f7fb99e259426f373ec8e1fef2966f2c2f8e4035e6219768a2009e3f5700df8a6efc7f807635825f083f8b3a2b911a08669dd5902f0dd883e56c6f2661cc3c418d76bb728c7cd451986b1af95e1e1cad3efed072b464d70d27bedb7e7252e83b90e27ab8eeca718c4974e469dca40a45169a170d8219ab303ec7b2d48c960e8c8382909d202cb2de036825e64758f4308aefe5e82f10f50a4f1d0f87899c67fe2a1a0b77e76c8cc195ba5b929a92e534de49064e7c452848de885f39085acc344a3061b5827abeb9969f65bee5a46eb73bac2df4c2614afb025e58120030f9bd39cb686dfffbad8e6f3590590f9bc5604e9cf43601c3c7290279c1f42231360c742ad599585a00dbe7afa920838f86e88b21f219631c2ab164b75759258eb3c74d1e5db7b648e86259064d68c8b51ad60700cadff8055912d7cd3d253f32d7005ff61ecbec5050bc8839962e27ac040597882328f2721041a12f629ef83687bc1cfe4c8266d9eeb1516c0d4a521b6ef853420e69db4855687880923abcaa03318b91e533c4d08d183e9922d020c0e1eb28e562205979815aada5c94c70d214f46ef2111c7793a1ca489a328e75114ee03f5089c8c112870852656b797df0d7020d69a41fad6dde21ac9228b001d8d0186930ba5c0c5e53cf8f99842e17c58b069bf4d0a7e706e18e87396675b9c8d64ca87c0ed4f5e86dc580121cd3ecc67c1480a971cf4156005e481ce5e29e0f78d19886c74548069c6479209a8618b244b8d82671407619e0acb97c39335bfe63061096d1ad2060c0ec52ab90d395e172e6b8b830f0829f71b96863776f55e6a168cf3071fb518a72b4c3ae1a2ba27231b00c6d9731b0f5ce3e24c1dccae52290debdd36c97cb4547c93548f63931fd8f0a567eaf825cf77b460a854a73f931926c3510f293f49dc13766ce80ae0de83b43fc4ac45afe5f7485c28f173b09356aaed54e6cc9f300007ec8cf9b112aa5de8cb2e664925a6ffeb2d7e074ff00a7e3ea90cc0754706d5f89bcce078bea3f232562dc0bc18ba6161e67c400ef632c96f1bd06e6108082bd47026a3c46cae9239d300b908f16039eb69b399d88c12f715a47b06c2ac2a22a014d88b3e0dce9e100ca5e71f440668d0cdb0db61fc81dfa5d4a6e914c600d2041023bdc2490549cc58af9ca09c2fd99ed4dada81c5c1145f0b06a25cf39d209dd1006e430ae26a1290b6ad14a4c94c3e6eae4bac0c92550a25b23133023ae1dc5eb3b96a4e202dabd9a18c4316fd15a2c47fb972d05e8743707a6d86dd349a58057aa9922c7e0aa6d9559bfa8f7c2bf5d4df1ef5216ed1764a57fb35641a7b685637c9f718cefd0879d4faec520f8286a3c2da5e113cbc63ab9d61835dbac49362b7c7d900a4b6b0cdc6b65967ca0fabd08598d9b2c245a8f38fb583efc81fee4aef491a1452fa154f972a98b8cfd84bc11c11f841d3cbd3019b247b07e6c80b20dcbc72b27c97759749157f69985b82cc32d98616f1e7d5dc962690bc59a812e8f6e6beca3bd83bb56d8e234e5e11638511055c58e0e2ca937e4ae5d009404ec1c26ba34c89b69e9741b792bf631cab9957b5cbce093a06b5112a794db577c54ec5325881e6316dfe19ce706db4923f430ff34720ad6c2fd8fb891206cb4a3a3df5688ebd250138fcfab2dfdeb15a518de2de7161e2752c91032b1c32fe1c86787d1d1e380bcdedbaf864d7e079a77fbf80ce36e41c4af7ac5aa804198f2687a9409eba262c2ef7e77ee4752acfc96b0b045545f82b97833cce4cc5c43eef4f9acb8cb9f83f217865efe4b3e26fa202595b3a1e4e6da904905539295aa09a11b50ffed4e1ac1e6a90a3605f589ad97ad62cbe3434d372edfc7feeb2ef84fb285ba5db5eb2f65d40eddb4e646824b157194777760f28a6e83f615d52b0693ff26564689bd2ad1480bc1e79a2b01cc3ef0125e646f8648ac86cfe3584653fd818fb017f8a5f72bfc1519220d62c7fac462d624210ac4ab617c31c243c1dce0f225268f1d16f11bd45d7effcbe83d8927ff6a396436c8df3dcbfd36e2776c866aea3ce877b1e3a738ba8c85435152e9f9edc5ed8186d548b26fc9c040e14bec2abdfdb12e507ab6b0dfd046f45ad0ef29295ff8f8563156606fa01f74df5bf034427dd6e039cc180c30b503bd170d46137b0e3a0cdfcc1d87ce1045e4f61e234531819d8309ddf01a3a6325cd7f620d9f53d9c0cde89476a32b8167cc1bca39bbea4e17d9f33f9a96baa978f0403ba764c8959fb264412464a5dbbbf405ccb8aef1b434fc0bc265fe377b90f7d991884a96cc3a11efed66ba3c27c58b70736e57869b7b384133c2e5ed6f9ee5b0f1c4de7e57eceb163041ac6f8ba8fffd416e9a7d140f3730c5a6bf2df6eac3ad680c6663caad909d1f6429cd84ce7e41f6e687d003ee7330641dc054a88c10330a1ed8b5a445bd80984f3e1fb0dd232eba6514c1f0b353c734b45f14d3411f5ddcd983954127e77a10282e5000b4208feb425234541c750d5799c42dd2c5ac5c2f9407d2e3594117c3af1976db0cd47d509f3274b2707bca022f9868110e97d82920ea51231f8e2d30caaad37a3950f7ea27e3e111bc00c9fa541804734a08b969eb0aa8e046f700613e0b11903b5c63e71dff129d5e6375a33178430638d349c732145c6077843b23b8eb7ecc900769f73d4a67f7444b6f4eb935e7330f9c064830a605d198a0bfa364a6683233125c6cb37ec06b7758adbe745a08f9542a0c2e9a87e7d393030cc165d3f7a08d8230a1d3b120d849597c8bf2fcfbbf9ee35929141f2c519cb5107b98047c40b7b2f9e81c922f4bd5c8d52b2761fbd06f99380c5a76dc679c2c098f6f990ddbcf0af2fd6dd0391155333a539cfbde4733a5f4cf30a6e924e094944035df0b1440691074187a27ba59d49c9bba952bfb9e22e61c2bd357b9181928412d9a8521a697d33ca9343e582d06733e80e45489036603227fb0d696ee7c7e74580be71cc1a19769fc0711560ed10aac7c95fb6e0d72a88fdf79364c67a9cc99105a71ca8ac0cc4333838d4e5d66bb63c21890a3a541f922e3397a762c396e266473c7851a1079a5fba18e8af58bc72119f552f599e9be3d4ddab0763e033fb59330099db1ec78878628c0f46c12030a120adc1e3646cc744e0321e97505e72d4d515a33b33d4d6250b56a1954fcba935e1d5913d61b02d17eb69de7d0d87e6ca4dcdc5fdf114c301cc3bc571f7eeed67abc7c43172c254481d5b150e3bf7493f7cfa782c29bee225ded1dddcb28455a83ba5aad0a07a7adabb198345b77da10052b03611a2ce118ee3f8a67cc8422b3d1ba99ff20ce51044bca134260d83c0e98813569b0eff991140b1cfcf79a49d9a1b90b20b544bbff835ab61e45300c403eaeca1fc9616041bd64641153a40171e64c0395ef2356972fa36adb2c2444cb5fc8dd721b82443b138237951df0519a17213eee13aae811498bd903808814f49a85cabc8215c4545ec84215f6f53fcb16eaf705644dcf1bc5e55f7363f30258f9e96c8ccfa0f87c0e372354b4f29acf603fada9c919c6cd3a41fa37a51b6f605aa58d2649058368097d6201095759198efe7ee29b6ce303b996e31f6949f111f561ff4840afce93607c8d1f16c31d0544546980d4632d1dd79c90004f86eb23fb47e51216e46bdfe82ab29b2029b8ed5d8920b92e92946bfbf52e3b927216a15d369367b2fc3e838a713704d428a7cac8fe4d371565b965f92772a71736023c14b2ad452863cb544fda44c90d493a15a9d4c062b588d4967d3746113e1719ae2a25301a870eb8c5a998b5bd557e9a291279d39da0c596f62b0fbb50d14a1a9e9658c064012ac47976b1ca8f6abb0c257147a27cb667ebbc0ae14650b696ad5972321cb80d4e4ca66344ec924517f8317cb801eaf539f8524a4131dc90d8b37d815d8a224ff9adbe44f2756d3103c8eba20b0aa2d04644bb2ed37228f422f401b71f5c174df6bb1ef93064bb5d40a43738010edc0554840390da81f01b48db2da67cf2db5347301e2e754850540e541bb4a9be49a7bb0135ab13800cc1fb0a0e74ab9bbc9f15d9fa7f8e5a30a4aabb57b14db75d341d08152161ebc4aecccc7237ada3f6b3b9380f7f5dc1de9058869a6ddc8a1e351420197d91d505f3ffb57804d0cc8030abb197c9fcd9532d191182aafbacf348ac9e28a9bf62ec409639f08ae8e757b8aa4ca0c1a15328d61739ceac151d1cbd03551cebbfaf34b2e9f1c6c8a1ccc7bf7e73745297a75a313754016c25cd1b55803b9c95562e7dd89ffa7eacf29452aa3c6b56aa19635be0a44ebac5a9ea6869b2d5310bcba77846f55cb5f918ba183f4791e435cfeb60f9e57075b6ce932e0a94a2f5fe76ffff8143a972e9b140507e57aac05acb1b83cca19ac11a8d6dc289e925c0670832464035945a680db8c23d1f7373d4bb53e06c4059716589d0e463e92cffe1987a0764251591791d3bf124d4ad8782b771a62ee661c0b7e8e13273d7ca26c961224d8e52e3bcc9ff478429ffa01bc87f916edc8a910ab8fbb3db964f421d1fdd4718b4fcd60d764c8876b3a23e9cc43e3f90a71405278fc0de8806a52a32a2a2faa0c902f011530ea17619022e870a473f15c626966f71321257fd85b4ecb27454a0aec3f51a7dad42c8a2aac9c17d0c39ae75c3dbcc67705e8a5d4e3941b144320fef2cd4163bd4baf2ca6fad813bae38fbc7f8033e5dcd6179cfc0fa7d150c422ea46023a0ac78be982e897be135e3fafddb08c2b7bee9010488467f1d29dec6e9fb6998a9d2edecc649c6ea0a71a610639b19c674476d31d356cba053ba5deaf419759700c0d969af42fdc9bd3da3d38edd895492e5d5aac09cba68f0f5354011d1342c90139aa015ab40a14fbb79f2167656c6f57ff4fd44420cfc5b60c3532baf19101e1849b746f28e9168f175f8259e2b6b10f89be19cf26cc63a1948fa2832c5d5e40740d3450186c89d59ce4673c3a2d5a3b1d97e6842c9fe994b780b81b4a35310c912ef38718c6064cdf1d51777ea0449ef053ae1dea9299878ea716eb260c0531389db1f17a1c10b6ad27eb5e33578c1ae55841beada70c7cada99b58620fcbc88e67405a8bae827cad2e734d86b302fc31288fd2339f000504ae2a7d8f604cbc483cfa9dd291aafc786a50654522dcb548162f5305f74e12624aad85ab2e21e24637f87bafef36a602da1de7a312cac4a4e370162da18e0d817e55fd82cfd9fa18f348c6ca1c7b21dee6971ca70ab3d4a175af6485e6cd1bddc2e25e23e5c745dcefee8763993c5a0d175151623ef953d8429323716316d24bdcd6c560f547130977de37f45dbd58dfc865ec8325bc54efa2c2974220f43a84ab9d114b728fcba281933d0b5b739a71b7dab6934dcfe936babf2e585204d0204939e48f0dd3caab6748827f31458363c49c4cc836e37a042d34ccf7a3167945d22b623274c84ddfcc4ae5876ff057adb900d8fb5c4d743923eee8026eab6a598af546c8115fb7e2cc61c3e41854ad37007d0e0f582e6d149748f46d12c3a89fec071bc0df37742def134f02af63e03ee56b46764241f642279711799a53cb62f7856c376a937258f4d5565277dfe73667e52696e6a567c7cc54e31971733f252fa5186ca9405c8331534a63d7ad74f7404684cd39cdef7241015ab6455f276aaa8fba80b39fd4e799f81bc4cf4048a66ad8123aa5bb5280fbfe403bde1ded0cd0c80d8be100239ba026c80bd44f36834ba43af6816bd44f76815dda293e81ebd4277f412cda2d3688e46a25bb41acda1557406707cf34c6fb3a07d12ba2a064b1b0146d7800c64ab681ead44f3e814ba011cd7f4a4b5174af07755ee8aef1316a87c03f5d462bc08edaebde2b70e741a073d9f00e9e855172fc5ac782deec4aa580339bef97479c3e03647281663977aa7cfe0ba81dbb024f035445c5f731f360a27411358e2097e936f9e11985516799779387700a9fd271941b2f9b72941f2f437965b0d434bee567181973079ff4b5cde2cc1c70f82723a6191035d95f0e1d0d840f8ccf376111ded8d65dad3e6528f616420ad70ea138256742dbdadbb941be9a98e7d19415b3ad349767a8068f6d015935019ace9aaddaf88217031ea7a47a43db6a0001d764385c2f30432778c81bc009a5aeb4116cc0a4a47a09f46027d244b4f9b5087cfab6dbd36c3c0228d09f45bc86701561b588ed456a5a9b64f246073e9dc495e7874e701c9acbd5ff3b133a9dbb7ba0621d71adb60e683bddb20908139e60fb7db815aeb7af0b6ec193097fe591b826ae58f5a0bfc6e5f71a2187f713703ea61265486885330145d73e21df7f2397cc45a830cb3bea5e8d9c5a83d7ea61a3f28013cebe608194cd9938e2866e5092c38b9446ed181f2123f70a212f8fa24e4290c335c7c28badf94bbe5d8229af740f9db35cf1bc38aaf50bd577d06a4b78c4d4a3efadeb0e89a61dae3b5aa1f04265c5f42c87418d80bda8d2d573a8c60e13bc7654cbde02f33594a05a186ef7e23f8e1373204819c0c050240011514af169130a993c5b472bdddb575fe17b75b3f56a9a0a843120d65c8339969acc7b624675d04ff80ba60889f8335daf33ed990194e33d70a7b7d6ab59fd67cfc20624e4b1e11b176cdd19956ceab44c40611134f5d18b86bfc158cdd6393fc12149941a705877977c6adc00c6f0008b5e702d4712305a55ae9f4eb9978ef8f906d099dea41584c7abb80423a3e44051123f27dbf300fad398db5cb3c30b0957be6f17afb57468e5aa1b1bc5126401545ad739d11a928d98fa2bf028a2582901a5e9997ce3d8ecdca9864a8f0416533d93b724c978531ea1b48a34bbb58dd0fe822f51457ba8df458824c4186c0b4ab0180aec670191fb107da121b6726f839748f15b47f05d69c87c3c1a04bbf2bf1420301e619fa08d22095078a13979b82e10512e16b62e3cc074f984e517d525f71565f77d75d77957f73d57f7e54de7295deda14befe569ef226bfe6ae1eed5c3aed567ee556bfe9507ceb56bcbb513cea59bdea953ecab5fedabdf4dba92bc0bc38a4f9d5d23c6d81c0838334588aac00c4bfa0fee3a88fec6f76e1f5d17275b451f273dd1e77bd9abc94c0e54c89ed5609b76324340c029e7e1200aa577626942085a2ae34940a0c72190947ea5a53633050893219c2a7911e5099f14a97a8be5b18431ca9e5e753cd263e242240e3ea5a2f4d187c99f0d7ecdc0c4de41b3691cd9ce6de0c0969672aa7cfa313382101d14ee8c79bc486cc21023a8879505f5012dea60345742e1f2eb1bb3bf8e0a653509b205fc1846d7090a167ac07cdbaa8b7087a633ae924326e47182e885f4721c834940188259602004418539c3063155b9b99274737b3a0452a34f7c223606f24b36dddd6f6de5b4a29a54c49ca7e05e204a10462122afb277b99f971c30a50a0880ce9a1c9583f562da594d215504e36b55fbfbe083e04f0b4e2285e9c1055ea92b0a79452aa67d450fd01d50f701bbb69142faf1dda328a9720ee8f9704ca569ed1d5feffffffe65cbfbe8d21cb61946fc070b842c081ab905a5930a494b4e0020a27fc0e2c4c51e2d67b2d0a76ad1ad75a6badd55a1ffe1384871ebb526bb3cedf64d054538508d2d581ed8c3b6a152d967aadb556b101a9eac076c61d950714848c2c1521c708f57a45a1d61a63d75ae92af44c34d7114ff060a8636badb5da3afaa8b3c38a18c4ceb6b422fea03a90a2861ff231e941854908ee922fff1ac98916f5295090628a2e2b2c1143ab0619ed75f018dc064cbc0eba999d71c7ceb502c50895b1994b91ec96b20dc272adb55c52c85ae02d5768247cb3b5a328668f40acc48083d1a977b3239d9d71c7cecd9b0a3498d0e449151713a91598a882c892514a29a53a356fde9873ad593a163760385c21e0a04eec8d5c8368d1b96ab5396736bb62ce395bfb0327d281ed8c3b766eceb5e65168cc993aa9b9d68dbb01c3e10a01874645b684bdb1e5a56d2e2138cde6cfdae4a60ae69cbd9b73ad55df6aabad59cdb26cebb5f95a6b73beb6de8cd423d79cb3b537b6c054d7076559b6d9e64c85cdb9663973f633286cb0396719a6d4599073ce39b3190a2a152c695d4baa9e675c1b5367de1977e019d7566c1d4b13402ef0e5c70b5dac485549e209912529913ec974db01080cd0008624529e18010315259985192a495030440e2c60214bcdfe24220258f901849522eeeea98b820d1c0910620e2e9228533cd100b06594298e4c214406193d48d084094998d8a024872106b041131f7678c26564062498800b54f8c06498c288150e36a8600901134a2c6199c0b2d20b09acb51665420ff4474acaea060a50f902e4c7a502f2d2b35f77af614a02a861d61471a4c72b75420d41182162c4088e4811c5061da4f41cb96148ed000c4c80448812c4e00718e0fcdbb0bfd65aab1217902488e84102c48f1a9efe8d196cd685b10a67e9ea0d180e5708382ab6f846102da8eb8a3f707f71adb58a60eb08fb58eb101b81ceb467e05b31ae76c3d3daaa63250827a3a825f58287900a96248090dc20d5254925c25a6b51995f31028b0b2cc6b2a57465ff7e5dc342dbb68ce2c40f5bb4651427acdc2a291b842051032127e8e004893d41ca7e5ab198fdbffb087181e825c609715d1d36694b2944008191c870c5952ca28fea0911ac64134768b8d60a6c6fc070b842c0612d6dc147151a70516107198c78c10c3324d1f3822a46500494180a3384100313a04081a58519a278198678132fc14e902944f0a58a164e107244c90c47940052c28224528861ded0590981177a438735ee7efdabe94f2214aac341e93a008c2503177040410d8ce0b8082a125ae49fca92a0ff2f22838afdbeff475b4af1018847eb4790218e8c5b461360982826de7651b77299a1d34c396023e4a8a3560dac8ebd5aa6b333eed8b9f71ea1aa4d69c8d6be0b0e80811455502f9800890f1c6a64d3140b9bd24b2d10eae4662e531dd8ceb863e75e2a80b8c73c25d87085104dacc072c30c5ee881e43ab09d71c78e451233451873c046c891ad0592e56c5950c3040f2057786090430a56e0258b0b3a97fe6836d3d91977ecdc23ff45f60fa1c1528a2ffeffff57c1cf0bfbffe9df2d4cbc2cc2980336428e4c834e0c0c50a4b29d51f3961846d731a536671af29d21c2ad5b4e90c957841cb01172d4cda763dddc23c60a6c6fc070b842c0415ba0f41b7b002275020f33e08043bf854d61386312a5943e01d352e0c00a55fcc012450d449460e1892956a6e41bd76e81a92e6b575881b5d75eab63ba392b4175603be38e1dd50dae18f1716408d51301e21ef3f068e20409503218020926403e0545904db3b59807ce75603be38e9d6b75ae942956a33c666b75fb410db521216bc8eda191ca1a1afe32b7e10f6ffa8536fcdd4d3fbce1aaeda7f9f0936bcce55050db8674a1310c8d20ccbd515adfa7bd5866dac6853c58b5323f5c6bd86bd5734e6de36bad6006a6b6d44d4fadde340ddc74a6b5cc35eddae767b56b3aaaf141e168fbfc7fd2556de335f0a3ad60f810d8f6c43abc59c29bc58aedfaee096a22aed285a2962676d95ad49235a69ea09434aad6c409d6d10a6739495923c310595d6a4bca231343753aa42a16f2b56cf9413f7e0c08c61be9b0ab9169a95773ce29a7cf39e9ea8a578b88ae3c07a9e869d1b22b15694a390b649c165a93d3e79c1fdd33acae24bf2f7eb219276b4d4e9f737a74f3be993fccdae1cc6a463593daaf49454a2d646232b1bf9bf47d32df37e5fb5c7ffa5e1fec7bfde87331e62fd3364dd33cbacdb98221fee9553ba461b988fde9358baf53a578bc92cc179399a150b6a6c36d7f20ca6dfeb9abb5ed627c47f7fb62dfe8035133367bfaf58ca789b4c6e58856305e305e1c97a38373ed1f514a29a59452fd413a3c18476c6fb4cdef3749b55fcb9c8eecd730abfdba7462016991f9e2a70765626e2a4226b66f28d336998cbb3d3aaab2e11f08f22ddd7492f6eb7a5d178872d37f5f605491345e7bdf1703fa6230aa8444a1907e0da38aac215be8d7f30bb5f860886e33d2e26284218e40172325b5f6e75c9ed80aeb69e767f7e8eb8921816e4fcb7e1ad1ca05156ea269edd71d6bbf86f94a9f7c1723cf7eed89a9fd7ad5d1a8b46ef3269d8bd14d388acc971994db58fd1a86f83731fa618815c83831a08bf14f57ba5026364e2181ba4dd52fca345bc07160c04f5ca29389c100f2d3eb1097e3694db429a0f3b468a4455cce28e531e8a8a7270c979b1e06909b3e2669c0c04174a18b71bf0e6188fb350dca6dc22fb67fa4c245ccc517b7097560fdfa8bc91a727feb4faf4317aefd2e5efb3f289489859b4cec6fb2fe18d59dc6c9e94fabe57068ead0d793b5d6a214b5a9de5a1e1c917d53d2a054e38be534491a98ca1a78ff864fd3963079d84cc388165faeb55fe70797c7be3e74f3de7b65cf7f11962dc2622a7910ce4da99e2116b25d870dd8fea573bd84126dea22443021794f500444179a4211cc26ec5ab4c60701d69402bf333065f54f8a6e9ba2d66072a6f4bf3deac4db9580ddb7471792dab5dc2fb5f3406a4d5db2556b9a4b829b948ecad7e2279fda7bba3de5cf1d6aaeed9afe95ce432f68fbefb9ed77b1b8a95ed8d329ddeb0d853cf68dedf061af3dff61137c5811dd7dddd7c694d4faca24c8eb9d964e2745198ee8b8aefddf0b4782ea4a3d70d3c426afd55f7fb8ed5927ccc66e9aeed2c9f86651cc58816c794114414d88301c8cef83b5f9cad82bc2dd7c6acdb26c73b5b55ee101a01b8a28d1436cf9f027188292a3cedf988264de5463caf70629d5d21cb011f257edb52cead5c1445e4efcf881092aaeb8410c38d4c78a0a4ee868a11783630ed808395a90e90d180e570838aabd925d7bad2542295d41b539009f5c80491660ea283d5244d575dc340ac08a0a56ec6ccb283d3e28ef8a17964029f1a307289c30810952168a13c921242587fd1aa6a44d336a887871235aceee3dd203bdd4de7bf1c53d7a20b90e6c67dcb1135302297846bed94d3151832c2770614a0f4794a0051e0f4b8c360cf143882c4e8a7810264898f4885e199710c4305941162d0893274ca8b04892c5ca9f262e3ca1431439f8893d0f351d6c19db750b528bd4a269915adc967f19aa18ac2f869218ad19166ba635e3c4b58c1c8305fa78332cbf3dba1f9a9f6da3f1d91ef3ffffff1feaa03450368d1337652390070cb25d97c0d4761a289e169a189a19d876d72dbe99d69ffcb5ddb55d7ba2cf88db7de667bb93c019d69f9ca635f3e00ccb4d4e6a919c907c3c062b46cb6daaf6d1072a7153a66da3111882ac910e41d6766deddc3199b6c5c464c9c5c80db24025a04fad3506e8b31d07e54fe278ef43f7313113ccc06b4f6ba34f7ada8331307aeea789c1da3ec39234c62e94a1628db40c95f63254db75cc178240b5757c244cd7588fbc2f7c708667fb4c6a3ba9e5fed2563ab5bfbfbfbfffffffbfbfd3af73d31300b565004aa03ce8b53629c0292beafc09e54fadf5baf60421346d0fde0a08e0213a89534456db3dc4b82b4dcdb72d35cb2aa5f4e5f97850bc1fa0aeda5aaf76fd0ab9acb512637cef9ddfcc39635a2de672aa9638dc6d2e99fa7e3e96582ddbb2ac3ef17c240dcf5e19960c36a50b4362e8e5362250c8153ac26d421d54e5daf3a1157ffd7a3c9fe7d138577b3e1e14bfb9e0ec3c1f4dcb3adb2c3529e5f7da86532925d614dbf0cb5920e35c30247a583098bd44d7765db32d934147b54675cdb6fd7ab2564047ef672f8c75e6723009337b8544cf27c827ebab7a6dcf87db52fb0e29cf67bb9e3ae46048f40989d94bcc32def8c3b6de8f06677e76db3af3ba2d746148dc1e12ddf4f337ddcf9f5c749e1d76e2ccaabd38675a88b4ba0020f2838354558282363705717969dd8895743388cb4b7b0505e1ad8391a6b05d871d6c0f9ab64a50505050a84b15b70a9a02172444178a5e415c5eda2be887cb9c73ce39bb4dc2e03937fcc264d21e680f5eb8e339e79c524e39ff73a8b5eeeaa4b6f176da39e79c737239566bb5de69ed94736a769bda5a2e675eedded037b7a6fd66a77477b342183bf745558d79bad4f65a5935bbaeb0f6a38940d7c7ebbe41b0974a74b5b46cfc898ef8c937fe7c2cb917f65af9cdfd115bdab5f256cabdd6321e29a5b4524a2ba5bddc7fd39b7412b45a4a29a595525a295fea2fb25d077153ae60f8b04f7d4cb5ba2c9aa22c2c335bd150146ef21b21d89f3c889b5c4b6dd7521a8fc4c9eefecfc726816e9e1b9852faddeb7b5fb4322252fd6f147facabdfef9910c6b57daa69b5faabb3dac6dbebcab81c911149c3f5fd442ad11191d8852296c8c76d429191ed2c25a296db38719b50871159a386d7a7e46d74ee7a6928ecc016fd581f80386e0d5cd7ce00d5584b4dd357db29ddd5365ed3c0bdd3832f941a08565f5dbfab31c6f8bab0952ebcaeade9194d4a1a1a186ad25dd706f5a43acbfa7e95e437d0e48bd0836dd79a57acf157ffcb346d3f7c577f724ae927adb5b5d66fde7bafe572ecd5f2c39febb75ac318576d5a7befbd2a49c3b586b29fe643e3b9aa6b2fbe2a59435efc9526d8a3e93935ab7539733957632e673d338cf5dc92359e92cb097591345cdfecbb47ee8a0811ca6dc25097ed23156e93b9cd17b709b1761dea226bc8abf2269d2633d65aa6352e2793126bf9e9b8ae588e0443104ccd0219e7c1abfa93db4f6f489cfcaab658e6da1aea3f89833fbbe7579f7456db6c2ba0b31ff42f57f53c4a65b5d7d085ef92a890eb6f5e7b3bfcd8760df3b150ef5084aad9a108150b692ae63a8b5dd706ae6b63795dae2d03404b983c66a984c9c3430778652ddd6d38bd03ef900ee99edd9c3adc74f87b4e50eb3e165afbea9e5c0e3759843eb959749ce67feb6b9f6f1166d18936cd769e66b16991d672c7a200e1ec64f74929ea3c8037074a690a29093bba5d80ea595bfdd94db99c4c4f0e848c757ef162d72bdf43d68aab2f8f1d9b5a2db7cdb2a67346406e8cbfbb6d60b3f63d08ceba7f99fcca0038baa2af9aaaa245599f70aae68ad592b1510675104a971d4725928c77599d28a4a90ef18de58021a6f801a003c0b03380340d40e20dda587dd00090016058b35f7fa3d32d000cbb520d302c690580a1fee055c3aae2df4c58970030ec1000b26680a1690020ea6f5c657d6a6480618de90486266d0243ad2ae90f0cb5060100f2fcd7d080618dc905189ab40760a83bb0230c8871d7954a5a977e6abe90f26c0d87a6605a68d734888c1e69d7548592764d81c80594629447d6f0b4b362321ae672393232119051785fbd318af2a401c21fbd51c96994648b0fe6e3400928f0ded0487f2310e6e1509ebf9938fffa93160ae9a9455aab2151687ff0371463493f587db0fa60a5f337f4f527d718775d89be46fa9223eb6f6a2ac54ab152ac142bc54ab1769db02a4e581527ac8a1356c5a9fa1bebaebfb128154a8571d7954a2e1fe7f91b7b6b6a4c26ad4ba5aeb3230fc65d572a696d32edf07f76cd36a29b5ab4c27bd2d77598b352dbbda6ec1ef7fc2ad6d1298afa4c94cff6eaf313357568c7eda22f848de8c24ef485c22e048261a6adb6e9c981906d1fd6da67758680ed3c9467d77babad92f2e02cb935254c1eeff7f403c556344d8a7cce395feeaf7f4a5f52babb4b97524a29a594537b2f68f20516d8cbf5a76c1bbf55b33377a5e8f1dd97e35022150a8b50a208b5bdf5695af465bafe477d67dff83f2d9f39527d231fa9edffca59e65e0c8f5996516ddbb612de3a0d6b8dcbc17ff5e307f20470dc8bff402fbef8f86edbe542a110c7f1c456319cb97f8cefbd57a4923446a82ca6f1b84d285265b1ec8b0f914ad6909c37e944a2f9ba7a7ed286f3c45612732efc9beb9048da0fbdebde23804437b9eeecbe5f0fd557bc3e5a775b5ecc4d5c122f765b14f46259ccc589b81c09f66495944eea29a5c8f6645a0b6df7d3b607f362a207ebc01083b0fbe57d5b7f23bff5d91ea546a83fb90e7deec5fee47a4342fc9b4de3c942413b019ee1adc1422fef8b9f5c87b81c6b455c0ebe5acafd747cd008e57d7193b7240dd7312a5df8a217dbaeffe536e16dbde83657bb5af8529a8542f8e7f2f8183ab5fd76e9aa9e9bab0bf1cf768d7f640d377110780d04b526ba4c9bbb5aea65d5a638841d118a83918d75d811d90ec32aa20b4b3facedbaf4837f240dfc03c3aa3a859368f2454800d476bc2795a1fa938f604aa498da92a1fa1bd007e34d65a86658d4570efafccd7d77eaef5abebb479f8b98bbf8e2343c7ff2148d3bd08cf6ffff259006f5a76d892ea459f27904b24025726eadd64b63be1e997146899b8260a4efe5f226dd1ed1b4fe46e641992924506badadd9bdf7cae9734e128ce41e43899f3cad69a3518cd6c8fb62b05a68d7f36b1183315ee59c695996c53c0af4c1937a92133f39a9351313a3e59cb39c13935e241749fcbef00495dca8040d1a0a6ac90cd5000014f31600001810080884625998a63918d9f414000f5f9e4264623c90c7c2611046512004310882300c630801c018621462caa93a0200f613da405181cd13924b935413acc054e8b2dbb63e92526ea7453c54dcd69d7149314e63404bfa2bd6698e9ccc299c91d37bbe84ae11591f7b428bb42092bda417db9fe11e05cd80e5cd0468497d94c95174af2f13f748a3eaee38283faead4ab71304c4e47e970fbce43239d336a3e2851614862fea05b6d3496f2672b0fc99bbc37c506b5b78669d503138d6c7425b0f3d20c33246b57f5c44d2e8bbb2b0467a5e9d82c2317a81bb3f6f454bdc4b0f5f83244b2fc9dc15fdf21a1c7201333a7c01f35b0d0691cb371dcb76116260ad0671a23db25c15d6d8734e998e93421f1bbead435c641e4a42411ee84714775c2236d4b3860107220e81ca0a6c92bd6ad0f0319dc7ed3dd897692ce385237cc8959403af16c87127b625ce89e4fee03bbfbeed4b495fcf9acf6f6bcb8cec0ec4963a97ef02f54a06150766a4e868ccb15a8364ce9da5b011d61722e926293e4f6f1cb7316898caeb8ec92c471c9590d8ee8c6db4336f6175b26a59c07534b6c5ceb40432cc6463366685c77db0a3aefcd888cd2f4aa25bf604c0968d20bc7b34dca3da4df411395874a668803a5b6aa267436f1762c7503a2237d9ab4d863cc07ab089a3b1a0dfc3bc0dd15b1f6eb5701788e8adf31dc6010df565d50be63a1e6c03a163556f9db79ab386af5619d15b53f7feac4662776a0f93c2cdf9a770bd8572d833b3011f54813c8cb8e68b165c79657498a744d822748ad14402008a2fa1ae6eba307887d38be8edc00428309ef421d64e81f345c0e129a17b53c37ab435fab8616876bd2bc05ae3df104da8d2eb2dfca4b100f279fb966074f8af098b7550043e56929de55fd4c9a555f4d6a5b072b1474b290d1c167c274528805b0d733f0f052c7a8b6f21b1dca03f32bc5a730711f3c183fcc9ccc1f15353a5dd67ee10d8baebf1300b8bde2c580714afed3c41db046ede2e8a7a1f8198c5081cc103b6de21c0740d48dea40df315500e036d427783532c7abb145bef8e20c2eb6ad6e91202ad06f4f00e1be0ae051c76a4562a8abd8d3c6bf4d292380337dcfb4ef82caf17a032cfee9edc54e799b212bf5f1f28a1b08558f4469e97d4ad22ee58c5eff65c0045f737bbda7d023ad66f70b8c332d56f229bcbd4ee0b081e7d0cdb2ff8e39c86373752200540b170aec218f19156f934b09cb635fdc6173ea87c272b642b7e08cfd58c45ed8b506b25bf98f6c998dfd6fe42bd45119edac7001ce0a90e9bf51477bf03174c46e8369c493227ee929e4ab2d29e33ff746a5426b346c8bf9288a36640dd97fcd05b45801106d5be03778d27349d4fd53d7a444d513256dad7737af4920715fb702c01aeab8571151ee1b05d4cdfdbb96130a2fdd2df54ec63fa22db341f01f0bc4d8eda1e6c71f476ae604f9968ecdead034053f3460f2ca23c5ae549c23225bb333dc2099b812453723e4b502f5d16fe53b3e7604f5433e5e3491ee893cb3ad963a42520df52856cc6cbb6b3f31dcc4c08b1f593bf199977666c4bca034b85e47b872b0f3dd9309edc1b3a650f080b5739120899aa53b7331c770ef90afedb7ad66dfeaab4d9a40de8fa1cefa80e8dccf0a99518a819bb4f20ee8a63930f4a442008dc4e2ffc985c740ff2e2b58e0c38a9185be87149d1c4fb99ff1d74200e16195078e7821eb0e37be8bec5b8ea52865a0573daa477a64ee4e35a0d0f725d4e0b3cf0648dd265840ad85ba4f6824b8d4ee40b52643d0e9d5b1626f59ce720b8915b1ad8947c36b9c7b4faaadf66ced17cded0671a609b36a4730d1a542ee683cef49e2adf4287636955d5aaf6323649f9c88e8f677bc2091430d57d37c95fafc0a5a8636b768b34ee3e674b1ec6fbd9a54ab92cdb954b7e369b0393678440286d0143195745917c0306b48e3e07bbe22ae59514d5ac38c23bf31969f41a530c863265ef1896d7a66c44c0a702550e886e330a04f7716a333d425286e09c94ab460f2210f701505aea123e403d5d7f55aabbaee031f91ebe429d61d0cf4ecb68ef64ebdcc5fd0786754fe16f6112769ba2b849b60c9d0bd1b3140c683e17c7ef9aa8acd533c48995597ab640d3a334c6eaa6734abe0eba5f850c9ecb7a259f467b3d736e3ee6ff8e17eeffef3861bc5443ceff6ef84ade6d2395d58c5c5dac1f6a505071959c0d6baf10cf8e8910c2224e7a38cbabe87567bd975c30ef29a7e0ff1bd5589a79daae61f1c1d45025a5b66bc556d43e097cf1d443968a2f65536a30309d164088bf0911806a8dfec0a763f22de72b99bf7ec9cbe005ad411be154063606dd0c52cb5e9bda7213c0259b6a39d6ff95bc246ace5ad13b088ae14a2438b8b433a572e454beed0eb154759db54dc95ad7a8973b0f5afcf660c72a5ebcd560f7994f38a527e08f0d10193d5f183011e19bceb7b9969160c54c51e464a8fa3587009536554934ec1339d92251c1ea22d0e91df10352041418d9e09dcc403ecb5a5659bceac3e45a1b8272d715ecf0646e1bddc5cd7073f1728bd2521e5363a474a4a2176135fc5e1d80c1e4b02d6033ea497ff5957c4ab7f49ec7d4bcdb46859012554e11626e6bea970f56521310fd11e862c760f1c9c5b26def038668b7747ed59316b0644eafa4bc518739f0ab5943819cce2c8074484d278bb5c317bb6aa317b4def9ed04d66ae1a7e4f79af1042a24b3d4f634ad114c37fa44557c97d7e9b86c3aeb453f87427de7cfa30cbdeb24513632b5200bec1e7006f41f02b704c82199286ec832b9951da6cc5bbf0281fbe6cbd096262f31b819a00b2b3726cbcf6b6f81627c031900d109cda80d8cfaa98a5b90db80aa8da5ab1fb7ca6db3dbb98da12158eba88f96e43348ace42cc8c71a21bd4940761d5c51ab9e4d1b4a59184512532deca5f549925f0b3a60339397bc3d7c187fb65d54456fb2c24612bf2c47dd06eceb089618497d94ca5ffe10da72a80cf30b6f06f347ffac9098fb438cc6f45e6bf38ea41846bc646b7230aa9c9d3f498eb4abd9351ae7299cab5565f2ce96c28e414aa9588f90e4c735d03998f0e5a91e2598b54b60867a5d627b1d35c5910516fce78e3cca045349a7b0db9880e7c35d834bcc5d606f81af88d331cfaac86285ee635b826176f61e81d051c21881966731782570577e994bdf7bb4549a5d0e12fc21955a16b15f2e871902055296366194dc3f828ca02c39dd8cf499332b899f2973cc9615688521ecfc86e46fc6bd680c52bc4888fce9b4291c835b32d58aec0bdf7b5582812399ca51279f1efdd687c431c61c3da0c341e88d8172cf9edc680fb20440ba9e50a301c95edae5c4ec4a60a6641091b368084215ec78b6c800fc77a4526439141f8ef00336ffbf85169ba8a32774c6bdaea24bbd387ef8b61a2c65550c4b4040c8c83fe587df06f1c583b330edb1f380272523344495f64abcb85084bf9b4422de4e107ce8f987fff3fe4d3f2e2b37421dd1d9cb8ef3328fc6a66148d628e61c6a9668c7ed05c45ad649dca2048fbd92a3fd1d76a35aaad15f7ee7dac23197ea85a5a2aa1ab81fdf1a4e0b7c1602584d466201f3a692870af71c181708c7c928178b85e5d630a3b898866e966c150aa490ab10124857ea5d1adeecea024d4dc01204ad4223d34600f7f38392f55e61f84f1840483c2ca0abf3dea9f6f0168e50013267f765560650c13173066459e289b6d87b5595d19f5f5d58699fb35c1fe803567a2e09ab229035badb847dc551734a0ba0b98a57fa98a23e3f5616af0da49441067551da8b40f2d6407a1ec2f1de2b209f285332186f772003bbf670cc40b186ec45735099d6fb54c89444c79763794dfcc6750b1c3117f858b7bc0c0354afee150c3b979ed8600b41137cfafe3fd4d03c1bb29b54b7c3a84a348da4586a27179cc7a3f2b1ececc114b514b5b7b645fc15c2bf7946d9359fa46f7f94bcc21b3544d642696afa4662aa690fc9a696ba5ae2f4095b7a0fca84324a362c5c485e61e6a29b0aec63b78a9a17c1843326d467c4a78eb99787bbe3a64bca57916a2e5702c3a0bf1579ca4d3539d4d480fbfc9a4b2bcb1724c0bcfbd702f8f93c4a4e3df3f1d5dd95244091b930caaa8f7f0439e18d9d5d93d42ce72b38007b7136a133533f20ea24e0f3fbeb8d8bc3fc01417603893471b115f000a8b689b1963fdd5074851af213033d0fea4d41abf7a5e52d055173ed12137d129e3e8e9805010599bc8606731039e0c5dcfa26571b213c4d30248f34d4979f4942fb9a57467c496fe38b26ab518145aaeff3306be768ea65503273fc704ec009299a59a87e07ebecafedaf04212f7988af897be3eee7140aa7f69b67f70b2666c8a0a0157aacca9d7082e54b676dc1890f58346231aae4202e5d7a1f596831e914335063acfbadbf7f8cef4e5b359f637723d6b548d9fef20fa7c504ec54e8b45750333c46664a761d129ed87a43effd8448bce3d03c49e48aad7a3df2d10f5cc996f6042c589f50453c73e1d872daf5a88b035cdf5a5660bd16f9648902cdca0889d8bb12eac79dfad08dbb8799709229a6174bb2576a2d385a250253840346dde0574066dcfb8b92b5ce53c8290c007d9d846ad066ff44f1dc9e6071ac896ece52a1dd336c5462799f4558d9c0c26208ab54e2dc46f6d4ae4c7ae47de0a747afe171e949a167b787a229d153118b124cb9164212e4b4383c0803b151b779f99190208c848f16e2aa625df08fd992448627da98d5aea8b4c1be87c5332edde09100ba540384afd4f1ace5d0e54a0bcc86752160c0a6223477b67c6d948012e621ec71d2e6debe762a27e9cb7b85773ebfd90006d5e3ac343adb1b44323562d93f97fce58bb94f1047beaec3688759a5bd0c8b23f14583556e90493a398b5f2c64926cad1e2cc3332c40ce55bf675cc195d7b2240bef1a468672f82bf6381d7c9455d055ca0fecb2935a6d81e09b34f0c531422a5a2a5cca8aecb2489f376dbfd4f6ac007e6322915aaf0bc57b00216894c02182049b9635af4de1102b204a615c031695227824a5034a1a4857b6eca0d2dbe998a327fde35496e6b42b009eaf3336603484cf0f18d68d5a2da7f7d1b418e10db60b957b38522d7f912600a6c397774da25784ff93246f74cf2db8e818cea365d3d38dd04699fe8597efde2d0b193f0a1c66b6d3a46ed8c4e557ac446acc8a2add9e7032f861241dc118f0c7b9b0be65bd928309f009b821a20644ecdd8c283da4d421f90786f8714646cb5d2594c7b37224151c221bf52cfac5df10612e9242394987b992888ae1051afdeae099d6a80210ab0fddf8ca51018033a9413e483824494a8b73730abf3ddfcb491077244e79c79814c1ec1040bb39681eff9758c4178b8e027cd9ed08bbfe613fd3fca690f31929e967a1028a586062a9e04e956a74c98e60a9ae1115855a5b68a970a9dc76a4a9a6258caa2eff6553222e669db9f9df0fb76cc78a8636ee16e025e66cee2af48968f6768620ffe404cb7d36199559ceb77ce990a27902a00273d0aa4796ecc0d0d9e4c3d9f12619f0770d7205e584941cfa833402dad1bca8ba0a4e7282c1e61f25561dc22721f2fb804348dac982088027b8f23070749176e4bc8287ebff4e36483ba1c47d86dc7572cf2e42debae0d2baacb79ec1ad13d04259535148784a859159a4cd36b8336e015f2bf100b858a9af65f0f65691add58c3de392faf032a5c67f79c4d9e4167d6557972942178d70befcf975258585c2e9674f3ee9078fbcc0bb9f179f6726f3bd160463eaadf85400d4976279325ac48da1f03c8af4c6917974e569c26740a4cfa63b10996df3a5b6926274f12912d4bd4c3609ce6fd48933da1e800ede7319879214717c3b2efbf4750979d3e6d6c5c88f20d6921d886c64cd52daf95edc8ab09f50fd6c15ca9a527a4bfaa4c9b8f151b683a286e4e0527dd2321114283589c252488b61d0701a312dd50c0faa78c284aac041dbd89bf7f885ed0d355d1c67b14b697ba93bf43676487cd2201b668360bfe6d1c930410cd3b2847294cef5de9672749256bba1f53163f2338c532f21ba05a01ba8cafe44b37cf62c3c5c5a4eb780ef470b50771b1b2b9753ed16566a99156b857d2d119f0bc78f76e472f21d523cbb0d737a08863c7aff89eae81759c6c9558173cb57cd23195bd9e9c8b39425b2469a362c1cc5061140b72129e4d455589054c585fb95bbe56d032ea9cd45bf8f9c42d653527c5bcf1f1ec467974100361ad94d0865cb53038e589f746e9461fec2e99e00f70e3ec20d558fbc579f09251d491792c0652948b27d11d7ccc87193ddc9281132af9c39d45cb76bbc344bcfef3db2de0ef825554ea749f455c708901a721b8ccec8a3b716460755e7dca0ac6df2a5fe496a2a89cc1b24841ca91b06bbbc4be030483b6840a02d59cf0d7a789fd0d90e2299a54150930bcb8d8c1de800455f1dd3243603db7185e030483b689cfe66e196f4ae41833ed7c6184343421a248c60e0692a9093c7f122817a6691e192691024335f2fb321fb8be075ee464035cd5d09200de2d4b25025ab1c60a942c72ce624fed04c106914b16f48649bc1b9cd77951a2bcf81d80a57facfbc5e90c6e27b3fc7e22239e008673ad2436e6f9af7681d5fafb7e9e359dcb02e14d4d77ee1656ec9f23a3d887dc218f179a9cbf0466f54c11cb851119ce6fa2d32f3280be00e229fa21a04c43b13461ddc75817a23c6168cf7ab6cb4302d7a081c2240ba4d1dcb46cd70a1d5c206cb19fa66306287b0311c017c5765a3573a80b00f57aa4fe16eac2d0ebe4fb5d3b6fd43e7e7b47652c5c8763c105c87a573b82f13b9702605100733b820edc236ce22216846e8253d6ed2a89bf0e73655a9a6cd9ca15307a6e67939382ba84ab5207414060680e291066f202326b2117e32d9d2e33f59b2376bd23f217c53c6016c07b41c2adc5a8fc69e3ae841618c9225f406e0976f01d1a253eacc69beb1d378f41781389ee8e4eb59023a7249fbfb088043fdacbcd46e5c811609f7dac30a2b190ee300846f39e10fa5fdf166891fe0dd5e23d5c9c52b4f583c79d353552e8298b7181a326cd9c94a99720592eb65ab8995b0b4b7dbf19f7300a6a8bb6072f3062e63099ac58b5e656ab0968aa65eb685d524cc2d8bec4963229d52ff7ae8c2bee1582e29d6e063aa63eef732b0ab4d023a6e6cc2336f30593d0f163d080e7080bdabb246ab15eb8ff181bb8f4b09947d97b2b2bd3b0db3460c81873aeacac02731cdb09722e98804258a4f799f289a02dab2d48bbee759665158a0d94f0c1da5413965befcb3fd66a060f097120ae71756ed46e9008907f12a0c5c49a9af84c71413a69bdc333c5aa3d256496cff36a24220223907bdc4447cb4c319a6ab18075610b59921fbddb6af1df430e472df7187300af2402ca3aec26f9f4571cbe461ae17c6f3a288214ec53bc86cd4f6dc5773455e428f0616e36139351dd443322cc9c3618ff667808359aa35d391c4a13994f25d4543d9d09da5acf9ca750b896ae588923e430d4345eed0b05b7fb1edb645ec58adacf3e57d073478eeb8fa3306899f321b1ca32dac822ccdecfdc0123c39c048e1b594385c70c22b73624f658bcfa56c1ac8739d904a2e3390364c7345edbe4a0ca5e57a9e86d5a7726d504e8343dd3e886e8d40a48424259ec4ab3ded024b29b82cfa20a49d727b29197eead35c68d4eeedd58da5fb44ebfcb3294df61629d5576048b51f0d4b90caa75c1a8501c534704582c1415ff6fc57c1065fa514b6410fb6a6de76e50e9eada08755191c2ad47c195d5a1a1bb55841ef1824ba6e7f0bddb2c12c5cc3a63577cce93f9fc7c7f679c66237e30196bfcbf05f4e0eac5619bca5e20a3aaa291b836ca43272093f43073070809722a2025dad218e2511b4c25fb911c5665f75891fa4fe61a412ba0f0c15d2c16c8a371f10b91d58cdc507d3df146b309c9d1ea06b406348872d4e4d0740a15f587f73116afa2264556fa12e0cb6c4450c95a0f4525121932a01e7b769eb31028722e3a2b6122a148940286e1287d953138ed8e1d19e694b6b598a7b787e91f67486dd8ef5bd172512bc4d0ebb51a968b1d12f5a811dfb579fbfcf6c04175dc561e577daff896666db68a80795a58abfcfe7c50e0b6d45e3ca6991799abacb342a49fc8841e487569c181aef16b77b77754bf48d4e38c75e49faf54bae944eca8939755a690d743706e9bdd19e5ae1e0e02fa2549b305656be61a84a32f099a8cdf54815522eab847919856240f7b1094571518cc9111cbf0abdf97cbc2c1362770116750abd631c4073885182e33b21c068150a16814d89d45566335a5d5b65db1005697c9b38dc15d4b130c8091193f0e7db149698a10d3c1944fe6849f2f48ffcd719ae57b99da36f5b621cf0ad03273d9a238ac35a0bcb43c9f71be8ad28cebe73612a0fc0c8eba0d906ddbd8edcf279eefd6fb497c685640ed5d07b2b19e72d023c8aa42aa08c1a1e20a660f6987a5b1625c0a91a77526e9cbe0f74ec705cbc7e69a1823110590b093530ca414f2f1f07889a7f21d891170b3a11b2a6372b58ca0f39a00a851868731731b801c51d49fe8225268d6cab63e3f6273a6ec00a4f7a8ecef617f28667d8a4226ec9b28571b13ff04b7bd43a9ba021e53537e444751f58faa08c124580454de456fa8a3e488088012f0f076712253d6685fe8f4c2a27cf2b55f670ff10003de44b6c678ec64ef147b3c7fbd5452fff48de4d169050a3a00eb301d49a381f7b6e3b29a4a01400be7d9e2ab56560df918bf33861adef555ab1665c601d5b4df4c5258f66a3b4379d883bd6610fec5e7ead16d04ecfb91bb18f88ea5170edada44906e3790339163148e9cb9c6a04d507ac9059b1b265330270eb41aeaf8650baa252671b21ded9ab0c1520914cbe908b677623314a0acabe2045ab9f63be280463fb7115a250671a4c9c906f4758d0ee770fc0ec8d83ce073b41ab755b5909d028fbb3df61b9fab7b9d0e88d5ea3f43eead7e7db2f4f8b3d90c079b54a05418d2b0983053e934b359bfec9463a24523279181cb5a98e60dafd2a6afcccb0d488878ec64bc65dfcc7e3b69a31f707260119102b5d5a7b0a0eefc37832d481cad791b48f143276472031c6651c9c23714aac6d74b353b551c49f0ff58d11145ea9246580a1902441f0a5634a7844652400aa6eeb1f93fa31ed5b2d2bd1dc07b4b612448004cbe46063d8813d5fa53778a98fc1b7068201d4aaf4137ad63619596290a595fa2078fcaa3f1833ed527657a2002136b0daf60ea8d2c63dd638c28d5b688150f6b7c253b4b6d195671ea900e3eb24c4002663838f844b5e54b7e77b91a6380b69c910e07bd06611ff59d467336737ca1af5bafad42c1059c057b94d06f1f3036819b521a85a5d8f7d3407c376a6e089de5cd9b04691f20840f01c612d1a86962ed80943ab270d78fcd8bfd14d3135e30a7b21b34edf69a0e70693990261fd1c6ed8fbbfae9df69c74adfc6c1f1bac0b45b1719e95a1eaa30b2de6adc22a69393c346c629f7d08b766929f4784629c288277dc7faa3e512e945acee03d98894332061db6c8b03887e45fb85b8819ee838ab52ee25dc255cb63e0507ee1ec1d6aa3e8374d622e87d755aadebd5181a13c79a2b0913715924e3015599e92b00c0e7eb00f835d3d68234222c3b3fd35114d84dab85d66171081e561718b1cb491a51dd88f436ca17c42f63e865223e47264275a9d52198492ca86b041989280d82f8a6120a58355fb92f679661f9910b43bce11a5caca6cc8159907fd72c97ff3d5ace90de2230e88584ebd80fa590dd3f3a2c0dd9a249a0dfd374cc9db51e744baf7fa8dfea4f3ebad62f8e16007b1c0988d2e567b0660b186c260f6c6e864185be369020b1bf53156dac2644cd8c3cdb096240b87c2f927e262ebe286b9e350b4d9d027fbf690d0ac659f13cfed6ff96888911bc846238304fa0753139cf20c1ff989c1930e87693554cc5e5c6f70e0ffd518508f1ee96e3822a5c1333b516dda333f51950e172082a8550ceaec4f3c43cf861c7a7ef4ab990ec5dcdb4578d7bd02f51497c96150708a111705930248205506d12d024475c6344f06d22a5d7da030ea76ef5101fe45faea189a6ef0e57b1ea39025323c0160bbf5dbd6374078cb2d7f9d57b2d20866012f245f72487cccfea84980576825f7e90da16dd10ed4b3ba88a1082aecadb3ece237026eab165956a0721906f5223919563c6f4fbf0f4c7b281710add0c2c900cb6e60938f05049a67a007e024ab4756989309ee47997f325ea0ee3cb9782a86de73a35e261211695aedda662fba24e6fb4cda858b253cda2dec1b044293d5a4a7db0887ca494c529c1540c4800fb0069ba6e7513af94b53b8d5a0c7cfb4d154364577651d4d22e4a6ab723a1a60d14f3ebdf7984aae15c5630c413f0da3bf1ecbebeb34e8fb985eff694cb41025bf341db439439f86546aaca28dbf78a98cadcbef8aae3655f95a7bee0d08c005fd504305d4121485104b8f6838bdf132ca258409cb4fed107433ccc30daf4a4a669e98aac9d1ba3589088459e5be8f45275c6905800c22e825107737419c2549fef83286b36ace95f65a0c6771bdb06341c1400a3e299d392f91ec519534921e8c56dec5e09aadc9f58a2fbcf01c4f327991401b09b32be1cf642aae569b4bceed7a0357c4b4e11c9fb436cbeb4bb52beda50d8ccc23fe75d4453f806aac61e1e5ab5507ea2e1e5db56fb968b6602fc5f0451335301d4cb6fb88616cf67eddd659098a971893c5231ba7ff043a5b63d8f21106ea30c09850e2acfbbadd326d075e38093bedb60e2713632cc045432fd9ddbbd0008f57499e9f7d4a88ce7819cb15cbf88234006911ee9aad19cf7a5bab10b2c55e84aa2f650f9c74d5e51187584da268b96f3757e3cf28532e7fb0b1a26a8ac7883436621e967a2d46c26cee4b3ce43247bd4d9d210c5a2659c2672951b1c81e66935b372350233043490be08adb329214efef8394bf6c0ca0b7905796c2192c6a11797f89e19f2943a4b4de23ba5f4956bb01887eecc56a95d391302ee492ce7a85cb54c33ba0d59ffb3139123c4d7b385782be8e50a22d6b9b821cbf010b6376279977ed2b258b50dcbb838f72e9bbe8a0af4f8c70adebf33bb2720a94191718121db2af5c0710d493f1a653cdf3fdc8b3593b2fac8f04581488e80f3b5898fe3f887c13b007492c047a4e7f273bf5b3cb278de1d26d42876ab95aa7bbcfa05ed30acb7d1112304910c104a9ba985195ebc16152e905d2713dce779dfdad4ea8ed868dd6c6d358983867592f59018bb8c10a854cb6ea84e285a92cb762bb7fc33828485c81f69d10eb97eef3047b36a8b05a8a52a09e93c857df8f43eeaf22f3cf22e75c98342d7d2324ece0da9418ba09ed2ee4c3c74bd9da24e8442ac924b6db0353630ef705b1d68bdcc54142556bddae262caadae05dfd579345e6a70eb4c5fe9ae6a80878c7641c139d69110a13f1c121e1c566cb364675740bfb5c029ce680398267443428714b1880278144d80c3a9eb8685f75c954f768ae44d83af76748f8a85c2e863e026e075f26bd1be554f820e1b35b43198ed03e0257dd11fe8281a2ce3ba19d1cc16c37b738a2ab29fa6783a8e86fd6a97cc133e15284fbeab8ca0479a4bd0977ce6490d246c82d9a20255341dcaa18003771b0639367a873a5a198086d9806c0a668265536c200b371747fd6efb2b925bf7763833a2133809ad4f9d1796daabf303dbe10849fb88e27182db8c8278c4cbdb4932112a68b85eb5f8e4b84b60e41de52bd9081f62a99d2b56ffde1b071115c2765c9b98fb907bf5a8531f9d4360d80dd78a1fa30012548bc6a8af34e484b9393214d064a8040e96aba3c08244343b03dd7df086b43c91a07f05b873da637d114e1c171a56128459bfb7f0b2bcae05d81eca030e8aae6977c0777e2cd924a9696c6d22b17601b4b5fb4ea85cdf88dd5344b57b4546e7b3b2fc6e5479c65b94cf514cec36b45b858a9a64c3072484eb9f9a54b11968a034c1525d92babc8927385b2791b6ecd7af301b51e1b4b40d99fd05c1df28e3abad12dd3102cffd701e90f5778d6357717d165227028127dd8542c51b8754f49f998c6f0a5e0cb1d1d222ab8467d3224a9bf5880aea81f47adf966834586214ba721bf051743a0c283769273ce7f31d19758b90b79cdd85cbea0fd4232164db92a938d27a2eebf1807d70fc44f8acd47eafff6e9d58dfcc7e63a52251cd7303fa0470752d70c4f59cf20666748f8ebc092115a489833acc1c2f3f8c350295125ebd3118a2a848ec0152e3537bd86fd4a8cc352780f255d4f9de39f238a3a054ce02b015c77cf34742bf251f071653210ea7b08f7cb77cad514b72a4894c7a760a461b737bbaa84163e50b98c5d7dc972709506715bb560630254cb2d00eaf11fea2977f3cf5960bd72d2823e79ac8403e2e557057b16aabfadba7fb9df2dac6f0c9d4e48956399238bc51dda70259ddf16a0182badd6cbebd3198b419895d72884f275ac44cd6bcb4061aae5730605f350194918642291820ec14c5d1628ed5495ab5707466d502cf64d98ecaf5993f723935074ab9df222ab58f1e50d9cda3db8c11f2e9fb4a0b84575ca04b890936eeeae9d9660e2b5d921e1e8ce01d28da65cc65dfaf182472c54833687124d3021ecc02400149ff1e1df8516dd4cc1bcc4a51ce0a821aeabdce4ce83f38546acd4989dadb8e54d87e52c15917fe6504e10e16c82b080d643c01d68dc4f457add625df3da0990fb42de7e5c440f334f629fc0d90b44ac9ab09e67ba8d1643ee692196c320c6a0cd669a7d6ee4c02e6673ecd4ecb7336eedbf01ef9c5570dead40e8ea7c04a38f65c196b0dfa46231c88ee5ff11a8b721d2d5dbc397141d9533b6837b57ca3439562fa97d0a146dc3b205a6b8d3ca0da01288666374283d7b93a2258e3635bc222f8969fa92cfa75179b0bdedabe70253d13be2217a901c056d847aa2f91913fc6f94a4b6638635d0d2942bdc03c36a5870a06438fe359fb715a546582b6c6bd2f8c53872f7017382a02525be8c106856f1f6d4c58b355dd6713f9b2ade14d7e85e4be11f19e1449efd6183f030dac6c91fd739023ac2359c7d5ed9094e70eff11e214f23f59ce8ca5427349346ad22ce2c1fd35a1a5e4ed188aca334ead30f279394f326d11d01a5be6fa771b81eb6970ae5e8a13946f561deb858439a822c9d04f530f2d9b005dc48d8a80cba9c819fa440d2bbdd8a21603c40f26cd43edc18967d6ae19cd55feb21eb68183284a909770fd38c5ebcfb3f619446a6e1b9157410231055ba1dbd53842e08e829165700f9eb8a2e117cf3c91a6a64dd821e76bca9c98a62321ff573489b109afbef1000c4cc7091e589b2e116bb5f4e4ee80d42416885bfc8f0948f12ab9e3dbbbcc37fbcedfa9895e1b77ad2525691bfb36afd18962e83e4422744f26b0c8dfb98f4cac1ba810c238c70e079a00282a643e55db9a1abe4efb7e590f14baa44c350aefaf46bcba68633e25e2be8ae12b996a1ceecbed0c273c4d141cb2f29c7a7d4ad0206fc078faaf7769d4863e4eddca7dbc0fe3a2bbddf12eb4a943c37c0f825d5db3fa78f8cfd8995df6afa406ab34cf36b1de7c9e99ecd5b2604df64fa58b159a7949d1b365cac0f7b1c96bf1b837bdbce9d7005aae4eab5e9a8a36f66a824e6af885386fc192ccc7fb841244d14303a482f63fe73f04ff160cfa72b2ed6e3ef123f9ab2e8c3ab864fc8a4e5080c5e7e48741183719317b438e62e4cfb4ad7e3fa7cbc3afb701aa4ea837c1ea06e601d55e46f870a64bce0cc72850e4308cb557efabded0aa7d2d30a40f9cb4b1633c41d3044d1beb8294baf4f38233c4d5c6c79e6cc926909116fef701e814aa8eebd48218beeed2d0fe5b9f5eb036e68c88ea1d4133955404d181e0f4ac749aa47a3bd26ca3929bb09c5cab8771042259fa0b998545b590df50a0cbee64d230fb5fedc0f413fd4b8a8fc9dfc76f3f6cb7db1443735be8ac0a617dbf403a24884225dbc9730372b3528fd6b81d40bc355b8d1d6496f5ae92f22796f407794b0aa645459c397d2a9c432c7323887fb82587daf93cf46b04592b3dc1ca8c4cff95a40d95f0fa61e5c6172c308445a527a664e8638988f1caee4bc413a9b9714976f8ca0c2097a62490982ad795308a04aee904781449e04f2d234a142ef1d88b85936c63440c3d51e8c04bbc52c22d057d064c4279a938e21c1fd0d3289c2d370f1e29e89af019a9421c3be3705fc490c58797689b7099484f716cd663705860e4f27c26b6eae184ba28820d67a2aba06fa31eb770ee27018113e079f084cf185b0e3d8f7937f270e78e04abe66e1bd61839da9f949fa565084eecd799d2c94807548a401192aa50638bb3e9304dd900c60a1ed3915837f021ff1c173127f26d3087f82f293a21ae5987d57eb2ac141da2432824960124ec03bbae2bd092102304cbcce3e909b84052b94d1f3392209914ffe1dea70d7a1d14d5230f5289a6d4a03fa4a9a5c1d9a376455baaef3fab45383907e8fe87a1660511a9e0ad08ad3f02036e5b84b82bbda2033c39b0976d11d1d062837396d0035e8052b48b5417252dbec05f368c16319e1c28c05d13c24dd089fdaabfab38f85dc0fcc493330b68e6e0ecc803a88a359f5df508c24e75d403ad60a1e53885ca2680c84dfae2f7eea2009bb9da8a1f000d2830217c3e44c759bd521d9406805659abca7b05cea34740316a5132ed491af6883fd4251f761344b3583bda08830306c6ec7118f4f38c035d360c91679b0ccdac16608ffbce4a8d801927a7d47cf8d868556e1ca77ca8c2506df0f06f9bba2d5033e25aecd0cbb2e16332656e6e5d5fc1e9676009ff93dc5e054333064c75e09eb21a6bc7ba0a4cde6dfe25b31e56bce323c64927537e8b69e5483a8cdd3968a6f0cbf4a579b0289106e6daaacd0b02848f1ea5ccc8f001715f3a247d6a28a417235c309b21e164163cac642c513d127976319e3d15921c49b985cfe9b9b19d125ecd9709569f17c01b3244de3804dbe32e14abca75f001a6cc3ec3c7bb6ca25f1a8c54e2e0f4c0d57f394f1370bdac20d523cbd5e83fcaf56649029d9bb282c7fc5d3f99c2ec10239d9603cfa4e6dfd8af19d099e37d8429ec5be146349b41fa9c7c953ed0ce0e07ecba1dc3ceb63f923265c4be77bd04febedfe8d51850a5bf095b738f4c8a017068f6d3b1b535720ccf1c8dcdc7c2d59b6835b69e2ec0ad51e7fae26a6dcb5e3c358f462c8fa24ff78e95883f29c972eea565919e2c6fcf338ec62e95e7e54894375b74cab3c896d44fa126a73ac344c93c259daed8b478a232910270c16fadee5fbc6a4eb0b2405563aa9629b200bc49e4a03c5dfdd0592713757fc20ca9b43bcb79862e5dd88d934d77683e590e4a08aee9da3501a0422382be15c1ad697af6cba7c2c908275534aa85b1e9deb188a32076d906d70c46f35317c69427317c86596d805df103c66560fc6ffc1b2df119bd82a01168d9c1d13fe204986010d248d509a314ba6713530f2763a3b00fe43236834c1701bd104c72e59dafc5acb4f6531d40426a7e5eb23308ce29961912a5a3a98b95853080740299fc46f5afd01e83eeed750a179ab727359b61e335399f17960403d1641522c8b5b0b9b3fcf0d75a25cca6cd2af85bcae6992404bfa4930b1b48327bdc3b48113c6d8eca7c93bfe558537ab2e7d1dd114c225e7e7c8be365608d1ea84847c05c621f295942ce6ac115410de10fdc305f48a7d35ffd25eccd88f54ab2a5ade4c163ff256cd383b5e9b7b910a235960fe12fa9c6a1658164808fa3e6e202b493b5b40555bf92098b393a28e640aa9b35c2ba2b2b1500c9c685ade3cc2e6cdf1ab90a3bcba4ecbcc48d48622260e67206f42cf33aa953db28609ea5e297f8d5f3cb76ca53a542c1d2a9bdab464aff55a20b03cfc512b409d5ed27d38f8eb6cced0b21613a8c085ddb55e9564a480351e9311a9e026f5c076c0b1325044e3126702c72fc9b28aef451ae5c77c84d4a841360d87bcaf3902e2ee531a23a7d120c61a638a512df6955f6870632910e68c5ba3a0edbefc106826370c102424bff973d884df6ca3595e9976996d92be3512561977f012b27412a4018519d03d9ad4b0d191c70985f85930ea857881b33b9ec426df0acac227658bd53b13c1e1125097cc6a21c6c3e951f6139d2960dcd31e0091ba5297c8a9646a7b1028a63c407797f27b23726452c7adc7835e47f8427c6f71439d286144724e633b00f4ad35a2f8fadf438b32652312886ac8f335319af9107f7f5ab4556e01cc2dc731e6b6cca779e50b01a9d550a2790f0478d35ca853fb1fc15426ce422cb6ca9f54d298c8214b34003517cbcc870d18583b2ee4c47f09adc0113ffc6f791ac3aaae4c4bcdfd6e9cadbcc46155885ec6bebcaeed7e6d2b11e64309dee252b2fbd5c225caa63656141db6d7c24e52e68d06384107da8ef79c920eabca36ce53c33109f30ca5f934d8c5c0a83037c0a6e041781b78658fef0774b16b0aacb5a6540b1402585abcb131ba3c6f99ba9d48acc6424f16fb4ca9f0e8ae05b7972e2312c95a55f1696ebf4097c63af37394a23449a7af5ac9448be39d8b673eba8dc00cf90b11a18a5e5a5fd4850238f7331eda3110ef3c854349e9ac26de162264feaba6a2828f5df9af9a0d270af0e51df76183a4f8140686a3e4693c7e565ce437c218202e3f1eb0abd8b7361d274acbb1c8f7674cc04c0e21ba40a90478028517e142fbb1a7c1af702978d18f086b8eb43447ad586c99c144a6bcf5876457d30fd1e14771c3e73d5159c14a46810ef4ef3f7bf8b017456d831b81a92b955ffb02a7e312ef1030e12ede334bb92b15693fcf2e267fa42d500445416ac313295ba69c20d978441b9732f90c83a74d3d2b18df559166100b14d4d4de215275a96e993a7cb19065d9a6864102c3c23f236ae25b4c1637ae63889f53a1066495c06ba3a4b669bff13472355f6b6b97f3421a9ec6c6ca948f37042e508a350235d965cb356223ebe233322b51052ea04fa547450374aef0c6e1d10fc05835c708219a6b856d20f2eb43145307282fee40d9d0b286854e6b00e930a62774ad32fb509c4516846b9fa02d652df5b64d7ebed59ef1764a0f2a7b5947103261482e6357cf1b9b8e2da20458eaca631751109521c29d47a048af9424909077c312e1173906ab034430040a4893a356305c15a903998c7d5bc9de76a7f5f7f4bdf27d4ab193d3596de13a9348bfaf8eade37e8c8af3cfbcf7188fdb1030d00eb0ecd78df3dc395cbbc5d83add74dd95fc178f54fa4546f94146e336b277932df79632a524031c0a790ae009cc174cf23d88759ac8e995933e94527e8e5e49b6611bd2cfef48958d704e915eb13f9326e71489e15f1d9d9c9d6e71926e899e9f95700ef8232be3be878061d9ea965779a38cfe5e05f82dd370056ee1b6acf303eab04e8e0de82e9e620a6016402f802008823a3ade1cd6504427c7866dd0c004ce09c2349cf70083965d673080a4e7a7a6f755e9fb5196754e363a8b6439dbf6a4ce3755f9a50a3eebb82b899f9ff81363aa31c673deb9ceb3ebadc598ae8db411ef23d759c7594eadc7dee44312899ff421e3ec20919c5292c973df997094b9211ca394fa53ce71face50d00fdb08a534fe78e83fed37c9aef9f15907ec9a969334cb5b6cf909e6295827fef0bbe8e516b6bca2cca34edc89ad51ee297dcea65a87bb58c77578747844d509ee415589aa44371ad99a1aefe7d7802f4735c6b08ebb382787757258278775ba5f7b9a986dbee659259c5022f4da4f095a25bedf5e76d509057cb67bd08baa1221fbbdf60ce8bef79eab19e86aaa1ff4dd7f35d5368580efbd67406753fda2ffef7b067c2fb2401cd0859d23b098ef435609279c50c0f69f05227f7b20319e05d98e73dca58327872767c6182347248db2573adcb5f2f8da9c55b33a39cb5fab35d3f277104ad341240d6b265918c1081e8547d1820e04410d3b469ea043a4c68b6023bb749ac5e4902eaec86843fadbf3b3a53ca0bf8c3c849ddb5f72999325977e561e2bf76be995dc64e861faf51ac1382bf42be573a47122bd7c1a5b272fdffb3e3601f87d354e9448d5f43ee845791877e518a1d4784daabc2795027d84048000f28771567ad1b3e41843f4f393197dc7da2773625fe089d4565e6bdfe6a6dab6529d6f52fb9eb43769f3e7974e4e9e7e322727956f4c5ba21ff8cdf025a2d99603684204f5b39e542236a718ed4d9fc35d6ce30b882e3e011769d609901057fda8ca4d88ac8e71c55174ebe4d2baa75d286fc84540d77bad1e51292083c938524a93d3833e99939740b7e43dd950964e62942ce81342fee8617c9ed4d29bd47951ea0f7a4f4c76944eaa89a9f4f19a1ef4c998ec0b2c3d3fe8bb51eab88b5c087ced46be3144201adc7ee2f68c2b2b57da5eed903e2cbad8ad1ef3b58ffe3ffcf24febc367b6eb369cf687df667641d76a297df8cc4669af5a3dc2ede9cfb8b83ffc825e03dad5409a7ccd0e11ef8c322090edf0884f66db31ff088dce68b4fbae3b407f448f86ddcecef4c718c3076771c32034575659e973dba6f59072fbe117c4b3866dd8c6866d2e077a7f496547af3f7fb7bdac2cdfbfb3b91bdbf0e5eef69adcac649bdb756800e7d66d1b88a35b649b1827a6bd00dbdc1d52bacba1ebd8afb6f9f0b9518e575229376dcea185b9e5ca4fc99658479f5f0b79b4843c5a2ebfdb60cb691af3c338dbb0855b3e211aa61b64c396ab7d483befab9a3f8cf368b9a067901940a9b55ced4197ab55f66a4a7b8196bbc32d0d225dca2d745deca69ad6ddd2fd67bb6cd9eeb29bf50303f6af1da10b3d01f2ac76563ab7e746354da330609bc69a8377b3b296b08cb6ac1fd61ca64f9f13064c4ad91d0cd8856184f51361c0260c18cdedadb59d1bf9d767397ae50330a4373a0f8fbbe4c7ef64e5986debe9e99136d20606bb21bda1371da339010c576ee24a02da6d8c4f9301dc66eeea98a63d207ff378376c0041f739e7c60590ef9c1f571a902b65092cf59fdafd1b0b2c3529c1d24ab33cebae812f06f0b469adb547dd89dcdcb8df4cfe647e7b9721371ee1aeed7bd88da1ced14470fb43f71ab7692a8055f4cca1dfef35d4865388edc1379cb0db3560c79ffcfe6cf47522b4099057de01df836c9014033806f41c03b2365eccf73632a606f422a031de6f9563f853808cf9ac0840208a017dc77418c4ab1c7de09e3dd07c508dd107cec698b30330ce9c59d3ab6973fbba9d3022207f386147740c7f44d05c0d9cae8f93bc33310b9f364e1f0ec253d37cfce64a25f25d4a69fd6f2e53b9c9f024ff0877cd97b679f8cd9515a456803276378f79ccb4d28682c163d1e7861ebbb9b9d15aea502fd2bda4aca107bb35e72c4dd2046769a2ccd33cdda99a9469bc9daf4b7ff3428959fe075269644f269d563906c577aeac5898060ccb1082b4321add69c3f9220c8037949f01d2cb88c8008640a4c01142d4800962646543cc5bfa682233e2920de7db902f69ca90103e6b94311d48077581176bcf17785d699b6674039736eeeed2a6073f3fee3f3d7077f7fe1902ccdb3685a37f7ebbfb0f3b0d8a4aa39f0f8ab165424305d278eece29eb0ebad10ffbc4715fb232e2aa9f545bbcea1f5501c4207678d5af78df21dbbd6657f382a1d0afc09528247ffa2a00e1cb6d29366dd35cda1f80fcf36743b231fb00dc4000f269a31c33fbb3b34459fb0064d5f7bd7477e9ec038f99dd073eb091523274d1bbdb03c230aeb9cc63c5dddddb02c1a9dfb8acc5e7b5f38aa0dfbc78e399f5f8fc382c2727272727270789d78b27c7e7d55ac73aa78d1c91e9ece0e0e0e0e0e0e0e4e4e4e4e4e4e420e1d3b11c9f3d383838383838383ccbc9c9c9c9c9c9e9c1e11c23f408283be9fcce8aa76586838383838383c3b3d90c8767113cb90de7dcb8b383838383838383f3d3382d3eab9e9f9d78a28edb50103c9dfe57bd43dde536bff248433d2ce19e23edd0dc547457cb6f3e1de371563ef4590fffa1f7b07cf7faaf1fb6b8f8505efba27ab621fded3b554ddd8e3d554d91eda92acaaaeae9aa2acaeda6a7aa2757a8a62ba86ae976d4abb5f5b602f12ad5f53dd41aafaa2637467502011c139d0500ea2e1fd8916db65239a6469536feb35af9d4b476fbf52f3f63c6f7eb9399615fe06bc6ebe57b4d095b896ecac71799e26af0242cbebcbedfe3105f667cbfbf21d278f97e5fd22d1adfef346a8c2f4e86cb3fa39ae1f2bffc0db1f57a3919a4f747ffe9951a6374a82c2a55a57a95904af59e55a944e4ab64ab4a1c20b6d93603a9aa9250a41199e33ff246c24aa5d310ab968a421d7159f15057df8d562bd13744bc2bebd21dd98ef4b815ee037aaa3a0a00090c80aa822ccdea93188eb31ae62c4a22799efc915dfec164f483aa8a74764435cd6a1f1f4aa4151fbee75462550db554928eb356352d0d449be0dcc8361e9dd28d3599a884e9fcc83099b0c858f9bcea14f254f50301504531aa28e6acde61a93d5491778e8dfb6c3cf145e5fbb797b06ea9be5fd6748bc5c3eafb3b956a235e957e950e460d3d01f2f02acffa55e5e1bb934f86655f200f1f3f191ef8aa2a5f151e2cabc278558da45f55514d8b603a271515ab7290aa7af72b9195aa025b5455edaec87f3c2661a75088aa2ae7a92abd2e5475bb2ebeaad492f755e55555bbb2d638b1839d0902bb3b489557bd8bef502a2f6a8c315c54be5685a262f25475de95bae9503799b36cad11d9341036c46273ba021882aa7f55cf89f795488befc3ee88a85689e3a28a60bdea4d165f542816c0105411c1e4ed503c557559dd560973d6d7ea2de9567bbb4b7eab60df49118c3f14d9dc56f12d5df6fca75b2d4e9eaa36ca53554ef15435deaf445abc8bea2ad59750010c650aea94e2e8a602a568aa729f527b30aaae4279e4f69fd4707543118c062ffa28dfdf511aca9bf229f1e7a3ea8e889a15957a53ca86f17ff0453dca9b4e8faa2720fd14c526d1ab3eb121fd4000c260306daab2577c439a3bbb8f5f11d112a196e47da965a3da4306b48c45df1612df93d54b6d0fb2cfd5d4f63186f2006956ff569318a25f3b5d9e57ef9482348da6fd159dfccb3fabf46e200216161617ca2d02e0b0877af985cae54fb98c721975d9e44393cb2422b8148d2fa4676a8358b3bd083e069497472855ca26197d8aede13171d7f4ff5d930df94519b81aa937703524483e3471d56f5259047c82b844e3f81862c2623464649b4dda2743fa075dd38f42ee9a6c49730e3770b5efb4c81d22591a6e80bba207ab8c40885e7e324088ec6b2e2e2ef44b41175758090d40bae32ecef68d0b4784cbe5974941e7ceb8512685d9edd86b9c95aa74a7e7a21fc1c6e91bf097689c5e0de91612fe3da457b1e39d900de9674f37e2981b085a4a068f73da10025e8da18ecbd3c618237cc0e51e32fe4234cba5df95874b4a88beaca45991c2b425dac54afaa3776fbab5d91ed24b6c9677381780277a0ae9649b9a5ec5181b768a1da3a02e74fe9d280a3122f647cb3c973f23d8b28d92e6c1b273230d33bba0eb6680acc3c2fca261d765e7c9ca77ab485c60fb1ddaf7cf6f5a22dddf39413f2b0f3520b9a81ba5b8c1cde56fb329219aa5b55eb3fc5352da8d0a9016a1694384d0c83bee4f7d1a365fc022e38bf691935206d12b772983169757cb113c84f4f691b210d9be3f1c3e35dbb355975b23f051295308f5e1464af9b0d45d661a44b08c7e3e00c9c72dcd00f452ec4ce2969e85c088311e00dab05780dcd233905b92806886811f4ad4d850400868858990794dbe0379dd7f84fd113ff8f1926a8cab91fd16d5b00357fb90d6d3d3d363128469a6774e741d6feca6c6decbf8e2da87a61bb59fd145234b8bb5dfbb32c973a32236e4cb72b5ef4f08f9a0f7beda73c3b8009c2d11f4d76cbf85913b00ffb6fcffd5a456846bc113dc0a9e78a2e35600f2476631bcbb94736add84c401a3cd4fec67094a29a899caa08b2fbf8b55a6de30eaf8d4c892cfdaf181e7ca19577ebde17f1f63c88f355ecf0aa0643580fdb10ac15703c3bff29d52661f01b702ae05dc126e03f27b0ac04863fb50f648dd105df9a22b6d0a07110eccf7212f1198b5f162a6a5ce8a1ffd8bee5d02ed092df016cd26056f20430d7c9a68c293f086e94238cf31d3b1a3009b166890e20924f096803d6246014e7bc20a2447660e2a640727b8c2074f500114e220051b9a04524af927f92f7fc5862bbd2be5e946299ca0062784c1638104342a4cd75a344de36e88201b0218a0a0060fe0a00db21ee94fd8727094a606593832831f0881094c8c40e50a53a400c9b6021dc46083209c000a43b862094702921410e1866e9c220545b61794d803b71fec0fdcfe6f10dcfe96aeb9fd301d82db9fa35f47b75a04b75f02fd47b4cf1b64e9d42bff18d700768c1f82a5d3ac92a3a51c099e795c8288ef31fe105a6ca120088232c697c74b8041742ba4b1863c4217574250d5ad66d5043d5068c655f7b77bfe8fbb4332c6e862d701affa2703722b6d6cd93a207f7fdc5860986ef5850962a55d2767cd8f2c3554a91b1f1569d0488a343c53885bdbc78f06c832e66f37be8c344a2c637ed46e7cb0eae8d5fcd37c2ab221d5ac023813804c83616cb9c6bbd38665cc9f9e2d310d1682821863ced40d5f61cfe71a2794d8ce679b595371351f54091057f3b9f9db7c46c1fc5923155b4ada86710a77fe7c1754b870a1a2051595165968d142c5a352a5b0904aa55c212505650514eaa4e47442a9020aca09154e4e4c5330994a3ba59289144c4c485120914650188dc02420287a824814724228f44df17d9e8ee7754de83a101340206e092f9fafbe33099a76e7bc534a02c417f701c4976e01c417ae115fe6c6dba6813ebe69ec3c4ad73f0289d18649dc9794fe2f57e826881a93e78aa8e4ce97de9f4c7b0c3e81855ffee4ed35b50fe553b9c9dfe426e5896a1bdd986dcb8b27cefafb6d28bf6d25e2353b44af72f4ca9d885e396b5acd3104f3104f04f39d2c010a74eb08f00af0ca774a617a052fb821487d3630706b2d85e43ca059aea30b60d8c2e394043e6c48f1c72a7b25bff9dd25b3ab800d530a2b5081bb380a828e2b97306feff6ee6e7777b72bfe1c0ae07fe905103c9d72b4b4b4b4c4d98c419fba15bacfed50c256f8db6940fe66fbfede690a20ff759d23502859125bf2e3536a73d3a8f4e6a6d18da3206feee8c65110d779d4e33a90d77d5e482445226f16d1eef3429f28d413679ef7893e1b7c4111894707498f153a48641dbb3172d3c3a3e4070b1e253b3159ccddbdc7a6877a273ac2ed2ee59c9a9c9ab66d94721be53810a8eb3c50e779df170a89be90480482a311091c91482626a592e9449e9c78f389e9e484823aa5a0e4c967832f0aca0945513424dd4d5c96e489ce8c472709929e2bacd0498244c6e3d3c35385929f2558f054a16447ba8927bd54f25c9a248a8927bde44937993c9727f28492289437a350d24d9ef41397281295225352bc3925c5e4493ff1a4a3a0782e4f1225534e3ce9289ef4d3c97389922932a5922a9537ab54289e7499225352d5e284d249812285a78adb9f52923ae25138145ebfc31cc76f3ce64cf8108779cd921f9d194fcf1556e8244122eb9bcee9581b6928ba48dff4122da46d787c7a7e9660c15385921d8e1d61232e4312858c31c1431827f638c37e28c042b846f65c410119753e1b7ca3cce567832f11bd92356c7161e955af628c4ea121ff0f1f7c3fc5f448d80484e0b3e2d2f27c8a3c99a5e750806cc7ad0eb639649fc3ab0e05e8c8b1f33a98ad8e1c3b39a40edf81893b6074c144569fa28cb52dccefbabb7a0f782b48238b05e4ca9f49e24a09fae93d277771bce5cc6723604841b47fc61890cf9d0fea610218827aeed4ec6c0fec16dfe9027d54e1ebce2f756b2279966977848c18e1082b354450430d7ee00409a070848f20e8ee965e0312ee76a3ce1a7e56c0e50841f340e7831bb4bce9a24003cd0d9a34414f27451b6012055a6b379aa66930cec6051e982118258104488e5cbffea71e1d1c20e99cd04112e1ca9605ec20dcb78b3fcc4d4679b232c0f85a95a147b90f41a0077d83e46ad27ed7b428dd42a1862864724872a3144ce8b0dc2893c3096e278a2ba1e7025d3e58c612b068c2c72589336efc81f280310996c11f0e80061096c12d9106c3584674e578a1624b7bff16b1b5bd3be8ba5fff9348836b4851146970142c83698c2defdd3fb6f4ead57259089757afc0e06d1a259974524a29a594524a29a594524a29a594524a29a504dd3a8d0318fea5fd0e7e78ba4eafe51dcb3a9104debea7dbcc427c300dff0ffb26c134380a2030a6c1392cc3ad172ec32c186a580a71c51faa7ff9b92b5cfed116388a90b570aba083f8c25188319869701296c13fad70f99d652ecce0c2854a1954545a90a1450b558f4a951a432a9522869414541850a89315a7130a1850504ebe707262f282c9549a954a265d3031217181441a6d613402ab004111152251480ba1d09785eff3783cafc342d781ae00027156e038aa84d2ad0adba65141d3e614e6bcfc514a29c417778f427ce96628b4107cbd6fe000861c5dc024bdb23945fac1f73e0441af724eaf401bfef51e0441ef7d8799db6323b22898651c5a8006577e2c82e4852be91b609cc5f66bf71d27aff75ef7871aaf0fb3d96cd622a3450bd5b36cbeb5aceaa072a1526bbc3ad4be2d355e19b5ef168bc562005849d5fffa30bdc15860bec17a83f1f0224507fb3a3c4cf350e37d51fb02a0c6bb52fb6ab3d96c160306ea45ab5760f7c5c3b426731728e6acf92c1b52ca624310b4b23bbf5bf5008a81622050ecce3f7d42f01040f92108860382758b879f0faa69d70e3f7f4e1c1e1ea65735de1e6adf18355e18b56fc783c752fb7ba81a8cca3fee8abe3a3df8e2fd59b583b1aa4c6487e7e17bb0bc1a5ffc9bbbbd3966cdd0ea79a83bd4d8ac1775a5eaf0ac5ae77f8dae52e3ce6f919a2cd4fc53ecc1e2ce2fd53aaaf3c1f9df7c2fe7ceefe68ce2cea775fea633bf63f1fc08e8dfa09d1b75a03905611a77c1367098efdc3bf7bedd74aba9bbbbbbbb7cde9e3766b6218f9622dc6bb04f388d4c231e7b9a6ebc9c10c0701a994f18611adb5c72fbe570fbb92080fea00fe7ce6dea4670efaf75ed5f7ffc8016e1f654c26d930e8324ed950dbe2e27144000e787db84b96b83f170a04fe98d69d0c885d01360fcd9646c1b6fa0e7368e08f8d588b2ad23e2e1dc2e015114b9db779124777bad3b1b54386a1f22def7ebd5ddddddcd410176cf255cae74b93f72b5e89a469ca53df72bb1057a8e230dfa1cf75c0fc0307575b8215f6efb8a68db9aa9d1c30778790d3e2c43fb69c45dcc86255c0d0471b8da532597da905e90368dfc00fcedc3eed1be877d7a34b7a2595ac76fb33eeb95a68d54bd027d388d5ced3beda7916e41318fc417fada10aef61d68fbc6b159d9abcfd25eb1d636db8d094fa73d7f738d5e695a7c1df125d6e895f6afe69e00437a354d7bedd90656d3adf95a6cf56befa35bfedae368117123d2706119da6b3f447cd9c2d8039e9cef69e69285cbffd3e273358d3f6c5d4d07d59c250c7cd6ad767f5915726efb2c328792a6b96fba4e44a5c8e535038cef3340d09ba50c3114ba46c2cd000decb6c7dbd7356d93359434157fc736bf9fe686303146eac6006eff00a6f6d3dddde577c72caed78fbfa3e30fe0f6c76e1b9b5be3798516b0a0028abbba710a1e14dc38ea7a9ae011bdf6fc9d6669669088bd8a36a4f17a2559ba15d96399a6d19e617c47ff34c2da1f7cddeee0ef6fcbe220e8f83bae1de5a8c7d1e91f2d9d736adef727e3bd40ca71a0f91d37bfe3388ee36cc8f7b341e7d3ead11a41208e4ea69fcc0ef93ef86a3e7815fad0d75c951ba770c28adbb117bb157acf91ee9861cee5077d07eae691cb3f752eff9c738a3e99edc14f667b81b3a3f4bbed6dcc07cda7944e3ae7f38328f540fcd472df7cd5f571baa0f7216ff7ddaca2ef2aed9547a9c773bdf7bee79abcc953944fa6fbd327d3bd405abd522c3dd87d36e89be030a9f34b9554c127d5f92624128944a253349f54576ec7795d057fd6f8b4cef909319f5aaf57f1c68b3b678c6943fecdfb145fef4191d7e387a4942917319fe370ce2011ce22a60d692e3f7fc7f187638a40cfabf1f2e77dc89b01764f4b238f92be1ba3cf8817977f06d87dbcf1a2fbef4f9fccf7fee158798114441fa6bd0f077dee3bee3b5eb9fedde09e72943ecd8dd7bf1bf3273fad2b97f9a70d160ed51d2c2c36e42e827cc84b3ffc3ad0144de8dc971ba7c869e2f2008afb374ec18325aef653fbd9833e67439a1b829eeb40dc144e2849e100bdf7de83bc4fe6fb6ef3beff3e99ef0582bea3f13bcef33e1c5ee57eabdcc7951bbf1bdd773675a36ff73f2a4073410fb2017aee41dc77200f54e377957bafaedc0ee4791d28b2d0f99cb7d5f9dacbaf3f388e18450419fdfbf3e2cb74c952befcc1d79fa69961d005e9df7a46a44510f71d4703f2e5ef6abc21cd57398bebd530880760d793f14271ced4f7318b1b4659eab342783f7f876753370670e70fe07a3f3dcf86dafbe0ce8612c4711c63b05f9a8efd8a269ce1c8ede1c6269c41c8750eddeef86e687687fccf0869c307dfee96e60150d2f93377dee8ef966ec176420fc090e54a90943ab099a2899fcb35608b001875a84072fb4baf438592fb1748b742be407ac5cf518e567a457fc6e4cb0cfbf8875c83227cfe56bf1bda936ce85de76c03c038850e702ef7daf36784f6dc7be5c2799db396a512e1718c2354b4611c77c518c936e49c2bd90833e17d3703147dfc6444347af8a057fbb0f46cf3dde8df2cdf7c3894b8a5ef1a72db70a507f7dbd3ea8359fb8ca877b31d858ff6ce4da47b1c777596759c259f52a91363c8e77600a26caf69ac3dca7c4639314e8752f95439a7572feec99ee8c497de7c7c24a3934cbe734ff339c02eb7f1e5bc076b0892d8c7c59d21a7358e945defbb2060c836a4ee2e951ea6bb962ca98abeeb2237b70740d246ea401ec78db8c8921fa5209273b5ef4e0018a72822e4ce27d5783bd6ea4db779216f2b79b79742620cbee995e47800866c83c334986dba65f2127c19aff7c998847e7ff0dd6cea86cb6fd61ddbfbe090f4e06b750789d4fdf1bbd1337cb71f1304a728543927c02e7245406e075c0e4097cf2f9f93c4590fcf8c8795703a6819d704b885ec732592d689710678e3c5e521447240efc3ee21dd92df38f165befc7e417cd15e6e3f23ba4f7fabd388fe22436ebfd6ff83ef96c3c4955c031c2bb72d91ef61daf5d9d82c1c2935c6e19b6ef1651b21a2db99783186a31b51fd3c431e952c6ac3289fd21843ca25b76dc8232eb9bdbd6642a6ad3d928d08c8ed98d951e3dacd6a36eadcde992a2374fc7409395c4ffd2d6f2fc127f2155e45b3b8cbcbb6f0371bc0ef6f7179f19cd2b69ceea808b3a2acdd45d0c515b07d3e4caf8608a2576c87b041f48a6f10d963b7818b8bcbebf5ea9ddb2a55ed9e531f511ea64d4c64549e63a2e36e002601a45b26dfcf30aee938213c5c4a27db3e60086e1f82a8ef2f9d50a838ad8eee46d2ac6e717a98ee62013a1b0e41734dad83f261cbdd425645c5d1ddb6ed697cd17ee3e172c31da99f6ffaed4397bbd9b065bd7ad9e0371ba61e9544bb28e523caa7589a77638b47896ac83621dfa09878bc2e08f4ea1a30dd7ac1c3872d56ab1a9d5543ff31ba92f826ea43cf82dec57720175c0d4010886fa98634b7f42ba1dfc1a66b6f876800304ac104ce8d5cb8518a1b3471f9a32f00f9b71f80a102ee8ef83c586ee943968b7ad4cb8a423d88525dd4bfb0e1a97451bf827a1decf46ac8726378f22d4adf8d16bf6d2fdf56ed63257d676acfd6d1c7cf84fa544dc50f5d6eea4535b421fad4a3de5453d10a21fad4a7fe532a2a567f544df95387fa58493664b9f1511f4f0ffed6a5c45a4fb786ec82dbdf42e5516ac883e5762faa210f973bfa94aa466a3eeae7abd4d4fc18a3b26d1f634cf9adf2f052f1630c9066752abea5c2a402e955bf577f4c4ebc135112944a84fe88d24f3dea5129d47d14901a4da82d7aa18769d16f36a4777b162034005f309d84bba86d99a77ea5bab174938861cb4cafd3b2f94892740b09f0434ec25d60ca86b4850dc1d4c9fed44e223329811ed52dd0770c18df8614c586608c367c94672234fe04dfc50880718a1e2c69407f688a1e5c7143bf7d42b0ec521b7a97cacb39e3e01e5471fb3def658d97fb6e70ef31f75ee55497b321bd1cfa42d1f30ed1838ca36f88fab7ce3b46f619922f72b91eaaae7b37fc17fa4c5cfa21bf9e4eb7e4fbed68118ea4579df55c87d2fb634674b90781ea8c679145e83b3b55f438163021384c1889424789bca25b3fb3a65bcdd775908425d70141d0b098d007a14c6dd83896b8d1547c76869180361459d791a70b9a0118ba7be5900d7ff0fd8ca046f46f33accdc89a0cd5683f5ff3de9c9bdbac1ca3d59a86c574a1f7dc775b0dddbbe8add14eeb7c0e97fbe9eed9d02fdd2ac7f5072ead9e4516b73f1b0dbbf47a36740fb98d702913e0523b438028bb1cc7b24b27b531aeb355d63cc665ddd299374dd36ed2840e250334b71fa43f03fa10880d59ee8ed0af9e7ed7953e4924128948dd83ecf72a3eb52b9c11c0f8dcafee0c5ffbc3ef111f11343764636409db0b3de8434ffbbd87f1fe3c27d5d227448c112a71497f027249bf7dcaa73e857a933ff994ef52a4573de092c289632565c31c975453288b63e5a23cca9b688c5c920d79c49dbb6306f4243f151163f8a39c982a4b28fa1f7e8f207da9ce903ea499f75b6467404fbb86a1177d7f3ef8f6f793ec4c12351ff000ecce841b88831cb2b8a4cf00cd25d90c8c2c0f5af3010f5cd0fe40ddeebff73ee4d999ce122181fc10cc073db531faa0c359ce31d2e670d666638c1185bb74b86bce9f9ab42438c58440be6649406342108210800e0444831a00e1052d40c213623141224f8e1c42a0c40a2bccc189d3fc10449780bba6059d15dfede97412c469dabb215d27add3d75ed35a7bee9371e97df79cf6dda41454fdbb4ab96ddbb6cddaa0bf55ffadae5ceedddd9fde78711dc6b968c37e166ddf793febcad56a38f9d3ec0b9c3f7f5480e6f6d3703c917471257499920f595ea3aff2b8ed93b78b1d84fb9c9be947dfe97b6eeba7d49ff3e69e6e281f72efd16fa30f5571e97f3ba8e2521df827e49fd069b485cde37daa92b7f26cb8b2e1dbeeedcae8b9907f4e21ff84fc13f20f0ccb8a2a2cb9dcb0793697571bf1926681363cd9aee142a11fa7f7463c2b9990fefbbeef1bd9af88d167fa3ed3f7e0e9f4e0bbf86e7c36649553c8f33ccff33ccff33ccff33cefbd4fc6d361eb566811c050f41b2fb15fb75a7954ebb4f7da1e5735aabd96243211f2cf0fc738c631bfda7715d46ac1bf795886f6fdf187bcf46744f7d5ad577737a9723c4de3f6cf88a5ef6e1dbe22b8afbb7f78188ccd73b26ddbb66ddbb66ddbb66d9bca67c4e8bb95f73941dfab5d45f3f4ca8aabbd6bdaddb66da382eb01d8946ebd6d3c1c8786e175fd65802f359d2c0fca5666a281d09eba8871e037904adf38eedd49d783e7468a804c745a58c36faef67e8248234619a2d7906896167a0afa6a1fba101cafe19b25272cc02baed656cc30ed96d307b557f96e50fb832f67c3ef8fe1cd003b340ac5f0b67a7a2ef45efd7294524a29a594524a29a594524a29a59472ff15c151a7d4bdc577c39f7e27c3f3ea3776eb141a51ba3afd77fad3477df03a343ac5f8fdd178a97ffc7da6f6545a7b007c375e5c1fbdea64652600e0d15afa1a274826a614edeeeeee6e9ee69fe69fee6efee9eeeee6babf94ef463f7d7f508d31ed7d1fddb66d6b6dffd27ed5f2abd387ed6a9e6669bf6d7cb76da32dbe22e8c66d1bfff0843edc9e6b9e94900d278a08a0e84d3f7af045a1ff6644d77b0f7ddfb76af9d5e9fb9eb68b63ffaad12d52cbe4bf0fa25ba5ff3ede8feff785bee52b22f4a17cdfca103c6ee24bc7978e2f1d5f3abe747ce9f8d2f1a58dc49756f2135f86c497befe279f8c7b35c61826e7d8f79affe87bc8d277c3ed0fbe9f0da70fdebbabb512494ad93c27cb634dbaaf442a3d4ccf66cdf035bd1673c161b9595149528cdb8f3edc1efc90975cedffbb616242deefbee995b15e69cf3d01cef78f69fc86e8e2c8fa892ffddaa350e188dbbe3d9bfa216fff8ce8b68d3146f7d4d41b7f374ebe457ff2f1b371f2fda290e845275d8da152c7dea846949d88d85c18374a91032aae7f364c9f2874f2fd7d6277982c8cf5c177f43186a88640d4b82d9b626483e895e6a21377e22cf66cf3c3514d5b48e7cf6e23d9203dfd6c9c7cf7f4b3d115e53b94e7cf466a86efe97fc8d0839f9ae1ebfdf733a2fb59eebfcf88d187ec8f7ed37b9f11f43ffb83af6743df61b248f44a7b1f7cbd518dbd0a891eac617cc3d544d647afb40f5d5e359ad5afb5d63095cdca0d4b8bc74b2aa8ca66c99a07b5d849d38200eee8e7be87bca0ef465bda4597cd7186a4cb4211b8425c1297745c02dab9b3c31a37f2d00f5ba817837f9c35dbe5d436ca813aef0b89c011c9a4643a4139a15252aa162a2e6680375edc1ef2de8ac80edf43953da457f36354168b53048a3b714031504c7a306a0fdfad7c323dd817a8f5a07dfc8678e1c5a82c2c1fe3fb3b160b0b4b84e95595eeee2f3fe3ddddfdfbeeddddfdf5ae7777f7d18bdedd5d88e9ddbda75b3d5028efee48bad5a305c4bbbb7b8f7ef71e2e01787777efd122f5eeeeeeee2728bad5e387f71ef5dddddddd7bb47c8f95777777f7956ef580b17a77d6fbf3f0c9b80068f8006a702f33f8646b690090dd6d0002a84183f3af735317ef4b8d77c66cc6ec9bcd5eddbbba5207ea6433649f4c36f217b989e855e375b9466e62f22613922824728d602894d1a82fca84d20202a42814455dd62f442f6adf8e1788582ce61280107d419d366d91fa502754df160178e1a552522f6ae7a2f6ad35c65ec46231900b1517b01730186c85d3a1f65da971367b182baabdd05c6b19ab878d15ef6a7e8c1a7bc552e7773b7830aaf63d6cbfaa7e65ac5d2d038d9c8e5cd6cb21ddead17ad7b3de97b4ab69cd9542664b5c560fd17f3ced72186c06eb61f57079209ef50e45bb3c1645cc91c4925c560f931f3debfda65d2ec391798cf52ea45b3d50de7445bb7c36c36289d7f4b07cea59df3a4d7740d63792003c4bc662456250c4a2b8acef18eb1bd62e2993b58dac6f644b7cf81f9ef55c45bbe46c66c5ec8a19163c2ebec5b32695b19e9768d7a44340262eeb190a19dff2ace71b1dbefec986f548b46bca9c35ff64055805eb8968d79cf15879003ceb8778f13c7c1865e0abe5a4024b97c5fa55bb34d80a8c8ff12c560fbf7ad6afa40c0473d6fc9757cf7a067317379bc166b0192ce62e4e268bc962b2c971ce39e73e7317c739e79c4b98bb289554522a93c56431594ce62e1a8bc962b298cc5d14069333989cc919cc5ddb6c069bc166b098bb36992c268bc96232776db1982c268bcd99bb36186cce6013a6c17c3ea520389bafc5dca5c99c753a8160ec4e0ab6ccc5df620d04a3f16267bc2c08d6b12c08f6897690c9bad5216917a87b98fefaba6abcad596b269acd80f8dee57bf179dfc334276b7132112763c946ac3761ad88427d81a8f1bad4be5c2c16e36226d3a3541d4620cc858399b038588ac59a90603a55e365a97d4d355e94596ac69ab1cc0280aaa692499692b1642c32ef473909405f1aa3b11f7c70813aa11ea6298cc2288cc25ab85049a5a4e275513ba6efa8d4ccf794392b15a21901008000008315000028100a07444291582c0cc4549b1e14000d84ae526a549bc79228c8618c62c62043003000600000000004a50d00a231520520eb98887537c9b4036274f27c49711e99af198e8ca9b05e813ff9b00280625312232bee4ccb664c0f2341861c21063e4c2de92f4a84e7059f16e3aa700898e0a372018a8013851565758c9d3a637cc7dfb56b63319b9f69821c9941eeea3160e2b4e0982bd078a20706b41a35056841fb4c39dd6f721c07ecdfb75757b0246a164694e5c0bba1961a9677d80fbcdb909da73620a26d09d75bfade748b19cd7576a13c11374541c18f931b6a54eb2c07ae01cf864c4e20a65fa9ae2f1d1157f8f25c23ca33e5e1eca272577530754d0b0b2d9ad2239aa4cdb6aa715ee1ccb379e38fe4cdea61f73af7d209b4f9a9a12881fdc8eae1a86e6f4d6ff3f54b4aaaeacd293566cf43ea9210e850812a3ceafa4bef2719e9c91672933ae3ed2a864db9f44f340ee1e86fd2f79b0a0f30284c39e822620b5d80d09b80896a7d18126256cfbf4837554281308d7716c2a4c2c85a1cb91c2c0cf9c0cfc3d7b84a63255384a9ad75e9d2ba70067de5b94c062e0bdefeeb5c5ac37e2bb4cdab1cb477dec6157abe72370f6e91520d8ea6fe4fc46c203cba1aad8da12891e3e7cad99c20a8fb058e0245f5b9fc8515614bdce70fa63b3f7bdfa8c59f8d6911bcfee2b33b83fb881830904d98c836625f7a841ea5ffa3491d976cbcec4ee58ebdb08cae21c5c97a0d1c1bf01fc6f98bb6699a6a9814571ccde219115308fce57454461c1980ca7cfef43c3a35b7680fc8ee27f3f09aca844bdd8d00566b9fe85e68ad1f1e9e755a0a3f258454842438b7f6d5fe80f6dab68f8b3ff7c5b99cd2c1db4fa52b07a38abd5ec1dd2487a8d0771db2d696f622bde84f28a182d93b3143ef505d214a2ddc6334022fc0dd342eb356b168c3f9dac7a43a573434c579693f0211ed9234a3d452ca764b0ef660193b6929bb4305a962f6d7db9ea460c6a0d13d930f548ca0c47a5abf6846fc4b08620aa4233cacb901c183b5e36f34fe8ab8323b17fabd9825c59cf30591076eb4f1472466f2dd454708e45047916ce86af8b2ca82cdbe745cba2aa6b1dd1a0f49e0d98bd30e8e8851f7eda0f05034d52f2c26f4a11e21eda5befc36c4d14aef7851af71666a70b46889726d8f5209099210fe9e481952aa3c0a13699a9438e8efbd442b8f073e7e98a9d53717af31112b724f090bf4fac898746700163914134184c9b376ef067a74a8fb4f1e584848af590127748957356b359ee929a8f1bae4d11cc75a8a4b9c84ab4a0c0e54d4f04cba0862c31cc7db767e55292417cef8c5d321cc67eb1db98b1d2ee97e141f01a3f8f3efc66244d7e44f880e222a52e754563effb4c0d71e224e9921d2a95c218dbbfa1259aa43ac7431e460fbfb016761fe5e150f6a1b324eeee308297ed3555fee3566e68be9013600506120fc3a1d686a2f8559ee7056c11d8dd8ef89157f1e95871c2b21dfd96919a87f44d948868bde259ee6448d97b7204a9d6b10a5e1b00078ac88604158f45f1a9c12f3081bca8a8ac0ed0401c49d137dbcd3c9534e6cb4ea52c888d52432598450ee489dddc3d97a4d77a807bc4dc740c836d91751ccc9c15c7c92839e93250a1843cce4d95dc52848df8619b4dd6f7d4030b9d207abd5023f2cd02bc418b125130073f05dae4de134056a603e7dcfa900841e5fe5f32cf20d332fc8ab955d41dd13b028173416a60ec90c4cbb6f01a1d0c3dd87528d0b4b142b5390305e6c8cc2d568e38dc79b8abf0d500f644a8dbb1815d153541ffc9ea9131b6a90e179ec5f6beb963c907cc5b710a4eff1ca18c63ebc53063412483d55098559a2a2fc78eea11f5defb778283218538223c44bb75a974a783698e9ec2f91ce0fab8aea2ce215101795afea022b208695722bb5d0daebdde0dc09d6bd4b57f5b19a8a6ac312311e54cf6fa96e3320b2d654abba410f7c461a110828d59173d463419feb9a446e8b00d4168749d178bd704b34d04c1e3a65dc881a557cb0d769a614919dd1d6ac3c57c1811de1a255907afc3026ea71777447c7ec5b49dc23b017c433988f9096f04e4bdc1a59383b1ee747daf2234cf04a2d2988b5482d22bcd5d08537c4cf28536fca795c2ed3701c7e3ecd4497036b84dfa230fc4430fbb6fb1080f9a2d012fb366b7b5157a922a1695e5095740707787fa4cc9d53d8ed96a552f16ce60014cd417e12da639664d369d1d9907c82a28bd33819a93d8a7d497a148d977786ad2b0d7aeb547d3d9c1bea968fb6e9f65ff315e440d5715e05a4859dcdc6bd6aa422f5161472e0a21a76d4d649bf4c9238f1691bfabd6d50ddb5cb47133e2490c31551af2290869b860f663c0f3cb098449f9e0cb1d8ac51c8530c72539af048c45565b716c22da04cb0de596939ccfc817f81388910fb535c88c82bfe127ef0d914b623b59c40e1dbb7420cddf5aaa1f65fbb3f00b64a056b26fe49da369b96520bfff5b27673366db36333a9bba85bcc4a313dee0f41e54bc792fbe9cb59a7c9bdb90d564315078901e1428300ba4dbb7021a2ff5e056ddae30a53f3597fd103e198218731cfdb5fa89afd249253a22346f114142e7755afd9f0067b6e39eb67d133d16500f5eda30047dbd0d6fc09e0beaea0bcbe924d0b58e1edb7c2ccae1653f8b75cb7f47d28194bda380fb3cd4e45091e03362d5587d26d966f9ef14a826cfc1712da7be9db45d73d44663e7c64dce9a503ea8afd9b1bf82368a52d137a232cd643b825e0d64b142b014bb6f35e57943674eef6c4c825d9b053e2eb3389aa4f6510126281154c7b956321bc86c28484a1354a53dc61583d8760426768d0a89838b84555c1087cf1a72d0cd226464b0c80305661d171c56f949c32b6c5061587a0dfea248e9b71d3b026d91c94ff9713816c6c444d705d3b261e3d120dac619e3034e91a66905b21dada5e5060141c67bb49a35cc8bf9414fbbea6c2d83dc45d85f423c8ef0bf121afd93467540e2558782c4829481315fbe3cf2bcb6589ba0b2574e7f1afcc6ec3845ea3a4eabbb1f4b59ad626c244a920e6833730c1042343944608d4e3b341007f80bb19bcc11e5fb6b4d65a93381e50619439ddc91e6ac8f9faa550f01af17bdc80fe3571e65fa118a4143b3d9ea2e9ecca1c2d7c56d3ce53414a22665a8346cff569684be4dc0572b0337837fc43020a428d30ad41cf5c7012f1e3849cca5467e87690c32ea3fa74fa288065b04c2405d00893f41ffe2aa4dc2ce644068cd582697899dcb4a8e00443d80121f1613a72666f3dbd3dff671a52a651bcbbbc4c4d014a51429cb98b0cfa31c7f152d095a21ba009a938977257d75338afda82b15e9017e8f795e8e62e656755bac8f21b2b65e5675119eec63f3f5cd7062fe2917677b09f74f9a037a405c01d1acbbfe8af5385b7a0a84a31a921178ff380fd6854ffb79daf187f1aac844c04347433721204bf8fb2ff20810a3a8860493cfea879ab036a86d96dd7dd766dfcefb1ca929acaed67d5ffbc48f4e9cbaf6294542648cbbff0bae16c0cbf49763976dc91a8bcc9c3a71ff4ca6d7adc37c2a7bba0647ea8ab10ba813122969d71b9017feabf07afbc89ed814628b630ee6242e92a5b52e05929f9385d65660ae4ab807dfc5b371448571b851847fc7305a879eccf5391f4fd0e355e49e57e47af519ddb4602544babbe3dec443059d0aaf5af1dc1dae8986bdfe811183bc402a47f9d624b163836fa1c1ae3c30618b4e476ec313cbef505565368bb632384b45216ece97efdd4dcadf311965fe7afd6fcde62181b7f1b10c10d248db25fb5c630abc370bf9deeff6f87afc25b5c05c4218035a60093b403d25d0049531410e3511488ef1888cdfcfda9f2f41e4523737dbf37dd5687a46c8b61d37830366fba7f1debcda535cd9248f1b3e9209d5d6cf8b9a06d07158d796efdd2620d2a0518115b38721af2402d9242b28d7331fd6a0bd45b4004d11cfe08540a0b4c67c3de11b4a51c81d78b1239ad1e65c116026f25b7dfa6d47426c2adcc064853735adc1cbf99f8b9f7a77ad33d88ea42ecc9d4a15eaac6edeb5ca6e6df080463212147262b8e56b172535633eaa8e26cde1bccf5b810117564c9159dd6253f4b7533249e7054206c548b24397136af6c509a67e9a2ee91485d9663a6bf26a8f88e90fef770b519860b40e7215efe77919c60c2edfac345024303c5bd54fe16e719ab0abc545ae9887ca87c941e1c5a43e66486c531beb873468322d2d730e5b64f6718b583b59a3e3655e7095dd2e8629b77f9986dac3c79ea427b07a41a1018645af5b37264905d626dac41c899de15b612b7c7defbd110e18dae12b11779f1690f76ad846973ad57d77d70e8757a755c4fb4f815b75efe2da7eb737b22499eeb56951838299742d7aeee509a79db2541ed394b691a83888b481b4b9ea857cdf43225b31399105443352ced27bc516866c4ea55f9cf2dae08881c9d749aa358d17b6f8022fd386471a8ffcb2481d7a26a2b73ffa15e13f94066cd10f2760e7b31cb3c95ac13e3071ab60166cb1ca8c542f4fc6f201d1357794d8114328c5688f09db1815e0bb3dd145892621d2628e5c53f17d74ce9ff65cb65fcde01d3e61932a52168e8be57e2f6b10f365ab304bac3a150646caba4af1162a87285d4c4e8444ac10a2510ffc586664f77afa9d47fac2d631d10927ec6b6635792b37c5f02a0f093bfff8e29d295aca5c04ff4c3ca904d77196d422493f73be89e590111fa84fd26ea36be1497af42f9495bb3184a1584771fb4ac79dde0f655737e67f4d14d0ecc844fbfc5928b6d794f5f1a8a5419522cf2b0d5209e2d8189c91666369114735c30bdd2b0368e8a83d7f3dcfcff2f633cb711320f3e197bb2801d9ece8a7ad028deb1808e19b34e539853937fec121f34e4d2a7363ab0a82206c0032eda13bd3b90918d8870f8d1985a6252ccf44982b525825de133d7a186067e5165e58e010a6b8d22de0e42a863a47102908ddd1323bb0c7355637e45a81ad07a1e5cedd0e92115bf14ff8fcf30739c2eff275b8add89ea4feb5c1a463e87d9093e5a0c877777a071605ecbfdebb170a52502369d87cb00a1dabe6ff313cc3c5c420ca6bee1bde1114031827cede2e6d1852c8d12b1401093fc5090e3c2a8d81cf54ab092e2d860f70fc93628024a21d429160912b4fbb65871e4301c8281975128e763404b5bf7396bfae798351a2adcf85592c49609f5ae9f640e748a012a5952efba1203f67752caa07bfa1a774d116581780b4224a50f4954490f12a9e4038955e2c1c42a7d50a24a7990a84a1f4ab4120f2552c987121f4a2e3aa01b12418ac0d8c0a6c028e103477dc8f851286563cd9a69742953e2ffe46b28cc086c735f533577357720c4cc26089eaba8b6502aa2d6c1f05486475fa05f885c8f0c1bbb17b448043f6668f5828e56c8bbdbaf7e88a3aaa7ffd8a572a166c7cdd4bdfa4b15e600efc5fe85649c07194ae512c665d1522a9ddf6adee49d9e4b8a7047b06d67bb1d63565493b40a6ab3c6efe65ea179e388ede8cf706db7d8b16e4a529fd4cdc996d136f1326a8d1f10acb9b28bdc2656f66a798dfc23986e8c74c224cf72133df775774e13a5a9be0682ba93ca7cbda7cdeb252f288079fc1cb92a4cf31ab700d91985703411303148e4a5eb024cb396cd6b8820b6bf05a5ecd4e665aa0d76a6bc463e226b386b20a26ef118e6e6c9c630ebc0baf44b7f9a95d525af39580827da98294edb4bfc313bb8ceaebae8beabd63cc4d8a1bceef379b6e8b8eb28da08673e63f1d64c50b0790dfb6d4ac562ebb2f7c91beb6d05d88272dbc6ebd6da616c33eca58ed2d985fd0cf648954d108fca7e2736abd6cd27385f0428f06cd1a16696b49d184843e94cc3dea78e60f4171ce6c318b1d61dfd9c21d6cd7deac9b5267cad4cf5e1e82cdacc4d7878ebb8153d733f112ab12bc08aad351b82c1910143fed63f8d30decb6fdf0af988a1eff2ac6432fa1443ed52edbbe2330f13d8cbced75a0d5d689880e4c5a5ec9f52da8ed2f988b98d20270fb4fc10946e65fe61367d3182d90faf97b8a1eec8eed60b9e5d713863ad419e921de8e8ccc31219998504c8278e457e18eb32c87b53277a9a7bb52ea5651ea661ecd9b5561d1716cf40beb4299bb968769c745b391f717a5caf5586ae697fad0e95be2b0e3cac76b0b7c612d8e5c0b1ce673d04cb3f9bd0327a2ebba46700d969de9a703de4651ca19522959a489b054caa21a774563f0521a358827eb476a509d5e14b87da801fbb665ff25daa542ef1ac91a79d2706898c7d702f73210a5c6356865612bab01c7a590f95e2bd66270c8d3b82e4e3808bdc266be684d2ea30b2dfb730ca924c1b24055c4ae7479d44a26cb96eeeab6135a6214550b0873b4b9670bf4987bca28e7979213a1dbea91b1260072b8a489840ef32ad75f0a1690514262a8a41fbe2cb1cf4053960f983a2ccc3fdc84515daef4cef402bae053497e8808d62a2eae14fb4e25250882509c52f3a719056d5d8cbb8abcdea3cccdd3f852e11c9910cf809b14db0363c39d8582fab248918c452a7efaea3dc5a6b722370f4308a20d87dd2492c165db4958cf4c21db6652dc9b22cb5aa23b22c54205a905ba86b5a2bcd487178d646a1e6ac143a20960d337b964e7875fe65a3a11c0cb6f6187a7f39193ddfced7ab264cb072c1357b88727094182d981a710faf51169f1429050f2bf4f6756fe3ea9577be13604ee9f547732a2f69e6a461e75d47852d78ffb81975d97ed3632594b3ece261768a1ea5d0c5e1aba1be3d252f1227db34cc0adae451f8ea208cc3e7b82949982a3edf201fd78c9caaa47a114562091e25c65070f3ba86e70dd581351aaaa89e75449459071683c9c329609b2639c544cddc003a82cb2c215449adb440eb062e1be503ec04308a217aa0728dcf78e0fb75ccf311fbf9639d3c3f9b998d172e1c86c4855e4b712233a2e7a4840dbd99a1c7bbcb951c76eb3a86c776ec7cb0b9e51d307ec9a028176f63edbdf98f5608cadcbc98350987cf990cec24478b1eff10836e6e39e4408087ee50b1a4889bd6aaee96172c35f31982fe24376bac3fff2088be42f610eb679077379829bbd543db52bf06c756fed747dedb5c6d18e5015883850608f689e8e0e38e7b6f73eb0d0ed8957d9f1a9a951990acab77e376303ed933ef137ec9792838072eec2b348f9587167a7127278801979fa6b7c41ef0c2b652f60ced497c64f398c87d21e214a41795323892187ae9fb94117cac9552dbab8e1b320d1e375352f552fa42e6838fda1abfaac4e2a9cb977633999a4efacacb04f24d59bdb720286baf0cfbc924db316faf057ec5c02fb103724d4df2c2dccff9b29a47eafe796a8893ee3ee93189c6f1c163b6c6bd486db0308a257d5b1ceeb825681b2d5bb1260dcd261e3dcddfce50be7981560e324858084c8eb184533efe98e7c55ba62802cc75572e03684ba9e27c11bd59fc1a189474f192401bc6f4a00d8423d838a8b9b4c8108b44488b2f3f27769c4fd81ad49d5db10a82ccfb97318a88b5096321247d2c968cac4d6467667fb6416179349600c0836a5ec975f40b5292b3677d20403e95f6492b7011cccefbb57ed7dc52b3f52b43a94a986696e18b377bed8f06e7229e4b2dc3aa22038d1b9fc3c5c5392671c38772757a2f81142d75adb5288e9dad0184efdd99bf77ae5649843ab1ae708800d7d88b8bfc7af09e1593dc7915913bcca5705d791572b0f36d7d9f4bba32242c63a030323ec127e878be5f503ee4bccf65082bf93c6570e566c89785908a284879efd4861223596f4384204716a5e9e9a2a5afcac2beefdffa1f92604cb79760ccb047f33b1dcc6cdab0425d34722bc56613b3f9bc612903b1b96ca1f80fd797dc36a62d603920ed0faca156cc235452c4065d3e43ce7fc813755c7823cfb8738ade92ad3986bb8b6687793990f7d486fb90a09a7dea552565c8db4061d8c2ec284e9a4345ca65b0ab7a86010a65a698011bb51806880a909ce8c38b9955de824e8e5be50dfcbff3ed67e981bbb6ca915b26e62c089d7d0ab01908656fa72902675ff07ecec297e4dbd9a4b5b91c65532940a13edc1f3e08007f7ec98251dc2d86f1aa2e33c03b9f83d5a00927183e307583fa5d61fad8285524d0586623a35554d8b2cd9504647376ab7cbd1f99444e33819dbc45f85deabb2af4e208187952615fe8d69025b573f616ef2119c2ebb0be7f9eb10b6e75115394f37ef1a6ec97adc57213442caec24f83a4279ed31c9ea35f093e9fd7cfd3d9c774ffce2e54f517b757805663805eebce22ee52da660bc06b91d35593b027421e66c8617631b50e75ed192952c5d923200d7523e4aeb61cfdea4faacba33b0b47aee9ce00b49b19dd3d13d3b179d00ed4e731af12f0d14d05198b3fc5802d80aa14e44cf84b0b7b07d0410cfaba8b6d9cbd6924a978aaffa3bdb6755df0b2f54c64decbdc042edd864801dfe76f892adf580a7082bbd81fcb025b7247a3a719d161c2dbe43b80720e8fcd4059804c24b941cb0fd7379dac819238fb60cb48c76ba637a1dc843ca29b969112d9c1ef705c8a3e0fbc557069d14cc54897cfc969ccdcd9bf47dc02cd83a0ee869c880632650d80100013285b82b0a803288687751cc3df7d078f36e17db1c9f6d56a8e48d7bf1cc9f1079889277d0d87fe61a00198527a343a0433df887e0df25b6f00c8d8f33a8e0fdedbad2f4fa48a512b365d558727fb021378caa391c9c0756130c4063b24463d7d34d867b106fa623816d95e8cdf7dabe2a2362eaf46c4f48e8fdb20e98dd54c1b1391d4dd910ecb2237e7ddcbaee2379b371e30b4fde9a6704c22c6f490c7903c77481fa0404a7d1752b6907ff986cf2592164d8510d7ca8c01e40e00ae328f41d23fedc9b77cbf3fa1ebc1d833ab34e622541ae9baa1cd5dad7226367aa270464cd3b7c4ec5090da248c2191106d2c989e93fa96339dc83377370e797019bbe59c3e236ff552aa2bf11e2b5442beeb3faec38768444a9da1e2ff78f8e08dd15b383ab24f8d25f2d808cd05a298f2e0315159e75db8bce71603d5d7bbc7f65ad69ee7baaace40e94b372e001cb81fa8010749340366f4741cacfc10c6091bbb50552988469c6f15bacdf038e27d3de158751b0a0f84f814e2b6c846ec4fabc00c4c6554d57cc94495c5a1cb13142b230617a124f2aa233bd9034d4c3c545af368a2bc1e2cc883c89fdf9b3f2f7e793000c5913d729afd22ca09a58bad1c27e672a206a0f4be1a097be22b3d88b4a18238c0ac39f0a6f4636e794ae25681f1e9c0711f63618c0e57d66860b9d74139f508b55829d6155acd6a9ea87d9cc8c8caa61c8f8145f1b62a443eb2d3625a325bc089318b64a819bb346c6a120ad6dcefbce48094836bf400269d5f3a4025fd86242404fcf939d4469fb7983607d86dd94e22904682c591a6e47e386bcae2b0dbeae79aec6b4f63d291f6f6977173335d785260347fe756a1601c8ac1867284e53976ba44fddc3b2b5b60ab251957444947ce8a116c711b5d16916080c798d97a19d96da36e64854c3772879a667aa253a2e5617a11d51d92a339df33880c311fe239aa51c0aa2e368ed23ccb9fb6da2af6802993c177094545ff50020bfb807ace14c4fb4795ae195a49246ec6dbdf4ccea0a70aaac535caa465beb0b0cf1228bf1510f904a3ed4a6f640aa67ffed850741cc731e16890ae3164171f58de8f9e66ecd3617f12c5d49e7132c0976661598c13384dc0c15f76ad6bc64f91218a1a5d39b1c32f18600ee9cd6c8d2acd0ebd5c29ef56d01d269ea1cd1039587447d9b823ae75c216eafa015902a346362a2076cc9aafaf93a12f710800949ef7027da464e7230a94063396494fca7529ab445de5dfc20ed0e5f805b3ea5eed05c231eeaa1566671b946f230579f9c1538404dc44d829920c5bd90e09ed04a7a0b2aa6b2c56429ef4678930b07f2b58e381a450bafd799ff87c513d7f4023a41f5b41bcac5bca7976891e29349e32051e0d02db67a55a219b0394fc7af96e0696c629b84ab4b4523be8523240919f6c6f2aa0f9075720026d2b7385d41ebf3da446d57cd34da4a1e827677f94699b303a8cd868191d51e24c454ef8b8dcc1347aa401e0912a4ff1acd91f0cbd535c4e95d39d98415ac98fbc36d1bbe943a9796e50b1c1ad6926e636a6779d6f3c474a1277aa852cfccc9e8dc47e02cf4134b790a22092221a44dcb3b4ba4522ac77ead6c177aa6aabdf1a69df5c15cdd4782954215dfe8c4e1726e273a5f7ec7931a53893e62bffc307d65b5e137ec08cf27400db22005132374234756d9ab3af72adb36d23ae5d822f4805e3b2444fec5b5582413c0bca586ead8d31d025c5b0fc096ada5f06e90cba484d3430d7f74ec538b435233b6166aca4a92ab8940b55fa67ed07cfbb9c7b45cd021622c1e329b1887e658a7ab91160b39b92ecb2b3f0ca2dce6c185bbce957e9ece79cebd5a68f7afc3ef83c660e0ad1765ab3852b3ca5ce923ee9b4ae72a69fc7fff1752cf35afa5b3e615d967b42aa6e8b4f281f96b4cf2a0d2208a9d8f6201261bd4aec0c64e6984324148ab4b350285f1e84b167895b405f9a38c28c0996757d0a7c8928d6ffd7d12c833ee91c411eb2a387b332a3f81410e7c185dc1b4d2a982700873f639ee6b4be28afb8121b86ab817eefc6074daa1de067e51ff16121b02aff2ac266290e0200860ea2a19ced94cf62860cd8cb5e29a15fac253d773957beb87db56593e73e919996e7b3801448e6e8d2c2ea40b9b13f5cfc942fa9926a1b306236f48cb8f6ec31186108e297f3fae19e3a8d6a726e52f6e93d0836abbf682731e1ef3fa05e730c3a3cdac77e3b835e2b2e2dc0ae72736c20ef4a9fd9f6355bb01434ca962aaef0f85287718d3fddc9d69f879f98dc131fd334ac78d0e084dc3e93fe3a9f6e8314479576e61324f524e3669c0b2ead44b5de37bb6fee347ff24797600a8899b86d37a486535af13d7d9a86a0e38f1879af21996b9cce623a5e4918476057cb836819b2fd0050cafb94f0e064804722edcc6b139e2b86412756c26fb7ca32fa8d1e675816c031ef0703978600abff2c14ba83230993f9d14762f33c480c461d1e7d92770deade9e4e30036517ba618d03dc88cad8fadca88e9a2a32c0da567b470db69656d5053a88f2683a4a05c5a149bf6b57028a3efbc3ec24b1f7369dec24f55d3ff184bd899bb93dd0c45df8f9f1de465021b14d0de68e37d1c18130fba939418cecdcb3ba617315380ca0f7c32abaf8311ce217500ca63871890c872126ef6a00106d5be059371b9f5394d932b8792e9ffd3720fc201ffcde241bb3fdd717b012b360ceb01e4fd3e727d2504fc1a8cc65144d7471e57362972811cc41e906dfb69a3488774bdf2179fd42be869674f3fc36a5ccd7fecff1d62c607443b7c49deb60be60433b07ab2e5c65b43ea43e1e93dacd020a718e1a5c4e2f2d913bfa0e58fefabf074660fd225e3a008ec56d3a6644246cb9e6c28dc7a184f56692988559e6f2e9af8d734d4a176d73b276130997634681b103bca0628bf8b9e21e2c199deb0bcd87eb7f2cadce7d74c9f2b2b1924a374796aba23488051ceaf2310010488de824434f7e32dcb06f7c93d7d79c373fcac66e22c979b4ea64dbd70dfbf920214d856000d49c6fc0ae87b3b640087d08b941b99e8d84ffa96316b6651e33a9c56c76d4873633908f318f4a3279adb8096e7a80e683984923ebb57345963e48131c36851a7d759bbef9b3424d8eae5536c6653a4478541da0093e37d0a7afe618d2a5aed826da0401980268a02ffe017ef06ba03a2d9e606ca055eb45714782547646330c050972c1b867c73cb25a8e7d0ec5311de32d5674a20797ded90ba3092f6c886ac108062e53cf9c853e849007e29142c4632be7a26daaf62019ce6be862ff84947578bb6499c587ed57389131f977208ee36e58015f7d19fad2966b11b98055dd179abbfe33b2740118b558704615d6ca230bb502a8352bc24186e6fbd3a4c97305a8b0420a8f7c400085c9df6eb3120d883a912d2d58800a7492a9280ca7281f61e4a7eae58021108f3307df080860b284bcfc476a69c9e315cdf481fee89bf4bdc562b51ea37922c94f79bbe14836f9288d6d2a2167de2bc6152600e3af84729c508ca1b1b98d61428ebe320872c3e51318df7702bab100b337c7cb15d2c059ad352de351b84cf2dd013f0f6cc108ee4fd86e20f024f443d2f93496dfd193823c9aacdeaad9e50874c9c9b1dfc4e42900beff48ee22c554da0e6192a38c4388bf5df771eec4100681ad04caecabd974140fa83e1393c945fc4830efa52f2dd0dd48a839ec26ae5a8b7d5d9a5daf4790ba3322176fccce45ef63186caaa2a4357bd2b6faff13141ef2d1ee97fae549e2ffa057c5600988f1d9305c6d54b860514103fd2be81a34302f3d206621f85069662702889b116ea83a57fc17a292b9643208e82a40e927c45ab18438b4fc9c8ea6bafc2efdc620678d55068225ed0cce5b9ea22ddfa62982f4017f2f6e1679e76e8ca51ede3c1130063f40828fb3551e63a7e8ea16201e0a36c7ae9b2074f71abb8bf7d641d00057578d3cdc1324b98420c3f752912a54a35ae6a6d22531c748bb9fcb0272104c1a7ac5a245390a19c3820f131d374ce157829b435b7b18a531e0643d9ee5c5dce37f2d90b016d30ee39efdef0703ac2ced28061689d7b22896048a5b69aaee2dce7e04e13f73f8b259c4546744ef6f0386319741260b3732b9f0b1f90b28cc1a14aa0db12afa01c90817e8e6ccc442dd5db2b4e4f5a4948655ba55012ae861286bcace620aefe147ce2c195216fef5f8fe9349630dd045cea20ebae71deff7ad9bbaa6209a547ab4604656c3b08f5dcaea719be0fa0309bd555cbebf886f3f8fd79eb31417157d1a2bdde49fe97ed386bb7de64162f1b7982502761b0099b2dbe1e03a5e27390c96cdfbee6e21143e8b53593eaf5ebc98caf0140e5f36d3855a0b1b9a620d7a427c326c98e7fd003a7c90b89c489acf39d17153fa727700addab475ee4e620231b1233bc955b732335c39a3762849bc53d1af490586290207e148ebe7f535c6fdb9b4aaa3fb889c47b4b9e7bb936de606af39f70b3697735bfcca5f20bd8a2bcaeb973da06b55cfccb67da97c6805c0af29c511f83cbe0b195f4c4f28587f6dfd5659255286545e34b95ba1ee915323156aa6c097a30341d72a45393d45c0bf4e7caf633357c0361c13a2fc2660625c6d7125bf2a8606fdba567389ce9f2e30fb62894198176d502d40e58e2f2bb2acae154edf9767bed166147a50ecf62f55027ad063b1187fb6d3886437f35d07ed2107376a789155490072879076438a15e773a255e0c8ceea332ab362eced93868092e9fa862e8121991f598b5eaeb5a32791d8843ff95120388241d31164f775c9052b8b083b524cb80fabfe013d368a05068de275f03c26e11e7dcb6ad88b6d628d87d182a3166d3671c19bb66b72e2f8980344991a8cf1d5a535e3750e4ca79419ca5e16023bd175fb3e7cf5956c381176f4ed0f0b45665359251c30a85e8d24f3038d7acdb52d84408080cb76c684318d0c4196d5be34858a953b09ad926b05a5d0ad26bed445cd7d98562b8ef7487b0cd473139f521338bb1b216c0aa6e2b796080799d8414b05632db3f891157e659a61996af92ee140a48d17beadf19a854ed62055b959694b409d192ec2fb2a32187cf39b9eb4fc2d48e1b1ac615b29260069e4f3100e4b50029c22b104ba97fadcd2a0ec0a1272299373c49fdad352655db1c689c2d3ccbaa1bf5aa879dddf5385488166f23881f76a6b9ff18357f084a95f8f877fa94e02ebd8598865a93d4b8722546c0542b72c31033b726ace01cd1989092a41d7f935952488591bb63b159149e257279d1977184bf2f21074d95f8290b4b333999da61c5dcde445c350616f65f0d0ac24c36776d5710fb464d8ddab8117b835aad5d3152200f324948e28561e09d14f0836cd45072bdd39f0fe8fa675afaf6a72f6891984772ddda289f0dadedc552a5b2fa80d7cd0668576ebe480bebff72ba54a86d35d7001b77025591a3f3d0759bf78e22e78a4fdf8aba5e8f72402a2b69503b91ba3088a2466d4e9ee61e333ee04c1dcfd0d09116fe55187ca9779b9aee4cf1186ef7d06954d3001ea9902f31dcd4e9ffa0974ef5498a84d8679c129a789adee4c45655bde6944ca4c916e228a4394d6b44a8c97783dc9ca732e90399bcbdd8408ba8882a3cbaf378289190e5ffe4ef75e792aca47490782853ff1c4628426f4c69efe610e37d220ce4769bfee5e118d1c6372c0bc7317a1dcd9d28625e102242617021352f81d69143e06dd04327c0efe18e2f1931dbbf3cab739a02ee83d724ec17a33c5f881537f2a51309b09e2c48cd5bbcd03e9eb8cfa5d2485ecf50e9489dd85ee3d6a391e2e2a2c33d76b1aba3e8072ebc55c11aaac0effa9e56bcfae687fa2f6f25ee6394b6b45b0b4dcba8fd3d1c75c0cd4c97c3603a2e2b3096625d9c74e3161cae9804f67e0f610a1d61a1f619348d9ab8793ed9fbf1cfebdc0efbf04fb7c98fc09ba2abd2c78462ba9d10bcd969eb14cee37c13b0fb4426472bfb46f3a6e3ef762611d3e676f4c3678e5b75ed6d02d375499ca653dfacaff2fde81d4b5cba7a808d3fae5a49809136f5e5ecfd8e7caad2554cf56835c14099dac61e2c2e66308c56f4bec69095179f942aca6c462bf9276d3fbc124345725053113389575da80a6543e276a72df0c900c85b4817086a7cfd2070eb0894c96cb109fac35ce887b32786697958f2e8dc0b9535332a599673192545f98065bcf12899473ed591aa219e5de70bd18a76bb59ab784312f43060739e09182b3851461bed00003d92897977a335aaf645c85e9dd42c3e2688de3969501d014258867dc5acce4649c6d3ca8693c9b3305af49b7cb20a0ba7de8a344015f6ac62f1ae744e73b530dd73986ba40b784db8352692cf1e78331e2efbff01479ea51c0a1e156425627d3f2e8bef85c07cace534ff5c9f692523d44391ab5974e4a4178ef94c7124906cda09c44bc8858865809a3946ed78697475c28c3194b4e3922a3d128f6f84bf6eca09f120a2181de5f76ac51cc98c05403a2b6b138150220eba9dab70349aab6c0c35f977da071440fbf3d439a889ddd98a32e1a5b4a0864734650f04c0866c07b3a74c93afaf749b8e43de72e06f5a1a35e2404338c26a0e1f3f05bc616cdf92bf0b30bd517b54431b0626570da89eacf2d3385951a075f0dde85bd538501f77044842d2430da380a98f9c90097d84136dc550841b851e7086598440882c2e3852142d0bae5d4c760b5d23348e76464198485da23ba989f0fa61ad07b145d69cf9324da41887fe91e84a11dce6618e43bda3f2b65520e08d316ab92aa115411e40c0acf80f4fa6b01b4f95707e121756467d8ad4965866690d9bc48ce87805613db5773fb374ff3ed0897e91bda20b711593f07a1b3ec91bc784a08b1d3dd074c66b904258ec0bead743aadc0155cdb03339a885d9a2b4f5c7bb01c80f6c83e0822ebfe4130bb8fe42a540112574d2b53108a8286ba61d5bbc58080731331c8a85f310e45de6f71fd5e0ea8f986028602ed11900d33e2d17bc2f23c41b680af223b48e5257662df015ab25844e1c72f40cb32a52adddad40858306b82309f5debe0ae80326b4a700e81a4220b13f911638bae5251bf329576d570a3905c48b722ab98b33bce8dcabc2d18bb378bd60efccd984f20b8570173755c848903a96ec167a067666934786633b392249cb2c25b44e8730397bf9abd8bd2ccbcfca5e058386dd72336783144f3a54dc998409812c45700cd6fa018cf15661d6482ae208dfca0e71ac99ec4f7d5ea8b373e02311f2b765a3a5fbb5b01fbd349915084747c5b89337344a4994b73507ed2b684e30862d449c6a23d87846eb3a6141621a0f36f0c739dfc80375168b097191be990e868c9e6db6d7b8a05e0dcd32696f65b07538a015c15ac7f00f9feff303a9a9b0f135c7e94607029d18efb6ef1c017547b900a5a1281e318e332a2f7d90c8ccaf55fde9116c26e4972d52cb277caf174c4e7b0adbb5fc1cedf1b1664962409f0a3189c768857487d598a4211c78e60535f56d3d557d3372acfc0189b1968c0045e8fa30d99e49b745b22a6204c6a9a9faf16850e0a24162a414bae8ef52a9c13e022b680ab60a70f56ea9b51b297e29fe83a19d6874fe026ae90022a2f2bc71c4215526d427e414ad7b6b4687cf0aa143880ca02056246065f86ce4b816948768eb52e13082466ec2aea495c88cd76635260adab4881c751aec6af1c8e7e66a36e857b2716c4304bbc49491fa43bb3caafb7e14fcf7ab0cb90c440baddb98065ceab99909563c52aa86c0bd82d6014deaf319a8b65bbb42bb521453443e8a35156d8da30d3b0ba9ac174cada1ea3bb9c683fde051405e5109a873a42ecaae3ba6f5cd96b70213bbef5cf815420b16c63ec8757f402dec17785e88be81bf6349719ea3afe20be8cf1ba39641186e77baf788fbef3c6d06b10229f885535dc18ece01c0c54dc2e59c3447307c2e3ee29ff82a7e631c697ca8932de60e90d6a29bca504f920703c43d6c51c2cbc760bfa3a9fd80fd0e1c7c8d47f7c2c08da4ee3b1f72d5431d03a6c0898e02e7bb22a9dbd3af05aa1643d201096daa74b15eac36b3cba77f6a25274e15869e068189b2f2b62f9c3d6f4e70323b71c2e5514947791c5faa194be521f884ccba828107d2074abd0a40f1cb74e285668044587959f2308f28134683ee0bce103eb6cea00f21d78d08df07ca08723f3abd207925c63905233a83537ae63db33a47ca0083b1f186e0d7483fe4367781981632582801c02a3e63a67c39aba8c5ec0c79462433a2f5a03b1aa0402030db19e1308f0f4e10d41d515e4b83a81008c0281919c7fd48231ac572a0df4911408300de91576e91694ea78c6e6df0dc0016d05e4a8e4b739de1bc77b99ea583db75e5f2e99a5d20ce553928e11f9848b1ca219fa619eca41c0251fc828defd2ca77a7cb42e8a5996d5d434d30789b2ada89b3531f69a0a6887472d2de74a3a160d38f5a6960592fb535b74f64c3ab7853d58c7f506b3c03049095b41d9da4690be495c16018e10f5c9d528675961c4989b4f86de5a9625c7fa3e5b815ef4bdd5ba5753d9035afa501e63d5cc29bbb9cfde7428a6beecad2eac5e56298fc5649e29d8d32a1358b79d4451c41cae451146d70eab0a8c9e96a7a9fc04e959600fb5edd7ed8a5098b7830b164db471aba043585b67c84a96ac97cf2d369634ca8ad7f0b82186a5874cd580575e8263689aceb28988275b44fcf37291a601cac1fff19334bc322cd26b031f35c9c7115251a7b087f8d5f20e0c83924f324d0a219e81b5262af1c796a6278001be7ef8a097b2efe5e888fb57ef7dad2e10dac0ecccefb152adbff1beb03f39456b2e1e892ac0b7977954462813b3a43ea36ac54e0ae958033ce9022e10289b60c91e4a39a4ab7068327a3a3eddefc51044152ec740daa342a8e7b6dc3ca713dcb12134b939bdd66a99e4bb2479a536eaf58cbd664058e8a1320a75485d6c97358ebdcdedc13c1ff95cf0e8c5cf06f462e02515eee0151b9b9767ff3c6f1a940c61ce111de7f70979f46dfb2554a68a99c85104654c9178bda30aea19256efd486a5634d3eeff8a885036b427ed1fc2fa2f421e426f69b58e48853953aa9dd93cdf9b9d805afb1d4a5ab60571ad9c292972a8d5bd25d095899f83a5610b9988ad87f49308efb1938ea071dea21b7b052f8d71f84d1703af10dda81cb1ca5779fa295181c95e339bb4a72cd0f4b3d5585cf90c4e2e97fc941359b5541b10a8410836e32960e13ad2ac3d6086719e730ba1f4c02a798a50159f063b028630652e505731fb02fdd1bc90cee2a8bd5c2d708ff0405d5b4da3cd4733e0849203810bf0d38a264774a5148d27dedb5c351c67fcaf4167d0d17ebe8d965dc4063d42ce6fab50cfe05ec9aeaf5f0c9d622efda8153abc74d9376e6f62c5f0b7858ccc776b45ca138e07d78b4f44a96a61329e8c275ab1b502ebd66e1c437f0dbe206294b3bc71ad1c2466334ca078b945837bb0c151a611de0b48044a37ef299f3bab2592ea48c20cbeed9a801598ad4ffa027aefca80ad25d1cc73d001bafda2822611e4870296c2e6033425505fee12b68e233b321de69eb6906d8e136871ae20f0027287806853be4bcc08e3f60f3445c5e845431cacffe4ccbb6ae3244211704e27a91752b140ecce71fe62607ba507a6b2d77c084153d4750911bbb985ed1e7558b3f2e910233cdef3e60372106f0450db50b0ff7071fa66e09ef0e13c8ca617707878b5fdef067b5ca6c3c5b3eee1b0d0a72bb004a56864fd8111405f12a2df2417089e90dfbc9a1ae7ed7363fa96203cd1c51d7b2eefc4ffeb4899c0a1ec06b401826b6a636608880af556a242cf37fde70ac9400b9446cd6f089d702d6ca7679ee6a73405918c4abb5c872f99d9851593200cc453036030f7fc89509d9dd815a86e0dadb81062a41822ab88e8dca135faad61d5ca8e8e7ba0a2d71c29a7600cf84297f009f3907a1f4aa302d3251c1a9fb9b22c006eba842649d1aa3f65590f48c1429fa82b99939e5c4b9fe10d82a0c37e30126960e450ea2266d0d041b01351d01b0c27c92028ed71bfec491e2720ad15a4606c3741d0d4f59da301b2b848ad3a979b07ed6092c60850a8f4803d1f59247530ef7d148b1ac21216a5837229404bdebbb03fd36d07b6b0ad4a555afaf02c7932e6e8c0bcc4291ee5f7e9d9c2f334b0f0f15c01521431ea1153abb4b139aa60691ed4eb1f7af82701bcb0af902c0535a3881a854c49f9a5dabda8f49162f8fbd34427d4e6f8e81e5e9cbd80d0fe0972442ea93ed366e21421066d8bf164af6df9f166a8483a2d019903f740595cf583ebad50e651db861c024af0b07f5a61b54030fbc3b2f8cde7fd83786790794f6df3340a919af57f8821d9cfc15d2bb2b712e52019d5ea27b31d7157d20a176927a2581a58749046068fb49e60d6802cbe25a3873b2f768f9724159341ecc886b25ad48a702fbe70f4fd43658e412287c9a73f492c02c5c929a20a6f05a4869a310f46855125193dea04e2b8e8f9d0698a3c65c3d99696202a894adfd36048d329b215e773e816732babea5358aaf947a2f588175c52e1f4a32aa5a29243a9058b26465af9032271fcc9f2ee94a6f1e8dd9f3209d3dfd677829ccd572fe7ca599c5eb1bf1be5307c7dbb572472f6ab7d8e94a7f1abc5df3295c3d3f677a64e0f50ed70c8e11c870ac6440c74a9acce363fa485773aef6343429bdf10c406f91dcd0ffd8439c52ff1f4376efc9cc3fb605ecb8db6c13223a510ab8365dbd1e91a641d5e6795bab78832da973ca5148e6be48077209a37d7d495d9d1ebf469a394773b5301b0a2207276a88177724c70f6406f04571ca75fa97aa4172e09843be4016378482116e892f8bd990ef69684c5de3858e86ddc8a2b49ba4166f3808139810cd0916a757b9252b426e7a0325269010fb582166cea2bf7dec3e94ab7f1f9802ab69e9f22526fe0e28b498a400d98ba749a908ca21374bbd8d37956fc7f2534027a02944dbb7e2651f3bc0eaf7e6eff37766e0a045d41f8d2f7284438dcef6a5417fe5195c825d0fdd4380f6fd7719884b8471fb535aa6ba27437e65125d490fac0b6c38f8a5bf771647388c9926242222bd67bb47e464bce515e5d0d179dc275d3f2e496922941812a2d18325ccd3f43342af95c1505c88fdd51dc393136b3c34bd53c10b43f4a5497f1e18c1c97e5f6a43ea43848488bd8c2438aef3ed27a61bbecaa00709119c7bafa430454e20b2dface88cc03cef8d34e50ec0c0235499944bfe7e266dfa91e4725847f3fa6d93132f7667d84e598a7e99192838f2bc4e081be11d97961726ec40db7cab79ccb4913dcf1d1dfb61a96c99e5b352fb9040929b6dcb1b9af2f1dfcc2abc771dae81a9b7e93d6df04de4157b38e539f03ef4b95fb48fac707d0af0a4184eb74c6d559d6c2a83de8fdec279bae3d4020faa3fc4570f65eb32c42b094f20a844c7e8dbcea6f37f2ca4505022fee9f296e89fa713b4b00b743c494eedb07e8bbe4deb0c9f5d505264e37853bc77505322772bb182401e51ac4c6c853ce337de9d54ba329bcd3981ae49e69a8a32ec5a65f8c77c7c2eff4a55f44628df730521a54be239a2e894209af4e36ee28d4c764335491cdc34ecad1b9d6b72a3bdd0f24d19f49dce58565975d12f85e00cd755f5b588fce16657d93dd3a0e2f6bc6b577f015f5823fc65290530678f1ace085b4871db37fd8414f6e2f644ca6bb2bad6475f0859b6524fdd5804d4eea9513bd593c94d32fb5bea52e24e7a131746b25e8cffcfdd2627938dcfc99ab001ad44369ba5b2af2b508f9fa945a915d4a6f3e0822ba842c551991f00d0f56fb3e612363a8bdc66d328ab3c26722f961d39622299849d8f101dfda7abe7e804be3d641ae1ba0e4ce0ae0dbf9f1823fc790085e9437ae385ff16d570734833b96391aa94b4bd6d216ec7491ccc4db094577eb801e2d5ce11074443f91c7dcd7da5309daab197854ca24b28c01f51c890966589224d95c6412c93af8417bf030829297281a950f8b77836f12d2c88953c833ebf87d2e186f51a193ed55bb04bc0586c4229ee42af44d9a01b14c331884dc59f442c2b016d35cea05b8beb0333002283bec58260a65b1e247bc13d4c947f2b50b86368335238f43308c1565d319038afc266a2fabd459995b6922cdb9d728e36b670aed4c3dea9199659421d4494cdea673d727cf5bb8ccfaf065a88b8dcde0f53f42d1ff81c940a7e10ad822e1083a6a9a4ffb6b200dac229910ef9d525fe505eee68f673d645a6dfc298d90cad8f7a14121165ca0497963ca5da03bc230bcfc513b7316a09e961a6527542e934b69eb3c79d43b4b3ef5564e9d3f5c3508a1af16c947af696fb4f1f6201f9a771cf4ada38cf1aeb382f4af2dd336b5b012c41ed7a72b990d0d309fab243345fffbfd4735b3dc08996d9d7cc0fe58a7ed8fcb8d94db6bd167dc89fef035b39c68916d9d7cc0fe58a75b93cb8d94db6bd167dc89fea036b39c68916d9d7cc0fe382dfb973d51101b46ca658e4a71b0d98f42760d67115c09c0aba9b385372210d0d7949325c0ed2275769462964342a7020d111f82c76f75527da407580afc872e13365dc43d242793f0b2567a1739c678816c7635a26b9249578bc931994fd7648f653b608470910697ae7b8075445c1bf5fefd96778698c4621a36ddf67c40d144f8ed2be9d9fb68d2130b74f41f60721287f5ad032663e7cc960ff5b14ff41ad2a35223ddf7115ce0cecfaa17c46dfbb7aa6ff36bf3842dff594bc4db95435e8b5b814105035c1d065e9c082daa89a7df39b4961a1b3f93b2623f3827bb3bde3a19609f086ca50122d3ece533a09006492c3b721377a6655c770ceadc003d1a71057aed5c23f1f84e14c32bc304896ac390093cd2eb1e41f3d28d37a1b575a8fb8b122b7ca4a579caf0cb03afcc8ec0332c24d1642e382271840c2218025ab49a3db5ebd49fab59bfe1a0524f02b738b7f3298ac5e75f1434720223207ac2d95bba7376ea310fa9fc199b3d4b327e7c799152f25f7c3ecf3cc438a970a875d828497d962eee3b87d08a9137b419d6cbc9091318ad9b7373e565138a8df8ce655bb6c91dc85e81815c13a1abf739cbefe72115f51761afcd7f72aaf4f72edfb24dfea0fc0808a4350bddbc73b9cf8b7e15f42172a424ae75a8c93cfd44302676865e24aa9d109a215f1845bd8be5790294008f48379a7b120b0ac3f05d12d433a53b6fd6f8944e499fc21011164a733b1819e6c94701cb16485b0908979c3b769f67e63b048bba7b512c6f110b5b06680495060773495ce665874ed2af33705180558b8f2f432121faa9300adc443082b8ba93ba71e58c41629f7eeab4bbe67936c9e9f12ac98994673000ba2624d2d84694628175963311a5c2e4cb478a2131e32d91f23ef8aa78e678483d77d6c68c8d45fe574d0e897d23af5741aa1c67f3873b8a34733cb9ab981c4edfe8f09726629ef877e28beff34dd9efbcbc53d86e4c9138ac4e5e9ee71b73eaa866339ef8f58bc0052966f939aa98f415221db0705c6f0b4c98c6b2f0865c4c56ee3690d665b6860431bf2a6d2cb7d015a0fad8a7eab28f7698d42b7f8353784b10e88502886d51110af52bf65e43a9264d77d813358f083eaa27e4d011867d4c84598489e607f7654f4bce8bb820e6fe9d7bb0c91d00fb26114046a223dfb8dae797f580a772e728eb35eb0fc166a91e178229801253e1d6da04c0bc7e12965c6d0b1e24ac078a5480ae840600c8d4f6ff73081d8209f444b189dddfd4270585ff67b0f5e5503ec1ca50fcff8db013b737f476e36bc22fda5c13677109d488c2d7857e582c6c870c890739e117f7e56ccc80b004f996569fe9c30d44a9e490427137c3a10abfd06ee51b5abb3996711fcf4b90c447dbcaeba6cba50b16bd2b077039d21b257e4ac7cf2d9c3cdb1849e75619e945982b62df3a80bc632a2c10354cd641c793f4517113a40dee983a366e2bd43aeeb3b3634e54f7ec2e6f39d9d927c07d1777c60c2b5f74261cb2c360b145cb52328cbe93ffab0d9d81c94930fed9228ecd75110138812ef8ba8989695a46aa97bfb8e4a473fc899030429e2c8c60f0b3096cde53939a06055c19140883a61dda873be28900e1ffc03891142ffecac17da45e0663f2b8ea28e34fcb0f2ec99542c4035abde34a7caa75e28bbe7c4523c81df6b643993730dec31a1daca644eafd1f74c58e1d60de8550d157fc0a431ae778a0eeb13360c0b51885425e8dceb4f09ec30d23c8570fd00d3c503dfd3d50ea908b81abfc80a46f04b1342165323ff28c3592def32fdf363bf121834abcbcb099a052d534051c44fd824c06a6ab233ed28edd3cea95829a2c818f4d910bd90c6f7a30a96a2aa8c751afd8269c05d7ed8b4b39118549374883ff8df2103a1f776deb978664aac86f4766e89e91e79930140b72bab4c78415a7a1b980197e6d582028d0c1055fecf9e63a36efcc1df9cbea9ee6f9fde4fc412e21b46fa03fb57a390d7e7f4ee7f63e8b0fffc4bfc33f8530c44b6bd6278eea37802701d46370ce46c86dd633168c82a4df0db23a94ffe247631557439d44662c1122609002d67f3ad3814f7eaec42bff3aa3b113c7daf06511436e84a7385e9551f469cb045c1ba56e0a0a3f383a9e6fa0689fa1f4bf4df201c729dd99dadb70bdd5f11051027717ae97b04ed4d4317556757a94da82c66258636987286d520716728471f81b8f1889a8e8a32b0e7edd607a5502a26690792e13aeb5a8c91f2db7521dbad55ffde2df6631b26e26730b531ebe059c70b1f8b8be76e798e3aec4867bb992c04333f3cccc3c1333cfd44c339bc94c6632b399ce6ca6999879e6669ea99967329399cd7c66337b6227ba09c77569cd3514f5b8d77ec722fae385634845b6ebfa4478c2aee142399c62505e3d8c1544f19437dcb0a07ec1a7e859ecd51b5911152163b1d7f2a50e54b2bdd1266521079175a38df8ded1c963f8d494646a2fd204ffbac201ee6e190c2f9a5fd88a2b422c005c673d24d6eb381f41b2b552c7976a95eaa11d545deac7a14854216e7380c13d92520945044738a916332fcc7c0d4939d5fc2ae9909781f100e811ed11a8307e878b824664443f61d152c09d0900582c02806b09e47fda5ea160d748eb18e0ff852ef24fec8991abb935534d399be9a95b3fa5a6a96e373e6de9ae5c35cd69cdaf2ebd91b6b63a9df1eaad3bb2d26cb7353eb5ea575a5ae5ece6ab36dd945bb35ccdf8f5aa5b52d5b6b3999eba75bf40940b154969c79e9074f15afbf8c61f1ce3d30007f556f5e6ceb8d4f7c0362d9866281ad2973d4c205a98550e79a20aaa0bd31cba980e6d86adb447e832de0f75b37b2cae781ee1959a81864f64c5c8584eafb90ea211d32380e67a981ca8004dfd20325bfe4d88a5add45f774b07a1145bb0d5857ff00b9c48f0c60cec0da3a7d7c4d051d050516e2fd335dd9df3ad665cf26ffe54f18f7b6ef9d9225293b174808728bf9cc8e3ac959a54db712446b3eb0caaa3bc303a36ff60adc7f1070c231dabc9160a74f1270f67ad7943cc1f4b06a4f5a02e11437f30332bb9d5f524cb7483b5b6bbae2a8221e5428639d15256e04fdb1d4b7b1539913a4245b0e22d7c9b4bd24f2a0a42a3e1837277c41752530948f434b8d2964f6cb4a597aeee475d4f7b20724004c168880054ad8bfe22b6e9cad9c0425c3ee0ac51a0e67e244fab135266515872844b34c5056d14a582f0689dc853e916c4049a2e218e19f7b0660cf3041de0ce65ef63badfc6e834e0a3c60f61634395878691e37470e0c0acd4e90a17f380932a33f8067c714ed28758a188c48e50711affd8233e74c53d84cb028945979c09a235d69e4cf56d744ab7082a53000b81747134522d9f0210431556ef227f531fb63810e0f94e65da12a1046e9cf406d577bf1954ca2ea68d882ed51d72caa162cd8b86c8c8942fb63c9b55e9950e7b5b0767ac38fe38a3a3723159793d49d9ee5141a5eb5b8ae2b68612417316920d73a1b820fa267852b8e2bc25dbb2ded9ebae1e92dc248ce81afc7a1c4a6455052975be946cd43a2c62ee8cd2f07058455b11daaabc629e8fe2815a87196d449a9c9af7388e747dedb4e47dd8e1a698df30003af91b3ffea21c587b47bb9b3019c77ae7cad583d3b61c26390cdd2d298596e640ed279b79a73fad8084a97111da155c9e9eebfbce03f4609223ae8435cae81a9a58789288e4ca7e109c1bb78490e8c7ba5bd3066d8fc5a5862c92941b276744bf55b853caf8a50ce8005ba852c624c49440008f326f3b9ecf30dd458138c8efb6b30f7048588d1bddb4324943cdb1ddbc035f06036178adc2e38490d23844b918dffe535a75e9c7bb4186ac903b96f10923e0074d729ae13a496f9ca9a88343441b12e991c8cb15459404a8d178cc0911d653fa89be3ba4d550a4916cd06c6d18e8f1cbcd6b654689532365626efef875053b39923e2af135a903ba9d5360bcb0910be78addba80e4b0d88a0d16d4f6f03777a0848e4d37d0f8b67d161dab8f35202c052a2cffda030a4c6d98e5d40bdcd1affd1128747ad2a3b7530cce53966f2f89a83d1905d6c9a910c3e71148ec5dc1a334d6b5d2bc449f894cdcccea227211e0254a9ac7c1a946c9767c543b4c38970cedc24b292f2f4bdbbc0bd7dbe86004fec6d14d74e6b6439a27a3ad39d696380a46e46479147b3ac3b50076862513642b0c551c3b489a3ecf504a1319769fa604e35d1e40882b99ac89883d66ca8e5e97a6e745e82506ab77678ed89c6d49910f793458b58203f6cece31507b2f4974eeb15ac08f06b146c5e8c0f41ea4da1391d4d17b01e9a1909533e2f0d6c5d64ea0fe7a4188204c8ebfcd499890d7587915ebd2b0894901efc6189e2fe725c18a604bcd1f7eedde0f6e30b1366ca94b773c3fb22be7d725f694f9650ec212b8e71c53dbc3c2e8adad0cb689a98b6ff3faaf98310d31dbe2d2a1d9a1ed75ae1a5fd32f59bfe9005513ed0ba580a2db978ad641a2689523727b79ed16fafe9d07dccbb54cfc29e89003f3b6249a7b40e9ceed8a21197a92eb8f5d7a4f55ba48afb40cfe2c04bdafad422002d681326842d473acc7ab5e9dafce3a1b5e5875d3ce59e65792d168f9b3c8c2fea5e060fbda3907ecebcb631618aefe2c3d474467f9d32bf0cf9dbdc7ea3860e0d5e341d9cff909ae5745e94474acf81490b9399aaf395c0feebf8e251fbcb16ff99034519bd55b42220fb975dbc2065a07298490b67c5a806947855700a9f3dd8118628b34822b92986091e6e6c3a7f4b8670e4890af7b2459d6c64ed876ae9b3c195b32876bc61aa17872476c08276486abdbaa3d20d7646b6101eefa1303981f2729211a4f6eeb1628be42f13bd7b860d4f67fda088324cbc8d3a3529de110b7970889eb90c15f494b0374505491ae0937030ffee703ea27a23b432aa87a514318cdfc6ff4cdffc1d3d11ef4fd5dc8fba4b435dc121f9bf9f7e7a1460d2b719355e75f040105aa3a5ed4c601ce0e1d68058db0f647f9a28768d366296f94eecbfe7b47dc1a2e52f7674b7d9894b31b962b25278c5531ffda5e58b82a0fd857163d87e60176837833a43bfa8f68654c5695ba0a8f305122b308c6c1b2c33f2016ae103212e1c115442434cf1534d11d70b01d16abf2a655813cf3a9dba6b4cb0c9173a32f35d118f2c492180f79cda23a778b27efd99bc5ef6cca09a920881151467d2c13294515f235f42962a748d8dfb523a274dad14dc72b0b204c1237931c1cb139cb2c440db7c63fad00da14843e51fe6e05448438e5e56c62e629d36ad70795de0fd59aa6d31e98fe421baa699bed990e8d7658586aeae52fd109cbb3ee1328ddcd28627732b1175a2e643ee080acffffc41aa9302f606c386041b1b627d1ad259db75879dc002100a81a263eb4a2288eda892404c54af9df7608d9693dbd739256fdd4a04c3e5a9a8147589af58cd98f2ebcd30e1fb1cab9bdd8fef84458dbf805ae25e0076ccb794e55eb588ac34b0b4c25667a111218e25f53112a356b4627ebb43b6859b2c2ea31fa4340bc1ee0c87eab8f739c2b9f704365df712efadb5de6ebbe166796d79e15994e2c20df1d4776a9fe0176d1e4adf07c06463ba8bc9052e828171bfc9a0f91512b2c21df8f8e3f2be9426c3596685c8205623856757a639156b6a24a20d381878e0545bb533c062a192ff521d0011de51dea6ce1c6b9bda7ae531a161e2b7d8c116b1703bbe669f7cb7b56f822c9f637c923196007aa019a8249724cfb8ab21a205434ea3e8779f4d8a9d527b4a07c4deb13a70815900a3acdfe64d257a81ba16c1efb243669f3e36d2cf5e377f99f63e3b2167b12dbf974fd333b0411f24a402741132368195c580c719a350a28f115158a6c1052b40fb7fc33a70afbbb743149453b3dc99cb68d24d39a3702f2aa7de0a2439d60ae8415071e2fde718602a7af0bc47dfafe26380a57dc718acb6165ef2db8f7d44dfd98bc1a82546f4b10baace004c609cedc7405f34fa1b10850f196c6a9744e712d84c52f8edacefd2ae3eaac90877d1ca78de12b8239cc94a0cecb559b48e5e390da920fccaa2018c8e92355593eb0d8852047cc3245ccc3f29936ba229c93432db46ecffa5f73c4da1b8d1bc826e91cba23d2e640aec327c602ae0f9719a937a9a2a9bb4593dc4cef1c34ee0eda2926098d62dd2753077f415d7e34a49c7bca98b0b8bac8f3193d9ca14f753f55c88ad95f2a9bf979b34617b4a8a9f3c364eeb40ed32d452610e3d3f884fb3eeaf9386aca9754c98370e0156542e8c33e8846dc1ddd91d7fa39f2826924f3c4d855838b391dbf6dc61a1fa0573876b686db0b7c22141939b20671e01caef8aa2d5797ad14c57b44d959f3944624c83e8a94258c04681b04fc42e4ec102bf73cc15f2ca0bec9cc130532c541002f20207c72f22cc2805703029485fc2a29681701c20bde77785e339cb4313e977c52f2d48ba65a8cb6dab45fb16ad5828b9beb40e4b82dc2857b2b5c9a4b403683f041bff0dad77c2302b57fa89b1f3128ca75aa8ba7adf663f582a2382246cce9adcec3d0e09ea1067ee89770ec61ad90733392a334aafebd4d85d01c0152a7f40900e73deb1cd5ddf404249c31d0390673795ebb9618b745caa6c8198566f367172d7e490d666f24475ea9315a1faba1406a8db86d2ef2025f33dcbbcbb2ead4efdab7fbe9bfddc1f36df283631e1efe26b2ffacf8bf80188624445469d88e47fdde0d52d37643e90108d67ca5340465caed69aa729d3745348b95197ec45e148dbe5ad7083b9dc1ad2ea9549bfd459a619add68a7d86e74ecdeeaa28c31a3b7fe8c74b3d77d5ac2e85236ebf94e648b9025e5728e6e4b75861159c64b189ac58cbe4435fe8b6cbb2fa32f3040f3dad9b1b0db3fea702ac470327f0cbeef83914b73df1884e29ca7c7be052a5401bf1b9ee4f57a3e78abe90c431362f4249eb296f14924e4b0a1e84c6127c1e8eb387327e1bde849ae220b549a9b2ca619ef87f98fb284996fcc4bdf4b4cd07bad70354f3627b3b1b6f84f0701c73e45cd2d16cda23385e89829100c726867085e8bc477968cabdffb87d8abf4819b6a26d1ce41dc9301d08bd7caf4f1869e4c450a14948811f01c71be9571e6f2e7f51e0a270e61e270e6fc40615d1ccae1cce36f2dff0c309e801c3a951c9a057def3f65132f7e47863951058e8d23b48b74849bc050fc015b28626a8e6dc6b1caac37bf13a36d2066364f8481408daba52b37829973b2c9252da07d8665aa0e9a3488ed5805c3d3d1d3a2fdac175172abf351985c1d70091b9084a1bb327d1f29feaedcab08784621ab0255611b8a5e312a719709a9dde5bc7c0e23c4a153e842f318920feb3511f421bc33faab35f8aad140744df4ee80f475ccc1fcf64303491ad8065891fc5c5430730f7850d04fcad9316cfe751ec099dace67a4290843c96f422303228c3ddbf9475f9ae439706a7fc8873c0346f08cf31383a0d1e22cbea762e2b83d91c96205d31837d7c4da6e19a5b5c93bcf42789a7b83267be34e47eb946183052f0cb3d293aa4cfb27c95eb6ff16e39f0a24c9b6780d23d7468848f634ac88d15428ae4fb0555a816a4d9fd7f08e0e311b0f3336b18c19ac0784a16cb26cc5480ef4d94dee797b38d95c0c56aee0d09205b5624323f50994c1b028ed67fd21cd9a147e6a8c3c9ee8a859506611e0b71b8860c6d8f8f8e817829728fb3f9ad5530b3d5cefc355e92559beb378a6df8b9782b376242a9d4c9ebdd4eab3464842bde9fdce525cad112b76bcd0f3ca7e6b5994f78366ec51e4ba56e96ef4633f10847990c33956af40d6da68b51f6ca573011909be360b1667003425f8d2ef0cf3adde492a8c75925a122f34722ccfe58978e72e3b14b0b03d142e5293d7f15940c156608b918a134c89079acc418a25216b75e744d33f54a3e6b008be5c9dbdeebb9da678aacb59319c7a561e4c1f163f18ac6d9441409251aafad9dad9eda87419976680bbbf6a2503701258bd9a686fd49987d8d2a33034c426be2a3057a3cc956004e2b88aa707ea585d3b5d911c062eded7cb2e4ef19b201f906e27b8457b422630ee3aae0d6fe50bbed6c39f4a74d1b91e96fb71fb2bed739411cec0ebf3b3a2011501b23f0ab2b586a7d0740b240268b86b630a82c5ae74331100ad57808d20dc91bb013308964c8bdbfe1a5089111d06dcee0162d077a8013277937029c1742d8fb36316b97a78c13f09d4c80bde8cc7acf553a74dabc6c895142a3448b0440923bf79cc90fd0242fcd5f44a8a6415661661c9e6822c3238171d1ad549fbf4bb32a7d89e518268ddebc298a51ef8a32eaf00b0f5d241857a806914f50671072de0f1602e98b868e8de7211080af32f621f3fdde0caaa76ba9ef19cd49c06758294b83c807bec52bb6abc60940992b77f3d0b900f1bd44f01e0ed1f94bf6dae25f5028919b70bf8251343892e904fb26c2772640bdc01c9115d953413f38f5a9b83c193c302a509d968bd5d0e518db25c7cbb7c0dcf65e63fa1862c33085799c23c375d460150338e510a368b0c01c8f4c16775165265a625e703779218a3ee982c3a91d356443f54023367d844a0433e1913dbdb7bd10ab3cd2c2504003b1c50cc192b5fa200764a6af0b073227511794f217007fc6bbac49040379a19b3eb1db9b010b1c0148513c98873889718bbae5654ebba406ce8258f235a2cec3ac2c9424897cc95953a59555b2ce6992b9c0a88c6642170c322f032c18bc2b1dd87d189a5c0565722cc88ab3db1bc0d378c164b2f428796fc8737bfa1e074e2801d4a0fc3a150d829d753bed0a2fcee427a88b609deef210614026fce891803f638334379b89b937350b09ab66dc95a28992d6c27f7e278da2d24984fa9ec51c91fba5060b00aa4846e2fa4cdf62765b7098585b2fd8f429cc7504d4f5a0cb4250b661f3c99140943268f7c89f7c2690180f8d421223527a74f94fd97a5c767790ee22c60874c348798ca2a17a7bd435e807e5e48aa222543ee7cbe261179ba7a7a0e2632527edfbc5fdac8e9f7b4c1064c7a28783b8389b2d83913db4717a6d3af1866bb85089a79fb6e9e7773855c2e292ad3137af8a4fd6a607c8ea1c97e95b1c742ecb05f9d37d13cb2eb5778a2d0a1fdf9b27ea5397ebf824912d7ea573eeea6cc85fad53380f19bd565bb556df5f87b7a4d1038c0668c2e3d30f42bc88852d5f3ab81ee63b00faf7875a2817cbb6f9b790f2d1294f1e757525df91680c4fc32285eeee736bf1aa4b8a92513ce782c54c430d14ab793a0d84ad398177c7a009d29627e956a2ccf225b791863a4fcea5592f71831af92d19f68d64a48f95573ec1b228c62aa846211b7921a3e3886072985084eb12eb45d3f6bba92ae81e816cc5b64f1c581ca65c91700b19bc630d743d2ebbe4410cddcd2f8b354644dc76d46d7fb07c1914e8d7ac90fa3e050af2d15d574d884dbfb967d151bc5134c8a383a9432d2902431c6faf34f839e3f5732f7374fd3f1a689953b5468ae463168d71c353f002df776038a11b9a33aad1c4b1c61a8e814db72d9fa71a9d7345f8803f690cb7c6db769e3bb38894c66310c6fd775b36f2873b588250c0d9e3c7b5bfed732c4452e769da19b0dda815334ece60b87a000a749d04311cea9f73af65d4f57598d245dfca676fdf2d0793fb81c212e6f11e4af58add4d44d2da24724fa370707bfbf3fd6d82e02553fadbad2aef543f94ea725a9adc503a7b6df45bd124ebd5bfb6a8ef097ad6dbfbb726d76e50166dbd3a55cc937d043edd2b4bf2959eba699dbb04af16d413ce1ca429d6b30241f38605d6eef33097b2a634f383d33e1645f5d676636c2bf9ffd794767f8280afa78ce94c3285a8b3963798c63cab9642730eded6b733aa063a5419dbc150bdadf45ddd2579b76c5dc3e97d6b6afab749d7a40eadb68b8bf79596aa595bb4eb0c6c421f5c6d6af9146c660d9ca984bcc42d79aaef674f5a5c29de3875763c84d023f3d18b777c8a6254a646cbaa7e230ac871cead2342c031a9ae9a87e0ad65c7aca1934116e8955558b6716fb8a16be25ae0fd38e45fb2557dbd7ad9e758748ae752f3359d7a42d61a3ef89db54bd715999ce95c01006b3d1de0d4ba22bc78c70502082082268e71d1b88558a035006392705c4c1ee1e0992c3c49761637b7cd1f30c2982830c5981091e3bd386ac9759c1832c9add92447e46f5b1e06dd8cab4ebd2552fe55dcfae7eac4b0284cc40b68aec385548761d2cfd95a22200f370645d77593fcb276e62bd3a61358e39c3df8e8610d9fdc709e85d62ef1277d93f03645c831d1b6cd83f7bd063963980bb29c22231dc38b0e955969ad67ebf90ace25f5256371892223ebfd9574954cd6bd04873da80929e82485bd6b1e1d3e696e54285834ad6db791c1711badfe0d01434aff6193633dd3e05e5ce894b3d07bbca75127a74287808b640ac5ea33108fb58e15ba683605d5f39ea48f57ef49999931e9866617dd56e0491d192f3883c312376e1e8c6aa195df0386a8f9294ce3c4705a49cf54179623c652d1ff34301575c8c461da96057cc6c284b9201cf36de58d44dcfbf3a9ff8f5c75e044324869a426edacd5ca47ab7c051d0b4d01c0525ec4ce473e356a2726816dc57c10a8b30b81c7264125bd45b44d2fc671732c77dbe855a1bea5190951939d10ae1044a07e664dbdaf602b50c1878e7d74268b3a6fbaee5dd22e729c62dda95ea80b154dc203d84b629ce6ccbccb8f9b90fc50c2e26a547d8973f925da6b0ba46e1a225b22493fe95983390656aea124546b431c38a849841687b60f8cdca64d28e7c69b1fde1e5be820b5352ade370bc64414e4bacc960be638af144683be15654da488d53b26bde882dcbbb96b43027c6df9995718140960444688110d59fda14ffece3d70ee049a58a54a5429dc36ed7a4a14cfc6427b041cba368bcd9c45a4a1e240b72ed047758d703fcdcda7ec47cf0d3412a179009b1c43af82fa3405b17cc7534ef182422f929fd1188a972bb55616f996ec4af21940d09625622ebb25b6ba1ef643d1115c8ee2956cd7e3fc84dd9842c54e5b043718a08b2bc5dce4f097c4ad2293c09cfa0a333621567d76e65b8f1bd843ef5c6c953142b456197bac48462e5fc2f357084a007b32bdd64e30d5ee8c48d04e7c6a693b4d68e558da268ecb49fce47764a0d1e63257e60948a0c3ef44d114b6e0c4bfa66d8c731103b5d5875be0b5bacdcbfca5e392221e096655e396509e4a12303de78dacdc8e8187b91ee92b91e500e49f1d10587bf989e86b3269974e0e7306f4ceb7464f1c41f72cc1391c90ddb9077dfc4574a27a2a75b20f69ef8a259c49b64aecf403d381ffd13ef1fff9d448723a341599aa1f6307b9010c6c1845486481f2424018fc80900090906a09fb88f9bba350dfc9414c379cd62c5fbdd70fc5dc255ba7811f225820c1bc0b2ceb633b41501e02cc491470b4d82eb4a42668a090cd3095de6e1ce4944a6d9670812e3427f187b81e991bc7249b12f50b05b594e2b5da816b4fd91fda2159373cdca8a7f17eb13ff51eb737fe5118b047185f0f1ce70c869774f91f5c1c4c4ffde431a2fe1eb2da837e78e2c1c3fc6459406c9d252893d6451b83fffa3c56c79797144b8d2429aa26d6ff0f393d558bcc42dfb397d5c99324aa132915c05fe1b174c1da5ddb41ac6b39931842b6775d89fbbb2d4f9af20d2047a8afd08dc8f0f4b42a76344982738691ffb3cd7def6802016a93585b225265bd8a7da629ef530a271bc1b94d5f5a2fc9b2a9bdf4044eb6c2f7a24b609db3a19c1ecb1d6ab3c359d21314c61380dc19526c7285c85c6e150809fe61c845c8168765e90c53781f566d565896dddd6ae8c5d85b5fe7d7b6c486113d75ea4314e3cb9c8f19ce36fc0ff020bb9450290410af0240bd192e6940f7e431b352d2c70493d19af346d0708a4e9aa3ac4a40bd41c39f58a99033797ce55d7c408a6135d30987dc5cfff209b5f606ca0f2c3f321aee91e4e9b80ca1e088677e195dff97eba25941d9aa2781c3bc5aad7d71e48c39dd4a738e2fbe4ce540847969d3e842be5a66f2c5d26d28767dfe1272cdbc433563586a707b49824e4de21f6a939892af7c303db1fe2d6fc8ca83a05445a9fade3bb898176a03cf23f9296f97f71ff403efae39814b7627cce987f2310a5621ae4f7d4657395ebe2604f77141bb31c17e2eef1e7a93588f2404d5c24c0d8c78dda72c55c0fe0e26162d8620554a4057e7304cc0d55301e59a5039dae5093a13181efc8344f0077722a2b9ea1c76a247a06db8fe7c8f7f195af3f68e9a277ddab4321b5c0ed4e409c92fbb3aa70a2dd00964dcf619aad960a37c001364402d224217b6f42e4de52a62465500dab0d0a0eb5f3d8d93e019481398cfa427b277851df770b7908b4c27985b7acf01c6c0989e77417f6d259ebe3ce59feb81617e6a74d719a7ecfa28484f47753c16d3dcfcebaf4afec69b1f3af6a0b36c11d3b93d7b6ed3d367a2ee821112a7afe0b6b389b5007f5944a9983301dc7a058a7d35b7ed831a0cd268195e093c0fe42a0225006432023d02b7bd8658f141233ef8e3196b2cce72c2111027a89e97cd62f6daca7a0d28fa8f392f99042d3b4c761efbdc4300cf68931ac4e29a58450669867ade790c9b390873c50067c127ae6b1becf0064f2b0c727d0a21354b6625a5634a29e87f1af095238fa2a085561c86bbdc9a4e8a491b809fc68a1854c50521ee3a3d81c7e148f565296aff0abc257964616cfd1322cf66e94fa8afa9e8b5a16a53e1d739d7a405916677b965f9c2d75ea01556173fa59298ea57ce590c371d31e9f656f529cb5b262efca5e18443ea4f606c5599e72e676b0522c96bafce678c86f9862f2b1c56395382a88a3fa862a96a6c103b040b11142b8a2ceb40bfae3a84569a5ecf5113d5a288254aa57feb8544cf1ac5378689f6535660e9944ce26d27456a3a7d415bf3a91b389a9da622ffc16efba7ab95a3964c231d257de2c44424e87f6546685dff95004100893b7c7761aaeef35222b9c3b000b37d939c3c2b23caea85adc28745a67c66ac1c17248a1673562fe44c0e4a7a76a6a05ae20750d5ed575986538f788148ff5d19b9437a54d57d45ecca1bd382c4fd5abf350e7597507fce929f5aafe628ea3fae9b0f53528e692b3c151bdc4b81bd035c7381d2a0ba85e635a257415d0573190570edb5e152254b0dc156ff1b6b7e5d1ce589a1b0ba8326fcf3ce5b0c6e9ddce027d055d856b1ab63d6e07a59eaa17e753b695397496c756e629de28973e8abd38dfca2ccb5e9cff4e5d14e722751833255afc05741ec5b3abfa984ad9168c29a7f5a238e6921b622507fc154fd9cdb50c7205809f72ea8f2b006c8aa35af194bd59716a6f58bc71542b36b2ec983a58ec53b139fd2a3c7adbdb6263cbe6f4af3c3ae48858b90ae851476f1d8147718cd311ffa63cf39bd3bfb277030f753411298b626ff41c686f4e7fcc805008214017d0557e8aa7ea859ff2e66c583af3152b537d77a77856f93b1d9d65edab156be52cd9ca5756f6e2a8daca9bde31532a56ac4cc52a752fa0a3ca32aafa95ab50a6530dc7ca5efe95ab78aadeee88cfb21615ad9656a5aa6ff994b35c3e95a3a5c25758fcb5d854cbde1697cf3c478a65effc149baa2a5fa5f8c955b26cd5edd421b7633a75ea349c23cb549f758acde1c7914f1d45510af03ee55d2fceb7a7eae90759461de5bdcc1ce528f5fe787ac45fcc338ba37aea1747f5ed18a5695aa743218eb8388f591d5548cab4a7aa31a2848ed54fe7a77ae830317236a0f04bf06155bd068bd8b840794e7b6973364570815ed6ca73436ec7a42d83d40fa833639784923fa516ee9895d0b69ad792bf8ad33d593751e49a5fe8260b898afa0595b49008e8f3129119e86c870e331b0366fb29ea19dae19eb5b61cc1bbfd9db1c12e28d0db4d0b39db6a5f11aaf1b12254c3f9e617fe3cd7407bad972ceb3d97062148d4422d33f35c4d44f433489a1cfd854455f8c27349c1e4bb7f4c9062c833410a25ff865e60f42fff9860869d6fa116c2938111f2d101135cf0032a38a9e12cbb99a6d9d30fe8bc4c284352c9e450e75f7fc94211401999d3f4ac9867b5e3180cd3427f67888894b45037d14e2c71824697913b48d44d70d7af24424fa01712cdccd8804a8ae48f893719509f1defe9c141112154e532e4d98118c1bcbba5c78ae3a2e21ee8c334d8271a9288f7451fd803e111521212ede2cea24beb037db8eb38833e114a9859e8d373bbbf05b4f53e72c70cdb5bd19fb3c39d1ed80377a29d5008996ce02c19be86a5d77a632d6ecdddf0ecc688bd866d527237e4dc32ee86f4d74adbe46e48d356e26e48d3a67138a4974e2e7568ec98a4bd1e282dc2819098864c9ca8e6ce23c524a6c1ae95862ef05ed893782fec3dde0bfb0d94782fec18782fecedf061126c9bf35e923806c288149d243ddb6a7b03be051e7e16027a23d2935d533a0165189da1d1774db4b2684241ef44fa2550f8cc1dac051a1023b11d46cba39d9bc51d33570a6157fe66c538e165bd997749d2651e833b0cc260107677cbc7e0cee57b0666e3bb35d930de0fe2d8f8f658311666db691847052f6569edb2b66b35a89ce9d153b8748c2e1f3309a18f29580f6b8e945ae418df8b941267867ac75708ee8e31c66e8ef1b6c0c71823c7c48631c218218430468e31c6986559967996135f4208618c52c618a594314686ef05767777776cfeee6ed8dddd303a4dc025287be3c418638c31c618638c31c61863e4a0cf1863841fa03310c218139b7b8a292084104a08218436c67e43ffe4d92355b96c7f13a3f4764e027ecce168db9e30ee076575df9c8756c51db39d356aa0493a3881d9df83f0c187e3f210c6c8dde4ae7760cf9d0d890822b18e8e9a3c3b6ce284d9cb60e3430914fa2bea226843dfb58508c4f0230042f21a54c1777d54788d4170f45d8178ad79681091f05d75784df234f9ae2f5ec34ef05d5bbc96f1e0bbaebc3687be2b8c7f4d088114dfb5c66ba669329d5e134400f45d9d049a0a3dbdbcd004d663f45e5d50f2ecf209c68305d111048869bc7f2e17fb79760293a013f804c7859bb013a322df0131327a977f2fa3261e2281fab797904061404fff9a00029e6f3e42f2829387f1efe505277a9ec5bf9711d23fd1c4b7fc7b3df1f33e8df594924093c8a12fdfd0862783fd4e09312ccb329e737689c351e270402f411b4d2689bdbc289f2081623b32e9f9953000e2c04308f99919f67b5d6f92bb8123c2f8503e940f5dcb6094153a6982f57036d9402fd3ac0534f38c87b2c397ff1eb68c4cc27ab09e9e258fc3c11dbfe7d812ba5fa540f73cb4370d9b934921a0978f346703748d664b0e91b8b313a95f5fe0f9cb479cc431978d9809c7c42fec3c3b37e127aff98b5d9ff4ecc1a79dee8f7f07c8663cc2aace97814e673eb240ce139ac41722412425cf0e9d5820073e89ddd01f8410e2748f0b8ddcc9242423246ec21d233dbbc0d9b0df737969f9e80b497ce4e4999bb40fe895491c73b11eac876384c8273b3b35ec422de88efdb452a0417f2e4de800d1bf267820e867fc6b02078a3cb425fa80d0a4e7a845300df6c8067ae7eca13eac1f07ea826084669e6f70e48be0989de7e71b3021c3359c84bf4fc9b30e297e38a6095ff0f91cfe0bc47fd1f79ac63def75482164e8df6b0c1f9f74483184635aedf0dbea9062c87708b40e92826f8f3d02faba9b85f0dd4c7c1bd12388a24fa03d17596f12d91be0108729bee43d26900e7020fb92d5e43639a6e5b2255764de9ae25768284e83e2d25195865d2567bd2196af78e6ce525d45aa85ab70aea9a60a2f79a52cf6b2bc3e7649e92bf5b14bc55e568b19ce96a4bd13e5ecec92768ad7b8cd7b609c5582e555bce45abdd2b71e985fe086f396df702e37cc6f49d34ab607e625dfaef4924b8df3cdf6505161aed2a04a7552bdf7425754beb2b2a25a51b158ae52b156ae6a61f9ca9740b9c99750b9095555384dd3b0aa66be52b95e57512ffdcc89cffc54ef83c2672ddf76febd9715f6b6acf46d55b945c5c90734f3cd6fdc321d99975cd67ee9994b2f95a28af7e0fcfab04ab03c8b5fe99aa76a8f94b75c939ab43d3815ae71beb926592c9110acf8122ce7b4957a432473ea93510edf4a65a9742bd6dba5e2a526e87515f796612d91e2ac951567a9527c09fa5c2abeb2f22554dca462d94dde0ed33229dedeb58c4ac6e4edde322bdf3c552fc0ddb09b955cef06381e285e729aa6beaaaf534c957501ea28b5544ff5263a279db357e774846a0ea7f85bb2337473b657b3371231399b5a3a3efe0c82bee5df900c845ee3ad02d9e7f4e390f3a56ded28b9944ac09f16277b25fa31f9e08fd6e91f30db5435d05ecbb443d75e8dd3db97c0e4b4ed4b64f65a00b34bbce7ba19d8413d465fa26da4ed82be443be64b44a741e3faf8fb9cdff3e10120daf700f06ae20ec8ed98cf3ea2b74b6884bdadf6f83d186518344deb0dcb3c62d31f6358d6d127c5e68c1886f9943362d894259715cba4635136cca24b6f6f1e984bd9588679f4e89867cfb1eaf2cded70f96c866211734c7ad6998ced5877631ebd4aebf25d6fb22168cf459b32300f2393e0a13d762ddad04112201ef830d18192ee5ae3bdc8a711113b8bf3feb89163faa58d973ce06937153d7bf3606801ec5993b700f69983273f9d3dc27689da30ce66ced0768dce805ef299f7c3d391c3430e473bd61e1d422c7ac7184f1c8e764e6d5c4b1e2b7bd72422bbbca6b2956ac9391b346ee3c41161f29ec19df49ec11de639edd3378e88f6926326ccdef60b43447476148e88b64173db6dd8e03822628a23a29d2d0d77325b71364149fffefd8a33d9c7355ac8b271e6fd00bd2baa2fa5945eb2b7c6cbd2cbedc540974e5f0cbbc4e4cb9c87a6b2bdf743d458dbe3981ed1d9db2a01bf39d6530f326e089d6787f606f3e9b1622e391d5c8faa042422fa4dbba443da73d1a2dfecaa6e4bf42b37ac3758e173edd7613e5b267b2e0cf316be12518f611e99b971b08cf1117b31d0310c238279bb3180f8807a7468d473629bcb8bc19cbd8b8155cc5f627207fbc25b003b4a50904771daf3edda8b5049e6277a431dc523b783755014fbe60404b605b0d3a8da7a2837223aca9fa336a7d687ca6eee03c5ead4685b6dbd585bef3ddb928e729d1a1fd146dfdc88e89b4bdfac0f23d21ab139aae49b6d1fa67ebd9aadbe9aac04543a8ef72948de0b7bca11e79991919191915166449b44bf1dca2f8ba218a138a1257b59f4090ab3d7813cdb0e2548b4284266c6d9643ccf1e04050877f409ca0e4de20edb79d3634ba0d36bd079e4ab4a11eea00a13cf39ffb64d56951feed877bc1f94a03a1e10ef07d84940f27a2feca52ad0cca5733645a85dd2a6bcde4b6ae7557a5a6635275d0505a9f404a9f41c05613273f2fc7698fabda759cc4dd6a635ce066be826cc1fe6d28499acf452acd1a49bdeb47ddcb1a7a225f49e7ee851cbace6a494b5daa1473bdf52c006368ffe6af869b16ea003d139f7c1d9960236e79cb31be07cf357e3233a67890cf06aa23d0db58b8db466dec6cc3f22222222221591ea673eaaa9543faa9f672fa97efc7566d4dc2994e5291915525e3dd444bd04aa5ca7863d569d9a0c297bc2f37e80cf37abe9cce8f46ad713e8b4f78424f4ec9db4c9e927337a2f23a0af24dcb109c9097da79d676f3d879d445621688e68997e3d17fbd173b1bf7ed1a39fd3ce69e7b4b3a369f4a85dec6d9b1eb19b90625127e9a17ed123c6a66042ead7ca089bc29351e9c188de0fed330bf4092c8ad34f0cc2925e2a3d4da14a0fdc493a40d744a7e14934d4aecc8846f15cec67781e6ac3b33f0e3410bd33cbb239d42ea647fc84de95113dba262423ad664241efcae8d9bf6dac5db30aaa591971cc5dad562b264c7c98b3049421e54d908290a7f1af095158f29abb7621132e424dab8fb3c12c4cd30da5695a0ea3ea4de63f50340d853afa9b637bf4a7348759caa6d8cbf0cea745edd252f412562a610e916eeaedc750127368b11efd9751500430467b211394e69746686f509e79b435ca18adcc628c5004288fd0b6341aedd511a1435b728ec391f2686fa267bea54aa7884157a5f8851c0ecc6f786c8f6da6142c7aaaa4c52ab50a1f8542a1504ec3284c728e22a37d6f6beb278a4d68ba381bc4e08dbd398d5d9cad74636f4962aed95bc2348bb2986d652ebd04218cc55c6eafa1fcd4afa182687e83b2174a18142a6e52c3dc54f237eb9358c53eabf0638c4ec331c3a4ebfd803a50ae9220e19432cbbcb127dba17733790d6ebc04c807fcb95cf87a945347f195ea4c833da5b29806abfca027778e81d3b6e434576ffcd3bb3aafb23a9d38a7e1d3a9e1e9f1802238d5c8d934144167e06173ae039970d70ee1d3515578aa50a5a2bc2b55a1fcb24ece6a71b66d594292b8413de5cde1a0385229d77a1c0a793fa4e0fd70a2170609f963f9854784a0100c0a6a244049fe216142e8ed3f24404a9ec5f2500af4429e53855f72a263b7812948c17b613f3180e529fe386815e0038e21a866c5539c8627774cdb0583ac0feab9d8513e4982b0582c1ca752a94e276ea592d3bfe29ca6557573ae6a9e52e14fbb5229a7e13e40ca69da51ac24e25fd66741a010080484ffd3f9f8183d3713269ceef169e1eeb96473e2805f7a428b6796e52ed027e8d9d961127cf50fa8831257d400bd8fd016174a946544a55982388f881621c331d828106506ea67083dcf5b12d8c3319de4b985b7b06e6ff80d94a3bcf3ce7ba03be0eb90e227685297bf14a55215ab8bc1322c06148d502497c780ac406f87250de911c203eb8c2226424f909c1c3561ce9670cc0ae7177b75fea57b4859a60787d0ba0be661788c1e2c170403c33558b16ec98587fec20a305078a8040f008b069d3968d83637bab1b0da0f7febe939edcd7c07bfac66f83a9eba6d7c2fb054af4e975df9b656e01d7de7d0764735465c76236a19ea127920bad1c261a01c460b7f618970607e85479818ceb60230459e63c40eca58616198e018219c5becd5f91676a283dbf80e238ed98109c7c4386a328493a4f984638a60e1ec252025f652108ef9c1f9a75dec33fc71cc9d3fa314d42eaeb1524164ef7c6bfdb1bd33ff02e65f7446bc48c08bd38b162f5cd077313f88c81fdff92efed885f52e3a9c5f5e905239d0d07a7870d1774dcde59914a6e770582f3bd1e121b90fc99764f8ad01e3170000f0ebeac16fb51100013c9920bce4d183a8f0b9a00ba0bee70a407dcf65a302a04287a9322ae6a5fa9054e021b18970be8f186689c890f1836526412da311c06bd83b7ff095bd5485bd2ca296d19090d85732f652df885a24c05e9611f63a02eced0e602fcc8abd337f4b412db311b56b433221b50cd763b297a5622f5505a9a88d3111bd66ef64b1971ac05e167b11959570379d45e5a21eeda799450ef6521a3d5c100f2e400b24f621eaa90754c2ca434ca4027a8c18768676313a4ec2dde42664f7f6257797b55dca9865dd0eab44fcae3bcf2a0771b7a3bef7ee76f0e670ecb083652125d335a2e904b077cee93590e67415f6d2e92c0de92113cf35bdc84f9799bed939bd4e4f99eec3929fbec237a229840ef9e92b1bd1b36f482d1381e79a423cd79cd35bf6d20d69cee92c3dcfaec3e5b9a6f37416f6b25239d0b097c5a1ec0dd7013a0ed7a1def05aafdfce87ad67c685015dcc89677fa9176b9205797617f566456ee6c4b3db7a6790e722cf3ea35e662247bd7c84a35e1c76f24238743284636c6e4c57d9d8193a6d66cb14c2429da0cfbc1d3bc2311b77d07968e6bd60663a18879914288c9c4dd679acd823924238a6b31578449f7967990c8732acb42c1e8e995936e79c928721100422ee3c9fe67408e1ac383030b5cb1cd66c6633cb5ebcc0fcc59c9d653db2892a39acd3b3da33f316f29de4bba7b339fb045006f4527d2feccdc0bf70585b48a95fd0748fec5fbcf0c7d9bc701ac65e60a822605e69e2c07c460198bfa1aef2ac5200e6a7bd4949394a65798a6befd1501aaa7a615ed5bdca5fa55196c154aef28d6368b8bbca55ce9c4d8b6cd27001e1e34b4ea35e9da7e132fc3e2318bf2c00f8f51efc7636fcc204c0ef8c00fcbe57107edf108ddf47f47e5fd1673e00cf9cb20c65d7f4cc66dec2075027bba6d7d4af8fa72b88fad82580fad81580999f6ea34e1700ea74c9a84494bc9d868ecf5f9c77f434bc85371075c667f50188999296d5dbdacd2c0d6b2ecfe1fabec78f9f2e97b507e4a7751586fba0e37536d63b6d4accf1901e4b1573e674f49778489767362bd99be93ef83061547b75dae590d3c1efc30c879c4d0dd76a50acc88bc7fa329d87e9d60797e956d3b20d723b8238665ab63e63f0e0b3e4c277f092bd3a48db9e797b4947e7d3368fe82d6975bcf6ae5ecc5d4e00175e0bd0259f01c361b80f1ed3b6b09267b585b9f40cb33a30efbcb33e308f6917377318d667f8e378b8f0b6372e3cda1b17efcce6f0bbb0d1466e870f3a5cec8b6173fa79f0ccdbde1d6cd4c1e6f45bcf9c3922acf3602f7c6bbb4b13f3529c761251722cda5bc28082b0a0e9b11434b1a07923fa4b938779e9faf8cedb856b2e2a0fcf058c7aa72c598761277730bc6be7b2ba60d6ba5cd8f7e2f185877a79f018efea0e1f302f79d7d9fbc2dff90be683c7e8a5ce85cb7a6706be617430ec8d0fc3adb5d261bcb8e0c17fc0bc73953cfae0b1e4b1e4e2f1c69263a50eebaa0e18fec283cb388c7a7f7cb42ee7c1e6f0471777bdd4f7988b0f9e5596cf9bf32effa1de0cbccb63eaf5f12ec7d8b1229ccd0c3b436bb8891b42e76b580ec79c96084fad99f161c669d46d888b99596b51b75a371feed869182989c9d1921dd0e8351c86bbdd7aaaf5cedef99dbb96b9b8e6e2e2326b6b87f4e9f37dd2bf2bfc6342143f6fdfd18d92c7f06c071597329c86a5971c46143d254b44867decea3c76b585bb5497c7a89b901dec36c44e6fe15049ad90083a51b1225890bf87e1d9ac4af04f8731731847f41e302c0664d201854e4022ee8e70cccc2c0ce2ae7247382301c5822c06e4010c48f6b88661180654b71eeeb8bdb3c9ecd5f1f9ac450bd73821383197e58238a1238af911eed88649406f0edfc2a5bb7008e42cceb1780b8be7f0f15bc89eb68fbb163e511ce71dfd74cdb4b92a8a63d36e43b8cb01cdfc42a09e579216159e29a1d12f47f4aefa5eab417578f139a70e9e559c8d87181f6466b8f047c3762e2e3b383b57c431309c9d5bc231d6e5ec1c93d68ecc4b5eb2372bcffc3d96d51656c4a5c21d605857f7e22ec9100e2816840171c71fa02cee4e2348a6c223332a1482af0a9338c143854ab87361a3a0ee1702cd8de382b8235b0fc7b8b36f4238a685b36f3e1c53fdbaa5ad56974aa552d71b572c9530efc64ad1153d6beb986b7a0ebf7439b6ad98644fbb5c444877c91ed3ca364ba5d28491a167d35fd40bff8597b81da687d3278743077fe1cfbb674eefe994b399189006e3c5739896be8e8f1f3f3dda2cde0dfc749ace6e0ecb7ad3f98f9ff5f6672e9f9eb9b4edf33727baec8df4ce750208448c893177f0692f7fd742feb6fc55fddc7eda28bd9359d7adce312f71415c8bbd3a7c760f04627adb92d3b490db42bee43ad40b5f072f7138daa7bd99eef2c9f1283917d4321c110d7b593ed84b7df01936e8b967f050330e47fb4de4c1318e0751e631f6b26870449fcdb03ed8e62195444a2965e7b213cac03c462df90e9507a7691d6ae7188ccea75f9787e18fe3d169bce96031a096e9c1d93518fed283c53a6bb22bf6b5ebc537a73c5ba64f9f1ce3f2e99bd55cfe267399fee2d6c3798b77ed1340199d6dc570cc4b8e01e500c35eaa4dc7705cbef30b03e370747ed3f6c525c763fbce21503bf73a07e7613a0cef1340203a7b2fa0f3d35f4a5e2a790a6753d26695ef3f46859f6559e6343c6bfc18dd0e150271c7ae4385452a0c72167fd1de8961ccd9e0bca3afce9c4df5597194dcadfb103a1f1fcb02aa361de1980a64443f9ddd1464129affb8396546a422ea8cc8332215c7f35cecaa5792eac5f184a1a86547760f49b4d70395ef258bbe88c9b3cb254f241323d2b1231f60e23df9f33ddc753fef8ab34921b2481a310df62601bdb2481ad1221944c3ac5cc22ee697fcb9d2c7c484969ab0a613cfe4130c03f2ec17060bc2c43fee5959a4050a9f2c923e3fe42513cf45cfb2c7bed78541ea449e2280ef659e135e463079f63704c7bca12c3479fefb88de9386341c73bd97f0ecefbdd7f70c8ccf0959395e5f8342aca10d7c43ee2e39de8b8ee76267cd8076ce5d9401f6a3bd1e284f57a48967df620ffc80d7fca01e279c4eb0127eb1201414fa9df0f90b834f4f9c81f67aa030aceec8b3c798f15eadd80e631cba0e0c49af23edf5407776767662d08dec9f431b34903bee18420821c4d99038e6b2f8e8212922849d3cd7e2ec0d7e2efac8bc2a04b1138e792f360461a206d23db787700d8938e63293cb424a3826fe147f790911cd42cff24f16a8c9371f823b17c27f7808bffef901020a0a1212ba8f4848065ae639e1e5859e9d1a76a8043661d989e1e1224e44d2f693dad2fce84f7c44d4327cf45ceca567f948e8e49c7329498cebd65a28e7a6e5c4ed4fdd0d59a865f888c51d1bc1dd92a3264e5ed26520b388cb8afcc3317c7d3c74befcd352148338a6637891e1c8bf171b863c0fff5e6400f22eb78d5e3bd586b6bb59481c8104fc41917847348086833c0fec1deea000e1768301f05e5e4cc9d97578015dd8f0e115230716cf2d80c8016534606e37a0481cc19d0de86b0267d1bf79c42b6a21fafadf63362010ed3d340404a2ed199e3b493be1bdb0a7c10908bc8e5df36737bd303c7be995e1d9c91b83115038e1fdf080f70206252ddef0ec1370f2ecdb110d68d2a2050b37b060b1a20d2b56b424b5b4b4d8d06aa958830a152c6a6061613961b156d2b0b2a282061595d519562b15924a9522454a4aca0ca9144a19505068134a516440a14e63389db828386e3bda364d0c9a660a83c9540243a93499cc99419165d817304c3e21bffd0886313e3b04de0fdd0f783ff0110e783f40673fa201d04e3addc01a2a7aafa8bed7f58eb6d085da6863161b68cc16caf86e4028d9be97e7eda4833aa8834e9c66248362103dc4503e236a460cc21f8ee9ee1f8ec130ccfa1c52821162a8e6fad4188661ed2714230dcdbc6084baa0c8cc1c0412e60cc4faa13e1886613d7f509c29faf4e16efea050267b27904d9c3f1cd32578464b664c9f5217a84f9f9f1fee3a96f054a7cffc5151f119327fa09c16a7835e85b592c38c92d3f06b0c4e5ec57bc9109f6fe19823210d443fa4c9f7f06f6808d0fb5c4d3e2439207a765984637a169147e6f6381c339ee51be5db63e97dc75477d76ad0140da7d8fb966cae22a7c5ac4f73fe5ae6e41891cc3e76f163360737559feee2ccc86cabfdd5e4505bedb6f4023b7d5a4504c5555c53a9177395954f7b63fc74ac838e6857cff4a13f4019e024eef6611ff6313a72d1f4870504c42c04f412424ada11629e22a2a2a222a323980483be85be935e433eed9a94d5420f4948e82d794c72f0fb8e5eb48b3b57c27a4ed0dec16ffcbe2a97df966f17971d6afd23d89b678a981f3f7e49cdc3e3337da8049a3e2e1c0ab54c0301090109010d0d150d150d153df7d151d251d25152e4116a990854d43271888787674e20768da76562917467515ac43327dd615151cae2a69289e3d1c25d6acb6509779c31d1e1e29c9f6a0b869f9c232a1a6a191662a1a196d1b45844a9c6d32ef6392965edcc49291f3173fbf49c94b258ee5d377d7c524029a01477f6c8d3322cd6a52c16479ec8f3a2ca22dccd54670175ad5e5d85bb388cbaa37be177fa741d0c9f477e388645a85f2d0304eb7101189e7d0e39c13240660b48f0ec5309cb683b93098e79432e48f21d8c1739700e39d4cda5e5d44ff5c6022dcec25778890514e512289302b52515045d94abf0c9d9b478c987627e359e26dcb1fb00d9985e50a0a71bfd9c7ddca9dc5459eea2de99bf1288816a95570249a477c40374c4d32288456ded58b1c25eea2db67583e1bf6fd5d60eea6da9bfc75aed2687cf525b6d6ff06fcedd50f9ca1de5d3576ac935583b182ed0e8b7fb181cd3b6021df4edd055ae74956d616ee26c604ca9a5215c2ad2b3836a8c444b81182f2d4e8c47c92490146a99e923815a460b62b516d4c2faa1d4b64e9cdf3904551a424fd55da68f042a15a9a59f12135d86e92381e690e913a78f041a52a7cff4993e12084e9f397d2410187c5a07e507d491261c67e01d23a31c1c61d2c4e572cfb34d4e37ca61951e1da5b6a63f2925ad2dcc512a9192734cdbf668592d495baca3dce0e7509cbe74677117abc74661335014473945b160b7a67336704891de88f0784dc9bb0cd459cf0577e0647546595dcb40a3e7628fcc629294b5a908eb45152ab67c01655204c3401c08f2af091c18d2febab6b08b59ce1d94c131a00c8e792fec9773e40d745669d505710312f18c38222606cc8c0bf390ba16375651ce2ce58e312c09cf4e789ec233abc599b34c62d246ee9848438ba2777b76e11446341fd32a7c3a2291cc6958072a9d862914a2d5a01042ebf4b90e84423841d4c43f37fc432285d76b2876239eb3f5d19ad4a393590412434665a04265b5ab086f177423b0e6c14704994fa0dd80dfa22fd39ae88bde08eef848c3862e2cc41d0735ca9268d4f0c809127692243d730dd04e17e198560211407a076abcd514158ef9d0665fa028c7dc85f30a8bb338bfb239291b358bd51a4744af88dc0d16f506da9674e86d5bd23e1b692f742550fc559457b5776a2cf86a9992e5ccbee7d2ec7b2e93dd6eb05871719ab6f57d4a7571969ac47b158af39165a3ca84ba8bda3ab1d48bc4b33cba497f0857ba1f12342cdb84727bb6d562db367b7324b437b2803acfa2ee808fe22cd573e4a3388a6bf2b59ebdc1ff5a3e3b4cc2f34f58e625a187094a2802977cea2f1c6aa130fc8547cffd33c4043fa0ee1c0829c2882e8286a267f9372486d76b6f064df18cb349f54e0361f94a65798be669e1c29f3347843bec965b6f7bab3fdbc2a16d1eee1889bf99fe7c3a746d56e9b0b694bea285afac6c0e9d85776b73167f5322f1adcdb2b0170924a0dfe9aa5e71b8b54f7b7bf82ba1e27d4e4a7b93be52eff4d8f2ade5d29e7a90b222575acf57aca7487bd3f2cddeac70e939f2e5b339f25b2b3ca2b85ce1c2fdb9b4b585bf16dea28594739b2e5b3c39377bdf63c8c3da1ecf4eef3490156735799b7765398b7a917816ed7e67c397749616d076d7303dc3c265e567d9640b7faffa9bcfe26e69cbb2b0b0b0b6159a66f1581bebd9152ce49cadab424ada72151b8aafac78b7bcc567bdef45f3525a172ed5b3caa2d3bf050b96675db8b356b85cd83bf3d25a53ed5ebe1694aeb097a5c25b2cbef296cd5bf5bd8a6d05c55756a49472c52512df3eeb56573667b1b88a6f2b347fa3b3d81cf92b7e73e45f9d6da5a238d4f9a141e223104ed91cf9b04710532801578fa2135fed1e3e1ee5ea748f7e140b875e49b240b13414410b51b0517dbfc1960ef9d0e543abe21d8e793b4890d0f0978df8c5e2160b0400c8eb614bc7f30a5460bace331628e49e772562725895800f4db56584af20410d84fcecd498ec0f939b5c7b3b0200e4c504c7b425f2c3648db41ba9a66aa41d56f95b6de9f80000793d733ba2cf8be3bd05bc020100f2faf8d0b6dcc54d9c0e8c043f30514cf16d89ecec686ef21f0100f2aad9d1bc6584f5016b5a0ac8bc645bf3d598146072cdb614006b3487359af561e400afa603be130020af1a936deda831026dabe32e46c746a52bd0164ccd0c4c10687238a1b77facb466e8b102ed218ec16c11cd4c2213f4c2575b36e217279192f9f5d33f7dc44c1e12461cf3220f71c7463dd4493a491399b8048dcc46cfc5ce6cc4afee86af7844ef23dae1a024e2bf9270c7ce44a859a49461834bd77c5bbe6504f4a1738429a698620ae83a355adcb69d7fae71434d724640efd9aeeec88a6500f239ccded221bd5fe7e3403dfa6c19f87aaee8f1455f4441d09e8bb649e7a4ebd4b414c0f9c94fce39d62d2cf3b8a338de77ef85df0be4eae62e5acbe6b2d9dac25dcb63262ff93479e6970651939778986e6c169b7560ec2a340ed2b33f2790c9cbf15eb8f6ab8786761040470fbdfcf6eb0d7512bffdea2127cf7fd07a71ecd1338243fdfadbafabf39da45d39fa55c35a0d6ada4c25c8bd3d7b06c5130f08e640a6a2d2af94a12e995a26b26ee6445bb9a8f4ac587ba2f3283b01bd2727b05bd3def39511cab55757472ba3d5b31caa1a51596943ddaca7f97395da52d1562ad5b3c3a8a9e179c2eb5e0d4f921a9e269e9b60fcaac2f81c2df3de51d2569f3d25355155df4e2a5551cc074d54106d2f1f24111d1182954e4f929c18b109625650bc8efd4e212b31bcecb51cccd3442c67c2315666657472edd553ed25dcaf76e9d43413dea2f861aae15cebba3aca56ef3dd7ec5df973ae1ad15c5bd5d51177ec2a75c56465c41da3fc5d19bda7e1d511c7a0a0fcca88635e4b0d4301e8b9dec327f350f879aef7cfdf73a2a5f9e36c9e9da12d3f04cbc02324254ff5de50cb3f7b7ac2dde984040a3faf535373bb37ed794bd3faf5867a80d44f5886f5d33c479e7ba847097ffb68fb19ea4117feb69326d2fa4dd39641913d61b31e7a514f78f02909c618637cf37475fe84c41d7bbb7826909dcfb2a10cc9e8fdf09e4dab3794835b7127a0d3cfe9e7c9b39f98782551722a923df164b06750449520294f9951f6c403a2913c1950bc1f3a09ef25e525d4aed34933c9d2ce493ea747f4481e51249a840204a567458f320ce33773bc1f5eab55440bfae63a35ef0fa053135da726da16b44918117db33e388f7e8057b3b90e575999137a0a027d35d1b614b0edb414006b3887359c47dfac910ab476c0cf1c6967e75f4d3b416f13b9fa95e2294779f8a81f20281e1d88cab7d673ea3a3501afb237d353a6bd3a29aedeec583d8ec35864291454e554def26e9e5aaa95a7a438c4306f718e73592fcd4bc9a285a354d65c714a69be8285bfe72d4ad3df7bcf515a5016a8155dd3e73cc57aceb596639ab3a81cdbb1f294148e8310c214d54522c555aeb90a57a56caed91cf9290e693aa5ae3667a997e63767d58bc46f0e7738265a080493dc103aaf627370b4f70842c7ea5730e352aa15b75aad6cacbc853b8e31638646883a44578ae2a5b44afe5a99bfc7da3595567dab2c1606e4c31bcd4f4ec33146550ae74ac857d919cac14fe152a914dc79af43c20d9ce8d814a2d08a3af9d6c23127df5acdd96c3047bee692c3a1798f206cab2ddc81a60ed0dba5febd94ec6022290317fec29dfb90a8aa9bd941ea90c62084fad153763b3d3f453d42989841fdb9dcaca774068ae33de7da7bb3552f262f0a819c8e7eef25710c7c1281563b11481412777ce24f2cf21a663ccfcd04d9d34fe24e27452358b32828ec9e4e823c4432f1d407e69009f48d6362298679fe7136dc0905a9a3be8570c7fd845ddc49ddd39dbc7b4edbe69df4eae61d13ae414f9bd370cc28f774cf0e93bfb1c7b9cd9bb3cf99b3c13c9311723c366fd77af36ddb7cb31b372ffdda497167664e9e93e293ef177492bba8c6e093f5fc73518a29368822490a415128fa27c53f245038fa97d409092d6982d51223c9449a2c1724f141c27a9801167b9703c2991e9e2550a3c10f772e7831700baf8346425b2832d2bcf4845e2824c435266d076980b237868b75b2773ee134ac491afeb232d0322ccfc55eb96687c5326a819525a459d6a32c2316ab74053a1d7246643ead0f589359a13924c412621945d1ac23a5e684f6ecebdeb32c4a568cd0c63f6727d4a9378471b62bda39a9444244df0f1d83d5d2f3b960b4f4bdc066fa7ee8178425ff86fe2189c251c73333f4ecf04817c3066cc2e8e1e670a02d2299bf1accd923c03290a7a71b6999fc31f992b36d69afc9665b9abf9aad8772f03a06e2ae2dcc418dd7b177a5275d47147486223c2de37aecec3cccd3bd9736d02e8656bbae83a6523727ab1d06bd38a883205114423f5a2746d3901d04c5d945618676eeb8f399cfc1ec773ac7c8ccace4410176d6e1cc0cca897f1ae4c89023438e0c3932e4c89023438e0c3932e4c89023438e0c3932e4c89023438e0c3932e4c89023438e0c3932e4c89023438e0c3932e4882121facc8b3e137d2688177d46002ffa4c00666cbc1f1e842625da73e9d81dd1001f1d4b5ea91cbab74c6623450545695242b008d0954af0b9504a8f62840f02acbc9e351fda1b58c40a11049e0420055e4e067430c2c7f604db5cfc0814ebaf088a319c41760f6709cecfb20a748f59171f74ec9e534cd60e84ccadc548e6f0fb751f6f67106bdb303076b65a83954e4b37ee9cb019620d9112ac69b5cbb8659acb98d59bccb78c07a49a9bd93712dd54615aa604297b06616ab2d9067a61987cf40c2b830f4a49f4c2d0b44c11366332349147492fe35207b4f762228dddcfea348456d09ecb7b1c777289f2d33ce1c03c0a0a676f11cfa15038307fa200cc73f606e51aaa6a28e7eadd9e73ee08231e754d8eaa17e6a9a72aaa6aa720caf9fb8742d90ac4d483790e8582284b0473887191ab283512d1828639ad372e9e5011e55a0dfab41311cc51553bf98b1bca74aad7e551aebdc83146abe22e9aa8404fceb9f4878408411ea25076c6c2fc85f948b4b3b3c3444d74188e4179dc8971891fa36b188ae55128f8500ef31ae408f0de4daee1c07cca5e40e77b687e4f6e7294da23e5547393739c9f681ac51f6783825239bf80ce73f602d4e228c1f29ca3ec7bdd3dd91e9c251202cc97c8b22ccb7c09cc623e332cf32530dfbce44b6c96d5b664e79cf4d9b8cf28f28fa8c3f284bd9e55dc18247b5a6602473e3f7386bb18b276524a7f3da4cc5c4a99492ccb324cc690b69bc249eb88410c8b27e8d811eef8d15fe1ed921613c282b0a0968135fc22928aaf416d327be367d88f8b8452c6930f77d810eeb023251ed0f8172be292c7e76358589010c748e92d840561471e3b5231218e89ff5810c7744ac5579ee291c391861784e189c7b81bd2b91bd8134c308627d2f0823018ad38acf5258703f3410a9cf085971eb91b04c09e60823118bdf4a7e9083c6dd9a0271e05637156551183de0b17e865201657512f7cd6e6acb1785ec94a9e862cf5e4ac1a796e1fdd1eba0dd43cfe2831e8e4d1e8fd00a392fb8e260ffc71f984785e7f61d1c3240f79200f8f6418c5333cc3336cc3730ce2fc794f80b3efe8e82804d397d0a6f6942084a7092896f0b2011ba88e1170c0822ca48108133e4d5834571001109e3ce10c32e042cd74de7c89d236bda40581841f00610b3818728215d44c5b72cd4dd6c843e224e94b3604ac9912e40b4a307201923024a971898116a6c063248809aa5063243ab74c0c7a2f2240feba64f6ce3ba9128667a0f0df901690f03aa4f0e1987b63900e297c30941f52076b9613180fe40b5606fa80d77090731085daebe0c9b3c7002ad244851e6b43db71d7cd79d7b886968939d7dcdf111a4c8d9121b6f76e94e89fc0f3d7e3f9d5f9cddf7b76b337fe783ddcda0ec11d052aa2067a3bd4062150f73b1d742eda610e88772e033974426f07691603f26f3687be690e39df8cfe142b8ff67abd4ff622f15c8e946e5bd08948db82b68bc12ef6521ae8652053a97b2e083b08349d815a665a0bd492812010777c83e762671e4c212061a027f442a01d86401c73b9c85151bfa24ef7a90c1a74a803a10e1a0328ff6bc28b0a3a289241a533d00bf48ae8073fccecf2b56c9e202ca4d223248809200ee226f87533e1f9fd7010ee611e469a2f7d7c98c7c777767640d040459e6f1fe926903ae39d87d506f31a54ba36b963ad1bdba66f189c4ec3ccf188bf711076b1651e19b7c8e31aabe6b10f4fbb30bf697f0efbd57884b63f1b29237732b0dcd32e20d03b9967c89150d00f1d96da12edf54069666674f0f3ec36608b88f45713e7cb3a6766cca064e68891328739d809bd6f08f31c431411fdc5aa85229ccd249279d7213f42073c3986585283ce8d4ee6178263eebc2c1b73c3ba1e708a2172908146ee5e7498198e02aa7a29bc2a4946a1bd1ee8cc8c9126cf6e2309e63bb01ec11d124c838b1aab3336b89be986f608e8dc2de0b9d89f98697e228622b893c140036204a572acc28671930f7bb24fa9396376cbd7bd61d8dbde7b2c45c2d6e650e8e1d1d3b0866dbdc99ae2d8666f067ec3369aee916d29cc5195a61c424b6137cd89ce922ccaeaee534a4af69d22847a292809049992020429df73081bc24f91cf532ac47cc69fa5470403e3c4b3cfa02a171bff4cdc8d59618aa7f88542b7e19da9266e87e9bbc4e150f1cd1f14e218ce06d296a1d156ae692929a57c9eaa3728fff15852a6524dfc6df963b1a4fca960b1f6f22a25fbb1c8d4855672d05fbfbb01596f52fc3dacb7bf53af5d3af720ca23c723c5dbb92b6d0efb4d716853d2da4039d91be92887f6a66c0e5f7e94d043e91c0b44390d438d1feab56cead956aa88968159d1d10e79c0231008e8cfa64015cea5b84ae56ea0a37ce378744a8b0adbd29ebdd0f45e8ba3548ecfa9483992524a994259e8f00894c1394b4571564d719a56519151adec9d2a0bd37645765b795a797bc35ed99b77573e39da290e6dcade3cce29852b8b72ce539c364ccb50e85ca75cc52fcca7dc1cbef1531ce370b4dfa4ec8591a6b693a5edab144f4971cad9a468b0ca4755f8a80affbdf71e85e2dce5fcf4206d1995d552521c87f4149be23a0feb8d2915c553aef339fc28160201cae09cd61b3fc673de347cc25c030204e23db641a17f1c1297a5e958a9b65ad05215bba03f5b04778c61b08b9899819901f366241fc11dcc6b8899e21083d0e642410e168d11269e5d88e7c407bc068bf446498dd0db09116b8f4704f3182c836d5d8c993541dba1a5696e9983254b96398440e285c811dfeb29061f222c0e1a9cde25cdb49d38972e46eacef877675eb58282d10891e32d79b101d78da091db897a96652855f5ba149fa9f4752928f6e2a8eaf6ba944ed5a5ac1c7237b65f59c8dd983fc3312acb9e6267b84bb90d1fd0da883628309cb82d7216e74bfb66666cb0ec5ca0cbb3bf98f7ba76e8f2efc5bc212362f84b556006066aa4e74555ecde98c61cdc4920d05214f4bd2e0c498dc44b96302fc9883a23da5a769ee3251b608297700e2b0e2fe125df2d196270abed3f5443a5edbd3b4ba552498bcc936dd068c2a20989261c9aaf2934838278439b4fd5d06b53bde20e5512d510c74c56bdb8530d4dbfaad7b4aa21559248c3aa17774352baeaa54aa21a7abc242332b9d69e15718cb43c34598929a85d1b0e2f79e95c462406221c9992536de9e0e8a620df6273384c1396a206b7292439c9df0c04bd13654a4c411ce79ce61cc7d919ca4bde14d4322b40d8c5be12c42494c494195d164e46f42814ca6998cb885ef6046dc7e94a818ce8a1bd3165440f71f4cf209ef0e19521dc11a99270f7aa17f7faf6ad76bbd0b7bdf0aa86307f5c8948e6a67a4ba756b7ebd042118e873b0ec21dd7c3a37aa994b05ab820a620d3112d50ae87636e2b4945c43197e3e1789e3c3b1744f552255129e18434d79e55d31176994c4226a1ecc532a65767421cb3599350575350290ca620d311cef46a19d52b4a296483a1943ca38a2617e4bd94da4b42b820dcd5a05c109b1e8d06b4399fe77e7c3894100ad54453ce068736f19cc4097107b91777846edc03da8ed2d6e76b508e891407342313cffe8a3cf7f335282784b3c149e17c9ebb9b13c20d79ee01bd9c6a66988caa66954aa582a887dab66dc3b64d6e5b6cdee0b66d2a278ee7bdb03f4ef5f24226f4afc28cd04b5f5b7d4fe7d5c097fc75d3a56b9889551ca3f1cbb401b17ba8040d15c6494d95a21108000000a313000030140e084442b1684426d815d53c14000c96ba547a529a674150216408010600000000000000200082007474912bd88a808bdc586fb436f98d3391bfe214007cff8682163329ef728d817c2ad6dcb09b99221f0f791fde165b63b6b37ebfc82f6a95ae5a689d9a6764a1a1c22f5c624b89670c709bec27168f9ff0f356dc50cd24745899e24ea6243ffa3894cab5abfcf2b80b16215f9d852f8c14fbdfbfc8361665f128d1f2425f9565512db15e5d243b5fcd80bab4ee64d28c1eaad7d039a2b6b5bacbad27b54044889a1fb0b5256cb96d656626bf2af8e7159c6a0435ced9c4a8b95eb32f4b130a881884b244289f2c637c0ae5ffbc0c9b9dd880f2132ee010551d03fbe089c3a0b0322dbc4e81f22be44aec7d0d4b507e42c700a07527a9c79c9b0559762e9c921d027bd0cd1371bc6ccb1639ab6735f742f9491de369ce9f83a0d4613d94684bb99bfd6b2906e59fcef242e5f4a43facba3afdd7a50e4568651b395d99d33b590b547c7236844635f9da34b218c5696aec623a5cebba5483174a39c7900a38f9b83d613d854115aedd50f0dab02fea43614ff3f3f5a136dd09d6901c36ec28802926a214892264050982ee0ad0bb6e253deb0b977aef1c361d39bbee8492047973e23c94d8d05d95dfd74cb4d39f8df8c34c0e4505f861783c81a8ec3e443b1db280741d6c2e15a36bb3c7e884c6acff073ed617ea8d015b6cc58b96a92c0bb5676619c2e6f5bdc43c2937ee86ec1eacec1f7b69dfa994c7a282d1cc92785f028ae580546dc99a220cc520d1947246aaf0fb5ab4fb1a25c495314abfa08fb67e445783a98804b7edf92ea6f6a79d3229b452a4c4786acce58d1e3189be9e550ff96d0e69c70bc9682e7c28f04e30da83ab17d59561c680ea1b8c402042dd7792554397164a4467c6f7cc4243611a644e409f59fb126ec9ff9dd2cad8d028e55222bd70336a0b194dd91daa4718f8bc4c5650a38979b9367227980b57991923a5a3c01c906fd1dedb4eedc76f6fee95b4fce4cd52ec040437a4ce4b1d3734205c4ddb8e608588653bc44b4cab386dccbc3114570869120c91abb3a6282b649cec7b5a77f733c550c7c9ccd8c8a6ad18b7b8de1df5a5742029ed5ea222d0cc800c208a13036ca661e06f11841aac7dff10395e79d37fdc3fec5bb4682cf5a1dd4eaa448884758db03a1524ef45c4e8b234027ca38f7c4bdc87d5820851d2a504975570855fcc5bbcca00e25233b2622360969e19385a363822792766047d012947e50ffcc89eae138ad5556023f3ad658fae3970b315a0e95e8226af58d0bfa9d1afde6799db1533fcb301da0c8cf64fde42754c153f6c4637407b8339637b109e5777a7c36c215f0387d22f5065f88dd975deca48720bd296c6a400abb8cd72185c2ea290bb8d62cf757f89b0802a07e50877552eff6d9c4d55f322a906d8431c684b6d2c412ed7e5bb3bdef24ad0ab77abd805ce8de6cfb552368e354221431d12038daf6cf692e07f8196e97ab60dba89baed99e89bf45e115668868127311386f72b4f04e245e0e6916cb18a8fa61ddb52cb290f43db83d29a25d46867ef728ba727be3fa7ada5478eedb3448afa1dedb33ad41e7cf7c01e718e75f64452c8836c1335efa19e371a629f7c8ac75d2e292b196c5ffed99d411c407fd338dd687bc94af13a440e0fa74097c0db3da6d01babd02c030456347cbacb80b1898817e2f7d17459b0f32ec926f1a6293823502908bd1165bfcfe063a5627ad4a3e400b59fd2f1c463d6a6814783bea7cd814d9d9208cc5b0a54960fa0488888ca6fbb4843bc134c76c42fab2e1a2bd9ad3c2eee04ec1873d9853141a075bedc02a27d4ae1806616d2c2828d0135c0c2a022038930fc390255e14a8e2104c891db6754550212139d48e3a9cffab7286f7abaadfa6a855262c36b872f1f725aab41c35da6984b212a6662e5aaef809076f61619ac29fb6e7bbc6a66ed4016ae47a7d31fde4c5c7c8e11d95b15587108c9331e0c25f04f7db434f1799da5a8f6f632776a00d0ca35f49b91fdf5f60e101c9004836bf5f807415faaad9a2d013a989802e5bf284fa818ddd7e70b3ec912ddb6cd62009bd98cb4aeb14754c44c7f426826ee0a386820f95c113e4bc67b32f2008f790c86c10447a06ddd31fd312ea942f1e2ce1c11f05a14d9c67e9d48dc31b7dbfe32a88be0d6aa6dd5dacf22997c83e56e753fdf0c4cbe4aa3b4aef2bba9d1db81d651331d49953099e499fc3a7506795e2f33c5e9ad7d9903810404bef0308bddfc6f4d3b40a8f3a1e1360e83c961e2e80be77b7527d7a22740d94bb1a1d360ab05e5f67136bf1124f1dfb04c8fa8403541d0a5637c9b76586fd37b0a46a43fda805a5479a8e15e0c1873133776c003a3c865a14c5ec2b6ae8471a9e12ed9888dcaf7ad273f79f53fb07a3bc63ecbab92aa0d20e1d16dd30dc3c8bfb37dd29c8f0270496aa8113a1b62188634bfec8e6b8ae115e201cca0b2311742b40405e6b44b7506c085082fc9107475f72903bd63f70acb43fca51cd1ac754dfbd1f486a310572d7fa376aa2c17318c7ce6cd2793c15678757a0be5d7dd72e49e7e11ed09a1a1be39ca42d9d969c0913aa136793cd545aa08e154e546b9e47aaadfcac2d551db3e291cad502a48e4a0c2c898dfb676c943ebf97fcfa01b67cd62a5851ea06d02c1eb65685382df70256347adf83a7564005767cd40a4f80944564272bfc4f052508a36dddc5d64f8a0992d7d6dc99da2a83174f5d796a7e82fb619c367e2054338d86776b95317052755bcaaf026b279c6050b73b6feef7a8a6fd0b0c0e46a14d38d51302ad7a42e43b16967fa80ee7ba295eef33e3d1d98218ae3b8cfc051cd65b07cd7cc8394c32edd7d946666e0ab4e0ae8ceed34b22593f7b50e03d550ae3a87f01ea77e91173147ef7b591255336a2dbd6bf1dd0c0c6f6cd372f4d992efc4dd4d4dc76354cb6b69714d686362d5d2cf669eb1b1fa58d5456364c9bc7f7c3aba1981215e5a256d6501579244a493006143f2b52504bbdfaa091189b51dacd402b9af819a1786bb5c0ad24a952e526cc644f3d0c5522d0083e34cadaffa154c39b05350c37f288ca87e07457699cf054ac8736bbf42efc0225d67f6780357141eab6438bd46dbb490abcb08a12048131155cc193799d500222e64d9a060eb212320078d42c699035b9a44994cecd0d361e8b2734083106062d1122ef28c1d2b023851c29c5076a34106508ac60a4f12934a7302ed3ac863882161b4a76dafb8cea88589c0422975dd52a5456e925bfd161d64e0b4aea6b8efb4d8d45a5dbc9c27d0c14241ae1d823621201542acb1a4bbf526056a035715f292fd7ad81f9e689bc10439f0cd9bcc583c4db53ff135ecb66e5d0d941cf0448c27b2866473c91fe518b5fad63bef3315522e8eab3b4880d1cbcc0bcefdaa14a280f08116b5030371196fe1ed36b55fb7ec1d0300fb3542128395be11a2b26fa505032840c1c309a7c3f9ca562429f33e059bfdda8c86419dc1a4897ff4400bc405125cf7291f8c5aa2e47e7763fdd3f1e84cfa2f5fd8088eb733fd1438edab15a74f3e5953634759ed0d7521380fe1d702a17b652058ebc19d85fa1f867970ff410e3bb88d2f93c054db4cedca5d1173a5b2b117302bed5d366710de1738369a2eb85b6496d7272f6f79ec2c2cb78c019bc4544a791a42b447331a69ce4b227015799ceb0c31f72597f15eceaffe1479b022b36f3b666a1490d07ccdc47303d5869c5be466c3bef3bb9c50a4fb186f65a459db2acb1336662a7cde3d5baf82422806272e80300dc8c40b0043d5a8ddc8c18a177a2b5ec3f0ca759d3854177a84af5558a1d8e4b386f2bc23e15cac2253448cfe54b1dd8f15cb831b1a918c67c4504c921b1e4cdd707f8318ece8c9de0642a53bf7387b85636ea73487b17c1f5ab800fb44176b654e5b1e4888fe430ee9c34dd4eb2a934a54330d232331f36e4e762e4f030be2408a748d7c24a69ac2698a9ee3f12890bc24ee5c4112c296f2d36fb958925408d5f9ca2738b08343e4e010fa62204427859bda8ac68fc31b4f4dc312fbaf1ae3224ae2c328f3eff15adfab9cbc46e984ad0a8c8e823736fffc7cc582ed821e8f5f705d4a2fa5a748353f6029f9c48ba3ac869510405b728e703eb1e4421d5c03a261707b1081ae733f3148c21401089741b51313d0864061deb60dd244ffb3103e20f701f3ab67f72e2ec3f1e3698a5c812c38691088ef69fecb9043c38b9294ef0b9ef67b67000df0383b3265aadd1e19abbe2c640056976d1e69731fe14a76f8413be22df63a898d69c67bc83b9e3847e1678d944fd05f129a4d66ab3bf61c29b650bf1d988ff8e3bdbc50dd544803864f83c8ca7d9f994954948aec4fee2799065becc4f86d7c866f0a6df3e2aee902a46194ec1e5be68a87223720e5a28661e24567e41a6f394ea401b4a63b3bc00e1c7ca0e8076457e63d6b369c3b9c7d227f773be9ccbcb04648c32975203c6906fbb3a25d0f55014e6c598f3836959568333c5d2b1f6a741bab5f6e567407e9e5397129df6cb8ca594dac33483d2be4b9170c6ebbb16c59e3448b3604b2baf606dddb12f59550e6d0eae871675f87f0e44bcf711d483820eba7ccd70a0b802d09c4ec04d44c8f30cb06b82d979fa4706c0edc401fbe04859639ab6a172bb68a73ed5ae52a0cf76727b6e8e6f6c83e858c7ae4d0ad9c50c5d66ee61a24b375a53491655b3b83c394a0cf5f70a7093c890b90c23405d54391c9b8dc9d70f50aa5d9704995eba7cc5d7f36e6b0241aa9cfcec4b04c4f4545d6e6b2043d9a1adb7d79ab0a310bbde0453b24ca75c0f80126e91b11254236330d030b68f0f563d8ad76baf6072e9b35b1ebd44ead06a69dbd58ad0b9b9aad0c5312bf06d0c17fb1109e9048c7a103f944a11104d6526013f9587bb1f1ca9aede19169922daad3d7e455acad662ef3c836f8dcc6ba610cd315c6c9a4de1cef4c88c1a45842ff6691322f222221681db57bbebd1f316237262007457bd7587e0659ef5cf35cd3abd5e172b2d40788f56669e8f9d26a1d0ecaa992a6949aa59e07852e755048a71dcbf5844f3af412841ce6b8ced8f2b96fdebc7be6495201379aee90c96a86654f5264b1fedf4e41b6d4a4c70ab0344eadb7a7b8982fe398a0d63bd1e3c6fe71f6d9b0120fef3acf7532c64f083800360edf64f43a07d1b3c65754f7ab49055fa12d2e4fe2e2ec6d6cd5bc5522e434fa1ab19ab33fed3a0215efa974dde540cd24595935804f42e58a1719006b221d90f79c60689b19e14e663c36ced36c4ca6c1b9663643ebf441702e2d114688da935bb155bf6abc46a19a5f6f7c02b7fbbacb7349cc48473d8e3664dc57a15d712e1d22928e944906d962ac472c56a5d645d70c9795fc5408abf8704d6d563e6527e9e5555d9771fe254bdd21e2693066cee737273555e335d2f75d4c97d860c64c43b10a73f971f0928df8c757516b224b77a7080b8707ec4df8c4f245e3c53a4a0a1b83a6e03270952e2c8bbbf8ecc99cad000055b426bf9803fdaed4b1af2c4295ff840ced7797c4732ffcbf664c4d9c296dc8f7258faea64b7030dcac414f3501e6238303fee256a961aa8217f92f08ff318a40485f32c89b7a8daf8f24b025edc4161f4e3dd1f8cca421469bd3d8ccb41f9c009e3fd493cb5c77bb22acbfc55555af884a71fad60f3e2733f0183fb26f82044fb8efeac5e9bbbd04c053adb728694efc1c05ec060a2fef313d64c10a56f00187721c2788f146b7ee4ce6f047e6a148ab779bf7734f91c52762b371dc636f669534d9d2c7bd2ee15dd96539f9b82a6216d41346d9397f730384ccdec1d744b75990a9093e5f42bf8b082d68300d3dd424c03254bb04091aea103da4a7760ea426d3cf3bf68fafb53e6d7d1505a26122bdb62aa01098a98fde496667c090b497b5e52da7828db8997a9655be07408bacd3cbe5f9840551a52a7640ea9a3f62e64f018434610a66842b802c7cbb6fab1ab9a4273ec48102c5e2737dd505aab6b62baa85cd52ff18a464bb7f85c8667914653bb4b448760a5af124747eb575677e402f547534da6fc0875e9d889514ce21424913f7f59f9b097a0834916697bce481810a08b7dad0926cd918c4db7ae0781131f01baf6367126db9787ca66b7c513b09eee9e80728248c4bdb17d5b207651c0b7a9a00eff088362aa23e9cfc412f126da5b91b6ff06530e5fb12fdde831b0af3c948a46d9e7358f73b9de5f8d2341ac5a097e2c2f2a1551094ae331d623473860f6215e64f0171560ab992a3c28c6ad8f33d5675687ca671dc17864864bd42ae94c70471af927f60b0cae40197908e45d72b7f1482cc49ec8a550f838e1204ed48ff0ddb831c1fd823d668316a1738fef8d576876aebb4ae121357806d6098beca6a0dff8e9d840fce924bf1a040c562c1ab4af189c65eefd2ef566c5ab51849e9a0510801c53e63cc600fcbca0b9048a5071743bc2bd82cf451c318c9ae1ab9b11689898abd1285b5097ca493efb7b9f0c1a9362ac70a1e6cd11e45b1952438b0f7835fe7c79aba62cfd910f1fe4406a7167cb1dfa73bf0d495de78bb78c56a484a86036ae22e2602fb75e49ab5522e2a619783786863a54c023e87bbbcb84078558240e1ec440ff9a618329c6cbc78bc7b3065460fe43edf903c58bf38f7b050faa0214c659872b23086575403880f2b1ad21c5415a528637058d5a22aff7b3d85b4115e602abffd73fce5c5650427b1d768c8ca2a2f7eeb71fb5ff070e4bf55b24ae85d3dde829e79f37d6d64b290e7606af59a8c051b7a24b8d4f631f2a7ceb1d5b3ebec701f779a54a8028d5bb46f178d2c0a81caefaaa97e8b628946ae730aa38d6e524ed52ac9b4318bcb289ac5e9a1dfffd8ab0bb39d15786d5ed23a939961b7a96db8d66c3fd7d873e61f8012256aa573d0330bdd45ba3cf1b80338e162e7c76d8ea973488d08372ee05690c9ab18901af05046ffe90128df6cdf0374db783545a2d8e64d9ea2614f0d1926f4b60351232acad0211988cd0db50bbf4b0e1665c8292f6c285b823f05b0ee261abedadec161423e8fc6cb75a7a6e1c53ebaa039b2635c44ffdc485b604309ccf80077ea3e1e59766f849f34bc2637df4f547a0ad0bb882e83771e8a2669866c638b27207e53c17dbd38e38b33018922d6dc27d0bf67103f2683da661f9f22e6d490d287b1ae02fbadb9fd4b10e81a989c5eaa0bb9d418a740b78f908a6277d3c391aa018bda76eb63a373563af8afb98d41da5e12b61747ed216bc03024f22e606169d4f6924e6a3c1471525943683f19bb18b9088133e8a4750ad72a2d0098bafd4bb0e3d5b7d89a6b3db256490460bc09ea9e0a49eea22d2b5754e7183bdb0c059d8829cb446284e184f8977099fa8e3579e223de1b46ab5d792d4cb28d017927b63c591c283304906ef3e7dfcbceba219d4a145809297b7f03a71eedd4076cd4a932a1f5aae733fb2b94233dd338161cc0999103ef1c0ac43b35688387490bd1fb324001dd47aa3154ffc32e95a9b2d9610b71425891909e59a590cdd04f83b148863917879b8cf7b3aba69e5f4a2047385989e9a23059a3dfffc0ac4297fb1a759930dc32376ea32a28e1a86295fcbd9373caa54f5ceb105d53b8fc3340178aa6386f217c687ecdf8508f5b0c534220351b02bf835b3be8a6e18e544702f1dbc6112500edfcda9ad7cd1b9ff155c3a989e95d34f89bec8390b823b8800f41cc0ea48451c185ec3798c5b24193673947df2fb17c36c4b1e237b14d0545b92fd5f8e97ba3ce66788c7103df686b87d02a001e9c200971123c83d38206ae8a4e9a7a8a4d0256aeed37873819d27b27052d30c1db303698cb6d90a5045c69900f6b94a66250edb6cf02f40a779e7543b15a6ebaff5e3eda053620670924d8bd8be103045f0464b144f3aece7ef2ffaf24278c9350f0455f366ca995b0e5ff0c7ed09b403a9d30c38f8803278f5e6eabd98988bb02ee670772f179161b712ff9700f6373f610a2cb264c436c42532f97c25651fb521868369dc5ae46c7a42fbe7ca4808bbd88390616c48bd44bc5f73339df512b738d35f2b7099b860243cc6bf84162108bcb66df493b6a6efbc258d0084967bff906e0bae01de6b7e4a640360b1726f3acd413780c01df2bc4330e611da80c7fcd86ca00240ca1a3e9e21943b7fd6ae5a4572ce04879c3366ee73c896114a32ffe84a312098d55ee3cc5ac24eb8afe615100b03bd87b90840ad83ddb406dd3c136122ede71b56b2c6afe7090f169486e15bee7c59788b844ba64f5c25da8180ea7d393f76e324010e3bed1ae95c80bf2f6a7b3dc2c725af65920c6c05afa19642e3e9dd222e4d7efcce9a63974ebf67ed7ae24056794794a2226e750a622593e2850d9415e4426248a60338a288d99c3de83d1b0305648d8ed9175fd40e59aabd6956c786deb6793adbc86f07b09aa33bbfaf92e7da7e5a1245d3d7e44040cf5023821dbab3328dbef9938776193c22073fffdb8389b2444294b66916841f18738ca79992818364d6d7cc495be128774089b7a3135aac6fbdb0e55f618960d787066918f8fe929095aa5801df3c862b25d6cd8512d7a1c9f8b3959b55000fc29c15a68bd9e151a4e31827df3e310a2ffb373c81fa8fec61072d17d3435717cec70b33e689e905e016b2b5f6871b22497d2a85065f1484b6e8980fba93529becaaeca59ba06665ffa435da349c748d823309326da7fdfe19caaf584c4b48c2afb924b2b82a6a3041d110d421922771cd20f0334a6f758cbe8e6254a5a5ed9c2bfa5c427a127ea0b2bcce9fb13e18fb0c4d3b824b3ea3f9667a44574458b112b8286830b62915a5e1625dff585ecc77493e372b11af8f8c9033ab5e710f5986fda1a0b5c0aa7f68c3e42406687c70cd946280dec2cbb6082fddf98a09866ff128a3c7171d938106133ba79080f35c6786e0c275edf6835d725c8665de6b93f6ef385c613c5582776804470adb1a6f2ea92a7ea78ad838823fa7d3a32528d96e2109b9aa8cf971d12448870f2303d42081f37fef458f2672109577e585a4eaac168a850f5348b25ce851cfce454f07bf26add65a45b9612ec9b9e9356e6dfcd910280da0716038a0ee76a997d377f689605e685ef8c247918240e1ae936959b9fa277d71dcb6f96e756a19f6c7ec97354b77900c1aca9875943442c4f45c8cb74a1d277dd10e9341345ca39409480cc2ef300ee56b51fdf3cc2a24c5a5b18a47a5b693827ca9c0dd271159ef2390c72d7adab8904ab14373a8801b608669810f53de8378518c281ca8d01b7d1fda0b65650f97d4a63bda4961357dcaca105509240dcf5dc569a8c8391e19cf18ca24e79ca815e1e25dcbbb7e5dec6951fec325bcee079c97c7c92b92022d99e8d1dd5a65e74da35e9759e9427805ee1b154fb4e8b63bb2c31738007e3145e550b330bd482d983d8a6246496ca507508c383c1a70abbc976c02f68c4f954dde587bcb49af857c7bf352c2b5560c9ca69fd773766f923004584176a792e2db69ba067b8ecd270c19726e12768f0834043fef250827812fd673d59c670a119607865f7d02a2ac74656605f9cc600fa2fe1a54ef4731e9761f6cfff95748cf08099c214e0dfca507a263b223b3d85097294b07208ae51d509dddee4ccfe096d2384207b93b2de14e3287a759c20047ad46ea9d9ba2f7025261e5c4ea3ebe57614264445c8058cc93cb0fd26efbb47232cb1df7b692efd89f638e5b221cefff86d1017aa327cd6540647f3d0c0a58dcc18bdc18a660cab53656e3edee238013f78283542c9d15b0168e5eafb2415a4a4cc71fa0af32603074b475247cfae937aac8eb768bab7848d01660d84c1d606739074d59f0f131c2e57bfc92308b4172168a069f92ffe63d13dc5f8d1bc8ad595cfa73f42a4ddbb1528d990b3fd167ea502e19ec2d5dcb99b2f560c2af962745282f03a0b225ffcde29ee6d0e41d0958ea0012ee593733a8423a653e4e68401f3eb88c501be0728cf0bc239492a660a1b88e4b447fa062c4ef4adca63072cbc4a71f70b69d6baeb8f300ad02cb06c51bed0f2473aae55d302ace90829466d6050d5bc73e50d4473e9a3b3f47b2c7735c22e1162a6ddc727dc570dd4537de556f3a1bbcb1ffa13b941716ae08ccb5f2d9a338eade8b17c571fb8ed4b965d0758874154de3920c23ba934448c93c4dd1bcd4dcfc4d605dda9464c60153ca73d7ec13c6ada938d04b1917f415ff18cf5750600d6c50b18ea2a25f7ad46de9e9c8bd1a4449e787f0ec734618f9fd0cef12011f91eb17dce010f9dae95b1dc70371d66f1bab5f26f1241b7885de11d3e0a3848c8e1ae8737334a688d4aa3d9267419957b5158abf7a32c5d0929ab269859ff8291d6f4d5cfab587de37c48e6fc4e5a4ed44638996292f01695707b9e07722f98fae04f1015ce9a1c6e7f4d33f03c2e1e0e35c44d9a3775957b9a7c6eb91bd630f55c6de1467583aad88cdd9492cccf47700a8f9c35c4dfe5c13cd3e2dda10c2fe36d71d21ef280171cb1c21bcc0b0e669fe10d41a71fac61e696a01c80c8bad6b85ef5201872ccf16aae8c6cecd67217156d7a52b21529451184123b500e20a78a0e12663247246daba22f9161ea222762285760ca0f5745639edc841d3f8a1e1cd82ebc116a28be539e6b22601527370cdb8ae17988edc801aef1c65282370821d678dd06faa9f3419a82353bb18fde13cba0a9e0d98a1c29fe0bbf40286bf594ea378015a21c4301fcf2ceca4b06f4eefebcc21afe64c8799cb30f46105f3a55f33f73ad3c6d7f137a1642c547a68ef51893b046451e0b236730a8596e2c4209830f4aa5e2b11fce062e1ca8b0ef9da39725710469bb10a598202fb6d1857569ef46ac3aafd060cd0977bffea0bf9cd316f092650b0d7acb3510ade15f8048a061450e08752fcad30ffdc700a4a14e6181d232d771395921d849e36c02be6ba417315e24451bf82c3d21782166aec8fc848178d8a1dcfe75ea53273ddc5e37a5a74ed2e332122f7653af5ace2f1e1c2d5a915a22b2e8928c9973139dca9883b265410fb70848d6f26e9f70bdac3e04ff230428471df7604324d0bc2c2c8088c36aac3117eef53d6b5c5fd19b0755daa407ab23d940694dae45cd9660929b936a39fc5283cb1f32e5d23305f130195f63d79ccf6ec08f0a1d9507bbfa872dfebd36e8579c8ad618c475e3c1b2e0946e79b3ffe378c80f38d97a281d78b2a174aba7a5fc7267f31e5e7b7df14dd3a5574b84cd74e59d879d00ffa8924b3e8beea88f182b3bc3b92c09cb372184965ff909cae7ac4de56cead89d6e58b7c0009795b5ecd98e0d9a9cc6303cd8fd0ad1bffedcbd27e15f35c736bb6a8ae8555ba2351cfe86b48a8639e2461022ff4814b50bea08ab5127882701b7c4d924c63addda1c4c64b92bd1b5eb1b2c825575e971d6d5c2d1da8683ce46a2f3e142216d0285451d135fcf4a576978ea0de407a8027f96eff3977bbb67329fe82f4548d282c76ee6971d3b17328cde7925a0c59801a94040dbcbb3f711df463b6f581f8c64c7ff7f9e1e0f20af58b134f8668a46a1ce9aa5ce62004a80dbad04692fc7ddbbacb5bbb5448bc81227cc317289e7ad126d900c0503c7ea4307fba86717f29a03f104c0f98c5a514e3e96749f15aaac2f0e9b43302381ff710b44ed92029c1e5edd03f0a06417a24948b6e49ecc79a444eea640e4e6adae80f0a49d4fcddd46bda8f0fc23e38ba5e2023fab925e4fb703f5d14eb7aa00708a34b6193f3061147eaca7018a297f5722ffab45682c449304901d63b8240b36957e82edaec201c363132a064382b511ecd6e926df0b3b924bd6a4a86483c2c79145999790102bc612d4b4fe9df8ce08ea2b65ea2fe31166341b6875045f76720d4519c506e13113fb705be6d529ea4898ef49f1246e09e06cac763e8fbac8632ec36f15b4199b9047426c36077076ecdb04608a4a1e3b7ac89cc392aa612a2c07ac4cde913f32e399723c8e303347ffa699014c88d830680bf601661dfb997cff857c4a3c0b61a436b26e1e37d2a6804dd528d3f714d1140109038e4d1c9a8d56663e467c04a0868b6d18f73ea00db866d09b74b80265838902dac2a89f02e4beaaf0e71b117aaac6d41b0c71704b7f5434b76c3be32c8141c868722d03befeb883913ab0bcca906b812710bec663868dc466b064b209c77056d38c42cf041266e6c7e8a7d88aa23a7dde1745c6481a68e9d5083e98bd9cbd78a900b3d16d3f3d7bbc88df6a25567a13d16d17193509090e351cd390393ae715b3314d856da92ebad738a6a833ffd1922fc4dcd5ac149e11b051b4dceed59908b358e23ad770177237996ede63857a915214a5e569149e9d69a45a65c4948763eca9b4d2bb46d95e123e4bceaf1713d215af45f931d519d5311a7a03bc9fb1ff3b0c4c104f4b587a428c3b8717829ec6d2485ea8c561244aa40dbf6600f7408ab1da8d168136b86693dbd6a15960110fd267981477fbb884a2ac619b820e5c6943f8a554387c29dac4130f81800051009abf81ed86de106683062ccd44645e14b66d70b2685a0e469f26fc05d1335c07125c18441cff6add5a12b27d8461cd9490713b4584eda56ef1cc8a0c4c4b329ded54a6c270b38d7bcd812c0c479cf143169936d44d3f8aaa093b7a7ddecd3a3bf441b1d1a761b51dfd35d375f162250a87969e02b6a04a59fe176c89b03b485f84095d8f6b4b81c64a91a72f0c7f41712e4d6dad578a1bd30e03b1fcea81456a6b49d1d38eacc5446018f79279090414a830e3106817706de0b9a909a56d3084d9900903cfef1e07354279d723ba5fb788691497f0cf9100c41bfc90af50542c27414fb5efc71ff69b799002c9b133fbd035e3a5ff8e5d2ca30f1aee0eec07a7a6e4e9731c03ed0b0e8b5cde87ab9fa6428823e2b14f1a361515732f9b11212cfdb288f509cffc53af7918d27081a25580293a877b8f728f579ee5ff7951801ed2564fa9c08980ae3204092ae63706066a148db80b19ba65160696d30fa6df03456b03c4767955af3cc4ee36e10857e024ae91c1ec3d6a7fc634b708755610afaf903a0ad3cc8db81525b9ca3ffd065f6b70f0fedec6cf045c1ee630d723abd0945941bd665a13fba62d2883400bb27ac2955a8355ada8b35b440c70b34dcf9c693cf4119cf1d71133ee95c842be3fa9dd0da2413c06ccfd81755e04c707fa67673e8e16ad9c094336f1a1b9699367d02360b99fb4e1f68fb2ee5247deaf8433e26ed84030725a475a94388ba11da5611c76dba59c5a83e9c93b98f3ff508978821433180ef72fc87d59246bee6ceea678c4867b8b3622aa8d7b66f7ad00811210d5b6f11a058cb482e390521dce69484d7ab61782d6831d4176b05d7fc933c7c1ca631dffe290eee40a30064a4464c298841c8294bacb9ccea1933eec7cdd6985a090bcf45dc3a39f004e84129aae1d06a6d9cea39b8611a9c85b85667b0294893e96660c7c7e6a2214146395294323d52074b30d53f14214e615e86e0515dac07108fd5c212f10ebcfb89f539a0ab4159d0ddfa1830291ae60e16b0e7eb9136fffa0bc6b9eb2193d7b72334ed29d7ade5eef3186d2126349cca54fc6acf050a52671e9bdadbdb4b56a3cf2034c947cfa5019b90a23daf9bb500d3969436da216d6cefab34e95874918d0d6c699f8a630044208037b5a23b46ccd0dac528ec5e5518dc7a10d8d39cf9f890c1e0e7a4b728db2365410a1ef966ebd73e51dcb701cd4fc81018fbf0b805fc5e561c0e3b60c1e1a05cffbee797bff0674538414c2b06937940962f2414ced0786bb1c521cb0e83813c2e22fea389ba89beb70cdef0223e381e12bc0debb95bc994d4f0408c44a7d145f2e408ebbe5487be66ae0c6edd9cd51597095caecbac6c14ce4752514d9e9b203f8b721712e6e73ef38b2849bbb1c967b3669788b7c612bd637f97034e37e6a484fdac99a2573bdf73a953740366c888589bec57d1e23ddeede3d156797bc03a8f7147dc6265b9e508204df154af28d7501a1d2487b4f34608d8966f913ac7330821069d2f7bf160691fc2b7afa62938684392e67f528fb21c3af6101942e9ce6d71749967c39ed0964365e05d6b42f366dddd979a125b4799de6bb86d7601d0f747faa2f21ffd334c93c40b46e8eb8555c0df34f293ea0263132f774d3a228bef8a2765ade3e9115d74ae831d6046eab755288ecfc59487437abf8937224d5adf2bfe940fd1afd51e5de72f1e1009a2d7b82dba0ab16451ca9226f1684d1f79e840835d47f961018e91ec81d6d5d02b37a68efe24c94f49a53f8b40af1994db46df6addedf518d0ada4a798d5ffbb3234591113ca050d168cbeb7c597b78250c78dd2e7cb47428de3a30227fb376b39506e421d05beac09c69686f7de1b95f4b6155b33cb86bb35555b3c77d022dc82db26fea2a7625e0bb90d8db21bc072c5c891091f81ba1ad2d1c77c36d024cd5dc7286ed95f53d4082224ca4b74a2850aa01b87bfdd51879d10f489953ae12fa6d1092e6f61130b6a684fb2f256bcd60d2b45a23fc58a6424ce63989f6122cfbc1722578207a907a5a871334730dc700a34a14efedd70a19fb8e1b49203011508185daab8234e60858ba72c67c6dc92201b50f4f64394c4e157186f1a86da03631f8b42f69998e8df88f4d7d1ecde8e750001620a0a6938b3c390ef5aa2041ad3a9661f0c30b5807ec14769b5d831cbc900f972058dea8e8fa47f10616099a0acf29f10f2d5c119e854b0caf01108bf9b62f25e747f61cb738ab532d352c83834d50ee5d880c13e40f63a0db03ba31605a81cf8523f7776d214c7c1ac5867a8feea1d66878df7b2014f8295cf39b6d8b7042220dbd1ec528dcf2b3c2f369ad507e4f92d554ce378db3229f8fb91affa1edf1b207ce6f957a79f23477ad580c4dc23da900a8184b7912ca7a938bda729e217bd8b2eff095db3158b889bcc7b3890a00c2164f1b1ce6912f0dee99e62f3e12840c74c0aa340ce51f669716fd0b4a0609fa6c31b48fefc98a4e78559ad840385657ef3f167ffa34bd59bbef0986be69fd671713d5fea78943bf5d1609208d46227e3949759948fdba849f151ab30b29a757bce820e3da58f1b95b8f1872a305178d6f7789813c32c0ee7b86b714519f0d6cee5371743139b8a1ca3c55af928b1e93ebc6433f52426979997ad4b32f651e8fac3b8513439f8457952e5bb73bf5c8927030c89783324e492c19948e0300cf32bd3958015086f94fd41cdb87bfb53956a82283b300e5414422ec10306cc46ed843ed96db1420a44b860677a7dcf8b55f72f63c0cfda3f3e7e054642107c623f361dc1a4a4d0a345c8a869453fc80061d975b60f7866c6d6270190ab60082cd73b9afc77bc480be28bb9489924f3675c24433262c2d65a63e02d295bf181e529bbf713e3ac4a7a28855dbeb7e49d729180baa24643247eb9389783f803079a1d5b095bb4fed0b3bf9dcc3a986aabf4e614c8fa3dc9817661bb68724008c0d3fe802b57de1567d290c93b9aeb2f6626c0c042824eb7ce8bfbce37232f48f68efab1f4f6eb40d1338e9624ccf92ecef917d9ff56ec1cbd6ba0c5541a8951c2e201a71e5f85b8e7cb3681b34858c396e921c2cb35accd182b15d87248a4f30084f7479c7e03e35ae1baac6346b38a45d33a269db607ea71eafb693b1fe42eb7e0282f7862b38b106019377b7c08ff5fcb3d669feac17ddf40631b6f238b66b7337f3b74a088cd31f4a1403fa74b9b7d96e8f9928f673d8a8a3608ed33e87296385afd03d055bb7a1113bae3f293a6ede6d49aa62831c43bda36f4d90b53421b6dd3983c69176f80d534c79245a0562ca12c2e2114a6560951f2d444af796dc21d4a344e6e2ea93da0faa55955eb1e8c5519b8edf1f013ab63e189b9903438b8d3486e3c9d0569061ab0e2ac1d19df126ac60381e4bdff0f349380d7bf14f8254ad19e128164323cc936738d056404634da3ae98e413cd383b60cdbf4cce222a6d581d68ce4d38bbedf507c3038ab9353d8289bc24678f99e4cf239cbf06ffaaae406c25558f4e75f6cb580705d1470e2f739160f3d6f0b963b639b695cd29d3ce8f7f577ef7c00d42cf78607000296bae908c565bcd155968f18e651e782d32c27a0ebff00710ec8702fc26a58b67c2855b63b17878ab6710f9c15ed7fe3af54fac92a762ff2da6cea5def17421a9cb6af3c319ced3bd3a9572959dc03a3a1b31d46d97bbb1460d6d18bf14b39f6cdb1a469c8a6c218020846cd4425d430e7b4e64d423fba490c5bf55bdc91feeee40a2fa1907b179dbcc46af443ab2204aa9d0fbe126e6ed894e8832033d1957a4285f8c0e954137aa83bfa869de61b41b8329a1b795fd902d4eed0da27fac86b10df6fa4db26a0c334c48b52d63e299628e1f67352f8c6dd59c74866e79e9cff53d1d4b9a23e0b316ca3e9046d3e1855e4802f73008e786fbced5b02b31ebb1ae0d1c0a1700fcd78bb66e477014c00d94f7a7a016e82276fe77cb8ddb328cd6005f5162a9eadbc20e491cf002b630d736ac6b64fd1a9590a87ecad80450d12e10b4fdfb2e9bb777c6918d0f238d531444cc488c68858061eaf1a97ae62b1d48b255e10583640a77c78063f7f4319c38c073bee6f87285596046999384fc923300bd7b97570c23423512bc274dda422266268b94f752411f1a5f132aad864fd1cd8232a1cf40a720d435a33b74999d34f4024655e35f446756c469295d8497f26e21a43b98d267abca4db390a1058b91fadafe12bb75683add7248d84c2bebd9d18aacc33dc5ecd34269ca6c86cc7d3826d67cb331dd39eee6e53d370cfd8bffce0dfb0245985b4947e37c1cf37aa4cf072d3615339a9538d8401056fc6a1a1f801d850826e8004cc35aa48bcecb06053edbc15e51b9d5e249ab79ac37b1d6d529250e0a65ba2d0e2c6a8be71f52658639345025a7c6513ca9d79cd18f9e402da7135aaa33b163cfdaa72987da9b52e86392d97de09be2e4f429d805bbbfe84d73cb8a619896bb74514e0ffec70ce5f02c48ded55294efa5dc70721762a17c6e34b2589e892e9f3cc1e1709f927e5e4ba889c4b18776c63e778104b157c6217791b25d7ee6ee589860b692b6eb9147109dab2a0b4d1ae688ebd782c63d3c63ac54210da989adc4ed53ef716e6809f9131e4685a74fe4caf32e1786851a058468fa72a64698f1e8eefa2cccc5bfd7ce3d10a45855258b5302ab426049cff4d55e1c0e7df57bdb96c5839e1e6c144d1cac957c0e76152b64c1f14b89728062201c8379d615354b23c7c9cccf848fc8bca7545ffd75a1e88c77ae28a89a9f1f17cac673c21292709a1e332306287c4c771c8ab70f4a1fb52bb7e80decbad891a1e43b788739dee9a1d6981866f167c4296a1f40cbf5dd8865016ecbc0b743e37b9b45b6ab1e711ec3149f9310df29b912a9c66bc83b748f25850add815edc54160dd65119875a1016a8f0961e0107e6d628c3ba0eb65dabf7b1d73b477946bb3b7632c4d08d7b5171b49903d73ca5d03b79c6d3ae37e29eb95432281d61e7839c8498673f69c99e6f2bc358598d6baa8f3c4aaaf2c185bc8af239cce078f2fa1530eddbaeb8e3cc3810e5d5cdd4874f6f9791922df19fca8d7039ee984ec67d4b63553cc3661e6155d5f8775b7975244dbaf6d46e9e6d50a89a05dc8e163ece2d4aab1fa13eba5a7551f19b67068649ef047f35da33f2845dd6ac929aac7fb2ca916ad5bfb990a7d07dfeceb062e302ff65aac922c4ca516732b67b2f02f7022dd1ff0875f576efdf421ef94aab4bcd8891c3b173b588d3a90ee4c841033155238a8a958f97b6e03783609d1d001890ceede8b3ae06edd30be254980ccaf70781df3c21b8d0487b560b6dacdc90ab56bf7c27f7d85ef670881dfb8b105ac58237b3695bdbb20f08e22514bdce00c8d75c0257cd0ed98261f7a8a940145aee35354b9134956a869640a2886a664b1c24fb7b590858b987d5e2a4d348269cb5c7e648cbdc5c32703da0ecb4df21ca319ab5265eec652cbfaff702f18d735b909648c8a21d6acec48732e2c1086869166dbe39b4455f376f153a34121e3c7859e711b33a9f2bfff644beb128a9e75e13754425f06f897ae055b1c6c7554e5e40b5957f948d0f56fa69ef9df5d552b65ea464e63235347da2e91da4604dadcce30716e4d8be5a219c8f3c1422f09353e6c4a85cbd643e5f5d389ce23991d82b1d80d642de5029502430ad5f766c816483716aa2a66f23441504affc4525dff27714a1e0ba333e47bc626eb6e1464c689d5aeb4b62642c9bd71105e932a57ba88ebe21cdf1840e1a2734a38d2311fa373c578aa2798aac8aaa3142559787cb3aab03de1b0f039dc10a5994d96637ede8efe5bff2ab02a954305a5d692ff7fb1f751e3dc906082fc6bfe15acb4b49f3fe2cd2e1fade5b04d37623238a1796a3c577616603944b25fe9d3f577cc3ec74684a3f8793f0e31b791d8b90fc74aba616ab423943b1bbf20155015045400956b02a61da9ea18a04063f1f207cf92ebe877f72688f5721198bf7080cc9a7f281ce85fcd957a280bb0ea64b0c7d9acc9cb5e3068be904960cd907a09ceb35e4bcd9ea61eea8dbc6cd96ec5abcdaed1c6a0033662a3c7912cff72a478e223efdb19dba0eee9881e8c1e92e4ef67782d35ca5fbecbcc9b5d6954c22b3877c7422b6b26b620fcb532fcb09043f035c79b0428c7c3ccbac373fddad33bbfffe51ca1fba770823c3f1f87de9ae8e0af2f80b2a0755b7e520136453da5d137a3acf8f0a09962fa642a70432a455ad95f3002567d2f0bf5aa34e829f24ea46cb9c8f684904c30e652a3f2edeccc4a9509ff3367d2ae6ac2b6e5e5eca7888bf04a732b0bcd14569c98dc0bd15544aa55e690ffdb7ed9fa60ae74e0bb80e7c1f64058e0397a1ed4fee5550c18291e1c52788e009b9ef0e3c8ca8619be5b637ed3868b2d5aebcde428cfd3c34be8f2ebd8b904da063a00e5b1b569c5986165a4559ccd9cf946224b14f2e3ccf9a69d676e4cb7336775b05f9496a332dd41555a6b2fc366ce449fb6bfcb379d50fedea228a56fe5b3d835e633537f3dfa61ec8b3b8bf98fe8f7313231a85bf53d77182fe60b7c54abba0fc1e9014a4be0d10c2c35bb9184b881aa7374f5fa38c88f8ace362e859e7037a894037373fd17a12adc1b60eb4c3d6f5ccf4cd9673e547885c437805c2f4c903d49cc9ef1f4d2460d9f9e17c069e8a8396135e0b71724ff95a134b6bec222e70016ee053b62e39fe7496c0cb46801ea30dc75bfd5575092876ba6e7386020207a9faf8289877c64762a70fa56cc0b4aa068b836f211d202794a9c49d894b1e970580f0fcfb552aab86d627738b2f7d0c7243fbb70bbca9ef3bb06acc453d2d07ad7d3db649bf85653c9aa83e6ecfe50e649ed13d45d49591724f99ca249ac5e8e050437b3b8b03a04c45a6a2336c70a0e2bcf693b5273b60e13c1f018003b83da60f0804cf8307fc4256a4dc806bb30ee7fbee522bec62e919215cc3e91189a8f04257cb2b40775ee3ddc01119fba45d79f976776c394e821e74a5c5d83d9b329314d478e5941d5e8a86149146c4d62f526e2fd5b5522ca3df78fca0a27dd2384e6fe38a3428d3211963e619ef6a9fe757d68f66cbc3da3777c96f18738c0b679361275457aaf1e0338f69a640802ab565dacf8aa0d225e74c4df879d6a3cac894137480e468d8162ae7835919605651750fa69a5e3eee01f31b0eb2a3756aadb775051001ee2815c8363cf075286acbdb7ded76c7cffcbc155fee995adee76cbd5fccf86d24c15f684ff48cc36d337c34b56f7e2d809bb8815599b2d8d997b8a9f91acaf385fe3e4dc80a9fab39b853976691060831d90e704028f22f1c3458ddfa330eea580f5c4533a08743c55522a8e6bd8894a37618291fb00f189b2947e9558b6fc92795d29bd61ed2d236e22eaf21442a1c9505a54da8ed48398139d178012ddec5936adb2a3111f693864a2383618543af07efc11ef41bfee03f76098607949b2623ec7705a67ce913e8a5e6bb6aaa10966c1c3277b65497bb6e689154ab4ecbdcf534b1f15cbdf7ca0a308211b2a6e2fec4970e17efb72282d92f9bd96b2bdf0e33dca4362cd08edcadd094b89627c33c1d7e3da6231140186021a70fb0de44690a57b06901174af5242933807fa3865db77f4ad76c0c6e994e5bcfc533852cc88e68dedd142ca92e791451acd741e1d3be1ec5d9def83193525feca76112b5a4ee2ffb1e67f377ad475c81dc500a05c8f57143d92d9c07cda0efa02372d0100146fb3e0f86bf24b241255b93368a078d3b50c72a9224edd1e7b103ceac45e8247c53bdac77de3c79ad36fb0631cc4deb3c554d4247989c48efc2e042cbca12c1051212ecaffbad891cc4435a15559f4685fecc8de57ed3a76c46cdfb254361181a3b127a6fbf1a969f3345765f86075934a417e512f045927400eeaae52083dad2125ece4ab6452deb123f64fb8a711a1a8f3da2af75892fface33a0a57cc87105947c6342f6cd5d10852b9a31ed4ad800b1a4ae5be1f30e84624863a4453e3da7668e0e53a00ccf8eb378d38476a65c316a76e5999598d6824466c3ca894f940158973b69b3455974b058ccc740c324ddaea9c275723bc1dca3ea2a8736f52a7d373166dffc614b104786a33d90c98ff2a2c40e1c76ffbe17dc5028c86cf76bd016023ffae17aeb42e0887c4b013eed8735ab35b42cd18d5b542af1a2fbc2e47808da40b43c0278ce1924082fb293c6961c615abb2c0564300f84a473bc7c68f5322b3d420f4cfc8ce659f3f5a2c9a1dcfec9e8210c097a5a44e263b4a6cb6d5928963acfd1563b4c1ab5861972deac6340bbf0ac1fe8fa05b2955d9a17426e6bd23af6619c2d76d6a07b81619df73d5a247818b116ed879a38d0a6eec01cf7f3e2d4c42f96b5cf2ca080f8a2c6f501d3d54277fa63b64b30d3d49ec065deb5cee3ad1b335caf3863dd4ba0a8b6824d0e087d1c72c0b43603b4797a5f59a4061b5176e91a48c5874eebea8d8d0ab248645ca0033b3d88b4053d4b0a8269737454488304cf35f16b13b55bbba19cd0ffe5e0208fc0241feed62990466a78da72d8bee1229890d1922d194848a2295dde17e98cd0d56790aab13d7dac69ad46e45acd93d8403ae0e8350238b2eb5165f803358b2c89cf4028e2e84b7c5f6e7f9048f0aa4f5c2287b526b6d9d2ba78a1d821cab371d9e153811db6d7d451ee2895636f8a46fdbaaf000eb0f8343f6a9b1b96f848062e3458a946b16da07f3d8ea16d00b97dfb715007e88182bb7a32c82e33b1630145dbf76bde29ae7a7d6fb4ea1998d8c221c4598a16235762ca00fe625e5e5bed657b07520c5658bd9becb7c2f679414ccbd1b67a55fb8c91c49b25099f5b38231410b1e5d5f6b1e4898463a9d9c294cf8d0ff14589402739e6da95c651c488a909dee1fc9264f98b41bae79e82100757ffd97eeca8f2d5dda17275e264e695c20ca778c1904ef9c8b2bb7d56358fb3806d197437f11c4976ab0efb15f8aff497e595ec85b7c6ef6a270f0d69e57690e7433a726cd6500e8622845a5efd98cfc2f0af6c98c7a8e880875a4b0168e939021473c6167fc06e6ab816437ee3a9058864bf118d5a2e49d0da49905d8e92200831308ef1e5d35dec0a3db1832db55e281909b487462c1860d91cd12895933da0de743538b2f7a95ae44e26e462f21899d5c72a7a22412eda6773ff75f3d0aaafb53a13bbe2b2ef0a3ffcdd2dd7e1ef73944e22e32cd50ccd2ea5d3f2476dc19db150aae3c679c4832f5427e472c5a33db0a5c7f2e8562b40aec1496bed6a55ae6141a970053fb07c5f355a5b16a10199136845d52ecdd6b6308fb924caff763e86388f658af3917c171f253ef65b2eaa605a83a58905c4cfd7836f003d10b8ae588d56cc3464bee3c176eec62c228982c12e309de567f03f2ded757d195f5922de872398dafa77712f2892e5841fb8faeeb2121ddde2825350861c4df3d733285198fbc67fa189994a6eae5673bcdda3445b0159dc651c11b83451408472303f47b462164c6ec855c16c7dd65a217dc1883a39cb3211230d514246d9805bdb4d4c8ec6dd9ce46a71724f6377cee543901d29a61577653735fbab621d35ff7959a1f6a11d53379f6d7a3e3b40f508143ad6376012233bc6b17288147d30ef987c15393c1964cfbe81a55ace0102cd5a51064ee06405238a2429d0f59194e1872b18bb226525d90280c06e9d3077f30500207d90d393c35e227860d7b3e232825b9953caabe15d7f4e2c26d7e924792f090c255a33e76da00cd599fa2ea8566c56215cdd6b73774727afb8126ab629548730ffecb7ebcc28f41a7634922ae658a9d6b1bb6cc063d8e32225d79b64883a17f26af381a3e8dbc8d22bec9787837d6c41e97b96c69ebc901eaf98932afccbed4e6f0918cb896ed4e09818e75faae8179de01003c4c753a5bf80137632e2e84d67238740926e4dc508bd988551c3817bf61b91b2c4b08c6cd407c5a2c56814e04ce32f6787f6956734c31aae990111890edf56adc97a4f7be7d581b4e1d668407ae614f81cae6db97887644f9a25036a70d14f60c020ed29aba15883c4fa7978c0c80c4de950ab010f126973679a779cf9d66c8f7ca63de8737a737b6a17fd7ec2bfb7e601706f80b68a1ff0be955549e11526c8a5b6d12ef37ccbc241737ccbf967f6cef9aa1b47fe669176cbe7fcd10739f1ff252366a406b9b8bb9d200da1a20fe99d9151dfbcc307742d15ff42d91fb6a7b7bbb91a12b48ebc278d695ab66a6d6416d73f49fc3aa8376990500d07f729fb3ca4852c75ca57c21b94b8d176281ebc4b300f6dfc0c5b067dd95f6800e39da9f3490f52a16fd90e66e4062015c573f5a74af9d09a2e5a19f7325f651729127cb9a10ac87b8a0ca10a158aef0e3b5ee1d025ce124e934695440b122a9144c330843acf8332059955bfa1109559c724188a22c318e68ffc0f0401e958b829150d73314a3a12a7d4c81a2b3f9a4af515cc97de45f20bae18e401769a5f9c924c7f34ae7c35b9e10c4adf4a1b80174852f09821e343429f410ed5c38ce42a308a6a355d01db41522e99bf4943b98c8982e9ce3a77d037927905fa35a7dde4fb2026e9cdb26a5f8bfceb225720db02db0da192800959e844383210febb9d0c04bb9f5a6843cf6e50649201d275b5c0cc288d0b74aedc24d5cb1e297e7679fb454f2204f1105c3b6423f02686cd0edb3c65aa7d14ca27fd64c53286676c404cc52f1d017805d58978a860119a98e7e57b73de00fdee6ad96640250f39299f920c99faa1eef9bef8ccde71c5d2804bbf51958a050bf4585bc7f9b26af10312bbe3dd0f76c2f3e14a501f219cfcae902bfb519f6e13899527e71d38609dd5ca53a6db3a37e8952f5c1f31de7b19fe5c6a2824f2530f6afd1ecf52d82f086c9a494353f30298a1bf9032a3b65e69c209e5a4b9a8e12f5fae40e87b85cea781f7947672f145c87e39acbf86eefe2d74bfaee3201365e7a95de966044c2ee81f3f8b34b6d09475dc71fcdb403d0f9088ca3aff3fcb21e5db78429b4c29874f23f67eb46288392cc656c866da33fad92c0f15ac21ef87dbc769c58703d1e3fb34d0edb07d787984c5d4650121bd9c20dc63f6b60a0e294443d75df4782f432225462f818bcd68f21f113a505ed0bea46d18d042d60494049b6628edb246e253afe29f088d3f810b2c8ec9c0d072557beee2e71dfebc529f3353db6afa51af6199c7be38ccc268609a147d31ab60e2fde79382b9b9d3a307ad977f2ef27465342153ecc94a60da8662ba420364fea5ab3009b7b6aaf8dd5518fa8384051c4cfa81360c49f69cc460cdb2aaaa116a9b7c63abd636aa22b5f88c264fb1ee267ab82f4378565e56a513b16ccc412b7f0fe4e56d815151a4974e3fd69b5ca573eff899f584552fa8c08d8d80e947f2c8fd3fca866ad07d79b6b49992dc5671d607b9359f387265a5d734fe0cd635dcea6615bb467d5fee96bdf311902aef6a8a18d0f6f37beda1ff933eef4676a17226177dc0d6a0cdc19b4a7c73e8cab3da5d8143484c50269a9e6dbc38acfa480ce9dcd5cd9527dc42cdb150d80169d45023b99aac240b498305dbe8c5d954e505109ead84fa7456b9b6361e5c38e9c02d05b62bc7a10ff2f465da5d0f1e0f855f4f88c5de7a7f4befc49f389bc18909b69cb55404cfd049e114e261d5a716e41179590b86a2037affd9c03b0b7c7bd318abdc9dc4eef4ee86fb7eb5ca61874b5980737d009b52fa49e609d33c40707f795dfd1259c9f7a0dfb7bbb434d085ace092a600d4ce699fb806f672d2e8df418aba5979419fedd7ff29f3c2cf56716342f8ea5a73d761479120c78625ccddb523e99d63de66f26602087874110a67472d65f051fea4f87c387ce4a80984ae958a90178bac312f25dd017984a26605acd1f38d0deb91a612c07b6cab5fa9a011e1477550e07a5fb58fa3ea0ebed461b0850a7db47178c1515f390b0e9db56741d7555f272fa80a5f911a92a3e265da655fb3e80ca021a75da69ccd0767a9f2f3697287eb7aea3c000eb8f6b897ac685ddb312407e7c5439f4b7f2ba3f71b6a1ecc137f96ed7216838e6bab8936e9900ec53f959aa1e34d63e92a3c877a9b4b0b881055f88081fd4166b47e6527d94269b710d02dae340dec98d659a3693d2ad03029e15d3364cf1e7bb984973b9ef97ce97cde94859abc9ca58c95e5f1c62c9dd6eba6fb847944484ecf1216ed9d87b113b8775c930009d8bde336fc266ed5367686204e3cea292a24b31137d242d45cc3f858327c7938fba942c1b9767447a9b159fb6c32a54366169f78401dcec05f070b6b9cd5e5dd87815e8a1e373241984e98f9491576050ab346e620ea5dd4596e1dd1f03ba4c2ec3d7ff0c538dc48e766979802366634c460606af464e0f2e90730437b2b000ced01f66950924f0ec5cf90046ec53426660db96a4c607df71d5abfdcc24ee6e92c055981d7ab726e410df51b88c04769184b0c48bfed1559965ddc4c9dab6f7acbaa64fe67d10e72a6e71af93c5dc692cb1eda83f170e0c041532b16007b3dc4ce57db8200754f3d2c73986af719639c200326d032c51a4a5dafd8cd192b655a80df4eca140b17d6c8e554c9a7fd36a9db8a7b2386b3cbc981192a9c15a058ffe59d9f73df5be400301b1166a8078e9b603c89c1023274335b495474dd83ca78405882d75c58941ec1235340b948500a70ad7d34ab4f01870246a0f319b1b652ce279c1daba1348a8d12735721442b59fa422c4357796b34836025567f990931b41863a338fe2ec8a44b966afdd50b3726db7e3704923e3d7c7cc7517dcb428ea7b80306fa5e48633a1b15f91b80414c3f1a7af38f3b3d1f6d6a81d1e59475bf80bbebc5231669f4e828c9d0838314f8f3f6f028d03a014cea0e89690df8a7ac6030d10443eeb5d9e1902aba663d97892a9b14e3b34b23c08f882294418343208c0cbfee11c0416e54bf11f14d82632de7ce6b01ca010423dfb5a767300627106e2f8675afbbd4fd04637f2fe03a62b14836f95a3cd46bb10321853ee6bf81a08829bc0c15b44d30c40ea0f207af3d5bf017907ae8fe153fbd625e39bb5f6b46d5d34893aad0f13e662aa0567afacbc5c0d5156901b4ccb2fc7205783e82bcc7bb313b27fda483b9000f2b3a359f86c0c3d627b987c715b8fda4b9b8e66543c591478224c7b549e3de7674a875b6c49faa0f47623f8fdbf80c79d4460b588855f812380c8bd2f042abf701603964032a87a604aa6fc39b1c87c77371f6f0811c699a7275116309e02b00c8bb031a8ca44a4beb745a047d8ce7d31b21d526c268c8978806e4cde08e185d87c329c62b76d0a56f37d74f4163ca22a4662902b6a706c8c461dd5b67fe27be9b6d873d638ca8fcc8ff221a97ec097bdbdbec94706d90e217b9c3bd2fd8d78bf7ea4bb3ece937914a0a8790dbfd329bd96e847b3d960e3bc69cedf962f9804d60327b8fb1376b5df29e6a871bb13a846cb58b8df751465a54fa7592a98a7b1c0c21849c2238d192fb905867cab046bdd7ca6c37d08265052154ad172f35d07c8a2d125bb3e68972171a98c95b5e136ca590d7791bf45a3f1bb199a5cc3ecf3ea94c8dfb4e287a6ea2b4b06afd376868d5ade6237e915c529b693ace844881125931d64db9efed230f7d5e27df0330f1d3d3baa8586a0fa8b59d298f40c427d060835feb13d75505493e1678b057b8696214f9112d96a6b344da282679c10fc4e7c9ee9329a56b9c01bc8685e0ac8f4ae34d1a4c26087b96aa5918e4137c74ae34bb0bb95e14dd67398eaa60fa4370d431b6899d314365c78e41c9292961b0fd1dc2a48442a6bd8af1641f3c6b63f35ed1efd058e296077c1b66493afc675c118d4aa8c7bbf60ca6e8c8926a4025e5f3d5ebc437911f1d183562abdc210c4e7c64b444858c09465524c75df42e1ec2933400a9b6a760bc5497b472f9396d8577ad99430752a3de6e093ac439d7340327a8013602437292eb9c23d5c3864c9fc654fc71b4062a7fc63b7f950df0e6599b511757b7598d403b397d497b6634e43ddc03689c3c448731198b12eb35bbbdcb9dc6e6ed3a8009b889e7b0f00b9a8160168e5ae5202245f379d260e2fffad4caf1605b2dcfc4879f05a87283cfc39eb6e15b14cf6fd6f9c587b6262a76d9bf3bc64bb056b1c51b7863e3180a9ab78007e42aadb8c04acbcd4a183084092c2377df51cf0664950cc69f377a60530c671dfc103f40e8a7bea5d80d8d56d8683202d6b9486482695c934341c8fde310dc04e85c417698f6e8ec526833fe255ffa92142944f8b10090a0007ca0fbc102807d098a9511899f7ca688c37baa6228a128b0fe58a0303c9d931b03ec5fd04683f25e3e0c212acd4206059ed28195f80dea118a944b93fffc68f1f0ec1071a341230b1ea5050e0dcee175e2e9b5d2cf072a7ab1091564bffd321be851af65964ba8177cb6b89125ff9127d0ae3035168a7d884ca7375ea50e953c04af55b11e9e347232b2a59bcbdb7a38178703e02e635761df892a88151fbc7e89f2be5890b2ee1996ba4b03b51a60cbd0e8a80e2ba7ddb7a2fc25da441b58fc2289769b803e3d2afb72b113b61f8e2e7eafd8f71b43c099cbdd65bab5262934a8c50d94a454b702a14d94d4cd89b0a31a53d68ce3551986579ac276ab548f219da7b9dc6d77dcf1ed3dabfd10df6b5dff3ee4d5fea7dab44e399daf00c5a2b8266323ee4e85e10d57ccbebef41bab232e9c121c152e18ccaa383939658573a035ffb2b153b0c60dbc4fbe33dc956a3a1b8f03b462d1893875df3db10639d549239d02a3cbc917a579d6f3c32a32a1dcdbfaf104cd3985f0718a396d7fa52c22341c4eb61e5441d1ae4150fdf86a5c288a6c85969402a736befda25ee51f0eb639bccf72b32046fd74a9aea570a285ce52a834b15af7d9e46361a8bf11a04278cd6c0f720ff17468f40d5ce759a3dcf27dc9d5443149a930366e78b6378febb48e373c466e25f92bcaef4c6de50fa850d88d817e317187aee734871870cd7a6109846cff1c2928a22b4a4f09523a6d2cd74db245325ba34815ffcaf71d58bcae13e79ffd395ac60ae4ee295544dc2683f5309e92671861695129c6c54fc0af45d932d4c015e7e2d0f39835c2a7015ada87570c8c8a3e6e542bd753c6d02f59e00a102fd7391bf2ea6398d122fe090a06d731b09b23545bde22410eb44ad3215eaa927ea4d463d74f747d1383a16d1150d952f43284548bd09d6c2f4594791ebe89524fda12ac1ef89e02f6c3e6fd316a3a88778d6ef68f9f3052e8180f0a5dcba8c6f6d209de466a4c052595696bbd1fb999ef074429e26e56144704d1ed3240f7303d599ec555e987429ccb21e69bd8f6859160354b2ee344f76c72b9da36c133e4f79c5a23fa7433f020bf562a434fa6fd781a80385a6a8933be59bea781db4ce673a8dd5786735e61eaa8f8a333cb7dfbbc657232130f6df9eb384384e7ef206927054dfc0187dfeef9959eb4783fd5444b0ba9ca1c0c7cef43f436d73e55a5b54c3bc829eb68fb3f78b3af45caa1a62799b90a6206380fdb44a9a1ae1f3195aa68f63918576728399973d97b311f7a6752c992deb1515ec4a9054f0f0fdd9ea154e0d5e6b00759917a0bbd0347426d36650ad0054c07a7c76c35a29cea317382daf74f1cf5723a5e48b4123ef3ab953a9b8e21433ea017c8cb1be933fb8737a7695cfba17e5be79947e0b3337aed113b393d8e5fc598d0072fc5c3e1f5e3efd0b2fb4fcb2368638e68e8bf8bb28219f96931940490a26a97e87d2ebe953a8c08ce0316f36399345da28d1de71fb30d3ed884b3f2eeb3d61eb7779b38f17c1be5587679e4ee5334c985297a582f2b79e3c4d1129263c46935e712c1d75203689011245d3ab4c98413818cf53e8a7e9019661fc317c3ca353f666db57a7e281bbfc7888ce507ce17f46ab2dead7aad820641fee380a0bb4501340d1ce51502e04bda1f56f03ebd06d42a965590a766e64c517a2c9587f62e8140bcbf7abbb8da7c0f317d54c812cd61a8cb1f96879827965c1729424ec3459ff667fabc4454ed24978fa235193913442bbcd11bb07f58a1bac53c10484a5cc36004ef53c30bbc9ad7d04b36dc3a5eefb36ed7680ed12ba9db079c46484a2ec909425e2362a3365934b4cab66c99b531868883f02e567f5d60886d4f16ebeea28c82edd0e086cfe471d1932422a90b5b09e0e95577666d07cb8c23d197d2b6ca478079fa1747c994ccc6f4d2c25c6f7b447e36001da401ae20456d9e8c706ebd3c198e955a34a29ef3f5a59e8cf5754f871a48b2ca6a28704425dc9a265385d51f78053d9d69f37fa5282b6bde076e4d34693a2144c5d7ba93bcc57c0e6ce3c395b1a51e4c7d31308b439552430adb7d57f0a5c2966bc02d0726a7571e508bce2c08eb64ef8d3dc05e9b7a3ed7db61ac8a110063ffd60c508cd741513cb638b0553b3213084e65050009bd7e128aaf1252f7de78f96e6616b99ec132aad16f59ecc6df9452aebd50d6a459db04f45564d660667f4b09797a6bad4f165db88d16f23b6ce60616b1b80dd620dbfd0c0d601890c8c0d37db8fd0cb2ec49c1d853894eddb39e2932c0e319258a7db8f2ad4406caef92ba2c33eaf05728f98f455740ea31a44871143fd11e93a7254c4f7f1931e09f35b109b68ade1a051511b11fa4429b5e4e397d1b62cc21f288e1a19f1d34bb290b6abfafb1df62a1e160be5617db4896277a64e62b222fe1a49ce06fe30a9b8a1cebfc5fdafad44b0dc4ab901f586cd71e53e9954e012a0c9fa969a8cc71ba26268e7414b1ba4ad446915963a2f3bf216bb2df3d4babcca5e7b68ae873c22c6cf5276394ddf352fde35c4bcd7a92d564cac77299b866ebe90d3552069125e1e4b3d2f2cedc92e673387adff4b9a15848a8715e1130030dbcdb18a6655e4de75004fa4ede58666c59d1037f89ab5e5c222c956e0f25c97c690a72d96408b72716e747c21f1af29da9b844c5e30a7a93f786fd32cccab887f0d38e83eb29c70070b05bef9ffe79fe840a6a8e1bdb05ca72dec81b054785351659cfd86e5d0ae9fa6b25cec84b47100399b8f923de4a70234f44ec0017d1a57142d0c543771623333c29cdeeed8e8f8ceb0a003ca09a78beb2dc1226855dd5958108012b1f84018a3a6914640a76c2c94e807d4ef4dc1088005a2f01e5dea8d8bd55be161c647b1c7301647aee6f18326316c5d98416e350686a3e820247f27808e47a2bfe7987bafbfb1d929470f87c20d131743896d6f200eb556060b9e9410adcd9462037178822a93ab5b25aa79200e8f4a65e6a71288c3814a6380383ca7ee650b3b4cbd9e663bad141087c9c6529c401c8e093b24f5392b09c4219c9ac461567ce270a08bde612f4871c25949cb320459ddd238855aa35507959c525e5374a4de4f0be40bcf5c2a170e73182131d7afcede1bce4d8f60e6ca72aa429c6e1bccc5dee51037dd695b1c12687f18b51e9aaa401352d96de54090d743833e196373156d5158f20c3a4d47a15090fb7ae1488fa415bf2fc480f493ee76c5054a88288e5b441a5d8559d51f307cc24c7a3303745218ab49c4701657290a23c7589b9651bbde5aa4327a5f9712f56e0ca5f1fdd6e16ed607db4f44b976ead73ab73e60438f746d6626effe4b275bab9d4c2420bbe8691fd3419300a22aa93ad704aa6e5e40c11332f2ad33117fd3c33042c0d776c808c8a3af4273a7f78ad5fbe90f99a701adfd7bc86bb5b2001148908895ed3f941ce4084ae1a2e8162134c1a01e09cb5b18bf3da6928bfaf559aef5e41da2032cbc48f88fdbab3d8eb400983ad28c0c56ef7e650068d22b4846160cda6a2ae9355ee32569c8de6b1379a35c06303df40866846786c1e234e6f53bd436cdbb8c536b0b741d28e8c519ac98035a954ba472eaab45fba8fad68aa8725258804efc7892af7509c732460ad649b1788e068bd7be702e8c4ce99af754088c40152c6cd33e20ccc5aea5cab9a7de67274d2a9bad44e225a4950ef30340d29f16944a871d543168a3aa639b82a862dbce2129fce70f96ead24caccdb0aec82458e332485ba58875f556a3fda3eb5a6f66601f9de89088cbcf49ec90b0636fc986366716ecd138d29874e77afcca8ae605660ce9ecdf5cac1ea699df10f8210284d2f769a286b190260b122025d44249c050ea72c683323cc10fc9ec8390cea26903576cefcc1caba332568529ffaf2da8da5bf733edede08b04b2a3979c31f2fa2e031a3d087aeda0a89b4a04e5400ceae2d1bf86e8d64b0236813c08e5a61f35857b9177c0c37c37486f930cc34c2dbe27c2ef026408eb9c9d45f3ec14048fd0f08657e49aacdc061519b163633f0e3cf1876184f7fe06e532e8e846c7646e669fd09af6c60a1d21b56d16f0f1e05a07d0ca25a27dee76800b3e536947570f808d0102b110ae5167f617c7571e12f086e0feaa864363b336b05cfaf2234d7737d1cfea9477aed3df33b01c8bb5a77d9c0328fbf1861622020bff82a34bf0ea7d69899f28e1feb399146c98b37aa888061a166f12f62c6a2f857ccb6084aa34ddcfff1c511d581bb2db0e0b4261291cc050bc8f4341853bf01f2ab9a9a4c461275ae482322ec3b60336f86479b7fd9c2ffd244ea698e7a158ea078199038c38201184fc3d030629ce3f33e1247f6d365c120a98169d74dc9887ea8028720b79b121df23771f509f752f23d5557d83219de6d91655b07b655d4f36c88465116986be26f242d16d799fbf23e88eef3726c219ddecaa55114dcb49c3f9e0b079d8758a1f701c9a1746ee9f5fffcf662f4ab19615f14ffd5f7039fea8c3a6b8afbbdfbbea7c749ad4e71c21fc78948f0536364fa76fe272a786c20b4431fb90f1c8fdbc732b024d8d8ba57e8ed2949ed7c8398c039b1c16fadfe42dcaa4e3acfc7849e337394ff244095e000cca300a79b0ecbaf93b1488a393f59ecef2f0ac9de40bf15734a9cc862949ca6f9031469878096ace20c3359cb9fc734a4f237c2de587c30ef0d6942bbbbc9139cdf8c9b852682a96f8ef688d7e259d2c3b5903fccdbe17ed19be69f01f602b090937196288f5a18d7224491e1314a6dd7bebdce3b36d71c1110b9dabf25bc5b6e7b8c3acfc9dcd3e2dd086af538fdf99dcc294dcebd4c461c0728773399cbca397a6b29822b34b778a469d0383ddaf7b343565f8882ee05b6db7fb9d2dc8dcbab917ebd01aa28ba10f2e5403f2f51f0b0e338de3ae7de6b9a8cb9ab824b0f31365544c3b6eb813d3ab9726ba497aa5cb054fb42eeb67ea879b57896ef44620a1ba6bb21e0f4243c08bd1d60a4dd3e2a6169cab1514c0e13460f48bbb2a0439d33885aac24dd1463c0a04aa29d4b218af4213d6d84d5934344d680e53f856b8ff7c4d26564db3be48b58e94488f6ea56d4330dfc98c65586e83af7162dfc64de42ab8dfc3a94c009fdc575042afef35a9c8bc29eb8fb01889cb2f2ee3a37cc9066101dc71e4b1806e03c6262f808a5e1701b9277f8d9c19b83fda4ce64483447f092922748788a9fefb9a158d5e26ba7ffa9c8a70c50d6989d4ce2d858fda45c71da5e38484f6929ede5202132d422ef68282ea46004c260fb0c436b87086fa1c6ca5a7ea69ed23b96e3ab11e7c3a3c1639d703f016707ddbc980a1597e48655569129b6019edc24bb044efebb197ed22e886d92e51351c1f8b8deef54081405ec8bc60c07656228b9980bf0e04f7efee885e53c8032bca90b97e01fe8bff17e014e6e9bbb75691b556fbec5b6e75b01bf63b987b213756e3eb60af0484f7715a407f1b26c89643ed3a815e0e1e676c7f72601b72dba80a5dde780c0d29de05713cb7a09335cb7e64c9299466863bba52dc360e608b2e7d28abed6da6c0c3ca07429158fe6f7f2d62025cadbab21b49f90efb7b2c06b8b56da171adbc35d660c0eb66343001a2822f1f0101a72878af1f8d5ceb56856987074fcad39bf43ef86814bf5a4b2ae7e14c496984200ab6e07d9ae1fb1851d853f9be2e7afa49fcfbc5159bb7da9efb9a0afcbbcf64a153e727fc6417af474f611110f6c15c24c410383a31437c2bbc27f73fb0a3a960aa6a06275f0dd6fca2b31df1c700e789b726c4ada9a4eb8b4e6c8abe2320145fd71546925be78deeef7ed4341b3078303b712e6b24d9be2bbc55dacb7744372c4546491aaf941e873e02561ae09e06af4b02d3776de2d633f9415c16e28add82a54641739dbdabde5d422f07e26421280a3800e2a45a5c139e1ff53dc5c26480d4a05fb704de9410d4e0c150ec7aa23bce6f4e7a8368426d3fa0acc6e544b29e2af924d384e82e0c78965c9013cb67c7b260545e3de14497fe8ccb0950e486e9f4f1881940d38431daaeaf36e6c0221d6cb99216364f3f58a325fb6e3dedfc1ac5cbccdbf5b2e7f84e582eba88ab98b4b4c829bafe0a83b0e0bb7f2529c4ca50ad1855922b74090c841801c1aaff494191b9b13702350c71878de8f53825fe8b2a2eb6fa827a2ad037455f71718fb91e58cee5119bd275c14b66853889897cfc96a934cac451dd7c2887ae51bdf197a03639a0ffcf577df9df0974e038c732399a4d38c28cafb9f0b4fe0668d74bc62212a6e3fc4c6fea1d336c83619d7509deee072ff5204089ac468dc0637745168e92f897b0ec5f7a858e983a66118739607e6005f3d9d4453ddff88e9737201a9346c9fa8e48a90e85d1ffce6aa11b3fdf6811c0bd719d3cc5f2cc7b2bfde3c9396a7bd5db4a2295a43ea7ef4683dc42cec8a2d088c8050f5ceb52bae0eeb06ac8e44f5ffed1e0636c202c9ca4920e8c263c7b9ea0f989df186741916c8c0f8f3e96517457e94a8a5629e99956c6c8910dcdb3cce8c843e7a0163ab80afc377360914eebaa68c11288f80218e38504fb1cd07e478a06f266497d838b9f49e9eaf713d6294f4a5894a7e4c2fec8fa7a0becaff208d35f6291e848544eec00fea26ebbcd8af2a14f31cc405d059bbc3e7dce69fce2710d2737e72bff04977ac50504eddbd171debc08714573f93408dbc714544099b8941bb56f418c7eb73963ddc4cbb9eaf40e3f03b115ddd8efad991e6e6ba7cc59deb643d69012da720b19947f29ace2e5e6e1567ca7d2211ebfccf612bd80afb13535ed829cd317fe8c23ca2d1716b13849bba7b5baab76b83122f27ddaf1685320148d2a03603712c1d0a77515c578a744ba6bd30db198e91f435a68eefa55aca658dafdea382e71ea73bda7538473d77b7a1f4118712762fc716c69f8e503d11de2316b5d546fc577176f5363b9e89d6e657aaf0a66bf5aaf34b52f862025a1c2bf021b4334480dd91c22b972550956cccd7f176789a8a245cf57dcad1be0f789ee561c6076d599bf7a2a2648a0e6c57ca65fcdfc828cde9a0c62ca4ff9ef0938aa415a3e508e6885cd66b6f384eeef0c8c259631fb4b0cfb84d63269a466822e1f018b31bed9ade8760fd2fe64f3999ad217dabe1458979ff1cd916a3762227c1f6a423401b3b536cbb23c95a560af78afaa77100ce62042cc814a78afdd2801e67428167d570eb8f03910c8623a549afc0179d3c7f9f3bf188beb31a8cfce62fc547012b247b3cfae89e1b5ea57dc1356f8375c05112437b4d08ee55c1dc1e539a5dc4ae0da4a704c8a39ba36050124c60cb9a0377192601a6168f17a8f66815ad0dd3a824b1446e22dda7aa645a166502bf8603874770af8620201e908d8aa2180b1a3f00b28328353851c7bfe8388467e61eb4c858a3b7ca895194b6f0c0d19c08439d346316df6298eabdf6bad5fb9b0d87d3ca1a979ced944cc27e98004974efd37afc6e8d686a5cc63962fc917e9f5ced0aafeb8672987ccf596a7a1f78d43f69592209ae5f0e82d317d5f6e8b5f5f966663d70a7ca50596d38495f324b9993f8dc8954e3212ac278b87d264dd908a3a8ee08d63564747340e5afb01bbb76f605a005046bb86f4c47eeeb1cdf3947bbf9fafab39fecd31efd7577746d80d785a5de6a578cc6a828520cc848d8c52f3be758a85884407cfa0169234e8861a9ace74548880631b1b20a7b922e2e1a84170a172e23f1f775c0f7f22c1202e0140e0231004e507f5404001ce84bfae8098504d6e4be5e5058179088a3fbcb70108b9fe5bf577259997e5496168b5a4af0c3eb160fdd097f1877a2d9d57df561011b7e637045debc999c0a923d11f7b3170ce80fc621dcc8ab88b2a0cb7a5249497fec37563a34da58b290bb64e8f6bdccb0d0ab94c850214be8bcd83e16f6a7568193bdf1bc4bf640965a84583c7c5338019a2481e868335be45e1a8948584a15e270070b0e1361ea1014b1e9ed1466228a261e2efacda552f88f420443bf78a8da62560d61b26427dc3c048d7b9ce3c1c8babe29a52b16c0a8125ec80ef9dc43b41c3a2414ae08b05e399bbcb431fcd9bb04da8784e17f086ede76d3edce9b95be15dc4c5880f8442fd205abc774457680adee7f9b1313b66f071cfb07ca2afaf6820fca551fdc8928ea51436bba41011fc359be7dd7bbc0a05e682afec0a7caead87704f578c0f82ca57dd2916f5ce5b13eb5d09029da1f0b16e8ff10365e35c9872c3ebedda5b76bc4866214b4c46b7abad916f1c9125845b2e9b41043d93eb78089b2fe394471d3d194ebc550dc18dc439b94bc3da0b1c5c78fcfcbd495b73d5a7b807927174064c8cc48aff405c8135f3569f7d287e6e341baca03d9801530fe133227616e6af33e9f1a29a50b386c0836aa9d05d1cfd32222ba0f7e5d0685e1910d07e56553fbed9e58be47c18b04ee387a16fb966cd5f0f8e0ecb7a7f5ff26cda92ccc4579cc0c0733faae062b07aae13f324daf8c4add2d160caabc585d9f5945410a07d07d1cfc7c12a41af219d1185350b9617b16161e12f161e5d4bf24d807495e72d8aca95ea7e7d9123207c5f0a7f8f811e8c9208b7bc92b4590e6f065666482c727c6509f05392de6d4b697b9cb5271952ad430a757f5f996cdcd6e7b0be1e0a3dbbf1d6469fa945dc280079e81ef9f54117b38576f351dfb6ccc998c25669d82ec97ddd9c2cb0d04da312580a80ddbc1798305fa0f9ebfbca5964f5f4c9464f39cfd67e8df8d9a7f61ee9b61ddf01b7b9e9295eedc402c04e0ff23ce0f0ac34f60edf3b36313dd592d05f52ce0e918ecc7ed9320baf14c236d7ebdeb39d02b6318737d637050663ffefd846951c5944bb4e9729789dd7691df82ccd31e7df4547d08a546d931fcddfd2d7f75c14bbb333e7bfe7227d1623a3bd872b07d3171eb9411c16cdeb80fae24333e76f8bcc145237b3ffe23ec3e8e0675715a795247b2ab7aa44012bd2b50a4a0dae9c37a8cf0931702d8132ab1271b69ced03557211a6602c0061e7aba3833405abaa652ed2f8b2f8e84f90e8041d8ad9a26d7acc2c0aa5f50205956426a0be9f2901724a659e43a01723b478d2bd015f24c8e1b8499ed23bf7cd1d53fb4f23c597a08c2ece2a06c75e03d5dc37491592c94f0ffb298af8960765bcd51750fc495aa8efa34fa472d213b090db29ef177db6bc65d351b2574caea32b8064480be424847bd1a8efb1fbfe25b5a2a14dae808c147ceca74d6e46a0453bd80d54ebae9c9b9cddb10709af319ad8d12d6687852a9cb05276214ecf5385a952659e9ca6caf294bb253094ba2777010ba24b9754d9e7c4e27dab6c6b7cbf77a6ad0cc53082856299380a0c7d213f66c460425d847b0d7866b503787492b717fc30f3079b5175b57364c4c415f60c78d3d32d492e82aaf3653e077032c80219275e17c773547323fef3e72757396f7497b946f64a375a94e03aa1e36cf348e51c15c896120e8f8feed76ac7d3bc85870f11b89a7de188a6b9e0597377956d8040f82ca1fda1d1f83a90ca820d46370591fd0d07de07be63a68ffea50e372f4d79b4e3caa65eef5df3dd428eb88f5b0a96ec99f3bdfd08900d3e1a2070ce27971c2c400b68eaf9d986ac9a06ce433570d77340cf0edf02d3362f35e11572e3c4ffef25662b523e998393d6f36dafb76ac7588012df9dfca74e23522d75423ba2b2cd577558e41e7246081d7822e6c04137f5eb1ab86a4be2e2db5f4d0c8f385d88b368b4e7f231a8115921d1ba1a5e8be9ae0883b78cc1f61487c1fbe02fa0e0a3c601d5a45e4c98e97bdc55a28adb6a5afac2dd609b14f93f9f34795fec6c055310d0f063fa519b29f22dab9fe766e49b9fdea977b662883b434ec620e5eb818656ece653d9283144fede6b5a3887b6df05f68dd2695564dff6a7f5e7c247eb20bd4581e2a4d88fafc2c07da5d63ac5decba482b352efc53c556036dc05f4a1e4b414f421e3d961f08e9a604f1b9063dc563de95553f6a86403c79ce050f64ed5de3708645d0f3c97e05430aae3c483826529f19f450e878382e2e126f9ff09969503622e8b881922d54524aaed799dc14b3b5f914570ae02f71c4d0753ce945fde8871dcbc1bf24907474c5569c25d438e13c54cdeab9012a962adbfc1c97141b811e8f22d8213698cd0ad1cf8b70273bbadb33a0062d115ee17f2ae38e9b04bed1fbf234c8b6c1d2271dd3bb9970b69cb2607d22f070bc6522d36dd27122a59f9127d5400e5de14079adfe43b2c5fcbf680342ced94bfb5aa813b371d16d75c747cf669107cd4bf2a6b5e278c81aadb7f1e4537a25bdb07005ea56a2963fc1ed8084856d75937ec6a071df615f4ad2ca60b07d0109245def14b5917361e4a381257cccb88e8d1d1e67d68efed458cf9273a3df2bc854bd5e8ac1f58c647f950fcc237d2117d099e5c0a0b08ed1c41c6d28635d2ebbad75964e629f578ded03b09b945fb1a82aabb554032c32512ec1cdfd1088054e20154e604ff76e4205e0b0ed0fcb0a91a3adcaab208aed6b0752129cf82b9608b0ed39f68f758d5e306344ce84f7bcb6862e703e1c0068f963ed3d22fc0a564ddc027229d81e95b68675efdc2be486fbd757a0ac544619cd2897c53209395f1eca328531c5d0d511273fcc0819c3aebbaa9d43cdc3148aba79ff20ed4365411c5e356f0c8d1c5bbd2ed3c71fa41b22c4c226d5d83b63bccc7a490e391bae473e0aed6396bf209cc9d70ff18a83dcf967ad935a8c8d7084cb38a62ee3f6ab48335cbb5b1d555b4f9691392c5425f41b3afa0e34bc9bd40a82dc224fb76e5cf1ff41a6192e4b4e282e53b8d1e81639c48fa5402976b3ef9551517b9a2b28ac94f831242d53d0510ef2dda939031aa09c880c18dab8e5f143deb8bf0631a67a942d963a11af951259990e2894339c909ebbd58f0fe4b61458db522b58a7a990bd8a8f7e6eb5d6a8087d752a40020df1318e1d4caa07750578404fa3dc8f06cc1971ec0026dd46d60e43744fd5cb0a3b4b0e9403fbec54812e550d3e143d870e3799c9479f3fb9fa8225bc5b1743d97437742bd35312c214e456a4cacc51b9114e6494e4748dd158ed175f0e15d02ee548f9191f8f353c203b89aff5b95e7dd1af7cb0dc8ecf51156f8c0db4870b95dfd54108b5939ccf7dd036af7352a451e08adaac4dbb7c1458e288427bb0c10eb1363a413e73f240849187e0b018d5afdc36a4a4e2fd41bf8e85277797415a3ae23e78aada5482ac4c5d0f5f6c14e1f3e64a87bf2d75590bfd73d2a12da66aef1c4cf6a91f2fe918138a7632ce00de4951230a103fc405829f7206d04c7ec0c899e60dcd5fdfd7ad92213fd66564afb85fbff5d6523cef2ee53c599084d44f86bb5a9c85c19e6f1c9fbd1a95d6253593e1131d5e743a8d2b4723dcccc40e5ea7af71026ad5fa972479002a51560ad65fbc3c7bfd56a8eaccaad9b5d1d171a73ac9d905188c2d2801b5dd7af9d7d56e11f73c109aa555e8c7483a03cb86900650500e284c87a41288e837edd190ab07a6c2650304f86cedd5e584feae0db8043f7c6d11d94869d1756aee83b169545f5a4a11eafdedab23540fe9d1140f0dbc506833eef4d06eaeba2c1323c25b864469ebf75ca6810c55846baf42151e307ddc5d0b83cde170074f30383314c8ac12833c6e8f60799812c2181fbd83550253b5ee8767a57a6ad2ccbf3f5fab2f6929f1c28a7818bdf5ea120535bc6ebe3d6c835df355e31e4fa974db8113b2b77af912a2d1b9182aa49e0f6bbfb1584f8ad806f046e1acba218513a14a07666a4b30edc6f8d344e3062194a8d54fa4c66d047a24e6ad004631d859b93c33352e96da6ba1ae732d23b86f351cda0eb47b6c068c3f4b0b3d8a0b97143594354f5882bb6a0ced2c79605ec2c20ff6f57006d6b44bcbddb13253211aaf3b7ec837b7c0af49b2ebeeae78a35bfbec16800f203854da49f16b51f26cc55a31c9922c980bb77358f4418d66e191ea03a89e7f67946fb852fb6cea2ac7f28123bfa8ef40f42dd4da83e0434e58da6c8cee148ff25417b829c320bd0d9356dc5b279059bcd30e97ad64d61f7f4d1816d6a5fee2787552d2ab34ca4e5e62f6085423f885406312b87a0041d22717ed18b08b6630de96db8ddc5ad3f58f7f0df44727a37bdced075d08f87aa7e3b32ec1cd3bb050af5cd2a0053cb7b0ed03fe1bf820ea78be95d51682ce029c96d034e575216e6f541db2a0f60e5a581abc2dde42d16752dc3db7a7dc1284bc6593fc301fde56e64e4c964d6e6b3722232cbc0c63642803686ae8eb6c02a6730ed88165d0da57813428faf08fcbda7a304c9786d7b9ffc25c41033e6aa7e385f1f27f12486814031e1f9f331a37a82bf074e03dc24b314983d80fb2d3573e2ef106560d367152fa9b80570e8a09a63818137e70e9ba85c6e191ab7498d841a95957a7825818c86147b9009a75e267a9dd67bc28cd1e7d2dda60ce27342de4e750a6fa22bd0eaedfd8684d4751fdf17d34bde3630b318222c6228a75f07b0fdb10649f75ca7931f10111ae5a6bb04e38c40bcab28a006db2a47e92dbd0b3248b3503ae98ca7c481ca0382f20c25f9d5429d19dc32d6d11c2f840b9eb43932929c4780f83efae234677645fecd933d51eb8bb22d6ced155992539ad4c2a4c3aa382ca46a92f0a82a1a7148f5b413bb00b0b3f0d499ee128800cda7a7f455c98180c1f32f74266fc20d6af3d7754e8aa5f3eb3f572767e5c7b2716b5a57f164fe2ff004db537b697431da99fb528578b2531daa9ac1ac0e5421d31fc5e14452247982e390ecfe9614a192d0c2939b24d49e052dbcc71523e65c9720c4cd076ea2e984fc05a505ea3220748809a19a26b7d908dee3650a20e2161385dbaa00499b070c2c43451a304dad40ca9c224de33bd5e87d603be77f5ab2f6a6d5255c84124ca89e6e98f06ba5bc687ba5e49b705a93bd41bebb7e1e3e84f7ef93342949f858c6a20b6e089d6abeb09b2a7431e69510d1b19ea3d252956693b3b2a55e04e0490bf24a00f1f15d25d26d9f5b8513a5f26dfcaca1cb4da863213ee8686fa28f08dcd77e3e7ae725ddb73a6af130b8dfcf4e1dc5c025c8beb9a091e06dc700184cb9115b9ff3a6707b1b7e2fc4c71766d2c566082f15af0826ef40b09019807e60a713329cb5f00543ee1106357c19558da3790dbf134adcf1c649364297f79355f2b4320bbbe9153a967fa8035644dfdd685cf6df6a5027a065f3f8aaf64a4dbcefed301e9e57166619a759a1c4fff3683106b274557a399a83edcd0aae37c53127455bd6d644a0945488120e2031c627db01d07098a60fe875ee09ed8193f60b97281d2f1c5691f080ba3af0bb91f5a6f8bf8d297f1a899f784d9d9045885d8c0c0c1807a7f0b49ef55cdcec3603413d96dbefa4a26514e32979957177468026b6ae96c660bf9c296eb3e473f8117ad98fb3c55972a445ff622c19c703149ae4656c8c3fdda29da4bf3f61454cc52c02fa8ea0bf8a7e792a80fa8be324be3d7e28a6594521eb2707692a2a541a3b4f85bd5d296e935d00642a33ea32ae18f4fe4d6af9ed32f319f0ca253092819585a1d1a8c1b8e6ab5f42ff6857c5521443c689ef05649fb5755daf0fb6774647b76b1b07b1c1c6b8620aac7967b9e7bccd5b2d5058510121b7adc8f68328766ef121fa71e0b67b7ebefa1239e3927cef0358481594634b2e8531fcdb0dc70d1a6c2e8e8254196107c3a15c0431c1a783a6466afae84ace8385cf5d998079a5fc5fc785846ca5a02865d2aec87f2c7385a14e8a2a86855e72e0160a36c67bfd6f4189b7f400dd0b068f2291b719318e5db1501a307fb908990e6af8dd975d293bfa0115661dc744544c5e8824b14a148bb9e75c4116a081134d45dffc105ec228e214500af531652c2716ba42f7e8d19da3728c45c440687a57db060d3a3d87bb823567a9606f1445cf6e905ef0b8a4676e2cc2462c818e6eceed32253db340674009728ae0023d3976590456c34d08530a241deb139cc101f91aecf127c5f9354226c74e3f25ce1afc156d43afc9774e17a88fe0c15a94f3859e9767223dc4a5e3602c433cd47e7f4b833ebd913b94274b8ac607fae2f7ac910c887f2e57b2a057b4143af9953b35e9eee952e9030504c7c864b9b22385cce3995224f750fe5ccfe47b4af944f14083d4cb4d747f9ecf70448eb48e4c63ebbb640b41105dfc9ae97f4e7ac0185b489785df00e67262ddf19fd84890dced0ae83b02d135a6a9eeb653a5cc6ec050505d29108634bc0f51196321352a86b4e1b2db5dce0e3cb9e6b19fe95c2198f07d204cd975cd6880af116f82838afeeadf4be498cf7e5c650e78ecd2fea6e46b0a03cb279f681802bbaa580ca930384ddd97c8549e230797025ea4c444da3590888c2b613cff7605ecf1a596abf4e5aeaa3bc9f311dd4a156f583a8176df8f725c4a64ba8bad46c0f7896223c3c616d52feebac0736e7f520a22409574002288d89f6d15968419e230c43a74e72e9ce4667b4b0e21ff04020c72016818ef784003439188ad68051b8c7ebb17ed02e13d3da6f2e0807f9651eec79b64be61ce03d8122eea0a10cdc699efe22e86b600a328576ed837c9ce0f2d9a82ccc0a1cb263abe02740cccb15b3706b988a830e1a98e4938d38bd243eae0829bd3039d4cdebc183f4ab42b3113152cc3aacb402fe9ac721bad7018ac2ba062e28daa7932dc579f2bd542f41561215c0dd38bb642db94a60845332ad777d534727f8a1809cde0c6806a0cbabe17ecd4a8cb286a35153c28147356366e2f8058509f7179f52a20b5a759c0dd09742cd8e2134afd774a3c4d55c1f45eed4a2cdb7d09b8ddb422ec69261bbc709256ae26c77ccafac1f254abef6b8f2c024148d19a5e21e64ca823c46bb5bf358ff9bc8f124a3801f766fbcf2ca6ef6f375a6cd8a866176c1662ecc0630b3d94c0fca3b2542be59b3ba9c171c8655b7899b4b688b78b936c89ee4e9567b7e984ff3c8b73fd98cc559a6473148b2c145ad360d6d1a569c3e34fdb33e7729bd02d68263f700701093e8580b9ea62291447f901fab00f817f0395e28564bc6b13f2427539722b62fc9ce54099f7446e962c7695fe5bccece2656d6fbf86f060f4dd375ca1b7423116510c6587dc8b573d01403fdb5bd1bb27d9fe78edd514e29a09533425a7f09a56045ab170af81116c3c07cfa86c132bbb4e55f2624540495c12d22fe5e752fcba1052fb975544c6661d3102da5ab8fd03bfa0b2a08eb4622e6e56c316c185b8e1895024c38ac4af7deb2a97818fe64e141418f90f52a5c069d183ac149b41ceb345addf131070bacf9f6e841aa03d9d2f8a5094d3efc6e2dcf39784c689e6e7e2de098d664b5de3fa7417b4ecef10ff1821c0bc1af2016a54d93f95921e697030c49c09ef9e89853bad5b4e2d496b6289b7390dc7590bb468555f19c693fb20acc5a359d2f7fb49e8c96ad2fbcd3d4d4c7aee8063bae4f99e1a71e9a05b75397fb4a24d4d4f23230a42b96ca10839a6b2e0686707ef8840c340a3cd72cb0918134f94c9342e6d1512e25bc61be1c59bb9c024854480090e12065a3083d93ad2cd1516295cfa1f9e54b52652676270beea94d89227b9fa516f29e34bf71a0dd647aae1947df31cd85c5f051921cc32c747ddb09bbe85dc605caeb569ee7e5aa31491c3dd3ac5b24785052725dfd338d91363a570811ac95ff9745faac2e0cf1477cd718be6bef267ae467e4bcab345edf92515943482d6cbe5cb1f7f79a719325387c82ff2bac96eed82106751ea86d3b0d45eee5ddf8df098cd00d77c22cbc497a100351ee84e67c67b0407746a869101fd5dafe121af18d21aeb8d814ac375ef1814c3e9e6501a70bcc2aee02d0911d23392e8e479585962a59be1e8b038372f0891fc11050c14df1086168f7649008b36d8fa2bfc01d708ff590a9c19e61a3ed25ff424afe1f2c423ec93297c001482bd63b5e8265558f8cc1cb638fbe839512536eeef1771df316e51cd55b2f8e46d480ff891b4ec944b22dcb854171462fabe78923b1ad84e0563008205377a1ecbc8442f88ea817c02cc81e87e3f474ef9b8346d8b7f057883f3c3acac37a529659b54e668fcd1dce35e6e1fc8d0ac2bdf0243c91483563b11a287a593b19c25d4a76fd0c5cae3ff66ed9dbc5a09433ad5ca82df3f4f9b715cb3a4ebae6442943a84d873131dc7e744ef0212a69a5dcb6dc2900f24793ee639c95c310a30a3e604bd74629e4a44310405af6713263dfead8c1928e02858ff4884ef2b11e88d0ebadf63efe1043614c46a74e0c41016ef5ea522d483cd5f6f7b92d5224c504ca6a9277c8758369cde179f6ccb23c8e9d255ee1e8ee67becfabba4ac503a49ed488b70b21e65626f8887ed47411487ab1d8576b5dce4639e4d4c81b351c33f3cbdb87939cf4505b92a646115c9efa4d9e24b436ab8f8456800fa91056401d1a5dff97542708d0429b5181e990598651f98b27bbe125e81867956c392bdd62588d256c30a76daa8f29e4d4da3201b2a04f6d03092269b59f66aa7cbfb799858a18eae8e1e4739085e898441e2d387f9bcbe46a721cc99fa36710dda4f9224c33601a665df2cc963e1a129fe93941c452b0cc5425739c56513260e39dcac587c1ba02368f17a4a7314cbdde6bb51222c0660661f2691348b29c059f8eb214edf8776a7cb53dd0c8f32f66778314c15c5a25ead2845ddae162de4c7a934c66f07d5ed82592c99d21f854ea214af98c90e14ecd4e99c0dc08d53c2dc48ba5d22f5464de714b23fea47a62828adc452e969baf94a6d39165accaf879edf56023f259d21bf63ed4cdbe0adf2f38e303c7cfa080e12b79f63740bc51c9e538a26e8ecbd6b400e93d6565997b71320abac2603f8367b2c8760342a06b33c263138ea8c2fb9a02125cbc056e43fda903484b9f51f837977d9f86e0d0051900631714c90e86fe54b1615f89302a05bf493c9f2e601365d197f9b4ba0f4f1837747449edacc0185260de991434371477761cdfd072f20b1eb72dc7d1862c975b18a2dd622e71261039978fe582eb81d586ae2fd01f1b3794ece445fd008c1c99052c775d6ca46a364c632f4ba7709744e2a9c260669356898380fc4f3aeb9819ac00511a28b9291aca84518c1e502ae42f125f4357bb0c87a83925a5e48f79f4a32dcc99025a41793b0ec0ec3cbb925d27086afaeb296413fa6a9fa9d6d3654c20719cbd0e944c3856f9690a192b44f55a2ffe1c795f6899b93dd357292cda0bf5abaebfd110fc9d8a197fdc25f2b7fc7c459a936d57a3e66e457e6a4225eaa5c64018c2039887c15065d1fd79469fa2f7e3d3cf97a491db81a8dee78fc48344be8d151a5e73a156f7ad503a27552ab03234d6b2f97ca6ce9e32d16f7782037145d72ec9d720d29d07c899aa2c53d932cc22b19d009a45ec395dc92892789bb48babe2ac92cffe0b04ba9490b7dabc72b84faca13d58fd897832c8625978b4f9c059ee5dde5e60c09c84bacf38bc556b3c7c2a7470513947df290c88a9085286d6ef210cedc00bd59911c65b4f189743db361496e1c9fad6e305f91f2dcae1aa87c0a5e94a5e830a532952dadc934090fd46cb831e465874330d628190dc22340c455b0f366940e56c0bcf535c83a49d37d3b70638c77b878c376289e94e8fafae86595e72a5b6a4b9005be52505c7e09f4bf5a682ff208f6900df6f1c3516c34c7468f9ab8e4e2cd0e540d66a8c3de6c45b2ed402b1a08a80337a1e4183a3314d516ada95224e58e5ac5815e29c2417c3369df902dc74fa4dafcb2ee33db921d6fade109988b2b7984aba7cbc2e0f03d45882f129928c27096b730e3afccb7f614a516395796aa833bf3d173fbf1b081cd9f94cfe90b8fb225d8fd16c8403677d8f130255503e0012e3e38501d0399cb04652e643995353684b50230049a1ecbf3ba8c68e5c0ed5bff14ae95c094be66da0e4a5b1156ac5fc01821e9116f3eb94d55f38c2fb84b2496030baf9c42bb308a3462e5ac21195685b81866b63337582c920dc0cfdbce650cbe3892dfb6ec34ed1077a469997d7568da70662c934d13373211445c8141cf70477a8487dde560d93bb18ae118ef0b87e721c5e9d94073405028646246fdd78dab2b1a5ebecf6f99818244f4958e1aa9d2dae608a82811ac0d2812832f9134029cd304dacdbbbb5520a011251d0d17e58c4f135a8a4ded729b493c23da39b3cb1684b32c87f0a738091fb9ba802a421ae83900c4534808122a24539cf2e56bbdc1edbc3bb8f23ac5b137d388fedff6dbffdb6e8d904d0821846c29b70ca70bc50b3a0b313d944a7fa577a154bc42eddedd7476d361d3aec9b42ed94eef189030ccd6c1f40699869d75795a965ada6d4f1396192cccae96c330bb288ef27f4ca9944f0a085393ca5fce01d7b75b1ecd7418d5348b1dafbf9b34489dda05c3ec7b1806565c604db0268ce20b856a5221c598308a5113e53dcc2ea67670e7050070a7eb0d3ae4d1991a599bce76a10eb5db46351ac97681e50467a7a36e176a0777aa29f416959fd2486abae278f4ab2c8acca60a86e167380c93b3ed7bd90da3321bee32fcb0efbc9b951e58351cd93d1cb873ae964d7d2f068f8a7702113c9b5611d5d7b002bd8da9782a9e873253f65a53d5b60ecf7d8747330277b46098a544aeba0379acae821ba21da86a456baa261a0d0108b097e0cd60cfb1a2323da2fdd48037839de688079e7833371ed85e64667beaabcc4900a34f1499c1ce1c8f23bb2dfc2a551beef4a6632de5d1a978ac1eabc7ea429b500b6ee12064f68e681aadb8e0169411c723a3158f0eb0a5397cbf7f441b09d748361d9d2b1a0b34fc703d50400140f18abc2ad218e92b89ecfeda8795c5ddb493b56538ca8e79dbf2d25840861042d80bbb2072d55ca10b8bb838e2068af2dae41e81849c90696dc4498076507012085111dd5e1d3951b902a697bc40c31935de14a11020a6977e4d20f2dcd3aea540c26f0a648c7212e91ff1cb61a2231eed4a27d29546e55adc2e2508e3382268a4a671a08f1e92d7e668bbdc46dfa0f011ff421c173f3ac78da0a84d104113027ddb46dc9713c271a0488da38af2d14f44c86f5fd0e35b97b72e916b3ced98769c92c28122db41439ab0a9355d413442a0c8a6905763a41c28b259a3d30f4af3ce5da334dba5135ae7448d8f969c5d12a24b4c6a97b44b42ca0b34419773a3ddbbe425bfa560519bdc34b5e421b4dbd1168a3647e7e6a3d5a390ae281cadbe1c0af747834289bcaa5dfb29feba7694798ad78e924287f890df1ea9f6ae884dd52891ae9a0f7953354a333a8876a3a3cc6753dfdc675341b31bfd713fe24da68b1ed21ee26eba6962d766e7443df978e96710a36207c512654e02a26fb768235a9a5ba3e8229017685052dfb5c70121d54769346d1fbb777212b92444a79d13f58f03c26953c60e4b2204847be42a687658e7445dedfb900444d40b347051df41192702f9bedaad8e034562fcfb5ed3b8efe368c7716a9a762925269a321de79e6ba276af723cb44b4d86359a8448034ded728266377a27cf3dced3489ee4e87b13689e404fb9bc364fa4a35c7b34cd52e9a6194b31be1a4120d0b924440fa57c5f7aca51e6697494831ee5dc5e2acd6db7ef87bcba9d9b1d892671f2d3e8a287de8d6812a2738f2853fe6486b4298f32b5272192b42b12a25db5af06fa31809a19a42b6723b73bc8077d90eabba060ad5ac9425c1ca34d8e4e956a2bf29d0d2984e81d0f75bfa26c85d01e04100cb3fc8ebc1f543eb785165924f941f47581f3647b0d56df0e2aff8a21444c55a33558dd684e055e7e1b46b061a346116ad4a0c14383060b1158584e43389d56b6585951d14245c5240493a99445a99412849414d20e893402c26884f203149493242727222c4422e90329433d0885403c008138241cb71dd9b6b88318351d685a7645966139c0b00b07d75f6e70fd051ebe5e7f36d81db05e7fa9c1eee87581ef4a83ddc1eb0221c7e3e20ae183905735a446ca39a4468ab28bbe50bb2e88a7237a43a87c2c0840a8fceaf5e087101ff47c50f9dccbe2cdbc9c233287f92f1b7dd1a2f6e57c6874c38a605c2dfe18d224ebe605f9de499d07fa894b804e61ef2acb5f1032d5dc069677eabd7d3ae593f249b5927edbf3d5937c4618f570b00949edd34d78d0e9307a8c4e3519cda4cfe81f98e234545b0b494018a4bf974a8f61aa8adaa512ce4f0a86416118efa65b9a6e5889fe1ca66c7051390c93126e3951f8037f608ae78744a2f007a660ea89b12e7c28a590856c2ae9d8a9f46c7cfad8a95fc27cb0d961d3a733d554a499cda7335fce37675fcd55df33969a8a65beda1b777d4638c9be04d84c249d9bb90a46f1ce23da642dbaa8a21d1d266401a7765d2664c1488dcb43beb3bcf7b6bff7e8230b0d1696cb70fbf4d6858deeddbc35c07e9bd57eeefafcf039774f21bb7793e2d453c11ee0e62b38c122c0a229af6eed0ed24b275df575d51ae09d344b50d47787d3616a77f4b976fbb8907c863caeecc330efdc452472d5d7d55c95e53478388ec75edc2fae088eb560182217efb084381e34a80e49a24122512cc45ab09ca3e1feb84913d6c7f1e01c4631f788e1a3448c2a2af3ceba2c4cedc2140cc38a1e52eb43451995e14f65c8a4326c92a20209b5aba2803bac86ea53539408f9d1b9795af9d678635695f4b8f3c699e7d5ed005d559ff5fa6fffacbf6d32cfe41dd6a2baf594c7b7dda0b37f6e14c1b54f9aaf72aa7facb9289029116e4148f8f37ec4c3fe381fa763efa103122fca38637635f06208797f61c01f3154203b98a2f9e9cb2591728b3e7132ddfa9ba9e1730324f5bdcf30db9ab107b8f98c8d216e5e666cbcbbeaeeb18539026c7c695773559567947754e6f68e775428f36c5a9ce37ebcf76990aa37eafad0008bfa3820a73f4a2325cd56423af79b54045796efe46a63da78f5297af76e9a0a6b003ecbecd4baf03ffb677700270540d15020ab066cb77435b00a399df4d2ab2fc7a344737a9ff4c4c9447f60a7d927a03e5164c67a082c5a8224421250b1f3cc9ba9b15feba479a4a21eb02aabfad6b03c60d12778a60629e535b0baa5131572fa69c2948aa908272a89764e54d261180cd35448f7eae944bb1a0a7f18857991069fd31ba618068395e5dd7be91d0dcb4f2f6194063b8dadc4f1e8d4e98ffbd16230cc891281b54bb495308a063dbdd3f8e9d57425e274215b03eb49e5cb9d28cdfbe9dc11efa72fe783e52796d3e9e4e37496b3d00e7425bd487da70b39d1ae48b7a888c1308f128135057f54381e2514ce8822f55114ae88f7474f3f562a110cacc48be3b1f2986d8f7340ca49b3aa2b947d5426f77017a5f3f64b9c1229df6ee98795c1a493942ce7f0688e48947138d0153a0b2d06e88ff215acb3c35a0091da3b4e817c75eb8bd6f66abf1a9f46430082eb2578333855bc671bf663677754557d3738eb525d4381b4e813521499f980f51080c07a09de8c459f7833f0ddab5eca0db583a96d5934f06850707c9183cc4e1795bf002570d67e74a45560f67bd22447d1148f5c3f59df05b00c106427655e7ae4cb0b1a72da3a92a409590361457729db308a6ff8260a2824641bbee19bdd7d8f43aa5a033146f1db706c6c6c6e20041740c127b5e43d130c2ace80648747a76f1aa773da860c264d96f8a47e7a90603bccc33a2d19a6378659dad5c0bac7e452d95867621b9b24c826a3cbe84ca61d2c2a9fc5268a2ade3b6c4af3dea02ce4dbe678ecf2b20d47d184097cb2096fdfbe7df40131a3ba37097bcf5541f2e3d18251d50a64d73b55372b3cffb3c2571a082d8841ccfa7bb42ccb7a48de8d655956b764709665199d3bd8b1f33308b16ed168f3f48e16cd33d338cd4cbac5d42379764c3a32870993549314e3f4332d91dc388cf362925a09a44fdd5f5de374cca4e394143b9a14b2c318074208b52864873d26958f6dfdee7ec0ce54db3193ba849d2aace8ad1f454593f41fb7ef2fa5e92f6d9c597557d1fb18d4388fd2ae71ce508dc4f0d2fd0588e3a8be5c7dc488a2322f60499397edd925201c30dcd46ecbb8ac97f5f18218aa0f4b0537a843700ba663b369b805e9dcb911841c45cd17540e46f1e86fbea05e608e97d134f519f5f744333497a88f76dbbb22fddd2d51e351468f5d5555a3bcb74495a93dfa723e486f47478d7ec1d12dd0687bd3aea6ea2235cef78f57495f2636364c503986289d391e29ef61479958d67ddad9c8de5f86a9f1473b1a877489ea3d1fe90265f0dc44398dde3ff91b3d1e721cc78d4e68b7445da2b99bfe50dea3f723c68dde7bef71ef73efbfea28156784f5d12bae47899b28dc44b150aad2298df511a5b95ed554d5a2f0fa417a75b6416bba6687af6857837634684d57d011a037ed83e27ba35bcdbdfaa3a0e646fdfaf5bbc1468ffd5ea31c2b634727b35ba29e9c9bddabdc3b031151bd13541c8168c4a3e22fda5911fbc60174800d7f59158a616e82f0886aab5290c0bd5585994c1062bd0db1c73a98c214a42085284441891230c0b0ea06001eb9f9026e3c31ba8b7a02723faa779e3ea08d0d3f0a240415f7a37a534b48dfe18c23de1daa901e72bd06bbf5e6882852af6db923aa3713c1b6e67cc0e6d7200ca342ba5efd0d52ec99c062b2e9d845bdd054f3d23ab631f0165dc2a81f4689f1b3b4c5e8256fc94ffff4cf123196fcf474cb14d26a22078b099f89c5647d7e60cfcf4f5f594e65816494e9320c6d3a06bedf4856ac9ece54bb87ff50190b64f70ecce99606022bf785a45b5a0cb25b8e60d66c8685c4e2b17882c045e55b5c2c1c595dc8fa6cea29db985306e12bfa0476f8272eda55e46c0e4ee754ef1eed9cc699b95a20bb8acec1591766d24daa35979cdeaf179921e3f4e8a901d6e1933884bf68caeaf9a97ccbf2a9ccd32d3b734d21975a3bebc22f62ab158475e1efccce54d442d22d164fe583219b76b06b9c6ed22d56c8f72d83e7b2a98a705b61884b0089f9f4080292ca378289206784f11af066ac6f7d4ccc30bc14a3de7b3f95ecd13fa917c64b6d2f13a9f7bafbfd6da75eaa079681ddedc7c44b91d1d3d3c50ba38c1cc8d80f62115bb9a55815ad8bdcc2189501727db61006cbee7815935b4d8ce2296228c84beddedd5d9aa5415e88d8bff7defbc72278797979e1635ea4de762ab0b2f8a58f61525e49e44ba582c6d1dd8d63b9b1e08139bb8420e0546e23d08a0e85be383a086f1a0a30a56af5c858b1c11394f96adcd737ef06de4023b00b5845efc02b90ec402e60ce4edfbc2142de1d6a4ca88d84119390a12ff79b5f86634243fe1aac3ee62ae6bef773488d7c3f2006bd7ba08726dc1610e86f821eddae5cfb7119b52efc5ecfc6b97141dfb49117c81d0cc330ecb09b7650f4ceeeb88d2582b92bfbc67feeba809e8ddac11b6c0e79b482624274b9253b1fb41be4e5a53e4a131fffce7867e21b46c0764b87aadf28b62efdcc609897d1d736f1c5080ea37060f11809a376f8064223d763c248ba8527e3f00ecca9fcd955724c86edbb793f30bce918d005cab0dd1ddd4341e5c31b889365d555c4e84c4a29dd06e930a57b4dcea86cd335062147ccf3c2c506391e3dbbbf0c87e4dfe70af16ef607febb016fe6cc40483e87d4c83a4f0f6f4292ca6db9ae67dfdd7183eebad0f9f687ebdb735b6c51d7e7dc75619fac3f1f431c8f2c14fb948857f7821c0f1a875cd6714135ba7b87e5a049e3f187371dc335f63154636bf458228e425551cb39e5e174ebd1bb9f5126e31647c4521e839718c1b95917ee9d7519e332007fef0198509b7286667c3b790c329acb8081ec78c90da57f37e7cfd682e7c6dfbb31f2705e15a6775812db438f37da0b64d73b37bdb33b6e3c717aafb61ab34f63ceb34c8a7af5460f2e5f17da617565e506ed4c7565e5c6dcda5cdc780fbfae1be747d38d1b1fdd90611e668763e38187efc6c8afbcc3ea4a2763727c57881edebdae08a087b9fb43d752b1e798d80530b107606297133b536c5d30da653c5021dd3b0f73f4d1af972a047be2f4420f41e86f46cb3a8640e799377f804221493d109221a9853c105aae01dbb51f864e00bc935505c52a074d99fe9949c76c63371e8a6273d26d7fe32f48bc3c0dbcd41e1edfec01898ad10e898a9dc788dc3b147d37e7453942a037a5dd4b8cdfed1b2f15f52ebed41b9406f57ef63883bcd41b5fce078ad2dc78fc9ec43d1c46c51b8f5cc64b7d38cccfc8bb69a1a7f8960779a9f1d911e923c618dfdc11f12854441df512cf37beefd00df7263d0531006e7448d4772e836122ddc04b5dc264f430bb4783bcd477003cc4f1c878980c80c93c1b674491daf448e85ba8fbbd17a9bfc5cd68c2f1aee14db7502170806e34238993775e8d5864bf317f3a5fc5318960153bbc79b2de987dfaeca0c7937e1534b16c639f8ef159f6d9ce3c90418f720f887140dbcb196417e4a5eeb36c71706cd878cf0e899aa1dcc624bdc684a731abb34ceb111ea17585ee9448284f996c05e7306a0338ea3bb675848261ac137ac7391da22100c1f612bc99ed32cc3746420f0108422fc19b09d127de8cc624a609de24c78468924b8827c5626fe7056161b69051a87c27542590501965c21b680447ed68d447aaefe675af6637cd52fb3bb99c2038aae8fdc67181dc2f9035c2308f6e00c70dc3b40886be1c8502c74c92a51da86aa435303292be4be3ae9b8ee99dbe317273b343e1cdd63091764e68fdb66fdef55dbac7381fd705afeb173cc1a254b05454febb812ea87c863a8034e81b78d346d0d04405cb7c94119700fcaee90fec31b46ad37d388846c87719e4e2ebba36f070aee629441d1c66ec85429d036faec6699cae829beb1c78f36c76c7b6c11b17aebb5e73d537a4abe0983e5f21eb3bd39761ce6a9b28b6d90432866dba8531232680546c4bf63a78f33a0a46d1eb9ce42eab3922b0bf1b8611d1ebbaaeeb6a1b19eb725b45f1ba35abda360ca369dcbbae5ae8dab17d2b04774d93e19e3b73c578d1b79de32e6d342af687d89b0d34129ab00a9803a9d81fea4621cebaf00d1464f61674d08a6c76587db0aad584462010d9efe04d5d5e061d6908bc99a6db2d8f2b1c903ca3e2a99874a5648c3042da1747c7f5682d90fbb86b7a563051dbb4999e4e1186505a21af6e5c2de0cea6b3e96cd10d840d080b7379b128bed5d385edc26824a5032c9f1eae1ba2ab788ab01edd218f67777059d70dc9ab7836249bce76c58b873b563792ddb1e7aee27181b4abb936240cb374e7d5de1d3a5818ac076bc2a2362495ff7a624d58180c0cac8761301f4681f1de559562eb2206c3ec21edb025f5d9c0cd8b85c1a6b028c6a6c018186e303370b22a30302c8ca6c375e61db62436c6845114338351d80f0606313826c3e9169c31de48e27f7e4c29e963ca2171602c5b0e746c4cc5b33170671726db74166670076eb1e5006eb1313b53f1748c8e7dbbbd150f92ed974514d133d905a32e9fab27a6d665d3d974b62bb6d42606c7f0a0b361b171b1f56c3e5b18db4e4c5d3d1c8f98da1d6f2b9e9e2064f6b821a9782a9e8a0b32cca8baa8c2a87aaa9f6a4919af8761bafec2ea69863b0cb35ef0d8a1b28ecaed84355a1beaf18abb5976c54288611886614f2eaa7ad6a40ed8b6546f51d5b33a6c96ea181ddc52bd07cb9a74b6d31fc30e8e5a75b617cb88889357306682ae8028b06bd77218c5da0c16c5591db685b3acc9429389519ce93349eab55982cf2491d17418c55a0e3401d000ece4d07cba8535263a0c137118958385892d581443aa694c42dc7b3815c2ef6ea137d9b2ae4885598e87382296462b68cc8957302ab3c1e2ce6845d479f10a2a6417737cf83ef301342b23ebc22693942a0a98b06766c29d16b0fcc4f2aff8acf8ac9c989cde615c12d7b52964b7e94c21bb46826477809e38f5998085337a53c0f4e133b3eb3ca25d665e43d205400204122495aff9744c4cc526dd82c3305b0ea35ad0693e957d7eb80f3303f9f015625baa0b413bcc07dac9949994ad308add01ba0f09b88e775810ef64add1996a8d2fc308f1eeb5065669c84ac354692460eae896ea0898d50f30ab0f31ab0b31abefa81e844f0fd62dd57d9892519549c73b19c43bacdab0f120745417a356d5eb6d052484ec29208aad4b46b3471fb29f1c34635ec4c92b21d913a7fe134566b48740fb9bd962f6fde3ce333d7f70a7794f40fdd3def308463da0611af6b7691ed0e8133cb37db9065cdfe2b9be0040bc9306d8ced81d20faeed57ab1066011c04a7d0b83617e387f43b2ed308c0f0298019839e60c72cebd888514f59d4d50df612216951f770c402310341680c6540fcd400418c0cb0f33367917008d01a031476c52f93e6c33888fa02d9b310724807753030045939ad10e8a2635fbbb895630cc52213bb8871375deece0b78b8f1c731806747e3835c73bf8f88ed2e4783f1ece200fa782280d68e378409ec7fd68c843a1162ef404eff2200fa7a62b8f2358ff90d2c037ccf1ce71f2d1cff11c1a7837357b914a037a118deeba749800be73b320f10a868174030fa7e6b40ec3c4288099e9ccec0a46f111ed1707c5c39949d2dd2f52b31cd31b641ade29b0319bce047647cb5f0feff667a9b0fbc57709a6200670856d610d8c45f1a7b6309a0fa3fe6886c328cec93430523e6f9920b8d33c708707ee543c7007003c04128975815ee836d51c11f2a55ffe1aa349704bbfe9a6306b0c59d1972a42034376cf4e9b7ac31e2f8145b8453d7171745a905d7dfffbc28c0a8f0431eeb604255154ec8ad815e3c527484d608988f5c8791b86496932fd28d4cb0bf37881221c8c7a34d7b177d74dbf2cccc230eb9980c9653573db84184d629d044d686caa5ea2d06892eb2bd875bd257b640bb485c47efd074d825bf818dd8b22c1a82b0eb2925198d800efef516c6c80c70678a6faaec6b8787979a94c5bed02c131516034c9fb9e27280bc9f1e0771fd5e33046556721e8a83e04f4212bbca96382d896ea5d55bd7b19310c3f6e19ec2619d55895328cdadddd85367171601d9365d8f638e678f4c0367a6ac0f5ec10d08efd3a6dd7be33d73c6d576fdb46bb25b48eb153a2becf68736764da9a5d8f1a4447b566b2797afcde8ec1b6b3ea9ac1947833177da2c8cc764b8531aadf20df61b719d84cf7f6c2aabbbbbb61eba8d5ab4738518738500d29aa1bc26ec10d2a07cbf458801293154f877f02c933cbf3c3308ff276ef3e1e5875bf5efa785e17955f17cfe79c640eb57b48ae4085fa70964022bc57c1eeedf15ef5aa87d11efc6416d0e345e6bdf74cf5614f889063b26f4ba72388898dc03ccb46602e204fc8bd95b980b7bc109700f089dac72cba350cabaa7a9809aeeafac94f8298b0be6e55ef988b6aabc7713fb45a6d5c11dbaf5af556d75c1e3aaab95d47bce831be2cbb9e65350cc596b2ecbd9edaa9fc2a95deafecd004a4444db46319c4f45e565da5b7f47a353b69edadca3af3ec2df6b926cdec2256fda2d62ea5a980bc57d6b13dcdbaf5d910a5dda335fc8cb9a8d897b7474776acab39fcfe7147c0eb15ed66a7421f3df15196763e96799e10fb8b5abb9de9d83be622c415717d29cd1e1ec401d92a0e549da80a7799aacb8b855ea715aa5299b0326a9665199461e6793f58c730eca5197acab416d3d131a473a4221d24ca44b78028caa6b88bbbe2afbd38d1af78ce084f08ece49063b49f7c6398f7934b8ed99913da053199baa5dbbb1aee5eb6faf652f7714788f65c3c76eb4c748c3c663255d1a575bd031de38ab84e23a2ddbba48876414c752f6927438b5d7bce3a1be109b1759b558d568d0b2b1be1fd8051b99d2a2e07a7ead6ab20236ee1574990d52fca4485bdcbb2ecd9ad26b22c6b8289208c622682347159d592c1441341ccd83952bbd3e0d54905d7ec46755f37c95c7472a3a71ffcec45f08bd4ca7a45d9086c04e6829fc01d219af1c9f4e38ed8e8119526eaf690a6896657a472d7664dd79493b8a7a49c7420dc45dc4547380227229d48571ad3b5632a7445247a2a214df4654db449b95d9b727b72fb1389a68f7890541189a428f44d24431781402009920f6d7fa19347d07c5d7ccbd18e2be8f2270fc9cbb448f4ada529e4d59348775dde43b72cd0e5e947bce8224a033af7cd0927aae8a2d9bd8a2efa361be36da39d0fd1b72d8a4274db30534b8eb403a29d3b2792e72688562720507c14fd7a3cca3c891e1fe7e9840ef1b1fd5d047a8c7114298d7c484e13e912149a977fdc0fee2967ce07e929d72e6254cadc52525226f6b8cd930feea4732771e72225cdadda3cb2c2c590c086ca8a267f6ce7ae4d904814e2b81f9aa4f1f1880a9533b48cdaeca022128944da398eaa9c13894e7c481fa293a95d4a468944d447e9e4a713ba8c0a85507e72d0e832e5a538536e9af1a594100af591f253e8a2a3bc0b9dfbc93c85a80fd151e832eae4e4729e6404819e3249a41410892ea34e46d407e89da43e44211028b4d5e18c11afa8a1a216908a365cabad86301042c816861ddb869865fdb21aa6009369395ac3e9c7be97eefae02fa336d0f5f483bfdf852fade3aa82e42cc8eea51a0008ecf02f8c8024d56110c7714d41f6bbf7d8744c14498870cdfe6f5f1302c92836415ac8aa719c5f0381bba6f7fd355d1f7d37885830ccd66eeeeeeeeeeec6d1b2ab099fc1ccdcdddd38180b8e612eb8a57a173c4a7ac2f0112335c64f19b56332eaca5af17056c80eab157ff9f17b10840379fa5843158fe331b1ad6d5e9f21bec682ac1eccbeaa32fc970fc4c5b1f5e960d463e2bdf7247a308c115be5e098a2fe5e95e82fa848c1fe307143ecfef2fc831356d52d46358b45abee296437bb2136d6dd106a67405f9ba8f72ad631d5b9b5ed980ec3307ad1f8382067d42ed7637174c313b0c4c521c32808bbba9eed9b6210d2ec2d0a8fc96f8c820b310803b956d8bb6ede9618b749ccb2b20ac22c3a0cc3de6d0f7641ec3a8418c4b0eb3d641805e1027a40cbda1708e1e1021806ea000288c5012f251a0f270420640c8a5bde7708e14091cd91753a60ba087dff32848681aec1055da05bb7409ac6cd0dc3b4cbb2ae4b9b2346599a949a0661ed6722ee9936594c26ee7a7c8c9717e4c907c7659936ff8c12e1f82a73c5ce9d237b7c1c2adb1806070b0ba39e1016c2db2303f1f2b243304a878e86700132bb64898e39d9ba0946f193b38651580f0c56ad89930feda0aad1ab0af24561238fd56c0db27b36cfa66396e81686919448572cf450e8db7cd5c2307abd930fecd72f7a55415ea06673024aac617f98e0b021a04b822e2943d9b54c949d031ad72c0a01d11a215777f281c93436b96d76a78b62d8d3b2209f148b8024d8b76a3b0409ae9924170292683423d2f5a2dd3b4113a89e40accb3b8e64942e623f766089ecfebdc755518cdad70e106921578f1e5bb9825c55f8ee860d7970203b76e2efe1beaf6a69bfdeb3ea40457bbc5718edb1b52b225d2d7ae243ba45b0076db06e58bbbbeb13e244addee578c101c4ee80dfa330da61329dcdcefa750cc3ae6a15a9960fecd9470c93d19aaed69b48d7cab284e8a8d5895855fb91ef56c4c5c12c0c5303e904a3fa4d30aa77096688d1cf466601dc2d156abf0986a9f9df128ceabf6364baa58f61b22790a5a083b41831ee8631ccb66dd8c2edbaae2b86e237abb423f255c7e6e899f68c086dab65591603b6765753d522f8d809fbd66b6e35852ed075c15f264641142c2204826b5d1c8fea3cbb67f3f4539f7f9dfaa3ed5d56c45542490cc5f78c27910e029d563479c2719ce40e922119922119229d9b4b135b729cd42217a9a5f9e3d577d2be2110b2391e117bf574cd06caca6bfc8f978fa177292fd27ed2def27182cecd6e89ca9d847e72d265e42217b978522251f93e77f22b043a09c59350880b71212ec49dd07e281e34bb93efca412b97b3e31e69e8559ca0182768451e44415948d95f79a4342b07511ad1e5c9aca9aa7ccf8ea39051361ea2ddfeb3833f9e8876352d5150e8e91ad54ea1d07cb1dabad2e443b40b41c5f9e08e0851696934280d8bc669d060aa1d6af15b19cbbd97a8a0d34a49861e9aa14b12e8a1c9f5847b5576cc28b428f4b4523af9e827db6e8f1b8d9769909cbb719b3c019142a1d255584aa1ab4c094a399127e72e0ad14ec4bdc778423b39bbed91a9a15089c504baca0be82c3aaa0485247695af80482f9d9e7292a71649bbab849e325f4217fd0474ec28a1f3091763b744281443e74252d6500c9d0bcdad1be8d9b9b80775b16e71ea7432757f4d1f566802f7912ae493ac84822594710423f6d76f59fb8bee2e123d18050f8f04dc0d5d75bfe00942961e5b8c9389c665d8eae02e4c6504a42c29ac0699b2441d21c1301585bbbb46300a9a5e8dbeb79e323b304fb33762449a342c4f41408d776bd11e3d3a50d51b2c2b2cbf31694c4f793ce9f39da9a6a47c69969e461fd11e3ba2d7bb6e4fe4957451dac97a9da2daa25a68339d344db76152228506cb9c00a3e04f730946c1afcc0b30c12813458251f008727b6ae941c8946fe9a5122cc19750de1c8fd2d251656a8e47451ad14ed6ed16ddedc19dfc42a15cdb10ca37d04f6687559134825b60272b689ef6b40715b243550851add10e53c316b53355880516540d4991774b54abaaaaecd7245255ec198655efc184296c2a844c982401bf1056322a64c2142d8091491c02da1ab434444d0d5a1a5235ceb011850d9b548a0b5cd0a2f2b9e049a5b8c0062c25461f21d561d4187f6aeafdd09d54fe3e78c3e717036dde089ee9759aa98c32d08086bee47804911c0f484f46d6204f55d0130ea39aa6d0703206cd0cd719baab2a555557755d6b905b53921fd93af6eed5ebd7a3574a0ca9531f43baa53039c192ca55b712e4eb19e44a6d155a17aed1a4728d268ce2aa8424f4d3dd34f41352622394b28153433e219fb681b369c1064ee5a93e21252119de1adaa9bc03fb5aa2041bf55119fad9b420bb500fc374a11ada09ed8ee561098e8e079cca31748357a327c2b8fdc8ee4aa57607761dceeb1657048d0a6fbd0bdda0f2e3b5c1c952fb3485096f59905d8d1426b546cf955a174e412b8589183ff55d356ad0a88fce6b090f38373433c8f7baeb5285bc3b3c5682e4431422c46a9eaee096f778d1417631555f0ada74b55533d6ae267ee998121ac06033c37fafc3b8fae39614c39b0a77d7e22c582a574b8e382655a36833b8e531214376a79df71317d977b438f1304c63cc7ff0adcb7b05afcaeaedb226c4b66d77ac547e75aa7c0d24e2d0c956cd9316dcf24e3b8c2a038a0e14c1c6a0f0b4cdee78f5a15c818204050b14256ccb4351c2e98a0e9d90acf03ce918419e74eab3daeac915c411c1524f3bebf2ae914176f0b4531f1955e77445431b8ee3c172bbe820bb2b5525c7e374c3a8c7ac0421352a53149e757945b0904176283cf5bd9f7218a64321c2e906a5081bd34c1a85e764a476279c1ae44a9daaa81d876d79ef507aea3b0a117607771cd604cda463a0cdb690606320c314c0cabab04c8b1bbfe540fc1bdd95680a6b88f1099c7e41577feba2d32d18c6d88439555c21ebdadd7709ac6b09d65cc1b67630f7d48ebf5bc19675bb6b0cf9ce15cf6e1f68c3a65dca8419ca41be775584f6b4182445c488801991fbbd70a0d5041caeb0dadddd5dc1eeeeeeeeeeeeeeeeeeeeeeeeeeeeee6e165c10566141f882aaa2391089254aa49250c2821042082dcbb2208432e825524c2cb90013d0b22ccbb22084b009cb62625915b4829bb02cea04a32c08a1555995f56c208410c22bc39a5003befeddf1eab3b1ac0cc36e22a08435d840095880b1c51666acbe42b5ac2344512dec426d43300336aab3ba5f0ca189014660599709bc98820d598cb1cf8b33e8a07275bd38438e91255fe0a095482581c4173ac852487cf103898412a92490f822099655e59042d56a874a01158cf10998598b2134a90c2d08e1c3e111f010ac10414add2f86a0a47275bf6882ce14487c21864659560e464d615996a85a96109c502dd89615d5aad6b1d11216b52ccbbab4722c59e20257a858dd2fa0c0533b1413ec5539456a2045165b90628c35d0010b33910a5e8105eca09382281c810c31906286c3f8a20b3238e18cee77874e1287c08ae3baaab0f3e4c3a2347deb5715247f08d7ec19fdd1d4b22891beaa20a796057978d27522a30a0149de45855c1d845390fb97bd6787a87d08c6423850c4a508aedab553bc90cb9add29521f578ddac5f59a9710ecf1abed49a4eb93e2fd51213b547dcfd4f290e09a04dd599ce185733c1c2ca7033e54bce00967c8c11a7460852340b0d8c2b12ccbb211d9e0094d90c3198ad0c514592842157cbcf0f9c9ae28c310a4e0d3041f24e8a0a9e0c51c48c0f0e174164ef0220ebdd56502164c503bd48310c341119c3430c10e60b4000b22a080bd907a47228967063800c10c22487de1080f52550e7200061cf8800c609c6006fb84155c2829d7755d525e2829a45f57e917dd6e6ca34de5db4b2a27a97ca4f21b2aa72a2ad7754993e992a6abb4c9f4ebbaaeeb3299ae721e3fe9938d938dd14fd444671494d2242a2a5fb9c944754815938a0a8d9b544ea7d3594ea713cb4a5f8f7f17694525729b692ea3542664d4e87d95ff9fff5746a36b443b7995f91595a8f295afa8501ad288e5d7e9d7055af9a5f2cbf46b5eff751a8fafc4723a9d46b7518374629134e8e9c77ffae9948634a251e374b2c1723a956cd490a39f5848344c34288d7c3c0d6974539faed075bd34dfcf75d2f595eb2ad74df395c1a8eb7ac6d3bdd46eb6da8e44a58f485fd2ec2c24e9d69744b112ca478fb147dd1ba3ac1cfcc2a84b8e48a2eb3a26255d0ee5baaeebbaaeebbaae933ea9f2a0d96ddcf5edea649bae2f8eebc4a42ae21240f2b508e363e83dc6886197f678d6ce282ddea706d933f6a76a187cccf1b8180846318a4f5b71547e87a3b276a64c30eabd6583194c7b2576c7d342dd9ba669cfda350e2308792292a297c3f9e047fa74b81f21889a96127fcd9a572f1d20b346ca65f0f66d4de3be957d3a86a3af49b7bc63984fe603397a4d344d7bd73ec2fe46a417c67c3f24ca35ea6c0dd262bc4e4c28b3b351b12eabddf3f1e9604f3dc9c97420a44fe7f1631174f6972931011d0ca3e3739777bb27f0b6c7c6a05ac70eb131a1f317b030a02ccc8d793e6b5a32087181f703c4765b9878ee9c014176a8651d8cda5d3036c6087e5678362abfb43132ddb2d7c26c6863382132a649306a7fb8b4985d9aa6f3dec517dfd3d9727c9e100fa569d795c8ab31c6430ea347428f93067bcdeb329aecf1f1baa89057b1cb70f70ee4c9dfdf191c13fa639cc7df9af180cde026cc61d4a78451ef2474f2ce4a18a6d37eed8e2f7607ff698fef38053920f1acc5f30ff7ee51a1be78253731a96d92e19ecff674725eeaf95ca21c8c4279c73adb5987af6024f3a518f50e9a2f0c00545076948904a3f6db3482512bdff550b3d7ccc4c4f351f29a603e00d896f8d743ed960c273c5e443b537c0aed648d7f4ddee8a1d077d07c05d2ce4490ddf19e611d338145b519a632640a63d40eb1289921b6850f9a0bd838b7c536c6b42d4f88b73ff05f4ca8c798b69786ed2f1a359fbae72a587dbb3b5418698744a5d9fa70ac4bd48e4d2171628f31522118ede07621e8a9da636fd8758e1383cfe6900a9b1db4f83047ddb6c136cb0732c41884dcf71edf7bef593d287a2abf3920b0aa964b606173776c7d7e545817abaab808614f08d1ad6bbba361525ee336dec98a6dcbe8d853662f6af4c3e8d2461dddc61cbdc61cbde7e891d16f4967309b636150b46d82b290281f451414947718ca47df66c77250974ea5ea27f9d2a3685b8ea9f10e8b356614355e82cfd4a049465f016581824275c811ca68a4f26679dc58e6abdda552e9a652a9d4a6deb65fcf52a4e8d69f184bc688dc86324713324abe5966f7eae891b42dc3b06c95c6fbf1c4c2c2f5d8caf25822d12ec8564f4460ed0b09d5a6200e487549bbeda347d3d6344e7a7f8ba3934e1a996ebd74abdfa19e35ba8572eb3d9bc66c96d9484a2a8f2f0588d43820d5a6424f3f585e7a8985ca705b9bcaab9552e974682a5d48a8964a4f79c601a97ea2445e5da15d7f3bc601912ff54597e9e6a152840aa5d97e9d46f49a57e555b6e57ee730ca7a69b6158cb290d4f80e552deb29d6e57ca2f99630ca3a69be311eca7c6554a975b19ef1c81746590fbd7ba91c586fa2acf6dfa61a13d10e939276b23114a3acc7a785dd21e431a90f488a61c2d86a1d04ba4cd7546ac8553bace6d5ea58c760585b3b2646f1824977374ac710cc82a35a2ca485c1aabf1f7a19c7fba17f7d51ef2cc7f184d0f17e688b765dd18e1b3e225e853c0186da3f6d346a190b768dac8a1af1dea64d07cd855e713c8e58dc7c15c693baef07f8edba109ec05f20c84385d776478d75c19e102cef07680ae5a8100015da10c2868d1a3b6ad4a011040d1a2c3a58584e31a7d30accca8a8a0154544c40984ca502944a29044849210d80441abd8c46283fa0a09cf8707222721189640e294302088540010081b8168edb50db167b8851e341d3320064198603c3ae1bd765d10a2b5761e88fbb09421bbba3bb2b7c8dddc1cc159ec6ee78dc4d2c5cccb61065a9ae775d10fe0a8164f862b1ae8dcb5e96b12cd4a62025b6612693c96412d5a10b4cc91b625bde5706576205892418a639f857986483fc72d6654d1ea02d24fc4b3ff82d7adb462cfcd5a4c03d647a503dd8b276094950828325b539ae9b60546759f615926559b6598cdaae169b605414e44bb7f4311ed92f95fd514d89acde6fc60c23dcb2559b336654c1a8772ec8f6521d7382ea525895f5632db1c8e898136097e2c2aa5f5675ddaaae2a7bff316198b589e19d26b5bf1d47815521ada8ddcb4dc8a82de34cdbb4c7f3d5acaea8ee1bf26ab7f1d56195b941ee2ed34ec619ab4aa864acb6d5492d99a211000000002314000028100c880442b15840225866bd3d14800c98b25672509ca7398e21640c310488000000008000009804090007395bc96368c81fda6376765f42e7404f27be35316e84fff3085ad1f0117f5f047fc5f42efad230408d6460539a36b6c188987dcb884a8408743dd244f5ffee21b15f6c8ff4f26ef8f85e12d003e122f60fecbaebd62d192b8d3892f469548598d7115f63822cda98d4220dd878bad337a8a2ae41a0e2719b25de2ac7ce268b110d8200738144529652427a2f995ed1f53280de1255ee26fde87bff90875289d3f9e899b4a9b23742b14b11b41f6ee5630a4bf1bbc494db3a179d999e27336854c0e49b1fc63b73fc8288724d3cd7db13747f261dd4cbc7d9dccda3333086a03c1ace72db1de9eef1602039f2cf5a4e51a186d5c417739c68f8ea1199d5b8d8cbf924d75a5e7dd710c3a102b0636deada10da82b516d5c97957c53bb3a5be2200c7a2e5fe2a1734d288e91cf19a22951bb8dc86c44468eb24911392e13f3ab60e8db2b03f4e7f4905306e59bda6f0938743c664f620df3560579db503c7f059ce002a3eabf9caa28416994cf498487efdd60dbf684aab477b2ac99628f11cf15aa1f1bf7ed3fe97e97ae8e978f6ea465accb5ba510c51b642b059069b4672dac9ea75047491644dd743536e43753b0094e6537dddbbdff4633bbc94cf52242b1a87cddc43b5182993d3f650b8290a1ff7c01fa3fa362ccf3201a958df60d14f87481f2b45c69a112407d660222a3c3dd2724a08225e64c02e23285c42d4ff01a1b32736c9e2f0da6896befda6250fe090fe80d73f61df965133e27deebf96e595430121328c5d242a149b83f55ce0a744bf6c296f7514df47f1dcc13c6f5ed4f44f38074da035fb50456255b81e759dcc2811e2e6b8d26348898a32b91225ed937e6dc028ad81e0fbf8164734e09c9c2a472eb346d9c4905aaa64de51f8cf2415ae20c1154b04e6fb668ef808ae6066c6e32637afd44f1f2ba02f1ec9a07439c28d7faffd7afc18946974963a32ec93daab5686bc57cdcfb9ec30557b2b506d7a1891353ba47ee3bf16bd7c2b823e06a14cf7edc097edac1c4cd9751600854e56000db866b7bd76a7db185649059bf69970057a5f9e1b7c90beaf83824a61c20ebff89184b9b991b3eb3dd750ba490184a0d88d28af2c9c03c8e9fc6e38a7f12904b8882fef1796b633a4c289609a76121db1134a260c6ca42828e77989c5265da6120436308c636a5632242ff3d002bfa127878d1d7312ebce7c5e42bd7d1e0a047d03520d4f29aa187fbc3fb240beeddc99e6c322483ebf5411fb19892366a1b97b29a4613dc443cad760177739a5e999971209142e08172d529e434914830a59ed184555003f68b78c07928abe25f3d40bbc92b6e6dbf582ffe986a3dd7ababbea1b49097a396bedef291474f250bcfe92e70d273100ca0c99de667b777aa9a0edfcf5ed7b84caed16e64845d5d7e1ae84fc9877de409588c51e9f2de2b0082568a1001099a6e548187cfad7b5738f86760360089a2d3699302f9432636e5acec15dafe9ad6d714b50befcda1667e8e37143ae72896094a29491c5bfe83fbd0e63b6f0b9bd26fb4f611d280ca305647c08eec77116428452c1c1e7d91319533d5f3e541e2c46bcc2706338aed07c454a0cb353be1f25b61218f687163dbcdd1c0b01e2c94c870dbc5ba85032868b796fbf1a5f8bbf70fb53b76cf862e1aec255b56bf9795f0cf2a56ed037901074f940108fb554af3490713d8dc34827e3825671d9eba2def050b395268799c16e37eb40e05c77ffa4f453ad5f5342ac7622a54ed309d92b4abc718a9bddb2a466cb859b8887bc9743d9dae849d35fe946af885dfbb8afac682b2fc820d3cfdab629b729589a8c0b72f50cb668df75bfdebad90633be88136b5661cb8bc6b357bdfe441f1f2b61b7facc65ffe840e5c5f08ade6f58aaec5c84e61409edb0249362868d15c8c38523df4e268fcc87be265959f0cd8cdba0ff1e2ec0c696d3f295403f879f6ecc319b543816d23b0a4eeadfa8bbd6523bebb72003d38916b90c746d26235e5a684d1a0a2190dcaedabf2eef28938f508dad803191a4f5aede0d8f9e191fa5cdc1ca75d5e11710628e4492b85f2da1063da10748aa2dcecc81917999c5f3c79ad6df3e6d365a1100db24a3449389305e9e04f072ecd9877942322e90d1f0ef1b0fb2885b201df1a10d8fefdb6c2327b87538a69157f6157a19b48d9d193c7cfefd865b6ce125dbf0c49aa7efab846e43dd93f7454e98b9de063ff4ef11f31a1683488ef725ccbaaaf6f2e0c1bd96d2fdb37f1dcd7b360db980a1c1fa6b2ff6bee7f7af13a6ef58689c839badfdbe552ee4f7f9d5b0d955161fba1fd10cabc0e484ef6625d1bfdca03a5a0560612261ba1ee90e4c507abbe4917f1f8ec9eff3bd61f3a30cf8753ebe187e811119cbfd4a00df086c9356684ee3b0bb06fdd441ea9b4feaeee42a567687a0bf37ff5b938e9ba306079796b16192d86f03153687c07c74817a391c40351f5ee15423a184e106dd45c150152d5fd9fb3ede89ce27ea5ddc61b325d4987081ee3c34271d191f07e61bd143393fdefcac175e26f79c36292e63befb68599966a9970cd2358b784f331dda21d95456358f90ec77b33ee5c70210cf1bb8bdca14eec7b213047ef5c8cfca1cff77671fa37f5c9d85b348013d44049ff9c69debf72a23fa452295dc7edce1c6f351d6b5d2a4df509d0598d9047feca225deecdde856275fa62ee5ec5d93488dc372908200b622d793cb47701f52377d804a991a485af9d27a5bea6cfda72521b881b84fb65d33f1e94a15f466fd984600c5ba14ae89ea6c021cb5c5c4af068e06b5db75d4a4e2b42e7c6f49198bcd961e4cf33b0fdb8e77ae51c37509d55226ed6ad558529e6341eb1434a9a1ca7f940aa5042635141443ec82aa91e85546ecebaa85635d9fda9c74418cf2873c42fca39b32c720e8df82dc78e22bfeffd228574e25a24231f1454a3cbd42aa20b4c9a41e186d42a93cffb8a2504beadab6201cb8509830fb7d02fd4a4aa5aae78f38476cf6c63c5061f4192c314ff736fd54a8158254b93dd419536fe310c7479d615f1c0b980596ea1e09995b4331080c7c98dfdcb0be1626b27f4246d52e74056c8d00568f35d8c42fd7e7c4f895bf472314ef35a0c1b46e049e869c48e0327ac231cb27408c4e27048c5d62f466f52fe160cfbb8694d8edd3486a673276209cde8d064f6e4446a102e5ff281de066c71c28ff5d71c63a99e63a90276d93529ae23004b53d81d00faa63ddf57e9dc849818d66e8395e72c1a37d6238b661d1da67c554088bbe4c11d695f4f9a702fab3b6c8c98c76eb0da7ea5af8e7418e5272e755b5b0a435dc1e2d8ae2a77a4079b82dbecfd64071d67d335ef594af258c74f51dc4a4e093e2cb590d9ecf1220d20fd1d055d9111c550adb9a0e47529350749579865738b5d37b90337e934c4dee25d0d42b322b55a6792f00097fc861c7a7207531a56839d64ae44b7719aa0578372e63921a34ecdceb487272d9dea68980efd1b97ed5184e9be6f384936e02134f940255650c5caf3f03ad4cb367a060094180d2b1a8404a2ae1df2445c150e2e1a913276f1a204adf9e6a7b6e57c468b7dde9f34612a12dff086b4414774d3fa192de12fa90d00ebcd83b4415dd537d76c12c27ae2d51e6653c93d2fd79c9503ff9653af1d1501ed5cc84ac482ae753ec0d80495be34a86cebb9c7864050cd255f070d431bd84837bdc2059d580e75d2ff53d3ef14c61a7016b261ecd7d74e1777af92f96ed4caad577a2a25efd88c07efaff21081b390476b759baa2baee4057fc71bb5a59d03c21b0234b3950af147412fa37331c46a5e5941e7b1d60ef9e260621d8121a32313e4099c9930881b5f6fb5c00ecd900ea4d593d67a2b01d056bf8ebab256d5c83c33a2261d0529df4bfd3fd6053ce3c98f800781230a1316104c32a7b96e2e0d6d3e6b10fcf06841ff9fa75f95373e7d1bcec4c8e68622565d18b5c415435435e395527e78e35c97fd8bb09e33f783c39f70162ebd72bb88873928dedbd1a352a243f13358a3405ddac4b8ec3f98be12ffd15f93e950fe0cc2ddd5cf6c04eaf6e98fe69a2d18421711224079292e1dc9ec002e3e6051600429380f545782a97005974e346f35541c2087843861817179798a2fdb2cf321f0983c465d2dafee7c006b78d844117a15dac0d59127a2f80dfbdf6cec9250ccc52f4dc97156e266e0c8bb0ee278cdd607cd3c85a651346b87936ad4f24581746b21e0d6325c0fe71dfe0a0e60954e0585bd41ccf5ab2fe0b1c4c1526061734af0383af65be40153cc0c6fa3f80d8279f35d0208bf1f0eb4c234503d412e3e89d105d1c830a45bac58605cf7349db2c42e209910c29c573c3c064e1019ec4cf9cff42d51d9e04ac28a87525abcb2b856c420203b31b2ead7f4d77ef2462dfb725b5632c3b643aac9a0740184202d60b0689a688b3133fd719db2857c26bc2583c425bae07a81270ccf116c039b2bf29d5963a2cfadc1ed4be9493e22ad9586e63b4ea551d863b7732ca8d24e6d088d4561a811197610017bcec4f489ca8a8c1fbe1c233473d45738665b40ecdc6152bf0670cb0f8a40a1d9829818e1d887ecc72232beae32e3fc554280cf92b12185551ad181e7dd4350216c830559239d4a045dabfec6869372017ceef45b6dcc1827362a6fb412b49ba5e5442a8a2ba367e8193dc89f4605a65f261a00ab123938023db22819aaaabf693155c18c3c60bed8acaba3c7a4c3b1aa93b0183f7e05e477088ca901323ad08b9e0ab50fcac4adadabb200e73bb05dcd6fdacf630e9567673956492dd09072f7434ab42e3a4fd7b5fafc9804d994eebb69d931051c5ecdc41d444a630f5e147d9da5f47c2348300b69f6081024af5933660bac407caf35067a760e18a64cd040be28a1154c552b991345cbd8f1204f0ee850909b53d48e7e522c262cf3a7004a502d230ca412758400b9c70225886bd161eb867c11593720204e0611cee0efeab4f03d5b9b3afabaec6c56a820502803e97c71185efe5abf62a66e2f9387ebc5f6081a148e1211a1ffcba238d834b23c88a6aec66343b4552b7de158b8a83e172e65c7a7cb4756cd3614f079bf4fd8f6d09e2d6ea2d676d52deb59570f7a26e20648b44c54265ef3978c787fc800502eebe9898131b7ab30f6330c762fa5a6f9be53006a0335071244c61ce59c68c0beafe844ddbf9f88a281f87eca13960814559b21c2d69da8f89b1eca4e91d691ba12c9a17415bb738921d3d84f06be494aae18ba453e3d41b44cd6e81775154854d89521e0b6e15b910ff21d3301cd1802d8dfe165339955eb34aa6b15ae905a9ede1e9c32a5aa6b8531a925a29078c7c6290f7772c5bf8e6e146fdf539b50d46d5eee6859d4eb1839dc928612746152b9a0e95e8e4835f3c598d564edfe67698e4309cc7f01b9af2d4b1cc204b61be667890870c6b6afc7ebc3510bd735b93e4b73f714707be6b5bdb9b5544c99146b839b810b53a019d9e77733602d232805de6748da88aa34624dc4ce8d497cc71a0c96ee792fd7b73ed8a81713dcf18752029215c93c445602f4f47b914873481fcab59c5f5e5e6ba1f7c4891f4f0320a0a24cc8da4b08c8254be11e03c73bccab248dfb9d82a2da3d04372c989a7d75ca5c6c4320a6ce6ddad5947edfc366cc9748381a85c8e1bd6651412e6b29e1cdaf706247f630340d02fb3d4186e7a5b2fa310a56e613210586b9cc0afe2d67fa936ee737ac88d2f4a35dfe1a04badead6a0e16ea7e25628537e2ad41347a19101cddc7e4701bec45011a165e233836e484bae81380cd708da7d8c161541746d5e4d0e3703b45138b9db58263eab239685c042cfe3415d56e5f53ebe8f61ed1f0bcd34aa5a68b75190150adfbfc3383b6ff30b88375d50ed77ebdac0d79e524c900b14fe10edbc53c40595956ce72b93732126c850c9a538a9e67f79d88e10468e95f74504ff5dc69afe4a064cabdb3d9ae10d99b072d6b7b305405f27ce05c213c14ad4ba760c63b41cfbc335611dca7f4b05ccb877607df70bffaed7af129259149c64ec5d92b274be84a8a303528ed0a6c34445e25edff210e5330dfe24ea86888f9d160d7113b2257b03847109c7a1480b61209d5f6df6a9baf6340a3a9a2afb884be46696719265ad6d24a48f2cf87dd1c2aeabe034e1b8fe8ecfb993ab2e76a658ea748d47d6139d4ced344d9793fd5a9209b5760c93ca90687c918cc203ba2591dbcdf3b4a1dc92274cc5c2d2dd490d48d14ff241b5ca1c932614dc64efe81ef291771297222297d2c46a7682cab439aca23e1f5da3fb8d1cea04d277b8011fe33897fbb2daf30527147ded773ccd7a885a7ae1ba0c21eebe5674356a3226e3d83eaff4ad4d048c6afc7011fd54d1700238f65dcda195125493d8ffc3157d0867abd47f1f66149302541b30d44bd4ac2666020bcbb675f4386115f9a609c44ca807d4c759bc409c5681c7c98459e8c347d1f361fb4b434b7805dcc65af3703b8d81cf76a2b70ec652e0e3338600f434594021dd3dd26a5eed543c01d41399bf3880848d5790f2e0febd74e6a8e3d222b6d653c615b9a5ce9669aaa997598f83124595a8a0789b505b4854cdca8d21c44afe6e0e9d6e46f46e82f8c87c4971d8f3e34780dfba9c043662d2607239c43482814151d62e93a2ccd6d1b14cf7656336e2efa639de222c4528a7e4c0353e3ead8b24e71ea081d4a7fd0cc0a4745c22222a21d87e312b45dcbb771c53ba404bb78db002d37bbb3b8d71af3f7ad8a564f44ccabeceacdf8c1c90e4c6093ba49f4bb7e3d71f95df5ab7074a2bb60b49aeb3a3eb713c3159945009202ea552a093c96cd4e29d517612613d246c7a240a03c81209e2e66f7c3fe2547618273f13c66918fb7852a7a2bfa137beb277efe63507cdeb228aacad5d9d582a06ec56fa5d792fcf479b7bfbb62a7efa616d0071b30501ed6c9ad313147f391663ad81db05be6ba4fdb8d7ce1a5668f7bfc788479242e8f0b4a29a90626224d02c0dd8cd408d9fa58dd80ca19a81fae6adeb55f988f4407438f3c9b907ca9de0f796a3014c5297254d6e07358f076898dfc0ec72aa298d30f53690e458cb687dc70b2acb4c3a988df999431eda8835973841000f856e6cc2aedf2a6b0c0bcb001d1a0b6cbaeac5b842db5a24fd1962baa2adca61fd2083ca23fdb9232e2582b038fd0d30d9f13a426257dd4a7c944ac9d7394db7ac33a781b3698a5255d1d18b70f82d71a190f140c4f3b209b9994fd65c227fd3dd90b8d64a58c4b447d4a759bed08676ccb91d1c99c0f6edfb948041f289a37b8547b97543cccf1bf252c206f6c961341a06340e7f3763f1dabf856bfcef3570ac07d07606de1972a5c05303357df350e605b9943f7594320d731987d22ceac675b5fc10895c299b474b1feb5e9877ded1921361f1a26f3517ca611a964dee9c0088605a4ee9accef67e092658b8bfbd6121b89067d50c1b998d88e5d45c5885f391dcbb52a16e113f340690eae401f40da9e75b634516bdee898035a575673118bea189ba01658975556b694026e3a2d52d725f84ca8bd8bc153d1d4e0da14e5506c14af2d7c3d118a50ce0ef0552ff5574c524a9c4481d4c74944e7aa56a7ba9d497f0eaaa9ccf4855997ce629800a7cfae8eb573e7a0e17c01b4a4ecb78b023a05b230cf28cd6f642b63787a72169f8a07139e83efe6403f77e4643428ae1007c5972c39fd16d59ff80ed124eb16f3cf6f039fd34e8ceb61437b58bdd496bcd803a313b50a52d2905eb401f2babebd2f9c874be22e3b98abbe99d2666eaacf9e5937d5c1e47f9655c92421ed072683fd5813c7e851091421ee20e3b34db95c149c78a8784abe9e9d54a71be35159f684310174c3e88db91350fb5579700332922170fb2208ff0284fddc636a9bf92176c768263b8f3e71c1c4402f5c73102abefa914e5c570716fb6de1ee162795f9cd96d2f26bceaf162644e4a28bee441624b0c097a58871c9e0b27ece6ed12937e7b89df7c446b905713611ed812803551373bea902ca60f3c99a358c1c04066c190180c8cfff9831981813a2fa3b76ffa8d141b555aad08ffb99c3d654027323bb5d2b77c1d8a9b34430ce6fd78e87af6cd406928896cdb9cc843296ace93403ac8004b1236e01040478d87184b40b88e3ac004608ac91eb65c0dd234cb20368034a8199cf729849698835a10232835418f91404a133ccc1050059281789f449088d89007631aa91e40f2542b9e089954173732b2ea8a584dc49d4c10e5e3d36d36a4e1146ae59872efac61cd721e0a215bdf13088993ef982785a96f025cdeea2ab1d26c2a0d42030a9806873241ea9ee8fc05ae27873a29a8f962454929d6dbf3229a214f7230b692d25607cb263894fc6bab0095dac91149d9be36f49ac880742841be48b6e20ca2481995538a3706f4eafa7be1ffcc5ee6a69428d1c7d10f9432ac1c8be9a8052859359085b95b7c3ec7ddf836fd1c15fd725058c736d99206cd6d8b1dd7a995459f7be5b2c878e72e57c5f72c3372c78e194818d2ad1977a948fd60285f831a669b2ae22323f231bdbeb40367c0d4a4405c960a6513dabb4b39e009722a5587ed7611c95d335f702d71729a3ba0099887097328e504d0a1a84893c715566f1dfed73ff733a5f10c7da48f8214f4fc2007cfaaaf61642d75a420d82218cfd680fb8e68311511038c59a7cb39c829c64bde0cf4ae05de7e8e2b348d41ce3af1537edf222ae4262d9e15bdff472ef2be6651a8c06a268aff9ac0c3a02681620903ba9dc004df1a5f81ebb2a5500f0b930113ffcd92fc442416a5845a70e6dcda50d6d9212d820e0af23b9bc485348dc596d2acfa283eac8df0d3105649b53b7e22395c3c21c960acc28c94d035c3963e64f9c5f5fa0e6cb7671557799707ddb14a30ee0d433f8512342447528322d11e450d4e1c3ddab6a3625a1bcad6106c3e2e20a32524dac000cbc691c672555b96c9941d8b96cc6bd869b877c7d0c56df452a55d898bdea70712619a2bf1d0fbf6c0214c8d9a164c7f302f27861066e1bd445c61dc23c2e447ea3838aadcebe9cbf187dada0909c24c7c2ddbd409b5c8447d4cc14307ef013bd55d63ea621dd9643da32ffbd6379c3051ff9ac1c64b65b90da0b5164d767df93874a5f5c6b2920b77f7eb7c4d59f9194c670ebbc5a4e0204885f17f9c6ac0c0645db8c27174a4a4a16d9074944e45d7cf15f462e7a4c46d8bf2fd0bf85c8f4a1a08951cc1dcfcc45d63744444af714fa68a5d2f8e315cb565c0b7cc40ed3d404bb76d69a828726d079b881460f9dfb4e9d0b17f8e03e9ecc39c6e8a582c2124ff14c414a0db710d20db219360be2042c5fcf4662c742f0aed489555b2ebb01c07d2e97673229861b359bc3a991bbd0ab78f5812265ecb1440be93536d5dab0d86a7419a1d8d494f0500bf9b5c5a0f545fb7932cc11aab7198da33606c5410d339a8cb80c343cf8a92224f9d1464c829c57f30b4716b48b46ec9c5a3f17626547d03e93a18fdc788e645b7a1164246c97b91ea0c64880a5f7c20611bdae5ff8e060d5e92a687fa27552e35ce91f03ecc7d144c3990a0401bfa033edc0ed4a7f89e61777731b95892042c3e4ff3069ba36233cc538a6473f74a85b3857cd135b797c9059b93dd49714398bf6791b7923f906c3ac51d1e6c336446145771939dc6082f02c34f36baa61a0a83fb3c41420319406de7994ec2d53cf2b4fba5b5633f8c67380811bc9821465005a2e36d5e58b9dbe01fd62f0b3183996806dc4249c0db8460205e984a2588255c3ddacf29790e71521146452154b3c2f5037d212ce5a2b9ca6e3f6c6af81ebd05eb45bccfa158bea0466ba162e40587d4732c7eb12082ce9bd4e665a4a35014a71c4bab288438a00898b44a69668fde5cfea869711893555974b0987a3f3c257e4c0097efe7a331da829953904297fd2aa859e6e5f830240d825b06b2a850c21ffa536be5fd814174980865522c05d1e172a25a176fa09040455a9867dfead9c2b728b8a398d4870d21f5c07a3922d79f18d5d6bd6c6a05c859fda4d4e4824058b08131bc2991d09a92f9744f39c7cb33ea5cb906ab4823923bd3b9db022ba40874b0122a76389c0453a091bc571df6c07a2a141385d6a7df71007ecd0bdc2890ed5ff23fca358abe3a2b52affd0bbbafb13797ecca8d8dae04065f31000354b338dc2ba1e76ef862acbc372235ec7d3fff77313e3c89a23699e3c3b27dd7af7333eba33e386f0d3a2eed38af34f37a6629c83d04bededaeb9439337587027c0ded04e970e298b5c02374b850c46cda713030b0f52a7cba3a6555386fd42894d18fc021e2908d575d389b9b24c91bf9edde795d4ff76c475b3e6c6b0a7e1f6485c2c5e8996cc09d2472cd96b581f77651f868bcc7bad398e0306f2b0d63c23eb74436e24aede33d81cf6f3d5ebc28de1962e72b6b72baac7f9879a77b3dee13750e1e577813d47be3d88ca478a29a4ee342708024ef8463024c0806351bfeb2b3078ffbb99ea59f37bd1d789a86e00fbae31027875fb403b3cb83ffb6813a2ee3cf03845b0d175ec4420d4829a07608c862f4877aa81dfea01cf673d1088902bec6ba30e1054d1d4d84f502bf152b9189c117b4db22c860985b4ba6fd71ee0bd33861966dc39b7c78a566c2f6305ee3be2349040ae1fe7778480c0b6ab4180258842fc22c9aee2eb8ba4a6fbbf6004823d658c2c285d8569bb009239453b4981c9955184df0b9da246196d2b7263a908f200215ffe86231df9fd3a901c4b487965403d8c06b3dcab9764c0d1da4214ec4827eb477693c7cf9bfd59de5290907f761594bec9cc3d6db2cf475fcd05cfef837061b047d7446df240910742a72b15e190f08fe63ca6f91d9eb99d28b2d281e1af4ba8a8b76cc2eb1d1b68902cb4bf7929b824fe9b2b312ce2debe5bc1f9ffaa8536a2f5a9154b9d7ff94b88b85f1aacb60ce3285a7bba40c335c49e12e7849ea87cd30fc544326ba95543752c46b5a1e925457874c77cd7396dd30fe6e6f50dd21e93c43ed02f7fa0323c998c9e5a2d46c2af6148c38dff0acc40c1be4ad9fec7d1ebb24ccefc7b1749b62647df33823de97df9e63a6c57949b601a1f09c95bc6f936a2c32c9888a66a61b34b4b6e28401e220962f5574bdbce697f7cf0888b3d1b6374a19aacfd3a8fb6b07a238da357d0677d1e9bb80cfb89991451e90a2256aff47fe37204ea3acaeda8e60ed6904684956ea4256c8f9cffa252ded0b0f757414631a9d5b9f56647b7e565350d75edbcd6f7459cb9c1dd6836253eac575f433dc17ad35d94a892d5c1f054869a5ab5b69fc86e2df66d074ed3eed0c7a89ea4db22da0c201bf730176c894f9fd95ed4769857e5af6e12b15e6d823188671fff805aed95061ea10d12148666015e9a8027e124c165dfef97a201a56c7266666e1eab2848341e455660cf9582ee015410dfa2264719dd88f6b26ca1c2fc596a51fc635cc505afcd8be23b4b852e25ac72482c12811c5ba6d20e05f7b8a413aa662d008d37fe823cac53272fb370e1adeb0776cecb1049b0a93fb96a4d5b5102a1c1355c744fb15ec3c127838e69aac62a4429d5935a22c59a19499be55285f71c4cd03a8f29247f249b2fbba19adbc80572152eea553b75bcd35a4c6041764bbd6127043d049aaecf4923bf4086a4c54deb0a1c6cc5a506a836bf913502da8ad8a3f3266762631f8df7aa313c919c9fd3c730ffedbcdcbabf6aefad088c674f6ea9d552cc29aa73d8ce1f4d88d413c621a830dc784b0e7619d5b1bde14a736cf54e2cb0cd94b3e9e50a898f18152c3c512d3b909d83d835f96c4f8b5e9834ff2b33cb887f38529463c63535a4ecab44bba1a48a62da60087b835ff1b799b95647de09d1bdbc2c053c24f2225b4ca4d71c4fae09612f84b53a5d7ee6d3eb081253931d286193ff2206269a662333e4695e51a3e2346556d48cf508d691f5bc29424f0ef10e6706a62bac9a653c913410b6cebff5c4ffb413ce6f124dd4fa72899ab2e05dec6809612c3c48c790c4e4a7ff4690e49bbf87446215136764ea124ec7ca9188f7ec0732f615965d1eb6e59bb8473e5e29dd05d4c9517dd8fa966441b11514a98155174be252e3584872c0be6acacfe7c43536e9505a9452f1d8cb62d2efcb75e0bd3c55250be755362aac825eb1e8730c0f0c441dcceb89891068abee4926a3338df8e30e37439fb70850c54d165ad2a00a55f22ae7f266bda6d4f0ab46d36f659f8f2d483f1967c10891c10c0fa24f4786620210c0e9cea5fde1007aa566377152517fd444c06830e955ac8b04d1965f93e591fbd09a06cb1989dc730f5313b4c2e91aa9d39302a4d981962b8f82367720fc994d6a83257be9bcc0a8ef050104ac63e6edb2b62ed751e4c0fae331481c4c5ad84e45da9dad0db236539ccde24595144b3805b733d86552a31919f8b8eec5644de24c19d69c023ac6a72724822912432ad295d84a5583091aba467ddec2f3097d8cb8c248b7810bd8fecac33a555b582105be87ac182124821823154b8f04e0f168a9940ef77a4035182d081964d60b6ec99b1238ade2f652fe4d09ceae710c78e83366497c90aad6f2ffc043f9ce450fd444a5bb843469de9835e1592f2b262de73e8ff9b220d3d9d4fee330980f4899bdc2a0a8413bfece6a2fd4032fe93dff339d1531cc2404840ace6a1a6d5a7f7888e3bdfde93841f1c958fb88d470d58a409ad9dc9ba087de4419339efa430a42ad3dac1123a3b64986b40278e0b3b7863e2774a78db0960b0461a57111d4112bf2d2e5c34238991fd1524b0124a89b332ca8244665a1b9db1229d452802da09de336ff6c67527c2959945f46e46e3c0bd12a6b83d02f170ffd895989dd3fcfca4f816e19b19ba911c2f3338cf02d578713654d9ff7f6cd09f6c1c0c570b258d5d1aaa2e6e77aef9ea959d2dd4e85456e06a5f787707d5385dc18b6f42e7740b0b334f2cd5741a0c0d64113adfed11d51c3f9bd0495853acbdce49e8fc6aafc60ce87b39d82369747b4ef23902a8f7133a2b4f3c2ce19a004b26a1535d87efe4eec86a02aa24b9d40229194267fb48944c08221ea8df511b900a1e212374ca1ed435e97296d8f1e3f4f2394f56d018742a298507b06d0918cd2868f219e24553b54ea712b8b44c523a1a40a7d886bee9f410b12010431ef26ab6bbe5a0b31116b899740d57138784dcd699b5e632ccc280e03177964168a9fdcaa43d61b91720646cb25797c8aa213008290cfb2c7c1ef88e2d8c5d0367ce4e80bcc54ec4e7c807666ae07f5e989afe4234e83c164c4650260f68f6d4e70678af181f749e3f32f27a9e43736af905d9b267c1eaeedf0d5d7ebf8f8f07db2c4a106c8180d1c7756719e72be5a0333faa8b40b61e8551b4cd51ed8e8741e791cc10eaffc5300f103965d079f33f6434f385eb907c587fcddcbac7f51874fa8ece20df9c6385be6c2a134d275366236040f3011cf490079df7a860b59fd9be0ff0f85f19bf342aeb54a0803700727645cc9401159b555ae0023a31fc241b2e10bb3c277cac535e6df136da8c80c4709d51f50ca9c16b105fb99fcef9b4c56e279dd3a9454e791a244486084b27e3c584dcbf135a17c11fa807873d37a714d0167fce9f52b3367f38e72d99b89d7af9066637ebbb826d1b1acea9149483b1d06da586791389f3e5b3d87676e3fc9cf8975994c139592d1413ba867392c2713243fc1f055f38a76ddd9860980837050b9cd33301353ae44fe7849dff931881817312139f0112f17b83732a1cfdda860a9b8173aa12604d1f079abc7b9401ace1f463b23d88f70e048b1dd009e764a8151c9186da9c87fa0b44bf589b534df07864b464c511ca48a6f64281062cf3f11db53d157a11bb44fdedf6b11510148d4543350ee65dcab8388f6ef5c85a8393a109fb2ddd34b56cc86ddbd80b4a38e1066cd645b80c80b9c11c9828dd404842fd1bae931495f6c2db57ba929581240392776ecbd02128b7a29298a8fdebb34b885d3f436e95875f066f831007cabe50c8e596ac16f335a42a7179b077430a4673780621b4f3f09d6cf23789a305ff642b18e028985e50fd6637bbec64176fd219454c9b4a92889d008e231c4ce5d53b73b04273022fb070ce2d61b8bec81a27fb40e46bd9392eeea5583d06976fa5e2a7ea42e40ae8121363167c44da9431a1899db6e2e05cfe13c0ab76397dbb245deffd6c9c0181cd1b1f9766e9d099281e5e7d8e2e2d554b1c633187024a68f759b0d1ae7ece27b890161b30b370fb5007a8fa5ff94effa03e9966328aa976f552b974dc026890d7cffac23d5d4e0ac487841a871c99d6cae6044f11f72f4f11fe4228ae8aa7010d63320260bd7d40879cb6e2ec5e760ac7f82f238840656a575b36060e84a9210348ffd0c4c34f1ccdfd59bc30355ae5d961c8fe1ff208768965b7a03b4a64f9396634d8cab88aca5b5a2c54cca430d2d7ca9e9cd3f812ffcad2bc71025f8e9e8556a4fb999b95d853892cce60dfce7b6a23b814c00c1c4a90c22a2f69267f601db70b9353e39610788083daec5a6fb600366aec44718b6d8357c7800e013f48565b6c1c32938bd767f4398a10af4623f11b69ce109c3c01103c5afc652d4d4885403aa6093df0de3466325b1ce9efd2702d37b1fbcd8b886b9901d91b70660a024788d571d3aeff7637e2111c8abebb419e55c3aed1db7f589939a1b628d40413f0b94a202179175cda0990b2d12112aff63f98c128e6067819d899df4941efe001ce3845a392c86b1d90c26c7e05324811f8a01c2a6c1d478abe56cd0e59a648d240dfbf18d1acdbdd45090b77909b476cdd6c3ade73f2b26de0a1e17f2b34de0e259f03f2b2d953aabba40c41d3679c6dd1f342c8b0879bdf1b376e0802213f2fb6303fa07e7e6fa08b43068f304fb984374079341b1281973988876af062708c7d2ba203dc2720d1182654e7e8b85f8d3009a8988bde2220bdd26c1f5688177761c8e810f878f603a8ee20296d1085089a44f5286f6aad466f39ab101e771f64e1bb46e84d358b98df0c3fa885278429765b9062833c1958481580b92824ab48c6f7b0e2cf4b5818602813e0b8a686fae8abd1e51aead783115f0630e69fbae4231eb57520fcb2118b67ec1a08e2328d396090f800338966591665ae8822bf9f36b4f0ad509188993a8703e948c782da28d416341fd745525c555527dc096aa9c4a97263ade81d63a3ac3e265f3933c7deada6c2472a5dcc1d499d523b537aed84b152dbd52035cded5a0f9ebfe343c54443a0fb1677fbc88288ce92aaed702fae25822116542bfc9f921ace369630b8dd6e02beb042e7b024ed199400d5ffa718662bb2d45e8dbcd8e76e0ee6a3eaeeb0cb0c81dd676df559b542e6da2e01169762137f592e7552ab2deb02e04a072d0f65704cae39dee472307dff4529a8acfe287608a7e91d3bc856131a13bf82c52f89331c0c9680631a8d52c01eda701b7793c11bbe4a136d90581718846758098e360b26733eb438e6430744816da24a00887a1b6ffdfbbce05995a649559057c525364666f8d593ebd71dabfec896e278332a08ffe53cc14148facb8df6973c1bf249d20701e561809c2fb50b6ddfa0387856b768f311d2fed4754034b672cf01fb8bb6b98666006e669943c0df5f2fbeaab3c2caa767e64535fba3fe4b59df491d3fad7f69269f7209d589384fb5ed64f31b1a150fbbee8a7a992c9ee96792479448c392c69867be9459d0071f158a790a8706a091a421c63ddcfb549b2e864818788eaad88485037d0732b8819639bd7b5af66d16e089b758038700ed345d02e43066473160aad0341bb9b648eb401a61a07a18b6267ef74cba88f565b0688d6f6ada84aa0ce905777d3d475c4d5c65b9a489a689dd3d73af9f20c03992773724e08dc6ffab2daaba45d2228401badb44d55ae6efdd8dc793920c434d093346316b8a1d9b4bfc2b7bdface54c8f7543bd2edecba0093c5fa499fbb141c56e8433202568caa31be521c089ae93d23affc25dc764e7b7e678354750b429bb0b237858263ad47319ff7d5df66de8e269bac35a6fcb8e497f144bedb63c8dfc94a4774ef192def443345fb5dce6e85949013c24ce550506dfb7608d685209c713a16a306456203ae9a2012ca55e4c33f58d4aa954816aa026aa0e673026d9c0c440ea3f7f548a9c6df2be428f9f09e7babc71265dc6685b757a3e4d12bfb1946922c2ce74924b33cd083c1169cd569cee93b806881e933ae4d22eefda77dd64b646ed5bf7a5720695d660668436349fa36d269d5c6a6ff7149701bf57ae2a90316aa2f602e704d842d4ab277cba5ba2107eafa31f41e271089e3fb8630419aca82f8183b3576b979d5307840c3de9693cf79d24833792fc57f17f91755586016bf9e6fd861d643fffd71eb430496228704285cdff4c35c10458730eb6697ab3bb1282ccc07840c6f9743f189556cef520143aab744a6193d6a0530eacbd3a19490a656e3e097059eb6bb758e048185eefdfafba7c7e1a75e540f5b03facd3f8960dc6865db71262e57ee216363280231878be9fa4de964ae49b5a3e717bd77d162c5be6db9bf7072593f805946e3be31c0714c6f34ee4a9382d0125f4fcb1eec1cedd5ec7c90c2863f071e716dd0188cef7e9f4085145421c6082a7c364f679a38b9f5fb440f862818a64d2369e67ad155123d802c3e995ba76814c424c965d1bb34403df6ef419218a5c9930d9e84fa689ba8dab54002127becc2336c070439262c4f1402af5f49b063fac5a707d6c9272f7a30144cbfe78351a2ae99a7e21bdd10a51bf46394d9d2844cddb8de633bc106c855a3ca22428fbccd1030131d0550a037908a0183d38c96891c4d7f0021b64a30e921aa5816fed561071e3e7ec4a899b81f4813e111d3495b24ab849ccbab728a696a5985b9a5791885183d7685fe0d58d9d01795e60c912ddbf23b152d378410e918fab75b37dd889f5c1e266c0f408c98d06e714e16f287608a6438d48c0a11dc993f7ea40272c99d4d981c67211f2eab1efc6e7d467d11494fd9a2de0000c1f7fd16374c719a4b18e11428d2cebb4cf22c97014d7d919d4bfce7fdd3d2aaa599c5972a068af1f2e2758444fc0655b80ccf83bd01bd6ceabb824cc07eeb2df6ca4cea1c4122a3554203032c8adef7aaf06e43200faf63858e12eb322fb552b1f3319f40557b39aa12ffd0fa759cd8b2bf9bfb3266340443f215e4e1755ced527e71fb3acf5ef68a61cfdeff956c59a0b100d5269c3dc017b2d2440fd4a0ec8cbb57a1ef1d14e61275c128251bd4673e83124b07915fe4fa1086d5c220f31d7e1c494fd064c9ea64aa468d8778d1981ebfe60dd8549d4bb463348c325ae2435a1680ea02a664ace8e5a6665eeb817adb9bf63b2c116524b4306aea40a38bc33d4288d02055ab99a5a923616985c43ab2aec754f573612b40dcb84538d21cac6801e3e759066d86cf90b5c62b0edb54b98f119e9100bcf54cdd688858aadfd8a3d877d4e66e58494aa12ee006d17bfa3b6be1d3d53bda5c6523b8d90345d0f075afa95b4748761f03a5ed6c557bcc31470a55bf5fc093408331c0de7aded906111e90cbd6fb825e0025bc0e3216664a8e10ac5c6938d92f3d7857b207dc31518e33cb139a0c9ed342d66df325adf30fd062ac0e7e003a19027e9a6e77cc37fa2cb3cbee166cd2b5b3ecbe60927e20ff9864facf2b843fdc9e1a7b81513e8bf1d0787fcad02c087bee14b628b8d2de61a9e49011df98fc95e34535cbb4d0d5b9f26baa37bed309cbc11509d1b6614a853bd773ecfa5e2b82c3eb259b9084e3fb52f6dec559ba1b402f3d90dfc2b4db2743cf6d3ef86ff8f96e5a0967d0f490cf0fc5393d4a5e361a6f039e874a5f4619ebc5c91f31e2a51eef91adf5472ca1ead6f5dc0981c42755897f3f68a9bfe1cc206091a2e723d049f0dcf2172c7e3c60da7fa5de9112b7770c32e6b48e6cc14382c9d98e7900ace7aa2b6f5221112ca2fb29f0048c7865a1db53582c07f3b9a520f09fcffb8ec5c63616d76580ea289fe38560dc6fc6106be0b8fe4b932fe103839520cb67d7ac34692b67ed9dee945ff00f9a699355b2fcad5aa1e103379f734ec088936bccc545b7344e3fddae49df290d4a004f8b1f98a60e5174cf2d4191cc19cc7f5306d050ce69dcaa212f2c1ff7555ce700d9459d666a7b89183a7028e7a9cbf5d3ee4cba57006ee5bf7821edbf27329593d1684fdf43a3fdecb7bd1c67d4c6b748cc43e0bec562dbc12362f8f549c7885b019ce1ee2c68f08c3af13eabbf61413e4d810852635b6d9fee4772018434716d0985b153f74934ccf87fa0332e2ac5cc3057323b4f4311546c237bc1488bbbd4757c41916f1bf02236cc9016e9f4fdbb3887d40a8743f5bd956647b396f1096336845f5efe348c58c623770e581abf9f86c5d4351f75de9081a145ec962115f3c9ae7a4e404bd5b47d8d85f1ab1882d137c0779c342b8e78d09d83adb32402e45648c9dfc63d79cb7593a2ce2473a3c0a4c1cebad68e23a1e131b5f3e303479ac6bc73c6b49746b888b5765e5c411c05f49f27c42123c846df63e9f57fb83ef44420e1a9dbf8fa8976ab13ed0947592442b2645f145c93f2fde276baedde46d7709b04bd6b9ff582d591c6047144b0a6456db877bb0a0dc13af8bae748f7c2a367c96cd9d880781cd3459789aaf4eb63e804c578842d73e2d197e73541b4c30bb1da4a4a3c341178debe630759e26c509861083b853fcc62c524493234d60a99c8196f35854cf0437596046492925322c92a99063b9babc6684591f9369e17d091931fa82d0d7c71f596b97bfc4b58af165c93541f9cacdf84d47a5f32aebb69d7ac4a6fa1dc4df18584693dd353f3f76d6b4df8f49075b4a417219185d09df54d6eb68095ff72f3c3d2ce611fe597965cc6ca7f8e3533ec28c7a41d1aec9a22cd174b3e30d1f9623da77ad0c0127483fedf2394a7021c7e879c40dfb1d23e7efa693412499464d04cd630f4f095792253cec383fa2185a207545f4b61b9b0e5ce1cc35e88af94693d24cca2531d403ec811ed9877978f67d3537a113fffc6a2418f9ef7f24120684d3112dcbc0eba9b26e6ec209e68200ffa0d9847e42ec41af909f671320c2bdf62d5754009d4384aff4bcb5b77c5d504cc61abdcf7821f89c4e38131acec733dc840624addf950201920d3c10109207bf9b802160b8ee80f390af4f79d2eae0a6fbf7324cc7f4ad3adb289f2e8046a3c104ca7e7d05fc21a83cea2cecc853d27b143b1d2dbcb37d18f8d9a8c3951ee6e771c0596626e0e51a2a7de56af0bc053f0c68584fbfbabe0d35a5b49fc7667aa6b6e2861c13ed6996736f09345640341bfae9993432a0b17c21d2249b2a9a15f3b5a674b24a1ddf63ee33c93acfc4c275a6e23df3cf2e0c3a72c7951243191b1558a8ee78631d68e0c93a7687a05ec1f078bacead65f8de148945bca8f3c844a60bc850f9ec1a636bd50902b181e3b11add10f35dbb4124289fd1040a43a6b8b07f76a46060411d80171cbfb4833f25a42b3fa60c10d4517d485dc62557bbf3c8d124c47ab472ed3d8c7490ada54dbaf81d8f09f9f9a51f622c76b08510d12e68696f4e283a845c683216694633d9b0ce0f9155f4edd1dcb508cb33a47c15437a7424417366c200cd947678c104236b36a3300f815c108c3ce735771399c65f24b0a909ee975706bea14860482081ae645d81566af3c3dfe637ff99cffc3d67166825769d2d9f31e915c73f54c86e42514819c3852e3df811ff42dde42166b04775b8d123e473265bc2c20062cbc4e94e758cee56a9fe130cfaf094c4185fde306af8026685900f596381ec687654cd5b168612fb42689f17963f308d9b7545a1966487d0bd3cd80d1e9ec18487a213e46272eba8c1611e425fc93dc5beda178b4f037b5e37b05bae793b16b93d7ea5fb22e529861dce65eb3bacaf08151ee526be0f2a4418292d0706b3c7f695ca4a527dca2a25f4cbe07ee53580181494f68c398abe12457d90aa5929ae8a5a61c36d16343c46c22a873eea134ba77b4dbb8b98f139f3e35520d4a102274501d78434692847a9ddf032a0e8ab1d9e481a23854b864b1b7d521cd4b2a98a4f4d840882d3714385b07467121621f7be2afeb8c1be14269b431812ca66416852649ae7c8736fb26c8c83a545566f37a2bf608247c2f93d2e960e44b85e84b12ffe692483c870f8ca91fa525bc40f7675ac4917c80c1a9287862baae1022b2598bc03d0526af2f6aefe0f4d454fbb1866da6534fbe9f06ac382ad1fe52692b184d2803c4ddf3dc32b3f61f43440cb0c9c9686062c1fe97f2b7eb267e279ada61395f947b7684aec56f65a4be49ebeb0bd962034fce83c2eecd3af60165b58ec5a660d5fa460f96503591a3d64248553d246b2d45ee0b167e450d9f2c333a7825c00cadd0d12f061e26f96552891fe686633c46d4354067febf7430a825843734df2c8f1ad0ff2e00544fc8386a3f67a1c38d4239615a10a3d290824f72fbf8cc9f671998823fc3cc3fbfbd3c58c5c789ffc6de1934a50be358fa81a3bddc9cfec3362baf10d0dc72208bb9e6becda5af6579fc50c5432cd8620b37c49b3d6da493a124a8349a19d8edff6b3f8bff084c08b9a56f732d6d7b9ebbbd4d1ee27832c97509d11abef7c06b78f443cb2448f166b154d69d063b156c86968bffd7f3d4360e41639937ac34998956dd86a5aa7c4d6b7dcf0b863c4d2840fb12d5dd654aa3162ecefe7f80bb9ff181ca66a81a51f8fe1e19babf3038093cfe7a74cc6043b38a3cf42524984d118d6094d0f4482c0351726709d22f950596cf2401858a7430fa2c46d3e5fd9126cfbce52b43653371b6f52df334be9fcfc5bf0b29b9711f464dafcb9af989e8b8dd5c632961ad0f7ca87e862ababadbae94c7c4fb412032ac4aa79e97579c760ac375170cf3c692f5317ce859294a97e9cbfcd140186ebbe9ea9851dd92bffdf39114ad24f7b40220b55e20c0db112ebf2ad804f895183f76c728ae46933ed0ccd9a6fd42c86a0f94ae1a4374a1aee1bd275742152dab53a1db8a67f908c719b15cec76aabb42e676805600a0a85397db06b73196d0d7e1b6ba8b8186e5c8f42dc11815a1abbed98f32c356d91f5a89427081d1919967121de6007c2720c79dcdf222f187b534a092b828030bf1abd8e9e7c6792506f8989e3eb66a5a4e83995d4b270d7c2494885d51cae8aafbec6e1b731fdc4f8b1e8668d7182a04501d8b9281c88b4b4fa4f328c3a0b8f51ee0619557358cde01fb166ac159b460946baa729f4832a28c744bbbcfe1f3efbf33c0f3e174a07a45c970d7fb1befc7308ff897a4510fc1d842c85dc068df529c8757bc238ec986e0c0f10abf97c8e7543cc90c6a162dec441114a1604ec9cf972c4924bd6b6c798ae5db8dfa0673126a287d436320abf55723f90623655160272c47e1ae475066b4ebc40bee289ed2754f3e5e3d221d04f54f7de75e44720e30960c8178818c32e9d03000ffc7cd9c6bda2b5cc073a63fe975ec3bc0b829e8f0148c1ebc64cf9a142e5e81543cfe63fc4771692c0797bcb612c23941e907e426f13d5b00090b1b40a96a977042a9b57130e971afacddeaffc0ef7e3b9d53eb9acae20c2c7979198863203f89146328df7bda96808ae8f747e3539d462ac34c4082d255c37ffaa8515d8e6524b6e8f9865c2fbde536a7ab71ecefa9612234b6303494a41853e0468aaf5d2dbbf94012dd5f624dbf4843fd18a9c0092ea6c59846f1839ebe60c76990e61b191fbb65712d59b783bda2193cb0c4f27330a00a5e4aae5e18a20e8bdb80c30110bbb56d28db3b13c97220412b69713a778346e6c759350c66a128e104b57bf77d95c6e0b7572964d0feb7a556bd170b70a9bec1664f2cb91596abd163c53ed008453a6b2b5bc6f359f0e2e25be1ebca03a60684a693e52667d450654cd63e782ebbf5be8272131d5d103261638ef50ba070c0270fc392c73dc93b0d15f4982bcbbb802cbc6bbc103270d04ac65beae289bd0d847549106a2d8e1448984ab34b9bbe2c0ebc746a3b0f47bbf31040a17105661baa01383fa0e2c128f1aadc5fef2cc3a081d77efe680f6307699df74ee6628ee44d09361f59f179a16f6fd9a1299c0e62b2653a2ee6edaea7882f699ab3070f9eaf5d93547e42b6a7629f487217bedff87515458c5f88f3cc54f687cebb830c10b4a71d086466f561c9c71e1c554af721b24a4dc290dfe0f02644b14777b7803132a8e74d84dacd84060afddd8d99f169e12b557f5bd30474f998cab78fa5c5cc102255573ed7058e56c38f36226dd7d1068a3709306fa2a2589d47e1cc00c24ac919d23906cae9643e2b42aeb83b03f43305a7625c85aa01aae3b3324323dd3a976f5446644be66b834cb2a6d73bbac45cbb56732c0b51a160989e2a6226b7450068c267ee02ca07d7cd02e1f5820ec9267aba256226070a311110869120225ca00dad280a0f19c512a800ee310183a28b0abf1681a8931e6de9aa2c96622419b8c370aa299d8b97a1127c7fc442d6fa57060d8fda9235f569841bd18313868d18d46983103a35aedf767956ad0f1ea25000e2ec0297dd13896a295e28f879bb7e7a739b75262e70e45547770cc4b6425768e20ff912203cc7939170c586da188d2daf90a32991f57c17fe38c78f45418011a6cc5bee5d5bbdcd74343bf785f812e6050c57768f2a8c1dd8a6c320842d517be93bb51e8f2471d6d4ac0aa54ffb19acab980d608d52335582017a84afc2ce8fbd9aa1c5ed7765ec9d5fb2c3e1115ddc05f5caaf420e29aa222d2a7a3d4435eff5b6f367b29dbbbb4be84972b77ce940b43c71ad62948893323b6ae3fd41e88e4f4fb8d1d6e6e2d6589e1dd900892b7555f36dd61f44d7d79f2793bf5b5b0f45d0099b941aa8d4e1b17c0a559f806f43d8ed2e59a8b7b23314ad16726a80d6cec51bdf83fba11a99f94c3737f81db28c8e29fcf4a18a3db41a9bf3a6ee15471c735d704c417d71abe6e3c592082dd38afb87f3bd90f62992be3104a8215dd5a81be7a5134445f6199756ca701a8eda739abe72261199b33d1feb7ff2014c1bac15dccfa98116b0acf2101af2cfb8f6e28d51f73cddc6806a74e98a4ee03e4b349040e43e3c2e4a3e79d09c9770c982734ab2bb8fd653af686e274b492db3d2dfa7649a28b2010be6bb75b87032c6b81f1c62ce9271c5fd39280c30f7ccc71a0f78ee90ab03e234c3ffb912855039509bb371f62dd1f87f1c07105f83f65fc673ba5b440fb0103eae2dafe198cfa64778fb9ee9ee3d884dfbc838785d36a63995d2fa01b5b3783a361fd5d3dfcfd46a58f2dedb167bce497ec71f4679f866a33f2e9712eb2cd11da378bdebe85a7edbe696e7c73f67b9567e3a25291dd4c65ef6ffcc407786b519b076c35ed8c7142cca8550a5cb89d06ca0766103392562e918f184468a57a9c34d2e68f0bea8188b74c6dee6ebbf3cfef480569f29e4d89f4154f2c1149732680a5eaefb73190e91556f394548b5582a4928f1ed79d0ee56b08a19ce66badf551e81b94cd60ea7ef4c21dcb27b92286b8566f904f4c9caa86f170ab62b9a371e31c8b9a2a29057722f3858061d78502a8c45b5d965b3e4b81567051c0bb5529158a0c009bc352957bd9ca5c834c3f8a183e751fa9b0d46f3db2cca6301b27ccd8c76aa605e32fedb89b06cfe1b6a1e2113b0c5e51d2d3093f0ab4d2d0719c4f94df3ac69d7db095126295c7de3bf8fa0751717938c0d53e1b9ecfa6206f1f74837ba7b655afff71a7c00629b0244c4e9052e4d605be20b3dee9aab9f60ff7eb4bdd90b4332ef2e7308a73ea654fdcaa91eae2d4c66a1f870e44b4714f9cff8f76bec32ad5bc991cc68e3b3c58187edcb470bdb66b0c37e52f36f32cc61ce446ef420dd6d08f5e849829d6689521379fc0a09d9cdcde4d9ecf17d780329841e65e37f8a07a7dae48ed0afb736ac668e38dbee7f1a5298a18c196d13c3de520c8cf228ab3c84f8ec98cbe68012da6fd55b1960b480b0c01ccf7eedc6421e09f3d50d27d4df31da066079a0db595339f69c609010388b36a0028f26caad773c0991772172f1842f5c16c924e1cb9912a1461de14380fcf4a040f086136220c5e786b4359099743e5aab574adb6abe82553385da380d3623887139b32b9746f3928878547a9d56f7a315daca4db7875e1caa9e1d23beea286c250790586b3dcd4ae809182e8d69d66e5ab561b9850b3f2c6eaf2450da1ceca1b57dd4b7953fb83b7f2b3c295dff3c9f9815c333aac31e41196cfafa5f7c66a0d34af283288492d07b8d479e0a6e441a83c9ae95d3734d75dd073c10bfaca36e0cfa1ad35ab1d8ac5339bb3eee11e331b35b0f5ad575488ffdac87cbd80a61a602d35f086912b8a1ff5026e03341728b154708d75e53414d04549386ddb6f782e2d27a8462f76d5e7af61f3406ac47172ef97eea8cf113551eb39467c80987e2f1c6283f462a5d638c823a5204b4507d0ca8e43d55e0ae7bc14d384b92c303169d1fc438890e2a343a87c5b76d1a795373297cf78e6d3cdc54e7d7af2edf514c1133e546880af84d42c8fb72b98c69f7a842da7dfac9560ae672976b30367ffd6b19926e466b89fc0f44f306d7544f39f2297fc7608e02496058fa8bd974f0c3f0e3b1c2550e6eeed3528fe9944277d524439e4b4b5c6e3cade62de9dd32902f817b77a824c72c6559ca90834376749231e13764a5f361daa494ecaeebd02b2276a4702a6ad0644b75693804de2de5e06b2d4671d5c3f6d383ea3c07463b737bbc1a6088caa5e4ecd59ed4dda4507339645b7ce317831e564501761c3b3b528095340cb88bcff44d932715c98205ea8a8df583dc18831d6f4e7bb43c629da0a1f00b8e1a76be8e1abd3b3800b1e8b3745b6f981a674e1a9abfa1714b512497340c40aa47643996e4667c05b1392b18a7f6a0cd82a7e20f8588bbe30121408f46de47498f3a8511b0e4e5fb0e6534d9b2bed3bc076ec9fa38a453d320b5e11ab0080524879b27bf8bc1d5e0da271a418a9b66db14bfdeb696e008403414cae88f308982e1ce0a89a93cfdf3a2a0c32897d7a78d73b17fce03c2a0a3a5b3cd50ac6c37602383e8bc5b77e1f9910f61fa5cbbe8962251ec8d0864542763e4cae5720cbd244afe08b7a6be81e07eb53668d28e2a9adbd254651aa9a28de956212c44718a5d27b0c9e964258490d6a86e07d9dc113e64f17d6e7509b6e32c028c9db09417f3e8e1064d4c6e111488565469cb8fcd5054c70c1731054cff90a49f6ee77e20661bea8e725ae6d4aabb040d49b4094d891805cda5c8064968168c86c436d5d091ddfc7ba5b94383b33fb3fd40b8389d1cb1588695180c0ca1a14985cf3a661a25380935650312c78426f6f93ba3b985c95df20a9ae9fa2da4cd5a4f62b470eb2081e1effa4e1af0b1c9bf54d9bfea5f66ff6fa089b52f92243e7deb17d5dba880add3b88412f50272e74831393cfc1ac992832adb5153a06566bdb421af1e8546c102e2bc24272f28a1635b518001ce5b451c3fada472323276e8e3eaa7257a3a71d730166ed24c5475b11070d0a85614623bc33ac776787d22a38d29e9169c98cc499d08d42182fc10817e15cb4bb5d13811afcf319115bdbb724b9706c76699fe01cb7423ff6006e316c43f77528a0d2952f78e6de7c1163f7e7a1a105c28c02fde88feb6b847d1a17e8f6daa90bea275416a99f5506c28c50302029adc7fa065dbf89a001ec0276a9d8eb948d339016df462bbfebc5102e540f71aec7d0d621460840b1aec76057062112f5b7c23717b175a349b0d5d1b174aa1e43da7ca44ec9942613d17528d0cce0b56365be26d30de01c27502399eef4ff919c44081e9125ccf9b6438c323f2bd287304289a342ac574cd54af75acbaf3bb041e01e80322c0e24b5979307f8db4d6c3c1ae5f0afbe9396a3029254846a321e820bc19f889864b4465a9715a2cdb1b81061f8a64e324a000e2406794729a71708fff945d12262db37e2f1820918e4ec1e8c5d60ca1d0e66dd20108af2e36622de8699f94157e5ddba101817e3228c5bf7d46d59e532add60c75946a4598d537c9659330aea34b16e1e6a062c52b82755884b877e1e8cd68c7d5ec94a8598eb0fbf8688a345fdc80d3f27c80566ab1878ef18d52c3eb9fe5ec9530b14fb096b66e999a87c8e88115e184efd01251448beee871a20db5738600b5882b354be9ce8c92024d20f543d361cb998921516647a059368da5aad5c695f19b717d493cce0dbbae484f800b4ed2e2b5d8bd57215c558cbe6aa3fffac83278414fbd6b7c4f263360900f07acc89a3d6e348b353237c0fdf4c9fda71320f642f2a321110487a86f45260250f77d3d22b50052e5c29138f0512378f008d50ce1400dca77924fd90006fdb757574942920bbec0ffa944e2055203368be480cd65ec714620e98cd335be6b86098a88e3023972b6a71716573d41b4e56d11e5d0548b22bac8a355fb697421a0a27f02bdfd4d9f00ca4d8a3dfdb0d0b5674e09fea599568b0232edc074c57cd5bf29298e04c8c0571d9782000d946003b84334db326d6b4303fbc6ca107a006bf66366f479e50bf1ae90676e1f9cb330122d6cbc4783685e70efddd6029cb3af7f840554fb3e38a48bd384a2589832ac5a88021ca7073f0a2b7bf71f15a139a0d913ab7d4466baf274e0f3b58e3f1a916df9212a6559b30c561d762e92c1d134d9187c52cfc4e006346b8006dc917ad2cfcaa1ab6d21d4878ea83631e1622275b425865cc86e4e6ad7080c41bdc104048c3787f2509bb23815adb6c370959ce7501e0c68484b4699d1c93730adace0a88ffd5246c58f3d8b320d1febb67cc8bbc83c527744a320344195b6b27da8d34bc1e2bde1d4d0acb504af4ac7ba88f7afd03a8346fbcc99c9bf74dd12dc403d07ff9d51354b91f0973e9076dca180209882a71fc12b8a785bfc7c1fc36f20366a99396a63b14549762fd1005747369c4451b0d5fd779c3ea4ad797cebcef1596ba2b0be5cfcc92eb26643fa5bfcb3b0581fc04ffe9ad3f9f09bb1293e044d6603112deca72c58b2a43bac6625edef0565ff123bd2e8defa191661248a0f7ca6ed63a92b564da717563f759a52ad964b739c3aa02c9b839157955b53538b4ee08fe492bcdbfddcb94d6016c4d3a8069ca33c6cf72ff8d0eed2621674fcba48eb54e945690c2d84e1ab8138d5e60cf2cbee024542893c731e35573ade697433744fa2aa92c9d1ce942536f9637ab9c0e4c2c550d30412ab858dd40122ed9a6758234764025999c809f76709d1fbfa203a11842aaf7afe6bc86a56109ce413fbfbb25bf577dc114d284cec41e73d25c02b58de173edd9fbba3ad15a70b37d0eb532cb1ad4eacab635f0a77ffd5e667d606ab77a3f3a1a86e1d2541bf156eacf13998b345972052bc05800b222c4bd535c96dd0fa0e6c9d5d55de9efaf4daacc59d66bad9b920435079810c4aa374ab2b2926a18f9883bc5983d68ffe86551c22a9a60ccb811b06b1c20996ad66a603893238ee111ed2d47d7d372838ff293246703bcad9ff25b05e9498b1364f38fe6efc3aa9b985ae3a5c505a9a7fe56508b59011631d8f8cd01ed0e9a04596339310f17ebc861f50220b1b35d0be2892bf527a1bd1433256e45ad570bb463c988648d4e80963ba8de9380eb7c6aa6bb7056003751b82b843866ec39d09a4ba31cc52cbbde3b8273ef8321cf1c6b13daf013ceef7469a20a5a98370c304b91e89747cec3d0d4dd5cf579b42e987ecc05711692a978d052f45c819a09fb6386421739ba10d5bf5b8151d6a91817c31ff4bddaac0ac51377b33ef5cfb7cde7c9477ef6f78d44657a43e83cf455e43c323c2cf1852cc2f35242d2e53756b3767abb8c41d2184baf36ff0e7bd68be3851bfcedda7f6a92b9cedfc39a464062dc1d69b80baf3401b4568204e381d71480d594c5323ec081ae08589ae5b1e7d7b5e866515061d7ce5b546226a6779332ca4ac304c570286c6389840c843f69f25b58dc980f1fe37cb64502414c90691d04b40877fd5e969089942597ec7cfe8184e000300c37d4829da576e66b9bd1f97762245ec9c08816d9c6b40c69b674a09b92bb7e603dc927d241f6f07df33ba4fb76a5a144a6f08882db8c788c984e2b3c2e869e8fbf165c771445966a6db8a8a148c9adf526498ad76ca7cb516221b08ef4d473bdc8f5938a87a62badeba2e8a637cc0544fc2d8e0384a8ae91af0182c33dc9ebfce440dbebd56c15e23e543e6ab4bbc1c8173ef1075ed83973a386fed2f2595da485e23ba12c0dabea1cb010fcf94a2819aa95a5e96b07ca7bbec8c87e8096a0b224f193718a88c9e9754ad32406c92f1563db2df17e98c33495d58d3444360b9203ad15f7fdbee08ebb54f4a0b41bf1cba58c8ea5cc21532f7588c6b7951a2354f93877a69d6d140f2954bec6f34fe6ef7c6429b9387c7050ad7e5cecd10b713e7c5ce89b718ac38e32236c5d573c4f470e35c58a3b62bd248d463a9a5c148c9fb03fe97ae37de701cc6e7e2640a571df27bfe91dec82b39956a76346580f3c6cbd2df9ced8aea34a7bc1a1e2fefb9031f005b3d70931fc0528f1de23fd888e26af8be88085d915bc3101b93d016b78902c0cb5e57235113a069638b4ede56eeeb59c5bc795c0e7a8dd745cdf1beba0469863423fde9c4479031126d2f845c4ad675e4acc9a3ad62aeaf04277635f042a4ae851c30e2eb7789a6566a585fe48fcf07c9f33b6f6de1dafc86ef6875b6b9d6084091d987071f4c9e9071ff2b352ddf36149f7f4199bc6eae444ae0b40b9c5f8790adb62eb77357c7f84d25516337fb00f0cc4f0170ae17425ec40b3d9c29af468906bf8b0d4592868bde55850937df713cecc112e6acbef87c7250fecd961deb244044c157f477da2a06acb035ef4639c2ac229565f77ff735ac0c1254f3113b628af2cf7428625626b2b8bd24c96bb0601bba09b8d8d65a6e46108df9c3db45844f809a9012dc2b5e24d60d845100b3912bd3e007521a3106400c45e27fe23b266650e0941b9faeeef5d4789baae05c8983d85bb49903302443627343c7dc1c523b04c407769d7994abaf25361689640441679dd4551644d6aa8c71e37b49f5c6b0a27ae4e7e9f2afb51882dbb8a9d72b946aa9ba4d62ddb4d5f942e308c5201a4805220cded11d87192bcb401d78d869b5c5110a9496bbf12b321bf4983762ddb56ae5c107dc0a5e64ee1399c9b68632b5b34ad8d0941388cfe681713da18ca4c34e14290ec266c25056b745a3000bb08e346f86d13e56a8f6e116756d24db15a56a0128ce61a6fe09d51c81b8039395f2e139375e9fb8a5c9223cd81284bd3c2c83f405c1fb1a29f25933a6d834f447b9ccfc2f001c5ed7cd2547ec6270511cebf4f0f4dd2e6334ad9a4b012e62fda936469c35c23cf146acca0e0a29a35e3d6e80552768e7922c6b8891c91412cee6113140aceae8d42ad31cca0bae39194d9ebc70431636582983d8d44d77436f122bae1e8a594c60d8e82cb4a57c814e2643f663babe0b82bd2d7ad40efe80c524cd34b68e0ab5be4415066ea4bb4b5e4add241a54998c61a14920b0e86a01fe7743605a85a1802fbfd7151582c891a044959ae95fe63abe81b542b94fc06c8d5398376da5637d574579b918f176daaa70b8830fa52df319f93da2a5899dfa64753e007f58540eef6e64262ada6a9943f3055b8cfe553403bbadfe9dbb4062dbf78f0b0deb3de1f2bfe39d203aa453662937b0c63b1deab8c6f7246f6f280ba458c5fbd94aa65b6a1850c8a5b01441899027f986f119a2b262c9ff91a7199b68da8d866e2d69b34392bde66999fb482ad87d68dd9edfcf9d7af6a6dd85936f06154e2a117a417c4f551df1051e725bdfcca7c0ae13d97c3710d8b304cc2d026eb09b8956a26d5bf0bbd80ccc5cac67b04a0f14509a60315fff93ef67bb989805f26656ae0580fbd199b5e21e2a7b9faa071111db65a6132ef7a57515f1588b8aa3b4ab10f3cc1cf0a8836491288dce0969a5b0d662c59316ed9e470f72e7338e30361d24528ea04f46577a6194ace8aae806e811dd1043317567594a677ffa107886221c55c393f814d9bdd726bfc4e647416bee27f8f8cad5f2873c135798215ceda050a501a176d612497e9491533283defb68356f73408a6a85cbe0abc73138d960b7a5ece8d9e3e6ca6501d332a36ad504a130bd0d3fa80579c22efe3beb8d2572886d03c7748ba851248819631924d7ef080f966c83ea04bd53a17f1154ccc76daf4b3b8790f9e573f198534c6c7f318e6e18076eafc07b97819190b182512f0d6d2411906da628717dcb82d8af0384fc96c9631a10670043453ff5d9a484282988668dc68989285d944f7f44cb5c4ac0ff587f371cb358aa0352a7b333c9b6110ac796805b30ec8d159e9f4837970b62cb4a91c89d976406275936d5f559f30df154ec97c45ecba23f6167625c4a9eb2168721649d135821281c56678f4589a3fdafe3ebbfde9764905a8db133cd0e90ec80fcc0aefeaaea4df9f9353200907b43a2260e79f161d4da6ac9990a33aa7018371e203b694e27871cf6c7c94a5199f3a5089420b70e539870d867d078619917477931df99a4806ee5b3c5552d1a76998d4222129f64479a21aed8d5d3aa78950c8320ca8e87f06bf6a579740b22b252ce1c752bfd6945d3719d7b08c24fa96dec2f9d1431470063e3624c1b2b8a2546d30da9d9baee61ce400781b414625ed0806aa8c01d834817df0144e40d274abab57246933615079a66a87e722d11afc281a545fa6afa1e6351a4436f0f7afac19883fea6e775679cd386c7b4e053d80585417f099d171921892fa473a97a7fe89ad44af9867de489257201bb4f3863b26be010fbee679f140b938fe6624ebe8a439cd8377cd87f7cf501886f51ddd7770d0f571990350ec4ed58e573116cade8713b9f48512e9a46ecaac750afc562520f4ee7d2f2b12971ba4e79e19cd994b9c94e3bbd7475537e4a707b8ad701288e40e8e2fe244cacdc1e983a63fbcf09cd225fa047ed93b91d264e5200dae113ada435c46bbab19cd081fc82bfabc79e88ea3d0afcad68d25d5c07bde110462b45a88710acf4dbc68719643ef8a5b68189e0bb428d985a283b123c2b98a418c6cc7b788d78fbf582eaa9ec73b7cb71b3c6110bbe32d4b51ecd1e5ecf4b0e90e573669ce030c951064db8f5f0bc57fe52a16fe542afcbb655d28463b1637780e481f131a05c1369644c42c01ebdee62a6c5fd9bc4dbbe279e6310af5540bb42cb4e605552d7c2359fe15d9976b70e28e20378ee2deb13dfd691d9c5c04b65215dec6c95b8af3b222cc5fcd30c32f19bb774a9e8f259e8445203bc04a6b22267abc49e6c2147aca940641ae3cee17472af8d55c89ab2c1f5d09fbf099425db7da91bab6b36fb255424fcd3af9132a2ef63de38347d3a133f4dcf9e87a2ec9e375c8eef58146380df1b15b19c41472aa303bba4f38588d91bde02f64468fa0cd93b1c8b441be5142ec38f597871911e62c2f8f04b50af94a52ece023393843a08ff4023a285833f9426408c408f57b9e07f6d70cb6f519c38f88f04b81e8a683a157ad410619f0600cfd3fa34b674b509daf90a6ec7247dcba9112d107d27f9f56f8d81beb2d64af188688613c8cdcf7d7d2596d10a0888fac4313f51537225fe9b7de632c63b364ef60c6b050fa2f6c6542da042a19ca43199bb0188f35fcf21a0466063cbd3f61abbe929452407b50c58029ede2ca83d76e53770f00a3a994ac682ce8218b3100aea51eb2173286486f538911596ffb7d398b6b7ef8025a8f3ae563e88bd4bfc52d59bcbbdd0c8c2acb3441de658ad74e7d2679e2dd004f720e04e803f9032b6abd9779c9c78864d85ecba7b0623b9f1bb7363c74e46b1a5dc19446dfc9e09b2419d049e02474881456f058bad6448de9ada0e3c0213ed7b4c96bd4577870e04a3d24dd246a2ce1f65ae85d51b2759f4c22fb0a2b3d3fc37922cd400b07c83c95210d47b6c145d974e3779bf771fdf8c6d31352951f1d84c90c0f3b512b3b54793a90821164888a12956e5203b9f6a20dd0452b586964372f0ae98947945ae676891e1840a019d491b55499c23f1d8f4bae785a8f4402eb9c4580ed07cb621a10748932715380a7d70be489427056fb383a3414f93860ac105c3ca061e5c50e58a275a88843ac37326dc7451e6382ee40442630026a41abd7158e4dc83b6dce8897b54898432f7490d85d2612fb38beae0b40d2150599aef62e12dc242c8d4bc96f3e13f72d69a3249961f9207057c2284fc2a4d18d56629269053460d1845bae0860647223458db1ce2efa17f906d3abbb775c176c704ec87be574158611d6b53e8a6cac299855574cf86ce924f514064ada87021b3eb8c36fadc7596872c84b03c466bc0e5e98890cea6108c9451345b1d7fc94d4444dea327f2665fc51b913a466d0d758e59221128227c5e9525c2e88c4edb5be356db90af07cc751ebc0727095a1b774950a4f0644d034e6c1c04436443d5d3fc1932b94723af5d83ccc46e36a0445591114fc0525192022362842418888c52314fd0066f40671de615a5d8c73083205f04ca89992168438032d68c70d3962254c169411d3ca8065513b7ec559816124cc08940255bb202774f8d6945de43da4040c99506d8f12a504ecc0c411b0294b166849bb614a10a4e0beae0414513428b4e9b4f8ad303e24252fb5a0357267678df41cfef083c9cee6aa7f794291b206ac74c43714a4ed8bf4bde035dcba8f5bedc45d6230c338d1e7825d09df82ff0d1a173e1646a766eed20b09eb29beecb90896088f40d2e68a4daddf11b2a7ac6b83ef08a967eb1f9a8098aaf9e34403b0702e21e03f5cd00e249b3be882dcb16a6ab7085ca58d10b967a93ddea15981e0d77854bd2b57a591b4b6d5644d159c33e45c32c80bb8944a5d99235a9db5742b65bbdf30cf08bbccf2694266ff5189843ed29073c6a4a6563ce062bb2163b761c74de099d893feb55ea1cc7dc94e3fd61d258110b3ea75a955e8cbc6ea8b8e585ed51b4ce28867b396172a314495fbce3d150b6f42326f61984847f0209dd679b186ca9b2d21d0cfb53b8aca38e98f9d6aac971a154b69a523c3894cdd660c9cea53b25113853e9afc01e0f640f11a2d878ea4824e8027b58b6a97275c9e84e67973e452fb4db146d510019f65c55175ac4a472fac68114d1f601d3ec57f2caa8f1ace91be180d4f04c290cc385773f6d4be3e8d5a296139525ae0a61a0b1a4f8d63e24f2547a20273dd6ede1334c5c679cb93640dcccdfb6d49666f456fc531fd275191d4d7293c5cc0b78389bc652a3a9be69a37340f8af8fde846e27fff93c4ef779489efadd539f62c22107c2c95bda799577e60e7d4c6fadfa9a1a6d8ea82c1302d351f1ffd9ebb6d31051fb8b9d1a38b26e0f36606cdd0928de1a07be2f39217e3be1a9c6c4a9ddd52f279d351387a8b07ec8b225112a4f90593ece967434bb548b8549b5134f6c714f046c4d44c544fdd7b526f9f28a3ebc44eed8fecb8e72d837c96e19043652e4cfd2716f6ae1bfa3ac1faa64a0e58c3e18bd047e8db115853e03dd9800a51daec1785b2cc9854ad93a7b8a957c89e88d6e08eb3f37be7c69e0be95d57ae63e71ad268c3a9b64f3d05e1df127a9d87f28109f418bee1ce5ecd85b1b80f41b84cc5eabf72252c204abcf5769ddc02b38711549ca4aab8f66f138cbeb84ff6a17688fe7bc28a3b9f26b1992603473efdcff9bbdd033a9672be17477e6eaa9ad718168708ebbee07fcce7dec41a95179759e4085664d7c55648f170e3fa68206b3e29191f6568c6b2f254e27139bfa05fbd9d2521183b1cf5382aac90b804bcda66c859f08fa4d03dc812148a8e2d3d7f6764258c084f7370af449d7b4f08416272337930efaa5b370f8a73aa91ae08b6c4ffc55c8e6839cb10b2a30af006f419b63e84724d82f852e75b68528499d83d1f70d752cab39cd43fee7c6729606649b93154eb1a7800b7b68cae88df6bbd0ed78481e5d9dc83791b64ba6ea6aade3a18602893584895dce60219a7b7d59bf3b5b3e1e3f060cd9f4a5ce61d112c6cb34d941d14269109e3a109a3c9a0df8725b047516067583c8e2ef8b6a2b8333976c0ec464f6659f82b1a45c010d006f680d569aba4bb5351f226a2bd00770e6be873ef740c34425d3a11131b3d129dc03e87ffa2f349a9459257d8d88340eb5e13a7e3c67fc0f5dc3631379d6e34c8496961a1eb4553e8b16fe954911ee99886df92021c98d2ecb53192544e137b09aee105a2d6e73f176722c11b992f30310b54ea095a3c0566202242884c132cfb21e9fd109176f28e1e0f80da4dddfc379f67744b7e7db668da935a3e11d549f32ce59dc2044edd9e7a210aecf361745aad022ade82c2e7d4fbd7bec7f0ae305dc0570453f6f48377d80a0402285c6ac04cb5bc0e480507537a1e48d9414caa2aa868f07d4ab1ba3abd5a05b68b9bec8e6c68d61cfc629cc0cd434a3ee26d1f67c75875281a242d695018fc97552d8427886078453aa1c83031e56faa950dde72b90a80be1f013a9fbc2040339643e8c172144d283986d4e00dad193828bac03fb8d7dbef30e8ceb1e5feb3e9ce4265fbfceacac82762e47535f7d9c474822944c3a76ff20091070a8a72c8a1fc3c3c90d0f4907792ff4db917d97b879ff588780f9b1c828a1527d280b00a56d0ff8e7c0a124c3fb43d4e10410bb5872b9eb2a400f8c9772665758769cf6104d554194e9c529f987c186932c91b8be71653393b28c9addcff07c6823c1a79bf4fa5069bbb825b551a7481a519dc08f775b6499d313e611b2c6aa50784bdebfc8f8a8cc963ed1f95dc176dd6196e3bba1b1758827b45aab54c6b2c79da8e17e3227cb39959a6158bdbe3121ccb1aaab0e8edc180b822d36b08a3401e0078cc8584feed3828a964d29f96718274eabb45330cee0db69d40a07701e32ddd80376c3ded12855e45be18e802e91830108efd3f01c38b0b56921565199295767705d42bca5303355ba2613ef90d9af5a355741276ae2e8bcf7b9d9fdd168dc671929b67f7f2bac860e3d5ed9fde2a099efba38e14abc5a726faf95235df0a88967ec046a48a354646299aac35ef6d1178551477aebeaf6ef3581b84ce0991e5a5c1336ba335d16509ee69a2f9b56ae5a3d281e647a523ec765d85c2d181454fac04ec4307879c311a9789c388e2394c7ead3232370c4274bdf428908ba74cc44683410ddc03a810e19311139010502c38aa4774c25d1949f72bc9b025c587798471d3e0bbe02289500f3d8bcd32e0c49ba144fc1e95cd80687315429f6763134dacdd9703e854bb8095922646e1f71f9fbae5d4367ed6f568c33577ddf940684037b1b2906e3723d47570861137040f1d04918c8cd27979a6f137be751e2dac832f12bbaeb0cd517146161156de94a02109d320e98547a5879cd680bd601194164a70c3d3497636e1a64bde93ed77b69d7795bcd74cba4990e0bff52ba2ad024311665b167f28d55b03d3b5619e8bbb602ac98b2028d042b57ae03d320b5296c4894e02cb7e0803597e0fd0e3ea695a262b5a50b0380c91e028370b0a52193221dc208b2e437ca44f656a061cc4230a3ee30b06fdef7c196f6ef2fde181560f67fe7fa8fb5abfa8c65e61c1da653d8d3e556051c0d1e88014787bae2fe84b31beee5cca5330c763051a812638079e6968e8d27bb75f09424288754ac2a34398d8f0b51afe63b0601707a12c93e8ca5caf2d5736a6c72da9b30b2199c78b3a4d905c3c147a66a9c6923643352e48095a4de44c1395082d94bce34692b90f6d0b11a678258aa1f2a7c0003fc7bdce3803a1b0231c004b798adc0441f525545a54390a73a80c9988a1909afcb75e128f177488a315c89b55d31fc618653713a8835c63b654f7f896eae5e2e850696241697f72209c842fdb0505282a055ee2bd11b3296bf2d41df5b11aedc561c70d5173454a562c933e5d0feafa2bd8a6ce143c76c827b0ccc23f8e69c76a1b855a5218db20ecca9f959c3a1ef69e0636748c5ad0254d7e53aeddd094220d8ca956864338bab1ef81fcc521065b694b144ab01fe6e6534f03fd4db673406564a716951668ed311164095d0a38407555c5917585c5fc2f1c37bd7d0525084ba6e01d30403f2b3e3b81b2a4393da533e26ab86cdafebaede2e283254ef62cdf72ddebf591e6b9a16c364849df15c291c6ddac7d2d71bdefb0b28d6948d9d0f7bde7dcba6bf6947067fa8458327e50754466f53ed3ea831dfebd204494f2f05baac503cff35db6eea5795afeb52fa7443aa061db03dbd67cd25952652e7a977a633f1b7b4f96b849e9e92be587af424dd112943ac345cfbb190a1385a0638dffe2b8238a2b315f093c57b16c3e1df5b23b568c5a3ff83a4aa921729194c937524bcd7d8316a734bb0ca9cce048ec97cddfdf73010ac5dbf2dcc3cde4e5a44c00fed68a0b1c92466925a95064ef184b9510e763c9c17032c04405e2d08a2f6ff0632033f51de89356487113d62b22728ecccac5f9150430f2d7a859e179cb25a48d9b59a6e9c877953b4ba1ca8d5731ae2a8bdec2ca1045005db0d861222f650b23b56b79407f0b153ba5badc450311ae95889dddd66f7558a3ac704a4881c69eb178ae28cb993922eb2e682c7ffb3a2b4cc66371d7aada8a8a9f251310a2b24e111e45b2aff10d3a018392ba12763ee5b43fa4fdf404043bd9cb7a6c3fcbc9eb741260731459211056dae7ae30020c99ca113296f0ca755ab1e522126eff9f6a15f6306677c28f152275ce3634c585c178c2be9d831ba5dd575bec8eedaea11031354fbee6b14e1d7620bab96fbcc9d44bc02ea38689e2263ab6aca389ff8fb980dc68e03001851bfdb734530215168cf1ff2427a897ea685531b2b695a01d70178648235a1e8437b2cce5bd05ccfdd6b7e060df443387be13f40a191d86c1759374e8640f89e25f99dade991e78c545066773632bb2dfe1416c65032e1fbf85b56f3084099f9382d01a2a60c55481f6ad83ca6fa33ab7e43a0e955d772c165575d53ed4084a1cc206aca865d2addf704d447e9041aad0c951f40ec1c32661ca03a748df9c6a881d7f759941258bf6c5e901282fb71e7f81f4bbc2a1ceceb50f20484c28a862f73f3a39b6eebcc702e58c75cf0d89e8263f4936b0ce9c9db2c249f30afee063e59f24746c96b177d18de0ed95e3e311d804dba6440941f6e42de0ad07c9610cd5c8ca8d38721d1d407a135aedfe54510687200eb3102e80a3daf15898456fdfec87e9748a562a6d8189da876850eba40fe38d9b3fc9959a5cad5bdf595e3a15c6e05f9522e340a48f6974631c1670f4e3195e4e51be9fef06ab9f1fbb0b2228981a62c40df766bb7fad42e611cee1a4b528b598f838c93cb16fd4f139bec684528ea6011b87d4307b6751f9dd87672e63f840698e9b11613af2d14df26543e4ea46cb5b6b875c46e63ba3772f4c5dad1ffb6b4a2b99d2babaf8eb90ad04b7f0ae8b0082edba2c82a90d4a995b74eb3b98c49de2136ec846df9be4616598a0780baf5db94846da9465fdebb4110b7865a2ebbfc072bcf5e18daaf0f23c58a7ad9782db491b66ad5f19fcb8eef1be7c1fcb66ab287ba09f550bf96158fd4d7a27d045016c72c83391a4e8580ae992ca5ea48a1ac428db125addcd2bb3d874a9521737825707244e871cd35c0d853c767551adb77c35221dfe9f3ed1927982e4e5c2fd2b7bf0b907badc8c3131289621541e763a686b9c6908f4b847b549a63cc816a147859c4c56e66b40a1454d9480c0680d919335432aea336ca12931c5b1a91f5e5f181d5738772a19f5d25de7ee57241f8a860b977b3c4c16d0931bdd2cb444f1e673671825301d2dcc8f5eb134733d01513706f64d1c03d167b39c7965b9140843d77463e85a18162936928158ff418e5f81b47219c2b86d2d85d4557226e0b065896c5e977d2bdc9d5562c8168da1b6d0a0dad050dacd2920b245dcfac0f70314f2260a4ab1c3f3d0819e34a3f10ad4f2eb40f4a9f75cf26499fc1d128f176b10cec0fdfe7f85dac8f5b30443a73fcd30576710e6e8eff87b1740eddcf3cc73ff397e0b7b17e1c9073fc3eee5db0bef6dd239d19c7c4d58ff2fe0ab3a4caeabf892472fccac974b41cb4b86223e4b07edef48f9557845ae25260632f20c917ce2ec4e9064e97a46c9dcef714dbbfaded1e598cf74abdc416ca296736de8727e1938378150bb41064c74f9db9b29d2bd42e53fbffd43d5177e08a47cbf15362078f25d28acf79e8e81c7f2d25fd705541ae617cd78876fd01349466f2be5c81c6dcb7e6feb3b8b2e90a488eff24aaedeed65b72fc2416aa1dc3b81e0bcd2b77046275c353696245f30fff29aa7f6d77a5d3e95dc6e8f8b9332891f0c8af3add80b73c7e0463ff2c8adb3eb37e4f3b40fb804966999077fc6eb184c74fe6d79e46ba5fe782d59e4686c71bed97e17a554bd6ce23535709eb44a045bc6188eb44da6536ce3ee2f1d7fe50ab5db8ba278c52c101547204eae61bcd55205cd1541dc9786123ad3ce48633094e609a917e40011acf1dae195374471a4f68f9f8cce99b0a3d008122100088c0cb34b0f5bbe8284284b35ca978e6f8e8702e628c8e9eecdc8099e1d836d3b025db5d42a49432bb0c310da30c6ebb42dfe046c185029715d657fd375929eacd153be3c542094600450f8c4087d60c95e586a200d2832796b8821a5ab815bada1b4cacc189293031822cb470eb51166a922e8109119440880b5ab8857aad5692242841c80e8a4043410bb7481c6f13376186ab03374c21042888a10a206833d2b609ae8bfa0de781909ece8fefe74121d1a8f440fe837c2d126d8f22a65312798b9638f29a5a7e9e44dea2f52465097f54abe132539091824c14708bfe2438fa4b4a192ff052c60a992ec87c41060c326190a1824c1564ac207305192cc88841660c3257c89041a60c326690d1824c1664b62053850c17708b7e1976b334bf438e9bc076fd27696236c60459f7afd9849c0ef9a4d9d80212e4a5e5f90f28241aa17e5c37a92462124f3ad8cd6aa119358e3c9020a416c9030942b6f80309f2b5caffd7af23b6594082b0b44a788e35a45a39d4805bf40309f2ad1c58e016fd395c3d43bf7e5ee6b0036ed15f9639b4c02dfabfcc5107dca29fa4cc7107dca27fa4ccb1056ed18f2a6342805bf49fca1c6cc02dfa4d658e36e016fd22650e37e016fda532c71b708b7e5299230bdca27f54c68800b7e817953149e016fda13206086ed10f2a6366708bfe4f191304b7e8f7943123c02dfa3b658e38e01638e016fd9c32871c70cb1c708b7e4d99830eb845ff5862dce2bd5862dc027e9fa320b12c8a9e3f874beaf8103c64081ee2622a16f0e3d37ac60e223631476a5d678cb1ecad75ec769cf11641d72fa26e95eb43c997484e45d82c0c915b22ea668d8cb022aa882aa28eb022aecd42b59bf530524abeba46bf8f244968d7bf95a50b1c1b8776516620c762eb886c64b659271beafee5fda947dccdeabacf9f3ac3b0f867a7f76babf44bc770d062b48ef61f7e6e571e428fb49bb5c1a42cd321165a6716e2278b76e9ecca330c7cae659d634490ba964331bd5fdea7f3da6cd79861784682326da36b638e8998f6a05cd3b32cc3b5100bf7f16975b44bd3c63cfbb26be4a451e4a388e2665decf3e7b8d5f64c0c899b16e250fce4665d0cb6d5f6acc33759678b2fee05ea60dba671322ddb70922b06e2609b8dab91b68c8b916c1917eb5cdb6bdb5c3b06db665c6d93eddaee5e5c69ab89703351d7d9c43d23699908271375b0ce161369a46d7a895e9b4cac9176ccc4c1505c6d9b899b8b744a652611103fc1b898889f54d7c9896db4d3cbc7a7557a7db5da09e45c2512cd737128e0f722bdbaee64a43fbf9887f2601e87f454cfe93ed9e7cd3a1af762ddec8b791ecc9379af4ef6c1be9947fb689e8b035ddf0b7c7d5d0dc6b95e219f11413e037e12e16fbe070872d46babf4c767be24f6165bb436bcc7f7e07f1c856e959ef13e89f067febd99ee9308798f991375697dbc87c77b74df01d244a128fd28d86679af1fa56e56c751afcd425d50e86675249bdae7ea38325016d6ba7681b390d6f5f35324d23e634733c2c01a698c89605dbfcba471c9ba1e5fa6d015d248f8a9718db2f115ba421a38d6c69838ba4470a46968234c53135de08636ce361b5758e3c840d956a15aac52e2c8449b1a68e30a6b1b5026ce441b1a48d31137339136c2401a5a477c6d409a38d6c631f6195d220cac89a5c7ad50758131d9e771eb5b5f9e2c0c925b26d85669170906be6a5d8d737d2f11d045f35c1ced83d13edfcc7b75b2584de6c1ba59887f3291cfe5cd3c2fd6714f450a89b1cf9f9b5917be38319228d3c8481b1909c68189b3d82616e3bc449a0616ca382e51b379cdbafe98a8d9bcc2191813691ad80616ca382e71a6896d62618cf312651ad926847160624c33dbccc21727d6d148af50ec33f3669d082c04fbc83c59271389995e9f9837eb62a0373530d19b1b58e94d8ecbfb50f698467adceaf013e5519756e74db1660a3d6e81c837352feee3d3fa3c6e89b8b92971138cf10e3f55efe3d3127560a48c432b7fe3717960a559d7ef89f12f75621dd908f9cf7175fd1ed9ace447683512e5e4998d3a344fc765f22449c25052afeaa47caa83f22964ece4513c2fce4cc5cf4e8a9f9d570a3f49147e7a4e3867767a66678776765c27f9e224ec249f9f1e5987a471b246ce38354facc37947d68191328ec7c53db0add2e10ce571953a301029eb70681b0f4cd491953a31d0acc3a96d3c31d14ca406a27548d7c623ebd0bee37a12468e6f7a6622143fb523591329f1d34c44b59d9789fbf8b440fcc486a836d6e12719c85d1c45dbf0d3074813156347d891d966e1d69346d8ae1fb56ed619337d3330069b7d5fd2afae695d6f64b1ef477e7a68a0d92706633f57d720d8f720a8f6cd64e397f8e9a9815e20da47168aa1649b257a1028161a3fa199e8037b75fda23f4dfcfcc040b2d0a716a27d5ea058c8f5a185661f170806aaedf3330b6d68ae192c267a6ae0eba38da05a4716ce40d7071b1fb73e6f82629dc7add09b2197e8718bf4666806fe87f63d7e8d8f5b1e3f519716e8dffcc03ae2e3d6c703ff443dead2f2448f5ba131e4a737432f909f5c1217f9e9dd2afd793344ebf809e2e7acd5e3fbf30ead7f1f9f56f822f8e1e8e53d38a275ef91629cef4432514c7c1f9fd6d963c3519dff6cbe33aa8dbf21c9c41f61e48b239868f6117d29f422d20cf4a1d7e741229ae73fae51ac647a94c89b4a2f22aa91be34928d9e44a2bd50fc041244d33a9fd841f2ef1a7992d10cf5237fc2bafef3891da747fd59ebfa5197d6f373e422e1e768849f24183f43354ee2a7c825c24f51adc4cf918cc44fd2889344fc2481f829faf093e4e1a3d856e90d3f4932118c9f23928b427e8e407e8e68fc24c5f629927151acf5f1d3a7b67953247bd162b3f0cd116c5493c168b1ef4dd2ec05be29aa896f8e642fef4d12ad7b53e4da2da083164df0e00653b4700bdc70d43b72053141155bbc5b68a1855b62c851b5d1acc5093010c3164186b4706be43e3ead8fa35c5826c21c5880c26105ae166ef9f8b43c8ea2ed9a76a2095f20430c50f084166e751c15aaf5d6ebb4d2bafed3ba5967969dd8cd3ab59bf5daacd3c7a785bab4bc74e43d446e72ed50051126f21e2137d54235e43d406e7a5be0eb3fc536eb445d5a20eff1f193cbe33d3a7ef2618b5a4bbf07c8dc4d6ed7db16489047e48e4221416ee511db234172c0eb4764573fc2fcd139ae81cf8f7b0748d304eb1a04647ed3041ba999fcd8f604a21045ac92b7c6e456e5ee4dbd61eedbaa2f6fbe33c63ab54924927c925c6626446c9275d69bc56115b7b1e818632b3418cb78d131e8dbacee756c561120f78af83c9087dce6a3225505962a5ec2d0b1ec0e7907198a5c842c45d759dd82cc6f6695c32a4ea381be33d7b96d67bcb95cdbf6c89975fce2e76529dc2024c5ff7d642807d20447f04bbdcc6100a618263f090a7207dd06fd37aecdf2a8c02afc5540bd2abc306c0c805b9be8b118e64b3531bec76a8008c1cfebb86d6b73e3ea998d82fc9e81ec518159b80576d363abf0c220be1dbfd7b11473607bb876fc5dc752cc618a4e87127473e39a431144b563cde3cc827058f360d1d531165f1d8ba908db29988e4459ab4e7413d4cd11bfa81c615b857f542241668003a409a61c204dad6a5a183f7d7c5a225f7ad4a55552c1d866911e3fb896f829527ad2a32e2d123f4b9ce37c8a41716bb52349afa16dd6396a35efe3d37a3d35d28b1e756989fef3f835ee6689f849e24082685a4fec10fde85197d6889f228ebab4341f7ad063b0b655a032dd2a0fc6dfc14fe2e7e0dfe0bdc194440ae33082e9c6d5316b062cba09a6b36e7a6c8e9164114c5be3041424f762c72c1d6c907f406e1db3749881a624df407e37c7946f5c9bd7e6b54965f845367363433880e04b9a633aa69ec79bd82c90ab1085be71e9153637ae0e044b510524b034e844c7ddb81f7c5d7ee06f5d7edfc8bbefec37c50e580072ac535b0fa604703ffec87b98c4cfad33b7c6e71eb73a108b343c49a77007aee1053631feae82fc8dddac8d7fb7a4b9716d167f3398d5a1f83721c02bdca56023a4e3ef4c80591bd75661fc611624484aa563ba556f8a63ba59200cb00abf0d603b503b86a2e331dd2cdc82a9313005e7d0bda97bdc1a432074e5c6b5b5407e07d3cde2f26700dc62d92a1cdbaacdabe3dfb22037af8d6b6fc097ac6ed6f6a4499a7cdfe7acb3ce5fe900130f83e956e10fdfc0031288608afebd87f37eaf4c3b0e2ea155b88535d863bdd663374bab58ab608a55b009a61dffa86ed64ec774b3b44a1ad38eb156399c1f9d0ffd63db5229103b2e90a0884d4c116cc66ddb83493b10e4c0306c63b6efba0e0cbbb0db84edd6b7b209f177b969bb9e6d957e8ee3c6aec49ee7755d97bfeff338cedbbbdd51d81eb73d6f97a17b227f2590273a1104418fe3bcbddb1d85ed717bf75d3621fe57a2df12796885566d1ec87d188a1c277e22d77d187ea88909cb80416ee79c33ce39e39cb9dfbb0aa4e9d9b05d6f0f0f5b2a90e6860d5bb663f72c1cbf12b73aaf3402b95fd451903bec34c8fd799b26860b6bdbf3bcae043bb7edaefc3ad7955ee7caad33de44306e1b69011bc235846b48052e5e55995a53a58bf40169d7ef00b6eb6f800bb7eb67408aedfa1780aa521e58176e8a2d5df050bb7e05ac5d7f02daae1f016dd7bf43f576fd30a54ae56175d196a956a5a3541d40c5f2901a20edfa654a176b015caca977abdaad4aa95ad500543c088007d5851025dbf5d72853a852e5a6dcae1f002ab7eb97a96d968cbb5928d4c776fd271fdaa1a85fbb66bb57f5756a8a9f9f0bb2eb87762e10aecdf2da9315543f35b5b26fa7cabc9b95f25216d5b7a6d0ee7bf154efed3e30f554eff5d28efd56cf0551aff5d06e05d5950f35f9dc12c87a6bc81d75265f5b0257111b7a475dc95702d5d64347df0a8a3cd74b57ba16e5634b601a04ca0ba14ec6b10d51b7eb3f19d930fd5e545443b515d7357c415764f5b7a298866fc88a621a826fc882aec88a68b8866da882adb8aee13bb261fabda8a88e631ba2ee976e5518aa208108de0007774555b655c2064320811c54b0450bbf6cbab22e162f1658e16dd1565ddb8e11ce20023780410745485dd9123d20420ca450436bf3da70d52109246c210b6a687dd82051c0a10938a02d8feb05281001c80ab870849607f54108aa08e0100234b436ea8ab6a90b944dd9b75557d5755715cb43ea42d5a6deec83204cc858f0ce80e44d5f760d43145c084208604003544ddd56ad431ace40862c52da8a82be6c3a230860b8020950cc4065d12007214c41072c9a68b54e30c2128460850bc06084168602142e2ebc6aa00558cb648d031a6490451d9a68a2558206b9228b9911a488b5d614d14dc73644bf545453e8c886e9f7aeefc9b8822822ab125117611baea08bc27d7c5a299cf5a84b6be54db155711f9f560ab7462e6f8a29f7f1699d703334e1e7a32ead1a8f5ba17005a6445a47e9db7a94a72da548ec483511fdf02590ab7221b52ceb4a9ae3552de87561addcae7fc48ad49877f9b8219405437a698cda17d12af3accf1b4a61f8493a47ed295acfcfcb43e94972cf112b523f6e0c0f91dad12a4a3f6d0e0e7ad99108f5bc3f70904b5a4769e8f5a42d0e6a4b780d7ece781f9f568a26eda0215245bd6cd7291a952c494beaeaa228aeeaa2e5633cdbf593edeb627c39698c199a5606c9bafc1903e5cce0a7a63d49f6e4b8a706e5a02dfcd4b027d972c697936a56d225d1d1e5a81a957cc994b36ad20e4aaa2f877d4de22b92823ae84765571115a47ede9444452ac8fdace59b64fb9a9cd41c5ffea686457195a61595276f922cc72d126e72dcc7ad116e725014cbfbf8b4442357c47ed4188fe2b4a3d16b12b5a5d0ea428252921312ca452156c68f7452907a424a456f7bd25141ab8aa4ae8c50176ed7ab57ad5d3fdb353f49ea3942436e6705b1a454f486da8e0a22a12237c4763868f4b62172e5a0911b52393138086d69a5bc8f4feb067ac3f5f490aee88d1bef8d109b8a94a71beaa9edba15a9d1da506fac6bd74f52c3b5b1be5d7f0f28dbf59bd4786da4f0d3c68bf6c0d660e136d81bab8d1ed61a2bdcc67ae3466ba3add1da506fdc786fb035581be90df486db438dd5860625e1b4a6912b625554243591ebe815b5a135c49ed44e8aa244aee80db5a0b5a3a622ea566995eb806d95464774a45ba55daee3b5559ad5817656932715594ba927f4a2da932be2794bac4745a1a77404f4965a4f8b5a4f237644a49284d08f3b7a93e48e48d23b22f2b825228d5a92d08b564f28e532b5add29fb7ebff408c1af367f9f994da936a625177f679ee767d4a4deba9948ab4ed49359550972dbd27d4a47e4aaa083b7acecf927b4ad7522a22828e98de93291dad5dffda75299296b8a6b2c476fd22a9c935a12556441531bda6d22ab2964ea8492da9222468a90d9d5410fb7145ed282db9a053fa5945ea890da9a5f7734245a6f7644a4d6f8aaca5550425e13adeadd21e53243de9a8954c933ba2c315e1a609d5413389a8ad96f7f16981847801fc009e003fc4e94f1d0fc407f100f80070fee70fdffa1c1ff3321e943f63bccbcbf819bff2b07ccbcab3fcb9f2a78b3f59fff2341ee66b3cead26ae1270b3f57f8e9829f2edef32bcff22dafe2678a9f29fc44e127caa33ee553affa137e9af0b3849f9c9ffc415ff2267ff2253f49f839c2cf133f4f1ffa9127f9f24dfc14e167899f237e8e5ef4a51779938eb6c46216edfa8720403900b7eb1780dbf50b21f28ebce5085ba2dcf2e496220168bb7e00bc5d7f104098da91b644bde5e92d47d4d2248376fd31658e1f5aeb088a42cb5339b26e554b796a6bb45d3f4b49a2c2a8232eaa2d51ea0b4b45adca137b6249d232edfa51258a2d475c4ab6eb8f51be36eb447d7c5aa877bb3e69550ffb76ad9aca971da5a2b6eb77bb0ef1b3744f5a93675fd8667174f598a0a87779fb267e96ef096b927ecbddad4a372bedfa447d43ff725644edfa242d71454a94affc242d714b94f3f4442d799ff393d5047dde6143f75b92893abe28376cbf7c49ec98a24c504ffb2e093d594fd492f7c359d28f3cedbcc9c393f4cd12bef293bf8f4f8b05d5c0585fb42894b7a485c17a5eb827a8c97358d21416f48ad61604a365614f27d66d4b2a288c37e56571d1119436e5fc4c617157509456254561535c96560585f1e24559535a182d0b0cd63d4159d214960585b1be6851de9276ab74899644ded0fb1961372817757241a636a47eda0dea059d56d1fa59372328140a3a8952143b8242a5a592879fa4b7f1e6a90df1b347f8fd1fc69b2423f27b3c0e181c7e863c7073c43d790f52890f3638a9f32fde448dafd2637c0f4bcb8aea4285f57c0f2a7c258591be4851485010efd1f1b4b82bab4adb82f280aeb02a2e0f6ecbdb92aabc3cbc2daaca4a1b037d81b6ac31521b30d015f705dab2c64861a036f88aabf2f2f0b6a82b6d0c7485557179705bde96b4c55d5955da16940794e56d69575ca8dc78c161a82f549255454d415fac246c8aca9a4249da1495457dc1a6d2949505864be2a6d4949505864be2a65492364565515fb0a9f4c54ac2a6a8ac291486fa42255955d41474258591be48515c1214555a43e8874c37e89886d81be98df7063bda6835eaa725d51bad0d77b5b1d6706fac251b2ff7f1e901ed81256db035de12c53dada4231869e7c5488282524eea0886da79a18e242b282535a12395b5f36224614129aa89451d495fb0246dcaea7993651d81e19a3c6e89bc9952495c1117aa88e5f5b4b49c158d0a4bc2032a423d2d9c9555a3d292f0e0f296d4d3f27256588d8a4bc2c3cb5bd492182867a5d53c6e916faabc24278ce7e1718be467ea49de7c81f253f4aa13e54fde6c594bb88f4fcbc3cf94ff9c31520e3f4b5ee40cfdeacd15f7dc3c77f9963761a025ca7b62414730d6ce8b12500a7b62494730d8ce8bf10405a59858d8118cb6f3e24559535c967604860a8ac2824acecae396f866ca6b3a99442a31c54f17242cee08f7f1698df8f9f9120a3f79730535e9c8787e963cead28af1223c486eb1bc8727b1b7689d9e14795325d56c441befe3d302adacd7a869d7cfb909fb2a3ae349a90fae2812e22754847d79500fad0fa79325a4654be34fee8ae2e255d48579941e5e1f5cd85855d217b2b7c6bbf8136d6df0f387f56ca5278ef7f4a106f7a13d7f505b280eb70718ee03fb43da5f1c6d0f2ef761fd017571f4d0be701fd4566f71ac3db0b80f2bbea6a2eac35b7259b5b3a225923f2de135ad2536253141f914ae142cc9905635e1670eb4e57636478be387b7d5d71c2c8ef407b7c57635c78a03fda16dad3dcde1c3fb03db523b9a6306f7c1dd2a2dc385c7f0f169916fd732da18ad38035d79bbfe1696b0860ae3c2a8e38b4b435d812183f5c4703d2d6c4786ebf28a46fef4761d439581ba78918cd5852de131d65246ead2bef81117d4452d91a19eb8b8262eabca97c4605d5219eae9e29e2eeb1983e52e678cf59491bab42ee80beea2c688a1ca4065b8e02eac0c3686dbc2ca705d5e19af8c36463b638527e105c9adb0460ad3d2484f2f2d0db7064a038549475e581aedcb0bc3c2a0242f2b0d16e6855969bce58b4a63857961561aef0b8df5e5856161d0171a6c0d94060a93bed0686ba4302d8df485865b43857161d41797868ad27e5e5cb2860ae3c2a834541a2ef9d2d648615a1a294cdaa1d1beb035501a280cdb81413d34d897f585f3a969dad7855969a1dbe21a8d35e605627d51c9196847468c76e5e5bc1d772383fd16962303f5b8b03262bc315419a9c7a5fdb8a82e688c95436a5c32542ea2ee267cadef92cac09efc9714c56249ab779cd1ae5492a3794135ac75e58633d855ea61bd1d96ba6a3933d6153a62b9e98afdcc5067bcac96859656eb68463ac365b55ba559e86a9d91ce70592e2b5db133d4192feb65a9ab76c6ba425f34fc64ad2b7706bb4a5f5216bb7a67b42b3506fb51a778a568656bca51c97683be14eec872daceba7153295e54e63e667b78479573e2964663e225ac276ff2b8257e521ee5530fc98f3c6e8564c9732c7bff45bef4b8853abde95b4de841a8d18b1eb7c6ffbce739aa4fbde903ea2225d98dfae8e8727c784975d3fe3aa61cb5836ed677479683a7c052ac8f65e93f1ec29a78092fc7053f551c0834c56af899c26362284350929f271c0897c959c263563e855b9e245ce61d79394f3c46669249c13e3f45b84c0db750fc1cf118166f13334155433c468d999d1f2ee302f1daaa36bf4e50c51a5ad0852dda947dd5742fd186281821046e9003fb82ae01364c4c30965d81cff0822595fa522fb62c848ed77a0aa2997bb8bb1c3a7068379016d800d7376e81ee37adb96e81f0b7b7400796dd7f6510e077ddfb3e7fa52900db77bf7dc7cddc4370fb9077a5f9e6f7efebbeefb526662304af0b8ff0b64dab72d7da6510425415902c2c33ae0d63c74d6c60ec18bfe815e699c5dcca171619e0cb0674c7e6d83dfee994f79cfe4e8f796f577026dfa5b67e8ebfa8cb9489fe8f9b78257e5da6746aeb7fbd4aedddf56f16157439ebbdbf9c1f9729fc9f491629ef4dfcdf8bf8c318f30c6e566ee54fe15409d229fc5bb9492cdb0836c7959b8e821c62b6590c833505c0addd6e557e1c3a06e727446c627eac7338834040140422040a327c5143416260abdcd075b9fcb2e8bcceeb3cef7befe37d683ac5f1ef8a4fe70fb74c09007b6cbbc4ad2ceadc8f4a423a4b3749b492129dfb976e92685858a273b3f04d12ad23d1f4caf47533772cebddd3203dd28bc962a67af78f3f4ca275a449ea1e39e2606cabb8efbaf781103a18db2c126d9368a4dc0652e45b09d2fbfc66c7d575df7175d02eb502d2ecb83aa8e7f18e0bab747007ed00293bae37902689f65dd13da8441b48b3c3448d9411dde079a2f7f93edf196a255757e24eba42af464f723baed4dd2b7517b18c5c824ae8543637b47bbf3bd4fbefc5af045f5f20733605f1fde73fdcec0cf9beb203fb3edf19d271e914d76142a7b8ff81f6ae001dd7e7b90795d8d09eea55ee1bda3fbca1ad277e7453101d98c5ffe85823b3c1994e712699ddbd07b3d029ee412cec3690268885aec42016fa5723c1984e71a775abd8409a600c8c8158d0ab20e8d5e83b99c737907bccf72678c56a82433ac73d9eb556740e744d100bcf9b60169dfb6857e8544da7b8ff60d1b9cf80877f5964feb9b96f2589866174e73c17e90c6de8dc1c3ad77185c02cbdfae6de7bc1d605d2ecb8fa97c9ad2491a4370329fdcc8fd6fe8d9bbadf7ee6474be4b71648f23baecd32756feaa09b65eab8a900fb4fbf63ffe9bb3ff1f3898eef1079133fb717e1a6ee2cfde6fb7fb43e5d99d229ee454a96726b03f9a98e0babb87f6115f7dc879b248f4b9186295cc10d404a7ce378abc6359026ae918ff56a247afde227db2cd38eedf76f7e6efc937ded2ebfd95669a1539c5602e8d229cefbaf0541748b4a1015a2535c7e51e97deff77e5a802eb293488f358b447bcc75be2b4155a7b8ff64208c7f32992e7b5dce9d481e674e04217b1d1768902351c704b27b1cdbcb5dd77135906607b659a61dfbdc7e7310b655dcff68718f353bf66ffcec4e006b75d0ade25ec75671af3538b6153c1a639d3b1bf303dd7bdc22d1f4ea47e760ea6691662fde49332c480e7c7dbee3ea388f63acd2fde8b31123de39d3f74fd242afb8efe3fa144cb8c6ce7dc95542b92fbd4a4a705f5a42b3423212167a85a7c001ad734faa6dd6d6ca1eaeed2a7a48c846894eda5942aff016706c52697e4e74ee4725de4c5cfb669ddbdad96661ce731c1e04179cf864df0b6f548b8fed9c869b5f6ce4e6978adcfc609d16e4159dd3ab50c73770c273dd4048c7f5d96ea0841b8cc1eb3a2ebd32493354af4cf0f54af5ca04631d207a85afd077dbcd8e908e127b0bdd3c71dcd32037b2b0e6c1cc0d05a981dc37b2b0e6c1443390f9bfb1fbcdeed96ed7d0bbf7520fe6a99e137a85ddb016be18460bbdf2ced0bbdfacb20dbb89825e7968e8dd7b500ce37975efbbeec53d82dd6fcd0ef0f156751e3791e81d109ffe1d41d23f10b8bd4322e67d579aa2db3fef73b946d037d07dee58130052d72460ffc67b80bf7759c456714fa26d1638035fa0aee141c4e6b155dc63cd103ac5bd1548fd18e030a057dc0a4fe104cc09cd0263a75ee1297a40a271f87d752ecb847433bb9848bb9999f8bcae467b4934d2157a85abe8dc935cbdd2cf3d36495890b2e8dc16ba79e23622366b3ff7318e0c1d64cd6115ac823912be9e7fc4540c8109af8f70c89835c34bc50dda20e2049016c08f7308322bb3443d6e25fab5b6efca1ddad5da1e979cb8479c004ecbecde1444d83b7e04a773bc89edf1163a0bce2e57df4abc6d95de9b0aa2380233cfa1ebdf35bd6243afed9ae7ee9af9e531240359eb62ce190da2e8a1410cb2025fbcac3e25839303570e52f0291310c4a1102da0218bde79ffe40361f2dc939bf5f1ef846c81892f3cc71dbf8956e507820c3ba622074e744ec754e460069d851322640c12c51260d0e9eed5755de7da80bc579c210a41908210b090860165eba0854f04580ab2fdbf87b8210bcdd2e9987d25810a170b4b087a61e8691b38f0fb262f4872641142afcce72183e56508222a60840d1c6f3292df278385c545cb311c7aa5bf0fd3ce8c5680882274cb080cf01862870330ab43a73e1396f123532f3672804843eca840114460daf87d3946c5bf0d2f0c3dfd8225044924e8f47d26f0bdb7a1571b04f7eb30f9d40e0768165603ec050be8ed0d4422c96ef28f6bdd90216a2448a7c4100cc310dccc71881a09f3626213ae6d451a9470b54c3b3e731ff9337f02bf8f9c61d076d8e0f00c6bd2c63b786c8c71bcb0397f9944c2a9a84fe558d2b109d9f1a3b008ae418af06a7bfc1f5c03c479cce91889f1034bb84518a13fa5471012b9068f0f6018066015fde268828418a20806f0c835527945bfe6c51009284813d336a082ae5f93c50ffda0125d3f7782ae7f0b52822292d0ef02c3f8c02afacfbca25f88ce335d7fe8f60a884420913bfc829ccdb1e1f0fec5865e6d924ee1c8f14f22e1f8efeb90c02afd1d89747a1d2416d2f7edc7af468b57e0d020bd0aec17d8fb3e16dd75ddc618735f4aa7746a45227d1f37319873058ae09173ce39b57d262413ed0141676c6aad35c65a47c61b639d75ceefcd72109d4aed54de3be85eefbdb3ee74f7e59d73ce9b06b97fbf7ed9aff7de2c1471d03610b9c72620f87bef6d83a511265de42ae0e6ac35c622e707b2b99e70498f8675ce9988ed350eedd2cd179dd39157f493e05527445e314742b8c610a3aebfb3c93576e4155d83475ec11ac34000abe4d5a835a884aeff9363083a7e20c41036d89163d0f57b8674581ee88c83ae9fb344d7bfd194390538a57f7441d72fcea0ebff3a2e47918b90879899055d7f46015671400b7446f54af7ad2402ab68949bfbbf37b7be7173ff7ece357f740900b189c030dbeb97c07e10ec78a35ee5d9b7c320706890fbcb8e71a7e7bd310cd62fa449f3dccb8e43ffd0390b11b18989a97075fd386791dcaccde3ffd4668d4ffa375f64436c96cadb7813b73030765f3c129be5f9ecc21d204ddc04772634f2a11951e8453f73129d664a3d4e25548fd2c89f786924e2aa108ae5cd2a8a2da1f9f46749e3d7e5443dd16b766760bd66376f54875673d6ef8b4e338b8476531acd4568527eb3ca43b39c2df35ba29eda2f442adb12f49457ec86f06b922a714f696643b935c9e8cbeb57ab211efa6186a33c7f53af2629df632675f2ad4f7d7f5c966f66b7c42485f798212939e13d4848f8ccff3f8e19129237732af3bcc7cce993087dccf7389df80ce9e55197568e27bd0f3323236fe299d327817a941a9bb5e483aa5dff48d3614f546cd7291fcfaae34f346fa7ddb41f95bdf12e50b7eb181b77c667f5b43d7c8cb4eb7fbb666d603e2c8d3fddae837896daf5a35d6fdef3c37adc8d1a04f7a09bcfea6937690fbcf36eda8fea61376867c37ed2f5e59d76f3515d2078873d65788f19d127118ae13d44223e33e6e0a78f4f4bf40af8043c8f5fc033e0c7efe107de6366f449845abc478acf84e1e8477ca6137291fad3005f803fc0ef7804c860f953002f840c192f2f2f2f62f153c68758efc24f961fb97cea4baf7a17bff2265ff2278ff229dff91b6f6e940169d7bf00b5ebe7f176fd0a2079bbfe04b05d7f4a59a628ea5699bc246f098b00b5ebdf9176fd0770bb7e03a05d7f014ad65245494ddc474bd67245bbfe01b45dbf00d2ae5f08b5eb7729cb75ab504c3e2d51cbb66c4f5c00b8266b106bd7ff52fe5a82ea58bb7e20d0ae9f55966cc99ebce56bc2966cd72fa3fc92f48757bbfe5649eae3d30a3ddaf5b68ada34144241d94cb8127e72e8b65dae4d4b42dcbbd74ff1934b3776bf9cbb37774b4bd01417dcf6a6a474e96eb9edddd42edd2db76e5b876e9653b77643df15be575a747553d5c44dd9fda26b897bd536f5e6e6a6bcb9a5286fee93373b54f526b7aaf80c79c63cf926c7a6f80ce7396f6e6f0a9fd96cdedcd4c72d143ea3f924503fa37973b77c46fc245032ac4a07ca47e021f044bc047e02282e7f32e017f00d7807fc036a3ceb4f04fc8e4fc02be079c4e4f8f3873f5b7fd6f833000f80475d5a3140bc8e3f81f853e6cf983f8778027c01de007f80475d5a3af809043f65f819c3cf983f799907e2757c0e7efec0cf163f6bf0b3c6a3bef53f7c8e87e1270d7ebef093c54fd6a3acf839839f32f8e9c24f974f89c14f153f559f8af1623a01b4eb9740dbf513f176fd1158bb7e08942a948796a50c4a0ca97d50203ff223499224c98ffca0407ef80924bac7711ca7604117ce405241929c4ee7f9d0873ca4d875381ed1e3f1783ca487a48224f1f77d24497298c87948966536cbf290cc6636cbf290cc7a5d8a862a623c2cfb69623c9ef779c48f0d8542a72e56e0d449ec43f85b699eba11a73eea6d5303696e347cbd0692b33d8763c4a90f09351f3b62e9f5934e9d536636cb9c4072be09cd737813e810cdd2c86479c812a42c0b2918bd1990e6463b1f7adc4b1f9a488f3da1d804d2338e1df971bef462a9f4222f520a3de18f1fd98d65ee9cb034964aa552c9837b292c3d4d203d6287099cd08ba1d0873a1d0e133aa15028140af550c904725482c8cd86e3429e71fb5114b970fb916f747b5e2c37c075f15f1b15c5961b6e340c592bd63d642bc16db573dc4642e7361d4342e7c6d0b9cf41d0ab1d84ee41e029a8a08b4f83fc645c178e5a350511867ca39c8d7248de753449927ddfca0c6419877380f3744fa789f1701bd554605666220c4b54d1b9ad44155e26e3884364268ea9d37dcf6e1ba0509e48a4894e712f869bcda6d150e8394d4c88c322ddb9df36c0abbc53eecdcd44e75e5c02a95ff39f37b34c26ea8dea140ef06a9b00a7b8e75e549a190821166e0d7203e9dcef94db4b74ee3710bde24c5debdc7355e89ce7b9cf58e854c34c80577a0b9ce2b41632e2eb2d96d042af360c708a7b71eb9d14a499619989b0d442748adb1ad5294ed7f4eaa5508308c42590e37f645b538e7ca758458b5148c45590a64e35fae1ef96743913302bc7b08ac330527044900101b3b26cafbe7c84ce7d3822991bfd4c32f49b655b1acbb6b4cd129e12c80c88a5d024d3399f532f7edf81fc54dfd0916bd28f48dc46fa2c2b954a5a20bfebefd358c56559a91493db409a5e24ea1ff516a255dc6f2bc8ed45cf6b34df280ec8ed45ae751474aa14e1bc298adb8b6f01f159ae13455276393fbec829354ca7a55e42a7b8edc70f750ae3bc8deb994e711b5542a7a85e859dcda6e39d8ed91e88e1c9bcea95899bdf4dcf751be5a6e945a2a9cc6b8e99decc31d3e720e81487e224dfe8834efc536a80107fdb64690a80c8872fa237d9dd3ce5aa57a9cebda94cf51cd32b1189443e667d5ea46e15f7a2e73431a22dd537a0e9a620445ebf08376d1ef7f17f7499f861090d2c32583a16c3110d5addac4d02ace25e059d7b1874eeb70dd4b56bd946b10a9765b292e63ffccc2dcd46732fbe3f0bd1939b7eed0c6cdd885417c9c412dfbeb0e3f31a7ee6d6879b5e706c15f706d27c99c9722b8e42a49067f4e2e8fb2fe409794223d268341a8d469e90e7db88b6df6c5d87b33df9e4b6f9365d87b311e99c3fd1e69b82fcdef35bd6c478beff3e8b4a204d3a84d029ee35bfefc09a8668f198912fe6eddb2c0d376d3eb7cedcd288db8805cda624627b036d14c36dc402ee582cb32b0371654df8e2366e8d11a9be9d800c9feb3c97614aecb473bfd10de4def9ac0940f81b88c1804e71a1c73dacfd465c430f9028cf3b60cf868fe20dc2103e0e8d359bc7a1471d6a9cb085e814b7e140a4ca6d878d8e62c811b5133a95eae3866b3ea08fa6c47b7c52c582340541bee73de4c67d879b240e37c98d26716c31d54319ab53dc6ffc02a9be3d473e9773ff3e92fc48f2b72686e42fe4b6f12634af3541e8df7ee359d64529c8eef76bb3f210ade29ed3ec56716fc5735c14b82791645bb34170c109cdcac88efb570269ca68366d1eb734bfef806ecafccae91bc674abb8b773db09c8d7e9d668fa7ddc4b81854ca3f803bfaffb4daf3c6e1a91bfbe679e0ffd79d906611857a0c4cc164cc00533501185904d530214f06c868a2030810a23bccbe512410a1d3aec18bc90d9d714e0a0ab8083cf07518fff85db87d9042c85e03a361438b5dfe4dbff7d2492d6e4c6186f5a672888d8c4fcc43af7892f23906211766deb1ce7a1dab91ae014c77569b883ce7d976e56e8daaa1ae05538029ce2f28723d8361574eeb977abb8dfba58e6be8b406aadb5067514dc772956d9ef2bd7aed0596b9d7b58e73818075f6e839166e8c27da5431714c8cdd5b90f673e7461184fe73e048261f47702b205663883fec9bbcb82884dcc0fc6bdc81173409a5fff504084cfd629300107ec66c74437bf0c4be24dc0fe0d05d2fc7ecbc0d6cd2f3f0db2db5ea4418e6c2d746adb5c3ab5fd7e756a5ba26fdfc1f4cafc5e7dfb4e89ad63a2afccfdbef4cadcd0aec4b6b510f3b60489ee48ba4603697e68dffefbed3f214ae8d437d237166c42f40acbfa467ae9ba2e7ff937f86dbcc5802d89b18c06d9bd70ff7d24d9bdb66a7b8ee3b88ec4711cc775b0cdda96d82f566dbf2d41c2dbbffaf6b06dbf1f4c7cc31176de8f33de7a6f2e739cec5a4b41f4b66dfb1311ddfbaddcdbb66d782bbb0f6f7cf36fdb4a520adb1dc8fd9cc8260acfd35e57b2e894ee3ccfebb87208ad77f0e8b86d7bd129161eb2afb34f3841b6010c60f8c217bce0052bace84217441f88391073f04413627cfe304bffc67f90dad3e47ebd6916d9da3a3f212bc2080c14915355af9c70750851841178c8d6c4ec6cc4a63529ceb3d8306bbcd098d1b30c1b317a56d96ff20023a5e713eacdb18f7c7e93fd5906a5e7fda8126f95e94fa5570ee920b89981045ff27e9107bd74d0876c6c2ed7c82f190c935d805576566287b689e7cfe8ce6b0e427e02671de4d4fe4f996b805399efcf2e10f21a7f7f564203e2a61e770ebde88d26f941ffa95e995b0f7133ffe753c4c6e376dc0d97e6949381ac49cd8c83be5f2ccdcc83bea1c0437a0673f68187e02132d0d802ce0459dc2cdcfa4edb0a72ff26eae0f3ce9bb47db003ae6399169ee058b069131e0e2082c7bb5f90385b1e0ed82f740a6793fc5e4c6d4d0038dd44a7b2a6c39a20cace5f6c2c2c2792d539c13566e095edf9fc261866f3f93de50b29862996541364de6399714af3af3141d0c7dfffb2593c489bc383d83aa70980ee1b8eb18a86bf2666e43c366b7f216f41ce6964724702abecef7ef0f6fd427fbf9f457ffa7567b2eddfdc06fb3c2d8839107d203e81f1fe026982350c13eafbc12c300c06df0e05e7d0a500a7f69ba16bb3c0daee528057a01c302807b0b6b9bb55bb8b5ca97711c8bc697bbbefc895aebe7f2b0b905b9bb6551bac7568cddc5e6adfb903fa4057afb62ff4fd19d068aea15d7d739c15de3739758ec32f0490fbc6f18f6ddbb6e7b89c73c6b96fb22bc83afec076f6803084243aee3ab6c3d831875599e5c9aaedbd37471cbe795ae19cfade34e9d89359448cb98603f2caf65cfc909b22dd241fe4a448df341fb98725722c9257997773d5372788d8acbc6527fa0772f38b9964d79ce6c449cfbf7d8ea5f8a0c762b16dd3c4ec0d7293474f7d1f4992be87261d2c8d48f5bc3d7e65213b403d0daa40ccb90400ee23175f40eec79f33aab78edb5a20051c3e22fecd7f1bf04d71bfa63c62f31bbee11a18c1373f8fb8c48f35afc9996b60cc8f457e44e64d606e6f5788a20c1ca0573ffafedfe4ef2d6e1a7d9b2d9d73e2edbd5fdc7b9b3f7aa703761ef7afd3e9743aa02876365936e13da71445f1f3c649b0fd0cc7715cc77dd7711bf733db87effd4cd83df879bbdbdcde685ecce3f18c5ecca3f979229ed18b621ebd7fcd3da77cadfa50187a51f379f03f9a079f037e88d35abfe72da0f58bfc08116f82049f9f093fe127fccc903ef4097d4e24cd977e66e6f320aceaf0d02b35a54976116e1ac1e21971d3c3b91fbf4402b16c58f4a449face89de4cb17c2223094a3f439a017d89540a9f1402fd0c8955a20f7fe6f333188bf47f5ee36387409fb0d42cddeb902c83884db4d61ab33c375f5820ffc6fd11de9b67c79c03a5fe3dd83df71d0882a5891f7c1c1b7feff1d729710972fb2e6f47e4927360f722740ae31726e647786fe6e7bccf8f3198f9111f6f62bfc7b9d72adc5db1c9801c62b3b076c06f96f7dba75ee855e7376ea3d1b796be9127a1caf69b8dbe7de6e648ef2e8b9ce731d03daf3503c89de367f7bc3944f7f0f1cdee3d9ccd673e3ea743724aee35b0f13809bc9ff9beef03bf07413ce3f19ff15ef3e1cf6838698f2107bf2f731ca7719bf366e211db9b9c7e7c847ecdbbf7dee3f9888d63ef379dc2de7b20ac827fcb642e7f78399f41c49bf57beffd9bd6bf6d4e9233339afbd85907114df8b13844c75c8401a99fd42bfc1af8d131d7c08330cce61c2875eef5aafb3a7e04f76d95fe8e53527fde2afc3a88b8fda8f558be4ee9547e91d363995f46ad0100ee9cf320876be0473f22e43cf8db6fca23381c0ee7700d683e73fde3efbcd96cb4e61ad0e8cf9a37d17533dd7b5cc7753fc3bdf8dfcf88de8720df36fcdb8fcc752ed828209af831deb8002216a5a07e9e82ebf514665b6ba7b637313ff31bb71aa499ca322ac076a857a8444a565616355468440600000005b31500003014140a84a2f1384e823856bb0114000b619e768c6ca18a9318492a860c21440440000000000040102400db9e13fff06ff00ef32f9e650bdc8a613514882bb9e782ab893030f4e4ea81fcee12578328e6c67af0e13d7e330b5ddd3857735cb09980d03e127947b2619609795f486c77af86855ec6998f42aaf0afe352abc740fcffac4b1b9744059e2df2603fd31efbd8d6eeb266596008cd2d15b9b3c0b2038687dec96ed8025d1a6e0cd880817634a54e02099bf6117aeeb7df48e2d808e097c694890203b78661f49fe05414313d3001ec688e4fc66608985fb4c1d1c8ef16ff2b666461c6282222612fb68310c957f70135b872ce0ca00a8094dde414465f032c64fad93f23b163b0deafd7bc1faaeeea55d7ba5facf54a5418448b164b469d90413e93db8d8d8310543fc0db9dffe85b7e1c001fd5b8ca37e23c19fc9653529baa90299f23577d962fd2b5717a68211d44c081ea0e243faf8992df1d811af7c967b86ef3dfd07aa16787347af2d0a474edca6df418c7a2f066e657be3835516bf0e16a1e33293068ba940657a17bd0c96da87401e010f17ce8716bb67d75589d21fd26d9ebf84bdf8549286f0f4f683812402f9451cf8f6d5c1043091af89a6d3470247bc10372902c930f6884fc0ec8d7e3f6dc57c6939e3dcc8a5ba51d6024851e8e4760d4be5b0abe93740395d90cd32e72ad1c90f6e4d5c11e0d0cbf7cf908767a616488563dd53abf1c1c52fd794daf6929a8ddb66bf2eea1728c8930309222becc52aad8c2f341f059125bd053aac7b684f47471251231dc7b0c3935a226d271d50ded07986b1ea25a9453756a9ca1163fd5daa56cd81b78989e7d507d12601a16af3060cbf070d9ec96feac6f61e06c6e2b590247dd5e7faaafda3c8bd6afcdead44ac776a876a7ce49a847858f2f59b08079ad8ad4f631bfb69b84c32bb0e96903dee0a3bd8f307820ebb80ca67b10f691d53a44c6088cfb92214d7c8360f324bebd1ce482c38158efeeb7c3c7a966c63efeed402e5b576ba45c6eda872b3db735c2bc9bfdedcc6bac81fa60be00f3f22f4c2515db28a78cdd78e58baf80e2cd36c877a21cc696042409e0506233c43b5d995856d2cae72665c60bf09b02c9194918ca1649ae9c9db7883da164b896c796eb9714866c075661f28d149fe0cb4818898f4b880f2d4cec1339a7571acfd3bd811626205f5327d7074de9f3c429b7e3c2046509ba71fbaa4fc279551ff3c2e45bda9fa46eb32dbed4dd8630e98b96d391cde8e912cebc4b261fd5d1f9166bf5d498e1681bd252de6d6d42ed6e90d8c40975e9a21f638d6c5816fb4c7235c768803d9557742b1261671199e5590ab85e021de68d180fe160bfb5e28ffa60ee625cf6f42efd3abc98919b34f48e73c48c2473a8ccc63308139062c3e151988c9685efced26d7ca81ecf2032399815b01e41b32740124d39f74c4486d2aa97721a53331f5c0085f31d234ddea47fb68e9ad8daf1777bd69a6498b7fe69b010a3978168104d7543a72e94eda53626375d3aff63546313fc698ce25701c2fea7ccf03c5db10d7af389d4562462d3950aca59318e2da04fc9856bb33aaf912e2ad29501edb9efca878fb53faaccaddd6f5562835adf3ac1961ef0f4aa4702b12e27f26e46007c71af2a1b1d368424a76102f37bce360b60b686a4b930e771c0046cec00e159926178c76984d14ba2d4e6169ab3ce4a22ab7e1f34a6086db832ca2d4560be6ac23eb5cb4dc139908dcfc4d8ce198e8ec1be7ac92f751e451f7c284619815f6c006ad902b1ac1cc22315730f29d4ac08ec8d77bb784ed806b0372b6a9cb95c04d8ce3086a1cf1889f9921ecdd4866e2f5029997956461a79da4e30942260ee4fd29e1a3d667ab241ffad6631003ed9f7904ee44ae40a6420b65c446d784f36d427524f815168d5b1aea79ed2c07779873483e7d542675e522cd1bc5baf6762a43456b49587140d8ec93cd20645060905f6f910387c7c836294cbcd2894e9dfdd4b8eb6838a9c5efb31e2abdf37458219f45286b13f1c61cc19538fd842f02fc96ac745472321bc7271ff994f7dc72c2c024c7cd5915139682175a909b329cb9d30dd0bf4e3226ae42aaa52ef4196cf1a632497b0f928f9b90e5174f8b454b579181d5334b3f037fb09692b596ad119bcaac86547128d2d873e4eaa5d9685c119856e3d9b55986d26883ccf6e74cddf6fd318f3fb842731f18c3cdd1654c4ecb276bd28aeb8d56e3f6ad5e523ffa2e48bc0bb3c9b23b8b9c50fda279859832e47ef0260db5cbaa326f66cc2b9b97c0756031adc77466d1c259969f3ef0d9bbc744e446a59c5a8bc534c11a70ecc6f7c3efb23aa4b2a26228561ded58744f9e6eceba91e98545c4d28bb4ac315188b902203ff3631876377aa05b4ea75b41fae1c6e09019e9c4104307565e2d1ece13c991f3fccac364bad2a3cf00027b46b6806e66a6b8d75be9b5e552a405fe2c4f132063907ba963314daf53ce7d5221dccb4f09eafd174e2b5481a6604604eee88fe43dbd968f922121e3b9d21e84d61b4787f6ca70c8ddb35cd8e22d72b2f974a500862ec563028102e77e211736b4dcbf04c6ee8ebb83d88d5840ac733d3ea4b8abc933f33b76e03a74898bc49af0b7adde68d689a386484bfe41892349c6490cdfa1d4c520653d2afe92c01a4a7afda51cd444632c32ac147c6dedd467f843a2ba190b36b5aaba293bddf2e101876faf3e29dfa14010d46975915b0206661b5fa01fdc1a9b6ea0b58623c578550ca40b9c48c890eb67cd4bd2176a9b85e9a82183f25aa37deb09653df7634a3ed633208588d5217e2ca55c6ee4e1b15c6a4f34b6db66b268e5e8ad4030f7b7533c3537cfad19380367124237a320b29332bedb3c493d2be4102f016815694d661189ace63bd39525f945d73f53dfea72d557c7ee07200870b93b18c7958f773de706fc0e121ff6d8e9b4aae1e1010b19193072a94b3ebdb881e561dd1dea6ace43a3f1038075c4b023b8cae5f10fe28bab00c470ecd443a3a1ba13496f911db76be787fb21366ebf88ba0e0fc7af538d53b74b1d1c5d60b7ff677548a0ccb390cec28ec5954815df81cdb6c7048a0590e935c7d5c4384f873e094700400d0c3d70a30018ae05c55325c2b20442d89c41bbe77f8144af4f31b8e6661a8225b00b815f93209e49a2babdf6367eef7d1072c5561a9243672dafa5e1c51514219173bb38e0ad6e904d6b32107bb114a7e62738b61d3518692db266dec28eee97a0928cca539dfd19f33df709395e7f53c9b003728ba23277e60d1c3c3564b4ec4405704ad7e6e4e51d5a07ee7143ac986608ab5b0224ac9917bca3dabdf192eccc897df79bafe6ad82af06a4ad1d1ab90b81fe91f4c8f56e27c2b1d29e8938818152f7a162e832e098be4088007e41ac58b650c455ed2e4c89fca99b2c75b780148a9e34f703ad63bcdddca814b0645a72b03cf5b889a45cbcabba30343bb7e3121737e380592597115d92ae9f2e4050260d0fb4521f655290336554a3ddecf76a4723fc04791e51a64184851ae8453f91c35d8161441e1d2ce054019e014a53126c291c22d279723dbe1659010dae63083381ec3bb7bd2ebfafd2b3f97c3346220c3090c0d114469504e098d9bce2512291f1c6740df2b908517217dd2f4182832729f0c56a17c4127b5bfaca188341243a171c0667236662fb7c88586fba9a85f2a6a0e09a74ca05fd9bf5608b3f40b54612012fd5b4210edea5575203f157dad2c03a17bef389d5034da1247538e2e5bf728048bd8528b18f5d41e2eaae6a945bf8f7d7f5de2729302af9024860649ea9e4252cc0cce8e3f380eb5c317dc0c26390e123a848a57290b0258f454b15d957f62d0468e38421d7e25a50afdbe4746fbda3cde4a1c7edc970991878a443143c6799eca91fb7439e0b2ec8d8983471386ccbfbdb9c8949ff1797b48086292b2c399c530901e3db28d6f9ec906691baaf06051a3009694d4744437e264e02376f0ee159dd2a45482a518694b3ca78752f94f34663363f655e069d2c827efe73ad776116cdd071b410052021c814dc535988ad48eddc96f9f23c6cd3a71e4382d6ac7553855c9965658c0426df0b69b91e2b27b93963c4b9120e5059cda5c8243c3e85c85dbb240c6eae62b03ec6c54cadd3339692ebfb8acf9e9d59482b580bfd72debc12c696b3782dabf4f48c6843c4df63042a47833b1f1bc9161cab4222102e4083a03ca8a3426428a1d9168f3591175d5117ba765b4d49ee0e14383e0bd295c1efe5740ec841b2e966605650cf27fbf16d7f5f287a52eb3b8b7272e95c0596573c5bd5e29a8f841c5152a50b3fa581d671d379e083e98615542e4b1806e1a20c5bc9142d1a3b4713c862e5dda74385026144cc219a41ecc047427134ae1b6ec2d2eb4e3a518c9372fc6ecaa80b0d1f600088b40e666b3919dd3fdaa777e257015b3da5eb17a637482dd90768d63be9a54657f143a50f42acaf729690cb85c9b268d7eaf6f82060a154e291b63a558bf66968c86a8f1d80c9a68212299de19d89372560f6091d58233f47dfb29ef9dcc3d4a545790ec2cf93013c1af23a38a065af232899a479400469c928878d59b7361ae2214cf0fe31c132054529801649973992f9ea2a63834d917c50aa0f192bb5e9c4228bc46709318a46b24381abfb253f93530e31d3e56a6d59de444019b27c6233890b9dd657600cee88df9fc32501541ea98fbb2cfc5861945ed23830eea2d4d330c9390aea5effc4f3aa80a821d855dceb1b24f64899a13c85d7ecaed0859e461b9703bc40f2bc45c4d3a948efd171cbb6761818a7eaed48e353b303e7e395103737500039cfc8cb61a8c1c664c6c684b5d12ea323934db840242c37190c6c81e31650c4f26cf8b702fd232b9f505d127a24b7d098a9f42c38b746dba1a4777f24d8289bd0306064c8ebc5715281853076070955372be7c18ffa95b7378a9c27409bd8f40a02df11ed1ea53d27d2afeab5a3050395c8048ad86b53b6e7f185036a753197a6d0fc678d06d0d56fc22f92019a276acb53d0333f9e9ce2e4f47b426ee4a48aa559001c49311efece1067209e2ae0092d47c0a8fd3c99368849f1920fc84d58d2978892d10ffb5c1d1d9bad6dcf8c288b8d53359e98f2464bddaba70d1f656a853fe7aa915c40da21df7b48f82f93844b4b965793b6c1b3acc4579ca26b9a48363f925cf6cd9a25c7da57fb5b5c98409ccb300cbda133c20fc4adbaa104b30b09c281a3299d44b7ddee4668f9c766f0fddffbb8e954f58e5e170e704f121a41c47c16407aa68cd8cb5b458e7b5ddbe5f4ceec47ed9b6e18e2f97d43b3efd979153e923cb5f8796c0bf3507da18112ef21b17d9123bbd17539a59d0a8b6813d5a0c8e5040152483e134f86fcbd107ad372a0389ac5f411438e8be0789ded96e22148593c00bf0fff4eebcd718370ca049ababaa2286f4d9a85599c0cb60ebc1d7bf57997abe96e22b0510371bef22d50dc354b04af9f733fba6e937deffb5a924da2e1a74ccd1430c5490be338a4e518f711c1c72d565177a312d24cf3d45709425a0e12feeae9393f7109bd726e5daf75d67a94b10691f929a3cf1cba53d08ca3741ddb1c41b4f4ae42ff5c1be5d4f039ffa08215a957c074e475a1bb2f2894bde36a359ca4c44f7369c6703c852f95e28cd6132e3327e36c2975d35b182c3ec5b2348da1b188d923f657afa6754c51e66003e4c8a9d4367cb4dee347514751bad23af3cee1e90590530f4737c7088b5461249a030bb5a9e1ffa5e611d04eae9c3a2b2714339ed6a2ccbbe0386d9e78835cabbd29598651175c04316995c12bd6a1e81d5ecf60c4502cbc9a9229b7bbd87cee0491079d55ce0c894766a198ac2f9161d442d186799a99b0f2bda7f5546648ce354f1ce673894c11414dbc740cb8629336f512362ab027a6eddc0100bcf1a35a2e472a74050269253d6f96bcb0e920be00b7f615f35bf2a53d311541b0a97b951b948cbc7283712b944084d9c327d54b0b17d326019794863e84c11bdb6ea2aab28a3d3cbe77980493e79f06fa07441d76337dcdc29d0c84e62aa8e2c90849183016fa4d61ee0a083490d0638ede345eb077e4b8d447de0d34f6ca79fd8423fb1cff47b3421c323b1be335b51dad37edc273b7e7c3beb65590b1edc0655eefb5a7a5a9f02f38a08174c8807b1e705caab4e9a2c93a5357516cb3c312adbfe185c28a5a172d84a8db16a43109cda6587dee286031a2bcc900ff598e598e774a0099faafa32324b955be83aa3dc1f49239908f1444648e79b46c87c195152d6baaf440063b7ef03450c397580bbb1efab04fbbee62ce7e98de1ee8f3660270f65cded241840071e25c854ecf04c86a1daf96f20c360a35097bcc79c4f0e322f665e64936ae09026eb0fb0b32a413532ffbcb4032037c3ee134e7daf61ae532709dc2cab54cb939433988d219f60a897d895f7cf1618c92815b8953cab8550e2e7584290065b79b3f6db6df56330cbdc05570bc114c898901441911907bfbb54ff655c5c67ebd0b20ba89f2b47e0605eff529963f6716a0200c5ed2621ce479401ad1b730a656dbcb3a23289335032abed0b758a30764f928760eb208caa7c845a6240f146d1f13b98cd24f4c155ba5f68aeb29dbe87647adc0e758cd519024a3bd38d8ef0d3f8fee9c760109ecd30cdc8fbed0ac52c95d902ea4201cc1a87a5e92823d246f0ee309d218ebf3e6a51c795b157d7a01fd5b92019d03f7b3c41b018f6f0fe69396ce95d53ee9067ad41242169f1e8e761fa1a5873f3991c5a8dde3da4c45fb8a5577cf9dadc73fa43c0fa5e58e8cd31dd978f6d818321f61d4f38a495ef29080c91cf4e976e2c85c81147af2c60189a77acc50550947798a8ee1091b3cca9452af2c4c0350fd92be50ccb4f4a25ad718c49ea2212e4f8a4848afc56757124354ed2026dc3408e57c1de767d081c8960092726eed8ea516081613471eccf36e96a5407f78279689b06419b9c37b49714b42aa146c90c20f309b04cb669bf424688fce82d0942bc7db3707a87babab6e9fcefd36ce6e080219acd03e3d63e4df9fa758dbd76517cbdf1cbfe163402beecf75730f0738e9a07f07dbda2a231d9ddc54031d4c3fec45bd353cdbf92202c1646e17e0a6209e8e978a482b0f84e11aa094b9206e33e270f11a953365c7ea2ef8137229f005720ec1fa9608e1c1c6e181df57c99cab02ebb1828966098c5c78866e1706444cb40d9d4207cf6a273adf74e3c4760811295614449e34408aded1159098ce9259ee4b5edb8518d4ad0d415196ff83d8c9144ba9b3a247f8711a78511ffdd1c2f9243eea29eec8476efbfdfa3aab90775a0dd4ecc9267e7c12fed658feb70bc86be04f92d53656f484c936211b2a9b777b615533b8e50f4d399e6f5909aa8936758854bd263dcfaac1bafc850415f5669646af026bdd3f2a39c8fc6c1a001d52995fc7060bee884dc1c9a5eb54e5623aa6543269e733949f0cab171ef901f6213529c9cf7f3937783d0147e9cca037dbc9a8fc4f06084949e98c0040f38d4d9f6b97d0491af81cf4847fe1742763dbbf218f2d18e9b34e8525f5c07cbab1ed83a45ad2481ea1326604aadda8a0918d00a3c04169fc67c96b69324b5afc002508047d439df7d737d0b22adbfb1526bc6650aa443e883954b8622d952c1e82b98a70d469aa98c3862b7fc2339df0af91e49977346557f7fea50c23868ab0804b09c358745ecc31371c037eaa56dab48bc373729a2a5d57ce1524bb80bc00d57b667518d08b4068686e9fa54e6dd932b722aebfb9052521721d81bd5008c811f4c610623f6b2d537044a939276235ea0ea2f94cf9f6f399b759bd13ceb43a0129f6ed9789f41863723f2e89f1dc6468729484f5a48a0ed2b4b1fca4d06df379cdd7d0846020aa7020bda90ea9aec47c8de1565b9eb2c84684c89723b4e7fc4b6e1fe3a84de6cf59c60f551d4a59984a0bada207ac5eb52a5ee20220b4e392549b9f7b24d0a154b1da2db5c5727e134bc5594614e93fa56c7fd625766f7f5ad41608f19833b446f2e011b291340abea291b5b75c802b2b2c3ae08ed11c888d3bdc35a0e309a92ade069886e1517f63078770ee9536aa4b1a60d194d0108a7e1c00fc6c3fcc25c3b28dc66c7f6831e336a480cfcb5601b3c0181fe6f26ba8b6829eaa0bb6dcf9fd5521cf174d52987d92762913099ba7b51432410d71be73a5faaa485a613d55d56a96be80b72f278dd703f455a000ee6601692cea8d63739d0559066dd99ce4752c396b66759b04ed0ea2edf7d9c5b1870fab4bd6fe7d37df77c9ed869cef6c3c1e03a17e0db7faaf8c239289819c4c5fa44fd409a38d6ec37e0b894cbedd61d6cd3ad0c6697aaa37488767998a6d843474b559ea15cd16cc305876a834b8adf135d8a0db442ee63afe3fb1833651233f5d780bfcdd4200928f2c7b6f19ab3330ad00d347bedc3e6234d453fdc87542046df5cbe3bfbc17872aad3dc87939cd189c0d367f6d2e212d229c02d99261dc6f55d3ad3421ef05214938dfb79c9c2acc5e51d684630bb269e0b8d0e90c9640549679cf750bc2d1c11a61d84daf57c98a2bed1ab7c46fed26d8c06c2967687f4e1e20b4ad502c396a8bb07ed2cb3a4c014fa70cd2ca7159cee612821373ba8306e6f834e0a6147ea2a6d9b06accd4f25c2b025f369a520d7929acba7b6a89239d0b88400986d3a738eb36fb6d1204e0e5065772baa9ed42a4aac49b804883a82658a6a468432ca7e3b088b1a14841528271f444604b0168be20d2f626a5a5ee2178b3aebd0927ede86a5f78aca63547c2362e3ffba1705b3c861aa10e413dde7d83306d741320b03df88317cf39c9ac98bb6304f0ce96f883e673e6e556a7e44ec7df3d94fb5b3a1eda25c6ad40004deae429949aa8dea08843ac7eaee27e05cb55153af14272a47edf7d97a1fd504de2ba5d3a476f8640ee2737182aa5dd08f0f7481c1bface9cc265a97780c7a87ca5f1c96c7c0b1f95488a001fabe456594e2f20c37693ad8eae93193fea8f1afc70a0a3a91b5d522991527c36b5712abb11c4f68c161347f4417b83d264e9e854e2538c0a378c492ad9885812d1e45e8cf0affbbda8e6abda1db51aacb821741d946d9c680d7d7aaabbc3a8c44e27b5309e286a5bdd2b9a3caeca55b940516156b215ea181ba79b11eb7b6c7af286cbd837e015511c6f8c05a64b703c0ffcfee6c00967b1db0aef2ca2426defe0c53269778a7d66416e29e9ecd3ea9e8d7bb757fb7361b1a4bb086039286936102e0562c552b466d4cc0dc494d5d056687c62ac6f0acb3bba86db8c94a46b3e567c9a7b965674eec48e4beecab759349358098864770aa9b1f560dcbb41bf5c0bc0b81499303a4449211aed12907e6444d577b2354dc08bd57f7f4c9424817463a63be3ef275515a29e743adbd71605d098016006725352bd83a8784cdfe100867f42e5681622cea454c1c9e6389768c5bcaeeeb5a19997bfe58b7acf6ed8eb8e9bc5cb478a01b01d65c21462045eb905f84b19f4bcc83492bdc064cf35e76ad18706a1d46dd5adeb2318877a99bdbb55c682e1e9565f383bcd94063a02158fb1d784c18cb642a25ee66b461d0b416fe7c1911f60d120bc6b254fdbf0310ad52b021d42d14003878a4a165238e676fda315428c256667cc42e9dbb34c2cb62fd7bb2bc533a81d3c8d0fde40b650edb141b679ebab76978cd4fb1847a30b2401aa94027a98333a4687a303c4cf874c6c680c519c00a12ff83ef8de62debdf79696bebacce3bbd0e4e7797951a90bac23272df5a18bd90a519b93bf3485b317f8990d44e6928ea27d70127e7d869fcf1aaf7a7bf66a6c2f345a6279a6ca4f94ba9c61d79619c3695f81c0b81fcda48e60f0937b5ef78ba2d111bee5205a4866c24d828f8e07aa13029a6cd17ab7d3cf01d96b21a50a1c542db37e04b049d2cc51fa6be03d688862c36279bc6d26aa5d8a9713aa980bcce1723da54192f921c341096e3938f241a258388462acde99c670875a834af728af08f7a7beb56f40138e3f9c4d1f99aa19bca71caab82c6607a235ac722b1a9b027172081e458599e66f32b8d64ccc5a8e6fc5efd2b684b07539cd858f468bb4ba8260e129ddb8a225c5133ea338251d6d8e3e69a6bbe3587d09037f57c6b0b1240e311dac3daa524bca7b891afaea383d7d13fefd82f3365b54752375182385a221d1f6aacdf1fcb3e80e4744121ffb8cb5f414678e2385c915a692611c08a5c1c643c2716b5c395e693ddfe4e0b036647e3407325bd5ffef1f51c71553130c029b16af1dfc563c61ea818b4e1531ea03c2dc07c7358914f4f76fab4ef4009863fe5253a931082200bd40a90d5dd9135abc901a5010504dc7f0c7cbda145d1728e7f54126b38607e6b736e392d9ffab66b451470e7a643894f3250dbe59e3733a634c845c5522fbaacf89674b1ef9219f025f836705f5a4a4fb419b8035e3ae02532a5e886dd2ef950e91b3b101b16bad5a7a2ef3fc6b854a7b295af0c6d22ea11964ab5f8176c08811648710158c5435d72e7472167301705b990957e05dbcd82b8a7d2140e68a98cd7946952704096835e2823b15d3beb3463944e1bf6a0f8050539989de7a7980efe3bbdf88bb5bcebafd394286b7d1ed01a7229504ec4443322027d656f5078c3ba99bb55cee7bed9d3c72bfb50c8dbd34284efef9157477cb2b98f32707b8add82cd2a9314cd8a4c875982411100d5475ffcfe2ee8ca326b78a233479dfc354b04d72513c209d759eb1f56e424119642f407ac22e88a89ad36906a547c7315a1a9b1d2c001928c3d12427f41cd102ca5dc264a52d847fdf2ec3fee544df426398519076c9ba11dd1ec8037312b4d8b07b80b8fba8e38414a058c2a0dc29bff309e20d644fa311e683aa65985dab9e32d1aacb975821982303abb3fd236a4006b8cce64b1056d2dccc93d90cf9a12efb03ba7456899a448e45c6c306e94e86b19d3a7d8d622a295ea6110a2cfce77805b5b189ec0ba363110f947cc77b7e5022e995ac8690233ce0a0ea5b525a45570807a7e8c8f895d53e9a58268b9019b3ffd93afb643491281ac7d39f8000380790f1d93028f2aa1e2740601dc87369ad3c596fc15b0356e56fa0d65ddc5cc420744bc92418f8883402dce452a78b082030544a0f42c129e280e1a222314d5940b3b4f4bd41769e86b04d6ef60e3f3d5716819c01b55deeb144645f5f7dbe81dcbc17dd7be410991c296f1407dd6629763ba2bc12d8fe43d057819479fcc6f60a94e5c136877e20c11c2a9637a0bc25c9defb3e012c06759a628b2a664402ceffb88f4bc11565df52178c5884d551eb7ea4ef85f40a03f745e2ad9c83cfb39268ce2f36a11d6e73dfe7be362ae5b623eaf5cd2af9cae72a720cac526cf5760d93d6daae5c13c720626b548b4c17ddde7dd21bf994bb88dfe1c9df941e02a4b0cbed0c4c92a655f07e403b54c52c16075a173e1157650eb8b40a152825b601538adbff2e33f2ed6daa9614bdc349ead4d45beaae6ceae223da8652a1483a87de4f6a7a807ee8110691b73ad4089ccf543dbee391271269bc44203d98b1ffe482e1891c51ced70c68762b017df81b633dda760005212616cef420a89b521ae1c30234d0a21836e068dc950791cfb1daa4082b0b4b2499cac3cdbceec1376b7971f2702f611a03e46226b7679a1430c5960fbaafe527be128da5724facf0a69551a46bb5dfbc3c8617272b43e4f3bf5ce37f422205a9a6f40d406b71ab55489cc77bdc7f68d6538821c3f964eba10c35def3001f876a88b52a9e9bc9ca342a500d984042e04316858d2e70ab784b9fb48e4902c1b7b47797bea84796ffb1c9b0aaa261a13f42909dbd8f1bd311c2340643249fc25cd833d69d9a1129e9bbeada46cc96f1e7b3b43b11ba49593ca3bbe8d55fa522a628125180daf66ad2ef7b32a9e68598a1e76ec4df11f0861736c4f213ae07edb7846815f1e9d4517b4425be5ba9a23abf781cfe82ec45e09a6fd0b514d4054416112d1c3668ebe390cbe8de049423188ee439c20e820b80ba3e3f1ca22ff586d2dbadba8cfc38466e627b6c913e780c4d8648b5c13dad436e23ed47beea19a3c1243dbd0c229b7e67218c0536358d56240b3420c32c47576d05a666043953b0cdb270976599e65ea061db52f2b80116cdd2135f9da332643865b4c0ca9f8744917aa726d22b38613d60d6fc2d2d8dbbffe07967012babe7bed5b7e22acce9db81500944cf23e6312d683c4b2e185c24ac65d75430ef71be0b731c931009ae7d1bd20c2e6db458a5afc63f6d5ffe7aa6cb6857fb18049dad129b261864a003edb50976db3f8bdd127e51b9d793862834d747a477362e17e02321736257558224138fae5440ce8c9e40b7457d0044011768dc7428df57f0a5f847b4f47a697b8d53127f270e6a670ee284f2057000e4f4a33b847c3bf9d6ceb18d1535884fb87858c04c8a732a52395b834962b23ea24d21f62f09dccdc4841eb6425e37498caf9fd4281648b92679afb354b845301e0f8fad8df71a5a787bfcc8d36779eaeb3bf2d3f781fe567bef64e8490e3bc1ca7f579d3eedd85daa82c589b6567b27c625729d57179c75affa66f38e1c6bca8869f042d69bba97326963f1dbcfc0e9d957f9ea5229a5bf145f13f507f2f574e18898b6201cb68b04218796dbc535875c5316a796fb2b55d00f69853d30d052a62658c4991119a447768d624aae51aaaab1896b068873089c48a6e9ffae9d2da462f26aa0dd406413e4a11316680c5d9191bd93366ff22e02d8872ebbc202f4989ac64a4b24d6e987a363230427b1fcd62f8127cd025647c6585fc14a50a87f829e4013595202dfa036235c4dd701ccbd1288f94a3a0abcaa9e2ca61df74a1cfd7a3348420c6b306edf40504d828d1f561318f539d71f515b4aa170de8ee63dab54d64d8efe66a8fd4b25d4f7e7f23335cc98ca949c8f6c349ae0b1ed4f1a7f9e6fc5a7b2b7af7156d4e6fc1de1a9476f4346608b8b1454bc89078661093c8ead7b7785ea90a2c0a3c45632c6da843f0627af8a70884cf5e823ba95de33b631e8cb0db8bb0de72742a0ab99eb7b7d55fbc7480d1f9bc0c20469320c51a4bd0b9c4e7815788c7bc79d2618e53204940e5707a845cdcba1722adbcd464cc09cd86943aa8dc4c98c8646f64cefb2f38ef3ea8b3132cb344ed15756f0bbb77f002d9ab2f8a89f6e3069bcf8e57285b40e5e638ae6188698890e4a4b486dd9b2ddccae3b21583b2c7576d84a3f03cb3fa38832032c4d3fca9f2b48b2cd79060171f49607063fad4805dc1510e21a464e9146135998c3635abe5331b616a10a9b95cbdd85d5024587a30dea6a7c5c9a833ce3a454f3136235dcb9b2009dc5523d48b3a20052552040044de1a2a2b34a5174f61c347c31387a6df7ee104fef2221211cdc45f3731a9484bad2f4f92444c2f48fe3b8dfad2e30e6a896ea0a49328e22a4c18a4ebfd2a5bfac1531e4786e76855ec121138b8808ea64ceb6faf2bbff232a89d7c5cb188092a3d431da1f31701550d77456718d4dc637a6998335cbc9ff2527199fb93f2d6aaa156194e818613b136d7795d4415fab95911e702983b2494d8150531a5141067e8780da01556880400e0e19f4f04232e3f7a47a6a24c4b944904b7cfa06dc4d83214b301ee5039baa467dee1216185d105654c01b9beea167542acaeb1bc39ba9fff1ab328ea91377dfacb0b88a1f8d25aba72ba0d5aaf5021b69b906f788039827ce5e45e075ea3c0c8ec788ff6c54b768bba55299dd1c1096372320a745d032d451c6d6d985500c2f0a09ddbb1a3060367d3efffd1b8f33d501f3a5375d6ecc9d7e13e2d61f7e6cd46853661f8d47b4c8fdeab97a186c2839109a9e1506f84f29a2187b391211dc092fea9a504d2f0a6feba371792ebcd8a8331195996cea8c4c4a0034efec5b661d86ab81d755eeaf02069f31f0a8b52f023ffcc3906c750a5c9e22a2f7dcf7ad3db556f0f7df0e5a32aa840744eeb09673cc24abd9486fca90af4cc852ab553ac05f002a393c05581e0751710e04eee29c80e95616c419312b9150ee0bd75d6273b4ae9a1d53ecae93230e8afcd4787025d0a8e32b593eed392b29139806c2fc26728c905c2c34054f653b4392371dc2733bf2fe735d590e5955f26f27b5cf477f09c17a415b4b8d9861e203ca5e2aded8e6c5514f0ac97b94757c564afc8176b69f779f79a62d40a65ef7a7cf25ee1a3ae17f7a572dbb525fe957f7cdba454ba65a3380eaa07a2b3ba8e21b07e237bffb80f7801a484670c6e50653ddd29b060c17df008c0ff0d08f36127a49a40212e1eac5960dee005d313056100020746d51e886555ce6b87e3f8ed0799ad859809b8d2f00ff636a0161484a1d16a35530ca5dcbd96400888e89e2a2c40781bf0e079328fd2b19d8c2f5e9e235db9916faed0427a5855bb05f1244366919ab6e82b63cf98dc195dcc301ff7121295f492156ff8ff23c2bef1ddf14b986ab180156d8397067e73bc3bda28d3c4237d18fe23fb1ddbd623090a9acf499bd0133b2eaa5c4162befd136d7ec5d4d24bf758b80669bcdbd8b473f5dc0c2e16c82f5c798555b4e84b1f44533aeb22078dc4030c5cc7614c15949f4bf197d5ce31e020e050ce437553611ab88a1cbf880a9f8352ea34f0ed3b13156282eb8870f044967dddd7c90909c3a8e3ede33c1c7565426be349c8df14be75f051cd70fb30140f4c38ea6dad070ab958df59ff6ce5dddd810ba29642ef6cd662c9c23e7a0f5d1520682b30b2269d494d52f29826fd9b49d443df4bc5e46d225d53d857c6a7a3fd155cb1ff24046be1cb83e3e149f8ca00a209e5390b87ccaf7cd80f304c04575eeaaea6c905c80beaaa4867b1352da435485b5bd52ce9b5c41e6d0d18b831d2bb993049d7fb87506796913d9565a383863a61066d090acbc5508df52a348a35f64be82fbc056896947e422088aaec7568b0ef2ca9f1a04942d067cbd3ffeca52ce1f39226668ff61fd49dd351df24d839a79ae7cbbcca3af8e9a0e63902f79c5e68f9141c0d4a01071bf57601dd3e64b782e638382742aa1229909ee2c6dfdf609f487774541651f32e68a238acfc02f3267d414e2a200bcdaa6bf8a37ac0a40fa38a2236d26b7b50256ff0f3de98d622f74022308f01250a200834a171a6bca9dcc637e2fc1bdd7b8339d5e3419dd24f5323cf565c99e606cfa3cd102ace9af5eb854c602f42a20af53e05bc09c4a34b565f2996ca513868400458d2249e1a44540023c97e1d1773c540c6693b61de386a55db3d44b3e2cce02789a634c694a1546ef18d71fe3e6449d363ac5666b6a4e34448f075005f465f32efd6705ab0ee6622c8a76cf969c9cfb3209074acb30ace7652093cbdf518c72b3c5eebcca72f36f7399530777b6bbe6de5405edcfa8dffaa1dff21f725ac86fc87e531ee62705a41f4c97f24f7db630fd45822bea5c7c4e6b315b5e301d04e6f877fed7665e901e4e679036dfeb41bc9ac9dda3fffa0a22addf17c6125407fee4d475c267e61983c9b5e18562fe65593261feb805dff306772b0fd61be3baba8084ec6e2547b675828228de687968db198e5d73f90ddbe17c6ba2a55f1a56a763990a663c02f28eb67d2704917d345be5fde569ae7d523899362e596c555f3d7a902cceb265e46e42a1a4b8a67f63fc22e91afcc6d20549682dd850596ae764f6635ce451f64edc2ca6756b354d1fe3ada0c2597e35588f23c076b913390df9473971d4e22e4ec4b84a8c61dc8ee9a9cc2a3608732d3bef3061ee648c4422f0113a651552254e4bb3de851d8d3242e5f902d6ce57ff4002c30e561fdc4665f8f35ceaf02c3ae563818b55f67054c1cee20152f30638644039bdd4232be14436de86bc19144d19a6792dd856ecd788d926fe486092229e125c99d962492e143c7bbb7b77d1fb95b2f3f289ec636c99ff837e1974257403fd01d29f3b94ca840c217ab946702045368834700054a6bf8fc0b0ab94de1e050e7d3e42d8653f1b33af238df20b165c310ed9f29d7580e38f770dc4c00893a464f6f93d74c9a37cadce32efec7484de402c6693a152489a3e59dc00d5950fde619041ec251633dd93b369ce556ee85e728ced1301401d21e7d5be7092c15c8c91ec8a954a62f0a057df298a3359674a668b42b4f65495586d9e8d34397b9d766f2b06cf7243722cb1d216bc7680eab566b70aaf28f37b7400c8301fed866be08ac84a0a36547174631e3ad413c5d4cd731cb19751715de25c48b7a20ef2e2a6a2c2eb0429020e453b1fc823b770e792345f252fe2d0677299c40cad78521bddf4725d6f2cf4c0e64d166a8232b182d3c36b2898fadd7a668afa0b2b0b4f41ed0c728107d20a9a4191ebafd7d0e61d951c802626ca22749250c868507f1a5c15a792d9e6669113cd34ed9f10038f8f20f095e8b23df159fe941648a1c49a1de4301c304a1ff8f5f47ef9623771c435d496efb74d3201e04cbb12044f5231863584d1675d611fa68403e7ab2f592612489479e01d77a1dc43d667839b76136f8100722053e57bf53542a58a0bb2428b34c23b7592e8f191d06113389892943b5f83312faf1a627732694eabf177e62f6c47609c69126e38a9590c0a5d4728530aa7afcfd50c740a5a593755c3c4547441855bd033a5ccc012371f3433184fb51a3ae403ec2063d63d33e7a7aa5971f5f89c9d37447585c9c7009c49cb2fd8016f203b695c2c858806bf1da617188a8b5241be04358a376af74f1349ec2409b5bf9a8bbefa1b5546c6887225d44b9d279dcf42eeded02af2531d0d6352218779a2606d7c85661d2c2d9aef55fb4bd5302963046697a9a8f71d03b2ba23763378288e8f3a64d6f416597c873d3081047e29e69961cfa185688ad33f580e2cba5dc64286f00768999002c334f5c86547990498fb6f2d191cfc9037ab48cf669dd510d7d973bb3e5a8c1fd783a0bcb221c5433f4d2bebf933b8f3d9a379c1cb070e1758c9ad41fd4edf3d718d566a9a30d5bcec1303611940f7a64b9e72002db7490ec2c7aa66a53aba0e38592861c9aa6544ddfd30834ca80939e8c6df45da9890c222e39152ab599b0d442b06a3294cf50ea4db893e6de51eb4e3d3bab52f8f9cdd9c0bda2857c9d83246bc8f31e8e0292d9f3b2c61e12414f5d1ddce87fa2b8eb9115ae2af750a82ccb4f07f06a74ad5ed6ef888b5c32c7297d0ac20defc031ab50c1f25cded43fe43a48dc946919045932ad8af0aa6b27b366dd99741b9f541b3a3da426be25eb54a46fc1fb8fd6cfa5666a63b47ec30326f41034c10e688a8017ad751844b1d411111a83e12bb2cba2850385264404a020482c9b0c31536c61feebf60c552be2fe5f8e911c47a61bd450c49dd7ed3d789cacd5891f401f9845b23d73267e8613fc8a32863e416b3aaa397b7183d8d5fdad178a81d3e2612a0baf11180d171ae3a111d66df960bc1f0e11c0715eb0e662464c7b76662746e9b46a04ee1a0752f31ca7a48d8b5f002333503d233c5e9a384027008284f3bbba4cd5c408d4dea3a2a00c5f4dad5448b76af5d65d45b71a223246907c4ae6604eb49da4d3f04b407f827ed657755165f6c6ad313605e7a12831645be9bffedea13930281b8741b324fe0ddf14fbc8bfd221d9841955d74a99934ec05c5e3f7948bf24ae617da7c8dab0209d181305dae354bba005e980c508e4620c0047d12c82c675988c3f800c343d6760517028bcf1c820f5ad34f2c85908484f576cf6c1b424d6e446ad243b4dd64470038a79d8b7e500e98dd7822b8ec531140dd265f8df01a9b9b385cddc877cac24f9a8529b4d64845b0a5d03e4b1bcf5061158e195cf71bc7e6ddbd15280bd9d71397d9b95bc27a274f73f3ff86179bb5192c03d07b91a3ebd4b2a37f98b3115f37ccc497c2e208efdbe0c4aa10d74a7d45238e53f9be1ce8611b048c41d599bc598203b6abbcad022d65de6851c4a302df329ef0b008b2cf83e8947f7fc3e259a572fffbebb619b837b4e72b42d999436e0c6b251c35ba42a4596d621c78f35f6d25a1c02dc75d9faf9d9211eef7e405fa2d4fa18145fd682e3a9c07842c3c4f84a22ab57df3b8305c36258d16949a60cb650576fcd63fdaee3dbe450237e2fda44228c811bb033ee5f212b4a66c666d178adaf6450c67174f5c4b804672f10eeec1ff1fb4df8073bb7a2d31e21381d280e7685b39c59463e9cd70e39f823d414536b03a3639456aa8c0019d5c95c51b5b60e79a91e9391f356fcf47a875ad6211c805d854493fa3cdaf27177024e2b5ca6a79141096444ded7ccc3489b6e4f3438190c8f70a33fce5e98a6cb579b9236da36a4689c0a0926e74ac8fbe1e2d91d9c22a36405bb2e076761e33e7379b752903fa49bd85324023f0e5589091616fb9bcad57a8ac7d307266759da8a0abfbf6e1254547b4214cb624a824505e6f3d58cc10ec5733d04bbe727d6435a7870af4d91b7c2113cb9cfd04b185148cdc473365d5fd7df6879af7c19df8490bce1aac8b465af443e0234fd113769c84f7e86851bd18dc508c7d9120620e2077b9bd4adea48fde3c5e1ee9ac2a39205bfb94cbbfea7eff5c62c0ee24a96a3421b17a4d4a1b374fcc2c9d767614fc4836e89c9fa539b791353dd8e2179627271ccd04175b43508ade049478bc888853dc5b3aaf400741c152b51e02651de002d223e5be30d69dd7a57f12a0c7a9333fcb09b92b5412a22bb78dbd1e309a9f769333802867e10c05ec586b6381a22e021094cc6183730743b65bd10b34eb2ea4a41f1c5db4b5b190c09d6bbdda1ee1226f9c25e741777f2974bcd9a3a3ecc432ca93651382416dd1e392481acc4fac8cd64dffb185766067a4db097b2502d90542c9fca035f3c0e11a3e753667633fe76530de863b255488942b545bbace8dc0dc454268f49133254c88ac5efec3277cd27a11673aec2de732833f391514fa5299a04c8060b65d357839d15f588e56f78ff2c03a649ed6ebce712a7d831e6bde52f988629c653a8242391d36e86261644066fe5a68eca2bce4c3fdef6326fe5c740eca805758e076ebe2eba721ab0ed8dae182c26033f73382236f47a91fe7653c3be545c2ebd92041e7b9f582aa84e6753a475347a5c6fdadb32a6a9f567ba8f905c34b120cd9cd846502d6df8184457bd0ef18d84aa6781c3b1751f3aa4a15d8334eb748342b25487543a13a878ee1ee50361ce7cf3e5fd4d52421152ec30ad5c9c92ab23f609feafbd06b6c3cf807acf1e4b9ba8829428c25ac3ff9c4ab5006aad33d826b4a0496c2275699de55d0ea55663d553a890351a6324a2eccaf8e1cdb9bb596a0098597e3144edfa1c6dba53339888d02c6a687c55be7bb7b91d6d257b63d4e32977e3bbc7c1272f56b9f3c458e67886745790db6f34f1ed6142b30ae9cfd8ee78d0b147ba2c9f3a341c8b4729e9b21b3408286b824b9ae93ebfbdade3e9368046ee487188dce474c0fa5f59f8dd2adece65ef98bde3099a8b68f3c25c4865ff1e5a5885b22f4d78ac4ca6c0c619c71cb94458f3dacb83b86dc16615f52832deb600e9c58e441062dceaa7b8fb7cc9fc27825a00a48e6e66f4b68d2d5c66c9856d70f41ab57cd7145d8a34a87163a2d31ad3ab3c0385133f86cb8afc27568c440235ce6d3c3b1956030a0df90da4498ee1632c12e71ca829d9bd35b40da0e8e83ff999e96108ff577b92955df39818944af3eb254844a0ef889dddcbb9499233a606137ee547e666a8272d3f203050073b0d7f54a18f585140066902aac78272a2f426c83c0fed91ec1050ffd90404417b9fdea8138925996941590a9139496bc49ee7fced98613a07488ca3730279cdecf9d4bdf8e7023a58629524a53fddd6effba63aeac6df6fa096615427b45f54e8a42663428be10d9c0237af83f214ff058d450633bdc0f249b72a8b7158629d98038c2e1ac763dcf0a06da485dc1d8949d8f99ae997627f776e3e8f121d3e7656814f72bf0949e039f0c408560b512206f998ab4c0a3810c3818de9f51239da8049a7579a84e1ad0894d40393485c1a81b216d3c3682e40caf6fbb469810b4c25742b1159db03a3d4286962ba53e6223c95c47c2e22fa2eaeb75aa2bb7a6446ea2c25362d025347a0aa1e0e473d53466cb38366a51e97fa523f6944c9439252e7425227056a67ccc947657bdb9224f53ae2f4b244726b2f3e2dd6ea4831590f45425d8d09ca3befd9d14c28291b604e98ad40c17d832db84cc568f595e13fa4d4d85e314ffb1a2de58fecee4e96fce26f5fc26b2ef49071fd45da2e2f4a2e8f249629978cfa3c1275934474cd3c02454f82356b02a1029202db26e6695ba352a164c9fdb28e96fc38a1659d52f4f789a25b900a686a56b20f3e93c2971f2ba81c428f818da20a4cff7920ee887d45a20472501769052c08338e2d3c582613a6fba60267f23cff9c16d1a551fd694dabae6972bea725dc44e4c39182fbcd439c3f05672de5d4f3318c2be11426637fa0b6b90173fdf9748331778ce9b6b59268f8762f617c2e13e2490642db81e6698132d5d87b9c6f3c87a7d336e4a95dd911210aea9e42730eb60e327b287909a6e4760bd0e280572c95604524e50dfb2b25a62d06849cf3f3fa6a9efbf8832903c04f6bbd91d77c84cf2b06d72f21052134a0b4647568f75c35ac21ba457aecccabafc1e3a1beaa3b3ff0251647bd2b5f0177cfe8cb082106f66de43158f2140e33c83d3975dc9a2e87bf0a42431df946c59f2d02fba00112ca5a88bf5e1147efca43928c71f09a74e0c5557dd2e96461c5dda8d3dba9915bdd22a4e7719e92d281b4ca0ba1e0c1928b50745cd423143d2e11d1dc1576da823dfd11a092f2f3cbc3b0395a47539f647bad29bc2755c41d748125677d0798a8d91ec4d210599b6a1e6a5e596effdc7bdd7ca25de537880a20728eb303f339093eee4f9a00c5319f7a0bac87d53dc4689a20cd6774a6d412444d6de92a84d06adbf786fef101c53405bd0536bec15858d4dbb4889adc22e56eaea636b59499f4a4cbe4bdc4b9197562b8471b18f1d8102470b9a6e68cc80f990c9a21d70c6e451e12090df252003d09042ae10ba0fb4c7dfea4bc557fe8577679f7f44faadc1c0436035ca7b95dc6cba9c53b7c0125e1dde9f0b6c869e831330df8495000b2cc096aeaa7f3de3d2bc951f4b2f4de1cdfddddcdc31c1d6d075327eeb8b2240f278d3f9531d1941820248f04ef76d95dc30e44fddf899bad155e46af518316872766d9a0aef3235d7f996e1ea0a712d019e9de643abab45134ce148b356df93c8dfbd8ab05b7cd332a331e7144e9ed4f4182a4f2c61b0f5a152b591c605f8c0f88d3c9c94f20888e7e19efc2a42d3ed26f7b98a8c34f22bfd23c881e143f126e60295d80690a08fddef4eb28b83fcd097b34cc3027e29212052d4079c16701a0b3b9aa60036281e55082e8dd0d60c7c59711a6c8a31213928e63cec24ed869e19f5db89ef7a87a42e0297895383dbe4dde3a971f35ff91d90d2b14ab9d0579e90659e62bc48a3cb579cc6f82481cdbbe59a8b39475549f684540d810b8458355c43d477013c5dc6e55c6c276ca67ffe6e0d6de2ce2c48e6c60f10ff0008716189c3d557ca96f5d7c77fd2dd8b24cbba1c8023fabe1e65e577b94e73c4a537935ad9f2e16ba0e5f712a2e4482a4653ebd6e3c4fa5a84cf6b53cd8f164dd1db8763a2ed6d034d7948b22e58a4e120389f3dc30adf7b7a9b30900f82a8026fa21f76f018c98c00de6e8655d06c197dc5e8e824bec4520477b7a3deb8c41b77c2445f29a1bf04f357e40fe645ab9d75c6ffce5168cfc842b3df50f0129b7c56fb9f82256dc80672dd337d453041866502a245d0a570883e562caf033f9992646642c4cdce4a622f466b04668f634203cfa09ac88762192e6e36cd0de36619a2035509162bfa72f379e26c6e0885d680ac6621e9828a4a747a9e8e3e96ba7142c4993f3f0981b535449a0f1f1077d7fd0b4cbf591cd84a24cdf3f1140ad01a830670ff4f5f925ca7beae460929c5db94027986e2bb1294ab8774e3e877468be08267f2a598232e82399753628197f0a5faf1fe977d83b11118b2245a01d8019eea6dd3f120a560f5f9d96d0e6365bb140538381985852e7faa23f151ea3397259e64ecbddbf6e864869017a3e559caba97b1a0925b913d46de7afe31bde181d9ca5c7bf4609edb6aadefc125593ddd620c9300df3b4c17b50b67792f7b3861fa0bd84f33a62de84d87cbefb5dbc7e9c507b8a81b84eaf04d842a4e4c2b64eb19b75e0f461d40147fc6540e126789d8614ab6698766faad9a2b3c5c766a3f093c8e42e0d16f875f9a872bbfde0022d40fb81ea87d8cee3c14fe0e3d6119faf64ab5f588e5d2d5cf11b3a63a98c89fc1e50c533c6a82f1e05e2b1ee5c0b1c34b2ff473ea4d3428a21f2fe3ada7b26df12f095a2bad5679f5d3aceef06c237a8d8cd352c3b80bd8f8ff1dc81291c01074558ac5b6c7e89a0f3137c1ea20eb09ac56edfa76a5c23565887be2672434c22b360ea5d32f215b754166b41030ede13e03a4d1f5315cf1d6573baec18fbbc5d0444acd1ea52b0b903729faa62408524775e81332e8ec07f4920a0c1bc3a95e15c138d65d969c432dd12cb3840e46a6852e2d735dd14dfb3adcd5afdc006aca5e9095b9f70b96e5484caa5cc4b7a16c1d530fb27bea5062d2974cd940aa96b304787ee6f353d05e23141061d6e63305704ab132ec84b8886b9892a671f5239e01ce2c073a953bee6fa0515f8911b9c417b6653f4552a04268503ba8f340c8d002377e211ce0438b96fddd0f010af4f9304f8a9205ffea13ba2485de5175860b1707dc2e9c0a07ba2c1601718878bf636ac13aa1660d36ff69a238a425a404d663d9d8b025c227ebb1a6c49500312e86f3bd300bd1b1a5083597c324e45775bab3900328dc1d68e5829d3b8142ce52197c9f914dd53a9ec4fd4964c0b213e2b9643f84cb54dfa24136d9ebb6189262bf06ec3413fef23258e0407bff5d1a2523e0e806890e012dadd2103819e0a1c2646fe5c8f032a665f26e218075ad293062f0039e1cf87851838e82dce1d59f29401499f7f80e6b5de3579e2a47ee23499641f3777395324f5ca4f7a72e2cc9603c6ca79da4292587bb766fa319a64493b519091e882a835dd952eb84ee1483672190be354a14bf62330cfd4f6a3de38bf05b71cc2a4c0b0f03f7e38f2bd8ebfaa14e036d42400d8817057378a773d772d630023a2854862cb5d4388fd091aeb7264eb069e562297f26b118326569b3007b11c2bb548a4567c791f3b911ed06913ef82c883296c4af723d2132687e96240a4254a08c4315106aea873389aada274476ee4081970541c76f799adc431d19be3487f620aa3f388f05462bc7c25c2710a36d1dd883adcd8c5713fa21da4629362205646e801bb2acf3302ea8c31c18b8c21550e198735609171aa56edfca5861fbbe72dc6e029ca1ff01d9b049e76142ee8e2622e44f17b95bfeb0a6f7f786c3c7d3c2358280ed5d4ed8af7a491acb8a2039b8c08461495833483b009200845bfaa5980d30b5ff77f967bd3b782c5900ccf6f317ba297526b25fd69dcf6c40f6eae8fc7f34d9d93f2adfe0a47ca6f93be84829a764dba68f1dd1d43a29a1a8e071dfed555495561bfa5f7d21886e4415ce0605a4d3a57ea75711ff429dc3578876a22fdab26966a70e9e4818ee10061032488f048b0404d3ddff7b218f2ff129e194c1bf441d052763b64b03469a5da06da7005bd0d97ab205b2cade2af2daa543e2165c9b4c500e1b3655af63a27dc105ab6a98a32ae1d69cd049a28baa0efff26515b228e1ebd23afa23c1722da97087e6f238f1a402fa9ef1844ab3763ae45ca7f35102d83156217bffa039085ea25f09a9c2089df7dacade776dd689106baed6b3fefc147b1c6320f6f12582014d890839bac9fed72ed7caddc43b6b0cd8c6152e898d2fc06d7cdffd20043e5c4bc6629c0140e72784592248a27857c4d84ed4de91a06928822c29e884a53f9159c21207fcd24ab447c34d495a37a35b1ba825cc162749336a9ccd8bb4b7a4a3999afe30284f3b8cd39a2e9db733e63e19d319dcf47bc84b4e913a2050f90846beafb59ac811feaf9a9fae0433fec59a9a01f99d8dc9ffff7ec53ec983ce750a4d823b5b550523db61e904b0c7062feda7dc3b50f577556a80b20f68973e96a33561638a1a79af0df72e9436e846739251932da3e955260874b92009d39a2ec006b38873e77f087fba84ea31773d21a43331709329f5e0aa2c350e32ebda7bb1f43e26b9dd0c2eb7ba65f1dd85f3eeb4dfdde5f7fc7ea6117acc7c4b5777000010e21a0c240ffaac8777319ee836e7b774990dde10a8962cb0518f1ac3146fa856ebb07007c00f6d62015de00b4dfb0691ca1a1002e20d60fd2b61aebbb037bca56c0ff81510fbaef15e8ea6767cb2ca2278b7701b7a9ca5339c3aba025118d67f3b3b3d9f09de375fde3621137374a3d83927d737cd34c9c67e54f509b630469d293800c4a963c10bbafeccd94aea47f24d251df343b5fc1b4dc7c9ff8c8a2310a347445fafa1338a633d87628c2027255a82780cb1428c2f31838074ab64da6e5273b673aeccd3e7f3b3f57f7083361233763aef4fe6326f2f779781c47d06d1409a89083887dcb10efb58f927010907883072b38ce974867baef61447a5247dc8e4654c630ebbade925381ea037548ac13350989c3347747c426240d53dc19319e08294c1633a23d3142209287847718923e114175f0f616e91fc52e51bc29920efa7aa2e31d6ed237b864a978fb2c55d2e1f21849a091765a49b1af0a2ba8b82e5a2bbaa8220a52152900af757000ad1ef4fa6aeac60d4a2c9640a3eb06d487f6c9fc7ac904fbf6a4fd31bd6e288463d8c1e80cea0d4c8fa9ac134ae4863a23bf606a723b1508ceb41945d74e5b94fb20d5c5ccc0dd497d41345850cc70293f1e45a6600e9aad2841d717d8748eda74131c09baa509cbcec83a8b4f7ca7515ed0ae05256b4017b95d5f8c5a0efe631cc32fcaecf10adff883ef9d9274cb666e9fbc7ee343b2786bf7584164111dac65aff0de9ec797ae8387cfec6de9da97aa3ac70e21fcf57201de58d3aee6d8388ae612701573a954cee7d5b4e02b37fd7316eaeb3dafb1d5a385ac6d1a422e55b77309ba6c16eeff75b9dc8db91f125a013c2e1166921675e3a26b0241916cefee99ae0b72b4b436ee6380f8c76bb19e8ded8f87db3f334e3d29c1d4784feab6a7ace64e5d8e8c7a44ac1f0b205f73ecc9f283c7d1d0735b8b0f268d0f0e39724b8534214f24c26e09c31b4e403b5825e44bd95057b2a2aa33cc4b5289a903eb6e8463de91d450573652985af9688c894c116a6a3bf97605950a922e12fab30ed9cfcd5ffa6728f7ec44a0e56ecfc3fa7aaabdbf72461ec763d66a70d8f08961bbec1bf3f264a099ed2104adfa6d6a6bd45a5e47fc8a35e369605f3d3848b79177abaa00b573517727b24c22a964e34804e7761af89f1800d8b1293ef26545b68285d75b9ea6134e9d3562cfa8d31b08b8bc98194c8e3bcac8c9f2ed69c63c6bbb07c9344bc26b5b80df628d84fe6c93814ebdf8ef01eb55e1d04326d2dd6f48e3b9482a4b5d42e6f10842ca3ed7137cab27d53e99a8bb3a516b75557d75139e27bbbf364207ea8473a5f7e9aa89e78a9ee39b0cfa6bf264af75a7620f993ea1d62f5c95da9deb93b60296246dd6fe8e1ec4065233b5026bce5669d0daba389dc3264eaad7b99276da923f79b4d660bec59321326ef1acebdf970ef00f45407f30bb906093050f8303d1dff00448f66ebb2220b04fcf9347abccf51aa668a76139762ae15544171537d0928a089b3345155c247526e2a1328c11aa1c89c733a820a5d08cea862cf524cd3365a1896d73579e56851964869ff50f4a97abae8197403469dc001cdb50db4332e49724a4490dd835379bf7c210ec62b5402ad80cfa07546248bdff488da550f5a51f7263e986697d133c098a162aa008b177f2b47066723107a54e103112ad967678218df69285ca035e420997031742f9937019e994b9909ba8a82af65fd28c13579b9abbd3844e812f2b89ed8260f29712a525c32140eab0154b317d8ff0a4b2acea94cd48d85ea869b1a645f50729db3db9a0bc74b9f823ef0accfcd8122205efa435a03409cb995e7ca745beb348190bb81fa64aa669848e8201a3244ed5aac953d849290b72bfeafa06bdd7affb1c5117ca4c080d596b3c8de9e240e8f0a3aeea196c7901662dd4cfd758902a6cebc63fb566af1f4850d4dd6481a9e0022868de2aa064c6556890e98a12079313877c08df8eb812f52eb6bd8d50fa89eb8675df65e00b0f0e3cba7c00940fc04120b427f800c2c75a4bd1b5a9c60018bef39bc7d8b99b89cc96894a2fc4f432b716d51375081d57b6a540cdc5f727b14c5fa1f76fdec8facb6db8f8f69e49099079c66d04f74069d833793e0c633a93bb63eee6400685d61ca29d0b18a780f18aeb72ab489e0ad9e3c52a727fc499f6fca60e8109b5b8d9a77949aefd305bead019d49715379ed2adbc46c3bfb1a840764234f3f2da1877aec70ff8a177ec2800805baa97373d94f170bfc6417e80bf4c36e5efa307fde3361a56c0e457185f96b0e37288d04e589216c1119bab6fc19c263653b197696c2dd4f47659e9a134a4a27feaf77bfd273c6ba8944df7aabcc52a4001727ebb9b4355341fbfbf53933e679f08671405bea4a8ea5d34bee4f32dc35c44d65b08692d90f8e7803dabc632a67af5233571cafa13965e9e3a776d7e5cae55b222afb5814482b5606d2ccdcebcab01785586f71966c299ec65855f87b54902ebf4547675578f1630b4067d2d15b04600196a3e8a7639c549609219014aa0840036748081bef122381cab95e83d00d7211835446a533b0d985d21d6632d731565e102018d60d2b2a52876935afd3b1206b464aa7544e2dff87a7edb76c004954bfec4ed91daab85478045ec2ded980b6486584bbea57e394b0d95497f8e3dad591dc9fe8135897047c4e5167f2e4837437b28fabda306bdc7a1935787554b4dc5a6c53bdcc087fdf028d39e40f5fab115a5f1823c6d3532d0ad0a57f613b11a7a801e0c664766748fcd407566fb5864a1b796e7bdf8d56edb628cd9fee7d436145dc7e71fc15ba11debb161935db0ca62cf6a2d348fd4a24d8a121b3daab74e592aa1b13a67eae3194d92dcec21799618bb05eaa1e600f6bb259ee2608f414375725e1db64cbf3c8255053f719503f6f7eed414f36d80341e73e7b4a8bdd45e7a37fe79be13dee4a474a28f0631658659b218f6cab4f9d5200815bf544f40a481af40403f2a000216ca30e82e245468a2bb2359d10816dcc36c332794c99959b1b8617b3ba11027b46259752d7242219a6dc596676d165aae1d1ec26e796d726ba5589ddfba9bf864e943e93a27892d3422c6cd1c9229d843d2e208b7e892c813ad4473f80863fb00ab5c821abc572366216d33c7e5afc7e6a796997ce1ec76508078970c2a770a67e0b45bf279c631e97fbef8efbfdb21357c9965c8f65d0562e07df728b7d315124921bd92769b5b679fc2f4191675750e251f366d94cd41b8f98ecac193f68650281b2b74bbb5dc19c9a55808ee87882fb50655279d65f7a355b9f3d245759366fff06e7fb6245d190652d5332377f8fa231bd4252dbe5d0cba0dc61052455b0e5d8c026079e2d9611f6a592a66a5dbc1217676deea7093aeb60a85639f72e0ff764d7e3abe201cf448de55583efdc9d7a4912d5dcb422b06ab13e6399df7833cfd612df1d37d87d435f62562684a0d07097ff671049132fc811306556a2e68975e2605858dbc5c3b31ba51f118238c38f6ef6b30507c0df2e891124482a4aea34eda8bb83172f622dddb795a6d82cbaf4f833d75be0952495d0ae30455d23632e455bf40f844c2a5609fa9b01e8763acfe2284cca1aa3006cfea4c06db45c519a871f6e5a7228b15237d7aa999273822a1275c87ae799097d0c13eca263cec3689c51dbc1d856c2a4cd10520e097c08c0fbdf4254853a18205608c21726dfe4fc3f075a7e63d283c34304158a516e30e12bb05f0d6e2970510ab356df64f4fbb8423af130c98f28b943821c8e9248ae019f4ff29d98d00af1a30d67fda8e80872c30365f0efcfcf3dcc36e91c3aaa5674725ac96a4788959ca5e6b27ddf8899ee490fea7233a24ba2a37451b7bc57344b8177517a4c763c15a5e09736e2af293d2ec62f8beace15d7ea1ae298c529f2a7ddc5b93cf0ebb1071d9a822280aec07e58ff04531d213c0c2bfcb293a8948319ce9344447224c17fa070349bee1085ce188b9b27a7d554312b2c3f3391c4219a40ffe979d9529667d21b0ba8aacfa799b46bb0bc849854d9654dbb01592318a0b2484f047d539d96d1c8adc2a68a72cd77b659169fcf20b95574e502aa6133ad432374ca48a212c4cf6889550598ce9747118bd4f3d8e60a763e3d6a064a91fa3bcaeb76e4ae135d1403aaa8c28cda0cbaa8035d53e48c78bf70780b6bfec02b3d740c2f13cf14c1b5fda2deabdd639e8b6d647e9c7de9a10c373ba329ac32675c83b76853ef693fae71563946851b2e4dcbba9e0c479b7469a3e4c7e00fb42f907d0fcac8201837cfa1c11f18feaf650aec32337788b27eca25381bd298acf03825692810676df65a8a5b7a8fecf12883439d774ca4a97c29a146c724422ce16455777a7b5e7adb17dce85042171318cf930b858a1e71ec0059cd5318fec462e4d41cc71368eac240f21a61468aa792e5a5b157780961061e4e73eccc44184786076bed2e374a0dd1a79b3cb1c049dabac7cbe7d9efd176d8b1aea159da02df5edc8c52e6b4310dfaeba8551fc85556399ac3e9d7e5990331e6aef6c4415688035472d3eb0031bf091c9dd4681be9252b0472a55919e1383bb234bd5d36aecef7d5168f56b37aad3015c25de449a354a2edcc64d904437960d405aac4172055e299b2ff7b6c395a3aac2564544fd2b6951292833f0bdd19c24ba3dfd5b36455fac9ccf11085d65d0e636c5287317ef3f995212a30e374c7957d92c6875884c2543733e2e6cedbe8d12d8ce714ec146b80c62db48ee6b660db34f2e67ad5d4508cc30956b5169ebc2a9c04d249b1dfe9aa8c56d2fd4ef7a805e9eae83bba5dfa30c3afaf03e0636e841f9c77d874a38b05eaf4287bc94c982173d2b0303b14dafaaf29501063b8a24196d66ce06765e5ebb51831f1584d0efe720c2f7aa3b220ba4de89a6f2b2aa6bedf95651fd2853bfad8ca3a906658ca49beda4fbb904c23d70dd8875989fe7a3b89359f3fd89b496fb527a599f6c7777b047f7265f02adabb2d1135ee34daf92df39191905896679aa116ad119ef9c48f7da27795d32ad8dec7792547299e9684b20f337435b4ad9c21322665cc1da330eb24274e26bb8584800ca224fd5f3acb9b0c61d8a5e26892ed156d0a7498198fbde94a29c502af0cc354603df86a119881dd92262b50bceb66c879f8d799d347db77f93367ea07111cb5d2dcfbf808e7cd2d63f0a0297efe3314e23f40aa43e63fbb19db9e96617bcc558fe4dd1f37a7cb9738dfb0f3c48c8bdc3210078bf5fdd0d230758de58397263525087d5222cf7c5be60324dfa9ff121981926d3d50f0dedcf156147170d99ba82d2e3f61da9041e831e323a78a4066f8c3fbba6ad07e1466a4c7ed0c1b3ff9cb37bc0d3ea82d6907c6f7faa203ebdf1aea8da04224bbb8b904550daecf519a910d9e41acdc9df2530026812128d15d99a3b553b1a9bd34f8c11cab3609ca33761ac1e549c6809baf9d2941d6984424771e2bd409dd9cbd78bfcfedddcc6ae14f58065d86dc8d186612bacea2fb343a224a486648dcfbb14b1c65ba87a56a718ef9e4e1ab9ee57d01814671d79bd27ff09b1807560b21cdad08e20f344f763b236331a7cac8d492ab471b1327e818d69a414598eba0e4a66c960f48e6568619ca2d5723090db7c2d69146ca5cb53e8cb50cce0eed16bdcf5384284c1f474d1ee0420959d27a64b81c8e57062ca23c384510aa1ba5fa451fe6646468ef7c7b99ca1744c07b961852d2e2a36d99b7ec061d572cb41a815991fd82b084f62b6b1615644b1e88d61bdd49b30d670e460e3101fcc144dcc656d7eaae83d4e95aa0269ee2f05b1b65e3557d21ec400b03a2a58b3b7db3c08c41d6f7b6bd9d42d4b080426c9b69dc88804bdc9423245913e6027dccf30f276c0b3293e58bde2762d097a322bdcbf39b11b17af57fff7457a9522c69ee939739a6d2bd355ac97324b5830ba9762793abcd93806ddf4709333a0b6c1d92d08af6eb542d40447993ac5720aa01f6a4540fd6e2c1fdd1c8d06a2a3c3bf6d0d18f1555ac82edb492cf555f1a8e4aad527ecd2b3aa4355142c22de3a4f13c5034f3a1bc42397119ce514d378bd655716e6a759b1efbf5aa4f544243ded4485b58b7dfd812e0fb59af65ab1cf87978a739828175cea24078ddb523481efece677a5b3c3e0c1d073bc5f8e2cb565396b78cee50fb4934c15ba7766b3682e066be8a84459370722b4c062b8c64544af57fa9783ef1ced0c268d16a6c4d4c76cf5b442439f54c18e15a784d03bbd066678b78f3c95d97cd638b70cad5cd92c4eca57ba30dda6951aad4e918b7892aa0a61c4b49b42339cbca5c75e2bbff0a1b06f0c6b4c7182a04bcfa768ed9acbe9a8084901e8aa2f1cb300a86dda85981a3854ef9885040dfb97a83fe64014d58a494f2a9ab508ff829830484ba2b508f33f2e2d6f840b719b866209870ca2df0aa651819cd55cb4fb80dbc486fc6995aebb19a83a3267189627b4107772b138cabaa1118f5160552d712e433adda75ce99f51f4d7a12d13d9b04e35e032e55b47bf1fac71ba49aee1a98618355531a4e4e12a0c757d1df0ad0cb7aae084023782a7182b7133622501fe63f1b4c20f52555fdfac6fe155cdd09a45651c7c3ad2b944e3477685c2ac086efaf9479e07596a0ec2561e391f754a5871dc31aad870ee87ae42c0c2869b43607e07dba91453195b161a270bb2cf1cb74ddf809f696eeec2ff5484b431f8ed3f80e055be1d8e72fff4adb8b27e729ef7b1cb7cd323f5bd3e41ea571ab7c0a681647f218f630a3ea7346006a978834cc8a8bd4dc6ad35a230fba73c5e911cf0849d93a4d7a351944f19a995578ab2c78d96dbc1a569d7d2c41a11e2bb3f1215b48d1da56e0aa2093f2dffcd0708662971ed66bf08f835be56c9573eacd6f601cf37dab08dedbffc340bb04ffe031a9219d13be49ff223e23bcec9cdcb90f0abc4c0448279d3bd3f0412ce5386050ed442b066c4d3475038ffa0a0a026619302a2c496e5f4a1b73cc0b30ec820bb433d471ff5a1ffca93790f69d04e29cc68f3ee29654365e61976a94626fb6db374dd0b9d1c9a415194b5a8a66d942782607880315e3506ce5624a0c1d85c3bc8566a4685c6d0dc99d39c8b3db480c7a154b94ed91bce3155b7e273f5f53dae460d5f97ee86e7780e15e61a543d4ba705095457ce813e4c872d7770a4dac0b31f7005e9aa7a92a063d043e2c68390889d734859d4272fed1905da4ae13849d803e5c12adc81bd2f55aa9292baf4dd29e8bf80dbe2aa0eb78231e9d502869259291226bb9e8bb46640fe6c2c77867f38b2c46053fe7cf9b64bc8350499e6aecca54d6972c1f7bc7da4880944237d93cc29ff538a20d6b94574c6992b369abf0a9f1f20902bfc753f15dd1ad6fa17478924b060cbe7b26b8fe2f18d2bc8b12c16f09f97cababf477738d4c9f465748538dc75b32ef794b91e7a7cfee3bb287f8e74b8f6f72ab9d454dd4342582aded1e3cf25701b4a23cadb6bb826e93fa6b6696ed25e9d6f149fa58a08d90ff42145e069cdd47d574b8b36ad334e632cae0c0fdee575ea82ef7b89e4ae5a219c38af5aaf7c6c933ed27e856bb3b5e07bd5ec16d312b62b125c1fbdf532ae2bd42d7d5c80968f654a836eb76ed3a237a0c0cc1e4c47c6e5dce45aebafe6c1072d1f1550f11fda7e799154c0102cc85d298da9d0b2eae5babaa9062f5ff21810e5500dcab6eb298a69838e83a6f3d8be33611fb017745d2bc73e62da41af8f9d0381473e98e175ab99c6a584a2740140dd138472319961b541eb56bce346664f1c332007f63c213de1e16ded14d2b4bac626502ff405d396b8f716d483568a4b1c3d28011b803d9f1765c92760b57964111255135fb3af4a8776941a64400bfbe0b06ff14392a748a80a90520fecc9117b7f21b7cac13769c165154394a2af6e558d5ebb2815728086fd41d86f167760cfc2e943311354a9fb9c6ef72c52fa14f28174772e3d85b55ad4208dfd14b2a79ff8aae8d4e017dc398b407f51651954c23198b9ed8da8f446b149f624cb109349e8902a5266a48092559786023057d9736804c084ef17c7916e1f15aa5321c7319be12082ba3ae9f3ae5358964a571cfec311b05055866377c8d38d2a1ee4db5c6ea1c5366f1af9a7a05d490f4f65552b0898594f21ae720f9827fae87ad2a7154d91e1969a6b9817e70e2ffc50bfc7f5b41a6fc02cb4b8e58c41090458469ded6b5c6b4ebd14acc4f60c0dfde42676cbfd115280bf3d127b9d13eaf6d884ed9f991faf8f3b44fad2d6b9ba908d2ae43350fd2af7606e29bd3e9c07e4bf04faed13c7502060d5a8035f77bc898e57581f49c7ba30042e532c0f3fe0d5cf9176f85c86f73ae3baf8d45560683a3aa958927e02c9e31ac0b9c70bc8f830ab69132d9580e7ef9ba8d9a734b2b7dc7b6fb9659252067e0c6d0c6a0c200882a047650bf0cd2dee2ebdb4db3cdc8e11202633f45804ddc41610cc13e359713e821e1508e6a6177f528ce3ee1d8d3e524c3b557db397ba85dbf95732439f2f5a06c1dce42795a7ee8bc6ccef2906e6b49aa1bf3ca9628bbf0495a031731391d03543dfe2761f411a3337f97372b8fb67f4fbd398796abef8378b5d98ffcc0cb7c7946807f1f61bb9c396c37ee68f4c947dff573251df73f2f7b53f33921f3537035ba2fd7b26dafd9b68cf2d27219119fa7bb8d5e5cd692e34a2fdb9561f6e7da9b74725d3d365a501bcc868095080ef005f9ca8b0f5a4a53dbac496630ac01000a02144e934a3a5868d0110806ad5a70c23d779b6c32171626c991f0507348f1a37da9f62cf0e84b6000544002d9040ba699d0656f0820a4bb0c803d5f10b9b2e98887388b533b8f2bf192683fd244c4d0d9d99d14098da6a11e16e978181c1749cadd98ac5e48c9c99cd3e22dcc87136103d5fea683b6e63135be2d72ecc2be615db951f47363a71a317332ead7dfd951df3b7225c98bd4c300f97cee1d2d96c361aa12172990e49e02212f9a435f17077fdfa9c462312ed99477d4d2a0952411da28f48928822dc2322d153a5291cee96b3ea49eecd52c6c4a0c2d53ec683febecad32dfba0519e34b2346f9fc1dd95455933acadcaf25c4924add25a25fd1186f6fce7e68b7db22f44df867b695a692b9ae83b8d54455f4429ad2c997229b594e3e87f34d1b7bf81309c97208c67f414c7780feefc0793fecb7bb315b6eb6c636d345ac274e098230cc5bc4277483130883b243678b4190a4c10bfe54dcde8b76c49558cdff1a6f3555794cf6faa62838e340d339b220abd08dfefe0fd31f08e35379baab6acd19cf6352547d430eec56591f62191484a2e53a169122e32f30acd9d1eae3f096b4d48292ff28f51f86f20dadfdd33ae55f4a2d7f04ec92251043b1f0a4a08c5f3097d3c289aa6bd64244cca97542261753aeb2583a24b6a6666648d8c3556890889969f52239fcc30d3557d5f4d554a0a46c974455591a395e51b55d117f91b87b5d90cab6aa2b4ac6933afaaaa9ae14c568fee3235da4c26f4f94821a2da8596ef33cf0b977e7d29e1a40ca765f9ce9232528894912c6e730993afaa9a285467a6c644f0132316841b849bd2d10a5268e98aeb90da727259da5469b29a392ecea22cc6e24dac8936af08ab1e114e798b93107d8a88e344d5435170112da6c9be8f5af438a6d664a244b90a4d8b6932cb555aeb5330c7f7651edabbe8b51b9df23409fadad38d035aa47d0445f2c93449cd83f2dcdb2c5fe435e553522aeb45d9f3beb5d2d7fc71388ea91d57967fd9f3289e393d1e2f7eb003143bb7af7f63aafb7aa3299a684ade40ac9d22ee3d25da6c51fec31b65c6e39876068e2f2828af97c7076ef0e2074698782673ca23f143d32a5c29541df0f321c5c8a9182d4243e601e4cb9007e25219aa9a794286fb7a6b2c19fb98a1a475080de71de13ae7795acec1c5e8faaefac12c07321ac4ea0b6e5c5033039b2c5ed407bafe8eb02b5e06210e680f748da08efa026d45af257145adb5f2a81ff5fd085628e615dae6fd230c8d63c2807ecb950af4b1c64c5405fd8d22c7041f7cab69a01c2050cef6e56249235a8be918f9645ea1a4fec452c934719893b7fc7c7dfbc112265f70b8527f7e5ea1a58c8c0ccb8fa88a0a398828ea03398488d25eea20da40c62086f2651631621c99281ef4b93d75684f0d52f93d431f490f52f90e556947447e43cecc506a54c571b0088773626029a80ade9406340b2d7b20c5a6b794d932085a1a41cb67c152c81156325150cc2b34a5745ef1a2c50a12284f9f72f251f2c7cd501e411265cd0ca5169ba82613f59ee71a229af50db73ef7224d452ff23f1145556b78c20feac0831f74610b7a78a1cfc55474c391255de84311ba1086d80bfd1b5d248c0d9a3e4abc51435391a62a4d534d54ad54cea6aa662a345da9cb9a79889e4a95a69b7bd1f715fb6b3889fa2efa8a79d08fdaca086ea9abd038ae8af24a954949c13e625a93194a99205c2d681a84fbe9f885119ca06d94da1671e910991952158d897d7e82303d4e303517d971d2f429fd7cc53d4e8ea25f5b5db82437551395f2f26dcaa61ce5be0baa385c13bde8714c8af71453a744b16991480d57f4512721aa626ab60361340dcc216a019e9182eae5059d30c208238c17951650d4a7f55774f85310092474cd3b47d4277828345d7929ca8f02201a0a4faf3ce51c213243595d9535a4067757221e1877cbd9f734aba4d552347f6df63222fd6a419a8a72375552cee493193ac76b91ed2d574bf22b4b7b324df23ff4abea4be1a47c524229291f27aac7495b6d16846b7f6b33ed89731fcea73dad2c078d783d9b28d1cbd79e94b4c88a3e91e8e9149db49c79eae3e43d55a09596bbb2a68c962f9f097aaeac40dc5d73a642f4172325efd7296fa9104edf507d1a648654c81216192aa435519bc6949c7dba827425e9faf4bfafbf4bba52d6f77b348401f77bea9807cd2bda6fa97d45eb51e2be7e1552fbf78ebfa7f8cbb4354349592f2e77403994bd2772e6260f1097a3c2118a249aa216bd18e9229aa2b6f46bee5efb9a73ee386ebb37c7688a3a05c7781be3559e922fd6447daaef569725ef4f6fcaa1f2899089fabc7c94a72349c1efed13d04f1549d377a2827fafd8df2119bf39a8ff48e98cac217f5b4d414d6b640df9d48b2038ffcd8ff339383ce87f5e3ae9741ee73de53fae42a84790558b588fcc90c60b96972f55f7e5cb19d2cb97352c7fdf25a9b2a6a685d04f79d9877843266ffa5a1f82c031863ef48766293343f929785ba13f0ffa3c0e07b1602928096fab77656d14bd2b4b45efca8a4f264ace6891f91b1882a2a43f590a096510789970b5d90ce55795e7871bbd30d28512f9ca2bf7a307c2d018d482303156b0269ba1acac78a3c61b5357225a5697966f377fee3b8c4df451545272159a5651e1a4dec023a256c953685af42938ea0dcc217a51a6422b327dc403e5b99af2518bde5f844bafd5783cb50e99a19475f684bee8b7a6b1341196b3196a59725c7c45d1d75665d52195c59a28afa25a5f569590bb2b6b735425b3b802b651b1016ce8683f96c3fb653c823e25ef9128ef0b0a7de867a1dfdfc5e0d24ff908fa8b640dee1465392bc3ad9f92578840c00ca57c793c2d47798af21245634941f5cc2bf4e34b1d324d1225afd0cfd583f7d59d1e6e6551d8dd5a4ccbbfb8831b00c6abe6e6452527cbd70c7dc3d566f18bd1b35e1459595f71afac89d2b4fc3aa4a5e5579baa64a6e2173395c844452f8cc0d272a6a5ac345ad61a2f8610d1bb26d152be572a6713255f3e99a899072defca11fa01b3bad2663bb458518289de3143f90ec6ed9c78e180bfc07c042770939432f26766b4fc172f0f177cb54002919c94f1432c168738c0010e6f78031326530c5910a18b3fc4c10b69a0c9c18b8d11dc7ca0069e0b74306b8314bc40b2c54bc56207378864884213a490c50a0d375d90b088c1466b976f10ad300525a0610b4718c31e90accc6c1978c006900d2f29d379c19330e839279d3e9fd0408f74b401841e6eb0840b62c6e0843bd4a0010aee0627cac0c5ca0f7568b2871a781ba4919215fed0e42bb9c005252b00c2e62bb9c005a52f66cf810d13f905cd7451ca71d4ef1664fe4d3c5cca059b293fed2659b1416f928e1aad9b12641bed429d4a38f1da515d090e495725a5db0bb20de700ad82a6947ea8dd4c8f16c2087275f4220735a866f81822404b031071d2b2d483781399a886080912d3eae288112211c54517908a8e286d831cdd6d92761da5ff1d1780cad1fb437aff56d1fba5bb9452e621487739d96023013680b57c0e53fcde0363c1ced1e562f414a5b902cf5536703986d189d8125ff2463b9ed367e0506077f71e1823c1da57cd1225499050cad55a2bcd91a352666e86d20fd682210c241269a23aebd58f3beeba699074e1648d697f245dbe274997abbd7c4e7e12cc577ef9a50b49d698f33590f6f347234d43cf9faf2712319c4f0a22de00406c990188e1fcad1e40cf4722a262fc23b4bc8b28cdd772887621446c1b311d1ef1a525c15a315825255aa39ce1fc8dd2df356b5c2c5139d8578c29ceb93b67e802f75718715ea179446ab2760c57641bde00fff8257a048e9a3f62dbe211381a5083a30147bc8d1a2ebe9214715570f65a7bbaa6ab03f31ab80c228a72a18319b810adb166a8753e82301d1f5253e37057f146e464cb4d5aebfb828ce122608e38f1c61b6bfb1fe634e1e2cef7dfcf0c05d63df0cafcf8f27d07afcc6d09dfdbfa2a9ec7f3d60b57a5d3b91cca7b442f5f8a3c95100a77a5f678a28e48241289442a5ad451f1c25509559ce4863c3f5d5db82b3abcfadfe39828d9836b86025b6badb552e2172d4246e4a0bf50921b52815109855e8230a1eb0a038d8e5fe86805302cd1f7fd6a01fe1b0e5b4d9035c0fc8552882117b246c85925687f69a59767dcfd3d25979bfc47a37bb9df9e21b87cbf3d44d0be3d44b47b8c74f2f6cc68f71ce1b8a70bed4f6a9259ded6ae354327d2b9be191844fbcb97a322183a224650aa6de92b954098ff2d647cc5bb24e3bfd3b1010840004018fb5e0fba0a4310c67a9e746de00c04bfff66df13d0051e0163402133b0051ad1fefd4ce93533513b6cc9d26ba2e4bffef6e88b2795dfb8c9fb9bbdefb2f79dd0ca7b30b4f242cf5a8ee3fe1d8623e8d91a7e6108c2e4dde9743adee970d1f14e00bec8c5fd8a770f5a02bad29e79dc67793bc457c4fd1f22ff10204caeff9585e5ef7766b88aabbcca499b9f2743882a44fd381c0ef5aae765202f356ffb1f679d5c0e76b5e5f0aeff891e7c20dae29006147d32be97f17d2710e6e3c8f86448cfdaef0339f0e3ac17afb8f2bdce765cf7755dadffd5e7ea7b75d6bff93e0ebff89f24848a8c199dffee59fe7335c3131dbf8039d105d0f10b33c4680ee523dd4cd4bb66e8af8418facf80c91afe3396c81afe336e68c8f48c98aca184e844bb68e041fb2f9191c32dcc845990a1ff0c987409af8005edb0d08bd86285d80285d8e20fe2d075bdee0ba3206b845bc41af753ddfc2015d15b3e5cedb707c1404b4037202613c532c32367fc0ead3c1eec510da1aa0f4477517b202ff2e3f6daefd85ecb3eb4a8efc377787e7b4f06f2c2bdddc3b5d6c9b5ffdc73fe7b20dac3218d960ed39c6c02c32d0bcb9b662630a44bd49ac6102acdc212aa68935b8279e975832bf5d4a155e945228556a44df3df610b04c108c6645ad6dcb5664bcc172d3b0ce78e8c27a9ecb0e509a2fd45dba3ca786f4fb47cb083657c04bbac80f892a2ed04615696f0bcf64d785ecb4d74e0c31a37f92b11b3ad2cf1c47bbe8927de937f68b1437bcfffd8fe89dc84e73b907f68efc9df2cc6f8cd5ee5c5d530116e721b2a3a823666e8412ef7db868ede8ae76932af25334565e2174b42574d8c369384ee8b2563d03b54a2dd1382723968ffb83b23da1c3639ccec606466869cb7b2881b12b19ee7796ff1eee1e59048d8e2c28271e507e2769e0b1243d70c8d59bc11e38da843ab6f3651325e847768732fdeb57b19afc9f8ee7402617a9c4018afbabb4b7797eef6ab3d8139ea24694ec7f9c0b79db7204c07fc0f6fb07b0b76ff81303d7ca67dac34577fb66eed9ec33d7ca62da788db79108481e1fcc77dadb556aed6cad5daf94ff41df0ef573ca9ae3e54708c61cd2aacd0ca432b4fcd74078744443334a01154835390fa62a9b71568d2c7d03e08eaa05aeaaea484538281b9f472c2ed88d42674c0f95d1c3518ba603a2cdcadc20a6bc7829cefeb8436da3f9c098fb4bcc655e489077111cf5b0ed42a43260afc40f0e3743e0e17b7beedcc22dc1aba40245c8aefa7e034f7fe6372dff9b08c2d1df79c4e85354357193243afbf69c8f48cf63c11f5135886569c19df3f3469c616fb1c10867b02c717b0032ed1bd78f237cbc2dd2aac2be3e4d4d9024d7afb2008f36f3b325ee5f306a249ef2f0377200ce955582a43268a946958f01f99a17b7defb558fdd80cbfd913926ca22af7fde6b8fa1c0feebd6f36432e3bc75d926c86a418a9c90c9d03a418a909493684f54a5ecda06a861eb6f6a56cb8379e0aad7e269afc475cd03fc3711bc723e35971be0882e0db3c70956b4d54e7a3f6a83c329ecf23c4c3eab027a6833d413c2b8f8c478887e551852d95ff401815f08a3ce18c9b5cc3a1cba27c11ece46dc54c77dee6c16ebad2de5bcb558e26ac99a8ee3d6c4dd4d4336c4d54bc13f5854726eade0e874666e81fba381cceccf0c80c699edc1d5a790ffe05613ab9075d69ce7fb3a9002d09206e68e52607b1e038431169ae54385600f1ede823dd90dcf042627c164b31557a8aab39afbd3c457a4dd3cd44916e66e8868822b92186f3a5fdb71613225d5ec815a2fd3b96747996ace13f44ba5821d2a5f4624997aef5433caa6ec815a29f35447bd7596bed73dd77d9d65abf83ab18e9ceb78030d55afb2d5783382cc24bba7c4bbad42fbda4cb130989d0754426aad3922e177c4b44bad8f79fb144badc3c8389ac71235d6c9e11ebf21301992cd19e636c89855308871016212c8243d70c43288434da9f0b8f8433da7f0693300a3adc42fb77a17d874cd0bec5167ffb87bb3d2ad0171135a309c866c61d3caad22b08d2f383e832c389acb159b2902e33663df0f820de50f90df2e0c02383e832e389ace11305be771ed567f58c26135552cdf00e11557a410c7d8613e9525ac91a329ec589f69f317b5252cdd20b589e34d3a4fffca4b4922ea5214164ac58483398489752901931e952029968f79f5cdc70b3e85d729590106bf87bb8a48418fa3f2e2d21b6f8cbb0420da8ce1cd1fe245c0a52f242cb94a0a0fd91687f3088f69214b4bf95c934e410512521338cc51bf64b3cf02459a2b8df2115b47f2885e8521ac2124221de104521de50e142ba945a46c22d3e4442742911d9e28def3d04800f85f86db52bdec8ef2f36e3a8e990ebbd1452ef924b672cf5f6118cd9ba2f0921bd7f890747d033be3484e5fd4b2d19ef5f22f2ef1f4d43643c005a5a881211f978877010f241a808a1248cc0a05de506f1461dbd628b3f87434790a1bf0a0e1121b6f88b706808b1c5bf83434088a13f07877a105bfc2f0eb1628bff874332b1c5bfc3a1202121dadf619dbfbe5910daa170ed975e1ed5446129a897c35618ee2ebd4aaf89b2defb9794a85edce6a583d05e10dadf03ef0d898456738b1a9fa7e71677872dffb095b58d08b8f18b26d8e8f8c591257a081dbf38d244874388e1125eae2f5a56604141660bcf0a09da3b5d330d596cf16ad4f0be0aeff7ffd837059a8643eb87bbbb9647d5d1784a04efdfb5e28dfa2bf8dd51c197eccbefd7bfc3df3640359ee2c0fb7b541f787f8f8ca740f0fe9e96a742f0fe9e1acf0d8a0aa58582f2517d5a9f9acf8da758f0fe2095a7ac787f50cb533ede7fe43df27c157987db46077e1341c5ef687381dff1b5234c8adf31b6a36cc7d9097ecbd596325bb276fc96ae2d6720f05bd294e0b7b431e2b77c6d09e3f15bc6b6946d39db733565f664ede9da73664f9a3d6df67ced09db33b6a76ccfd9f6d57699edacedaeed333eb05b819d05784e81270af08c024f1360790305963db0dc5892008f008700bf9be483007f0073007b8d9ba406b005b0fc0a6027b09c00964a6089847c07601d980138ba7c1e38bafc08e0e8b20438ba494a009f00473765404a81a34b49058e6eeac01358e2d2cbab7815e49756c1af20ef8ede2502cc2dae8e4286f1cd401a4f19f1fe9c96a74af01778ffabf2d414ef0faa3c3582f7075b9e22c1fb83359edaef0fde788ac7fb83324f41e0fd392a4ff5787f8ecb533bde9f53e32928de4df0fe1d95a74ef0fe9d96a7a278ff4e8da7a478ffcecb531d78ffce8da750f030bf808f9e6ac01be0a3a718f00af8e8a92372fc878403bef3d1533a3e011f3d15817fc023e0459fc4bb7cf4940498f81b1f3d458167f9e8a92626f0457cf49405fe3f7aaa022fe389f8e8a90cfc8c8f9ec2c0e78f9ee2c003e0a3a736f0427cf494063ef5d1531e78d3474f3df1a88f9e0ac19f3e7a0a044fe3a3a73ef007f8b9c5f5a8dce4af82bc3b29c855e4cd690fa6e23d2ae77e77a8c0db8b951f15b8bed8f95181b517eb1f1598be58fa5181fdc56a1f1578bed8fa5181e58be536aee314d1ded3692a707c095ba1ebc3190f69fc3d185c6d18544d812f0af0950277a2c09d13e08e0970070acc2901e6f4c01c1e98b33148020c8e0083346ef21701064380a39b0af020c01fc0d14d03780fe0e8261bdf011cdd54e39fc0d14d02780ee00de0e8a6d36b004737d1f80c600ce00be0e8a6f02d802b80a39b00f04ee0e826219e02b889193f011cdd947f87047074d33f1338ba49c62f81a39b827825707413cb27812300011cdd14e31f8091c0d14da37700d6818fc039b0111806370033e0056b8c037f33d7f0e70bc0fb2a00ef4f00de204cfb23006f70a6fd5df0e6b0b4ff0dbc3934dabf08bc3930ed4f04de9c99f64fe1dda1d1fe28bc3b30ed7f00bc3b33ed6f00bc4705c0db5d04c0db670680b7d3d8c0db57db650480b7b35af09eb113de534603ef391b02ef6963c27bbe42bc276cbae68c10784f9a12de733503ef2993f19e2c8cb78cc9e4cc86056ff99230d78c0ade926625c25bca48560ade3186779485f08e3310ded146ef6f163f78877a7f331bfb9b49d1e91db6a49028d8c39b061e6af437f3d4c6e95d44fb225be6dc34e700be4d7577583f6c4d945ca2ad8d4fcb5c03717768350bad42413a9796f2394f795e6a6efbaed502c2c8fa5dcb53ad0d6b78a3696d48b47cdf92e8acb91a2df1f61b02d818238e393f4fcc34d56c675add234e85e5267fd9b554589e227177a4c2da5d99d44a6981043269108180c31218fa11165be8db3d5c9af7149dd69efa9c73cee94e7d7b0d9f62e24935c349ff8485ac41e937c3588698947ca1a7d569a54f3427d569755a79616dece1b01f709470e75b87794abe44bf99a98d49ac896cfb6ca3aacd0979a2a5a042f4cc7435c31904bab2b24fc6e9b0bd62583e5caf2179cc53bfe5ed4eb4fc4d7299c7dc24bbee3dcf9bf381bc44ff39dff3e6fc6906f212f3debe7bbb870b82d93ab9e047bc81366ed176dd9bc0f0603aae8b7b93e9f81e9ba8e8bfd16f427b9a7f68b1c39ffe8ff95a8ddf04fde14f63fca13de6709dc3d5f2ca8ef9796bb9296eb099579a981388139e37989be2cfbcbddc147f7b49d7bed8a20a55d8620b6d464da3b572f4db36d2ff083402912ec7711f4755a5307cd2934a2e8b231dbf19469f73cef719bf185cf9df05411046aa60667bbde41c7d676e71f7d5314a50a73302913a608e7b3d1e1414693f281fcffd7c3e9f8f8a8c26d858a26feb104b54c628ec146461e829fca5761089d17c3b6fa7f3c4e9ed74aee759cf7652f4dfc7797fcbc1e07f1cf77db26b7592aba0f5be0773642d73d79addc8e12aa77215b49e673d8fb3f503bb5b5dabd6f338cb711ff7d5ca792888f53c5b6b4724c4ea8c8456e111ebd5262f4e288810ee9b71baea3da756dcb9ba96778b687f1953612b86458831a2b4d2cb539e98596f4d6c31d9ce7745afc28447eb709560c59773dcbdde1a41e540bcc1e115efeb2fbbd6fc78707768554346264adadf17645d3347b4cb5017a11a1d42c2659016e524da1f9ca11197d3dd5917a59432929a4c2d1771b955b7f26474cef7e47b02c6689754bcd4177819f3eaa93f324dde8576d9cfec40e51cf7e98013a345e7a7e0b4145370fabe47c30fd1c5fef78930f71eaefa721d07729a0acb7d4635873bd96f623c16072035d71dec37b145fec55570205ea2e55b4783966e062c75a7c345569cdfc0628bfc4fa6be54c1dbd1a077d83ac9e8d212ed9f0eeeeea4d7d8ef8e78301aedfb84d49752765276db67f120251329abac4b4a373394d55aaa5c0d694aaf924746e7e0d6f7184fcc97c5adff7d4f5a723343102cb6f873fe996ed7e1ee7b1665d0bebe1f0eaeb55c57a7e874c76d4f66283915e8c653315a6495f7072d9982d333de1f04bb51c5d59c07c083cc105d38ef99854588c72a5f71d51c2eaecad797a1f2f6036164c850796732c3efab3799e1a7c5d8b5beff54b0378961ce1e8be1f71e1ce3b23880ef5fd002d58be7ad3ff6d80c5c05a765646712c36f6a19d899c496ef39ee06fdbdb321d6f8de6a8f8b689f719115f7a2bd4af6989bbeef6ddd387e135be2740df476f744a5f1040e5b20f85dd769db13afbd967d68ff842dbd4a4a3ab0f42a2959a95b5ea9f99be8407e22fb8d9bbedff2f75a067f7b4ce67e1fd8e9749b93194a00e00d4283f617820666b92413dedf379b6149c9bcc06643851deede6a72f4940c0e28a594df04318a5359c3b83b6c79545a27a58d0e08239fd4e06e57dc1d5ac5c15ffac9951c2ec0f7220853021ee073de7abe22ae7d0f08d3c303c278ee88cc10c49c8f060be9a3e861618bc69393ea143351376bb9d3e96cdb6b9ad675f776eed5fec60382cf824978735a9443239b0cc432fe7b74327257c4adb5c375b80eadd17513a1ab67aff56eced75a39e3e47079852be2d6e7b0b4914966e8455c226ce85a6bad28e0d59ee77928204ce5be5a6bf56aad5ead5f0f9fc1709e67dff378aaf492267f8e9378b896ae844409be973d07d7b33e93204cf5dea3f2c0ef3d2b4f4c162bd0dd2b7eade1509069b2d9a3614fcc34d95c44cb56be9741556c9993f3dd9ab0c585e16250779d184b889021b11a1414141a9afb6d37292f88969ed7637b71ab1972325afad86edc247f2be27a55f0c2164c11295d3a32999f511ebe8f9343078c9db7a00f0f524aeb59cf0b5bf5432247429a6931497e9f0d2e0ff99a4e42d3529e5658c81aa09511c451aff070f7c925dfe2fa5ead6fbd062a272c4eaa53cc69654f589c54a798d32a06085355544eaa13162310a68a9eb0fc4925fa538c74895a74025fe54473529db0a0aa29ba131627d5090bf059f0e654b306ae7932729ae14ea72e6aeac9e6a544e5f76989f63fdd9c98a87cd42cbf4f4dbcdf9e9c54272c524e2b6df113efab4acb8f1d8b49ef61958f20cb77fe0b7279d4d7f40e5b9d19ce4c1438844a83443adf79ffd004864bcbee3ec968f7dede97bfe5d866333b3f0fd7af99f3d67b2e0a37cdbe2154da7b6badfd3c6df3fcb2c5f54df64d4f86a8cf02c2541c6e71fd0f736685a91cee7418fc4d36519d2ce34db3ee4d4fa44bd4dd10aa89ea1e7cd28cb63682bed59af71454d71e5e68c5c178d9349ba1f71504c3e11e061f7c19786f4e40371e150dee49e62484e5717e9f5ada4f444e2ece3ecdd07461bbdf2724279b539295eea316fd3e6d3210540161c08a379908f4b20a7cccd03f098b658c6a03d1df0cae67c12faf2ca1fdf63bb4dfb20f2d3e307f59cb405eacf735c80c5dae66e89f0caecc94426470bb99aea66b496f937547b473fc9d6879232bbdac2cbd4a4a26ea3eacf42ac5b47bdb8c965fb796a756763ce1c3f34fe4ad15b63a17ee8cccb09bd1fe2c5debe2aed5757ff10602135aadeef6a8ee7b1fb66cf7715f3681216b748fc3e3134fc53f917f68b163fb0efc0fed9ff89a7f6cdf815f5942fb27de02da3f912db07d07727453d8e270ee7fb845e3c5a321db62dae5a947dd4ec47293d7395c4f04c574547da341304f8cedc305a26368557ad58a3b2bfdf82e01616eb43f0a4c89fb72d39319822a50f5cd3637fb627051402382d03633f424fae5a9951dda4a13db0f8f96b797076fb8463b8d184aafd2cbf33cd00d8ef9349e8a2fff2abd32e806f6c5e06e87d55a6b04a57c5bf1856d713b14ed3787bd5ed74623d13756007df0fd06772024075a880ec01a8038d0fe1bcc427bcf0a32e405da3f6e14bdbf1918d3e50dae48bf41196cf08a7f096a379a1bb41815248afb4e88ace11f4e4177dd10f0bbb0f5cdbc762365b0483372ce9f3daa556cf1f7b027c8f4c87870105b74103d2ad8e3034f1024c826b6f8731ec75923a21b9b360cf9505515b61b9b36ac81b39e47a57203ed3e07bd3f8d056f8f0cb6270bcf0f405f68d0173ff064e151fd06e5c9c5ad0f0291d8e23063b0e81db6666426a44076a498ace13f236bf87742c22433f4f0a5fda5cd9c3384c1844b5c4948031376111e891ad5349f52e338f67338135b7ec897d0d511e267dc7b4931498afdcc97ce20c36c06ed5f928328ef183a73f2f6e8fcfea5262537c4521ce28d58bc8186585a43bc41faeefd4b61902532c41bfffea5324454fd9b37890e797f74fe5d6a83a69921136207875dcc1049d88518fa0b81c325008045199d3323874a66d815d9f2e398555ccdbd0c5cc5a88a91f69ef4314e29c83b34f2564e2eee0f8ee338102874ad400afb230731a4e144abc8cc90061eb401f2a6210bb320c32b441712121a398c827421d9845608bd883754bae0b89092c81ae07700c83b9c821079874766e4900939abc8a8e480142321912e2f8464235d9e454a225d7e080909c9869444fbdbd148e547208c8abbbb7477e95e6b65f98a1fb43abe55912ca212cc63f9dd637b79b8042bbda270ed4fedd5126c2f5d495f52e2f22917512a2fff8b28cecbdf5ef186a7e58b3a2d6dfd03613e18dc077f0b4e10418030418030a2df42e5af8cc94594d3dd9d52aa699a26a7cc5c8c31da4dd21a0b5b3f03855a613394afc53c2555758615365135b48a371c546927c5acada55b67116ee7379089f8e27175335d776486a6033d46bc9919ba0f297bf8cc63c473e42be27a6866786486eee96286d6e3929cc49e184357e9d505b9f6a5cbbca2f4fa8ab89e986de5e5c82175fd1caebdb75cdcb84f2b24f8374198aeebfcc697c042978d6d29a594554a59a5f4ac77733729b64317129210ceec90c66b9cd848b12fe66a2aac58105a8535c33987faa896122ee7aa5f3f2412baea872da977d80a89cc30744d94fcbe7e98f25efc4f9e962f33c41b5efe4a3357e62597b4dff782ab4dbde27d12ed48a6c97f7f53d7ff9ecc9473df0ca63d7cc40366e8a9d04a0cdf0283f69ab98fd2a5be8c82762a8455d0fe3bd4021748bfc32f844a7e875b089f106b3021864b28124de1114222c8d01fcc9ba477f8e5100a990bed1f1299285f32439f8547360cf3265c18aec338aeb31f78393466ef7a2578336075c612d18c1b1511e776e0c7d91930af7e2eb8bb6b7db1d8f20aad422b8739cc5fa75519f4fe66af30c0aed5bd741c0c77872d9b96c765d5d08a375254d30ffa05349e4c30a4f91d76d1fd0e6bb020fa1d7ee105ed346627950e83f6b00bda575cd01e22d1fe91f4318652a0118b2dfea51734d134e440ca3bf4820a328442ace18a2d01405e64def5374e8bda9cdb7fe087341adc4c331318926e316c403ab6dce42f8970021fe1293ae33b264a565d7f6a7446d34e696c74c4943c62461b256248c41b0f9828673243f9fe3a5c4744c918cea9c41147e4c9a926aa06e16256dd9c154bbdc9599bdce8264e455f1bc51bdc15b125a63817c81ed8c842fb6f133703edbff1be9c6afee6541cbdd14dfe9fca5b3081488d230694ed53398ee37858ca71b57a14ae37b73fc5e4a6b6ef6e2d0436bce549c5bd26b9bce50722e1e92dbf0573709e8bf2b73fc55029370ec719469f51203ee426bf9e84e84d310fef5ba0e566816c747b7ae241dfb3272ca44b7d6ecace4b8aca95be3745e7e5156fb3326f1ddbcb24b6977faaf26be6a4740ecc8162df43e1b6da8139b6e751378ee336148d86524a29cdf2293ec5c81afe1eacfdc5df7730f838dc3f975f5ffefc38329f5433742bebc4ac6cfb6cdb72a7796cbfbd44a23ecd7a567cc242d69079c57bff4e4c4ff95374bad2a779ff360371c47486272c4e5868208ce679525a2d29f5999ba6fb534a95681df5c3c1e5a8ea37acfd57205ae2a8ab664faa1316d2457e547e6e3607a92c87079ee3fb88a052a9543434303636f7ba6c6cee6571f366ce4d083696b60d4da5534e7328cdfb988718bdfea573345172e37ea2bca7f4bb49a9bf7c0f7fdc57efe4e20cb9cdd9a0838d25fa938beb6fe36fb7d151daf9b9a5dfc49bb6db3731a76df7c5b75dd7718a68ad6d3215fcbdc97896ae8c901ac5c947c806e6901ac54987228b2d9d979bfc7037a7e3e2c0e28df9fe1c99a778bc8d1fbf3b3e7e731a8603e3c03a326ef2e7c0e28d8d052907bc47f11b50c1fb73a1a74af0fe478c40059e5ae2fde5ca89f7973632365754bc57f1fe1336639e4ac13b03887841f184407a84632586047e010ab8c0e304941010800ffc101d10c1b78060bf8d8f9e22c1d7f8e8a9117c113fb7b8fe1d194f7d5c3ff2eef8c82cc056fcc775efc7757f77fc272eb282b75658618515565861456541a7adc0f1e553e3a96ae3a915bc3e307f16e0eb26ff15604e05d85380bd0aec54b84f95bc9135b225551cc0f138ba29f524c023c022c0d14d063802e7c0466018dc00ec267f755c9eaaeff18501f8056b8c032f006fd99235f266aa66cdbc71d5c85d3ee334be9261cdd894cd69f382b9666856322c199b81b79c499b17cc3543b39251c13bc6a22cdabc768479f0fdd468ff0e07e60f7a2f77a23f4134ca6c7f58daf3bfb8cd87082009688104e2da1d838d251b63ec64898b2d32827208beb17cc6696a6eb8d8958de6ec55be2242c6c5cd5c9a51cddbc4ab1aad5e2664ddb88986abb936a3d7c3c29b988d99d0f5ad11ebca6cb9b2e15e1736baf958dcf3350b89781b23b79a7c71b07b338abd4c86c56ab55cae99191a9a1aaf719b9b9b584ca66374958eb1e572cdccd0bc6231c618638cb31865b398ec2606bbb189352f4478ea868bdd291b11e12a2234bc89d85e4e305b2e8e26ca6aa2cc26ca649a46597d912e4fc93839bbaad1ea6534e9d25ee48da7686e5ef206266f6ee48d7e992c4fa9b8d59519b1be154ad77c794a662316fa7c5d6e747f14be739c2d17a9d95d6a030023d6e16aeff58988372a105bfcfd8b88290be0e135872f626c83f68952f9620b4f9c007b700d30c30f8b8c2495bf42b31153d3770245e6034ab413e144c7f86b4b958e363760c2a277bc99d5c85ce14fa7b4b10da0fdfd11e0360c4077200369df71eeee7bb8dea30474b5b2b2e23f412392c46db4a580737439798f66deef9c24dccdc653df6b323769a01bed9ee264cfdb659a8d6fe917c3f241c944699f249f97cb3a324f89ee7744b8237393f6f97c2814aa405ee6f7f6777c6fed7f5ede21faefbfece37b518e9ded434d33131821984fa4f6bff9b9779c4c14f8da77661d0e87c301435e28452a11237a19a2fc438b1ddf8bfe87cd2bdedb0fe28390917f7c79c5cb2b4b04f1f69b08227f1322d173fe03822007dc385ba888c82e315f44d9630efbf408cf15eb760f9b0cac1f8e25e31e698d634941c1cf26db649b13958c6fb24de6614dc6f97c3e1a7599cbdc89cffcc944c9b74eae970282291c8eff9c9e874173fa744d93a9ae8ce5606e865ac78916a3b595d6de7d1a01e6dd793b67e7e7e428e1c6c8b166b097174c6b1f7369edc3b5609c14bc81e8944f92197e5e33d43e36b1457bbb87eb79f9c3c1f57e77a6c7017d3e20cee3f094fb79c55019bdf69f242496d7fe63136fccd7561ee53f5f449795e8f63defb21878f41357cd82abe0f47cd2e82d07c290321177441afdc4ce043c22ea51f62633d43ef0ed087c0d7c6d62aa472a31c0b7a07deb31b0c75848e0c45393c05f016791ef55465ff618084e30be7cd86fb0cc057f7764fe9ff96920ccca12a2ff7e87284737e51d7ee326f0bdff7038d93ab99c077fce3dfff3a1f9293e71d429a10fd87db8a0b5d89d20cc96fa3e52d3d52690dd3e8b87fbdb56d50527e73bb289f2de2ad1db651f1bad71b214546f2bdb9f9739163764a2fcb5e75c1ccd44adcccd19f93c0cc2574b2bd38474649b9ba1f6a0196a1f1b1cdd34f7e7a5b58e6c869a95c9b4f656669d7caa899af3b5ff64266a6572202bd3da7b747be666384118e7b6a9c9865082a85a4e8df67726df03f1a1d921827c98c7e659ab7d43a8ac872398c4f6f5435bca37844a6fdfd4294f35ba7dca97354a53529efe7698a6daa798669fe7528e664aed7f600eeebf8f1345e9574a3f0bc2584ff631bc5df306c4c747eb7f7b88205bc5dbf597622bde5457fadb36448ca63625f3d8be630243bad8a7b37ebee64fde536f43a834fd9aa5eed4d046539a796cdfa13623d1a179a5f3da4bcf7b69fae87fd96af60373889e661ef453de8aace7d12ab2d57aa2efaaf5aca595be88624d77aaee508a694a3681619f037354faf3bec50fc2e07f30c754bdad7a99c76fdaa33ce7a9f92899ea8dbecd3d1c56dffe27356ae767b1fdcd62594bfb9bc0d8a18dee640e17f77bed3b1badfdf665cbe9cf9f0362dac3612630bed340988ec30ea35a7c4e8d8e33400f6561a3578d6a750bb26209d13859ac1dd5364fabb4569fb2c6ed8b5ce7d9ed8b9d67ed17bfee888eefcd78d66b74f42e74f4968e91c99399af3c26c6e4661a4152f34a3267a691e9723283ccd5644d213327b22e94bc6e96d474412363e410c9a244745c49554c326fa6d32631268936a0f8339c4e848e4f0db04739a48e529e90d823a2b69d151df2e3e7909f394db82b48489009399998ee4c38a59409aa699ac684566bad9589ba6ddbb66d4c6c2ff46dc759cebab999aee992c96868a44aaaa28d96dccc9c2c2e13dc0b7ddbe9f93e73119a2538730ecf71aee8f09f2f35103db921a43f5cff3a51d373adb5827fb8b435511f2cfa8f2b82b4c6e52990cb4d93f3806a463d380d5f355ca9b53d627d666e02a9402e4fcd4ee7431904aac1f16505fba0cff2588b1df449d907e9e9b3601f2bcff220158bb445dcd190967c995c8c58339c21ed6b40aad832df834131339c1fc22012ee5097a7a6ccadef3fb5df1f4bbeb0bcf54f824ab0d099a7587e86aaa7a6d49a8eac33f314e9a7ca287b2a7c4ede2c8ee5a9cbb1421ceb8359b2963f1f036fd04a7f2c900af4b1386d84285322339c93d31ea42c4f8d48926aa589d234aae1aa7df28e91f7e73b1f0ce251513e9fbc3718f02b1232ea8ea6691cd73d058dd0a1e113d095e646acd110ce8398a3bd487bcfe7f3577b8fb6693f6a793ec6d7af200444af7d525ee56b1eb13cafe5518bc709b4cce3f3f53fdfd181f25adeda27870c4383fef31d50d6bef338fc833fbfbd035222f0c99def5efb0f0e2111fafa282879057cade215106505cca0ff3cca83f0b642dba0f73e1fc123a44ea91fca1c2e6ecd9ff29fcc23e5c1cce3fe474bc934531009ffcf3ba8e3e618234fe15af4f53f79ab643acaf52708010f0444d983770b40ff79fbc13abcefe3699d07fd27d319e6fdc3d3409fef6875c41ab5266a6a4f276a8a161eb1b4dfa3d19019ced736003ea7490493f0380ec270de93379014cce122f4383ce54318f41e7c53702814ca7b7b941c757c4010e83e1f03e563709880b251004487bef39c078172e839bf3f56c71f04ff93f2287873321ae54120cfc7e070e17914cc61c2a52bedc92828bf3f47c19c0fe1a8eda78040b90aa93b1fdade3f0feaf83cf846804020d07f3e9fcf07df07811bfc4e18faf3f90ee6e0e07e3e46801e456fcf7f8f22c3e0e0e0ee14c8f4dede03fefd6d03e1e0a87138885110db2990e9ed3dbcad98e9ed47ac215256217584b4ff06e3ff4d141474a5b59fcf5d4e47907aa9bba8d4ccd3c6992065886600000000005314002030140c070583c18048a627922a1f14800c8eb05674561e69490e53c818430c10001000000000800010540086610e35d2c4e3eb640ee6295a5c6bb3308487a5cdce1213d734f3ccfa695ea098279de442dc32ee0831b2bc949ca40b8e2b8d1ffe596f9630f487f3dd0dfd18941c1b86e4126d61309143d334b42145060f188ca962259e33d0998924c44b15023a103f6d26107a28f362f284cd746c8d7f160c36f03cd73b2638984b86871fa2507e7a172f5a9df842699d200952607e61ce9ead78db43166a342c86340c04556bdf0f3d8eac6ca0edc0b75b9539b749da486365c106c2e40445dba7409944e40aaea1eb7093dce5d58ace6a7a1f7b5521aede55be9d86155bef51bf51071313d36726f911a00aa8e1c04dd04421b6e9dad10cf8d39e0dace1172d2beb819cc4322dc0bf6e051bf80acd3e1e1257c537c9e7f27bd4d37daa8655d2b8aab70ab62a7b5b9acf0a6df412b04f9e84995a6e18c1e6ee3a51cf29188160405b3e79dd6340fa00dbf218a2feb52b370467d5dee3abb585af35b3fdb4b4345fed718fd62bc007f7cde8a85d720a5d982d76402b89604a512fecd5b9c81f8653b12a3a6604c993a155467ad7171072e762424b13616b845f5ea58fadff43598184469a5eb5775219b9e9691a514c52572ff339d5a4aa04083fca0d27af1d4a777bfb147fd0d71a44ee7ad0eb5325d8646ca47d9396087880e515eb1d9ecc3d060137dcb32afa7fb9102eaa61890edd31c37accf158343af6e4e761bd0c3f5c67a5bbee884b3d18f2992f04976ec84e25e8cf042029712c9ecb6ad956a30141be331480cae443898e4c1f8b14487564b8d8d4eebad549cdf0dc77ae3df0def53647239cb2e4dd2d1f66d448e607029c77412f957c00240a7b233305c76ca8a0f4bb7e39d90537877932609fbf27307c4409fbaaf13feafd54d845af62fd1ce07e58641416e076fd98a99651d0cba26c8a7153d6b016f0376a77597690c3a50962ecbdf77712c6cd71ce01ed554670fb20e53bf9dc0da12e4f5d86d194a25ecdc68e17139c21faf9b2a935bee8a64168089b4e33c35735d2c83136b3aee9328e62914a3b2e0bc4446b0c5f245efa8b5a6c973411c6624f23ef2c62e258797e5dd68c195dfa6c4bd5d5581720b01061ff40c5c580de113e5ee1238a6128a474943cbbc26f4f528701c8cb62bcb9996cb528db88af90ad9cc939e5d7f1de25f37de3886f80914e611799f8a30167ba9b3154d76d10b40123f4f7b0548542883a54bcd5f858b2990ccd4f1c9431e1d71d0cf3100b73dc8fd7472e6fba6910f9f35a6f038249a622bee79907dbfd10cb36863e536c464266676767354ed5f4de4fd2722439600d3df1669bd51043d8bae630aa2097d87b3b336d484157ff06c41183c408200c8e4b348704b11513ba2a61c662ddbe3f0e416fa69e31cb4321e37a0201e778fa927b4c607d75ccc0c3a44f24d6beb2d44f983e57c8e62de8f5b6f87ec9d244cd06501271d501f2eadd5aa7993e7a2da87e091f4e50f3fe16574903bd3a377a832701f9e28d4fbfe2a3564ccffe06a822006fd4d6c9877af03beafcbd3f89cd7c2b498a78e61facadd74e92200262ddbfc0ca3414e10765931c98eb4afc925650c4d62d9b7d73020114b432df005c573a5fc516cefd486920ebc19918afb0cb35da35da3e0064ac03e38a2d3588ee9da78a0620c4655f6cfd199a35805fc723b6f46580c16f724c6e808bb3b51cdb6cbbc1ddb5fcd7c7a0caf4e0971635e0b01648a40afb0fb042d96413800fed40a6adff225dfa840fef996e4040c302a1d6f4ebfd3daac3accaa2fb5185487f9cff1dbb42cafae1c0960d11bb60a4e92a38db2328b4edc75348a71974eadc17408ec33d5594f8030dd57ab9d74b2b49738ab2612aaa7b8180c405bcb8663e4a7ef8613120d0961a7d02211fed685f12f09e5b06029cb39d21ca64931acac398e5f0eb30f00d81bf9626e2fb312c003b8b4bb73cfa5c974bbb9b4908206eb78bb5986f6e083c5394310d402d47d3199c179d200e873d5881f8965f634203ec683aeaf7d0286b3a104877861fdd4b991788797e729b9a361bbbbce35841431c0caf320dd4e1bc799fd4941c852f8b1e43905396c7cbf1e3b56087426b8d221a97e8eb4cb189c5984b346ac9afd2fa8d9dc839e3181c0fc6cb33d911485982712e108981c1db7f47d85710ee56507b7cf265ec0fcac3c9ca789019e82d14ef239fc41e1d502758da3f59b87f12132d9d64913b4c0eb4fea13da44360f64351548b4f9c5306da18cfb13fffb1e4dc316bb863c1d7314ebb63c0bb63fdb163b3ae631255c7e2eb8ed178c76aac8ecb54b8ed6ac43f08e83b6845fc83809c83b4f7876d12897f5ce44dbfb36dfd18acee8f8aa1f7d6302d5e798e948c31adc04671cafb030b28facb3e66aef7d48df7a71e788f0a4249806b4cd1b77064cecd3d21f377388407375a93aa837c20c7c2ae79fef43f7f5880feb0a64d40f80134adcdddd594cbd29fcc58dc7fb66fbcbb05437b1a482eac9a4d181df8b90ed16f7ca7f8375adcbc549ea3dc6526637ffe4ca8f10792675dbdc810f2273964bf3af2a711e50f1f983f2c397f7807fde122fde129ea0f8bac3fdc607f18d1fef088fbc395f78735f00f53e21ffe907ff830fff0a17f5837a83bbe9c1568ee9f50c07fa292ff8446ff09c2fe130ffc4f0cf43f11fe4ff05d260b0200dd2ecdaca500624202c43771c78a08c84107e41f7b9f17990c0524ba1a815533c6d00752644ebb1a315fbbf1f8b6d76a223d5b429b741a2f719e08fd3311b07a28b34f47a26cab41222a5b906aaafbe3a8a4930b8e12d4da21e62dec77ba75b48c2c01ca78f763eadda5ed4d747f9186dcba0b63532cde9c958c0075f76f5c48238f9cb5af39fe19a0ca787fac8880040d18107e002b0360c60f9a01ae13195a29c70ed9c69708e7adb92f8ea1d97713110014a069d02263e01fda7f90360c19df0a02fcd6db94db8fc1b371a013507deda3a2c0e0a6cb9cdb6b547d50b49745d9a41cdb0c3b3be54ea672c36e4266fd2c81ed3ac690026bb672f915cbecf420d6f25c6f1d206b7284b3ad7cf6f858edb1b8c7028e9ca341cc932a9c5b2ef034a159dcb9d6f19f86f0f3d950cb69c74b66e5579e3bff04fab3da348d58e084233ac176f040d611ded2621ba9b2299203c0f5737f8515705dbcfa6ec0aafc6d4f4a5b2005bcd62e14b699f849ccba1afb9301f4d0fb20a6f670b20588000f80128f182218c66910395124d859e3abd6e275d43b7a8480b81af2359466d0a44d15c63a5b6733c8cbdc585ae24b8f23e37263691697477bf7ee48c81f316ae2dc6a89ed4ffd26ad8d829b70bfebe02fd750e8e6d2a805b05b9c41d2598f7a1361e1e7d0ff8b9812f6d6ed7f220c5ee907a15fb44ab84c5e1c1d47d50a8e6abc0206cd5c80ef117766b23dc5e240e337ccaff668d42d89c1a3a6f1d0dc7d506a863c8cf20cd0a5c2dacf34e0902f4bb2097494fea95906eae2b228e78196ae4a702ea4a244bd79fb2f447a83b54a827567d1494f6dd052c9dc6178b4feb3df009b16f30a3a3da69622e341c45a7c19d1770ba741cce978300a1af973179e7cdacb7db00cb6b4898205abe007d92bba07c2d98d020edec90ebdc9ecf1ddc86be658f13b76abb3be5bec0745ef670c19034fc52e69496e6dffda9faaba2e075d96c91c9d13a0da6be00f595edca7a0fa550bd5d46bd7f0d343620ae3b3b2c3535580cb21871e3dcacecfa58a9452f36e536ee70fbe56e17eb49eeee44fa364bb90ddb7a8b02bff64b674265356399d0e606918493561ddf527656caca2d2e8f10ce05fa0261cf8f4c2831b3bd6c02cd1c7ca47f2d1b37b0bbce31ba34ee345a0a2413f9edd280f0e08218e6430905551957da5e455a245d6c8f8aa25ac139dd0b864488d181a0f39a2c8a012ef4a792de64d118ca4b7a368f5e85f3288782934d5ab48a5a190005734810c23784341f1096d8fbf93304961e4fec26f3843e0185a38f2fdd83f8231c06e17aa9a6eab3e4636832ccfcfa2a8a2591f28de052718d746c1680f95bfbd1c22c2340690a6bf600eb59d13bc41030f2e9ec6e5125ecb344ccfa340872a4af2c40682b7788cfa45c567367b83e3552a2dacca52b5d0679b3bb8625a4db240d57f99775d6065714104af32c17c28a299eb191de7dff092797f50c33fec61b1202e2ebd3846af27adacc7a891a2daaf8ac1874064a2f6d4e163925f514a5830f549518c92c829357bd5856c60bee9330894977b711a92cbd9c2476952ad665b063612c7e37d606ca408e884d1aca118fe791dea3e29233e30a26a1848697c64ec26a2a04342cc1f061022660464168212ae40f713b680ad8734dc0751ec8d59d4c02e7ae0292ad3644bdc2c880fd4c188911cd48e7ab936d96094f68da68319532afe5649464d7d7b5c3b5b088ea24511413a6b2c131b6443dfafc4fe90196327115166e867b2f7659934c84c144f631ccf0efe8a0b3fd3f937fb55a476b3eed61792e0a83f2d6eea3b9024d7796adad815a9cc5c29b69ab6e8a7fabf1fc695d04387651926542560f25d08d47e5cc1efcc0d161fca551c127ec6daeb366ce49a722ead951b68ef3a591f9fd31486aa8e84f5c0aecb826642dc48709e34c1a345c05288a0be7e9aa04b174c002c4179ee76c712b19b870fcf7bd9092c590a2f7bdcf09d225340b5816f29ec83e22cc230009d808e3dfee7e6b8810f02164cf4dd85075b790828c43a8cd77988dfacce6f69e468c40de7aea9a23d4f7809694a32bdfb4fba184cb2ed857cfef5950974d1807e15bd079eff70c380a1632abc1ee4fbf39d1d06de748646856ff779b840e0c7c71211be01b31708c0ae4f406b1c02b3652ca52cf983d6e24f79eb2118d3594bc84df8dcb14fd51d5b2a33d88d82ac1b0c218ee9d4b56ff88b3bd5a6155250b1a97b7d0825af57068f0b72000bf16c17a31a386367f4e40669341b1b3e185162a605da89b620e5ecdd391ab3139cebea4d24b2ec0df55ce726eab925323d8dc1ec626fc92b809feb5dd544c9e230ae8fc1f5bb2aba9a843bceb9e988fbd053bccb03f4b28a4afa94d7a500a4190dc7307e243dab6682ab8655ef8fcca31e8ad59ac23d9dbdde04240a1c0118e72faa412610b36ab4fb7904166ec38c720b116d88a5a4ee4f530fdc5e3992f9f5bb5fcde8233d0b31ce5e87082c19fe120adb981ce92d9476a08e0de3cb89c4edcae9523aa148b2448783bc2cdec431780d8ccbc7786ac41d526db8812f1209da4c9e0f9ab5ebbb7e0477570cae2f6b5f5dd6b650759526427bfeaff819f3bf26036833654d52e037662e53e97d25e0ae10fd001677bb5dd761f50e72c46c857e401d08680be68335d086d4dcab8605c6aebf4b1181950060022a23c14907ec7b4b31c55a9e81b9a82c42b3416cbeb254d463aa2e52ed5d1c05bdee30d32f8df7472aef154f33db166b9d01b1310c9272fd5a0b0ba52c8849bb5d150db4904dce32082de6797816e96939a44753a8191f56ce3eb78698ddc42278be612d29d8e4968f94c23293692fe373953eca688975352c60603fba391978b8fc266ce95fa9f4fde9d226a7e8cdf4241a30574115b830102b583b7a17add3f26d3e5207f28f796950c7201021205edb6547ecdd03a49063aa2bad399e4c59e8d7d33c93545835e48d1329d7dd29fa747ba2423ca96811375141e80363c84a855645eb47a2e5455eb5b76a8a87b13a4d155d3e45420b056511416eb11a407323a76c5a3cdecb4e54d1fa8dd8b410f0cbe17df18540f8be9093226445dfa37d8d47bd4032d75affa8b1b206e7918c1f6d6b66c577ce36e989763e0f8881d29879db12485e25e6690e5f53978c9b79716dcdb98ce8245fdb14db93a489626f859be5ae453c733c632df5f92af6f111a0205865c2283b110adcde3f82e69918ce58aa93538afbc1df486d2b7b42491f7ccf956a28ec3c2a188259277140a66ca6b9feee1ee5230810e62bf652965be35fbae19695794a9d1ae0604b5e9bf2cc7fc6e251ffcdf0b98bc7cf0996eb2bf04a89f0d1aea9d080af367d61b524ba69bcb5e2059bcc116a397db30c2634151f03633a14cde4c2bb97e592ea43c828870b31f7d259bdac38573a5d89236ac3cd9893827df6c5c617578f40427a22a92c294b2805764411bd7dad07d7c7652d470a1be0c1d710c089d05503fdcf8dfa6af227abeb3e9656c5edfa2cce76493ab605dd2b933e3daec54216003bdbfca876e67732f046f7c225a2077ea60b08638ea877f99e4ea01d38af1bab1be12b18d639ad85047ef8b64038d0d1693286b4067a682693eb8c3fd6bfca253dbe6e70b2ca26003f64a4d87867231fba171e7b564eee9d02721e31202fa4a009a1e3bad5c04a88beaa8015ecc231a4cd579fd365717310f64d0323b18110596dc19fe2ba69388e15c3a3fc56e2ba769cf129e4821940ac8d4d5d1fd5e2ba06e610d1435087922e7bbaea3381e3e2b5af72e03027b79dc9dfc65f7c42c8dbcac0cda521ef29f0e76c5a352e278fa76a02ba171e1bef0ea65583782d8cc5d5b2b92d85001f58454b16cca0455e31d980b0427864e748bcf9dbb9324ed6fa412dded92585270733dc41a52d238a097d073dd17519be8470cd5d270c7c233140e37d5fc0d0e3f0180a8113b358abf8f03e188fbc93c6e10e6f423a61eb381cd491a05a4c660c3ce49379608e32b84919612f4c2f74d4c0662a6d07d17b2b089f29bda2bab7c81a6ee342d27843e45a6c7d68057541c5fbcec18e9d4e98e20d5547751854a645064977aaa5597054fc65eaceea6de180cba3869582329b593a837241dd878940d6b17aece6d67b1014c7211af421fe966771f55bd68e12df3d8b19cc9d248b8fe098d26442fcbafbee31ba3e2ef42fd85d83a75e091f640236605a9008c6e8ee5d97304f4bac901055c4b8281e9b76ceaa0bcada88f968ec9919f34162046be640942aba2618a16ecb176684bb96aa64866b3613e61aa4de5e27425f3e64ae5aa54f6a2d01d0e45db560025670f80ea19873d3c7d350073b42b1e81a5beb47ea1f02d6596a74f205d5c7ca3b16df9616c01dd2e6f9f374b30a014df576b0ebdca433e2d1b851b9acbab39e325d7e4c52146666d4e1287ee98fb3c62da351ef6581140e0e40fe36d9f0e5f7321d4084c281bb1a3eb51b0287c110085dcc8ca3382e2aae10013100f19bc83de44aa4fb6c53cff5701f0bc0ec0c0568ec70b0c324cb9e221e6c1e9b33aa477783f260e3c2b2185f7c0cc7f9c92a768d14d419d235960de624a45bc9ad34fcfbe62a1521efe620dd9fbb95214ec8a81d0e94dd719b59f7888ae3466cfb5fc2ef9df42d7c183118809a26df92c864887dae6eb3e1db365f736d5997f21f2a107e0b3ce9eb1acb7406d26642e3ed4cd809b2ed7b40c6aa9ea099801b1dfa757752cc9ce3c8ca9db2bdc07140291b7171d99ddf86289a529e57a1de5e1ef7569593d53e1d2a35845871e0ba721f7ca99d66b6c6c433f74c0c61eb279991bb3407a13492eb27df20da2fd456087d42b987aad81a4ee33a46db1b4e7f269b6813508779954f6463d03526ca928e04db850d67bbddef0d115b68ada358d6427feb2fd4389ce40af03bd12476a3ea36f4f2320ef9cafc0c233ba75028bfe86f82849a66ca761f5d5767dc30f2595f7c7f20be776340555ac176b90d7546d55179f91d4ea5bcdaf3968d5ff509b5070b53a34a10766a1e87b8071a06e2377f2ad2f8baf912a00901d6fa64175010c675c19805e6dfbf0a690f73c50645e1a3dbc548d970e3b15c875a37c1f1ee7d811f623df3cc978a1af06b6bec563849ed9a2bf540ca88f9c2ad9be7ca7ace6965025ccddf745692b09fa5d804b6cdbd39b096cb0d4ae600bd6baa1e51d7911dc0cd1bfd2704991eae7e99caad6e35bd5cc0b3151c97eac7c41eacb4a90ca5947756ed51c81a579fa12a0823b5cdd57db8ff94c7e09095a5f3cd570a2ebfffe53aef28d149d5196a90f2daa2771c47bdcaaf8f9b7072a6af530f928b17949c9cfa3353906ca023d1e7a10a7e42f7e6cd074c5a221bb8ad77f7aa789f614f1d01ed77e543d408614fc0f5cea7dbaaa562f1b096751e6bed751f139ab662aca5f6c57afd5667a529b952691faf1635932ad5d2967829b4bf63881a132855a99666e95b9dfdbd91a89844e995b2744b7b253ad62cb3674e80869d2fdb4475fb45d7ab19bc6ad3b2e79b847737a847b4a59afad73248eca99c4ecd9411a936c7b56ce6d0d610bcaa198a61467ec6445321b4713111b1a8326c9f04f8232ea5e2ad9e667b7735520d207738d671dd36c89946c6c55c78c80cb2cf41a18fc5589c610cd40bde5ef39d2287d0ec6b42d63a2b2864eb7de5af639b81cfe837c615ae70e3dbc5885d635c11a95a4fc01e30f5c94439e2a6adc12d732f2dcb58fdc26938973f874970bfb51dc585a1d661058558d0f955023b646617e2ab03a97d1d99c01e8a5fc3ca5bcc1a15d476f1e7e52dffba55e7fc1b8ab402ed269bec021be15531257f18d0bb2b8e4bf02e37ee87d7a048bfbaea443208ef5182f5b09207a650a2caad9bd48af0d6dfe27469b8549f91bb9b4b84578b7e9162793d174738d7e2d22fcc7a6b28e92bc2e673db9181c9565a48aaa4e46721d3ae385ac65f6f411f23ef8faf2160f64e630a18be5c86fc54f9133b5a4713dc3c41463ef3d9f17f80b871c347b6694c912a941a526df03f2a9f2a5de40e57e82362fe4572b2291a030ec07e55f298600bf8175557f3a1b8f83ff83531b004f5e439fe75a42f69bdcf3097e9fc2c458c2ea857a3ca534bbd26af6b1d2eb955e782f85342fc11c29ffc8912714a459c13646df254545a6e2ded8ba8adc02075d71033f0c599c1ea8ead97a7acbec7f174696c87a133d7c43104735bb98c3da9b5858bae4a2fc99c25828581e1f0ab526e6b25fc0bd7ae9aa85744f2f7f384017a98abd90bdf385c639521d51d45c7a6ca9c4375842243b455cf92cb1d65b53194b82ab52a72562c9afdcef01c332a3f437226c5a4af3c9602ecd4e186d2fb35ddd0b06f3ba9944032e45c2d9d1278d1a551bbeaa1d2b16ea79909d6095a82e9ca26865f410e96c840e14cacc72f52a548c6b66e12b61a7bd52c7415d87089d26aaa79c52ea6a8f2f3c029c32454138e7b94c209a895b16f8efab15eb3f97cb5c2217e3cd1a7e0f16ec22affbf45315f342b1006f6f21dcc26a9b55589806492bed8588817f5f2f3282ac6585e2a1856d82779daba1704e8bd3b0996ebef153f2dc9ba954f93d276d6fe0fdf4fa129118928ec94f300faa88f2aa13299293f4019e3a0d6645e1bbb5621f2158e1c179d649916ec2073a702d8d6f54fda88434fadce45eef4efca0259762a4bbd529337e1952691f1ae9cfd73f945a4d44d9ed9105b30ac5e6e017db46885766a1a7bad9a140aa80f0620c1fea5719f1d1e1d5898a8b59b34eea48665b9d17bc3c0d76ea27c85b9fe9a18c65966d35d061d0c9fabac2feeaad0256c24564c8ef51f2aac1db403d511cbc1b92cf1a8ce7caadda47566666f8c1615244a88b185bfc649914a585db725404d00c16015041a2ec5124cae71dae9f274c3ce1118354a10a5bca64911be031c30adba3e6f052ebef85a3c6160774ca781f5c6b0aec04212538765c968bb10fcc7ea96dd798e8341f21e8d1e02c4b923ec74604736a0379ac8ec798f4e764e3702b246164d71f0b6f749b3c3977b3980281033b824181213b0e3ebce8801e9442d96a30472d989ab71e1027c8d20e7eae3169ca1bdb735084f315c3f0316814c36665b26a5c84e1a8a36e2329cd43c38ab17f4a83b8457084656c34a4b5fb21b3ae155bf759442ea74be50c630760bbba248888096cc8839761a2e7bda2ea5ea0479ba48cf532c131ba3a8d302d97ecf839d4083f1f8faf58906c603de61734b36a4653068ead5db242865597ca6bc74f0ffad581d4b3e28a02106848d99f1816746945345a7ba1bafe4f3db5d71446bb7797226f1cb80b58eb663b9d42e4df0e36bddf0685288fae7a0736dbe7d94eb84bf725026982e1cc551ddeba7f22d7bf8968a91519008ad77b7788951a787de0334c956e696b8217a8b71728f9589405346b2d3389554a6134034e59cfee099a46711f09984fe893937686a41bcd55661976e1f9406fb37ac1a6dedc4410c79dfd01af8c44a3d74b454ed3ffa23076c55affcf32ba3d6bf0ae44372da1d9439a931210348287bf71a898835db5fff8d4454c0c6b718009b2df4eebb0a9a91e2c7abf46e27b9e79fa21952634fc29f4832138cf232660e1a84d5df0835ca86f2aa65310147c462e34728fcd07bb2912c94c3ddbf3c15cb67d978e2fe1a122f0bcb19df2bef709150824e8d435429ad7f62076f2b9440dec2aebc5abc180acc434436f5935027441c5e06ee3b57dace086622e382fb14024518d3660f2578421a0ea93e623264587a99224fdc0b79b55b8d2166d59a3d649a1a1e0481402163a811335354c5bb7520ae0843d3db59d21a9fb0d7c99e16e43a6fd2e964ceec2680d106c4112a29e20f9bc519a2ad0b382b4ba4546138a2a4c4249584946b1ee20f53c9eb01700deefa5dbfbc3bf65b47c394d36c099cac8ffe42bd86cb311d541e8f8b505c1815d3002c5c20fff77a7dbb07a3b78d38f78db8089d9aed07e62d0f478201c956934a2cd5ce67845d5e9978e89e7cc400a8b4b71ddb41cdbc2d45db85ce66c13574aa7801731d758477f8cc503c68a71290ee3a2d3123dd420cf89978187abd55c42ca4a7b9825b9ef0872797cef27a488a11f9468822cedb91057a92c09ca807618966852a00a939dcaddd9f03d9c33c75e092ece8704889e15b6eda6ee170bd227638dc70b1587a4c8abe8c8463b260b9610e37fd855148b689cd5a32a2f5461eec381b3e5321f87ab09bc38871c2c6d21e248b967a99487d0e9bfcc91d32039a0f6b5e5faa97cee144eaab394b78395f9fd987c15ada1215fbcad8e58a18e7644cc4c9f630b1e1c9437e2881ffd04cb1bc173be235d5ec74d873c6bd8b2e6079b60c9e0d7bf158e9e3c8946201e3afe4a687e563e3f22b9ae669f05a8d2adff10b33096b276f0deeda31b8c1e6c5ca17d97114b67c7ce3949571df889dc1182dbb4f62f613dfc9e6ff6094df43a1e0941160fe4103a5ba415a5edacf0d46e196a936358e0dfe44b3eb8056713f555b2d9226bcdf9f1c269fafa18648ae7ba1f11d8e3bd65c9c29a92a70645286f157ef360ae3f79ca9ee1645e4a0599c9612797f39d66acb7852e6bc5121e036812f22bbc3d19b23a27ae42ca3f19ed2505691d9cc51f087ef305853fd899f5d3dfc8c6288f10f3388e261df36b3b8e5883cc47fdc1e9e84c311f1c04698bfff10d11d1a2407c8533f1a8cb725b9d65e95d1e0eb358eeaa32585afdcdf31ebe937a4419aa1dbacedb38f952199f630c66e22a6ca5a805db159d52da109be5c11aad6fb1aaba3bbeebc6c04efbae5e2951ea0350183d1c3e1b04ba2d45847c81ea32a383041567eaf029f00dfacedfdf22116b694ec76a8afb42f144b6712b3c9517e003a9898308034fef0cf14126693d829127654e11db461b8c81481368548ab3584715d7a54b899094ad90cbff8756c84f92a10aef05c05f69aeee1580769593f6faa8984dd44e5546684615d62e68c4fdbb3373fe749f87ace601723d47a4edcb12198059e0464983c764b8f7379aeb967c9242ed9652f3590ed2cec963aa59e3c84ee3d482798738458a15acdaed21fa77e8bc805fc2452fbbce537fc6ed4e018b47b328fbd79768874b42e53161d765c24752bb5d6034174bdcd5eaf511801aa41ecd6d325ee5bd6dad8aeb87d4352507a6f28f11f3c6ccfa6d54e7fdf1aca1261be6e29e1c3c406d6e2b275035b9b82d956d22326ae3e80e0bbe4b2ad66bbc77bbbc3e8aa447431116f9035606450a1555bae169e3310cd71934c1953572543e95c2c887feb887cbd7dcf34f5d195ece19d86d2d8c41b420f63181c7415018385d64d6857d8e4268d5ba5d1bed8ff3c1f9410f9ad7493c82260c11ac566dabb276d5441da02369c812105edb9f68758268229a307fde34834c8a068e6374fc299d981148ac918afe4aaa23f2e082f201cfa103fd2d00596552b3be873b12032c6bd1f1f75c27e3fc6335a74faeeabff41fa0e53dd13f38ecc42beee36b0d4e8294a5aa0a029017ca5e0db19705a71c5ac3fb1c94f2ab619386bdcd097b5a27dc46ce334b459d88ba405b80a7a96ddbfa22f8e6dae4b97f9c3c2785995c59cff0aa20a63fc1d4b29415ba53d1355c9af5fa5972bd411ca9076ab43590bf874bb90c0cc0a5570bbb0631018773b3b31da1db021f20567ffb0210ea51961b5038498a00bdd821bf5c6e8594a1d6876a4fc1ea08921048de04ceed486684b9254b54e0555f155c7c512cf6072df74bb83258f3414cb60918b717f57f2f7dcd2eefe2afadcbd313af1afb7624d15044267975ea8e6bd8cb26f9dfc5f1d07e172c145ff27176c5fc181ae976cc45f880e4a300aa8e70e936e2af5d903b4104478e2cf513c74514a362321da8043962a0f201d301f6c732b41ee0ab28b0605ace6427574731764ec95dd15db510042f939ed9e3d92537d0deb0ba5d6a05d484a932fbf73804107232bd5775f9204b5b72c03cb49a87217f172803b6ea4c04cd2e3ab40d561ffed0ac29fc20ebdf2f35100412ec01b357378fa83d7e9da08697c897bb8a26189af80258e5f0712a856809f893449ce60a4a2a46289cf8a493f9c53e11e1388fd2114751d68da6d6a24cf1786f4bb67367d71558086624dcf18686d0696c9d965a255ea43b230dc6e718f4d40bf678789c9a26b02210365d1f7f1a2a42ea2aa321619097f572c82a10ff8dbcc02d5af474eaab66a6f069ab18774312f383488a62733b3798477f954965f3eff9aeceb2528239c388edcef135727c7a6d82c769d2ea78bf7457357869bb664a7b68af48f7ee25eca8aa2d73eb5c0ce92dd76d2be47bfa37537d4af702079658505a6dae2d5bf6ece82a5fd343ac97ea6a14915e297ccd73740bb844bc9ffc50cb4f452f843fae78aaefe667687d2aad0878d11408610edc599ca16b3bf625e9ec6d85ab8959c4b7f8b48b225e0c221cc3bdcb7f80429bdc15f6af61ba4d5ec12c5695ac8edea233f20f98d24eccf673ac215737b347d78fee66483e42f7edaf0ee20594de3d180c1ab3219c9c5549abc8b8ad6f179fd0b20708a40961d99d415e84d321970d05a3b5b79bad7cf4be0d258b4820b7e3770ba902f9235568fa59357a21f6b0b68c9161ef8c82b7416f805f329c467d714b763ccfda5fe2f4579a386953bcee95160e6fad90693c37f2a0946aacc5e466a11f30c82304106aafd49fd783926107efdd085ac27a2b112041c47b2190cf9794bc4922716cce3b6a9143c99c24e32b3e478e036426a37297a8368f22711125079805d6c925a61b98826f12948a27bc70a248de6bf31673566857d367c6b65fae1e18dc5ab1879d1ad958f721ba38474092709c2c42bb846520337abfe41a1e20edc12eb36700bae4e6f6a3572bf9251c3cd02fbb2f7a66247bb0e353d540c2081b4ec3a0bfc4098965460f8dd47215e4828163b13daef01bc877b24b535abdfed3958f95db3a7aa32321a8da45b3c4c59ebd4b66316ffc44a58ddf78570bc24a7b60b12c5eda348f899fbe6f38241a485b46fbfd5c26137ce55cd75957f9c8ea6c0e0013e14a3b133dd001c41132ce5a34aa32485df9e248b178a9fef35a2d5a4bba1956608a275dc351fa078e645459a2145decd37181aec85557e187f149a8a2c92055fbba14601b89b764034c3da649d3335c3ca10e467305cf9887eeec4b8dd04447daf92b2b966900d6b86b0ea23d03fea66f3b8082dba0d3242fe47eec5146454f6cc96bc1ea80f81a096882825484215f8a1b31e03ccc765da7858b3ced6b4408ff6342046e077a4c57102be21e86bbf70833b5f395db4ef845176ae597a032901dec1fd0873a0caea64330c39ede61e6063074896c5aa8db605266da1a9606fcdddd92d71f87739b376585d5930078830e903871d6b7bdc34fa4faad8c0f22fd68ab4c4479b40f97cf354f0067a351b7226843df16133141003ab5aed7e397b0763c0aaa67b341b4349ed47142811819c4f4552bdd882f3edbabd30e081111fead4d4d5f32b5a7537a9c02eb7e3fd7dd80bce794e4b4c083ce35f669cfdd978f7c3d79b9ba5773ba4ec7e24feaf2e5f338dbd5e1736afc0317d5221c8778989db7487e1e837fc87b3bc37e550ab0415a569e022008ef01ad8eec1f7395d3378d1280159477f0d88eb648fb844868b51316de36d60e4c90f63d6f467badf7bce81f344249af7947aac523850cb252396adf7ba48a3574a6652e126c7b660f55f18b76cdc9174c67226376326c16616c97de1c82e582664933663d24edbd553b7563badc43d858e3f850ac4af25ee4f02aed3d13f6cfcb72d350a636e2886bc060e3543ab3df22181b3cfce72761195a5b291f9ac19ce0560aa0198c0d1b37836bd3518134be92d1a543c1a350a1d98bb892272a39dcc222e0da027beecbf5e63f1949ac69791f6e197432d3dadf1a4eb2ac6b4185e85a040a88d0a18625d7684fb67bb6cb06b0ecc6dfd04edf0529d944cb095184323eb23f77ec291ce72a33cabb9126dc127b6f2bf99694bed8829c0acb87886fccd9de0b04212714590866d71590cb5e77071ea99d95adeab7e50e2eb05e0a1f849cc830e94b546bea02aa38326a0fa5c8fe14ac30147fecc21f272fbd9a259a34087dd3d8ba1627e09d9ddf300f9b96bc97164e2a2b79236c9647d97613a928ef3fe9b7b4e4812085c66fb6e1f8157bf88a5f99fa33b5e5aad804e8bd141911d660a8f3dc4b37bee3d27c1294063b16032d2749f398452d10b8f14f76ee61292bc50a812765f59c490a931c9fc17d774086613d66a35f245d45c5c0ff8986b051c965fec309c08f9547a6d8334d03ab1105c511f40cd8df9784b1f3a9d61228a5349a48e73668ed25516a4d3cce7bf520f72cd739736dd2838bc28f1f317b2ae03304347ac9a858600e8b55a7a0bf05531e331ca06c715822dc6c3e437972b22c20f6cfcbccce5cb3b73c3f6420ab72ce3799884efc2a787fdcfdad71cd8f5771ee1499463c006bc5522748ed5266f9f5a373d9b447b05b5873d7da7b74ba0c1dc2811201181a9aa32f7517f3c7049723f802e262e4081be998b8994b85266527b0c5022ceb36f2f2870ca68bf9f9a88eecfe9b2a633285989a8dc50ded5e63109a0ee8c4cb3966feb105088f99745505b425c41952b1e309925eee5a441cbbbe05c8f66ac9a53aefebf046bd43676df08a6c1366338715512ca4069cd6793f99a253b1adb0b51c106cdedbc9b6a38a0948871b22adc64e66a97520ade82f70895f5c1a953157286d465b412203750b204ddbb5089abc26cf8636c006422da24d15a0800f09f477a0492dd495b38cd929adb56beed74f13d1676dfd024935b47d594d65606b780198503527091768af3711152af785802b18ce3f0c717fd64f38d33e768e3698af93c886a14e745f51cf138fbbda4040073e3e56032cbe17350e9a4b67364e6c0030d220300e9b989a253e4ab35edc6d424f74b6e06417b87803287e45ca4dbdbd1aa7dc9075ce5d9fc5bea73e743127c9fd236ceb06100093fd02e956e0ada33544921301ad5a1f0481d351fb9c7f0731fed209947ef416824342d4e1226e5df88eb5716640fa961bf7241c604cd7328a3ac689a14df1adc7c223b41201b2b15ea096888db3b51eb611ac8b0b32c3d635545f18c07f8fec21031b817d4300f56c425ec48a02638287f4763d1581efbefa82b8a0d89f36758fbe939556d24811af69fa23156b04287d28e53c8234eefca4e11326303c13b67914784fceae496e6571f135eb6043b0953cfbd56d1c7259b967fdcc5c2f913c8143467b6820ae8ec9552649018ae5a844d067b8410069d4fea96a92e66ca18974836c41d1ef216a1253a61a4eaff81ac729cc69b1dbaa18427ff1de46e5990939b0b01b5d7762ed6c98efec063747309f1016e36bfffebc1088ebab5d23c5f87523fef889ad18e483c4b28dc9f932e9d10d54807a716c184ab73be5cc24e270a4db1da2b23d5999e3d04d97f83739fade2db969b4dc09de068f3a451634b12756f964f0f1d63f2f8e35a0f2cd930879a2fba83c7433c3698dd927f42e2c7419c3c5bb79458e1d0332c877c23face2dc7d7f2f0af866af33824ddf69c2733e725c6f7b42bd0c226a8c7b88dd3b70413fa987e76f29b75ee046ccc39b5be80a58a51973ab94d1fcb57a298d2ac3f0852b3c9ca97e59a0e40aa088783c624400f0209162083f0d564d1cdf2b197a2d45db319e9ecdf270c61eb340c464cd937ed18d4c57e9f84f3116b8ed12e2b87a676c4a689dbdd3d07e367af00973725e607782caed9b778e87eeebbd1621a5ea39f0eb2599efc3321dc33e3b43d1caca24a8039c2ddf71de4c81c9542c84a34936d96a84e7265bb712a71b10f41c80e41d1aea6788d0d6cadc6071f99251039450e36f5b48502649069b1aa50a623008d568938c619f0c50891fd8ebe110747579e100e31d2375907396c24c8711374a186f7de5f52ab5f21cad753b5fd7efb1bf94ee68c6f1cce776e52beec4cdbfdd0982110ce61c96e0781ec4576fb8a7902b604384a914dc8287e2bc483839f841d95c0f959f32dc9053a667f128836f1b13be2a73e0aadeae02305da627159064147654080fa5302a6884ddd29aaf4434edb71d3c84822d9b96b071fa95ee70a53173a4fee9858f2a9e304b5f0932fa4099911af64f5868b6197956d747b01abbc814c7d4f64ca922c098128e3e415f0de41673612b43b0054edfcdb1b7dfdefad8835774de82e4f538a840e053c3fc363dd79b5cb168a598805befc6383a164564ab58027f104444f46d015c313e8c92a20503a5cb8076c886665230474774b5c0e81e009b84362b490efb076c9afa860852e676ccd518fb504ccbc8109b5184bf246c61d338bcf581b4f66806f20861d37ff57f966d730751ebcf407156e0f0b3bfd6adb87c0bb11b29f2821aaf5b8b1007f32fe1a4b8978194d3ec1cebf812563cdc18434a80cd218f44d65bc971f8af5ae5064570f79b1fe1e7fcb4bd264b597e5c96a5d605333d00dcac57f13cf00a6afec19385f57accde45473644f839c94863a424bc2ce78ef73ed813cd440ed3273f8c09516c6a78f8ab90286daf9da45189a718f43dfd589e35978a89fd29fdf024a4c5c0f6856bbb040b2752f023720f5bc77b08e01a4e155acc6525b3d973da3b1830f565a252ca5d2b2019739dd65092e1334ca51425ccabe06e7d51e739b1430e38dfb26098e154874f390979a1a06108119ee1cc232f8564715f8574526d55c5cdff7819a782f6abbdfa8be80544169f364e0730d1717f926114524a1c489c3a1510f11006c41ad09c3927445d1e8303a6222d089a8507b24496ce2d080010ec9c557ac9c1112d5813d7dc72f30a401b3feb774ac30c1a90d427a06a98f40586032a113c56b9e37cfe029197de146c89a047ec478b033c0f2d48818541fdc5d291f590710e534a0b92781bdb882951a7a37d466649ad9c2acd0ccaea3782442cb38ae652dd037557ec6e44ef454500762b8c9275f3dd7e21a9e825ccf48b64825c538b03674e220914515decc743f6077abca8509ee9ee921d66ed466086a13df1dab94e91fbd17aaa5d3a5d44a3bda9e535ca7af7cd9aea045ce805b83bf097e6940d8c0870319e4ed04da80d295b10d9be4a79a5a257321e69fdb0936d09ccfbdffacc0909aa8c505d56ae0952419d420fec3150f0cae9759d552a909221ca44aa5104b2edae33929a1ef980e323bb26722ef834d458c09da26cfc04d3dd2f4976937d34502bda9443155ed981be9f3aa54bb55f9cc6f8b28928451af18f594bbca7450b07e75efe0dd6cc9fbfed318013fa1908c9611ecb2a49b7268d9afc485685ba304a4e7563137d16d2bfb9a3e441ee622e873168d992fafebe8100c965811452cf4060300ca0b4094e4f8ef2517110437945c4e76e62b3a5fc4afdd117ac914d686e89174c60230798101de603f4b03970e1a13f721a4ea5efd3ca886c29d5f659ea36c74501003c02902f1908a57f6acd902bc16fecb231c921160e62a92001b964442ce61b2cd1b1ce9155fdcd4f9dfb4008aa69a81414c63be16f1b630010901e8e37f428f938e9007bd4a65742fa6c1e5e5786ee1684e022e44ccfd1887fb202988d8266db2134429e7a603936ea7c0c5fb5fc4865ead28a721eddb1e294f7d475a04e0986be3e91b9874ec12644f4b191efb611c7927a0099ccf108eb2aa3d67ed6406f9921f1c9a08018b39b3ae7241e98787cebd514ce71dce15caa14dbc42561cec8e7cf627ff88e585ecd05707b0540076aa6057aedf51af581b17f81eff280ce15264864d7457339c539ee8c5c42cd96a22a48959164fea29fe32638b125697d5cd31be754127ce5bbbfb33c39994cc97dd1ee9b473b88af7d2da392e0d52c41fe2a81944fcaaa370c989ee9b64c76fef4191d672d3e15cd30a12ca84f37d56da2a11274fddd38a7afefe47ea2114466cc21c7d979bc5007c271143eb359b8cdd4459f1b4294bd10c85129f1896711805d2aab20a10058bb3aa0186e94407db29040f5b9094940a350342cbd69f029b1006b24d617b4630c11362e98b2a9168e072aec537ef917a2b1d5baae67ee53ea40c435aeb4f1488df7676116cd337cbbd9b3b3b018d1d959781adc8593d6fa3345020028d6e10909239d2a33949153d62e669ebff218465067d188e0681cce0dd64a0a0176a799d765b601529e5c2e950aa59b02b618418e0639de4e61d3ccf615a4dcb428dc226fbc99c5d9d1b0f222db471072d7ee812e9972afa1a2698edaac1711df328842f73864e305b89982ab16d4e4c03811839119cd33d2f5de58f061e73b4bc1a829c3c048f310489e2be6ca1686949f13a8e88d2c2c572b7e55a800e5ce0a3e2141118058c7d3771c7515503cace573b390c141949ba12b60ef3e950888e76461a2e1114666494798575106fa425c38fc4117943af882b1afcbf5891af91a6c22b78760cc257bf7029608127ca1a370fb63f4e9907b7c0747cded5866bf478eb59e9899e73159874284c5afd5d21ca7bf43ae250af0ce85943a7d68867c163aae56056eaf7a309edf7c72d59075b14123a34d4b48b190aa229a5da5aad4217de06f0f1f8bad5d2d2eb306903319bb6f90e5ebd1d5e36acf380d411d6d72c5fc161ecfea8d53f85136023f88c367e3cfc2aa92559b767d1e76e6b4d9d30ac01b769f39503498e64e38ca11497a37c78b42663f831409ca1eee943f0d9a0720ba5f22b09bdca4243196c99f3e9c127e44097d446826d5f98546bb5466d5dfe7696ac6198cae33094c85eeb537926446fb97a0898feec95131542801b649730cb1ffe46f22a97d5c88b8a4e0296b3404574daf42f342198ec9f87a667073ffa472351ef7cc0e46842526fef671a4e73d7de4492cbcd785f4ed52d83b7a7a65307a4fa106ef3422217c14a26410e7a383b8e8530c0f5ecaf907f7534cbc2d0a86eb87e858225c2703cb2915a8384a889feb2d02ab84714c76e22cadb415bb032a7b789e8a549c9a5ab37bca75e8e35872aa0a77b8d40be9e01b0cf6d75b5ad48d7ad4f93b4beca1abef544b9f331165bc060df9eb670c6f566bb92893494747fe1ab7d7adb8e1a59664b89582c79b61b4805d8b32372d4563f0167fbe242ddd528af3a67f83d6057b197742085392a6e1eb255a6fbf05cd8663cdb459de3479e099a0fee65b76866b9a938b3c8eb811af33a5682d55f3d5b3825c4e8c160a214e899ef65924fbcec55cdfee112e1c1a1ec19eb5144d62e3342df9836c5d7edb1e461e0ac9b060db026823f0c255d219a51a7bccecbde9e92ab7e634c66e4d90de921d778b3e992d57b2d025988b0f9777b2ebccf31f92d8b8e0623a37059ffb27c98c5faeb9a9426dff0dfb501de2ae3bcd63cd6e35f7529241035e5593a1f57a45935ade76c6025a4c1b25c7706ed2d9b48e3c7bc7902fcac31b316066f4de216a76f0ec29a661733fb13fbedc64ad5387fb381491a6d5258c10c8c75b4cac730a6e965ec57b39c0dad21ed78d239ecc075277382c66c748322cb6e013e911a7a15baa80c746c5a40eedd43696bd1310ddbca45ca2ab1e987cc903a3be65325a6555dc81b90340f3331380165af524be6fa923fc51139a017f30a5d0b5cd0a23ba68f500402e9d6e0658194f499d0b95b8642c733cdeb49be2c0dc915cca76980135a02523f1dd3654f04547a673fb1f1e76c4d78970e52feed57bfc429995d870a03a2901b122b05c8e6b18c3e4428db7432f0c4c5cb3dcef890b5d63c032a39cf65d23117c05db5bd948973ae56c67c23180f180eac0a3e7a24548932b0694c8e54f61e7a2f8fc67353c384523381f65d55ea77c851ae4811b5c0d53d5b62067a3604d871aee2a289fb8864dd84aabf57a09b5a373ee00ee9aba9e0274ca8ed2e25958d8644edd07162e41199923b8900511854d82942fc8624b4ab6f5fe0d6b7f64207f6f6590672e0cc0118ce77562ad568dac32093634166ed3c5cac14c95777edbc6e554e6ad715653711cb0e0bb8d5602ebbacb8895318eefed478fe6caf24eba5d103c601de94e4d6f5d1c1a7b9f469e0ce40f082125295ee5fa3003f0c6a329a45533ecca43ce83db583c4a34e3671e5be9efb08d677eda46ed340d559692709eccae0c534519d8b059ab3a372eaafe3eb6ce3705ae0ea0f2cd7298667836b524207bb5ab4494ec8455a99cdcc1ff576d69086c082f56b70d8b73f0fcafac409a1479354173f1de5e8b8c003f5cf96dcbc9fde2b4c4f98305d41ce62651dedb763cbbecfc6a16a385cc72e6d873ecb61fb471f3ff0a5e41fcc1bcc857c1c5cb78bc6f264d1c168f8966eb4dd96136c6277316ce1718711f384476100121adbe4c06d9545de8b212368dacfffbb6ba8f6f930819a9cbf423ddaa41a958fb5974f4844bfc18f6db3eec3b39d2b12e7dcaf2b5321e95ed896997ea843a81d4573fec821448c3ccae53fe11f3acd3cf145e9f0c41d0190b53ef865df9cfc4db6b8ac023d8001d7689546f1c0f6d12f607cf48fb9517bae6c1998236279fe81ae0b64961171ef47f9ea3f06926459fd8fa009ad7d084541881886404a9c80b1cfd00ea624151b1615ab1171a1b8cfaafa970529018e3ee3bb7d385d952779291ab3126a7c5f300e55a18f9ac3e303afd0079bdf87f20fa95aea4305a594cc870a758a6c7e12d1936ba19d317bd39510fc44b83d8d6a301ef5d9df5ef6b3937bbbd229f53eb21792cc474f73cbe043556975b9b4a441e248f2b4242b122a8f1de5d6b89a7e6f2a6ba62f83f6f6afd199050bb94526cac5dfe7c5e78f1e4e54293dfa5e8de62e3d0c4a21578b978e4606eec138226d1155b5af2f102ff4a9f6af04ac3c6d84af5f388de3db894144036f896e0300d7a43279c4523d505a19b0e3afae29a24e66286a40856461598b570062ee8252a364e5637d84d421405b5f5d4f68ecd786b2daa2c5f7764f05719cf8fd61b6316140ff533fa94bd843e197fb8e798c986b8eeba16626981f389df525665d12e7ae6f8fd93a9dd977357958a3054b976a3bd0b43d56d75001dd426eae103a9e9907d52a53af5f08735e973509994fa64e5ba2afd102186ea0b644df780e35d02699f923cbb6d10d7347964b6a1796add34551c48b89ba865c447df8ae0263741a99e3815202b5faeaf5963bc428010c45c6acd1ee7b53ba16423331891ecd3351b81425b59ff73e853220df188f67760c3edba3402c8d4a06c8d5c44e602f43ff071439375e8b14a494ef513e0dcfd2e58455d319ac000091687e94552db9f008a52b6786f7754e18947978c310c87a15477a0495b9ff37c59172dc9fab2c24de266dbeaa83b2be10f7baf1408aa5dfd0f693b1d4f06d3b9f3284e944d3d314f169e9827f0d950e92d917489fff510b77c9c94d8822a1a3fde16c5f5c6a0f78bcdfe6b64f3d87f7a8e551f60b3ab7908b95a8abcb0474028b2f8417a758581ab5b9b4f84a8ce15772a390a2a79c988944584facdf6087cc0cf46bd23a596294e9154d57d023df589c02dd3c892639332982d47a2c450bdde8e871613b3da0fa38a13c1a602addf7f23f460aa5208e8783544e25838209417f3e1f92d6275b27e7885f9686cad2cac0ddbc49a8b231debb9e0d511b890649d5874a2428ae8a0116115f55cc6667f20aac588da792476e98200a20e05b85d60d6a32a20fb2ba825afe582b21fd584495c2af6c48b2b02e1e2660442601481e59a0f40333e648cbf875c5f6fb8cacd3cc70a7991c8afd406dde35889c862b012efb54e815a9df84368ded7cadc1094bfb126e59b1c3e0ed4260d5feca8a501a6de903c0d6a54185383b34d06ad392d43bfbf69241e8f7a511fabee5c654c67c7d07ec354b841c7d3b0bc5093d43fc0794f30080ec315226c9b00d7b8489e7f542d8138be12314c4d9c664c1fd54ad612f78a64a636c4fbc74a12ac5884efd2cd0a119165deb59a0d3b995150487b3d91c984dbb53328dd2df42725d8ecae444821b0efa2cab9c0ac5ff965dc36c519e3b782283d393ed101642e40e09e32f1aa37839aae830f955784c33997991b042c6cddb428a93ac3c7b71db14145b77b383e6e3fe5d19cfa4418ecedd3fa919a8acd8a4f0df9fd698421665a6e3fa51a649d60cc76744254d520368ab5e4fe75a001a946a9c78b97e1b2649d0f52664514bebb9d3511b4089d208c1f5988330849feb9bacccc4ed89acd30086887279df6927b466f1584f79090883666604555672b4a83d4b1f7998d55a7d687fc3079d9c118438ced05d618ffe29401f47f5012739f4b7045942dddb2d95684a90ee2a018bb1500d0aca62bea14334606d5d0c92d44266f4557d95005a80df3ff8a507ff9f1a08be62c82ccf066dc48c12d8064e4dc2e420ddc8b55d551e4f19816ce8015bc75ff647dbced9c5fea3bbf3f2a8d72c0c20079a4b8cccfa75383c0d1d98ee64202347e24918106757428257c9c8c26090a7f35bb517394c24086fee5b84b0b98f9d563a5436355d5b22c8e460ea3df9de6aafbec83289948efab5bd171522224a410279ecca50fbaf30c8aed0d27345e8d1ec53576bae6ef59211663bac2c4f5478afa95cf16894626d3554ec5394ea2879bd704f03269626656dd5053643be8b725ad7ec708456b1f757556d3477aa0049888b9409b36bef7e4d1ab4ba27e6cc01d8aa2f0949551027424d2fdb8a1ebde595d9c087e3564d47e93300caef3565b32bbd301304d75e06d52bb46ca1e6645ae3a682a803ca8e3ca5460b0e8219c5f72142a959606c206b98637c9a6d0bbb2fa25e570330a2089f8b3e3b5873fd66b0f20686ca7ba1f0140a5bb87a7c3e5d19ee3e3f305dd4d7231db3bc01faaba81424eb6036484e80ba9a332d39076bdb08a44ad5520296a994d26a6d8cf1cfe21cad25b487ab94bce8a5611f1a6babefb64f02e8bd004a6a170661c0e40b6e3da8661886d3490262fe1c573e267628260ad540c2824adacc4c289bd5217b202a20988adcfcc5b26a1beb7e68de89bc56a2a1f982327bc393341645bc4c8f277449b93f422fda7719eb955a8fa6544563ac0359d1884d5a78891cd64968ec87b794ace85cda965d455d08650a94ac91d80e23684f3ce97fc2d3c9539f6d103ff5d923a03d977104a0707f82c6f1e4a59d2467d5fe43e28cc7733707db50d9dd68a1eaea2c64cd114e7c6261e5a0382f97e55674d1cdfb987c17689ae4b37616d397696601f2069a492f629ee7a10d84a9f3e22df32c9de3ae30de0555984c3e746e53b748ac489c02830c07e38e2f1be12e0bcc0b4883c3c146485102839b34c6a854bb3b8824c8c58ad39007a751d07237c6d1578035cb8e923424ac44212706160921fcffcef1ab2f9284ed188d0d1a0fdc7ac3699beacf6c7e270818ed69bade64f0e8126dc4b3c18ad63038008130fdeb037569fed01a9cf0a282ed142d839bd8987228d29b183618c4ec71b6d92313f4250e99981b1b7309cc4211a580f0c40ed8f9b8f344d5b0a88f31c455cb560907b036aac568d5f58b9d7b10e2d4a31e40aa32d23b5e90927c0d0f7ea014ba16aa6bca2ffe63c47a191e41a01af2782a746aae3b0881854ce1d387b4ab65254f53eee38adc082428be906bebad4614b40980fee99d4097803e06d1f21b0a872b436c4c3124abe50067e5b30f0c216ab88eb5b2b39920175b75004b8f606e9063c407a76cbf6b602d7bfc9e5debb1550522014ba3f0e522f767b37e761e0c5174498a388e36b37761b93efa09407425b0add34921b43240694a601b0948ee18ddd2bfc818467bf024f012c8e73a60dfce02854fa883eae37fa126e92a5752a19994c40986d8ef65a3f10e135f1f2a897a8766084cbb71134b3e362469689d13a30db06816cb08709f77cab759eaceee355a795b26b690e841e16e693fd060783118559d146ca602b0f6758edcc1f4cb2663de00d214e12743c6a52561cca0195376f6722a4c7119886e9504c41a2ce438cfdead1288f41c58da61a196be0ca5e58525aa1fb4cc4f8642868aa610dfb7c0312945cdbc59a55a284a574c0ff7d6a7d913803818be1c095c8ee1fac79900a43d5ac25753b50f3d469921dccae657aae00dcbe358d93d030f6fd284431a99068ff49d381b2abfaf7b5637c65dbb027d6202ed028262d0d120b4132d98926ada33611ddf73507dc738a052c0570c605c405202332b0d6308ccb089d258afe0120a870738441066c5c0c4970b3c6f62d0762a807aeb2410137160400bffb8130c548bdbafdf17fc5d82006795d2d913e90342f88e4f8735c4773a0e0cc739990c31dc5852c5f8c0a5ed8baf21650dd9edca97a97fb3aeb37dd5b14d428aa465537c185671bd459a861586a4851661b869deb0187a66ea9a3fe58fe0456602a5bb08767331e20da71bc7939aed6e2cc112573e4d1e4aab27c1accc2d39b52919129ee4e498779c9e63a011a9f8e871fb8f889a94fc116a7c54fd879bddd21dfcd06649a0a8381c93635c16fe51ac4483d547b470f606d0662c6706904736fb24de7fd22d2502809d3710fc5746eaf3ff51e56c611d238d0974a12ec7552637b8828005c1b5bd081fc2a41fba2f56a2e38538765f4cac22a6ac441609d7cdba03a0c734c6fe4bab9645c8577f7a5df429ab614c114f2ea6376d1ad49bc95c6fcc65c70254d4213659175b092398ffc917f3fd0c30bc43d651ac0e3688739f9108f91687748a5a212405a78e79eb3694f787b0ebc7de0daf46ef7c419c16e94b75215d38491a425dcdb403e3f68115867c0707fb1624ae89cc672cf3c447be9a114cdda0c793d0f5583d6e84c161b78fe244628d6268c3fc0e9b2b819b589dab5f3693d23392ec2bdede224cdf03e976dae31dba0b26b6d832ec07a20861db82255e8e7ac93619c761ed3416ec23a938da8f5564d37820396d66fbcd18741975d4845d6afc948028bf78094e19ab1f1552c031d815f6466893bada4099c73659607ea1b53835fe2077c98f588f7c25ce68d4c51f323d76bdd049e81b0b74af27884d3b27d419ee2489f8b976b74b078e59eb99710329c4cc8a4b6104a1e96f6952813e920f6d6cc7447fe15ebf357b8e3b0299d8d01f7e528e09673d7caa2cd60d4319076db8dd39f7a52953f7eac5b15f96e9d9728a2d940ac04be4557892083e4e3de0b36d1bc92e022e8c0beb83a0863c6a274380b03430428bdc3e0d546f631d131be6fb8099ee706ca424dbb86bad983f943207754fe66c8499c2022ab79e41a920eabf4631b65a0af9d8e11f4f159c583382a5291a1c7961c188b3d89b80a736c49fac5aeddfc1c720f0709544666fd9091060bf60b8f1fe3a4413ab2052bcba3558104524971afa00ad4134c6ac34ac213c157babfca02979e0e31ab3c6ee990e9d95b17923c3d508c4f21b2536b1e43db3690f7c6e525067fc14d21aefd82252c2639e754627db0c87834a3c1188ecacc88ab7551634e7f18aba06da56b4d5799d23ea696421f0c87059a4a3b07330c528b7b9f8fb69311ac1ab4ddbfbf238d563c9666f376aaf5012fac7e3b25601d62cd9241db790fc4578fefa63ca0819815bdf6a4477db0daa7fcfba1100b8597ce704749532320b53b0a6756709d03224f2e63927b81df2a673dfe6faefc824964b1abbf41037f794bc46f72a5a9bfebccf84688e53a1db2686804b3c019705fffd6b6e2407fa614a49f991fb219c892addd4e9dcce1901145c3bd5b890fc83b4225ecfbbd27606606e8c1d4d64264220ece473d1f676d09fd41359f6227eddc5e05bbc7e5bad9a173f1fad86e67c5da90d19a74cf2ff0431a2af460755d9788ee4ec7a09ddafafee1d799545c1e48360931ea7a734ea60e92eab4ab48838ad2672734cce2452c6d78868a022587897387232b4903f7645747ddc7872b78123ad29d450359775752561633ad8b040a1cb2e2f40a2fa40c0dd1679f17c791ccc4b20f1faecb45f0427287dbe769ea8f5c4f3c0b3f187d222e894dcdbe4f141573f8350e789040073b8d534277748ea920c86c2c4a9d08b589a0cd3cbc9e5578d04bae06c9793ed299f55048cdf46177487047ee7cde5a44acd263fabd95e3d67884bfbd5b58d3556798afc237bcc7ad1315efe0f0f96fa8776a82f9bf3c676ac85b9edfe4d7451adfab710502c580a9bc935c1a024e9dec2fe9f6fd0ae4c56886589ff9de41a2965e297f2d362572ccf3c8253abcbd37e27fa1ab8c74a469991827d5ddc1b976a0ac34488cbd76bb2c77681a2df3da040c7541dbd75e3338d5ff0ce13ab8bc67f9713647b8eb0faf00f5607fa9a7cea65dc365a0ea39e70567791f668edb4dfd118136228787777375510b8a7600b381dc4c81f4f7cee1f004fa7362699d4591f30b50c5fce2dc48c29e20000db3b087bebd928fc7a2a21c43ac4c2b17926b6468e097139fdd3d108a72c789620f402fda4b55b823616fe09b59cb4a709a2b9d1f854ed7d2ca4fc923c21585920a6d691fcef5093de2200edea597ecb7b43374a1e0b778891a2c445264464658ee8773e8aa892a1cb99b0359145e27042073b275552e9061c863a5c8fe9679c5dd88d09f52e3a77ed5082ad9539c393409d4eb70a40b719c3c8245a8d3d36252bbcc04e2d370f2f6b909edec4313e9e1b81aa8329947a1226447bce49d0cdd1bae6aa65962dad585f250a5f0fb1abc701f43ffc4981f1514b629350b91b20f860ec89048a811259a157d96fb33b6e8cdcb5a07d0136d2c1d7dcd6a66a48a09590446760657c3bdaa081ee2462007b8bff4643bd3d68d25980b62e5d4dd2a9e95ca90bdfd7c8374500a960f69f96c388c4af2f80bcf80b2bc14aef160d7ffd366e1030e9eb2501baf0562cb7ca0c5923c62ea979f8c0012294e75ffaa818819fa90bf98689c1138087644cfbd21b35e430b6abe850f48bc8ae220b891a3adf3669e6e905c423bc0d3045062aa1e8b2bd3b7aec22fa046b349700011b717c39a0aed49f007209e8101f305a02cfc8029159020610bfe05dc04c034de61b589d19411c909140a0ed6f0b2b8398c485f356dc254a1108ea83d5444e87766d403a29237153aa3c9ec9d86f25c018f57e815fbbcd6b8fd6a9ca68c771ea62b44cfcb724fa6f02e6dd2be4b3b2ba6d932e46ded714a23e5378a8cbf3158cab68867b08f8cb2ae81a90cfee3d8c082dce627ffc9725237543ac9a4a8c0f6d218a8f1c3d51653e54c1c7ce19076f5ccc0c67ecd108511ea5f0939b296354b42acc016646c66ac1e2769ab67a611cd9d1c8afa13cdc710f748fb1db94d7c3318a48eec241c1d795a3210da90b101d7eec472d18ef183241bc0aedb6ec6d135cb95efcfc3c52707c8f28fcebc12da9b75fc04894532ae473db799ebd42fa7e79f36e921bc7ca1fdef6b4e91fe88255f268899ce8e694c79101fac5f8f08cb80f845c9ba0e7c8bd56290e41fb1a8854587149eb8114e3f93be6b1323d00dac3bf7bc4b9162acff8694688fbb437e63ae085726161f1192e27a5510905ab7c612915132b5fd1c89d2f4591c1842af86abb6064a6f5bba562a0d5b67862a373f30082289933d764b8fd95476e192b09e4b5749f4ddc9aedf224e24e769e9eabf84ac0154d5e22deecc65c45215f7c6ddc394a55bfa0e8a0244c10899be3ef93ed21ff1806600a562705747aa6aaaff954e61e7f983d437a8ca8770ff8870e3fce4dd8e9501d089d941dfb1512bede64d75091ea6cd9240ba5be1299ace736ac4123bb8d8a7afb0dc5c421aeaee0521ffd459685581b6cfd76f3a766fe7b00bad5f5542252d0f37b30cc35356b85fcd4afb250e2834ad6f7e2833034baf323736083c87f42613d6626a8104308d59cc8e5c2651472ed5f188918dc76b034431221d5b41c19b7437925ba3c0baa594acfaba90e6bcd81bd391cc3322793e2d57f69c5acb834539c905e45c37dd3dcb5e00d059c4ef74a3783b4a24b01aa8e18523db2ba6cb3ddd60ada8730bc5426196a123e01829e76f9d7cc6e6c176153faeaa997735a856c6927987c12565a559e698607f1e42e8ad9d942e99c6613794045d7d00ddfa01ed44f762e1b29408889b1d320225874dc91e530247a306f03d5f5e5c375bf0b835cee955dda4fcd3abb83250def2934070ddf7ca9968658229622018df38c409d85745430afc9fd428896318716b75d6cf8c183aa15f47b0050aabfc9ec78eb157db5460733f855b1859454220e32161dce618f16426b2161053628687ffaf858bc0258a10e8384bd850806276ab3fd80d2e9c67d9f5d815b9a992887b7981fb05996b2d40f4875421661ea82d3bc568d1696594ae970fc688de72b760b19386a250f65550b41bb5864a76db7e2ebf5483e4058684fdbb032ad7c23d0e300e8b7bd94521458a435db49008a9dbbefcbf1240734ff1f8256ac1663a08108244667fc08e2e4d687c8851d3a3594794c0f9a878406c9550786d26ade98b197f28d2fbcf4e2656c2e8dde74b6b1462a8f8c11e318fd0266cdab32162e2b0d2989b887e3700b1771173fbc1e3cd8108aaccf35997d76c6b20ed319bc489809c1b2ac43ae1e14daac1c0d0b82c6f5921e98e83273bd80fdf5395588cec8ec55c92041f426508ec3bb3a828fe61e6f8a6c29403204806e7c63f1d41411b63d91622b347f27aabbf5786fbb7a5daa6a08b58e698d68c40998da736f49222791db151a0da76207b70b23d2252c423330babb78d844ad1a085ceff22b31de18166edf03666310b766975126e8b8ca4d32ac2667c2a2aa902dcaa6193e4d974804258e67a669e76df0dc6b9836291eae6910c74cbdeae6f26bcadfa47ddc4c1c29066fdb0d03f8260b3117d0508422e7c1ccce6c19d838d6d29a404ad33343820a0b3d2c9bbdeed5ec84400f1ba4b84e6609b50cd0ef9dbdf6b28bae2945f29c43f9232792454f0d016c919fa001a4b42ac3a8e3d07495f6aaf14cd1c3eb80ae81053e1468dcd1aae0ed184367c5180a7605132f078c080b7a612aa6801e6bf12b81260cc06d503712857098bb92877c5a54d2e8e76947bc9ac872eef3cee92364776b990bf1f18f68a9ba560393f101f38132c9fdaa2328b035679cf18a01b7635743e0d767a47b8f762554ceaf740e1bb77a5454d09f6dbf93960e1123d741ae3049c51d09a584554497c39d45683d8fff6a65ae6c0999385c7257d8082ec2541a37a211b28578e2768e05eb8aa5bf1b2ac09673d2ce2f4b54079d3ad84150252bfac38b6742a0914319f413f3274d76d727f3df9b8281509b8cffe5ba8a1f0b7997a37fe515c813b0e95804de2cdc08f2c25d667749887746a68ef537a3de1c8554649105603237a98c493a4917dd4e3694df4336bc461675022bb54a083a0111a441a39a9f91e80d15e5d1761ccf3de56749a9f62e2f3396d3f96736319aef70fea31a3376e3341175adcbd5dcd70db6eaccaaf2710c272cac86e421f960b03a17dda0d23c5b24df845754e523615a72081ac6de1f196020919b4dd613f0b364d97285d137a8c48603dc99a3d06bf43350f4d107cd7a8cd22405c7edaad7b2992ecd276fcd79ce35152bd7f11413680f0989b6c54a92355093e1a59bbb9558d96dc4d7f990aa41128421cb80f9e2bdce129e501c3e0f67efc0723979fb0bf8a8fe7002529a8e9b9ad7ce102daac7b7202764647ce939d9317151568aa4e5494f5df1898ae9669710334f401ea169029527252cc7ac005e18381322b68001280b4adfa2ac038b186b3c464c4069daebace2da91c7bf5ccec4fd18e7d978745f7fce0996148842e0b7635ce8a5cade36fa045a40e56dae657442056e64e43d19c604921810f66273b14dabc83b521ecf695b45d666599495c8db306cfc76434a8208c2fb8fa9fd940c9f2c298d1fe5399e45e06dc90d62432f34fd22a977d82c9d2992a64f9d541f25be975dde1b43178b3262f8f415de20a1c197fe6ae8ee0a6ae7bd0a342304739498c7c66ef46dc4397240196bca01598c9c252e3694ac7de63875c2dde99efc9610e9733eb8080cc51485a32cd07cc18abb9abc2a4a814e02b16e13d69e2c383588298f80e7f0edf48fb535adf80b20c32088c6f92d2dd2ff0b63dd33b393e37eecb415c0eb4d4573b59cb22958cd9283f2abd4aae35ad0fd150c6edcecb275031410d7a3f5a38752dacacd92bb3c7035689fcb80d521336777e6eadd49a4039088f965fa131cb16423fb14cd3edee9d0bcdb8ddb3d4ea302e75b4cc053aae7ed0d7ea2704ebf307388a7089c8b6a6f7d8be7aff1485bf4c827c95addeee2a9b23beb7e948a4d8e0ba0ab6a1594a4f5e258af916c121ea67c4f424e6f262ec77be02de8579442401b175b93723d2f9c39e9359959aeabb611de7089ef4303484f8573cfe23edb41c54e2970c94ac820519ef57ddd56cd649945370e246ecb9b2e5d2e92e3d86f67c23564c3565ce2b3904dbd7f5b9c95ab72155961ba45c31fb8600d0c4c0b54801f879c2f65df3c344db28ca26b221f264592600aa0980dcfac991498e6fe5758c72a6bb969ab5077630ee06a5c354fab89de3f5f85fe02f721844d91828aedca927916d68c12ec5267a65c71e7dda9e1ad2b3619f17a4f5f7dc66b3795deb0452752aaa5897c701d94e8cea0f26cdef7cf305e7dc5d4d133b5ed70fed13a941ef7e3eeecf25cf3bd0c7b3f1b715ae550c9973d2bc8f332b99b5a530229e08a9c3ca808b5793ca255975c2fd79c698f059788008b3bdc26d1ddb1ab21c7d98fe3b152eaa6a80f02334dc5e95022361058f83781d8ed1163488949b0cca05a359f10cbe0d6737442a510c192e40b2f4593cd5890f93fcd5d5bd46e5415ad04038ca2e8d7ced980d8a19ec3c6852fac55008d611abf22718768e3d21cb5a3e6c8feb58114a0d0bda34c4eae53781b0154995c213af5c5bf4110306887aeee7f7ef4781a7b1220c2b81923a1196f7595b518e3332350644977bdaa70384d6c24fc23fea1df6248ed817c399498ba5d00d1f062b4c19a1031e8abde9db640c7a2f351b14ac08def598707686f1b8d8672f759cb7ded0c03f70abaee7635def364d2d5612305c77fef59169f58712628c6f490a70823cf0a866c32ec54dea628ae79cb623f49f3c6b8f8e124479bdc5998b84189e4eb1452b5cc2a786c92b375e6a9c355f3c474c8186bb43a6f08bcdb181810f20b522906e60a15042e087f10d24b12491a4dedf945bec6c30e204cccf384b020344efc1f0aea0a7885d171b687d1a6eb71077c1dcec2a8404ef2f9fa4cabf0ec44b882ff05ba1e0fef1fb3190dcb46d44bacc11d4c3860404eb76b23994d93be6b2cff3255b680e27b9ea0f8e93ca86d7246c633ca5e56dfa4f061c1c140a9a5ccfb7d42cb5206096ec0baebdfc24475750a7aa0985e806212c73697a06c8476a7d31777254a716d81d19026360aa335ec9c58e1a35ba3840e7fa771595383594ecbece4011e45a556ab42f9355bf8e0825b8b7d5a61cc65412b76069634b28122c1ca1b96f12955eb828fdbed39cf30ac459bb8d0f2746a3626d1794c0222c2468a2689a90be5ad9327eb8a7784b50e5d918190068cca0ea4b2bf1465a3eaf030ffc4fd50226b8f8015eb903b8585e8d991b654961361a094f4d05b6479c3ac9252865002ac61c86e414321b1c9957df6eaf9ce147100991abdd70bc6e3af0b3f134e7cad084b644862706a26226c486ca92cc7ce33d7a038d7ae571c8719a41bd567e9983b6f44e49e46dbb6849ec92be2acc942d0ec4e2ebbe0f78f6b1e44c30052e6bf5215077a91843591cee23627f7b5a7c53bd3bb1228aac6d68811faf4265254a72e5db4a589af2135d02078ae8147d6750ce9609149f52ddc2cf84085a1fdaf2968da823e4f3e1e245e479c32c7e084bd3fc3596977365c1e4b293fb7c78e1a92f1e801792e493cf57391beae0a2c0d001c9e67fc87897b72c8ac49c93f0681fc6a26639664b2b2230ecea3307e4c6c8cbe38115d8760f8cc109173595e4fb51947f95e2fceeede0787419416fee717cd8b4ceade1c9e76db5b9001c2d7a01e69a4b186acbbe2d250b1178e262ea0b527b38e8900bb9b420d7b6693384a41b3cde74038f1a2e2d835ba21b42e59714676e650b94f3b4d0d1b8b079829420b5004d9dbdce35928f49e4b9409805912a9ea66fd176f07d291093b3e5d4ace058d30e7e4daa9cb91228f128e661f399db1417e0aafec0d8ac153cf208dfb70aa9e32862933ccd4305ad6d278d503592b4c583a045de3b4e9ef4c192e29d4012b663035e406ca41e3a06a7783a11eb0427e4a761c4e5c997ec0e01a6dedd821b07e49576f0db04903b4bbbd284593c67661245f8d200bb11581de644a742b6b74d90a26db2694138cc70e5c8057d25718c2a73227d1045bf6356357839445ef6570f84c43d854a2e4f997af750916cb6560b3a188c984f787866a65b99aa4529c530193e9bf02ecaaa3d533019a686d0b45391c215233a069aa57b67e0aa6f62aa8a56e76d45b68957d9c23e6c04baeacef013361cb19944b975841628170fdf4aa2b66e419a6b4e5aca3bd9173a581e48b89d6065a7498acfa7fdc7786bf99dadb3c4c6937b6f0f534cef6ae2b9a5e926a5f27e0406e613824c3a36efc75b828e6ebaffece74a17ac501f5a70c07429a72e302527375632b26048e7bf49f222e0b659d27078e7b2cb51647cbc4b23b8619d5da8cfdbe8f4e94df4eb4f2300cd39d99dd0aafa4c08b66e8e0b8869a53156726a22fb7ce2f38cdf4ea02d99019f69a958e9cc0a5f57f37f0083204d1f89a2e65046be3067e18c26d87a8696e72a1e92b95bc4e0577202ebd83110bd29b29b2486fd64c9f6f05c7ee69b8a58ffd0bf4f5be610f211b989e747f626fbddaf1643932ad880ca2aadf700d78ee1c90ee584cd43ab1a2c688ab1cd54e1031476e0622dc430ec8ea707b07d09e9a759e0cae3702cf742f440986e60f3982fa28d4e565d5a703a8002548e88b0984577439252c3b5eeb825d42810a28bc717fa7bf1f6d0bdab8527931ad4d00ab87864749345ea62ed1550a759b336d15afbdb6e3680409cdae22df1cf3c84d102f47c67a83a0872cb78b02d5116aa3f6e326b269137f136ca61499eeab48789c53993f2ac419478527c638d380b41984376e6a2caed9a4394fc939792c8f77370e46b044a94dca54c4a1e4ebc476d7bd570f6f029e7f817cc59aa05dec246a0e62cd846c55537f74299b8aa7b8fe3606006e807d8ba82675b5d7f00bdca8a04058e0b386e92198e0787f18531f66d4a00c2606a2576cffac7ed81a08aa027b40ae4c590d1d7b496ce5d7ca275f2bab7c5ce9932cb8f6c0515a0deddaafbff1573a5eeb936e906bac75a2f2d60ff4fe6769123dd4ca75268838ea1c45a85eda44d340e5a0b7023481ec09517dd6b83fc6a102b82df9e4d53290dc5825babd3a4e45d3d1c89ed9a47293f6dd4491746218779ac2ff1ee0a494e24e741f88e5e3dba9685a16888b9c98b855e34ceaf797174d797621774ddd2c19097723bbb2bfc467055c4addc9b164eaa1ae972d813d456cee4f9e09f9d1a9f3b85af230eafffe7ef8467f9f85f375083afddbf6fef57afb7d9ce71b2ff8dc5aeb067300a77cbff64aafa42174dd02e0fe9bf72fdf734061473e013466dcdf92ffeb3e80a8a7fd81960fc9c60038b0e3d34b3ee75ec1d00dd867f80689a61c4b2c9747c675ee489962783c9a1262ac59bf35946bcfa557d112e8ce6dc66363a9a02e010ad878daad16077b9f8cf11afde5527363d25d9ffb1a35ca66dcd7328150e390bf80bdf109a079c68d754880626d5ac4f88707e335dffbbb838f24e0ef70a60183de18e4675b44c36ebcffe8cb2156835f6cfe550005d2ceffc664b3e0c9a52d038a98f018a59809ce16794d7822454be08636bcf0e3d5cd66f0cfcff3a8d0894969ffe17c1cb7e6f8ebde41928c440d20890900bc9d590d82c753414538cb18f8264abd201142abb8ef20a734c31953b8a88f7a92733b2b7f732145a309bfc718831571f6af2b7c5ca2b8eaa1ffa7c0a8ffae1c1906893c74d21f5c1c94d1f7f92449dd454bf08887a92fc3389472559b9cb0a254fa68fd2cdc3de90c8282a18b87b0cffe5f26b6700d6b85764fac750a99004af6c6e43adc700345f688dd055c827b4d1900ad662d7b23a16757ebe87a241b350b2926fde708514726b919f529dd459dd49b1a47980b57ef34d883d173dbb1636fb202c65bcb882517ba38191cb15db295622d625f2d2cd3c59325e2dd3aa20d2a766265d49d250e86ff1f22aee616343d071e9d69c5adf5d8e8df4c6f94a82b7c4d6b5427934aaf5463b591c4889255926492c30ff46ec98589ee7150e9b864fe25c5c4b9e78a767cd7e7f1f9ba2dccca5702cc924a022e0c2a4712e405b642a3e94f03e930d43ff62e824a17e935f89ccf926808480b89e8a16ed0de8da69515ccae540a22f488096cb0c30d416300349689e30c0babae732a9634f11e8ab2d29d02dcae1087c9538d532b264a92bab98d5eb8a64f708d74770e747ee29133d0fed9c312d180e8fcea62fff6ddf810fbc372396ec2ed7509da2e96365ce0882b80de7eb2dc6a7b88899e817aef19285b88314b58c4de48879416fb1c0a426412fc6d407005459d96964c37ee0dc9816798fb8df1ed1837863e00bfe25f24a8a05d20010468e1bfacef93f40a835995cbdcff8c2eebde2f802d013dd0dfef2b57a36269f0145771d76c24927d1b21c7db3d1b346f18d27cb65e6a59c42f46540e6d53c972b080601e33821bc277d36a2900e07e740f11201c3ec0fd3e209c9f046c977c809aa8e821d5b9e7881e60e94c59286fef63670f07866d01072c21e654235713f58848e7fe081af3b2862bff31c253bd69cf287df5ebd4274312033a008d082cb1a0891aa95ca5a4c671036f4f59b4ace81ae5e2f6b5ac22bef8d7c7530d1e00cfcc76bf359924b7265e0dbd00fa7994390600f5f8535259c03ee3b0158cca85cff211dd121277c9911d845cfb134d1a2bd050570e6d586891f78f626439a649fa45247dbeba37fbf16f924d9e5669d7c539e7d842fb1024a4b0c7f66e74ad2a1879e8cb59ed771602672f1bc5696790eb92c3c15deb1e0a8b5803e015dcd053fb2ed825e1869a276cc548ad9b1876af517858ed2338a137371eb56bfe422f6d70f5d92b0de368cdd4eca0e0cdcabed6d631c4eab5db2b06c043d4acd68daabf3ffe37e74b970b0229052b91bd21dcc296b3186f5caf374a7719701b53d895c2b2b277f92dcc94b88de8688d39d0df81714c7de56d67f9e8a9add28d742243d8a1e9ea44fa31ce246f2f89cbf129f9c10b194a5b0dfb79f149d38adf4e9f8494022bf4a98ffa14d8769aab5645149ed520c13ec5e196c96e2668eaf9a9493fc01c420319f2b6c3977cc603bd8f097a9f2bb2b41658903478a915f172277f1f06df4900b921404594b0311ad4d519ee8ff4b6b20a354af42c6baf06912e5ae0027d4a83ce1c8e04697de116e387891b3ba98367dde4ce7a4c0abc962a205e6de38725747ed6655f3c6a048bc11927b81869f0338c5ece9b54f9ff7b253baa5ea1bb4e914ba5a793285d8e80f93055f0ec09c911dd0c636dee1e927f642ee8a32619e9946c817ea57f5234d477b508c7c2d3765e81b15ad9855b0ba008eae1c83f69f0d2f490963c0ded4a06f2eeb339509fae842ce002dd4f38cf5238b224ba697956f59d13e2ba960f2960252535e142422102de13ab0ecd9cc87187bd2881c538e86b38cf5f4674ea8eacbe3f22007f16d6ae3cac9e9bb429a0d88c6452dc902df9a9833c67e3c27e9e84468b3715f14ac4fae9900cda87245e69d8b8edfa55ca94eaaf5bcb4a896ab22c75ea1e2a127c3c253e2d70ef1f27b91415f56311b957195a35b5c953d71f5fd54431479c1042f55604de2d5cf47dd69b70db35eeadc882637116c61c1ef284038567290c9c3e5ddf88cf9343b63bf48f416905235cbcab56c96770af30ad6a9e559579a1dff4c1fee0c88745aec90d4b6d0d9af2d1613a4289fa83f6f14f54fd17cec121ee82d1616fb1d1374fdfd1793114ae9b161c5a3bf105b5c9ceb475d5cc01d3830c38e5f2822e3109021148f5f76ed81d0a54d203ca0c53995320dc4d6d0e8571c8c678a46437b1bf6958f2728ee9bab0513e03bd23193c52e05383f2e872a18962e6fb3db96ca8c97ab1471a4c98f27ed3309de31aecd631165a48a5e079f9fab666bb57767777f796294919920935096e090e33bebc54bf6e22a9b61ac57d7d2fd2280cb8cb811a4569f696c3685ce6b8d72c0db7d902dce40c13d97eb356b86ba68b941dd968d564fd9becf9e705bd5ee1ebc3429c4d8e8634595fbbedb172d55ce32bd7911572fdfae36b5463a46a94fbd71fadb04f69912b4eae9fdd698546d5cd88feeaaa8d359797eac7417399fce4c9833b026ed02ab34c73cf3cc3287dccbbdda9feee2d6abb494569a574ce49713414af0d1a8f2646a3e66b61e4da93abf7959146aeff5d6f79a93e771d28d7efe86fb8e41ee3380fd3360e2bcd8106cb30cdc77ba0533d6aca42d334ed438dd3b430d334b1cb449ad8699aa6cd4c45b713b93bf3dc1ad599b208c3efba173d77cb9ab92a7eade26fa268cac294326511aa15a749df4274eb2a47c4de5d3326cb7ea451f5fdc50fbd1ba9b5560cb4353b1a99fee763a86398a839c920eaaaa4ed8cdc99b430a94c59cc69cac2a46a94a5d14c293a6b8e6852791569770467eb30bda190a6e1d286968797b550e8f67725c9f2eae762a3bef7adbbf55a2b7a2a7a2ef49bc3801f0abd470abd26c225ad56892e87dcea087df679f3203fd2a4fbd70211f3daff5d4ffb8e64d94895e6405dfc4baf921a36b4d22bb334b4c9af05a28d547953a7ad9e6742f0fabdd63e7b1fd8570d67f3b1c0f00dcdfa75602eeaa8750be79cfedec2de9a27ef8848ada837ddae03cc3387a9dddddddddddddddddddddddddddd3d3eac9f161075a5369588435abd0eb9b3a23c2f2f32e85d2420f1e76723894f22ff85ccd1e564f50a886a404159ef04f90e160494bb52a04a7bbafba7274b14dd078443f5d99420bacf53bf60b53e89f20fcee0319aebbdf465dbda5fd9a3160e62b97d398926ed1ac47223f5f76b58682615664a998460261567526918fca2a6c0b0e1ba0e9736dce538cc94c59642833759ca513916c9fd948ead4cab90ad0a11534d7e5fea4ba5a8981253584a0a02baf7f7c1fdf609983342b0e8dc8505b7e19b4cad0e4abbeae8f6cdab58ad8e5ab1337229a6ceb03ab08ca524916ff2677f030641fcd2c832f69e36412cc3702b7b474431f5a5549f48535fca079956d5971ad1ca69818c1f1d29b47210799221052e324fe6e8a5a5d85f49f346bf4b2f0a640acf8dbfb4919a15cfb634fdd47ea3266797e44f6e5c6aefbf3db86de0732f6e180c29bc15861873dcf61feefc825f881e2eabd5a161201dd6b82f6d2ac57ec34034ac84973192e6d50c0663ca1552acb13c8dd2e3f1a6c7e3f13c658358e98cc6cafd58cf84ab4675b8a23dfd885886ab70d5647b3c4db64bc43ef3783c285cd1faa5c75386abb26e91e96f2eb1f4208f6776909b994adfc714f5da869c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c2ab84a9bda198651c7a557690e5cd848d5a6fdd50b281cc9374f32a0f0a3851f8fa7f4726c23d524adb5c979eaadc761ba6f4a314a29562946fe64fa1c4771a5b4d45ab9eb679496f1935b636940b4bce920d8ebad130762a9e57ead48a3b046d56c9b31f3f378f2e4a1666c88c157022fbcf866f0c9c00b2fbcf0e28b81175e380e381d883f0849b3522c84a00500f2242308ad1cc660ce18204fd205562b093f446079e1c383dc243db943ffc95296e8dc99db0b204fc2e330deb6892289f437de6b514a29a5f4c37177f78fe5a5fe6d134512e95f4b79a97fdb449144fa27c914f6f24292ff2492687bbcd49f6d9b289248ff24f9f2b2c3b990e43f890482209038634e3fbfbd10bdf74eb72b5fa66fdc99bd96c388b64d1449a47f921cb74d1449a47f92ecd1b6892289f44f92aa942aa54aa952aad4cb0b49fe9348a2e8b36da24822fd936493bcbc90e43f89248a3c3bdb268a24d23f3943e20272bbbf71693e5d2241bca7e3e9783a9e8ea7e3e978add06b855e2bf45aa1d70abd56eeff703e9c0fe7c3f9703e964d7d1febfb58dfc7fa3ed6f7b1be8f254a8952a29428254a897a6cd0cb0b49fe9348a268836c900db24136c8ee80402f2f24f94f2289e21441a02982405304814020f14120f14b976d4604140a89804222a090082824020a8980425fbe6833e3eafb56dfea5b7dab6ff57d3633fe38ccb6892289247ad1d78bcd8c54e3a81a55a36a548daaf1ebad33239f6d134512e99f2447ef33a3578f5eafedabb76748781ca69fc4e5309dcb4bfd244ff2ee243c245f8a25c945bae49264dbc0121369394c13417ce3f8feb0c7619cf8feb0e5300f80c0f78b2b8779e2fbc51e8789c0f78b2d8791c0f78b2f8799c0f787560e4381ef0ff5380c14df1fea0fbd1ca602df2f5a394c14df2fea71180bbc105f92505f92305fbee430cd9f21be9cad9622be9c4146fcc806c5a1abd2d843d2968806d1d70f8dd32b1f787a7ae81f057c8825e8c543b8c2a5f758e07a14d72b70bbe63614b729707b0297ba247069042eddf1d2fc272e5579693e046e145e9aff809b8497e63b71492fcd6fe23acb4bf399b8f31d309f010b980ab809983d784c031460aa24717520318f18c0cc3c11c09d5e32e216319f883bbd34440e983bbd84bad34b42dce9251c777a29883b7ff37a37970381cb0d00b8145f70492a79175c7ec9dfc02559f2275cbae4b273996e39592dd7c62d459d52f42945a01cd2c9fd3e94e1aa0c018952b99f875b8a443eeeb3c3d5e1ae5c959b7251eec9052ab9545092325c511ed12d43a9dc1f2ac3151796e12ad4e3d33a93d53b1d0e579a4eca8e3532c5a5b69aa7a6b9bff0f79f1943718a12d91fe369b24331341d348743de9b58073a0e57160c62e93f59188611ea843e94d23572e99fa204fd9ca2040684e2bc025ab95641abd74a4bad34d5eac74b194f8f0feb67fc69a9825e2955a6526538aa6ca5ca747cbcd4b3f9882cd2cfb748201fd70b0fb9f33aa4d5e885e160aad18bb5fd882d125050eefa1daebcd4fe2f3e64cfebbc5415f9f224e94592e66561f0569be3d0f1476b8d54b97ba4ca5ac7473e1875d5d12b37a58d91f0f86bfa683ab9e9cdc210aeca70959b5e8fe338d059f3f43a19a6b108780128531f3db2ce32da199665d98f1ef4891e3e7ed0da3950150d310987994f9f346172e4c8340c4f10cbcd5d46829a24df96402cdde5f2a046cdcad3645569d193559eaaead9b6d25deeaa3d3c358c26bb791a55c3a8b5e2549ecab3ea09a35165dd1123f757344498ba9aa57e7701558c562fd82bec15f60a71f3f1a93c3c3a3af60a7b85cbf57ad12b6813bcc9527ea9ecdc975b2b8d4679ef15c95eebbb16d953bea9b2d76f1312ce74d157848109913c8567ed4947f8410b1e142db0f05aa4219fb020c3f420df14a091a7d0b2f62457e4ef0a22157821a7643fc950c19194ec4779eb54d9cb3e7ab3b9819b9079f2dfb09827ffbe36d33bc958410bb2165f4ae4bc5776cf95ddbf1ba720a0d6ae3e6ac501eddd1e7677c5e9ccb14ab78d6619a7d5be11b16e35b2ea5ee9ff0e9853af749636cdddab7b9def5edd2b56bf7fce39e7cc7cba6b9a0a324c8886bbf02fb72cc36a4a8b9c92276b8d346421ac3c7ddce0835c4e29e4fe963cc968b1328f19837dbf371a2d8f3ab250fa24252658499e98603fdfb921fccbadf3625c6ecc13754185d97d7451480c41fb791db7d5aa6119762a21ff4b52cc14934dbaa5a1a49335c4d9e4098aa6e18e83389b4449d13671731e88f4cb2dd3b2c7bc4ecc475e88d1bc66ffeee9d7dae176ffb9c3b10aaea4267ba22af58dbacb1ca3084a96a8dcefc38cb9314ffda6935c92792e8144042944ee271bcb5660ef55efc946e1d21fc33c4c4f18ce329f2539873a9f4eb2e1308d506d334436dc721061b68d884c676278da0762af65a75a33d7bcf0264b2976f1ed88f4b10d73ed23335789f4cb2fcf59e7acf3e7ada3d1a842f2ccb58d9cdce75988b431eda374fe6c927a5b2152b2c9e9984e968aabd7ea9faf40a4ef5fb7ba711f16c1fb26c997178a00df3651ec512ea955e977abc391a0f3347b08c1020b1d38f714482041bf7dd67931151d34e2ccd4223169cfae73e3c07e99f64ab333360fa8b1c0c28134ab634e92ecb70998b354dfcfb03a3c5b1df5c36c7d2c6b1ad969604f437b2fd35e6bfa3db9e770670dd384e4edcb2a44c355b57dd5826a7e0615754b81a1be0f0dab19d6d4bb3a56334ccbb69c9c9c9c9c1c6da62f98c3e570395c0e97c3e570395c0ed7f5f73b1804b1a9d5512d4d5b1af7ccd2d45a2d4d5090a5c9b22ccbb48fb3349aa6699ab67d9da5b1570405f5f46cdeb681ad2314c471cea1805f6cee5ebbbd76d7ee5a6b776dbfa65456031d33db2bec15a9544fcfce8ebd2228a8a787c5a29402c14382ae712713be1978e1c557824f06de1783adbb55e9b77dd5625896695a6bd3b66dcbb0ea7d72f0264bd9a572bd5710c56f198749a1380501596311601174e1a31fc322a0fff6c3db415e129fd69a8657cfa42fb0a76d8fa09f66394c7f88bd389c51968bdeb92076ae7d46a5b57259fdfa05d1a459fdd3e338243ffee8a74f8729f9d04f3fc1cdc223fc215c92b96c1609f7cdaabf6da24822fdcfccfcb4805c39a87bead7fab559d50b62f822a6ae265935c4f5c72f47a3f047cf237c20a3f1f64e93235c7e1ebf6edbe8e7a4235c8e0fbe37bac44b8dd427a8ab51e0d7a7461a257ecd5e8ba028e2e669b2864fb7107bfaa751e1572be41ad6300c550ed33bac59aa5f77a8507b2aedc9d50ce266a4c998a7daac79aa2fd3150d62495fafdaac6651213ef8d44e9112fa29449c12d2301ca7abfa3febab52c4eda688339ee8f61022c4fbec857ccfb1b66685700f0da7845efb9b99997df4a00304566a06c329a1d007f13ec3296208fbe01e7b0c07f99ecb5e7b1fd96bfd18cddf9c999626a5877bbf4cd34c53b93e165ef0d297c3745fb7175539cc873dd2d6e14ada5c4f6621d3a3f0521522e48797ea27e1a5fa19ae8fe11c5eaab54b512bfa66b362bba199c90ebcc9526a41b5d6ba4d87a974c670efda7f1f8446fec2ace06719e8b582b3aa1ca6ae6c96bf3b8515946614db1efb3a4bf55b472be240b354a7bb2600ead39b86034dd26dfdef4e61458aacdc56ebccd4c32c26e2d5ef622f15d3b2ac3a36a5fc56d3cb0b8ba95e93cabd9a8ec02c9fb7dc811cc6fbbaf25aab8e67f533af6a88757a896e1b8761db86611ba679e9f559a55886d9a8b5de787d0fda3ca4056fb294263fb3beb706d1554b71883824c46edda2c9bacaeac605f12663293bb8f738ee8a9cf7a238a4c98a55955b0484deab560c63a0aa569a8b767fb7df941dfe9f18dfaac9ead97f6234597f08a606b1fc86e4fa5ef60de1bc6d0ce2cb13d0339e8f97363188a5f70d51a351d9635f7e3e487d2a2d72c5c975a5c345ae5f18b962e52746aeeff9c679e2c8a502110897658ee33c5c9a54341cc6c6c8d5f3c9f55d4d56cf880371ec0579479aacdf0dc452737d5f764f5ea69fe34abcf7ccc31976e36e526996c6b1ebef615c764bde84612525d89794601c97795c9679f6df7703d155b923b9762acbb0b736dc97c19f22482adb703a299d54ca86b3e16c381b2e555335a5b3a54e74441bce862bc1a50d874b1baee4bf9ab2f16cc3a5746aca26cb5e4aa7a674c4d203291b8e4ba5529966c3657fcdbbae0a19bbeb3dc7bd17247bb8fc6e4dd9404cd9e18d5615cbb22ccb2acec5b85b85e4924b45cda509ee8c8daff1e530de1a5fde1a5fde1a5fde1a535548a3aae072f6345735beef314bf36599d5917dceb0bfa8b7c2321ac613a34bf58b1449230d2346fc483e92551c2f2b4ec5095fd85bae86bbcb5f4039e8f38b95b417345dda2bc31ecb4eed0e2c7f7d2da8515cd58ea8d128bf26a5e6d25cf354bd9f263d2b345983ac9c0da2bbee05dc95330cc42be27d1cc7711ec957ec3bb925cd273448f61ebbfe8e659c87e791e7d92bb924ace4b9c7426b31f758092e398ee334ee665f7247230ff3ae097649a42f2921914a9ef499a52195ecf032168e2f0fc3a5acffe4ce6c4245cde30f0a2e4737d15c4d7e3410d3c8ea0bab3abc225e2b7c99a491b3f76ae9aeec487845b0d7d25c8d72cfdcf57e3c2be45abfa47becfd621e8abbab44c165965d0e2bc9b2ac312568ee5cdefdcc5e8914eecae09f805ff2a941f3afaed4a7b9b4d7a6e28c682e4d8d5c5335675d6e186691f00f1fb33bfc6ac05d391cbd774728dd63d89350c4545d4179273d46f22a8fe132e5331cbeb0bbb2bf6320d867df3b2ea5706c033473d8e5de3e0148fec348302cbe3f764d4cca202b1e8e53bef7c7defbeca67c2537e5c3df10eeb12f79ee625e721fc2484c78903c868190fc8781901ebb52641857d2dbc7deed0e129e2b2a8ecb949393777cc27198639f7bcf3d76e2ce61ef7d8ef98e4ed59a0a3521a2ab31eadefb397a139393135cde9c5cf08b124cfa926bf2df2579ee659a747f88f88ddefe099ea39109f723aca4049752b8cbe4b91ffdf761931f711d6682cbce264ffa925b7edfc9975c100cd15df9049794fce84deeccdf2d4b5ef4a4ef3f5c05cddc9b4861b1f79e62ef7dcf71ffdd6f88c8718f4d92e7ae1445648fbb9ef7dcf5b05b06590d11b1a71689ef4bbe3badf88688a5077872691fc352b82bbb32c95b92d19d59c6bddbb1b27dd12d3dc0136495ed87af4665b88a388718869848771576070978edf59617547f7a101f04d9c9dc7bdcf55693f57b0962ca0e7feeb9cad3642dd264fdee653af3b21a86e7e3a5fa4df3774b07caa5e6d27cb2772b4ec509369d5bde84cb8a9d3090969fdf7d5b25260682ba7424b6e9dc82817c8f65b73cb0fc6120a8cbc4258e3c62d0e4365ea63daba37bce52c99b76e232887d8bc997e971fc79cb9b293ccf0fefe9edbfd021c2b738724b0b2e6d1a083ac4186220a84b0b2e6f72cb87d75a6bed6796c6ca7878edb75c129737d67af3362ee9e9c37f399d1e47a3c23f3d66694e388738d338dd70025173393e10f6c7395a0c44874f2d1256089dc1e0ed5ed4d1758f5747f7e07b1f08be4cdbdb7de28889880f5ed38bb767c207820e3173f89d7d938ddba6dbabee5ae66767f720de9a04dfdefef1cef0310fd0aef46d09717993f1afe067796a6978a0e10af9df25eddbb07fc20f825fb27fb26fc33ea95116d3d3db0f3fb306b0f1a51f4deff2232e6f7c8845f0c3f7ece4113ec8e3fb5bd63c4ebce3fbee3fdce1097edfb2fb952780e9bf038098656c692983f0b038a57bfb5f4af7f3c31ddd77f81d0e92ed8365f73d80a697e9f096e1b760f00b31c436cdf2d3f2303d888198fec3404a0fbe4d87d8a6b3e9475cad12f8c1776be35d70bd71faf0f4d6c6e9edc982e06847db3df8e3c97e68001077a1155fa64924f2adc5e17be115c74bb24f6a92da264923b3fbb10c92fb3dd37ba66b63c734b55c6a9198b8bcc9f3c79f8d6a397d0bde9a6c79f0f6cf5bfa697778cb4fcbe38467932de4af3c886793263cc9ff481bb7b4f13d7c4fb2236dbabf7bf2c1077169d3b99fecf07fdf8fa69f17fcd9a8d3832d2db8aca7132e6bcb254d36de87ef95eec3ff7da5ffc6efc6dc7ddf1d1383d422317e4b774b1bffc3b7dcd20ab05c791bb8f42b255cdee48f66f2bbf87fb8a54d5e791f6ee981bcf23ddc32485e79b151211e35cc9c61c139441e78c05304c93634e38c9fda995ba751f87ea8a242228d4636fcf253e92e8f31cf70bc40eccffc6fefca4f6bf1141aaea2f3c465906cd3598797e9d669d4d4e1c353b80e4fbf57ad736f69ff71caf73b7cef6d3aacdc9ac54675af63c4250d8068df8b882cd97e00c4f03f14e98f1f3e57734bc63d6a0d30aa8061f8d6daf1c32bc5479aec481c83387329daf1bb9b026225c6b73fe2cf3e7895e857495142e5ed5b0ca45fe567f639889fb7196222249f72475d4ad1caf8318472452d88e0185a1b7ee217061b7ef6c11fc710864c835c438849385284fe8ba32d1a45d5701911894dd256a95a0b5be424c4b455f6ea7387f1883b99267526e0ad02cb26bf591a12c9da9fd806d351524282532c16475da2df5d21ce1d5cde942f7af1cb2d348eb8b4a13bed7fdf71b80a2c776fbdef3a4e93d3c3f2463fab3e461899669e65cac553d72c51daa2d4d5ea14bf09312658de64b9799e6c3175c2fcfb6f9defcf93fb9f90feb78a4995cc94b2788af09334e530271be67c2826cc7c1fa0cf4fc2219a5c4401f93654144d3a76c549d6378003a9ce06b1e92d92eb27e139aa0a2be3141b2d63bf2981612222d0bebffe8ffe205d54cb807e2d8a0c9751e4fa540a52de9aa44195ab41bbcdf771d996b76b53b3a66519a76d1e11d5cfccee05b3a507f25727697f7befb634dd873f1b4531fd90c565f7e1530c44bc216669aced7ed66f5e22e077957e5bd76d5de7556cd206bd97697a73eaf0a4d970e5be3649491266db36b2bf8580b88bedb7ed3fdb6d3f710e71db92983b363cc255ec28d9d91d55b39626fb69b5cfbebbb3a95a15356fb8aab82591584af285f0f279b7041f5576c953094750237bd4592b18925df264a9a0368c902e6cb25c27c553d035d658e395b3d7dea325073c67b46a77d3b68cabb8a9d42a41d7d06897211bb5c0044cc8820932e0c2a81c0b10a00223002581c7c814c4e08631dc60e4e733c2e6031d8430810c31d4ed0424159c618c2abcb838630ea8318e8c91655996fa5c9d75aabb1b47b3c18431d018a500a2c1db828ec0093270820ee8499e4a30c30b1814b23600a1c21bdc70062f8660849d3698810d991ada50bbb12cbc90c3115c42f081834f13669c0d6bb8428dac339c2ccbb2d476c58991231f093ca0369c90fcdf9560c68b7f0e7f992326eb436373833781a065d01fd6b3bc53b47189758aba5473ced97d5b4893b4538d72eafd4d839aa4a94eb5aa512da45165a7cad6e2459f1ea194952906bf1069e37ce16620b1329ddf78873c595dac81d37ddddba799d81d16e725cdedf37e9b30fe1efebaee3fdcdd25cd2bd6ee47a40e93b028923cfb795f7edff79ff779dff7951eedfab7ae9b3807eb075d10c52647a4abf2f344bf3a67842347d6b00635a8210d69080a42031ace7006cd0c3e28e105571803280d42386286dac386585bf046f0c3186a308314f35482192a9c236ef06c1962397fbe877723018b31e68082cce5c99a430e9c704216803044a70464a8c18de41b9e277801a70561bc80094466ba0c4672f9d9e00a5b64799271052d32fdcf0c35cc0832032863799261c6192433cae82165ccd30d388e6b8e73ae721897691cc76d94e3a6379d1c883dc7052eab95db388dabb472185739e7b8e638ca7193cb9e534375cebdfae6eeeed5bd56cfdcabbbbb7b75afeeeeeeeeeeeed5bdbabbbbbbbbbbbbbbbbbb7b75afeeeeeeeeeeeeeeeeeeb5babbbbbbbb7b75afd5a97bfddcbde3e63c8929cfab5ebbbb2bedd97336e664e068dbe65e39318a289afc78e079d8cd72cd9e7f58bd14780228cbbe7e7decb3af3b1c37617f80d3d3aca5f9c45017862c0d86551f95f6108d1b27b3e5c8318eb04abdd188a492549e25147a83389b3c39f970bcbc90906825d893bcc4050a8a3591e4a5b9a4447b1316d294a76bbaa6cb02514cedd2ec61d7b3e79f46b34f49b134b58223cca3d56756c1ec4d48be91b86ed332ac7af638598b6bd05447058dbfddbef0929c88e8a521cc6c9f7ea58f622bcd8e59b06affb18cdac72c1534f5c1aff64b9567c17c304094471098a4cb6c4991b1a7784443ee713cc3054422911930100a858c644014c53268200c43324c0182e018a8b0d6ba36f07d9f186c3ccf0b0307baae0343151cc7a5d1816ddbbee0014dd3bcf0812ccbd0000116820a815a83f803dc45d04e74e7debc8919f363730dcc8064b672f6d2ac253177548c2b49d6ec69d63cebb4182c57addb42317c79e9b830d4362f4012db7f96a6fe67eba69227967bd044365b8e7f344944fce68c6916537e097d30c029039a98ad9235908ccc560886d9fa918119f80540fc1eb454d078cffd0f109736db348ff3ecf5c7798f01f11efb3cf0f3bc07ed0e0f7fa0dd9aec0f9b4eaf20d63477ae4fadc8feb6510d7e8e65dac675d877b6496500030c30c000030c4ac1c07ebcc9524eda5e2b8e971722dae6c851b1cc59fe4d2499692351857403cd6f5031cfdecff0bc0cab73f69cdddd1d7a3ff260c690a88041c464070401c63820081295ef8fc9d90141809a46a202f2505731d90141b8cfbcfb10598ddb1f43e0f86171e0f8311aa5d81f43cce0f881e3c797638fd6a394ef1f626606c70f9b65a3148b8798c1f1c3dd89f76b7222be77cc3f288810028a4f0821a01847940f0a229c10028a8f0821a01851be17114ebc9c10028a0fc34694efbe5e26229c10020a8e2be2b96be298a0ce792f4ca05e3c14ea45243af15e982802f5e231817a119d782e268a7015817af1dc4527debb5c26268a40bd18f1e2e560ba172f35bd4c7f380e43673e9c0fa7738159c2a55b6209975088d4b9c018b1844b07b3844b88d4b5608c6819b1844b67aa39bd2944ea7668b5381823a88b980091041a48a552a91901bc787d28bd2399662239fceba1a9631b584345dd54e34eee9d19c36523e8d69a673bf5c697a318d937eecc18cf234f1e77461e8c3d185ba34f16c09723eb47005f8e65e41e7b461f8c3b354fff74e98cd79a3135dfef9d3163c4eff7b2408730f97eaf880ecdf2d297f28204d03d60cf9543202f049a315ca65b6bd9330cabaa9f397d191e79a019e339040ad198313e7c7fe8053ac40fdf4fd28440938823befc3642f533477c290ac9bd9d1e284ca3513d7c7f083463e8dc7cb83fdc8ebad0efe1d2dc23ee03eee94e2f390b56aeb780650cc7a1df844c00a8ce4e8fcf4e9f314ff4556e6781bad0e7e16ad12a92af036e10b7ae567d8379a29f721b07d4853e1ee2ce5c1cb7552c151d03caa564b83d24d3c75c991ac9f489b84e5c212e14d75fbd7a512fe689fec9a55f5017fa7f9928e2bef8b85a40ae0fcc137dd2050175a1bfc335c15c23ee12d7e57a8beeb4f20c75a1648d8f002e00ee0d563b6bb67bad1896552ccb346ddb386de3b8aef3bcaff3becf5a100c2d1886a2180a89c63a8ede74144322d1388e46242425262624d2c9094a4a4d49f1a629a3afe6927c35b754c9355f627550afc4c4e4abb924ab83e69af7485fcd3da9a9b9e5b681350fc5750adcf752cd4fe0ca78a9e625709f88c0a54f5c0a814b1f70a913b79bb8cdc46d1f2fd5bc036e0379a9e697a8f91fd775bc54f30db835cf805bf30ba8791f35af805bf309a87904d47c8f9ae7716bfe00b7e60d50f305a879256ecd13a0e677d47c1235afa3a6e6696afe889a1f40cdcfd47cae79999a17c0ad79236abe889a27a2e687a8f9989a0f40cde7a879989a47d5bc10b7e671d47c10350f44cd03a0e6dbf2307dcdcd81f859318865edc9fdb567c6b03695c39cbe7fc37118977fd971180ab01c66029c8adbe1589ccb611ef0fd9daadb7198261c86896f077cbfa7729825bedfdb71981fdfaa161b251f4f2ae07ff08185077c7f071d565452504e8e78d24f8719c0cc9790c88c46bc28240ef121683fafc3f1db4f8709e2b59f19f62f57bcdb8d934c9beecc2db7246d5c558e39e79cb3a4a45b52935bd2572eb756354ed9abde699e9e66f54fab6c5750d92f95e3f8ca779c072b3755006e5abc8b30871b79927105501ebf6c9118e659865e499ea5493e59c9bed4e1bf79f21faf9d2efea21b4ef15217b024fb5b94ecffa5647fcfbfbb25ce6e2eafe97efe796af91d76b0b1830e3a94745859215754547e504949f1210505a5079493139613128907928909362929b92524244f321aed301a471d46916845140aa9844431450c439410044f406b49f6fb4c3ecf2bf1ba8ea4e3b811b76d63f6a75a7651f6cef344fb3711cbfde18ca9d9fb41cff3449fdace4edbf2f0dc985a1aecbf1983bdd3d9e09c278a89d4c736ec78e019c0f3be2cceb072b9c0e59e79c5e9aeaa1c917eedf66ef79a7ed5b3e8ee6e91e48d55afd857bbbbfb0b81ab52a1aef27c92bbbb7bbfb340f5ca7989ddb5bf21789b0b4ef0727777afd5dddd3d737777776f81f6c44f14401488a26659966559adb5f6d822ebf1e3c7c78f5ab32c7b0196653d56b5c78f1f1f3f5e35556badaf5796bd5e2f9aaaf5b56daa30b4408d1af0fcbc76aef032c9938c25749177f0842199bbab20bb832183ec3d7cfcf4f011851c6fb294283e6588a588bec8a75164cc98d053112b53511922faa5a82502ca148bae909217bda7e592db05c98b6e163fd3c5080665ee62221fcf6bcdc610a914da4f05e2cd3929a55e7fdddf87d164639aebc7a3f1d048f123566d47acb556add6aad5aabda8718169bce7221b432c350dd474e6a99f66afdb7c74bbd07ebcdbe661149b0e96379966f052d1d5c2e892c5be8f66effbb809dee94d2220adb5dad0b7750e6f17f5492e91f047a1f7b66de3de033f8f7b2ff49ea509bd28eaa0b9da1ed34b9a18a0a591a286af23f465adb556add6aad51a12bf20b1dc7b261f77ab0f1824e2ae97492e91d04be10987b2652fe5d332c99d4d8e3ef84257bbc13c915c22a29ed9428c22ac691a0d0a0c56437458282b1418e4feaa85d1a812063366f6578d470b23b78f8fd7799e177e13eceecca1d5d1656388a528c4229f790ab51f2468aee3f8dd12ebcb789542fb11591a94d53cf5731765a7517c70517858a29f469528221fd1182256198d5acd98a971a1ede47e6f056f2bdcd774aa80da835f4601c1103529642a68d69931dab7df8add096229f211f94c141fbbb12481fe203e098e2f3729c587a3491aaa3429800088ddaa87b0e4ce478f0224714493d4626babc5ad33446609e2f7d22429e6275aa7513f67f8bdbaad1386df43c2db3ad706cb6118625293e24f54d7755da7f2294fff88240ad0c3874ac3d09697e88884a3513c3c65c93447a6e33886dfab460db1427331b64f9791698791e98f21123a3cd9a81d5aec9832a5b3ad6d8bc4fdf0659c069d6c8ba52eeaeaba5e9d5a6c388ed4458db47cdfb794e10fdf780cc3ff79412f00a24b79e35f9ebeb46efccb97b475e381bc3ccacb34056ad4cbd3a7451a85f2f469eb433b5eb7e3489b52074bdfd676e338765d17d2d22d6f7209fcb04b191f479e69e417ea1286e3db1bfeb43c80a02ee1831ec0d16408fe0d8e26435bdee41eefcc3f2dcd4753da74ccb0457f2b975c59f99395ef61e559fc5b9975fe5c79f096e01b374e7a60b9f12eefb9dcb8419e90df03f92cfd91d7f425776545878d37992ef9e02d71015d4617ebe2f2d4d2b8984c0f9a7e34bd9dd9657af3fb5aae57bf92695b4c97ec3a9ca204f8ddeb00ff26dbee346ff2b5e97cc2405097ef65bce5f67f37345dd297842fd3e42d3f9b9e5a246cbce94d97f460497a0fb49f0282e3480dd4cc9e4a198e644a5f705690f118e1a1943e38da1d30123a782f77668c72516e0f01dffe67efb74ea35ede5a6b5f1ebf876faf8a88bdb2fff242adb516bc23ee82a05c9a5fecaa51f8e9f790396737270cfeb63458a473c4a4ff7049cadd8f17c465b5d779b82928bfc3a37ce8a6a0fc9c09fd0f37e5e4e4c59b72f27346345e8bb1ea189e47dc44d03ce271c4389ab42d36befbb1e5475ce200cbf9a63f91773639e2b2e692fcf14db7b4d1e900f27dcd1303992ba62f5b70a482a8f46bd92a7bd621a2110000000400d315000028140c88444291509265a2a6da0314800e87a04e72549d86619cc31032c8204200200040404004604666a40adaf5f96a76aa10ac6f9b558d290d6f65a8a94e3aae517745afc73fde87f5ac0941b814448bf247977d76463400f9691c28e4e727fea31d6da5007b2752c438678682cfb60d1fbfc5a5d1f7494289b71d3c2355c58123e768cdde99e82f43b8eb12ef03d44a2693eaa8c857f0dc32c987f92c492936ad8edd026677d24a937c7a2e64c051b631f2da1ae7ec7d8c110c1edabe3efc169206ef2300a7cf36af42ac80011c951cbe8a309779803f481ff6372554011ad0efb3cdd344a990a399ddc78e7ec84585a98a2a552e12ff16a9f8850788cbb8dfc7570269f53d6478fe37e2ad46083062f1d2d0b6583338cfbc83eec3a514e250c0741c4c758f87101bb6044c0c3946ac8e8a80a9a3d31660cdd24481a5a94b8ce8e6f10ac15cc6c4ebb307416939bc3270fa33f0b22288989151b910cb9819d867ce832c1f91c6b204e41c70c40279477b23ec7542e74ca43a8a8280775c90d857a8737c2e07ce3315e6322b9fbf995f4d20c4c7316f6017e9e38846385150ee611e23cf2b23c0823e1d9165ecec5caa4eee6a02d0ee599e8fd09326d69b0f5aaaec13c9890b6484afe2b492cceecec8423e5308946d7852c00af2cc8b0b0615ca761cacb105bc513c6edaf55dc043b6b9fa4f20d4c979d0289c35313767d55f06827c9f1be05208dde32a305d3bb783a3d97aa7e1092c2e7ab3711d6baf7cdce1a229db70dfe6461926696caee461fb5045921766d49ade2202c67ea6cecead8932d3cd0448604d0256fd678a37f5fed84f15550bca86d8a0351ea2ed241c2779eeba0d20e259ede1bf96962a6b7c8e80e9ca82859326d9382a44fd827a6a3ac4fd9ad808d84ba9c5b1b3df0df1504cb680c90050b5c24ae072d01ca53570b952744f24844260b9a9dcfcb3e938bde020663e6ce3b080b8db8ce9c6a2f268f444cf088d11fdaa4e01ac8254981a62e646231eb9f32010ea07dfd382af821c960e4bfe90982f89c46c03232cc5c7ee25e3be69f5760d5384ad02d9b6f587117f76292756c410aa5640a860d0d96f3b2c1e9d1ca10d5039a1bf7face80bd8b358c4a2afe7652056ebb96231c2d2921198222a82835811400e8cc035371fd71713c268e0481042b3fbb0af9056540abd8ab978d14ed117869c7a8c20ee14619345d0ed822be147085efc23e7d8fe184bde3f88111aa1f173525c18415f2c1b447229c21aa5222cec4580e41b0417c051755086898caec18864de79dd799a871fdab356fd2ec217922c2dd944a0f8d7894804070b11532baac8e8e3121f85915a6c32017a6681111859f9e0544711e0b8ee0145c707bf3014a8df1401ba55bb52189b1649836d412fef9bf7919d071304512f64c008263c16e1ad2088d863c919f7a1201620562bf3a1e9c970b01290acfcc70d0ecb3703c5f674eb382ac5f34498ef0b41cb9f1a77654cb1ae26268c4deaec57c56b316418bef924595276bebfc33730f3ccdf3ca4f62aab731f15cfcec8b37fe615197c0adc9339c9f44c4da2ad323bf35171af8c24c66b82713265115e604c721244fcc82126e6d0910642005ac8aa8a30b1e84cbe2a2bab0e58859cbcb84d628dc516b92e827eff8198167ac1beaffde3c6228e5f5ac8db598764492e065d87b5ffd31ffcef6922ebc25b1275e6da0fb0f3af33debe6965d69eaf4e1629642e5c140b3eb43286501d3187740c7382a05ab05402f3481d741e3cfc9c6fcfcbdf2377195eb639770a9a73f1fe96a74497f398af968d2d6819a7f9114842c672d603cb9b028fd3ffb795cf5cac8c04ae3865d4a99cd443e5bdc186d36dac2d47028453fd55700ab94439041e9457ae9beb48946f15f666746eada5b918bd3fd1b0645bbcbce74ff59e0cedefd3b1b9562d9050e310df4e4a3d388effde78d5b9718dfadad8a2df1aa3ec97dff4c06de5bc0cf1d862f7e3e6905dbb90df8f9061e5284c445fe200793cfed8924cf8f9c1d5f90993c79bbee33aa4ace6c34ae3c7ff389e62f95238153e98799f346b9ca9f6684c23d0d866519531992363878cf15787313804e370be7893a81f56fd42b09cc5bf29408612b84870f7211844e642308d00db5c183728ff7c1594e98481f2840a28d76701e5ebf34fa6f3fac9ab183f7f3d3908d8e9e847a042603f10cd335a6a2539a71e651202394b00a1a1381900143cdc330e71f2c43de2647f3de064561dc0c93264ceb0ec2b110f8ed7ffe9df4ec4936913ad573ee0137d1a8a6fd7e6a27947ed61d3ceb2d78d3b6336f728c27e6d148fd151f93a8bf086ea07ea4abf543df94668fd5634b46f80bac885e7def7efd3e470b9bb151985381cdc024cd889fafb18791320cbe84b2afa8d39d916f85466ae7d2b77898ac714f4803cf36e0017f5ea7b8cf9a3bb9ea6c0a351d38a94ede463d97e05e1cd448e81d543cb774db9cd44d24edb4e92fca14b1be52421f9643cdbc7da5eb7b3d38e01edd34f9081a9bf018ca8902a7a250e633eae3474a959562c13aae4b224542914cb5522b131a8d6ce89d6115d7a16154994aab92e19551ac57a95402d0c8bb543a21540979a45c502a14bac4b4285626c1d086d1592e7ed1f00af0ad02cbfeaef7948dc944d81ae0294e12f41ecfe031496dd9e3b768f0362ca655ef5fd5d549e8c2ffefd69ae1364d47cfa1d6b27be1eee7884f1b874e126e85432436181f4e8a7a91947e43081a1e8ab7ecce2740246344e2ea77f77232ac2ddb0f804646c81a20ae6212b6e1ff258adbb55a87de8593b6bd0468ca3a75a50a8989d074e4a57cd742a03840d7ea446ae7081a6b2d4e93c500e4e77452db15904c8cef5519d40844cdc22952f9b0929c58331402bb6e3a7123a60854079cbba520d70afca51e8a2b4c65c9930073a7ae8807ea58fed5f9d9b293d10d9ec17214cf2f032cf41494a70e72ca381977bb1c905f8b87e4e77d10bbd12afc77ebf0202245d9db008f08aff0d2599a427d1125047262292ef55202f875f62ba024153b9b12e6e16157640355495a0e451705a43f0dcf01bba93503504db873b9a95619fbd979f60bc7bf99e84a90c4a89fed1ef4326700e58f7e4d95bcc171aa3bce43aadeb0cb88bdf7340e1d86f68ad40222f8c9bee2b764374ec2ba68bb5cb21daf9f511a2bf606d2d1f7b230e09a957bb28feb1238038a457bd4fe0563d600e4e3455b0f6808eca2cc396a603a6da3cf63de29714d3222cb67c7bcd029b6a8ed81796c0ecf4c0bae7b37ea914916e7a0ce9f5f70bdeaa1755c9d57889c3bf4a62149bf8d98a7ba08c408e562fe23a4f9198e2f4ea5c1271a9ef79e8ff4f372128f58612f6a715138257cac55867fbdf6b0f50b8d127c8af070b95ce039e67b2128268f90a266915f079ea2403328ce10fb305062647c44e43fdff2c1282aa0ed177ab79eed339087185471566f01182c94dd571579760b277057114b2246cc4028f108cdb1c0a9391c85c0bb8bda2841a5348f0e93a8e31a63146b439ae955b298217b0d8527f3bc62b5461980400ae77108a0176c7340842d3f1809c81c58594ef6b71bac58c3bac047f5dc274514d7e50349045c837cfec8e6eb083b001aed2f8cf0c36550119ef38fce1571df510364b94f90e08e498d3c92c53228223acc0968d0fd78d00e2b660f634a52cdae3cea83b7e07de251f3e028e80773b4976b87c0500d76aca6a2d4c6e406e2a4e909fdde9e28e0106b8ced911d753db09539642512f4ec6245eb27450608814a14357d0ec540a9ce3da53b8eb1a4868578c19d32243594492f862511300e6d6d8694e11c69d87c9f92a54b5aad813a05f4158b147c89e64c1a1233399a95da959c8c0a1f677ed49a00187bccee5118747fd1dfb354a51069530d0928a9e2a57042e2cac4b3c5c079e2b40fb625cdddb3d6ddccb5051c9ba83a4358b420a6702949117eb563b7986ab31a32781bbfa1881b026b39136e95532c47e97a41df8e45221dcc5247a719b7b983401c2f3258196212046816ad02d8beec273d0da4343f28f74bdd3f56cd83460b1fdf7accea930b270fa5947e702edb682695649e24aef4ed4318563a14660be9147dfd11c0516a38be384f5992ae295587ea56257f8a937b3e039265b574d6f03f9e210b39f175baeef74c25a62217b4b4241d3aca661e307976b17fa72a6c51a95ae2d92c3eacb541bd1a5394f19da4aae52414ef41dbfcfda71d105bd2c371261aa11fbffae550096e78f83696fe11df38b8da08444b536e0cbc45f481024201c1a1fc5404882d87d12f92d477cbeee73c172a71de5b637aae18c83884d06dc6de4387b0f95fc3d79630f9866ed5b4a25b8d5054669166acdcc2f0a0d6494d55e92f5441340f05e2286ac8c434f9c3a25e9f7d1131adbd2cc4e41d3c1b0370cb22b1fc424e49ea0c025e4bf23cd4e6b39b9b494e57b778fd2cdd922f1a586cb042b689ee9971fd3db27f74af9cbae3987a969d1686ae25358e400caac510d2e4787597cc1e7b0bca07d287dfe7928e4e4c8a00223aaf90a7df7d2bd30c56416fa8a6aef8ea314f2b73ac4944b877625937e8c158368dd9856247590a4abe3af56cb05fbb8069b790cb945b79102c3b77af0620ab7e918036816fbec1d1822b2af263ca4029ed1243b34833ce673ae98a9e2754659e42d631e1a5c4c14953025ed9726b35ef52ab54b03a8f09940849220a3006e12fddf24823d08cd8eaea97874de84c697636ef11a855d864acd524369734a4361bf811e610ea93c523a66a4f5dfe0086ff7e724aa61128dd870d0232170a59dc717f17d6a6c9934e3fe8db2902ce2adeed1b809459cdb110f9810baf678f8f647ce01f528215db5baa8741f3dd188c8aac6e4d17a505cddf6df3c3312724f64b2a622092361576a8415faed860139981048621605817b498e8e73fce08b8bbdeed5b4a9d41769772cbcd949b4e37a82b716be147d172f7cd1ea2ee84452a3a7a5f8424118f430f1a397af23ab23d3c9daf3428ff231f25218fb33b7a834f430e81eb9037d3742a0742e2d1aca524569e4eb09c2a22e49aba91e7bee68de0264e643ee93b468ea229ab2b79848bc505432f15c7f42dbac2268c4c6dbb7480eb45183fecf14c63364cc5436a2af14b45155a14dfb200a62f72de647602e138b8951f82d6d9d02c79253edaf810f3e4324db0df58e1a6a611a57b06f83c4d25da19d7881de6a04e5ff5843d2846649f2fb0849cb40074fbed1305df45c933067968aa4ec002789d46317c7a989cb53ad657e81c8e9d38075fba30b90e1c4bc97ca32b5bcd088e33fcea3176c0f8f3263e4d935067b77fe1d821d8ca96c294dce81b47f801f278c0c986f19b848dd9e67dce0989540ff164590e79248fac30b27ed2f070ab15ba2fc761ed474c1781d506ee51693b91a0312f0f266cc52ed6d5f9307d41c4746011b22a004a348b597675894792908ed09a48e8ebad4139e8625d8206b93ae7bfbd0a39ccd07a558de34eed5eeedc860e63d5aea821a0c5b54006859456e027ebe55a7f2edbf05ff27f335f05397cf74e19c1de4b10c5d2d9feed9c9d937c898bb31ec3742291157aacafbf795c94aa27f37d9028c061518a2b5617dadc46ab0b80ffe59c92610c2fc40fd1d3749eddf470d88fa87680bf0f8f57ae4a523bd787866948c3de12d95a5d3a2a23ead2e01225c3bb4c220694153aedc3f6149771286f874029d8559c8f55c86cc4759cd0e4cf6c494b58a505c38c9bda3f6d01793152c12cce7aa5f953e5694bf647643bec25adc91416ecb6cc470332f3744a7852ee350abfc745a6b7a3bb6abf5b37883c8601727d44022f3f0996007d953c40df497c2027526f7ee13284effe55a192466b7ce04f89de28764293d59729dd7acfb00989e6ba66166841e8f4101ece94c5ed21a5bdd531e1c1dcd4ed8c0cf5ff7cc0e48416f4d3254cce0a11d0d6ae2ebee8e6c2fde40e4f67408a4e0cb2512a7af5adb7d2d03f04faed9bdcd902c27336826a258645901d8e5db2c6ffe994af4a5f2308bf75eb9f199c2e212732d484573a6d97186aa59d080fda1d9238b93d564bc00707e2a589e3b4b80578120c72bd87ce3ad62de932597b5264b7e1f49cb8d9daf032d98706a5943b45d1089707d7fbeea0687e4ee6261bc680df5077bcf1180a28b1b0058b98fcf671fd01897830e35b2a2a60d64f9dee037b1edcf4a91088de7d1769861b06c6d47986359b47366acdc73e6c6cfb8dd563646a17123008998f3260282c3dc0ba73d167c4d2056214c5737655398bbd30063fb9a90842fb86bdab1c98b902ca43bef9b2e67fb7ddaead1202bcdbb6088784b9f7cd5925e0a4ecd4ae1550cf77c8232ba0185edc8cadcd3ca75dc60ae74ac6a069f73e46a71d69f7fa63e5f04ae9b494a0c6f94a188b9890d6ea6c0a1ddb44c99ef6a2251508faad8e9ab0219ac01f05a6f31c759daf316fec2ddd81daa038d99b40e16d38b80c5cbcb2656d40992506350d46dc195f8b0f24db38dbf665a7c04d44e79215375becaecce0c38c9caec665b184041d080d21062fbbccb4c19c3995950fc9f14677e9189e5a9cbd6be4170603d0c5e9c444bd20981e6e251d48df5e60e89ea2e86e405618630723c5c621a63ed04f1e2985cdb1527f94ccdd850189d7099fea852002a1fa5dc37740d6bea8eb71e3e63fd7d9f39f522cda50a29921f224fe4eee54401ce483328f3df21a1bb43f0376128f1d036b4002345bc93f3e847671168145ec3d24f32b964403d4f510b6eaf68d332d19eeacb83603627a861c47f8b87f1136254cb621499f9feb8719d662ded0cc0728628b5ae4bfd669b1c2724a1f6f397c82789ca9f3f40586c7285ba757c1705cb1dce90c7b9a0681ba278a03187b1187c208a681c60d7449d15b748a6a1bb0246c9d5ac4b483aa7310860f38341df6e2611632dfe0b7b4e57d8087a0e2de0ff0e35a318f8dd9c858e6c648fc26483f716398f43d853fac3e8f935f7fae9dfb61abc80032724f5b44fee36a5f02abd7a96505bfd38d98bb32509f2f43f1c1499ee404d49f93d6d0527f65fdc5542ca5ffbc49effd49efe9b47c5b55fefab3a6db70313815ab1baa72bcc092586d75725cf3ce1f85f222b78736b4f0b1bba1134607cf17ef137febb7a2c851f6ca37ff0d5b061e465e24a505be8687aa49ca3a1719c9627bea06ae1dadae46d09ea288fb441617eab4e0d9e9d39d357518311bd7ebf81bb01235eff463b5ccc990a5f2dc66fa9b6f5f73b466bbe61fbe3c39880b29f5704d37da8e36b16b357c628d63a3a35200d85579621f57c8e0d0c4f5921df94ffc8f09192499b1123fd12e5da6f1900cd810c41c50234a2ef8c2d1a07762ceaee0fa8d5de326b883e4aef2f27c754470c467a7f1336d65cfb9bfdaf09ce7ac8e8605850d930735b4ddaa06a2361ad8006b80f8381bde6f4c8ac05c8abbda426135c1a5eed9b6ce363f453a1a3c3b3adcc1b08522b551c92ed7fddb96af0052e4548c1e83103704a8194f1611252095e8607b102271990a4c5183254b5cb240e21da70324255be24a66090f683023aabfe3e0018da97e2b6b5dbd707294d6cd392ffefd5dcf9eed6dbb27ff8fd0e942ecee78bc17067d612962eba5e7f29d7d14ab1963967b6fe8f652f507f005d6a04110a734589a2e514d9aca558dad4515efe3cb08f510ffbd19f00e06c5b6bf0e528fe971e234ca90fd8005283a5d2bd9ad4463811fcb36d0f51a1e4ac42f52c75da7e7f3b141c9bfb812b213acaed14479dd05398e69b6289b7d17d98917c6680d7f841a8d5681020d34b413938ab42bcf390359b06b10a090d3b0d5e5d6d27bb59a36c6a5d9c11fcef56db62b6c858b1fea79d6bd88a8d4c82dd438d9ec0982d1b5bd6f846515689a3184dfd448065caed77519ba0cad2079f4c7d8ceab888a2bc0bcadf2dda9c993aa892504b48583f971ad91fd92a14572f884c9ab48a02fe81bcb71016d5ead1ef15259e45397fd1419021919e82756c206effadbbd35e3c900c6ab09478d0b7375890e067460d5059f838b46dfb6991ac8383a239d924cb19d4dadb5e81afc50490b5d29244a91ec270ef214c9afc032921ed3b22c51d714ad9f910563dadc747b2a9a8fdddd5cfa81e330a6d82c286f6b9a74629962fd58557433a126c28cdd02e588f18637474e8c2a9d59388c5bc504109f3908d3f2600e173c3f9d8e95dd6eac95edb8d009223aa2fb102227a9812549a4f2b89204ea9f5f7441a468610417662ef844604968dff244a722917de669d9ae1820dbe229846a1ee7155b37b430a654fa23b77255c05ddc1811f8a4162d31d312f49e5ff280b13d4400ac2b0e2a2826f4d3c2772048f725a940bcdd1fbecb4f53f973202f8a75eb4768aaa5e8d0b74e5e0cbc8a119ea904a728b436f7b771e54075a4d9c9d2669b9ce69db2f3b630f5d9d4a0adf06ae13988af370518139796b7198f98021371cc582eb869512e1c97c44b05640b1acf55529b3acd83d6862d06fd5f7577b25a6de0550815ae05202b77f0b5a6cccd49abe910b7882142ba4e16d558c0fb5808e95be75fc27c803881aef4b31a6533f36340bad737098ab0a348557111e6d947a598f507978c2ebf83a25375062c324d9f0d59341333d8e9a730f10456153dd18bf7bd8bafaae043a02c120398e437587bcdfbca6197ba0c16e79fd7fe690fc33bb4fc76f3e42bb5bc5210b02d5b99e3fd96777b108fb7757e2039c1ff26907692a59fa7493301071923fdb683146369a156f9e5b7b1fe3082531af8f32e873812e3f31c294fd6f410709e075eeb6b7ed35492eea9f72e9dafad0e4dc777eb22c07960658fa103a323ab1752c6be91132a825d6c584496e2d8cdb0ee6070650f5f956b97886f61fe16fa198054e378981a393b490cc27782ab15ecd40ae9a2508a67093c9d943b0ed2d588aa2b30377e34b8cd277462d2c90f54d0c45c1b04ae9d47b5f88d015c5cdc8bc43e86246db46c54f959660fe3464885d442f03dbc24b49ed9dc11de0668f7296691b247380c2cede99c70144f6ec6d991d3ce4e66fc667da086e8ef76eac1193fa3d32255bdf58a02e7eee03dce9396777c58a10af6b6f7f7634a3c399a062f2869c9ab2a1f69ce3df407c2ab7f702909175fd8c545ecf8b7a82efe4d74af7f2ea1124f025186be39d1dbaf0c8187a8cf763e386b660b6c7a1e791cb6fa662de90aeeb073a7cfbec3da707b8a62d0bbe0155f393d6b0a336cb4f4788f8fa68fe0268bf44d3e17655a8dc5ddd38023a9b7ca96f0916d021b72c59519ce093645c7e8fd6114b35930500012c67cfe6396c417c141ed67149877bf8445703ecee2724484059d6dd0a8dfb1bcdddde30c712a421ccf4cf8dba98f9f1431298e5772ef3a5e581d757c299244edb1632e530df68a515e2520e5f3111ab5f6ad2232bdb6d6601bd77941ea1ac704455d5ee435e8ba829b9f1c361c25bf7d5023e70eef79634f3512390182145149a1a49df28597a747f34b6ad7800de0bf8d26140fc50f9012738593a6dbb3351ed9b8f154ae716b804aefb3aacd29f700e5c0eaba795b6ca3f2315b9f6e92df81b6c5699776c7446241de80a19135476b5bbb700add24945a082698424f43e47d922d4fa64d4210ae217a1b4422cc1266bfb4bffa4f93dc199e18915a684ab89df926722053eb3d944a680f420e1a09572f9bc60959d403934e371bd25edcc80244eeba44c8562a9ab1bf42ae38b179aa39ddf45b1ae4dd5be982e5e6411722300c73696bfb7513b91300d0e6d89aeb403daac14ea679431993968862645fb8492d1693e22e2df2b32bdb191ed5f9d005aa2459c65c11e39d1a7e0c6c8183dd17fd2828375450992d94ab04f8e69a28dc044c340b7662b521028775f20f37e16a3373739723a765536c789e46e4639b24c854c63fa229b41efe196ee84556ea5a4c0a694b10947498de7464d24fff128f01e6de52e1f723eb82abe0f9d3f22dbdc0c2c0a43ee7f550fdd2b8789fd57afbd8f2053b6df6bbc4b29490a8960ad55fb3da16b9306a86244aa484beaf0f63eda364949c6f21724032b9fd2a8e7c7964568102892cf21c98c7d70a3c13c7e1d0beff54884f2ef26e3584144a4299476ac4f341ac62f794c7798946732fae533f494b8f1e973571feb2e888b1ec63f550fe209136227279968f648d4733ceb6548b3004b7c803e916f37f5e0256414b78733013339c779b2a6e64e403a2cb12667f0196ca3b15669ab7579bda7d2915e0db535a8e4187ee1c489abcd63274de98b3e85d537c666f5b48f06a1b51c295a4d18345563e215f1753a9782413a42d0f44835b250265b137f7bf2237161b4ba2497d6baf30c36ab48c8e65b62f8ffed27ee90af28092fe0c281081f782eb19b8d634086c53addf098d87e6550e89c698dfca9c2cba8f89373b311698233244a34f19ca5b50c76cffa136c78e443a3573e2a810deb5b2601364cde317b613644ecef9b93179b96e9a8c5b481c397aaefee2639e4ee76f819a90763717dd97d6fb98a2dd8a9f875d1f843f89d2abd3496a75d6157f5da49f014e4b23824465a918e87fab35cd356de08df58938a7a640b77c2cfb1822de6d01ca74c89dacd197ff59826c4f57001a01b4b0520226104a28a0cb9231cdcf136db660b32ab725d2ce638874cde9e45d6c359090ab00864fd05744ca4eb18b8502985f7e72f8a49c65c3b81e3d64b64a77fd0c99e41ee6570250235ed0cf9977a1417dfc443134def190a240d146f8cfebdc1007fa831829016536f0f954943cddcb6d4c2cedf431a94f15867bb71278347855afbb54925c9e46f2bc617e825b23f3789c1ca871b16e99d93f40873d514d0524de62892401a012994bf663e0bcfc08865d61c2182081602472644702f2282241fc073810dc1588c291a4e5746d7899993dbf88697482671899ea86212a2c55e8821f7eb9a386944faa8c29f45236c012d51a26c5af585d68bcec5178f9b4391ec3e7f926b3d03feb24575ea12002cf342d70dfe018e9abc2a3f61ee2bf8e6cb09b2cceed3dfdeafbfec66c41451fdbefafb7efbfffdf55f6e66ff49a55a96c018000389dcc860448ae0b623f1fa05f0f7340c432a97a880f78727e6c9782971d84b6f3a81131e8482f159136e0160136177755f3b4a9fe582e96f12dd346595a762fc22f29b563b1e5ef208669d2771646da3d3a8201fcedb230ad09b74e992c19e851c0e9bda61b48d5445d62cf32645fa357eca80f8ef19deedcdd216214f2e80e82af9d3d0788b18567ac2b127b5ccaf5c337c5b22cf0f5a4996be3744bacb5cdf02bcb00b4952f9e5df5b70374524e6aff0665b20c95dfc01390a157824b52d40c44dea8f4d5bb00e07f400b7a24a0f23ba55170c9bb2a276fe5ae37f503c9d6280206acb063ef3fc2c33fa070606317e1b74d6fb6b2f2df522bbace474506844a0052e55e6ac4357de6953347ae5a23008f8a30b7b64940ad21913cf73fac15f13df941a21f756f11bf821b7ba4869aa443fc7e813c9eab2500c02dbafcd932b11253642e43839d581ec0f853c33ea29799d6edc597071a875b30ab5b85491fcb1bf0e0594368517c7c20ec904e6a67da36ae8c665f6bdbad011c1c743a122daaf16969ffc108c3f092d487d11c5532b015572f0514d0d7b94100cd413427814bd0063470f7c7123a76b8e93390cd6520726e57ad1113b71b8e344de0522b2c2275e265b0507c98d764342a2944bad47bf61f08a4ab225296b986c065187452f6990a660b9e63f82fb28f96a072d9318ec7f60755f192148a8b0d1470c5b2e59bdeeaefb3f0ed0bab8d207695d95a5b72928643465e9b36a893a147609821083c2f50ce9baff4f3944900dff0584b0a19610ff025392857e3044047d10aed759d64f8a6cf9ac36551ce0187e4683e61fd86ce0648d19005a10b752c5df26f30e07b26090b36906168689ddaaf79564288115235f99cef95a21293291e61f8221d38b1b90fb69736076725bdca525604bd915240083c0a045e5c0ac619c0c221decddca782e7c4d787fbc55287410f99b136d8d5b1cad50cf991be1914e414ba64b5f7da47369f7ec0b7888e3dbfefbafc0be6d8f0d43cd03977155ea8d60cf2eb5fe27a41db2296db4dd1444d5da910fc088c3ecbf68ed0fc1a57af881376acb9e64fd498186564b3e5050de96fd2e4d4acfc074654b247027e7a7904ba498ae2a2f7dae184a0345e61a4be4744ca823f2cf752fe67437d68eaf17da2afcd8f5ca7567516ff973a430f6d0343104605a38682e3b92208f7b4147986b596ea1865ea4b76b9b45a2470cdfed079c47cef2efd070322f71813ab77bce2133372d99de64456e4f0407eefb0783606c48ae43365251c7187bae635b3ee018ddc3f189bcc7d0e012e95a54a45cae50a8d212422b200ab257113bfa83fa5a22ae462297013f0fa8e8707a04c5131f63d6d94d7dd2f0017690489db60c9c28c4dce701a78c5314864082694af3f4d906fba210f2bf3c21bd7f703165da8e307e9d0c4c0e3fda14f0cae4707b23e7264eb9e28c28e9a94f0edf5edc0c9c265038f08545fe878f99896c828c92f83a93c2cf0d62f391e5127eb97ab8c7d866f4809a305f453488a77f17e3aba1aa28f8c3f0f9c4b00204f0755c2b15be41e07c32db2002f432a895c57f28383b186c9030be1aaa8a823f0c9f4f0c2b40005fc775910b4c3b9bfe51ce2f38de4df704ffb55723771380b3763699b26fcec881925afacf96480192769e8edf486314ff427e7b1d4bab725064ebd302b47d59f2ff53441816c48a0369508286e1cc32ad8782bb9c7d54710e1e373092745768851a270c50f0d724ee8339118a5cf53bcdf92f059091aa6e860adc23238082833533f72971a5ea13313d66cd18c7de3b3b03d5600ea8ed7f4384fbd7996e7ee356d4d3325703bc248f523042113a6be9af4da0164b63ba2f231dc5d1577020957fd20933921e22fdd4a0892940b7519f3a465d1d4d5d9d60ee2eb5046d7485d7eab422449f0b0e5b55e61c8d2980f41ac31263fe434e5aa6f70cf071fdf5621f063293d3654e6018bf0010b641527174f148db05441058aaa015f6830ee309342d8e1102129d75a86cdaccac3f2c5ea4e9ddf7570fec88b62f002d82dfd5b8fb2e40a080bda002483e15a95c0dc262c9285398c86f84f7460e7e44be8ac88021b64d201269349c4c9f478820f349c90b7b8f2a62cec48f81142e910b75ea22a2d6a6985bb630f532c5618abf94650220672d1f3771a9d26f6f3cdc0423315fc7d016422374e6e5f591f9ff62065ce77381c5d9204be98d9401cb946f5df1b2327597c4270e0412b0404b2fac84cea91e8a04ee660b6c2e2ed8be0a947efb2847d15e9b99130553b7fe423fb652fb4b29ec3b1fb82fdf485eb41af36aad04a76d117ab319a9ff0c0299b79fe7ed930f8ef8da4deb1fb2d0e3f37be46c61d1d8bb738fe7d70376c91817d2508a3286bd4b810aa1670ee3ccf6a895f4e63bc141bb0ba2bf3ed3521e7f780efd67d99c3ff771d9b96906522006c86c0ec68f3e902334e4fdeebe31bf1cdb07ab1f4a5171e6c531edf157c355c0246530dcd92b2ab5e5fe458ac3f3f1f442a83f080c8b32609bcaf2089936f8a1a68149f53d7b1b65844e8e4c3e4317b02daa0d1aea048daa32904ff6241bd8323ffe512d45417d9319043ef2511098db1f874b4e8d2cb29e02dafe0c64bcc1048bb74b4f6445e3dfc4fee594927bbcc89d9005f7efb841487e6be8d4a70fbec405a6ffaee8e9c37e3b214f836be84b3afe0548d5b044310986e6cabf5e5133180eb4b407a631be42f1a0a233e744c668fc27799fa8ce1dd2aa624096f3b24a3ac190a55f9c56cb3e94e90e4949f5f67046412d5a512db1f581d5af2d7404788595e25306d45c06285a6b823c7ffba8e9f3ddde7f21275b899c3ee885358845209ce970ffe4435ccec4e093eb167fd6ec2de749bdd88e871fae8475a35a037fe1991235bcb19774d9e56f5da87fa6430002d458c370c9398bf9d55cae85d5a90987b21d592fc18194a4d19ab190e2857a65de34ccfc47f972db1f56302369900d8e04bdfaf467316447205677aa76db7c5b0c39291a0820319a632517109c12f08887fe0043e0323601acbb609591b7400916d267e1d6c89d63e690b7cc94676f997b60270484b321d4cbb509d33df14a4a9fe358a11b007cf311978000f0bd74bafb82171d870e43c7a0e7e871743c3a8e5e35da3d163de6e80dd10d63de601683d22afa00dc7d96e89372af22aaad18780e3425217b52f0c5ee1c36493793f13061fdbe674ec27b5f960b794f3aeef18366a47ff4c3a6402ca3f579e661c51b7d5ef3143d945f76b9dbd0a1d20f067e192dbe6ba524370b66df75368e4a54a1c1aa0c061cdd8d6ef96a6ab615b814284d5cf8c6711aa8631d2d0541cde5714d01cc4b475d669d7d162c24fadb8f36193b28f21219fa2e809d40fc9efc7214d30177d8f6dc72413281658c094431b98cb0e4efc0f290e469de2b99ac89ebb05f1a5ad148dcad04a7a4ebf91f44b8434dba8af1d1c198f6046be13192fa8dfd8ee385cf1dc6aee9c2648219c157010a2d87eb0cfe6ca62e3295c9be73d2ceea80a310c74246309fbb83a03ba8e3cd1a248dec34554710305d71e6cbe6b751b638a6f47ffe3153c50190b07667b020433a5c267b502687804c9e957add3a816cf64e187b337a8fcc35966b1ad44f18586ed651a6a6e599a55c54d1e315bc5b8cd4cf4b9356d40b80cc71ceecf71c485a4c638ea8a5a0cd0a793b986d2c125dc919b01a9e14b2bbc8fbefc42d03aa55352afa79e4f3b7f5cfa9f1101f170132cd124e8d489ae3d1cb3515bab8890cec8f43d8f0d38ce6932abeb9e58c6f5cba3807b805f8cf126f8d16349b5fae043ec3d8c5df484bde36fc9d467a17fbe4ed19cc138f601319c9362aaeddf13d8c341f586daf1874cfd4a539444ddb58670a4a7733887892c154253f7bcdcae4f9f713df7219574496bd9ae97670aaad385102f5919c12c5a68f934093c73f37c3db1468c71b7990ba8ac6200768b501e78effe453bb11405dce2f7ee913631f10a554209a910a287d6ebf81540d7852fa538a12c2247779cb50fac12b1d26fcb4e4c442c5dc7c5c86992038ebc6dd1bcb70533a815125849267ed89b98a014ce4cb0e105c5706566e290c3544d51df28bc443625fd4d5282a546f8200cf92d83bf742b93ef1de69e901e5447c1f8e8f7b6f65dbf72db30d7e499a57057132d67b434c2fe7485cc814f46dab1bd9a62ec652f9e8731fd2f18427908d308ead6adb4b3a672909faa8b2fc3bb1043c1e003d38ac36473f56c6013ef7b4c27467a932dc5f360d62a53dc1aa66119bb8df573a85546507360d0d700c67bb54df912c867f5b990c54b1b200016f6d35b386a570547e3417c13aa208461b5a1a4ddacf2d4a41ff80fbf44568e9835d9e5bf277f2ff602adadedb6c72b4a024e170fcf79ac2e54923029da26920050e4c6a315ca4d86786e23f121f674717e0057321f601a8c7f5b19aafc40ac5b411eaa72464415d92d7c0e233a27ed21e36b4cfcdd3160e2ab86b4b64824349eac25bbfc26e73431d8e209ffee416bbc59899f8c48d94dfb6500b13ff7a3681edf629edaee5c7ec30389f67698d953faf6dafc7b7b4a7f914e9fd2e3853acee73892f5deec35e89ca682e4c9453cfcac66fce82074817d71a9fbc3efa3f60dc8735a2b7f9b3a9c5bce327301eaaab3fb56aa2323f569d6c5efb244029fb07230961bd282c905ee9dc421724e56754922d416b02693b4cc478067af08b6030f32a967191c1a96dc0da72fe69184c3b37ff9793bb888c04e4095b22738a8b612f171b22101968fc3d10debb604a47c91942cfcce970cb5d6a86dd8c56af82ae6e4bb7773ed768c92767a6aa0cd080d82a40255e410c403e23eb406f07d3810e04febfd7e3da42935fd65c82bfd77455e5f898f7e216cc42b67b77c55808cebdbed62484e15e5ca026046b7b3707adac23b87a47ed35e1c7492eda84824c0797532da698a1533fc67c604c4cd3090aac30137b4d73bb3a117986255a3d5897f8afb013a90eaed2d3f5bd029cc779ac9de4fc8fd5fdcea71bc439fe9ef7a6ee5448322161bd32a843c67a23e5ef04c239c1a6ad0790446f670636646018aff9647940e494943a1d0b8d0439fd73f23d56b2ad05e4240a4d4db47de45f500ec0a05da89eb0a3be3137f58fea4ba47a518f026562351ee8c7606335b190e04f24899f9cf8e1bf867a3544266404e5ec5166a12b1e2a89d65ead608d8dc4a709e2f1970b269e16f50afe14986ffd720d1fd84a9d59a2a09bf2917197a76867768da9e2221204dda6b1708b4c01e2a6778449adebddce44f079b2b6c5fabb186b3ef001c4f2bc920725297c446e13090fa91c942b5a3948efe4349ae4f5b5ac77552ebec559fc42633c69297206e0c021bbfcb9d9b342b08feea96f961567a8e49c0175c8ae43e56ae2dcc7816549608bb01545c3d254108d217a35fcd705d7a07f354ce23feb52e6611344bb292430ced131692e0e1b92dc5b7e42a1e3f79673dd233a768d4c28f824753fd1711886b944383342c7d01ae8c5f9ee70259fe30fabcaf3b0bdefe571480b7c7c9a1eebb6cba8d3cd58de4cda6bcc31e6bf8be12104717561b4c85972b822e511b1900c26c2870b901d2b27e82e9643f08fffcaff27c7dacd4965227fb016f061c71ff1b142a8725cbbaad9af2890d3e3e24fbdadce1bc41ff8dfa5a57fe18fde70090399e0cfdc6639fe6e7f3fe667e54921f0fde830c7f0d0e4fdcc2ee1b9e7d1eee7af77e46f7b6434e4dccfe86a78c681e57e9cc1fdf4476fbdded9a383fa95f4ce23f5313bb33f40d920ba421cd91418147e63d5a9c958f6a1960b7bc0036eae141ee5caf32e45a2909b325ef6f82e288be0bf36ad4b93d5590ad71f76d52410d42c3b90b0a5481244f6329bf940ee2b1ce4805dae10925f75d753f528f0fabe555cd3b092ce765164b81deb6bceb0d9378e82ab519e90dd87540cc3b60d2fbcf3aa59209f824b49058331cdab160d12c5037faeb426d969a70b6d980f71d0fb8e00a17ac9b2f10ba6309cc1e32a0270d05d0fc3ae5fdbb06cf1fc559ff2aa7506619ccb346c89327518164187234078d26ed81dc859aecd4067ab205889ec552c89c4ee78c7870b046b3a88878dc22efee38e1f8206a5e4e79cf661402de60cda7b36e7450c0d60b1fd62d99b72aa13d1220e85d9b70a10e45b8ad28edd8d75551d8d706a8c843283506c502cc2b0ca512c07bb14b38a7cb49f99819f00b026924849f5848f09ab062ca88efbd08e09204ae55e35de6a816b30e3143029710a42e6db05688757ce8bcfe0263a7650ac0af3fb05eb004e5d0eb67da9bffda1673d996736a92351b85d907699719e4bb9775539dac10adf0e8c362032d67a3a7659c77677bd2ee0b74b4dc10020ab4968c4eb9a6d568321c633b505aecd5eb2082d5cb730899fef096835c68063d97b8326faff289d9b272d4426ca5274fbdfaaacb276982ff04cfbab6b55aeb3f8743b0b3d2f240d655810cb9c3843a5b278696931f54a58f056f6677f5aab3f56055a9319c5eb6e8da7671a593d5195f0a86ece3ea1e98287ef5eceac46a856776925264899f6536484fb08cf178aad8e9b5e8aec375fcf98e06c96e8e4deb22752481cc67b32e7fd75dd126add64b97b3d79db37fd7dfa8aabe4d8ae27964ffaa5ccda2b0ba867de9bff66e0da4ef507cadff7e7c4a7639432f43b6cf779fe43d53de48363ff62f9edc2032f7566f3e1f9d6f7b7686afe866753cb5d35a78431c1cd5dc2bd0241c465e1e6d2e7f3b432f0176bf87fe712b749e3fd4db78482d12149b6c3f3551a3f434142ef1579b3195b0d8bbf4468d6d4a6fb0cc652794e78ebbc27d9014a0b2bca79621bfa59c1e6899bcbae0444dcf4a2ac65210c916578e843022734a13f1c3ab3a407a1861a1b9b0fa509ae62143f8b2db4a3dedc3fd34d4bc5fe110f595be5793dd3874ba215622b8c64c894cbb1122ef5d9f8afa67a02ec8724ad7d310c580c4281b26c36d8177a2716495fb4ce5406eec7e5dfaa7c652d51d793dd8aec4888071eba445f2506694e272a13ebf81b70f0ae6fe9aa8a30dda0264f2875554be6131bad4b7c5b9608a7e46daafa2d218ac77de4b522d80063bec14b9c7a88d2b0f8b65e07929b53bcfba8c2f26a073387a67932a7fc798db6137170b1680580bff0eed80f922ef38e8d807c509476b2588fa4c09b3bc6624ae064ea33d052ce36876ad4c1d46dc19410ec0484cdb56a21fef99a421db351d99fa72883476c1e82a2df6a628788457c310d9d0b0d9b5bf698802516809c9b88b62717a9056c5da59a38107735fb7b50300a64775d9ae8379518f3f8657b71ed6f2eb1d89000f59a1f82b1cc1ffc6e0afb7a70de66d033885a7dbe4f8de81f4f1f2e5b7ab9f7c15ee099c3242d69355ae458b15a8228d72921a8685f1c12984491027a1db561b67c138291b8fe810671b1959e3307dc87334ce6f4cbf35287007a812834023132a9f24ec87776c12cbe629294e19a48a35fed19731ebd1b0f7e1c0e6be3f25eef845d7665a364c47b7c5c3b2e3e5475507b3074fdd33d3e568a198eb5938337c15e6ba454fba370f7db44f4b25b7601462db707290446a344a61e031df87e6028a202a8c7ad073fcf23a119327e19d44df73770b008da71dd319796e10023d448ce290c84a73298fd70818fb4ed046872b851718b57791244ec6d3c4df9a26b5814adb2e46135d720652611a388380386f57df676a382338ab7e9fe5e508b3946e21d12217e0855ffebef8e9aa6f900daa30cd27458bf8653a4c7acb2ffa71f70eacfd85b8c82819a77abca22e5d0e5c7f74d37acc5ee2949a5d42711930d1da67320e49e055e587117f0d08c9c723d72863fb8aa54d6e3f8c80f8959417ad32edae4e3dd1f24936f3b9d7af16c35ed3c2fbc413731d3cf6fb52d765bb9f132f288177b20c88a1a4b24f5e4d193bd1b8711a70854a36d116d508e3ff0f1145fb42063575b5c913f483b66ecebeee214de2daba27902003032124c22fc6b0b55185f25eaa8d6ee44add413e94a1faf8d8de6f2a44be8547c8f5a7d242c210f60ffaafd0014f6b16c950a7220d96897c7a91fef6e5078941ba18144110766d2ed4795cc38254435d91444771e4249afc26b3a4df5863d0f4dfb266dfcf5bed725527fe24f202006342fd9e1dc516498aa88038fc44c76575fa62cbc606003821f8ae938f0de17075721876cf429c65ad724b8eaca625981a850af7910898294166fee388963b06d91ca7e93a8ca332ddacebc989aac4c68b8485ce1c33148a23a20dcb47585398029a0c4b0f07c67b2e0ed52b46858a022ac343229372103d1323224f147e496aec9d3856a4c25246d30b6e594d8d9790fd5434ad9417b4db03d3146521d4560c1b1bb21321887bc3f4ccc618c278850c80dbc266f12bfd16913c91ccd62b0ffa3c25abc540c3e89540cfd75d038a240cc50d3d073fa1948510c7ed0c7560a8c93ad0efde8f08ec4f23e44125ef88945e85f8e3097fb934870f2161cb5a5b09cdd9eb6b84cb82a34b95451b51b7fb5e310a1c8af51ea3564d73b85a63e68086682940a6a34ecd35c48ad72c8527e6316d476ad509e3219bf95a71cc289799413cda96590fc6509af485dbf49f470b7030fc6f2937cb7741f3997604c1f49d14ab9ce22739514ae42e40b9d2b0db63d4f724dada35d9ed962733773f5a27315551f89ed4c20a02538ea7c4f394cc142be2131f99108cf3d40007f5f9e243ac05d212d26512b691cff4525e5a4dc83022127b6a0ec9be4afa2a5f7cbe535a1a59d77cb48a8a914ad960b5b9388dca60a6190b386dab2ec8ddda0a2b889438e9c1a4835c1f3d6bc348a3ea871848737f95a24df38dca58765333965174d9fc1f6385ed6bd082b6a9c8b3c67ff254e98b461bdace66cf238a80172f2cdaeab23676c4671882d99693929b6958adeca520166a944e385f48d96789464b93813e92b194d81c430c5904b4b19bf6a696dd9d234794b2ea6bc75b6cfc758635e816ce2f045f772032e95184edca8a5391b5665b3b994bf7b5daae417af51bb9485f29ffae1a5cde8d8f563ac97fa30cb699fce920f65e7457e641c84b8b5879aabe1d28a0140fa5e42325f97cacf7c5d866e97be884695db75a0a7ebb0f2d2988f1b98c41ec2b298255fe2fdc56bcbdbee254b9e2423502dba2e1572b80cb7019c1e51ad8c858e7fcb50912db4a5b1a4a913fb2e57993af679baa4422257e0ecd5c90c456dca4904d1ed8753216d8378734f3836f277a74ae5b722f122478b552cc1f3044325d679bebe7ce5f68a409f26ca5b2a08f28ad5c3acdbae48ecb8a51fb5fd05fe11a4a923decbfed0cd4d8dcab5a889dea6feeac5dba0219a86fcbe2247c4e6c928f44822674320124514fdc96160a4f77a20e291d82607691798fccc87d8f477e3f2f32155d02c0d7cc56053ef9bb7fd1694b2432b151eba889e2c05522894147e20da9cf78828f30421c3f6680216bc32c0de93d10f46d68e0b5bcfb7ffe89570ec46314ec9c37ebe22d529fa898a83742daec28278506e0e239eb10471fa760196fbf4bc41fb73b68b5e57c215589931e71978d3b5bc8c6d92ec569226b4c20928f151f5d1fb083e47d48387f13a32170e2200a1b598ce012a3d01445f32c1a736d298cc561c411fe13220b06f712098bdb75dcb5e0186a11c86bed606b7ae6aa4c4e7fe2006880fcabb9bdc23878ef16d0c57db11768a24ff477a89b881bcf85f66560c60530ad29445f363370c3153000dbb2aa399078e50813c69c6631d91528c4d397538e0c3bf18da6d2022c34d1d6023d57cdcce3c19f382c9d30fb6817a075608f2e16c377e94a1226d629360ed2abbca2dc5dfec46d83cdcfbeca2a10283d814accb21284785a5e001e9c59efa3eed4858389ba78509f2f7cd83d818d44f0175a7d96a2505366a7ce37bfda980b3504698a0944fb496d9a66213125b4d98d9ae02d1cf18b0ad984173ad6a4ede12372e7fd7a7fa64ca89f0b0f1a691b5a9cbcd22c2c561062c0c6b06b14b880c7be3eb375005022bf9351e89de642e5c2feff13e94c5b2168d7149e62406e6dd27572924a981b5dc824bd163bb5050f70b2b1f349a46d718f64855654449f2ff2c74e0c39321f0dc749f5df440d74ac240107bf465ef529c61c03b5d321799043d0920cb6fe9cee276042e64e46bf45177a398e757304a1a938cc7adc5c93eae52c3e72b0a51480dc1702e82dd4046243a4ca8f6283fc49208c1a5f7401f591b4b0fd73fcc85600928843b4fc4d0cb04d7c69e41fd8bfe8ae0313480478a58c7b4370efc98e9d9551c3dbb176a645f7b01c8ff238d04a4844d94470c43c666f37834e045913980811093f77321f61e64848bdd66e0d26acc8b117b187da5b681689f66e30b91ba3c1c243f82c336a85caa062b01404a003d577cd8bb31afa12520728c44f31baf87977b7cdf03d9b2069cd316b83730929bf3febcd178a8dca5b11c31191a20e958cd7608a81958099bd683afde2228ca295ca9bd813eb5a7d7bfe50553b825dbfa6341823c759f260f066e7d5bb87b038870744434a1c50913d91b505ddda6a4ce7f46fcdbdb950ae1bee351d64370e106545a206cc4ed86092dd3632d1998a4e140e7c5be7c9ad30b88e1402a8a1c5243736fb9e441ff2acf671ef01c4105082076bcf7d5a3380ec08c1e0949c004d41698907d9638c80265200e15610f7d02e894e0bbd222707592985b9d744b47e938c097bb651c1f9fec27e74e7c40c9f72c4f157ed7216b7dd816eeefaff34c806e886d1c0770223e90d0b6310d0f8abfd81fe88363809ad60dfdb91b0fff0cf8190a36f80d202781aa89e371cad16906548dbd9dcf7e56c78173c654390e1cedcbad91eb5d45597a3e79d0243024d11fa0f88939bd8da6ecc82ee1547d472174340532ebcc9ce242501f6a221929b893429e71f452f8f01fa49d562201b4502719b6a349a142967f455fefe1dfb97a7340d35a0aa317ccc7649ec166dd1ce8e404f178d5c44045cb6ea0c9726f0e04c7505d40cdfb326dec5ff2d42b3de142e63ac12389109a783ba106aa1f50213c8ce482cede1c00fc3fdc8fbc8106921e7b80ff148724a459863607d2ea5342c6f46af379360bac559aa0d9fc95b210b93db00488c11b1443868f62e4cba76032b488126935203d985cf854ea5c1db8f15ae6aa51045e87c573dcbc0f628755078c26a33702e5fde858b2138b1b22b0ecce27189a1769b00efe0a2b79bc8b955c6cad0d237da3b0ce34cfb1088c1c6643cc91ac3ca82f2172cf79deb286ae8aafd75a4680502851bd7f9b31cd3982e951ed7061f7bebad3c0be96d658bc235be3c8ca440a18d91180a7b547a9d0c314891f3cca6080fc503333df1d2bafd949c69f86626340509bf60fceef6f28eb06f2d065541a6279f8ad6642d00082ee7c40fcbfbd767f7fd80e7f4fa906b64a493ff4ba2a895c551faad2edf28104de5d5ad576dd59bf78909c61d2e6a1086cec3404685a1e377552edeccb8b9a4e26e1597a579f08d79786e50dbe44dbe4826f522bf9345873f480e417937d21f0e9ce3a6305ae66b20154095fbbf5ba8337638fb6c76b851e1120a6df22ee79b8eb9d8cb46a2b4be49298ffa2967cf858a00fe0617fb63f0bbf6189c5e12c60345adf3e82d50c6ea94f9d1f2c3702a947a7a46f8b069234273a2d60850c06d22a000b683ea3480c958b6b80b60b36f844a0a0fe23a689609c9e260552fe1a3822487741c0a7b39d1c8226a603ea19ea76a85110f16a113cf966439d78bd9a36eea6b62ec2a22b5349df364330977ad2dd228de45def3f6765368c9bc45820886a42418d55bbd9fc5f1dc79b98682858650bf0f1253a758f75743c3a83e1359297935dc3d57f428014b842324fe5f246da80bd7a1b956f153dd15dbee2f0b9052ace0d194cc8973245e920e8ae0e436920a602e24e916f09fdc60dde822c6e50d461d0b344d0997c3529713cacc9ac2ae5c96bf13ec515f4d6bae6cda5b014c06afecec80874a80b9c5b938d248dd70f50b755414883e317736831629c0b97d619d7402ee23defeca0205a8581d3312a139ce4a4a27532584784c4ea130ad41a217323ac8701ab764c25d2e6962b40f305afc53609a1bf17432b519f06e5c0e3cacda6aa3ac0b28b5e11bffad72df6bc0edb9e1188dba78e621abda51f05f00f0af236da9d2253fe77285ec49ea62e95aa00eee46205dc74f41df14e11cd0db92568d717f424fdf94ba2b727f109ea95d4a8772d1e9c5fe045db278e3f29f3d8aaaef35d8267b681fa17a045273370b719adcc7d13cb0c655e90884557c4923656ad88e303ba2794c63334ab795ea150f56eb5d60939ec8d510d07e12c6e4266a0b38610a84ef6dc28bbd63c511617c20d99b4e64704e1d433da446e0ea3ba0ee223d9597948846395cd4802112962f2bf9a03a59e9b6e887c56f6e20a993f9fe8dc3e63d7b77d7a9b5b96e60728832ffcfb3011c4bb2cd879e183ef79d22c8849b943fd10bce0479e5394cd73e3af55722ce43d2db905b4b4af5687905b11c2d073658bf63d56a684a69d8a91a1ac36b7bd080c608995eb6bf294af783a236515fc8a2dadbd9e62875a84d9651a023579dcb8ccb17ca720de0bcb7247c62e0b25257f30440e9703bc13db70eeacda9193759fbbaf053ada2e3534c7143889a030b4026421b2fc4d25aa16fee510b3dd297edb555576845bb02a3ff79a62980d6eb92b6ef7a96b1f0b4304cd46a0210cf168c8b88312ee4ddc01fb8ee0c53adb5d62ab3a463accc4d1ca702e05e2e1e0a8d0c1e04fa654d58563ecade79795d614d9b494f84d3c4732fc1783badc376bf0c6c3a768ef5157cc591c61805f70924addf816db583d4e3557fa090eb8307b02949d4a846b4a368125096d0366bb09432b6e7aed4a0772a86b8f663283728640bd031b113f3eccbca3d04a3093dfae25620390448fa71d36803da55ef1afb3bba567811818de304748414826e4d0ef9d39e77b83815f75eb1cf606327e18e6bcbc7e247c1693c8d43642e401557a60ebb85d93cff19c2a80965001e1bb420499b31008c0f3b7c09c7703051441030528c1454ea36963d2d0d4c0234d8f9d46d3c624c5aab1fcb788669509485ae1d86deff95896c8d2087560d40d4a271294c604fbdced1f855a9d2a74dd0cdf2139e2bddf84f4982ad72e90dba9dd8b97b86f86a391804657b2e41970ac646ed5802c3fd38f6e631b6f330970a23cc8a007caf80d969e82ceec128b2fa4dd018ad412d2bfdc5d96e36e6b2a497f6ac46b2caa300b6894bb8ca1ba53642a13f4f719f903d691d57cb511a967f77864b0aade9666e3282691a1f5361c0b47582645f192c43ef213f6db7adb532417cebb4df6557b35cbd2ffec0f53b950046cf968a5f3e5b374a5f43e318746f64e8860767c18c98ee64a577173d3ea986b9c6d3c2925da5f2e87e25ce37110f6948b8b2c9f630a404c3cd21b5fd92ceeab5c87e47fb1c6c884095b07324e119b4ec61544f5a59468c35dc3ad4cb5cae6060da75678e5c8e320228f1460d6c6cda65b0bd6f47952ba2d2dd3a5c6e97c26aa1392f3e29911839f6b2d76e4b7d2abc05df02b4557560102494df01343e4d7edec9e7e0de3981f012b27db65e20071b78e94bab92e07b37d34b5421371f31db99f5133f06112ef1adbec509bb18db773bc8d5a77c69c18714f78197563d35db60d76a925eca568583ff21bdb97cb78e54a77bc7efec4c1b1f61d7ee4e2231759a4455e6f37705c6aa41e99c22299a2fe4f326febfa2364add3cad5948a146b458ff9b2476208dd5d5083c41e7404b71d790406ba6c7ecc664db6b4cbb41ae8fbb6b192ea3e9cf8d177f125eab9bfd0dbd6ad1b42acb3b4ba0d9e58ebfd6d70ce3b626c1d721adc82148284ae0e26436a1904f8cac568ef31b2bfce39a68ec04b04322820d5bec03e3cde7cc6846dff847d8b5d40f7a88dd61bc7c2aadaa7a36e77c9f99c1ecec4b4e9b4b9572d1e9fc9b361fc281763db7842bf2a4c9539da8b45301f10a189756d8c77acbf640379f55182b42b754d7a4a01979681ce773332d5aa96bb7e4087963a8c81c29aa2197fe5ee49a8f83b0fb5ca184bee3f24e0c6f8e17d17976590c24a889581fdd264446e1ee75682f2fd4ed7b445c2650ff6d84cad95e0681d98f6eb7815f31d21536e147fa4394af8a71d9811701085ee1c9bb1bdcdf9d92a9bf968e1d65e67c22aa63ad797f5bffa14aa66add1bbfbc0522172576db168238c94f72d4cb8a9a093a9e856b96c0bce65dc27cca7e54b787e706de99ad3d3887a86a7a9406c0a451191ba42033c558af011c500648445161b253906fcc8aa422cd596653842847223c3b867117fcbfaf9d01bb116731a6d01031283acebf291d45ac00fb5c802e99ab6af751f98e1887f94f5875323289483e9aa156bd856385546cca50306b197b65e3588ce872f195de218084c37609e600e0aac1d19057ac16943b8657fafb2d549b0916ce4107b73d3e900df0265dcca1f2bd7e8558e905b60842ae7dce8452e3c639cab2a1d5cf8104fe5c0334dee8a38287b1a1832e3c8476319fa7eaab8458820c03507a55e2825a21e30147488c5989eb79265584cad3e38573a5951c683b858a6b4d6062fc56390b9aa6539dfaabf1bade190ffc0d004a85f80dea9dcf6bd102668ffad5914bd4f1c61b400f186007d2debf002e580165ffec522460e9953c9b73906d8c061fd084c0d5043317f5079cd95c61a77dfad4b06efad230375b2c6edba32aa138bb8d441e6ba32fd7e5d32a953a6fac8f87efd65ae4f06f5ca649d561fb2e75546e238d0872d2a4976f1655f5467a2f72fc39ac82bfd40f0317f6ad0d74e8f5ad86807a83ceced6f0192f69a97d8f12497dd90243d33150764b7f51c7427d32372b60514e8c8b9ad175062a3f73f5f3bed15464cb80910cd9750ee03e4ede3436ce00549df2a857df4ec6947bdea4b08e19b61fa78155adf04468a183c101772bdc6429a6cee5cc438049163523063e15a476dd2727dddac0f634d9dba0c1136cec40035bc94ddb7ddc6c953097420bf624eab0526c1ef874222eab9873196bfb56958d7c06b92ade21084cabfe6095a5c810be5129727a4b865ee3d226daba6730b22f4e3ee74e6a4236c7293cdd003c14d5cf52268bd08632ba7d121d92cb4f1cea61390a37829171607e4fb8966bb7522f67e1b8e2db5fefa1ec5864d858afc7fe1a1ccb0cbd6a46fcf8e9a6f819a873cf1a7510ddfbc9671775703bef0a72de18fdc9cb27f4496d1ac100ac6b251d42d18912974f19e3832a0495142073799cb63609407adb0d6315d536828dd932c78082dd0af3c947ec9a2cd8084e5866f14820f7ebda82bd7f08aac4cdd38ad07b486d8903a49c6979aaf8d77e4b255274eac9376abdb5b263e59efebdecdca2ebdd4aa66b5e006385767dc589477808492a98c7b4a8508f2bdcb25e2bbd80e0ba2978ea950ad4b448dfd7e4242ae1cef5a00147d571e145bd1c38352571d1c48939fb12ed00386b224775a97ce99edeb97d33be67440e1755fca138e51db86b230c7c438f9693f9cc640225b8f36297d11828d42dcbedf440076c30b5f90bb53972ec6dc98f72f7639c83cdf62835e5b79283d73ce5bd9c57645010976e8600d09c9f671e119f8c41d48e9dc31dd451b11c2c20268a62283c63ffdfd22f2159365415a7ce0744dff0462211147b9fbd561d19b530e8ec3681b2cbe490937605d1f3459014e1fcf5d5b11d57658d243c57612e1132c05dfb2cbba3250e29317c228cd790b806e409fa3050660a1caa75916e2b055c96414f8954e790999d8e3c4c91cf569d51bac1f90bf384eb038171137a15509023a06bf16de3e77497200590f910ec7fe345c3b48b51ce1284b2eeca5574ccc9475b54fd50cca19e0b846a74bd2268f153c4476a217f4f85e1d1e0a045342363d3e26efb137ecc0e18e78fd31ba8317cb3686ef2ed3350875d2a06a3caa9bfffb98835208f59dfb7f3748f35f9a3e299de01e58a98d6266bfb0418b4d34ac0c8d676de0fe9f47b2aec224f37cee84af2f5187f9ed55641868240706c152c4c93c87590a2a31b18ab65d276630aabedf381cb4aa9a3af52d9cab52017fac2f4ba7803db0bcc5cadf2c94298ee90946a1e3a79a75bfe57a29f57546eab3467950ce3ef215395955307c0a09892627a792a4f18c40f6b8df6ecafcde060172324132ce336bddb231319f830f929b452f2187cfe0e8088911edd8d20fcbbdf629f89a854e6ce8aaab16be44a521c87b3f0f08922a9b29b880610ec6bdbec83d068b36fac720868114c5cdb809e0aa003d38b49c0c81d6861e69d91a0e7274d06812a977a32d3f2d342dd825587923486b734cb4ef37f6ec3f1a76e0c136c3feaf8118d88e5d1a2f110b58786f00204bb709c9e50dd822b2bd869c709c20148f31a822a3afc7af0477a64ac6a5b424398f5c7e530bbb964b4e0f1e44d78e70cd8366031512885fc0bd1c4e8a430df8d8f5057407715359758183be7f8c2ee6fbc34d2b30e3a39184bce2cc818157d0babffddcdf7c10d34843ed9690e72ec5fa276950759c9934ba43eb50d3f59b090fbea86bb3491866f3fff946051efe4f13f018834c822b393d7aae242231539a085e492ae7c83b9e7b22599c214e4faa81481fefa26b99a9547690004a760c423a20bbc6199c97fe0656dcc922ea2340986b3d7dfa3a986f3ebca157c44949f563932ee1569ece5c83c9910bb0bfaa2633fafcccb897e9fa5171ae886b2cf3c8c335760a71cd9a24370a6b0537e5a23de367b5dcdac243b1a993239a619310c45bb0f5dbdb6eebdb309cfd43e3e0681ba6a5bdee6dc1cc8e2a39b3f66d58489fecdb02cfee8be45c58da309666b2b405223b5ce4acec364ca43dbb2dc0ec9fdd16d05ab694406ea21ee438711b86d298b82d5000206e53646eaba56e3370f83e75db03fe3500d1402a866fed6e924ef8ca0548d531635873907668a48af651f936ea4434d712c2ed9d8a19e79ad3fab76d3cbbd5e0b5470058590137c4fb36858c7c37654eddc06dcecbcdd395ed7f624ea9e0362299f385e7dd4c7ed3e130de851f095b97b3b270c36237e9e5f494d30656a311cfc36dc9003197bc01bf57c87d47429f5198b80de5cf2748b9f0f9eaf7e35a8d9dd7efddd8b2775e7f57aefcddbaf67b3fb7fa70492c1e1832794cff940853b49da09750a913f4aa8843d07bb081e967dea66d7cc6e0d48be03cebdc6417c635528be3c3bdad5d66dfda59f05957cd5ee450ab765a08d2b88daf8edb2815ee6a4044edb8e1ee15f5ddcdbd13c088f7099cf71a24ef74ea3d1366a76439565e31c999a441d388b5ac723b8e313a0a6b16263f5b184f7b4479ef47fb084e55479687c891536a52a67a27a6e076efdfca39a29ed90e40bb2d11ed32a16d47bb8f0f9ec4120a90d4a5775df797e92ce3d7794a270f1001602103026a59735e8b78f801aec2e1fd660be8e105ab4cd20757f647748e6915ca705a39ed13355fe926a010b9a79cefd23e6d52d586dd5d59a8206fc7213502b5798bc5086dd96ccae9d35e38630a764067574dff2a490dfb69ccd9f5868bca78e96c1ae0f93bf136025691dec53b2aa4a1de92e36e9a6714c547167e65fc75917b4915fc982ba56c7f5ca7cf40b8b8d58d3734c0b6482985a3ec891765be28a3365aa90a3cb9bcf92500413405671fcafae4506e297bf6f4b16167e5f4acef5d50c9367806117cbe8240a1dabc0d232de2301384c0dcef304513f8b5f78d0a45c30e758be959a37839072f02e8d9901f7229886d271117bddef5c10f98ed9c57545cbc6844d820db76e64d9ae9f4d4480da5d476e1ae7666942dd067591a011907d9c472cbe4c528d81759e94eaa900117834d409f503e38ff112b073e4e9e370f7b0b273432aada6ead95d95e0bd594feb692a2cebc5058417375771e13884cfc12ec4f7f7dc4fbb89bc12b9e18cdcfe1055b3d29b768b3ff24984a400b3f5f11a7072d4445ddcd1c424730c130b2f44034aa9ce929481207cc19d4209ce1d9b4f26e580a5a31f14d43c0a88b4209455320750d8cdab79e91e24956631a8a260dc2404d113cfe237cce6d041ec33e9856ccccedfe37caf37c3ef4ee8b2269e09cf4f66d2f1503e86a05c3e0df31e49cf2c375d9a381960aeeff5d59d98d53fd4742c4b2fb93e35e5fa2584d938a28ad6ba260af2ef2a14c92c1a006190ad6cee82b85bc467409a1fbd132aac2d9de642614dedffbda21089609a002cefb4a151e44454f07992372ecda9981a4893f0ccd8d5e75af5e7d458a9d2acb5a1773e5022cc7993f8c2b9f4cee16bb9e3e81fc3d7f711f993c1427dadade9bb0d7347d6e8f19bbb3233c277b4ff5b0379feeb2ba0dacb0cb1e7fbfb25eeb29407ffb2964068d3afd6219b7c89648263e487376cd7fd4d4bac668689a62f9c5d659bd2e2c357cd03f3fbe22d73d20611887462ad622ba90f55dfea1e6dd822218083e4b96200a41c36b46c5232d8fc648f7616fa67e29160382e86cceb3c8d39b98492d7aabfb9f0665f97c3ebc607c1da06d3a12f591d082030875390af6942450d46e837f4bbf7f8191ac74670eb2a3cb9aa68b4e9e3989c7e127fa2ff6e39983932268bb30ccbd32a467b56f934aeeadc9de814a397307becaee81f6fe2c36730c16e313f4e8dbb97faf3dc73273d8cccc69d2b59cb1748f4b0a92170d88039982e3b60f0e2e489a718223a4ddb6ccedfe1342bbc26c4968eec50a67421544b3782487fc4a8eed85c708b7621e23b1d16d4301186efc06bccff2881282e93a0421c3c24924ca20f1b986e68c21bbb405f3dd9482405de7a34f0970fd14c561944890e6f6de7a883ec390043350fb316a2b4ee6ee63a1cb9feb9005e360cb7431723128e8cf397ad0ffcfc03465b4908bc5d5b450cf161a8e0bdbd1413e4e7d8aaa6b414c2c368b7fd9f81e3e6ab2af799ea9e8b2eab527fe24d7f297b78b9c962aec7183a4b8facab2116fcd44f98153ed4af1c8d00d68e0d9432fa176434c3123b67e464062a3ee9805f7b912157056d64f637bfa653300cc8142dc4003da7f12845c20d4996d0e2a5ea43e88a0048e7a0c7ed70d5a1eddc21cfe2665785ddf439975b517f951dd7d1520d6a31504322e3ce0d8891dfe6a840102f2b11193e761806a5a66567c64d0f71d4edc46c8cf01fb88b136325a5ab2724b2965923283080308fd07da63eed53e037053546a01c78df1571b010bf629c3752dbdf4a6c4471f57cad55c664a4b7f4ca9bdb26bdd81dc31bdd48f72cd4d2e977575e589f3dbfc5873d9a54b6d5733bbda417ead0b61df76a40e0a7b1432b69fc4b66faf8dd11f977116ace25ae05ae0d22e2d4b962363c657eebdf7de7bf3ad66690349d080090e1409c2ecda2bf6bd441881827df1bd362528b87bef0d4a30040f4f4d6428427362850feebdf7de7baf151e00020b13445842a284152ab05c9a0c2e45860ec800e5f37ce034e46c3510a586199cfcd0b2a993d30c367c60150fdc3c81000647f8800f46b8928422945860adcb67cab6597012eebdf73220cb00040d3160c7b513baf1d0d73ad9f716410307f6cdf8de7ceffdab4b19eebd38cc3095710b9789241061fb8167249c20d9a09c439233121648613775b24ded974d9d6c41c020f8c020f8d0411154a480d682243c54a18023d840021ac000091ba0f4b083111c408841ca082600c20824481082064c237082019387d9c44ad8b4081958b1bd4d8b9081144b1fa53f377ec001bda1fbb440377eb001c5a1dbb7cfcebba96a07f951ad06d0f8a9836e22756593fab73ef7177ba8a36a90bbbac67fd40eab0edbee2868a26f53e8ab8ebbd6bc998cf7a37487b1be05f7cd4ff5e8da4ed29a2b0629dd99446a62c1c7245293fb41591757da29ce3665b38152767db250ee95505d79c9bac93c727eabbde229814fe91e59cbf97056eee62f5252953b62d73f5dd0ac3bd592aa07d5926a090d77bb6d7cef2da98ae9e68009d692ed1da57fb6b8ec62777badb5bb233d295b63b3dd12a7c44d4e279db6070f8bf7f863b2669dc74b735d7bf1bd17e3715f2558c9768c95b65f4ae9fd926cff8e386cb5394ec94dce97962ce961997298abbc1b9454495c96bf969faf8d0a37979473ce4ba6dc9cc5a81de267a59890dab8b5ad14f8259149fb2ed97964ed3c1545b35249764a69df4bbb65144eb55b9cb607aba9759c2b77a916554b2c0cf5a8de16149f5db24aeabfb05582f2277b2fc6397338678ed33a839cd65de779dfed3ceffb4030fc40300c4591da6a20188a5237ea06429e96f65a35d97cc99738cd95a4a26c4f4d95a92ad525953655fdc95a100879d2a817065202791ad65081a34ed2492b50c9be4df4a7db553b6773d3bd519ae88fddf736dd1fe88fcdfb5f206ed36d6afa7ddea63be5d6ee13970179ffdb646381e0c460aca852c5f91a7b4b6a9bb724f71548b5b9c18171630303c68db5d8e6062706e3c60607c68dc5ef8f138bc1b8b1a1402cb6c9df93c68971ad268e68478888131222d2bae38876748488b81d2122dd713b3a3a42449cee6023ce3638311837dfc76a09e97c25b30d908a6108c560e0580c06c7751886904e0c06168ac1e03a2ca4a313838141a56dc375f8cb423a164625fabaf3990cc1af403eab5067f68608e7c6e2e0dce4aced0dd10ece8d25c2b9c9fafd897676706e6cd6d653a22424da016fc01c598f1cb0478f9c3014c11c594f8f1c50d623271441594f4f8f1c301441594f8f1caefbb0904e0c46d69e25dac1b951a2a4d5d283e73389b3cd5cacc74e8cdbd989795ec8c57af0ecc4b81e3b312fe47af0f0ecc4386bbd901b710f9e9d98cee9794d621b9d71728470b290104ed7811927a7470827e708e17460cee9e911c2c936361d985538a74708476bd96b92a575f06b7205a462183a44303011110cad3f0c4347460403eb10c1d0dffbebc86444587f5864e9c856ab1843aba12116abb58ae133b48a31c46aad62f8f80cad58ad550c9f212f1cb91e3c3b1da8ca393d42fa13b18e8ca8c58527679c3b229e1ca22e2787280c571d118f9943d4f1e41085ab8ec73473883a8cc355e7c263e610e52ff7f87cce36d6138b81e018ebf189f5c4c0b1c7c7c782638b4d8f4fccf362bc47664fe6d9781c8e6c0787dbd9c1f93e1587238bb18323dbe1fc53c962c4d8e13e15d7cab2183b9e37f41e09e3f5205fbcdc43280b09799e987b0c09e51e429e98a77a0c4d0d09654fccaca929981e432f2f327cbcf8f00103e37a9101e4e345860f18d78b0c20201f2f30ae1719403ec2954bc763e680638beef1d1f9542d4e1663c71359b9c790d0d494cb8bcff7f3e54fc84726f4c96442e3e8f209f9fcc8843e1f99d0e8f2f9fcfcc884be9c4797af85cf8f4c288607e461a21844442a550b510c20a21844aa9618404058d5c2220610c7c9788eb4e186388e8b0dc562a2d88a0dc9880dc5c4d6900c19566cb96c8664c440d0c7832407f280a0e6d1d13a3a61c8d23c3e74348f4ec8d2533c3ea67ce8e890a561a6a6381e1f3a20683e48ca803d201903723d3bdcce0e08aeb81e7387ebd901575c548f1965ee70e08a7b898a92e931636268fc88f9f14346662686c68c1f31347ec8ccc4d09831e3478ccc4c0c8d193f4697169fcf8f4cd5c2c28b01d4436cb9ba211939210b46f3f8d001572f5c8fb91315f50223233c21e4c21d193c3b210fcf4eabc522dc917102cf4e288367a7c5229471c2093c3b21c7b5588434324ee0d9f161499bfc3d813e7ac09e1e16cb05fa98d103fae8e19ce59a31a34708ccd905bae811b2d69236d65a4c641211ad563044260d2293680563d2a0418475125ec1cc9834b4fef19ab4d13e5a6b9f717cf1f9e133be4cf9fc98fa61c71799a9291b9f1f3151fc7991d4620c51ec62e47439392a954b17e327a78b91a372e9a262fc44fde4742a972e262a4ac7f8c91145a01749521cd22f922fea211dada3238a2d7a0848470fe9882dfa6908e80948478b2dbac5d3133904f43f5be157588124cb9fed157eb60259fe6cef159e2c7fb65768b1a009659cc0b3e47201fa98d1b38299f94c1ab21719cfe7470f954b4c17e327476c69a18780749cc978824a1b54a2353cc48fa0c7a4553d266d74c5ada5db646b6638f77275fe545d514571fe32f3fea3926a2ae8cf91362605fd3922a9a054522aad9380e87f9951bdfe6c4d59bab63c5bb71f2d5b0984acdbfe3c10b2aab02d28be25eb0321ebe63ec8eb069580902ad499b8f333b4230e0dedb878513ed5f7df47d20daa708cff91a10d55f97de8ffe918cb1dc01f1de6b9a9bdc67bcf7b1aead00ef338f155df4b6077dd876f75795660734fa94ee12b77109f3a4cabca1386cd71e07b4fdd14cbb0a4df75e549df863584d4adbbb28635ccff9136ea739cf79afc70d01387ceae2f01066cfaeee1bb848ad25a6f1d52b7bffdfc45e1ce6fadbeb70c1283a33e2e85702591059c47bbfed1cee50bf88bf0c6e50bf889ac362e5fa85f14ba4371ef63d5f7ddffbeea4e3dbb8efbee8e71e956767d5bc413a45b4cab8efaf8e9e3bf7ecba2ba6d791e11a9f56d7d17466abb010bc565ddd4a664c51412f4e537f8be6aa3d2ff6018eb830ee340a67fa997daab5beb6ead7d4b3af5235caf1448ec0684e0900394066a70e508258c441161730ccc18010da4e001135756d07463200209226ec0198a11d7d61d30a11b0f3dc301841085d40d0a087c0083d94582f2040a941e3775823235850f5c0d3ef8c0d57004ae0857a44a952ae015ae8827ea0bc4f0e07ef5abd22886c7ca288607cb08c8063ed466ac3f9aad4a23a3d51bb51e061c1dd08036336a32f34dc03f9a71fe2cf2a332d2b74a8c74ff7661d2a8d8e60de612168b34aa459492a8cd564853c6bb228d56531c565954581ed61062b37840e85bf72fef87f1ef53d3885f976612f6fed45abf964afab4d6da4c326966edbe3369269299a4a56825cd0c3f2957065c647ccf87f13b1a12fefb571c561f7f7771694e39ec25c594f2fec418fff9bae1bf26ad9632efbba7d7ed258566dfeef3bdb9acee7b4f73ca4cba5225fcf94b5c9a14cdd737a5a4a4642eccf2bfd2a459917219fdcf526cc2536ac2c98a621905d9f053950ff362f9bae5afb5966b5ae34b67269043f07e91259052d7be6eaf2bbbfe0b32c646b5ed17df05c6d3547a2925b961c965b7c8ae6ff6407fe8396e8da94ccbb04c46330790ec5326654abda0e2301368bbbe696552592665cac610e095feb3c86210bc34bc2c080601ff5e0d8254e37ba3080196698bbf0fcf7cf6765ef97aaa334bb26eaca7193449c31a4576cf0499f9fbf76766fe9b21f5cc0cd5f8e2224c6164040305820a9068b3d5c3b02a9bd07c0df25076dbabffafffad4824233f6b927ff53441689efc205fadfe2b3925eea9378cf8fa108731bf79339fa688af1794cb5e7cce9875634939c1784d307e973c4d78f03fbb4df81a26801fd6a078e2fdeabe95d7ed25c5c916a55e53f55fd05e20b9899499e4b0ebbf38e226857af1a0875dff0555f195dd0bec1089ed34eb966f7a2c4f17fe7ba337f5718942d0d3f81edaf0e80b32bff81e79165913c820218e30855c82b93cdf841bfe0d8b2c58be9e5e902f28f225e5b5c1125e75c3b7aa7c4de174309a4f0e83714a8c5ff95f02890389a9217597e499ff8b6c2d094b9b7c9aa7610ae4d3fc4743dedf349fc91caea73424ddf78bec26cb98fc74f692e235f5f3e7ed224ffa2f1cedfc610d2375f194baf8165154d9a749b3a58049870ddf2f5ed882bce5823cc73d239341595326554b59d4ae313229d9cda4c9a476b5d56065ef6c6aabc105fbab208b5559745fd6940d7a9fcb8fc5623db1b0b468d6647d7585cfbacd30ae9e65af8cee0485d22ef22d84c67ee1b77dd5bfd47489cb97927a4df51aaff19a6c7976f6d93bd8f53d570d9799c461aeafffb9c8d35b242bf3d89caf9d654c93a965c66a64f1f94d265bdf8ce233585fef7df9faf58582acb9fa222eb4de3e8b64e1b36df7630c85971d2eb6a50c5addb00056a3b063f6dabaa4f4e6c41fc23cf82e3248f8e7f97df830ff55d054e2fa4c25a6920ea399c465b98480cfce4a2e031dccab550983cfacc9f74b74a0214151a90db1c461b5ea404362c161b5d6fc7dbea4f4a55c92504cd43683a62d05e6b535592b265b53bbb2f474199660d4ef99de9b4c4e5ca635d77ad60bb54aa3263c58bf7aa35569c42a73f735a7d6ba16e5dd95e611f466064b9bda7830c43ecddb0c3eb0cd9bcba88d0355b6acdbf56d3390da7ae3b7e6ea2f4cf8dd6f458224f82e970b24bd181558bf7a215679bd5288daa2bccd23e88d8dbacd5b0e237e5b9ef5346f99145287c084abfca335599ff56797ada9bf2287dc9df1df77a411ffea59cfd5cdcabfca45f84fd60d97f9833c070d202f7159ce50f9c8d20e6bd219a582a4c310950ad2aed54e5a5352c2546b9ddab5329daf67ddec14a89b148755152c1246977f79d6cd9a2daf59ff42b668b6a6be0b496d4d4bf9df72b95825adadce5612eb666b2c309ee6cdbc9952bcbe39c58c7219b5523b6d4d5367f3663367f366732e6d2bc8c0b89adab89c22fa60ace6ad96ac70697cd19f70d7536717ee538c49dc7406523df0b9c28794dd1c564f70cb6428d02089c2e8468106345a43b72e5f3729e0b641ece3d296b14d6a29b7deaf7c3dbd6eac8e75736d7bb335769c55d6cd9aaf23684dfd1decfa4becda04eb06c58a7add48604a89333069b98cc191df3eed5c1e6d26512c4fb3b66b114230a1cdbe18a34ef27a7258f52378268b36ab5f59b4ad4d26d389a944ebeffbd3540af27df7411e922693c3bef0fbbeaf3c43d254622a99494c25fd416e2a99494c252ea3de755d6936994ca692ec662a994ab29bece632ad3b5a63d1f6f97add9646efdf2bcfa37d9a50bb7224cc134bd0662f290eab328cdd7be5ebc66249e91efc330cbb0fff7cdd8284efb16eafa7dfa079336fe07fff81e4ebc93df225e5f5bab9ecf3aa7b57b29e928cb4f6e4b2971497d5a6ecfa4126d42d6a57f3b62bd392ab83ade9eb32087dddbe2348d566993cf5b656bc6ebbbe59b3a629454d266b9a345a531f9bb67d6926932965d26a494b380ab9230d433dca5c023270dd0435d488ff0c6edf15d3a2c54c0b162c6458b85c302e189816302fdbfef7b77eccedbfb8b4d8776969b55e5a2c960bcb5b56e3d8aa1ff3bff5636ebf2586212b044115f87de2e76dfbabbff56360a7ad0dbdebf6f16ffd98db57fdad1f731bc3bbbe497f2ebdb177fbddf565d67e8fdbbf210ffdc1ef37ac813fe6324a673231e44973f0fb8cd1ec33e6629fb1989718cc3e632dfb8c9dab7dc6ce709f316f9fb14e8c7dfb8cb1f61963b15f3597d197fb8c86ba3ef7e76f8e5b7298f730d6cb1a5935568d55a3353eb262cfaabda458c0508f38dc3285ca4e1bd06b6eeea40311fbdbd4490720f60983a2a2a5a5e5d6ba6372e86d5f6f5bc6e478f70bf8f8f8dc985bdaa87900a4b562ac9fcb208b43bd94fb5bd33177e3cd79deb6e49294f0f76eb87299a4613cbdf76e9e14efc965545c62ad0d28adf506c5885a3d4a6fea0405ca02e123c058ffba3841f936752202cb574573195feb958a21f8799d6e69b156a38a850be6c5654626a6c5d3b828c99f1236fd12c21bdcf6ff5e5e5d3c27b0fdbf17195f2b9e14d8fe9f099fd7e92b9e00588d2a31c4e25981edffc15c302f2e2dad2c9e306cffafe6695cccc8c4b4e0c42f0035300098f0e25542a945ff4f0062fd33c8ed2505a73ee81cd69f724aeebdefe478a42d3e811ff9e8cb97628cdf7fa12f7d4fdf7b7019f8cee44ebcc99f78cd87d8949e5ef32528903331e1543c8aba27b1e9bb0fa8cce301057227ae047524289037e160d318dc60d3a715c89f541cffd3a3680a5b8167d1162f5d51d8ea699882dde36a2c4fa32d5e2bf85a21415bd48d72980f6375266c818d8b306d2250d89d62fb7b566c7f8d91b093f356d154af143b06f4e746e14f2ad0b55271fcb138d97e8fb0bd69fb8df2b8baa4ff467d37ca6a8ebc6f29cc56238729adaa0e8165f225ab649358250eb36f95ec1257ada755da4bac0e56c9e5b5247bc4ba8c5eebc3475f67a56dcb420b0c60e1a452ff3272d949a15c2862a105adc7d1e5fa87c13c16db4e3fbcd2943055319e162a6381aad4ec688dbfd6fade300ea94c25b83dcfb68f82b5d6c625d3e2a60b85553bd2faf4735829ac82fb0c32ee93021b3fc51fc5b5e5cd4f79e40b7a0d066dd7ce705b4619d7eb4d2c0374aab55ed7cbb2c0da586bad8dcd14a3db7a449375c70e87dd52a3d0a1400037d271f769a4df9f002ee33ee7bb6bc895f5a57c764fe0a33a75d45346eaeeb55677f7f25a5ba9c3aacd3e22b5c3c652873c8cf463b8de22b61544d954000426255430438562f33608e7d95a5bad2d0532d028c840066ed24d82011615c93dd900f8fa3ef9c0e568f4bd452ef724042eb8fc84c99b61e109109d0c0b308ee39e4889c95cce393f69e2a50597398ee39e640959642ee79c833802bab8cc711c178412164ce672ce39081e542f5ce6388e0be207ce257339e71c44add5c2658ee3b82090105b99cb39e7209670617199e3382e8829f42a7339e71d5d1057b0eeb87708dd7874da08c6f8041be71828b960cc95c04504a20b8510c1235a7c317862e5c5000b8bae032c740a5c1c1497dc0315968113ad1b731827032b5a0c806a81859a5208c5420d07cd421ee2d6953643a83675aaf1b0f1a64eb512bcb881058c31c616b780ef0c98888db3131695ef8012baf15882042910fc9085034ab820698631b031121b7319638c31c6185f8cf1c518638cb96c8493f274c06be30b05b399a251402dbd19057eedad9ee426b9467a6975b70eb053ee2db656ed30ead65a6bafc3dc3abdf1ea5ee90d758c7159918c55853ad3b6c62bb56298830f67eb310640b5d079124d76be39e79c73cef948ce1e7032023fa2e4a403ab4d9d6c56d83086b4a3376e6d514953b7108996447feadf0c70539ed4787e51519fa64e8ce7a5dd6dbf96e75549d166f782b4926293ca7bbaac5a2beb1ce94d0d6b6b359b9474efadd530c639e75ce3721cc75dd22eb14ba29cc999a6a66a49de938d72d8d3256d5087794f1e94c3f0f61f82f7e93d595aad78e34eb171a70c71efe946f576406f84d85dbf7a4ff4068ada0a44b77f93cb58ef2f3e71d94a3cc5116cff535cf229f992ec4f09a9e5c5272b0595893d50954fdbb3529e9e9477c59bda1e96edff21cdc07f7a4b0801ffe90d61bbd7c4f69e104f91a3595384b257d06646f4acf546c6990ba7646b9e5cc62d71b10754c631f198ac8b3c82caac9495c24a6961a7b43569279c2edb9fb666b4de9fde3f63b63f0b0a74df693edbfdb573aeb391dc01ffc50f92426a964d446fb0d5faa49fb97c11556e911e149ae3df428a564429af0614e61f922216292810f8fee294cfe04aa4225c962c59664dee1b71cd9a44d1f2fea2950ad452121189e041a92612f7fede0de8cf88a59ed08488be82ca6842c425661162b364d9e0b7c8d617697d6d79174ec99a5e11b46689cbc49ac3985099280485f93b0b4eacd91a7f98d29664929eb55eac69bd4fb1b66bd27ea1b390f45d49bd31596796dcc1e55bc81d308bc562b15e3b8cf534ac48dc6387b19ef59f832da4b74823ae59eb3199a46748455459b25c419bb9ecd02a937ed6fa20c7a4113dc3ef4226b966b82c42b308d9a1555a284b85145dffb22952b3cc9ae492d21b4a734ed5ce19f6dc16ceb9daf5bd9a75daf549758457dbfeb46ea60537dc63b1d7cbdad15a97ab00747683ee7a63c88d1b3768ad953a7d365436be57911fc943f561a95f53fadafb4fe5c2eef27ba40bdbb3feaa72b4359feabf4fdb9a4f7ffdd305f1eff7aaa1b0ecca130655f85f2996f43dcfeb6a089636ea6bfdf571541ed4d67c65903d71a74f09ecb33e76615318743e8c99586bb50d7964cc95fed449cae1bf435c496dcdcd25b5353ca8adb13550b81bc818c9c501b45c467202d0612dd04e4882e0900ca18d7c1f2d6f000988037802242de082c855089f13921bd4704032c561b4014e46a66899c3570b6f23cce564844a7d551088af6e7a9d8ce8f0aa7f7da094de2db589b054bbb689e4b06e90fe907687443208b5898022fd1952695b088d5d755c1a0dc748c3e1ee02ad6be9221bf0d1a72f3206da18ca70051278601245951c90706546f50a74d8bd3134c9a8fbc8f607752d6b312ced5bbaa8a5e1c3f82bc6d833d55467a4212e7dc68b77752c945ecff6de5b8295884f8f4ec91e6aadf64629af8801a6574cb9c2ca65f2b9643e4b57a0c336ad61608aeda2375cc6d77acd42b333f8e87941afa97f944405471cf1821e5c8982c38ce68a8ec94c14362b84b0f3a6b62b624822e9841000d1e4871e2c1145c4cc373085153a506d6ac322040c9af8800b6ab83921b1c04c03fb1c956a36904a3e3beed3e5d65aa7af6ac3b7040b34eb42919bf9ab750cb8536143144692e020044398f96b2ab62458b142861cd89240438cd3a71d4698d92174e3b1c3564515f076dbc1c3564512553819f9a84ef508dc7d8219e7528fb6c6c7bfe57f5b8ffe2e6bbd06dcd79174669bc2cab6afb9d7464d78748f4b23fc5d69d4bdb882510885dafae98c7acfc97dfe3b238d36279bd9d44645944dffc3209dd5d0d2761126e2597f7df23bbfcec66aa1b8cf9f75ec20fe7756914cfa99487d86581a35d16fd424e33005fadc7f3accf17d2a5519c45f7fce219274e694cc71ffebbcfc94149d8c99fae69eda981cd65a193cf1a7a2874d6d4738b24f7d45caee9ee2d77f03154736b55dc1a2a25f8db4adb1d42b0ac3147019c48d8e66dad6849496430c8044bdc7d6586a00557972e518e4e49e3aacc561f4f107e14a8a4b5d6d2d838cd61665e7a7f95d7cd5144ff6bd2058fa8cd59ffa73a8233f3dedd3905b91493f5bbd1b9546d47be81bad1e06ea3de353efc129f8e7c7610aaa1749ef31f9adc61454e5f9c2d1bd1f92a7de5f916ffb5ef75df08876610af49f62fd46964891ef9c6397a2df187c9a7b1ab5edaf9e369671198dc2b6edc7e410dfbe08b6e0e75a5cf67dfab950877d0b1e7d3af083cf85368eb6064ffda33eb96f8d6490981cf8bdc7efbde7bd7f489ededf6f711927d32f92e7f85cb87a4a6f58af5f3cf573e073e4b97afdf7c15087fd5519eac0af75a8436bd2d3e458c6e450bdf7aa5246244fee1d3f57a4ce9228cd39f5fb7f1fe441bca71b2483748f75791eed133f57b6686c03c10db610b15bcb6cb054a9b44aff058bec0d8e2b73c6bb92d4bafb9158dd8907784fbbff1e931f3e5fe3f8dff7bdb676406c7f65479e0e78edf1f1483ee0b53f5a4f70d7fbdadfcbf3dc1bcbf3f5fb38e833768f82cb46d58fef3f00979de3af4815f9bd487edfc3bef7d725fe7bb6e0528f15e7f0519d718754f7416e4b128cf59dea4a864e88b8876bad11f08d9f46e05687b24317ab3b76fe7bbe1c10dbb96692b3cf91f63fef2fe995676c5f8e3c63a668aade1f974c46f077688fcc2418df8a25b5f7c2f6f967cc3b8b3047d66fd99ef4b3ee3f8f64c1989fd6af25114c4b8ff338afa9afc9b188c603621b97414028ee62269552289ea038e2daa0a84111b55d0eb3c0475b18a92d8aa9cdbdc52719c4caf2dfc751071004ba487feaae372c009d15a1596a345af899d431382e8d66370d718ca4d3b60d3a048dc69136ff10fc438450291a6d17b1f6f7451904c1fd7d27b5f190a2ec914268ecf7bc2145797f392a10362e85d42c1f298466e3ff3a52088d5de94db73b21350b01a84dc77121018e64b029b539ed57faf3420db220bda91fee5ac32723cd473c3234ad81e3f3fcc4e572b9db2c3e028ceb17e15dcb254f303d511bb57577b2729d98b0d61ed14e4e586c58c3daabc3cd37e0eb042f51297532c2c66dea6444ad1af1e43a54b7379343d09dd643c8c1ddbdeb963cf980f779de942859889be4032b691b8206b6cb61396710bc92456badc3f0ca55493131aa543a34a1442909c98a71358e9c2d0ba19568b0082bd66a759d8c4bb05a2cd6a5629b1a6136b55131a2d5d26a45e190c0c1762a41b4b8b4b45c2797e6a2c283cb8b8b8b54131e0f6e134d9a4a0e2f302f2f514cbb5aa8eb648956a29f60c05658a3d56ac1c0d89ca055a981dbaad4b68b450b162c3a11641bb4122b052d625ab4b0392182d6a6b62a2188918989019b76059b7062493741c5091b586c6aab720199199950489d012bbd7102cb9de23a01b5ad13372786d8ba8a1917333357ae936fa9e282c6858b282adfa6b626ae44c942dc1dd0804f4313d6c0f4867e252fbda1a5a743ec89244fd8a296d8a294ec28df8333333333ff2f2e20411a1a1a1a9274d9d426841194204992645946451142121ad3c12802a539236a3bb0d02de24164cee69c8d78da39e79c6fb71d3c8c58a286afba645c56b7d78eb8b2dd65a26c7f90c66a06c21eb010580867e24c42143893afd54d4da3d168b5d9795d2ead6b931d7c125016638c2dbe18637b31b618c764c0841e7f2d7d82827c647c501954faf8b876e2a3aff325b59da31de9b3d8f6a0a6985967eeffb2e232979d2ed6137fd692cb7a7093ce54b0333b7b9fbdbe23ed8c65dbfe24ab666bbc863a5efb5563d16a325fc9fb22ff84bdbe843f7d6ce4ae25ec3a13a5c5ae323217f575b3b299af402f292f25e88dff29ee5af5cb56815e4f512ad06bcaad02bda0a454a0171525e8cfab0abdf137c1569651eaec0549922f688dfd126e7a7254a057d4940af4b2025581584d15a70afd61f140a502b1962a8e7ff9243365bb8f1301bbfe2bcacbf27492dc41d2903528ccdf0539a39a14e6cfe2e165050cdf9fb524fe76f0655e56b6878f594d5fc2d3d0c4d0b87041ba98d9f65bccc86cfb2cfed68f059fa2a8646b5c6a6acbd0cc0800108000d316000018100a08430241142461206bf20114000c6d90545c54508f8563518ec2208cc318649031c618638831446a684623005a3410303686d8400db2fd832a9bc0ebdd4dbbe5c73e83a3579d4c0ba699f2642d7956e25b6287e3c2bf0924ed5cabf55be08c0477deb2e85ac7cd192c548bd1d7a65ab32c438443214f677a4af1fdcac478e5a3ab22b1db45603c59b8306107f954cff3e654e169ca722c324b10c78ed260afcb48561a8ff8adc3a4b18123c1c34ca017227457079063e9844bc586ccde7cf491a0a9668a5735e2014fa853ae06b77fd4a6e101eba8610ddb4b67adec5987ff73952164429c00d4eb552daaae49f672cb39d2f8ab28088ae14d05bbdb4ad6625739ed24f62595d4e2fcb0c44793a1e436ea257e6f7d0e16e98572b0ae4a22e185f0e4937f1fc79d8a2a16c827f0b314c567695721d0a6c01c56fd56057481a564a56a3475159306b2a98b007a25c53b8c91a4233063f56656de5a5d22868afef1b8db5698c2a0b688ccaeb7e8b719859a1bf7f227db2a8fc08987186037c8be710671d641bc7b55cd5ec9cb52024a050e763b1e13a2407d17b9b30242bb78100536afb0ab7f344e5b12b9bade5b74b5e805134ae76018bfae2189a7c3aac194d969640479b8635cf21dd372f16a56c43cc556157197b61220accd790e5faca7e49195a3768f3cb965b684f6e939a62daed51c18dec3bb48dc5307d72102f719304b33809af301eef52436615e51a0b48d3c0a83efa81e596d10a250cac3ab7661348186c997547fb26630281ebade827eb0c2815056c8e671edd4449884863fdb8b6e19ed1fb972c60631f16e10d764fa8a8d899b6543d8db0f24f0a4546dbb81396ece25f949a10e8da9363e512f69220dced833ccaa349951e658c1ded661c235d313334c2a616955e5c0cc48e1b82bd2d17cb6b1a10226dc6208bd537f7ab774ce96a2de42e660f84e745787eea013c32cc3f5e83d26fe192b73b17d03d17139085b4b08e62cc7c5de20db06bc3e34c3d9007f19ec2f5c877036af5fb67aca1010fd7a297bab87b3a80b47582ace2d54a8e00acb6f8e39e798d3286bb6d1502d4f1308230512e0ffcb8b7bae41c280cc74412a063c3f678d35a5dee66012a0de491eb2acf7c292d63b14ac772196f5f60bb74787c663e33f27d5c67634e4ac4868574b4db1c0d4783d9b94a918217f745983b72a33c31fa25b6fd01adc368fb659a45f83b2f006bb6f45bba23d935625e8eb2df4c9fe7b667f5ddcd839905a1f6adbe217a79c7524a7070e2b4fa5b7f3bd88003ffe7844fc63072327a6f245efeb1488d41390a6ceb1b78b7618f3c80701e06bf5b3b0a0207db8ed749205eef33ee3988dcde0bd8a80d25abde1d54a330f3386b9d092591d11f5f7f0e748c2171bd5d3f9589d409bf4381dd3678cbd4641b017c353cdaee79c084efc1bf05e0487c59055b9a681a9b58b682a833979f7b9841c3b6e1c1bc899877361bac6394d72b0a2d787e60e8779219563d7bebd275d01406e68250a9937daaba4523da030861a571f3add7781b6803e1f172b84f8ffc863e9b2e9e2180308c34d2592867133eab4dd98f4ad6c6c710e133b5cb4243d00fbf66e6d3a341bf2edb2145171c59411850a427d0339588c5af0aa0bbd4ea144b39bf318f9ec703e5cc9ba4b1a63b60f425f94a1915c11f2b0def17a8f53c3ed0d9e1f50084d4d4c07edfc242b5cc3ae03fc2ae08751f1b314e7e8c8b5ea56a81f9bab9e48104feafe93e0c035072caaa37695905d65f1218aafc8c1c7de51c66389e2a0eefa4a1a291f80d11a3296fe7983abf2a020b60460c996a134b6ed79d3577d3b3138bce9b08122675c813914f0b21d6e4bab99dd73ac6a1b3729c76675ce4a2f34ac61e5f0c13e2710c5aa8fe25994401c369d462646e6ad7e1c42b6eef764cdd3a3cf06cd31d196e348c2b663190028e3038fe707110b341e3225c4fa182a312c968b043e3ea293bdfe9a83b0e36895f1ef74ce39714c21d4fab9f7cf098699b93604cdbfc7884baa1af7f7ea59b4b66ab89c2c9e58e5810fb11e7662387822d2db79476608cc8b51885e7ade851db8074de8ce344782bf4997cab547615d05be254283e7df0ce7881d3787bbf0ba79605a860a00d3be7c3199ec991a9554268216fbb3ddb8c3ec7c20e45d29ab0b97dd1fe0f474a3f320b0cc7a66d277dfd78047c800b4f4d4423ab59479450444e1952a18c0f47275041a2736cb3a7c1553ade11ae751066be0ca91477afd4deb530fbd144e229c734b1cd7040648c26c0382f715bf951aa9dfd5a6619dad93246b16d10cbaf370918f029f71c08c36056422b498e8cde3ed03db91392cc7b885b3e6d91ea726ec0006bd8371775c05ad8dc08703a996c574a00b5ce538fa05ca6b80c931ce23789ada345169f9654da1b3bab8b456c3a7894ac635d01a9d0efbfd37f22f2349f0d8fd15cbe443fa89925c3dd410a4f503708653ed542c4b07a339493c01ded0bbe5f92c949737075f8ed55c79f9e54ef3e987c8ec69aea349b94e18db15147395c7e82c1a9fe53036b505e20771505bd218851d8c457eb70554c100dbb5b1acad1a4f1c68b982dd9a37c24d206fcb10e89d541483ccf315480120dd21d2031c3f9510457e580933a3fe428b920d5bdf13d4406517ea8038a504253210f8fb3c80f20a94391f2a66b7e417ba782487a5ac2a0b08572c033572d539d3c5b852e395a0856de4c0098884d76ee80c32ab348e123a03003bece55ab8f21d74b41574327ced55854451b38f12e7b0a1b9d5aa4ccd95f4751e48d4ae2619ff976bb6240ac0bebfb21202d82cba4be354cb9388592267237e5906c0e5f2f5cf86f9daf730a1820797a130808464ef6cee4cabf672f935e11cc0d3c7d898de24c4e42e48edfffab2ef9acd8ec0cc51fd98c42cdc3ceadbad0b317c8e882ddca8614f22e15df7ca07ae6185e265d1fbe9742cc89c402fa10b37a296d684ac057109a71671fc7f235421d40d2820680981f17d05263553e8ba6f2b554537c71bd31485d10bd651c141d146386375b70319255738b1f1de3da9debcfd47da5ff947a2f1060f19485ed58be25b2e3bd0318560dd8b7dc4fdaf77024079a9349b98d663e17b1623540b47e67937e3243a8b86e608fb60941b32d20b4c4142a12f1a1172b48a663bc34137311145a0e9961802394e16a45c918fb1ccc7a1cf0cb2f9da9748612b2f5c04dddefacf9ec8253b1770a4e8d7cdf67e4e6d2baf7ff1de64bacc88aa960dca96a65c3c94ccff882013cf3587f8410d3ab516e9ad2076777fa6c5f39c07170182ee5b2c1c88211ec2f04d8fa765a50624546dad635ec47962d668797aa84a90cea6549bc6ff99befa9a33f3d701f1535a6834fd754a1c44e3fe2266eb28b9c827abb4d1f131c0244e647a674175b7734f4664a439cf466b45b6d351b8ea6e3bed676ecde204111f13689b9a18073a5a4e1c35a30042a8e83b621e3f721bf4e3d5588fcad547caaa8249b3ad5e6623695e985f587a1a4a1e67e245d3ea5b908d4b66cd5e481979734f2a803d9d7d20338db851c0832088cc146a352255f789c9bc6f8b21b579a2a1aa61d4f63da27df3f832e78ea866b27f561ff229c68aec99b7bb2b547b7c631b528f491832558c0d11436c090d349f511dc48af3debfad4bd5f8bcea10a0554447cda068749c1f48fd30aba0407ba90e6676c6fa8ff32a5a39e3fa41ee47b9bb56551c3fceb239fd78876789f5f708b938aa58eb4e378b3b1adeb0fa0f032cdace71f7dd9a872b0ee7ae6fedec0bf18510734c6e5adf3b1549a83ff8785da1ed4e34a47047f22920e10211d32b97cae9fc3803b0429d07a4ee6e73f4f121158b9541cd99c37c9acaa9d21692b79c3b52102f29dc3913670b3c6f82c753a22e292cda6c3968e27e93e9521d40509ed3e8f645f7cc17b870fb289dec03ef71847c26aa02f422d0f879adfcff343d77438bcff830e2b473fc14203f01ae8d728d28151f2820275e027425aab1192b9a532740dd60f88f4e2b2f51fdcbc86c1b2cae9c14dac982c1b4ad1a017634bb954a73ee9f7be3b655af5ae2d998568cb09dcdf785da1661c9efb188f23bef0cb784bc4ffe95992de20755493c3b8b7380184d66313b23791d9dfe635f354f93dd979cfedf08c6b551cd0bc8afb3ed476104c2702b816d4e586adf15f11f50865bb885237d7b33ce12cdb4a2fcb953696d5b15a56330c93a723a15f4160eb892d04a2a0a30bcb3cd99289c901dbed9da1d440f5d93a919627ce7e999ef48b340ae5b1b7bf55b6ac3273804f7dc50d41602ff49c3d9c95ea9f0b94766b672abcc621233d7cee13de8df03af7445eca459040b523109a234b670f15ad89c20b7a1a09238fa93c532ce13ba3094e0e44c766709b92353905323708484f2886411dce5f4a234d68c25eb749891b521ec89d07528256550ed185f19c44fc3ae0986a178589614336256f1f6e5635ca26824d333da9933054aa64a329d95cfc46f17c6a917c5e22b2bae65534e9356c0ebf7461d2ff5d286f8a7b19bf05bc4f6fe1c03dd2813a0f3bb7a55219e4cc7360a7a6b83a71e91b7fba14908cbcac018bbabdddcff2144618aa3ab7e3648c25119c946b7e9e57cb0e50b1facfd62804841545f26a869e87e49579466fb8c53c424e59eb6ae59ab96105be11fe11c2148f67519e006ee125c4bcecf8f8148061b8647cc79166afba5096ee1bae6f0b5b0232d8e5858542334e9f1e32888a95b0f867932693391bb728165215d3b63ed2c50b020dc8c1b0bed6c3248fb1293e1b0b424e0c08bf9cfa6c69c9d72de15445d8101e17f84bcf422bedbe56fd19b07abe26c3171489dd1342a61f4872d0c6a4cf9c560a9090e7c97529a1f1a0e68a9e62ac68b0ccabba30f45aa3050bdfc93a0b70e67b9c62abf00a1f8ff07cede9ce01a9caaeb276b3362769f71afd8d187d46d531a84e55376fd316ab945c6163b108d7737c40b69068c01f5a2a7d6f5c7a89d394961e02ba6155fffdf4849510b12144b34af142fdc3d01f29fe048b58c1d5835a908eb2df8f594dd3b478de11731788c3d632c5f115db309cb5b05d64205fce329cb53d0e9c67031487efeea7ab1b7201e3e8e76b6ff90b346acf79afae0c6e4cfc0eeda492dd5e7bf8523631159b2d7925803a7eeb643d4f21e28e418956aeb71a47b27aac72761a13b00c80ce48c8cd7c4bde54fe10c23ae9699a67dad2acdb0dde59bc780c965573f78dc9d8940dab215a56cf7d2ec3068503246d376bb972b463f097957c9720d5378110c8fae6098fac20e52708ea3dd73f45a17d6e00d8e59a8e5488bbfeca598bb4ea8a95e5f4451f0465a1d12809fc65ec690b3ce13e596e376eb346d4e543a31260667dca906cdb068935c3077904365e68d1aad9c4e6f702b87cd832b2aba1ad00574008d456b65231c3df676f1bd88bb5068f27ef1f28fb20cf28ca7041e4ce5c24ab5f51a928a5de7930fccb1f5309c4637ce7833d3cbc2652c684c6f9b874c19c3ea34c9c994e214a4eb13ebd4eb9ecdc9e9cde0309eb40385a9a7125a6638f0efa7349f680e80f4bdd32c8a40d4ed12d0db863f07c882d8897cbd74ff5706d5ce68a8851128e28f2ec038cd647b36f36069bb53bf1bba81901ed1f1bbc7143b03ba56878f02e15bb99cb0f66dc36e96371579bd31a480e782dd77ddc1ac194e1cc307fa45bc13951a743320c14a60046beb0382852312acb4b61fb0528d14bca1f1f122560afcdcc3caead7c9cba888c95886cd9b9b452569dadb9974c1f708540d0443c0dd32d1f23c0b75bebed11f1e0067081c0c0df56d60c76c848d5c2863f57e9a103611310dbc7b01de6aea081185b58354422b8640373c13377c54e7a3c6ebc0d00e83d828316c1b71849b5593ccff99fe8d67b27c4bd44b6269ba78347a64316ef2e66b478817eafaf016e290b1be59a8efdae99601367d4795d3f26109c62d0d81249c73722d754946a71539815a7129985c84d093b9b1291f9d64328e4ce4a1ef360a4f620d83fbc29447401aa5e28c9dee0ab05144888132974c3a5d097751ad35dcd550a71c279e667683f92247141d124b7b15789ceded78dac93991bb2faa636a1f0353c617815e0412a8a319dc62a9e50862a0b05433ba2375b0c95e8c2bddad3d7f9a928e1c587954fff913142a7251b9ad819f13946c38188c9d0070e6ed31b827887c5889bfbabe10fbccc5fabfa6c2504387860cc34d9a7892834cbd6399234c8ffa093aef278ae7c7d15134ca88deb92f33495380199a8e26698be084e2a89180c5efb9b268c0917ef74ee189f770b400a8ca9622a94224f2f5f6b5410bdc06e29e72ecb43d8bf4bddfd81579a511329034ab9fc17f037fa4b324c3cff945b0635a9aa37b16baf9843cd312a255e71304338ba156cafadb101d06a9bcdee7a452f1c17752f454c86a53c36af40921b678a6569aba174161b05a13fe00581a0ac1f84e9fed4400d02d9a79ef53b013506aa5e95ab8f0437f47b595c2872d833795ca5c8cde04e50bb3ea33ec134c58a417d5382e330a0edc1e246b8d0121f4d94ff1a38574a6c9fee446e3b9d2773266ed4a751ffa071ced191d03d994d5bec28f56f9f642cd95d669527a297e2e562da69d6a4a694bb36053ee76dee28353ee6c0692f552d1d45920a133d9158f46a88d363c119fc998f804bd159f28179f2e87d6180d549c8d4f34ebf8f4c15eba0f4ddd9f853954be5a9739259fe0934f0c5643428ef7ad7c9e0643dad1bf7ca6a045fafc125d9117f6d9c092e3d28679fd1dcf202c84b68ba555a4b1058885610600d01fae99f7b819b386b1b13a4cdd9dcb4277a6b73bd05b1197db777d2ed316ba19afc71dbc56b037035e827b3b6ea51a844deb4bdf4ed0d09d41904e61fd1a8f05b2f7b5cf3fa9882667eaa85d1cf06a05211008f1c0d055519d2e644423fde27c2e1e5aa78c452ad388b7b3b64b143837fdd61947dec77dd4c3280190984c4fd435a50fc4977765909dcf064dcbd85a02e85bcbf4acefc838486ccb30676f61347e5f9e44a3dee26b51e5e4ad8437b399780bcee02a53a5398ddbab71e02c648e88088246c4a02b1a8d53ebec2d9d70ef0d9b5c3663b9e86630d193ee5462cb0758e66ca3b46a8f7cd025068434caaa286f864bfdebf88816f2380b9f0c92d3023ea4d34d46bd39f843bb42ba85013ee6019ea8b767b2c0f3e922038161689edc0d223631fe54a4a2ce1641395f5c88c9edd2bd0d31c5edd0e33301ee9d218eeceb1fbd96803ad0a94e19f6533e509e710586bfd32db132331af217267d5723aa61a1d4d629dc64cd98ead2ed49fc64d8f29da7118f5a2f32b114affa65a95a2650517d1d38a65b1013f731cae484717fa8f953988f0fab2d2912190bc397f16643db821595cad3f435e98e9e1ce4b31c5383e5222d682694005a9cc6f3dd3941cd62d988a20a3acd931f51e15966112f9df4ac61c3a57dede45c98a244a97ebdfd4de9eebdd8a5b9390765debf5803357cc00f6fc1cb1d5064c79080408fee511f07263e9076f6c21ec7c957bfc31c70a97fcf2326e2d04b8c7d2016aabcbddcf85bb7091ee48c235d7683dde73dde54b90dab3faf78a972b76c7cdef1a4cbdbb2f57dc1492d67cb56fae7fe8c0a2d18fa7b7069ff9d27f47d7bdcd0b6a1baaf43f5688d5242c8e4efcc1600500cd8e8ddb5dec750c453b11e02048a540ef2b616b55ea41f905237db743a5ad053b4cef1ac087de77f7109ff373ad383eecace912da004bd0ef621593a72e79982f2c0bc09658ea15a60e05be5b6261a9ac61d0c1b33384ea1e9cfe01d961ab9e75339c72b96a321a703780184e98ac1639c7cf7a8b41c7976cc13ecb0a1a437b0506865f39d928028f0a60299be50791663c1bde11c081c481ee18359306f63d111c6dffdcf269f450ffa30f0c154c69fa1ae8b9e85d02f603dfadd17ae16ab16c4dd5a6684ea59485506bcc324d0ccd4e301ab5e5a98253060bae231584a67de363de61403cc56c6ead6f8ae59381ce9fac4ede882d200dc091f3d13747a6569343c82ca19e10ee99e1b86d23b16209cecd9a5c38177669a24779121b5ad6b017f2f7d7106e0397b6b97de2e291330529cf116416c3881160c752ea091eae8048a71b2b975616f9cc68123f4d604e121b31d142814f7bbceaa004a7d6c09b435ab52ed666d829da5c47ec6d377d735f39a4669c4f199c18aafa832282c5a510e6c5c0f05f05d8dbf7ab414009214888251fe300e63fbf5dc783f334ab8c4619c991fc03a9e52286535e0b63245a353bca890457f837e981bd0138c33d7e2568bc42cca9db2058829a4021327b27bcc0af30c9707873d42a639b9ff82e53afc99f8e7cf79a36336bceff81480f42473a73ff77e2388b5d747babf737dbdc92aef600bcd585adc3c677e9dc9af68993efac833148686b522cdead54e7580b5a3e95e58c65dbc330b5ead7376866843cfa6ced671f86199da7c66c541dd49df47ac2e2fe066a9be6e2aa0a749e561f050976c5513b8560484d10a862e63a9a6fb417c09250f4a5a2c130f2a8a6104b039deb7e316a5b2b734954a7e70037858b5b8c2c69fbd796a96d9ec3c59f06749f1e1f070ba1ba504df29f2dd591b2e787256e8ebbd7fa462337aa100ba9a9b80f6e8039e1715fc95336804437f56776ca5d963758d07b699504e90db262e1227a9a99e92be9f13bd9784b73f802129cd6370ca7c1623e1d80656d6368276dbd72671033905031ec6b66f73d870e163a95ff89824750f5a2fd0b416625d04e5b21afb20279fe576cd3c5819115d7e8c497de0b6fbc923080d0914954b241f1142a72db60014859675b0d6cd861a9b543c203c0de93aabb9a2a891b58ccb7b6cb072837b4afc04db844b59fbb22f92f2a68ac1c8a316cecdb86ebf696d6324b693d017a169bbf557e0af51c49789cd1cff1187e50e7ea25c01a47b158b8d18c83347063864a66fa6d0e290dc4c5bce2ee96610fd32fc0a160c92cd7005d26680c955800da61d1f953a25c89f59b4a4fc99ed590aeb5420f5d07c87d3108f79c3d3b0845ca0810a26faee94258c1c3a235c5c548833680efebc4f64399b74e273fda40551ec31161d2f6efac947fa68bfc87c73e49afbeaf763d2d24dd2f3ee13e8f2e7ddad835494637f8c3a8fd9ece6c8de8d9516fb266572ed499a8fadd964eba4fa636370cb66d353a6129c28b71ee5f919ece2a153e45d6b3bf4b768067f610493c31860342c4e43465c1a84bc176e153febe34c9a3d0c2b8328c286317a411763028591d12de5bf704dbd3f98a56090f5144930096051b7d5cba20f65ed4e2e7805b65c58a999421976092f48904eb4a69737201608bdaa6a6e0a6f79050a21b8c846ebe72a7e1eea103103d60923d5d995c8a65638876cf216ad3f4fb651aa84ab2a16e32e5ec9c7e495c64a3dc16f410083a7a93f56a669ac3510431b6e1e9763f76a6365269982a70916d215763175338d2e9d588e22b61bc592d6ca3c1bfd5c46103992dc324fd3b45ea19b6a76b4ad9cfb1eeb25f0a84cc6f35e2be0d5440c0b6e10feffe365dc30713b40cf4a4e3224040b2343e92637034e63563e11d7cc3237718f1f1fecb1921d1bb8f92e23a88e50ed48f56c78b1246a00d1705295ee00c2c103730929a7e5508c9e33275bc54194725a9e70ac8df0fca1d21e518eb4c94b104cc075c76c0568e2f7eb8aaf63b20d650a871323cb00122e2e3c99e3c2f8405a68940a586a38540c448a6f28e5102ad22e9c7c3ffda12d50cf4fe8c8f3622206b12508166dc0ea97483107fa018b0144b812eec6f2fba1cdfe3e560277783b9cb4e9caa8ed41954e6eb2099c88cf48ef58503e991b71b9169b5f9a2e99da16171e02477e821373b926861f5a5d99da1e173e027f6e921bf19936965f1b5dd9ca16233e02977c821b73793d86dfb55dd9ca162f8cdb300d25398f9b672665a4fde750fe081208b2078883c820ad6666706a85f13750f0743819c6a3429dc3ab8d83816600f8963230811460d877e2cc5ac3e865e439b4629fd40d4c0150709ea63b40491904129283ecf52f77f3f917778161ba2e2025352840491904329283f4b56f78c700c10a834169f152cb6e5c40499ee25196ba89fc95f62f9c5eabb3469953500cab25032b78bb95eaee6a695d4d9a53d106b4255484c77be54e5b2023387a1b97c0291ce42bfc5aa1a6056e730744634b19bd40c94058f74fa30156da880f83739e6cb16088694602b31cd8974a76a732b798fee0f7971cf306603131a0b18c01eb77f0aaddf8086223f7b10d14f0633c03c7a15bd0c7e9fb9c46aa16def22cb0b4ce91bd096ef1bd653a187809a8cf5bfd86e3861c0e3d4f1c3bde3c9a086b3b326d09256432b3ef60bc9388b99396585ea72d40137c9db47a6fb6b3af6bda5c2d636526ae5f1757ff2d7c92df2f959e3625ae3bdb3ae341775d1e8015aa4b0d6373275daa3c9808f2c078734ca8434fbc30b6067b185c305f21966247fd058eb46cd5744baa18cbe1496eeffe24d076fc645c71a3638810f70a3abedf1eacd7db19508b0983853c6cc814d7f8bce0fdc1a7c384f3c1f0ccd8c31266a333ff081a4843c42f41de0445270605c04b5c791edc6694c68428bb92a2bc3e9751b957ccb81f285c8a718cf3d7c5345495cf79fac4cabf590469b5282627d3a73100d68d7945457161f02e9300257d46ff2c0f483f3a7f5322977cf6cf4ee7356f6444e619cfc924e6effc43708566492e1ec3ae1e08ba74a591806ec985b58f58ef61c18c2bf5c7d44b88798043133117f111e14e20706fab3b98cc1bbdccf124e89a34c674d994cc3a079423b6432b6f58d1162547db415b442081de8f4c82bbdfbce9bdf9162e2368b5d5d366fb70de2347eaf026344dbf99377cae641a33922dc9e20517f0c2543cb379c3bb85e29807d19a570abf72f471179fab4d70db119698fac76d13a61b64ae1823bd968e1def857bb9f3ea057d302d383812095121d1c50f261070282fa0b9d57292beab560ce255fda9bf54387d0ef14cdbc6305d84113f0eaa02bfcd4df071b02ecf373801d61cb81d80b92168c7c1ce941732865b6d1b7c9b6c57b8d271e6da8c2de7bb130a7532ac1a0216a8b1230846d6de92416a8bb4064cd6b6837b931b80300f86901380e040a2e519765efc49e3b081b46ec0643764ab7463fa872bc21c74451663b38a41b8a2bb1d27265fe6edc9b9b4a8da0784ef009868b1a1b8dc54cf68722b715f5b46a5b215b0b20177acbc158edc86cb796e7aa980f30b9404bc6055ad9285a6299c1349ca74228caa3727463cb996c441fa2c5f9366045b2f38d8d8ba2cc8e5602088b388a8ac0dca18a6cf96859f68cc26f5892ec0e892ca395825008692a4142981cc08246c5274cbcc80720bed36a41eb8e63ab92e2c22f8167e8945faca823eb14856b03a586e4c194a29436a70fc2a3d64046eee3c5ac493ce983a2b6fdc69419098ad5a641b5aea7a095dbf97f79254e4bdd65280130861b6df90f39a880467583310cfe3330eff3f40cfe5ace65d0ea8fd425b2008e340a4d49a2fb902d5f4e5b4ee73b262f7c980e44b61671b186006a0bdcfaa3dc41db1230a37438f4b60c9a7c4d1d97d56fdb12a79c99e04c3e72ba96a7c53321a8c722385ecbb2e51398d52e2918b20052db0b04f288a917645da8f888f46b6a54539fa5a7cd7216afa4585ffa992e3553dda506e4cbea83906ac0c9ab852fda9957629423abddda7d8bba8e9a0cd4a71ffcb27a1dc0353ac7a8fb01489064303d85ec7ecfc2940e93704c8f760979347ea3e9468fc585c4549057d660e81547621bd4f2421ac31398bd62be76d9d6a081b1dc22e0822af60f70a4fba9ce1165d5dd705bb4e1b4adce4b2d76e7e25d3f249ebf44687dd153ecdbfc469351709f9ce7d8425c97777b25d1eef7406a93a413366433704122d794e13c485175f502f8447d2d454ef1c2f3a2937094e163ba083b18b332919d9e8eb61f173a4db0f247dbfc10ed47c1020c8d78d6fc18345df7e71c88a93ae7a9545ae61d185138d91e0cebd74998228a160c99931dcb286c3d307706a0410e2db6928d2ab38bdf962a8f5f7197a2005900b6790f51cad646dbbfd45cc4b21d126bc0ce73ad972887b565205a595b0a3f7a65ec1140690303b41ba647db5a353171562515c493bdf7dc313d38bb72db83180897a66f0bf14891d74155c03c981e2c6a4cfefeb19011aa2e52427b7e0cadd52e206ff33c30772754124770dd2be79532a450e28f4e1a4f667dd6dcc700e6b8d5b3edf3a9b521008fe25ced69dc304440e49ae3774cc898c65c5c189b6e11095ac7764ba938f6ae6340f7b2cf3c99e7fbbdb7caad4956d34a3bfc6e2bf223f37e94da5aeaa75d5fc068a81561dca4b5d3a5089452ffe0bb80ed5f139894026d764444bbc2dc3396f063cd31daeaceb46ae2f80a686270809068d218ca311538c1890e0a1dcb10b6003526d1d292c85f2d4aa3dd8170c23990722043898fdacc1737b59731487378f68ebfc4f8aa78bb008bc0b3ea4a3f43a4b19d8e472bb8554d19a02340c1cb54d245b405a67f60bcdd44d8f88f2e8082833ae74743018a40dd1b013e9787cd18c33a3a759936cf77b1322fc2a997f41e7c30f010ad4d5d136cc166659e3402850216c5471c65730e96081e5b08d4712e505884922e9609d7b65b6c11cf984e51800edf0e7cb19412338dc80d211cbd87e1d271d429c0053594c3ae25631900db0f59d6412c4a8bc63f1e297fe6ea045614b308cb1c44c3a949345549c276056213860938990002e9008dd5e19edccd6a857875da94f808834887c6ef6cb011dbcab16b2c58c3f1d873ffbb4cb408c042a5d384b4fc86b5ccc1b5b86fd3e04bb2c8fd634820d8460ea713eab46d7a7547012b1a5d29f16a37233e5a9b424d92b95744efc2470f2e9899dcae0409473d92ca0b72e5d8c06d9654d0a3bae2dd5b9eca67a64065b8a00fc88bdfabae3a18201d9a4a023d6a30c0b131c78547b6bedc6da453fadb3cc158255ac44b5761d99e3e7f154b9d9d47158881b0595e5d93c354f7a2871a05229c16a43636862368270361c88b4ea5e7f8e1ed08fd272c013404ee9c4d603ec1d69d6598f1d6955c34490662604a65c67c1e423d71981681d6c56d56f0141733adb6b16fe37be34aaeadb311a169d01dcc5485f2b850fc1eceaec9b369aef86c0fa8a5d097cbf8c4ff9b46bf7bec00a48a077ab232de5cf3a633ca76c2dec752a39621adc39f5ccd406797e94e32d2af972bf936040f44f83af3d42df12e55d03a8e88b8e2df66dd10acc2c2988e056528bcaaa782ec4ca5c38ca81b05eef2e354d83d567650e175fd914c04845bef5dfc61182923130ec1ccbea4bffbe3a582b13ddcc2a21b0db80b3c94bbf42391be13250a0cb2ef82fb711e2fb956736cb59de1d304206e8e992cf3174bf7cdc2d5b0e6c54740991180a68cec0755c57fb527319a5bb7cd8d8e65ae30ee5e077f557922efef5a3e5571baf21492102759d0c0c35c6d270171206327846600432810a5f8f1cd8d3e5fb4077708336faf23f15dbb211b23a461ca6558c7288b82ba671b379ce709d2cce3fd1c235409668879f006800931ab1061fda6ff892b90900432fdb4316e0abfbdbabad84453a8340a63b1dae6618dcc123189e2a2b026de9cdad747e26ba83291c859a15235747468b4dc839b8864d2473732adceb74fba66723238150f4ce68b38ffb8d03f1b9285f985263dd83571a445a702f38575c25c8399e0dae1afa50d62ffe91992925f3f1a4d0d30bd9de09a40366d428c1eb3aeb6ccff7257ada57763562248e999bbe0e4484caf096778bb0efc88211be11fad08c7eb57af5a8c8c35ee508e733ce5f99c69db212aa5bb50ab557fac50f11bd5193fa61029d2f73a4643a1af6a4c6d9d9aad6a1e4475dd94081f708994e6393a6cc52547cb60dee41e40f950eaf77e946cc7102c5a5b061a41d6704bce3e63c95e4d52ee04858d6ee54e06f8604a432a8758ff52c03ebb48fd8929070a7e850ef8a239bb2c2b6a6db23a1edc84159f16bf1b83f1dbc75ceac0a14f1ae4511d7359c39e97989b8069f78a0d6c41cb9fd4dd836a9df0ed38994e821dfb7276aec403aa30dc071bcf70b50739d49f80bd2ebe0186aca4ac0248f904d7af6af96453ad10b64c38814e492b5d5dace5390e000cf16577a48e3333ad64d57f5eb39ae4661a087c68ebbf199eac0f09354994143d575224cd68962435c062597b9dc0b2c19cc85229a938b92908ae0ff7d44b535a704ed65fc2ffdc3dbcabde6d1fe006df8065df84bf4eb808065501e735f1e0e55435bf7e5c6219d9bde9937667b41d02e74c6fa6cb48421adc8d91b8b887f342b95dfec9fc2a76765205cc5bfb966e50f46a3b25da23160a7b823781199f2949566b24893fcd0728deece5a1817c45ce1b7239ff9fe2ab5cbfac48eaf759106d17bc3e73fe75769ac33d53907853a1fcc1ba206723c3dab34ce54e9adf461ccaf0c3db30f476f725b20f9d05cf7ff91f4906e7946bd595204e0eaebbd58dfac7425bd61b14752123b5ade98596247ef2fc6ee2e950f5264168521f8d4b0579194aa8d83fcc1e741a3f670e53a939ef1446362e2028438943ba2d4e11f25c94314fdd69baa0f2e0dad49a772d28f7430173c10f8cf901136a5dd0b9ed887f1cf245d55f4bd27e85b1ce91684933cebaf7b22a59af5a759c5d8008766c6231da7cdb30b90bba2ed7d2a2a9967b14d291040d797bf3fb4c62c03fbcfca61e8f037dc99e74827590daf0df48c2ca9c4e67f5a59f3f319ee8ae818c8738fc3af456d6b2bd6d258fd4c4a555133009f6eba87a58a48cceca175cba8bba9b8914ea3d8cae89b00b33c89c751125773737a8b713fd6a71ac867dc4bf4dccd78d75ac999507b5319fee255644ac99b0ef2f6fb13d58ce5fe1d9efaa9da4f4c635358b92424c6c33db0c5cc201ab058c3212501ea0b5b4ee18a8505f68d2caa2c09bc1195239f8fe61bc10940de965893aff34e3a7a0c48921783856e1b28c1b9f8fe9cf5c534a5b88defe87ce2c37fec7bc3e12277c4bd60ed9156e37e8f0775d1e569b123a1e5f3636d7ab2f0ef1a3189eb4de2992f043a0afb2b802a2bd63343a052c79673cb13a4039871ca96d6b43da7f2996b34f358c3391d348762228f3700cecfe5fb53b46355c760094dd96c42e0980e3b67b9b740711b5342834e3ac58d0171d64bda4dd43bcdda71d3f1a23cd776c3d39989bd96f22c65fc0baa51c110aaad316a79ee20da8e0458f63592147b824e54ea3351de0cb5a69b5fdec09967546ed872e87b4336fa51b4c6a90e1da4fe645ea31e4340116512e4c4048dd5e3a86b530ed7a5e91273cc940f730d119043cdfacf23dd0212b5775bcefc892bd3d836b64ec6987f9255cd75dd139c1ff7716c9cee60c1707e39e8ef07f5012cebcd8523c851b5055e9700d10f0354a4286788a629f7c775a66935760652d9007507995003c6b95ce3fcaf5ac952d4b633d2230ffa66401ae6865166f43e611eaedc915b3d705b43689ba6122473fbe7dbd485b9510c327fd124dd00ca62b92c17adb28a8da10257e4aa6226fce1b5443de0885dc652320ada13e0f78d35abb7a5735ce61b9520cc3c84ea49208187a42af6bfbd0be67a0c2b050d88e6a85868d6386a1bd4712c126a1581f4486c7d7b7ecf55eb80ac6164f2e9741ed11d346653c916fc38dfc476a2eb2eb2f1cba5ba4e49bd3502b5cb1375a436a6e7879aa1d043d4535d2855c6c42c16235ce40be2ea8ef9a713b012740bee8aea8eaaeeb9fadb5b3dba8d672b125c77249dc82937fb9dd90642dc3fa363a952b9b5eb5e5bb795a283255d021c008eda2cb39afc1199fb1c65444f23fb1ee5caf4338fb081a655f60ba3756c258199f34613b3cc80cefebffdeb08f49bec61d918c731acf61817aaec494cedd03613369a2efa579b9e73b43eabea846dbd6e072f16a34987e22fcae3455e7f0445fb1e37351bbe60adec3e6c566867c84b59ee877ce466362a95d48ddd0b0aedb29c8b2ffbd4bba96e042e9ca86457ab631cc72fa66c333559ebd930b31477c07e000199dcf3e45ce14b0b3d697dad17ba8ace41dfda2655b3f88500c7c4d60a973837ac9dcae406b6148dd34ff73570ec488aab5a2c577f4603242839fe45f9cd1a361774dc484621b9b572537adf344075894b3e8f52c83097946b7882cc52f22b8664e0ec1985fcb52c66c97b50a0fa6faeb2d02f3c876e85845134022b75f11865081520f39e05ea0797cfbe40512f2a7e04f9c9b02cec2a5e3642b7bac78c0c4cdba8af050c852045c259a61e6da3f97827a553abd25af66c2d5ddf9702429f2998cbb81a56a4dec2ab2eda538f429c8f2fc721eb9ed19bdab8c17c083ca6174014db6fcb2c07d116962c48c266225bafa11f18d34785a505f7cd5900f772f758c4be932ddba7e36e136c41e7d775f0a708af37f97c9b2cd647306d8ba31ad7e7dc836bf2b2bdc6058c44ab905dab0c84f1eb3808a6fe9e88d9ed2edc221b4341a20d8bdc96b5907530a3e180339ea33cc5ecc4d15c90239003ede24a622921f0d905935651ef195a210a2424397ff290d4b5bc45b3ac084ab389b7a9b9dfb56b039907e03435c4ecb23601968a87482a695c5ac9c53c6e69e284a7e7460d71316831b191c562937a8a11ca9604625eae4386d3dea909eb90f0ba61ade22018ec0b418a24caf3ccf8a90d73d4537d3e2fcc0829e34d60094798cfef49392fe8edef3d76a9178223fb9d4aecd5ddefec9258f1d262fe2e5747df3c1e47f1cd94d5c9378e6040166a3d632c4f545985bcfd8a05d4ba2f58de3d591caa9916c5c14e3ef4881f7ceb67c9a0b33fe416476840f059ab5fa82237960104565a937131b8acdb211294a46ee0e4cf54e5cd66579539932876f417babe310e0d054097246e981bae0fe465b3144a20ab8375e8935aef1a6e071ee161ebec9bc7c42107f040dc67271466e9accfc486b5c8a3f43c4c65e86b5d998be8ff04451ff5bc9321d00d5116a12a03deb96a553293bf3c55cf96d8fe3197e48284f71cf1776a23179e295b5d7345b9942fdd491b9f86582fc0d002509f2617722f3c77cf32c25a351b61aa2ab9c6d7826d91119865bace1c3189e196cd001985f3cdc05dfba3d9a9c548b9ba14d11da564f66d83825745f1993bb52f7b74c250998f1e618303bfb26ad7530347e8dc6121e5f1dc18423e700612676cc35d920e1d53c91b4785d055b2161a9e9226e617126599a206d8166298c78f44ee1f2365563c496a10e521be2b4f2735f06489a79d3311cad04b8d64c607c6f4d0df270ce0e0d7c4251ab13dbeac5894c8c0ba8914588c341b61efb630b08fd584e0bd1df85d5adfc69e4da144a0b01f015a51de269b66c2d0d7f25a55d2cb4a949e7d2a1f898343b7391c8ad1a58c500fe2da5e53b6d1fd5d51dc7b42c220f6c5aed43ce8e04e16096d90589e1ad5f3169d34fb6030f97089c3149aba1bb8534614a5c84d98dd86cc6bcc7109cd717d8e8735e736f0a312ed2b49affe8694fdddcebc9deb12244daebe3c22a6a8d7bee091be0a8df3f8d7d3e275cd4ab30f6499f3054d6faff237a972945b7849d476913f42b664d810297e26f8b71e30f817fbd8fbd01370a262ce4f6a942c42ea1d0131a8bb2da1c796253ba907992115671948b16dca45cec3dd73a4a8865569dbb4872288292249f00829614142286ee6ce3c87d6640c8091a39eca1625d0cc3b4881b9b0f5b432e7465b47110d714042b457062328ff6808ee8c5875207f0cb05c3b96167c242da2682f3cff8ec99846c719f379436c828f79d9c1e084d81e959fa834c3c036c3f96714986c7a04c969aa5594207d82a577b1e30be4224b4775908f441b278616b236cf3eedd4f4aed98e92e1cbc6c017a2c87080cb53a76d01f9d943d5c9ee69286d04b10337550231b0e080007a1bf53c00f03dc97e4227898514d7468fec936c07dfac131af1c22f23d194aa92f8a49074ba9639922b399058d42bd061b43ca83dd606a11b5e98bb6e454b08a9488dc01302fb09b23f2c600c7e05ce971e4a3b2379d1c3da4a30acc6ded0e5742aeb463ab46239a49069f5c93174937395a51060f6bea272b45de6a2986f566e0478a1e03d04848118160e32d8358ca06abe9325cc87324a7dadba10fd8b8fc81561ccb58da59b017b70f1434a3d25743fd04e1fc1fc2428d7335cd625ec558bf6b99dd555c1416a164210c8f0b1be9ec120e04809d1e503daa505027415ed8aee8bdea3f3503a6a2280b5fa19f54d3e70b4ce12dff9de6eef47a4889bdf6e0ed0daa78439ee756260c8e9abe5f455bb6120b15ba19c64f53078c5d5394f10e40e9e39136e6cdcd4342c87ff285386dc144edb080b43c1adf7b685bd63d7da9b338a5432e76dfeb816320e3640704f5742b0ac3c79a23d94e68aab54270449d48d17fb941f844ba20146eedbaced7a989a87c3053a9e0a58262c92e91f63248c0587fc48cddb8230f6ac928dc13a3ffbe8f930677b2509f6828a16f449b1512ff02f992695a54c1743c178af565430fcf37b701ce2788921d5657fe945c5f716d503d516510db6ff6f964dbf16d088b8200e172297d02ca279d1bd3ee85a04863230c550f6f528b4da29d2e12534f1e585cfcc1d82c93c630452c3307c429a121598cd274b6dc0f00ec686bc04e25e462c0d8904351631a4bbee2482d2721830daad8861fd72b4947554802265146165490d3d1da5087c43ceca58d4cd42f73d90149f3e884425c85cd10cc472236e9a52c9f1938dc1da54122bb407d5938e58ddfb71584fe2028802c551b7afe3c2efeba4ef313fd0d877e7d03905a9ff35baa604bd6256ea86371ed0fecdc6bcb089d89ca95ac444325e04e6516954edfa988162d114c7dee50035c4cc9771076ae2d52a846cce894a42863aee3411470240b947735446a7fab09bbfeeee574576534b15a7445eab40b324702fbe3743145d602caf4a490a143969e4a212ded674ff11aaf0208c89d103059798327a2f22e8708c6021432ae5ac8823b1ac1650752bd04ff916d63017638970eff9a847e266553eecffbb581fca2911356ab69f76095ef6ff410b3e4c4f0089a1e9a1e904fb9554e9fc7b49c5bb8628d8faca2c35ded6be9d784c5c9ecb3b5bacca684e819cb682d5e5aa7dfee8044a25b87b57879ec6aa363329eb9befa7e5bba779047c79ed8e28f8cb3440da329c5da923be342e9c48f99da92484086508e358622fa3884001e03b9def89c5f37dd97e7bf6bea338cc4ecff765d2303adea3f59fe003f55c994df484168d80e2af3457aa8a3a181aa48f20d691e13d0d4704f2f2891e693ae4b5d2ba3579058c1c751b34ea06cbb3a201486b6fb87193dbdbe31af5d63401ee09745a5177221d0bc85b1be72cd110a2db2b31e1d48878164bc451b23804e1de6897f56b2a1ef5370a1dc7693d5d63c2e909ddb30c7f44d5c4b824deb4249497872a2e109a285e80b33389e334c0fe2d555e4edd32d830941c48cfdcb939132584cc440de687216b6ec51acc3b5b323c1e4f2d8119e9764187b81dc0d7124ceb2168ee67209fdc0cc4252d3ead84e1847dfb030ad8a72f7ae2b01b35b120c56cf0d912acc455120b323ce3c2190de9ffc31e78811aa1a8ab1832e5ec9f1bf4ed00ef0a27cb210eeb2be193df71dcc8489540b6832c8d6cf436ead0e3de0d5868ec5e0fb1730e6abcdf329a71be45f602e776838ae301f075af2dfb5699d4eb98779d8c8701eb1b95f2bede358915dae2f7c7c2773d9e858c69ebdda488a38e59bd6118bffe2f51451d37d974f2a4205001951784381b0ca281582f1bc438f0104673d5a73958d5ea345cced6072b5ae7d999b7604228b95a04ca0be1c2d0cc7c9d80334ee6ffa82760a3fb7564b0019d48ebc62029c19da032ea27e9ef0069bcfb3e8f4f8167eee00579d1e8a1fc640b4a9c4228fa05bb164d4f7e3ad0300b9cdc7007b00d93865d91999845dd73737b75070aa8decf6733b30f140fabdcd597e83e856bde81ebc97b73f8689d88d98bb6c37c89d544ada8d66aea9af9307776f819f06b51c0100e5fc34ef21f5268d7b4ecf183cde8ad24b5ec91f437e0b22f93273d06bc0d639485e3dc8e3ec202c79ee11296292eb39b5254a0ee26aab4060f80d38470f915cea014173648f86553b972ad0525206ae117391f89cb7a1a2127088503a7808fa9bf5b8ef33d08bdd45530f03c0ea29dcd091416b70120d736b7949ff03c11a549ba72e2f258aa3e02b603028b7ff997ecde832164a496d4d8252ac6247d7ec4964cc1ea2857aec72fdfd1f73d7ab34be3036b78f8f5d1461e1f9ada3e89b0fbca87056cb82301adb87239587103001d0e327614cf422597053ba92d076b158c7d80c16a132c15b00f3521cf07bd4967e3b672dc81bae1fbe07b2c0773872d70fdee3cc86f8b3b8551d7aa866181a5334c47b221e2336a3462b4b05ba0cdbed0e7fe539307b0359555a6203d3880dad3c0cfd0bea024cb190b22be1ed7594bbaa90102291537399b1c0aa24db8cae75f635f7ebf3ab2557e4059fd97aa51461ce17a0a23b2c72fe37b9f491f33ad1b82c00c7de1e50ab0cc7fc2e17c572e19a80c9ec492fe564c30f5bbe5190f9963945cca0425a0135a30b3cba6549d6b9d878aafc130a38490d42714913fe87030903c811d46a6e251a0ce36da72e03590067e5f4127960c6e56714ae755a1009f8721c9671f4dded49f236a97081a30f8b36db6fe47fd4dc72b15b1207919e46436ece615150924d82891b4f5b315c6cb6b964c89b598421e6aaad03bf23dc152959137ca2eb4bb1484dbdf4fe1a91a3ab9b5b2f2cadec65ee018e373c519ce53ac1a48d7d070291457ffaa6c2dfa2394a7d78741ce7e26adf5e727bd9430eecb1b8ec2750c9620706db72f484c7efa970180ee6baf112261900a16654461a1644aad9130ca4e48497d8d0b7b90d38619a35bc40f348bba31e0bc6ba57ba960b70a2ac84e2c727020397df708f7e3fb98c5d12965045d262735c537714990895c73203e054e9e47d4e65ef2728898f84851ad217eb5add47fc44bf4cdd857c1268b279392f3049151bc5e3b8545c243030147293b4759d04b2809b5eaa319c5d8247b4771fdaa018154c2eedaa300a358ae1b727d4637e6adc463c943083d5ac96c8b26e978c055462bd3402c0a18bb4a708dd08a2b77c8b3ce6a08362431b437d67943039c639cb8a8afd306ddac74c2c1005ad3e988aa4ab34e4e07adad568f0db16169d7b35261f184554ee15616fc5a79d6811dbdbea80bcabf25c0ca7d975a4b634429f445434f6cc598288e2e59767e8de4cd450ffee6a4f9af8f1daa2430757d2d2ef7d233caaee0435601efb844be59e53d765f0cf7c434912f40def84e52682db40a95252a80d6582eadc461e1189c2302b8e93858fcf7759905ef7829ba2c90028238a9257da3ca82a3773194ba41a19ebe8705df43d24ed042836ba837c64546a1d1c437238cee6a7b9f2b2ab63dc6ecc3a080572622c33d96d1a43f6984b27e27f04e71fa0ac47ca853d615d8cb0d4f088f9a207146a1c0100953ec7d8aa7681aee18f030dea227a06ebdc61e2ee66246476beda482fef0bdc851892fa670e9b92cc181d0f99c96507933b7e427b46aa0b79550dd8964533a67a86c9ed0e426716a8d2d3a65e3ed62835596cee7bf1313dd88c0d9f6194d28ed829665c1c56aa5a1e55674c1330e00fc2923670ef106a9e6299b45f3f5d3bbf7bc28eac39f79c6e6e602a5e248fb66241ee2cf55b224b3d49bc01f50e690b2c232e5b15dca76dc11595b421c3449e9502e50152647d0bfac762aa13ab34f7cb0d78a9439f3482b05d56e57b200369c2029e8587301cf9f274cd8af39f869c19067f46835b3db63e4e2e2b81ea40eb749ff7dfad7a9e372d55d6d4e0d0195bbf4ae4236e035927c9fb92c6f23b742da6f815649b594169331136ac437beb34e9bcb56e1408cf2041143b9d7d972b92b4b3d04d12fcc982ed3f0ed931ea310c2d7ede085e9cff3a7c72b3e6588e6d823d4bbe05a6904775c14c8ccc106008e26450cdce8dc76db2d408111657dd1f9ae9c4d5ed51b7f1f87444ab232449c3a86ee7a2332ba058709a2b873a320b786dac7e6030b0dc7f273332e240ba7dbda5db8f6ac5a0493c00ea7b7c39d95afa25420ffb2518be5252629197262d57c9a3725b6ed0e533ee4fc10254ee8daaf60908c7b834cc07f6f26641dc1f977080457c834aee7aa973ffdc81484646a9ac4f0cffc30b74e72839dd6671ed86d9290be3ee87405307814d253533223632cfecd0b419d754a2fcdb7b0c596415271e7cd0ab5cd561d23d47615b75ea1a16b36e2f242ed79cdf91c036aa0bd44007cdf00f7683559204a3237f6f3bef5d3e7780919069044435afab0b5c990d49c4bea61e8558a3897953c6451a63a1aa8fdbd821b3bf49dfc0b04c992e1464cdf5f675b0628b58063fefc6c8c6fcd31ea48cccab5b6e185bab7f5bb6854cce5445923f964c3e9f55c10599969bee4a1e2fbae97ec081af902f8d565f553872c0a8dc07e775312315492508b756298a93a63334016c8ab06d6eac167101adc535ebecd670b9dc6702d227e09789fdf5039c9ae7a3a25cbd63d6a13fbcf51e99e4a3f0f4daa10ac34673b13f9514cf2917c7f2a2cbcd0ec114714c43e6890f097dbb823851c316c06eba86c704f7db0920e4fec07495b5ddf9d59f5bc65087e38e1d2e8766a4ae04fc072ba48a5cf2683560bbbee04ea68adbfa4065acdb691fd79d570854c781e0a74246d0af60c3a0c78b2998dfa907e66a5c19aafae89f7552718353910f6fe60fd6f3e5bc44330a0ab9f5d427563fda55640374e2c6559f711c1b00fd50a3853ca248e3f8696969ce1989deca9bbd6afd0f051c8e622f7bd4a58fcc0d90385945855cbd8ee9ba5506a34a20dd926afee37edcf299745adb76f33427eb14bf16a23f005a3113c1e427df9eb734b3e352d713825f3d092f53f94add1f0e955f1dc1380b118aa120f2af8ae17305f495e6296db50bff44f2bb4b01299c24a7d1cdfdaf19d4ff72ec32613db5cf0601f5aaca7aa9671eade0ee1eda7c658035b01a19467136d4a7c7eaa2d5815398ad23ab1ff480b95034ea4a6e0fd4186849e6c65b3e38fb904638070afd6bb08f58ecd08bb97b8985e1477008dc4a55a8c902543969512a0034d1f5d3a89370dea8f67cadc5bbc89dc426dd9fe8cdcc14a652a5416c4eac1bbb14baa9d9a05f5524c583455eaca3e18bb06aabce0e0d48fe669e56fa7c5e1315d9979839b93daa86ffb8f131b50a94cc4caa2583d78377ea1b25338cb2620038f1cbc4353a32e77409cf57d3c0712c93eb78543e6912d251471cbe0e7c85caebfc0c7720f5fc257407322fd3d3a525ff0ac130514c7563d46d177deca23853c716e86aa08382409994227c52a008c5b7b5e993cafb437f8e39e8ab91ee10a7aebfd1cb1ce471c3abfc1a7f993dcd0e1e3d4cb6b6e061c6324a0fb79827b5390bc8731fab618e1831ac98d08758c000f1190b6019fa19673ee5f3dd6a985abe83649ae6a0c937c0b3c8b70842675cf1a32e76dd234b351bbe81f2f6c036591002a8b43f5916ef8054aa76661ed2e12961afa06fce317e2d95d68670e59504939545502daf023de9ba3b2226990226255ecd56530b156b549d3a54ad1e35761f44e2fa953764f28a9970f8882cc546d55565971a47d3489ef254f1ca64d7b850cbfb76e901d1ae7f8c4258b093f9206f4a1c3bf97c43eeb51a1adf589596a416dd53fbdd4c1a1fc1728eaf8ec52b3291fd92db35740d7a9517ac797d4969ead38c88ddd42ef348962034f04c05af50319acfc1f4e5f475a98932550f083701f10664561928f305d0e7427127c3aaf3749cd3bba691b889a0cfee2ea5383b5e25e4c5c48b88c6d6e34c65e506af7d791653e93f17c09bf1a3fe5800f31de461fe786c0591509eec1a5ccdb16793c568583b8d31cfea5467aaf5535db42c44735a69b228c55011e46026a239bb7867c6f455572e44e68f1476b183033c92da8d9daa7177a58894c40e586491dbc1bee82daa9b3b136ea004b8dba29de5b3645abb2d25bf7966cab13b45e7e8f2c5470efbbb3d2a0620ad877d2d3d5f5c71602eadc26a20ef3458324c44d96b1cbe1e9fc6e5023be8e2e1b537a8086817791c6cff37f08240f6497cdc45cd7224acfa8058fbd96d9b944a14eddbda0a05e7c2216345337485a45cd99f7119efe1706759877ed15337cd6be4576489c238d97b08f9ccb80981585e97ce47439ac3999b0e9bcbd492aefec4adf5054dc5d2d52eb0f48e94f4a82a1cff3646b406ae031820c7c12f711624f44a6f215c27288fe04eaa6ff72d214fc83eb66c35188e0a95c7fe84c6384f5d485ccc5988d4de3f6047d6b7e0f58e74f1c9dcfe8d1f4837ce8f0f1d5da3316032e4826c1fd3cc37a6b10de0b925d2c579233df3624e105c90ece8d4af8172d42791cd85e2bc45c886672dbc32219e04324a037b0d966e8f7565c658efc04646557d324409719103599db50d31baf1337b19244429446519dc8eedca28a93330a636c1f5dac8a0ccd0cbe93a6d610f884662fef18a7a2006b358c441e40937268b29b1bd4e76d672c4b14198016086c6dc139811cdbf6b7092ee52ad5adce33a53089441f71ab3ba11040adbd6df121696f883f79fd4b17efc9d058eab1d53aed32596c04bc77433603cc831ddf001ece2a1b7729b0ac7d4506a6edba76310daa2a7ee47526ef1ca53acafe1132f5f223672590e55be0b9f74f5d8cb643630373a937421e30fc1f47e79a01aa18b7066e52ae3eee5361a91642be299fd64c34e91c5c77044f6ccbfb3331b091bad5f93ed51db44b86370fa700971facdbca808a73ce004bda27731f11c488608a4f315b02374e266e3a7f2f45dd7176691b1855ee164fcafa0b53db9308d0fcf3be951aa93d8532f1c7d52abb5342392ffa1f23b8e4a774cfd985a2d5a13e05c10e0974a0cc14b74ece62412530d0f71b15e63cc201f4d2ff75689b8f38663ea357738f7980c3c78b77efb40658754619faf09aa33258fe9c9684ca0f6b16d50fc5ff53dfa1ea3c2a5b9763ed275e9dd733a4a36e6aecb8cee51fbb4e85d4390242c8506f5864ec2d3bef527b752cfe66d4adf50ad9b993e870804ccf617af9d12d63117766d5a0558500f2c205b7eefdfc4ad52584d921b2b25fb5d895158edf3ef7eb526b097b9c7476eb9e83843244c63fbef7cffa6c92fdca8a34091ed03470e290dcd062adc018594d1106bf164d3f9bbfe2b630495be1b04a8eab12964795f450144cdaa92f04bdf319d1bf23fcb2132fe4c8e3c228dfa0439e52db1fdaa1eb00aaad78d5cad0640f7956b9e749a366b10cb159a962c7920b8021192d2304d342387d742fa6e8afdda5bb41c1446da403761d5ad704d728e38fc1e9bf13bf82a2cf128c11e7e3b50513364db69b6b86a972c51b7461270517493d7c095f11cf1769d040932c46049e6dc4b10e56106068351de85218655390b24d97d2b1b9f8cce162a1a0667741a134bc319e1afdcb31062d91926ccbeee24b372277b7d0b8e52bdf5a8e72b526472e1c6a9f9d61a9357fa66a15cc5a2aa9d0847513b2bbedbda54c01990f7c0fa90d312b47a56288c0d749b852dfc5744e3857c9957a245c20eabf0da8885ea6b8c029a014f4250585aae5e7775d4b0c51f75f8c2909172a86e689ab8b71d7e9f3fe8be1b8d594d40431d0c2711c97a2947b17ef5d6829f5d4c5c5e5699eb8cc37514a53f4534eb817ea924a79cfb5b850fa344cd03041c3040d13d465964cd025b954305dd7d14401d3751f0c8d131d0d141a265ebe8381a14982799a2730ddd344f1d2cde83a9aa4ee5f689c8081791fe88c0e26d5d140316d530c26986e45345f5e15f3f2344cd03041c3040d132fb32405905381dccfd2f4e9ee3ffd274dd213ff491385cf49f3c489e9a7d3cf96140d2ae3e0369d56444980a00d55490c500b17f75dd229a50053ca648a499938a022eaa28053c0295d14704a17858aaae8f49e8b089c92fa29a014e014e007c02a6009402ba84e0ae4deb4a27982a2493aad689800a300a38052c0286014a09489f240290a9832850d6a753a4dd14599828a6a4691d24da093a29b32050d13344e9cba285487089c024e01a5e8a274517452d030715ad13ca149eaa2d03061025744db049ee6e90af4344b2f314544df778f84f7792ddeb7705dea03bfd2c9b47a317d8be95b5a4cdf52847a77995c5a5a66c678e14c2ea647a55afee5e55ddee5a5e5e5c5a5e43dd7b222d249107129137590ca802ba2afe471d4857e5238e1cac1e5566e80c575832bae0985cbadd8200b171657c7bdc9537d6afecbfc97d4cbfc974f155344547af09170cdd2a752df34fdfc7e53d74b09fc1351e7321d99335b983b1025915acdf8971822952b09239070a57e668cd4ab5ede07ee657e4c91cbbb2bf592c49c19e3e567ac7ce05231d309e7521121e12a4abdcb7b0b12977f791fa86ac68c39c3051a0fb3229af1a95e6838373303667e0c44dfa77af979faef5d623a077f40b94e2ba2d29b64a00f72585ee837041b7ce08a115c392eb772a58acb731cc7ad3a9a02b9f7529113235cee8473f9e7229aabee933082fecc1833643825cac189a218f7d5cc183364cc1d887278d239e15cf348f75e7afaa00d26e09271b9952b6280600ce8420255e9f4255a445744d3d4f274d5b98c1c6a452473c5857a97877141b93c4ab532b9a05a52dfaac8c6a903a340390ea22fcb6c820b8ca97251d42a05a69c48b9a4625c400da888be2bdc0cf720a8bac2b5b82b03574c54a7e5c1d40fb07c46f8c2a03a2ee0730fa6563364d09612387fe85ca6b9fab6e8623e2d623e2f3e2dbe2da88ee705d5f9668bf7799172a2c573c2955146c9450ad5f7fe699101d50ce3b926806270644c1751e979546e65065a107d57be2b4f5cdc7f5f589981152eeeb9267064cc6c61da9466c89836483c97136eae8892e8e67c13b822d24984313fd4160318c38a155f745074e0d4e5022e1770b90035b99cea10cdf0755dc9eb606cccf038401c36b80ea42e9349d5994c2e97a1b999f44fb3a31c0e6f4da2eed4cdcf041cc7712100eabc2ea87cf3c6f33cef09cf2babc89202025001011d2481c793e2f23cefe3380ec6ed943ccff33cef8603f2e20aee8a8bcbad74914516cf0b2c9ee7815d4881c23541052e3280627265a85412c1163cd0a284f202688b2b805c8949a954e2420930012e98f2b9dc0a17130072c1169d570262726588eb388ee34a1e181eec0a0d8b28e3822c5f072589133cc00016a0a20a094c808407a4000a07bb42c3227a0e38c157da624ac9000d088177c5f33cf0fb3ccf3361d982072e2219172f6cd8e06668d0a0325850dc7c4a6f6e646470e008b2c1712a150852ba7231818a46d7c2adba128e1956fef489f82a0997e9c1d537299d143475ef7d1228944fcaf98b0c4568d0efded4e243bf3bb570f4bbef563e89b4f87465b8501ced502feefa5a864c7ae23a6f7e6e32b9d0a7a626a0bce7660a00be785eca542ad1e73af09b9d8b68ba4cdfe7fd675a955e0620e8733f04d25501c055e7a2efada874315c0c07468b93590691169f16aff4df7f2597057034e5c5701cd7751de7799ec7954aa55289fbbeeffb3e2ec6f33ccff3bc95cb0282401eee51272adc6abab72252f2bc20e729c345639ca7739e2466d7f284ba8c03317d66fef41957bd785e0b91928bafe89c5b4039912e3ed00515ee8a49e7dce20a5c380172a1c49c2577cff382765bcc394b1f1630388ee33ed005637c593ccff340531428dff77da6d316536c31c56432994ea70f05657251858b0cb86c50993927a55b68c171a18563995c34818b30c0e0028c3927a5940b034805f2402502cff34aa512d8a53e5f813c5011a940104cd93071595cf3411ea888c0167781a2ea56df398d179f3e552a1818181faa6e86775dd775d3e7fc15fd6f05c258f1e2d292429d4ce057f23a28a60d35d030830c31dcb001c30b3568b8300346f5e2d292429d4c9f088ca86ca0800c2f8b2628a5a512d83d4002595429954a2593a9336191c51756b250422a8b325a524e484941075270054c0ab49891021ca4600829a8820b2eb8e0428d1a28680298822dd4a851a3c60b2f64b14514186a68c086098b1b2e2e8821061bc800c384195440060d371a50830d10d850a38b7ff141cc1256a9196365055a00404b141ca91973436ac66c712566e5f2e20094cb12597c40e51f78da00195841c10f408e072ecc8051bdb8b4a450271378052c594a1e0aa8701d47298d02a44169c9ebb0cc25ac4cd18504a6642104275081278a520c6060bc075d50210b0d90c00a1660010f950114eee9a493d249e9a474524a29a594524a29a594524a29a594524a29a594524a29a594524a29a594524a29a594524a29a574d249e9a474523a29a594524a29a594524a29a594524a29a594524a29a594524a29a594524a29a5944e3a299d944e4a27a594524a29a594524a29a594524a29a594524a29a594524a29a574d249e9a474523a29a594524a29a594524a29a594524a29a594524ae9a493d249e9a474524a29a594524a29a594524a29a574d249e9a474523a29a594524a29a5944e3a299d944e4a27a574d249e9a474523a29a594524a29a594524a29a594524a29a594524a29a594524a29a594524a29a594524a29a594524a29a594524ae97c1fe8d875506a688042f9503937868b524a33c0711cc7711c4733c0d10c701cc771ff7d1950812008a25ce8cf775757e3c670d155d15c25d14dfa8339e79c73ce39e79c5ed75d518249e38a29515cb105a5945e0186952b66f07d573c01af0803044d5618e10a314ea613161fc0620a1ba92550a7931562d8c0220b540a95c2020c2e7030ad602185fe8c992e1c58c0008542a152292cc4706111864b16a896315252545240d4cce2a5886ca45ccf5db9c2ed805fe5fb548c29e5a202e5793e2a26940be476b82bfe55415d31b99ee34e555c445d1205575c185f155447a5f4a7980e0be8fab8aeb4e2c0982930e54a723900baaed40494e320a291e442c59c54dcca1f1543795450b81d2f41812203aaba29288f531e148a8be992b81d104ca253ac88c0120726b9e8278153509ed3ea058c1ea868a782625a812b95d7ad52349240ea1581c6d7996ebaef3b7da70ffcbeeffb4c5ef77d26effb3aaffb4a5ed7759fd77d9ed775ddd77d5e77fabaeef3b8ef3b3de1ebbeee3b7d27130d4a37b0f8382b9698d175dcc77d1cf74d008603c2c2e4ca10938e8be2ebbacf0a2a408f964aa5ef014c78efebbeeefbb8284ca01526f8be899465835664c184d20a167859ace8c2650855b00084954aa52aaca0bcaed4755d57c517a6aed4954aa552154030715da9ebba0efcb6b0c22b512657863ccff3bc2ac6f0b0608189649ca4a84289120754850140ee0a9009ace209ef9b401e081a01fcaa9082bb42730568a88a2a2e2a584a0e98ee339698744e9809508ed20770518054741c9785152ce8bc6f4a154a1880524a63aa90823e61ce39e79c200b389495ee8b2a80e0b24165baaeeb4aa530b6b0e2fbbe5945145d154f5431c61349b02ba230711cc741b139000a9c50022be000085f740cb8a28a155d984a6ec71484840b5040081e28811274c0c32dc0c57164b838aec47532576c61e23e99ae3b7d333879a55d3a75a5120e9d1746ca8365a16111b520c0e75d21864bd795bb042ef14202254a6e0786c512a98f8381ab2c342c228deba0c0628a2b0065e14281b030b932c4c4cb010faa50ea4a9e050b18a026ec0a0d8b48eba88cab543a4012570c81021a88420515337082278aabf42a05b84a56aaa0e22aadc0b2844518a6aec4928500a5528d92d7d12c9c151438e1025d6e05054f40cec60a402d7c8c2a338c29140c222e4a10782b6200461c818427316787800c809c8dae7b8f7e2617f71afa393540b9531b949371b94b41390e4ea787ed6df6d7e8d721ff8c93c7d1513e11e8d2f1cee127025d2df28954ae1690d5e378e776723c0e32e31ba97d008abc0351f4424f93b89d989f36d020c3d3c9f3ae203d3fb5e07662f869e3051a3fb1703b447e1281ae9ff79ffb442a17ed89405792f724b317650f4e01bc0b3f5f5afeb99dd409e47684f8d98408d85311a826a852d920bad141a232f407e032d4be4fd0684504aa6c2b22958dbd22b2f17a45f432794524e3a2f49dac7a70e58a9b02e21511484e714db0b62202c71591ca45a314ad9256547557442a9a6ab62252d197adbe1d1f39374f9303158346e1ca95128f8da1d2c3d3b81d8a8586c1cdd009404026c70d0f0028138bc76363a8f8f0306e874be2a6e066a470990bcc31386a055785bb32c79863743c36868a0f7785b3c2c920e6a98d1a9ee8a38c11c5c5f1d8182a415fa4e47688c4f0f455307051e0c4983285f2d8182a413c4df5f481b89d1913e820e032555c20b251a5cae4b13154847818b7d32571339dcbccefa2c8d850a9e897b23154625f84a307f001b8ce74c265b89dd453930b95ee6d8cc945b1703b3b9ef278fa340bb7b3f3f4e918dc8e8fa7cf25713b3bfc8fe7e1e97352b89d1ede079e17f2f4392bb89d214f9fd382db21f2f4392fb81d9fffe1e991a7489e3e1706b703f4f4b92cdc4ed0d3e7c6e076869e7e97c4ed2879fa1d146e67c95326dc4e104fdf41958d9934a1cc28538ab822b211c6a8b899f9b118909b99b0159183e19a44ac88fc8a6b365911b917025811f9189ec5c348b222722c422ba26905102ba259e5674534a718590560556445044bcf8a885a1164e55a01591151307e78d15a11512d5cb3c74a6745c445d9b122e2927056372b226e4acd8a889bc2359f66662593634544c370713338560058c5c4383763c38a8842716e8686d50cab186ec4383763634534bd7071332fac6ac44c305e564433ca942273d363764e60ae222e86ae1c0049b8c04d3a270562056592e1eeeeeeeeeeeeeeeeeeeeeef3fba2cc392708523016c0711c6732d12951789ee79d4e6138e0fbbe0f859a55a4984c26532a354604502814aaa565022db365b6b4b8b4cc7717b772022350975b7141054e20068d0ba05a8a3035a082e2099e8eae40074be0c00a29b460e50a0fed9e7051fa34e80eaad3a528e89a62032eae092e2e2e1fa80fd40506060e851a541142166cf00515b6a0002702554fd0c085fec004c51192502557348a248133294989a453927b5292d324e792fc0049de4413ee2737b93b14770424b929294989a42692dc939210e0494bf82ca38c32cac032d2c78a35cfca245b5723775fd2a7883b56f20ee9b98d65e99a91376fa156eb55ea1dd6b28683b45aa115710844eb3a86af6c4ba45a2b0af1181bebc6fb85546b407e90f8ee120952ad855793376f24fbb2bac680e4e8b0fdc81608a9d6b205d2add6ec80bb13e12a9829ee3bb439e3f03726dfe6fafae8f3cbee8b7687b644b2afefbfa50dfd0eb057c62fd8d3f63d7ad1d2f425afec797466e97d6b77acd9ad6fee1407779f4e6f589b8784fad65a2d4dda22bc5b2dad6dbb6e211b9275ac3c9b36bb76494c88addd4dda826e19ef2a92f5c858b32d918cb596f18fd6750c420b772df515a26f15485b01e01f9d59345d6936363776472cb6e3c60627a7deece80877883a74ece87163776aecae79eb984ddbe86dc345a1a58536fbce6cf02cd7906563494cdae86c75121b9aaeb4566b675c9636fdb2b59a65aabc33a6e9c778d374a57dcbea6c8d6c7ebb6f3e12abcdd6ca5efa564bcf9204f3aff679e79f7b30f3f397e9bd305d2698d3ed38174557c34741d0ebb8399dfa04a2eb61fab783e7d4e79c1c2d32e7572a824e3a3ffa42d09ca5f9399d2d2c8e964a32a79f1da55d94d9cd494f930a749adc9b1de5ec9c44744e0a26a132d0494b1d9d4ca07396e80462c2302747411778dce7325f98b306c8cd29b344e7a4dc6bd2ee64da41531308383d1c5c0fa51d0ed7e34567564141807ae75403b3e3643a8f4ecebd064c224ca7ae52a97cfaec269d4f9820cd614eea51cacda963da4c70a628a5b41464e6a0b4a3f38663a16e8038cc961931d0074c8fde98dde4a65320faa7d939bd257fd84c00e7312e98eecd5617949ba5d97db365725228055bdcecc14d4abba72993ccf4e6fc6eba1e606e263d95403ae79cdf9cad49a90fb8d234d18e339a2b7ac4d54c138a4ef09bd4075a03a581a38173cee7cb2c513a5b3a15d7d11b94d2599a9d6c9a704c9447a7375d76e69c73ca4003504299e88c81a98f4e202638274767378b4c1aa80f3a0345d18f7a939b745214fdbac9799c8fc94d99699aa939e70eb3067ae2be097693ced99ab3f402a5313b3a3dd4e4680d93e328ed68377d503a63a0a7699a6047e79cad49033d7ddcecc06eceb9f3f3e588d3c19bdc34cdcec634995a282164a86102a09b9496e867a7aac60daac89c74d239678d7f5e7a9215cc2c4958fe434308e3cad00588d004a13a841b208680c581627ae0488660038b24260b0afc5c0023f9a944590270811aa630a4ce70e323c6864d8f21b87860a7b6e0d0b9c069ead4a9051e58caa8008f295bf01a2c59a88106cb149406b601acc3949b1c74781a28d480e553354c8161864f716108877950f8770470e7dcdd81b87b902f71ffc1dd655c95f281ebccaabb8aafd293d30d31489af95a38d3f7dd307d1ec7d5480d29f1b302654a27b04797a291fa0490da5c0bd7028241800824955ce867ea685a68e80182a4939294d8d1b8284177c8e025e966e9470b92783022048600b43b7546667690e405985eab5482763170353948d201a800355e780ac01151c20049374c4b5234229034040612d4a72a24c118a0fa4c5c8b57d41dc00925c00e86c3b141092b60c094830e9e80633cc085a23c1f603e1fdd0f56882a4bb8e0c99c869c7080d12e87cfc712575c80c8123678c2e6491608d8220965934980002d392fb38aa41b3a4a9c3e1fa513e8c2edf810e168380df994f04183105844869e212753919490f8438b245547a373fa7cb8d0523aa17a56446c20e90416a921d64492c7a9bc5902a274f27628e5e0ea016533e5008b944edf0d97202f35743f261868cca0240750e6270807254e20ebd3d1a263c707e84b755f0c5e8bd331a5ba1cefc367fa4e9d8df743d7c387e9c9c0c5782fdc98c090f32125093cbd60da51224ad244ed00653a1c1d8e5207927270e984783a783598707433bce070342c91c4b2999c8cabe9386f002b2218804919dc4200822b5a54094107a44040124720e922990d61443409828992244240460250a4d543870c0e3700e0bb2eb8e801c80dab186e7c536620032a1b00a2a787160d3552a8d216596041c51454a4c8c005a65020894c0e0944201604149ef0c20b78e2ca80ec70faa68022ca8e89076070608a960f1d1868a04ee037830c559ca0891591fc04c067484f0514700003ccc0c22305210041079258a26447c7068dce0657a6a004080f3aa6af64810a54e009243f4076c8919a59a058a057a0637459fe09340c3a040fcbec01dd01d5812907a92fa80d6816b488239a38401abc195a6e5018688d4903c6056f068599aace85a2bc13358120ed263767c95b5e3819381524750948ea8c9472904152d59480d14092e7a53e1c7aa04477019c0e8694141e282120a933627ae134830d02249904d005c1d580daa5143804ec513a713d728841126845128d264a9876b8043ce15a9e90124292574692978a410749a95d438224930d17faede0d9785140a981baf180253a27925e6254cfd5c0d8803660ca58c2d301ecf1fde05eb81fe0e66a3a233dc4944ea50f2471a8520c1d0d0a879b5daaa3390df174f804508aa1742a11a568a468986040d5f804c0696189520c5c95253c2f926e20ea6affba8186ae957a29c17493abe18274402d353efa2df9545ee983e15a5e0d975942715e97e2388e721f0772a6d30c1df725f966bc009d60bed237b9afdbd1d97413bcc1614942c9f0f04092cb079480297532804296e884b0c4eaf55ec61692c003306c70c58a17b69950195b80224a0f4f0f3cec60120a4fb0c9a17a013f218240f253060d58a0850d4fdc4879800f1110c20e6af082155411022a362c1c5e360eb0ed2774a64214b2fc20075f706182249020a249104c90fc101962430d30bc80852c501002102071c48b86193069c38b8b1082e0a4d69254c616ac50852642c0f002cc0e5ed0050b5650c50944f084020ef02242004b90fcf8d480065dcc2005528af8a00735a0c10bb858810a3620451305204014b2ec20072b50411623789264459f1e98962c47308210ac7081022c4ac001281260c5253e3d33302d35a081150a48008a27562422003e437a7668b9b4747e0423d4800630e80205589440041c5880029e0c11001f1e7668edecc0999901d37919473042106060a50b2e5080850838b00028149080274430c16b88263dd8b0c8c882911f5e5c8040c30c519c6882c9921b0c24a0891b1215a632b82d745af0b240b1007aa0eb00e500a53273280e773359a81a4ac3e9c0fd0b364c1ae80c5f0cdc0d6ac38361be607261c60c4ed5bdb4b8a85a68a46ea06638c19840b0f471a592e771d3dd5dc7dd63f093bbdfe0aacf88db31563779736963451c5ed25672d55783bb83aefa5e70771c5c55ca32f3daee5b4ce6df8a5793f7f5fd7d7f875baeb9d2c2afbf31f9fa7e4905aa1216eeeee2aad207dc613f232f6969473ff33cfc78191e7e3c7967366684bba35c5572e20e7b197e7d7fdf6243b0582c21dc1dc67dc2b83b005c55eae13ab3b44ddeaa520ca5ce45d2eefa5ae52acf08226957aef246e04d79da9e91767c19fecf5896ebd66f6764cd1e8457eacccab4b0666b3636bca37630887b0deee00f6f87d31bdc290e770a8089041f380fe473b68539f8f0d1c3c78e0f1d1f3c7cecf0a1c3478e0f1c1f373e7cf4e8d163a7874e0f1e3d76f4d0d123a7074e8f9b1e3e767aececece8ecf0d8d9b1a36327670767e766c7874e0f9d1d1d1d1d1e3a3b7474e8e4e8e0e8dce8f8e0d183c70e0f1d1e3c78ece0a183470e0f1c1e373c7cece8b1636787ce0e1e3b76ecd0b1236707ce8e9b1d3e74f4d0b1a34347070f1d3b74e8d091a30347c78d0e1f393d727672747278e4ecc8d191939383937393e303a707ce0e8e0e0e0f9c1d383a70727070706e707cdcf4b8d9b9d1b9e171b3e346c74dce0dcecdcd4decc6ddbabb0caee2ace0ae33ab66238738d1c89c648ef8237e00ff34279ad300defdc6dd63dcdd8693426796ce561caf2d6663330e9daedc698c3b7d77ef9cde80192308aec7dd53aee27c7039dcfd86ab38976fc160df3ad1c060dfda323bfe9f60339b36bbf97fcbec2803fb9668c75b65baf2c0030dc3dddf55d40bf7d777db62fffa5adafe9616491b8ebd0cffb6e147b222e72a6a82123c4d8e1cbfeb8bb628bc642ddda90df48819437cc0bdb56d478e70ce98c7dda9abe8127767b16ebbacf5904836c641db12d9a4ddfa6a1287a48f3bad21e39c7b6cc65b48b4bbb4e58c83686b54ad11f18ed588f4c978880ce30c445a227897b71cb65ada1add7d6b3797af9bccdad8b7a486abe614df772cf5c37685cd70d5dcee63d581c1557387bbd370d57ce7215b4d5e776f71f75cc4d09925e29a4d688d54471075e1ee2fb8caab9076fc1f6f632f8e364cd33ff3faca3c9215c9fbd608d76c7e95f548bbbbe74e6d54fe446756688d5e4735bbfb0cee9488bbdb70950be13ab3764d6613666d13e271ac36b75c73ec8e19e76c9fac2f5a32dbb6cd4fe2bbeb266dcd8e65edfebe35ef9f9177ef5acb58f6d59dd2e0eed3e90d773a833b95c19dc6e09d3bbd61824214946b9194e4726a82820750540c7d7f7a239e40791eaff4de1b610412f4b947627ef748981e7c37c208244c2b28cfb342a2f4e00acaf370ffad9028adbc15f7fe48942649a140e99e40e9564c1479df51ea75ded243b9190022f726e53aaff4b990be6f5a512a9538cff33cae6444e7ea3a6f4544bfb422a2fea51822235cf327f725cf09c721a15f44c54039c775dffdf4388eba265df9c07574a20005723b9489c944f7040a154e7a701531d1ada870d283cbb570713f9780fe312a10a8bae79e3e0eef07ca7110fde93d15431f35274fea0824e8975649f4e7cf18e741a11e447da6ee4d943ee91ef533e608f027057950314980314cf4c0c3bd29e60994c9c33d133df074ef2d431cea4f31ce934abde9f450268fe9511408e70167cc11a69fe0ea082a864c3fff88d353554a86ef7b7015714fe546bf948a719e53cc93d343791ed397629ea4666a95c4fdfcb97a720412dc9b5649dc9bdeb47a02e57952cfb504c17d2ae60824b83fad92b86f01821be29e42993ca60763a04c1ef04f314f98e881c7f45026cfe951b4a5470620ba4f7d10dc137049123ca9d511540c9d7efe11a6a7479c7ebe0fdcc91403c6304185931e5cdf4f1e1711a89c7819ae6f5544e5469fcaadfbf75a6400a27bfa432d4014355b80baf71620eedf4b62964cd08309f4c08928a0dcddfd9d87775ee9ebbc52e9fb40d054fa40d0643a9d50ee296f717949b5b8b8bcbca8543093725cd7795ea9f34aa5ef0341d3079a4ca7130a953aa152a9961617979716979717950a0666862a35615273c67481068dd4ace13144343c8688c663886cf88d186abcf0020c30d8b071e306a8ee1dc77fcf715f13be2c5f185e4389ba284e03c56be84749a552a8962ea6fb4d5d2da8185a90b47c8ae6098a2629958ac245bf058c426568479404ed022cbdad8ed9b458edd6e4d556ac38c7bee661da057bbcc91b5e9b71684924cfd2faa683481c8447b4da6eacc4d66a85375bd2ce444b2681e205455efebb8ae3a57d2b08495050cfeb25da20d18ee3fde1c8fe686dc3d02644440b221270ff8c73ee01eac1434888455af1d6df45b5f678ff9317c7ea1f61b248df27b1ae36e859a12df58b36d731b4e2df76b625cee5af7af0d07a95f57d1e3d84845eb45ae7b0449e658bb01179ebae227e9aae45444bda72f95b5b71c4325f5a5b54fb2346585aeb1afb96c6e1bf452b9fc49706b336d3f66b19e9e3225f767f469479abc73ae459b01c1d36d8ebfb30d863fda22d0f6d5d65f861b656c957684b0d7bd6d6787c1bb3d1f68b366ff23192dd240e6597b4b4fd30988dc81ebdecbed5b61adad8c366688a423cf2b45a4332309bb65986b7beba864fde9abe64a585b6f6796b6b64c7c7fb8e61cda6cdeef8fa088f63b5e26b3c7e78b7bee4ad65bbada8c7d1f5c3eed01a7d9da1e95aa4d51a2a6d96f9f09678ffd1b6b19f91b72ceb91676d7dc7870119fa01d396b6c56af3db9848da4ddecfd6c8926f43f2ea172d69fbdb58b3fbb67a8690fc3c2b5bb15a5aaee5633dd6a77996b6e16b6473c982d96d857e465e1b9bd9f7f1d639ca5a9379fdb4b21ea1c996b6ed0cefdfb672ac339abc32e15bdad663dd78e859427c721d6de1dde41d479bacac96d6b2b5fa13da5248579b43d2070f69d1dad0964261cd1ba9070fd91a0eb2475b95592124fed9a40d0791d9209c6d1024fef124e01e03dc5d089fe1420ea7d5aad6367ddf8af8c78a386cc114a106640897f95dbf358e57a6edac96afb25ada6b5bad5fdb86ad88c3d7b6fa656fde2fbdad46ba329bcbd738dea2176ddfa35751ae359bdd1d877ba90aee6ec4553c34b191c52a4e8f588df5c091ede8d811db91d51d310cabd5f1b1a3474c87ace2e4e8b076c7c70e9b706b5bb6a135f020c312497b1b73b58ff1d0167e18c19d95b1ecd625cffa5d7fb4e087155fdddd86ab7e48a13d39bbfa07927b5188c70feb0f2077a785dbca7ed0ecdfb716b3e9c7fb87b8531fb407ddd15982f250a283ab7680b9d3244e7bb0463856df9258fc5bb63627af2f6dcf2caa96145a44686d0006fbaf2fc36fdbb672dbf03fe12a1f64780f96c4b686354d48deb4cdd5740a425657ebd56af5bcedf1c6a5d6fbc69ebcd5bef6198445847bed0e899587e6d66a38bcc53e56c75b8df4cdd7d2f6df62395b99cd4f13fbadedaea32de20a89365b316332494622844c626d1e527305b219cb2ccf8cc47949b662462243b26d48c48d64378983903e1bff0411477b65fbf2903efbf26032099215499fd28633912b93d934e963c9d9150ab2f14fdd55c858c96c7711d247df2345b9d6b2dd7549916d43a26b112be2204af43d22565ba4e60ae45870f71d3e03a602dad6ee5058c7d206d56d8fe80a54730552e984ced29935de6db319efb6b55a3cb6f01989f3d1b65a676c8d8a301ebae2a275f23bd0742d82b7153730a3a5c5456bf78d275ba05d85b06cc65b7fb6a59017c9aaafb6a49d691c5ab13e69cbb7e20d13616f6d96cdb0f07e1b9295ccd608cf1eef2f6daf73ecfb347bcb5c32cf12edb6b7df3948d97dac1f8bb75aabbb8a758c5d4de252dbfcfabe109f0f2b2be3b1e2b7b44d0bab25f18ba3a5fd266db8e67a96c65fd6230df4a2cdf626569b47979de56a04e3212be220423626c91a44b44521366294adb6411bff6059b6b62459e4dbd8df6a6d6b1b91583f743d6b7663afefbf0cbf6dcdc84be6ba64571bdbb9da22da6a6db328bab228baee1e6d47f6ad5d2333f28a38247b449f6c2d90dd750b15657cb4ed8f15491be6610d01db56bf60423cde6f69610d5f577dff963769b5d5bf912c39debaad90cfb5dab6421bc9fe1c20bc91c167fc57880a740bafec666bf457781bb3c2c638bf9dd58cb7d08c8290a9049b26eed6e8dad8e0ee2cb1f65bdb6a5bdbd9157f5e2f961ec71abe685f8649acc7b106b991f508c6433566d3b7721471add57abd7466d9d8bc6aaf564b93f86ad26e249bad15cb7aa48b423cbe6c98b14c67567ee99a6b49e25a0d873636736643f759dd27cc7dd6dbbe63dd191fa9c9b55a8d8d6cc74db8e3c687cd4ead3e72421d3931bb43e766e766a766db995867357626de1cab99e9cc8addb1d5b259a3bbabd1cd567ce93a8ef5450b778d8d36246b101d9ab803e0091d8ae8c0e3ee730a0c7000c8051478b1e3eeb38705088124ca01289085bb4f2635b841151b42c80114ee3eaba4103024430896e0e3eeb30926d83093bd1f1e70f7d9022e091c04e08b2268ee4e0d00001a1628c20d308881bb735470021123f80017107082bb4f1e6a4030f0004a130277a7467a7a384213399ab082bb73359eb8f2840748c9e206eeee45a00163cc2f5a5bf0c1dda711a8008511643ca0083beece4900f6418016032221b8f760e118d5d4dcf6cdb504aa854c6e483803ddf61def4e6263357bc41add1dda71c441b29d55b21e91556b24d78edc64d6f2e4da112cda84b22dcb9a9760d126a4371e85c88a47f108e720dae6ca354827296b42b2cd3557a04dda6c69a48fb68d21e96373a509e99a2b906d7665240e42ded9cd48806a29923513196b7833defa16d1e5a5e94ddadaad0269b2e621ad6d7845d2a7acd5ad639547c89deec8d9e14e75b8d31c1c777a63c372a73534ee94c6dd7188439cf5cdfe20b33676455b2567bad65c4b12d7ae8dd51859f36c66876f208908a06b5bdef64b86078e7423ba44bbf18f586d9123fb2324565b24891571908c45f2fe9071b645bc0c7fc6fa1a5df16bb6a2ada32d1c6b58d6ecde3500eedec355b72edcfd06773a02982040c951e6d021870dcf7696ebf88f24da54386851b3fb0e71150e31a45ad3b57cf208e75959b3bda5edb2968b94b54cd3d6e6c4068d96b42592b2968bdc0086bbcbfcec6fb17d6bd9964f56daceb8c683ab6e80e2ee97b4c968d50d4537147177203548f6494c7e7dbc7f9356bfbe8f430a2a1c60c8d46cb58b546b7866491c4f5ce6ff67bc2ce1ee38aec2a103078cccff6ddfb09635fcd19264a58577df19b6e451053a1254e42d6d6b5188ec4112a4b5add2907a96f424196237aed9a0b186d88816653224e411163223ef8cbc62ae384622b163780badec1aa9b902a95656b8dfbcbeb75dd62c104784ac9e5839f9db48e2d7f7e5a426d23c0faf57b6b7d5d241b295c96c3c315450c564899980b609d164acb61dd61aceb217e2ee39b82ac61523c377e13caefa27b017ed5bdab663acc2b235c22f1b5ea36cb5b6fd6d1cab8dacb5176db6bb8e6f634fd69035569b788dae48de27456b4324bbed4cb4c5be89bbfbe0aa9fc18768f2b688ab9fe6696aaea5d636c4b97c1bfb71bc472f1a5d1bda6c8d2acdd6b090bbd3e02a1b9a604315771fa2c98b365f9b139b9f66465ef2d69acda2a585d5e6d7f5e835798445b2d29e36a4b2e1091b604334791af1be104d58b686c36dc335aeb2e1dd5d86dfe83569fb4201aa1aa4c03a1284c9d75eccf5a84c22fad859d5da1e4112efabb4e13c13c95bf4da48960402c48fd02ab15a26c32f9b7178cb9bec71f71faeaa01c85dd79f9157246df976db428b641fefafb996ef52d56003934796dc71150d608c36d1d2426d73497177b15a9a0e57d120843b4cbcaf9a6b097b56cd15e86b154b9b1571285a9bb539d9a4bde50d6d0642d3b588582ded153ad9a40d87af99aed922ae7ebdb21549abedacbe445bcb5746e2b02c6bab8583d4b36f78c7b2e6a3eddeaedbbedb0a595a90b11ae15c962e2b9238b44233f21685954724ef0f3be3984bac96e6c2443669b5cd4024be3bbc796b1b8465a48f686f690b432436e320b55bc72062b599b66bae4065595f4665595f19ef3a8e386cb56e8c80ccd86cdb959c5da1a7d9b6525f2132bb6e4dd395f6b2bb8a57246ba86dc6e18b0402246325a1550244f4d9a4ad91b3ab750522fa08b9fd08ad127db345af5bb64638d457d4f6e66d73ab45de4a0b6baee56b63b1168db80cad88830001d2c3f623b44adca90e7307e28844245d7adb59ae43379ded95dd8d7fac90b5b3ba8566f70889afce5649cd6e1f3188dda40f1157dd8055dad7276fcdeefb769c9157bfcbdd735c75e39d8549d18613dc3d89ab6c4819a2098d104d9e358ef648d7a7999177eb7c652fc33ecfba8da34df676dbb1ace150bce26b2bbe0c3f2ddc956793f686a40b4789b6badad106d9195983441b41dc3dc8553044c19db5b59dcd6cfa376d766b6fcbdbae9f6dac6623dfd236cd104d8468f296b66bb659aeb4fd76e39f67fd91fd113ab23f48609001cb96b7fd7a93d6a8c7dd5d70150c1570f723ae820108771f72d50b5a7077d6104d361e358d48de22219ab0b4a5e93aeab7bb86772c6da268f7d5b8b4e226ad917d7d6943cfda78d43f135ed90d6da96b44f216c988647dd88bc4576bab61b62c2bed6122798b604f5aa33b93e117edceb8b4f96d485a990c3f595fdfb7d9d286361e856ced0e599b935a2211c9fbc3ab2c6babe50387078f9cac5b2d4bde91c4afda0dd2f6ba8eec8fbbe770d50b49ce126dcda66d7e01c89d255a6dabe5266dceb620eecec3552fccf0219a6cab5f4234799668ef5896f5496b63af2bedb7d57fdb3763dab6d53fb23fb9567bbdb61dc75ababb0daeaa1103f7989bfd21bc63cc06f40218d2d3c373f3ba79e528b979ddbc709484fa1eb176883bcd010ae7ee9dbbd7c0a961c31fefd7b33aca5eb433b2d2c212bfb5917793387cbc5fb437efb76101b81be1b497bb9bdc95b88a4699c3ba61e118f5f020091a12824d9f534c9d593686f3d637ac1b564e0d79c76c6b363a727a84d6474cf4e12347270c2d4e4d0d87ac988db6efec96b7be339b67dca98c3bcde1aa2269cb97e1a1a02038db206c1157486f6d6d4e5cb77a94ad482629e29249b4c5428290b644b2432b93cddcc8fab22b6374951cd91f16796f160b79168c07160bf67646d6232c92f768c4f95958465e0b83d1ec980d8b4f5e6d6f0e4be29a5bac4626c339c87dedae46d707c8f5fafe6c6222c01d06baa8daf2352dcf6accbdbac34a5cba7b0ff7e9c3dd65aef2800b5eabe960ddd4d490b7d6d8b128db5a4dac28acbb0ad919eff2e6505b21bb5472dbe2aea50db2d9cab6c646b6b60911ed1116c91e1fa47a843482548fb0487cc5bf8d6f4bfc479634b2b5faf32c91a4b11a0bd5b01eff46ba9ef5bad6d1a6f57dbd2f697b7ddb57bc3627d78835baa3abb4f6871979b7b64a66e4ad5688b63888b5435e2fd26e9b8d7029564b0b49d9ebf5da56bf6c48d6ad7159aba57e21d5da6bdbf0cbd6ee7edd622f1cbe5edbead711a6e917265fdb6ada16efd1cbd2c2176de36c8ba82ffdc2a34dc4b5972c1bbd5edb6aa45a7b9535dbeb8554c7bd5f2f5bc4d51abf6a36f2955f48b5f62a6b97bca42db1d578cc2fd296f8855bad19798bead6af521bddb1be4a6b8bc6b1beb29591361d6b69d2a7e51c70f726aeb280075c67964dde65b6e368b35ae64e8bb890931c239b30eb5a88f47277dacc119922b0af212f0fec6b9e65c98c9fd682c1be860636337344a6c8d3f03c8d91cda50cec5bb522f28e418038f2fa499f899a11c3142e1ed91f96b64678bc358f333b8e97bcb8dc75246f0d892f267758656f492b92b8acb131525f7d73d8f696c357d192d98624d6b7ca5ed79f116dc632d9926fed1dcbdafd19b2e24b5a9b139beb9067bd48e2f046d6dff5261bf5be4fe21f5fb433b2bfc9e88d7f6aae402cd8112661309cd7e1356cac56b447bf6bb5b55dda30acfaf5db3124b715a2cd6e118c87c4110914aa275a9c95ad7e2c628d6b9bbc220d4c866daeae5a77cdb666237b762dbad9a2d762c6a13862dadf72c577937794c970aba6761d9083fbb732795fb510a901581a8085eb6c2bad6e408f06dce0ee95b4c9be96b5f6351b696961ed61693bc6aa68757898e8637f80d92224fbc3d242581af622312cb3f4cdfe90c36abde4c54b7b6defd60b30c08cf409b1d62efc73b33f88fa667fc03ff8070a2fa0a0020a0de497cdb7446ba36d63996dfaa533cba6a61622d9d442a48c6b21927db55ab510294a16a238c1dd510e5386922835f8d6bea2cde1eb5b48b5f634df6a657b73aeb1d7ba963ab3ca9a686353d6c4d76b1c2b7ee9cc7ae2c8fd5b376d7b6dab7566e98cb328ba82f0104bb434a2cd77dbfcda092e5876b489b8f6fa8a3eb5a31a24563c7a3d269713aa269a08e37900f2df6a4204eedae6c4bed6b71207d199656363536bb5105002168ed1e35dc792b46119e92392b6213603656b647f5e4644518868958856e352c7ea35aa341b7bbbb1d1eb72b43422513f6b465e3c23f1d33c6b5f9aae34d7b3f4570340c1002590d1463f23c3fa231bffccc8abf53db2b192db986b0fc6439a89223061022630e0eeac199919993fb23fac11e7ad6d6f479bedd1eb9db12c871cded2b6101fd7b35e867fb5ad5ecd687bf71d6f786b98c4a11d45b2d6b2a56d1c93b1e50d7b969d9147ac199a5d65bef5da5681b010c643486ef6871601b0b0c86b33d6108faf45570f1d184dd722b0a781c19eacac191d9cf096b72df3a2857d1d31ad9236d75b1dad58636b770321d523acbaab0c6947d68c8c157148da970e9fa303f64575c332de611d425a1b6da8c6e6f22bcc96b721d8cbf0d6e4b58de5e7e81045b1fe2ddbd2eacac3126fb608362323c3b688ab31ed2863d90dc91a657c0b676eb648e66f48b556696cae7a66472bbeaeb41b598fd8f0908d7f36feb163ac92496e2d5b20fc23924964a315c23fafd7eb55737bddf60de2aa239eb8d1ad46e2113f7c46e66b6e757c7d8d20c38830c83a5a2cfe8ccc1fd9708d2c1b91b746968d860429a1e95a64489012bbb191d5780ccb9735d2577c85fa6537266fa2586ff622e15c6a1baedd484cd64ddada0e2d91cd627d1521451152401616a434e1673c8014a61eab190be05c71e10602585ca985e0e881084a013200e280883b1de24e7b668f4f57162b1e6f1568ac36a8d5c2316ab5b49022e5a5e99add3e3224a435a2c7d125cb4a74129aae4568ba16d91807e95ac8c4caaa9068457db33f5c21d96a9bb18cf4a1edbb44246d386823d99f7cc4da211bc9fe588d476daf9e9197b465209f6dadae34a01e3d568dcb30e321e41116478c83e0d1675ba1aded1d73edd978142292a32349b6da9276572347f8a776ebb8856ced6620242bdab1bc79080f89b616d1f6dab4f6d9b96e21d1c7e621760cc924db0a8957c846b23f5adfec0f5656359944dfec0f5b5f23dade3cb491ec8fee11b5bd2496592137249ccb5748da3049baec8cac63696b77a8873573db0f0bbfe67160320f0b619fedb6b59a6ba96becc836bbb2c7fbc77a8d6ede319ccbd7f76dac87c7c513ab42c4a2f0e6984b579a486a5cdeadeb4823c3d66a58515863e35865367c93791a6d63e268ef6ddbf02d5b1b10cf22f197b6172d59ed18bebef8ea5ad6b2f647b8c8b374697b4bdef1566b34a22dcb5ba469f4c6a326afcc8a42cf9ad1595796655d99172dd295dd4a9c3739625c56bb04f68353f303a311adedd2c0604fdedf334382947cdd39482cca905693b78ee5df72d5a4ed67e42d71f93636d6b0d26ab22df59d91b90d3deb568bf0cc6e21580d13244b869e45de90d9b62d89b7bef56d48227916acc810919f1e23afa19f9e23447a845e3f487c868224091a12fa4112e415d423e427096c666bb6ae3219b662cdfbab5df2acbc3589435bd0cfb3f4b5319696e19968c7234c16d590178735f569a14ddf72ad4f9256635a18561a3b96b53ae459e54c0d89dfead1fe8cbcb46d8bee2863b3ae3f23f1f8583f4db646f608d39e468f38c41be7f2c34b2b6b9e915700ae23bf7d9e55cb767f78c75afb1a92d636cac8bbefeb3ac66a75f619cb8690fcfc90509223b6d00a3d009e95c326add696ac6191ac79bc9bb4fdcdeb6b6fa3a5ed5d91ec735c8a7697b4ed6ac5d8efd02122e7e90854342568234b63718c557dc5d7f79550170d69addd1dfe38d6a37af4e4b579e3513b1dba0f1bc75b04fb8c1f668bea86d9a3df8116e2b2c76911d66d5b59d5345d7338b361d2eed0b1bdecfe0e96c43924efad1e8d75878eed35d7c3dd05e02a9b72d8c6a310acc7c62a0f67f31957c988f0dfd516fdcd16b55a2a190df7199a9b2d92f1cec7dd4557d90ab8dfe4e4e838aa41556b1bab311babacfc22598f9e465f9f67691f20578e9e23aea02136f137596fae46fbd2366cc43806fbfab7d11a5d203332b0b7b425afb3e511471b0eb2352e8287f0be62cf1e6dda068997c78ae3e8126dd06d1cebddb9021dd925a21583dcec0fac9b2d9261a47ae48fb06063bd3db0dfbadaf1771dc95b77b6e158859e552b796b332b91b4c9429b5bb98ae52013ee7a738973595698e8037b3bdaa2b0e6a167e52a7bacbffccfb7de58c6565f1abe7f45b1be58695a246d32127fbe43b6ae46b6ae40a48f48f6d86cdbb621a44fae43301e12c99e71ac35218c877aca1a04df6c81acaed6484622de1edb104de21b04ff08c14337b1e29a3d62f5ad4147f687f4d1dae619ce40a4cfad8e56882c2bd11e84104cf05bb646f6452bda9816aba5dd6a359b906db50dd247423a48b4a2e86269d97d9ad02a79d18a9686889a2176e0ac2184a85d91b4d1b0bee696b7b62159ff85b8d320f6e6ed4e79dca9cb9dfa4081b86a081ad5104f7970a73f60ee740777cf7693d6ddabab9a80c0ff439b8873a95f319cc59a26372ee486a48535eb56ebf5b2bbda1cda6d8bddbc491c1ed52cd2f63d12499bcc666b3462adafb8af68b12d0a6d68ad9628569b673797b9da3144000188104018da8e627dd16ed9a5e925ee1eba8a09961b1d44e43ca9ed7823eb6b5bcb15a8a6332bcc61e5d4d4d8b1869ac916ee2ebeac9531a9e28e65e47d4971771b92987c314172d7da8e2f26e28d891177263bdc7d5bcdc4c69231dc5ddf6cd11223a8965c41b2a415eebe6402fea285b8b44b9eb8fb12980ce35cbec823fcbad9a297dd75898cbb93b657888daecd897dbd96a8dcc5fbda56bf9488e1dade2ffc16fb80bb1e2d59d632ed75a5bc9cd444254fb04cc9a89508717fbd60ca202533f82b63d92b0919af2460b83b89af986d99240b77fd4a22c50bc68b2b4f3cdba28c8f5e32194e427b5920d7af243b5c2799c1dddd5f5c95a4f3db589675488cbaab58b7ad0dfd60680b77ef9ccce0893204c51f6f9ccbdfb692bc2f569e212377cf38e72aabe2ee2c570dd5a8362716e76b44f68cd50a699b26ad2671109b8136c641f6e6219f7bc625a984dcdd67645efab26eb6e835236f8cceac6dabc574583939ac9b9a9858636fde9e0582a4e0b06e72583735a135da371614f49af15d71f7cf55414c9cc43756f3f5dd5d49cbdd27bd417186e0f38b4d6e8d6b76933557dbcc1edd626f5936568cf900b9bed6c7e48bb66563db16ab09f2acaadf1e3d2dbc3447781cb12c86432b93598dcb6cdbdab6c38a64dfd2d859ddfa6532a4ada47d91aca21d2b39bba34dc4b58d84f3dfc85afb234cfb24cf126dce47433f23af4856b23e7e4be26cd3a47dbc5dcf82d98c5f2fa45a63c1740effdfc247fbada6ed6b5f866b348dcd38dc78b4b1df39ee5bdad0b6c55eac6121d8dfc69b6bc665cdee20cffadb88439825f10f8ceca937373c9e87bfe1f139fc8589d5d26a11c6e36b46ded717efb2acb59ba5eda785977654bb750c7f46de1a0e4bdbcbb0eb59453738a40d97b6b7b2aabf25c35f65bfc94ade1abeb9b9c1a9b9b9c1799adb18ab3a5b243b96778fb6dad76cfa6deb03a158a8a46d33959118754c219a111800000002f31400303820148c4583e1541694545a0f1400096da45a6c541fc983a228456114a510310a186008180032322332a30d081d7c8cc71e1782eeb30611580ade55d402e2f5a70b7d0d74e0268412b29cd1e85c732da9f4cf2f81d2708a9a21fc61fca7385d7f43400786a4609daac4e078e4c9d2f350d5deec15ac8cd9f5b467430891e835e15160227a7033e5f23c0284ae30c11565ed22116dd7d119fe61b76ca7a314a10a423a1dcd2a63918300af4042efe6686ae11fbbc70887d01825b9d04daf82b4b70fb674b0ca54dd6e43e98e406642704c37a53c6163087e5cfe3e5f1d21a5acc807089d85676531b39368130ded91244e4ae1b19d9fa6dae4b0e011540fae7d9c93bd995f9e38e7da79141216bdd836add33838f4d6d8c068795c49b5002120f46f2d75b2955c03bdf191698138e7521a5886764a018918cefc69ef7527d07f5ab3baabfb6d5ce13fb1992e465b0c4d0e55af2e5b04dcd17eb1c64262748afb595d168d90d696bf238302e610d9a143f747babed83a008549fc18228608440ea83e441c1520442826d8872b8fe3a9a089c87374670e48460db6a203ba1df55838eceaa5a353ecdf8a2dd25b3dccbb8801b1a2ea3ff899856f3be2aa82d027812e743df11b82f12232d78015bd0a13baeec1444fb5dac6d6a86606c43ee21c921df8d93bab9935c18e14a49be7b72ff071dab46afa157762cf2117786b508d9c465a4fe6edbc8926964f4f20b4b281254acf278f0b38491e836e46ade5aea98aa59660140ae012340a82076aee6a9f22b711269dc997369095699904899e6c2c50206c861ca233249dd43d44fa7ff6dc7510e280c630d18529212b5d78ea0ba760c7f90003aa56513827f6ddbb9e40f74f1fd40ced48de570659b3210054ef3ab23a208c5328fac1d01705fd60b403432e28a3c0b4d09b6f64f0a7340f819b0e396fe4c344db685a8fe23d1866acb50a520c13a54f06270499dcb93f1f03f2e416f9ab8430f3ca59b83ab08a8d6e070b51874b8000e58c006d553ce353b33c9b3cad5e3b9b4bf577ca627e655404d8dc6a535ffb716c7f1403cebd9ea5db4ec62558014ff6ed187baa2d9cc0460e1140c246bbf9d9f064d7a2c80220d0be62c731dd1e6e1790e5a81bf2d8dc25b2ff0f0278b1e451f3f402c57bb63906696fc1de0d6ee8c259392f7f86f040e8dd9bda005fffe59b8152f3250943c460fbb8df44026b322a80c139736fa756d2c675ed82300d4b98353d65ca9df94db06d8e1c2c37fd27944597beced87a9587fa5412343b375832351c6aa2611780ec3b042c39b3404c7dceff1b94ee2d4139884533d434f66602a1201bb3865b114c3e16a68a3903c59513abf0932243af05ea0e6a2b67274ed21fe74ecabd51d7cf8be9379562780decfcb0d3187258ecf883ef15cfc500101ed8820069bd23b9be2d07fd4be0cf4860697914b2f96e8cd80f0561b3bb6536ce376ecbaf1a2ebfe748340e9489bcf294cdaa20f104ca5a1efd7e499fce8827475c664660733939b695ba59a84d27caf3b1900cb17034e56fe1dfbebefbd0396f167f803e982c7a4366d1f894b2ba8c40db258049551ad2cce0d1ecf210406bb60ec6e9f45501a6a1965d374000f7db7d24585fd5a5736494cfe4eba3449cf60c90543c9a642f336521f864af95cd919e7d10bff817d8738a61c7c824518d39a1f8f87cd7e932ad3f1e380b1e646792437d89f98c09730b99282d9a9e5a591fb3fd016afa0ef4d33e4bdf9dd695fe0aaecee15ac3b279431c84498ef02d152398c94615d341b64907004c55f3a6d51d1e0a701fec5dc6f008280c310b0b025a050195587aea5dc84ab7f871a61c4bcb667413639ce7650e062060a0fd060df2ac8758ad7669798bd0815a75e5d49aafbcc5eb198ed57cbbda3250122aa25226d2481b1a5fc1729f25f60a1c497981d4683f1a31fb300073ce00615251c4e78808227c121ed27b1f96ee39edde489403888d29c36ba06fa1779d075fa4fa7ab890e09b8c6d216b82de96e9ac2105f55c49299b93df3c0db9912fe5fda9d8e48df58d0f6004a3b28d24c67339fc06b0c3e646dba19cc05ba8555aaff0c2ee6cb3b90e77934a0631e57d9879a3a60dc94e9d389b0834c22b49b9fa2f3a80579deeeef9aafc0de480ba9fd2d10775fb093ae4556674ec79c3ff706ce97dff4c87325299e594d853ac6bc29a2a9cdbd41bf94ae6e0b034df4a6fc8ebff175ba84ab949d9fddc561256bf2132e82fdcc8fe00e63040e8cad82b0d12f0fd33889d7709a12ab76b6f10fb0f154b73252418c4f387b6f348266485579480dfef59bb3a102523c3cc5aa75f396f2064441495a02743aa3521288e0317f93e39985a8dea1de6cff684236296a42dcda0c7f155eb61189ba49bd061eda72001fa03b54cbe41dfdfa6e5c93298166df883a4f2bd0002cf1327b29f702b510de32f82737a278fa8523fb1ef5d8b86c1af78ee1254ad9d644c97fdad5770f7723d1969385540e5fef0d776cee2096ea3a04de8a8d65a76ee0fcb39ac51c431c865df4e5a87e609ed788b8b583507b4c88391288b698944bb08452337983262cfc984cf30efd0c6a6a30b7c183310481da54f6771e92c44f5abfc4344e428a435607eeba919c00eee5bcb765646e223c258c0ed5d84358285cf2a93fb773e9e3db83524613cd12ce683485bc6f18205245d8d55de943b863855207f51d73e0394c4623630e812270c85b24fd20869afd1e1316f7c49eca0e7214730193cce25c17f97537bbc0834dcba9a75a06a488b22f1c41852dce5cf255f861822af08e5c329a946799708ce550f25f31ce9609c5c4fbb54be235f9279352e99655f749e811720732f14caf6f7d6876a0657fd3b499c289b7bf886f7da786d40378867c4b58002cb9b12275e6ebcc78115a8fcf5f2e75b7a2c097898cde99cc78cae1d3f9835314e5d76d83a42fbab87814dc81c061fe1610060922df24448f93fa1ee16e27f090d04fd84a3d330e67d56b553e4a5c0ad2de1c274d6b1094e6aa6b419fbfaa8de2017864205ea24dcda7702c05c2bff1d8dd1afe02f3fc1bd55c795d995768b0961465ef5a79f7b986d86dfeac3ca576ec467c65094913e25b9d341837464d24db8e2430b444feedff7ebc71cdbd1e54e00170157238cef3e8bc7845f81b72ab8a97fa066fe0f516631319338b42230f632e767b4d33dd15f30a86d338b5f808d40c1800ad0e4da75813a4d71184117f5b928f721831a4982830629c2844a588524de062aa63037bd663efe392fefaafcb0ba1a59b59699223db42c0a99ac8612518873ad19c1f19c4e559b8cf4197b5af241a0f0bd3c0ad4313385687aedcf280c2e95d176198a6b918addfe1279f39a095cd025df26d0306e7f24d814fd194218c1564c188cf748833a0bd98513edc4779b89a217a57ad378a0c3992ca64e191f214ae7254e7e39ab09f56fffcdfd0be16c650d2e78fe11f3785bb5f0939b60f62b74f5caf2d10573f5c14ba615d6842e2ca6015fe9b0be5b2ad5f9ba46a637f0120273401a9cce32fc06dbe5f457b4da9b1294f343bb272430b018af370c63c151c8364099c900272a0c1092ba804bb4f26a684e110a8d21087e6f5bf05eb345e441a35cdb38d24fbebc2bca72c9341f1adb6745e477a4e2e0763153840a81fc5b506f8e68125d71afa845aa5c7de0af5779521c0fbf41777e08a2309f1792b1741a87a8d54b4d49b996d5c307403f169c5666a6b4c2bffc9a4d3120508ad0b9a46fd69f71177a8d20ec052032d857c1708317b93ac7a430bd8dcad22e5afac394f0d72df52e54439970aea3273c0e71748d589ce679e8b19baa29de956162631763b3491180d47288058da9d9a54c8a3a486b0f8c9bd35383b9c7485bbbf3bff43c9f583913ea6ca6daeabb81b267477824328d3e69a3c875712d0d4520321473c2ffdd90cf0e4ab9798f3ee798f892abb4fce7d665b4ec0f0c6d432a2988ca8393f69f0d2dc07ebc82a12269a2d2fd175c7ddccfbcb27a310714705350b27c70e28aab98f6dbced80950049c2d061a53db425dd629a7debf9a66d11efb4223d9883889e46bb61658c13971351f811fb36ccbd909342610a6feeca01d09a293cb4ce236f8b54452ffcf52d3180ab08d8c1c3581b0847e8c318115ff7345d09922f86614014be5c7942b35c5342cef0881d30789dd35e6c1aec3667d7a74c2ec94a2cb435f0a982b04330628e4d695ffc525b5f0ce4d1ed6c694b36bb6ba64fbba772789986a09af263aafe80c001959e884441873f7592a8bc48041f0ed68bcfa48a6acd1c917471dc374fb224f9ab8d0449d575aa52aa62c22280484328d3a170a7a140e9d3e44f33e0459ea1e8c1307eaf969b618f4958820923a2fdfde5243f79a1c9a45dc5b65f27889a51b04b53826386a77d5456127b81584ef0004e829d6281e430e855cd7e9c2a1cf290d3c901faf216a2731a8595f58cda25e85fe21980e49601343d3caeb76a1843239e6726e17535876bbeb04efe10358316cf0b2a3a8b9c8fc916a68532a1a0e354604d75772068f0850a6ad0a9550e7ef6f3ef0fb571675c8d846a554c7a52c1a664f1d2305a8ad8adac642dda4e7a70f6826d00c65c53d8ae42930def13193466f16a126b36c89e5dc1ccd4d6c521573b1433196545b982f700c64523f7ff9bba8377fbcdb6618f731e02fcd8d1acc9f3de6eadc93a666386a16986edcf5586265e478f4e267ecb2d9693a45a349cedc89c99786905d8961ce25b454092abf1f1510f5b22b01f4ea8a6cda44cdcb7ded7009247cc24566690cc52d847f664544de88a5f37aa751782661b396d9cb92aaeb9c44dcd81809cf91332f40d24e646e9fb2d7d07fec637d72bc454b3cf423bfa56b64ceb33836aeba41d2d38c141a5b496716a0758725d74fa28963362d1840e8b59aa09c77986b8c57c81007b42631b432c5a824848ff8f047ee41af1980888b675bbc360b38a00bd1930eaca6ea48ace7d6527565b55cdf4895ed2ebeccd048d0b27212119fc285e4b2cd5b4d6de5b311ed87849e0cbe2c70600697f4dc9a6be2c30eb468fa3f77205fbacc3c2ab1f8e4e760ffb87b5c8b9a033f94a12a888249d977c411bd8823c7337ac3208ae45198c8925b399c270194cff08cae66d15786dcbeb8ed9cffe6befdc55b0109b01a295686cce1be3c928109880daaf830246303b68f407fd424f5ee7098ede43a00944ea8d19ccc898e26d9a8ed5c59f73cf8ac5600589bb240d228040b740249b9bbc5924754f63d4a1584e980116fe1c7bc613e0a53317802fb1e88e2421aec24b9411c4930ed308354b16dc44d1ea1b29e5f8dcd6444727ff0ab9976d8c4ec1d05221caa89b4294b26789a24522b36b26e8697087986b4ddf8f5d12077637bf6514fa83c743d183d068a75aba2542b6c76b1e99ad8b247d5c90fb9d2bdcd905ababef1faabd6e8b932c085c5105ea01ac1a730ae7b10279251dd68927c1c48476ef45c13080cde529457e13234456885616463a3e195a0e97adb787a988d3ccf6ee20a046bf7d3e2b2e3ee9278c63cbf0f7865cf780e8a7eebba842b67c2eda070d7cbbebd42b64b5f12361f16fcb5205481308aa86eb428a15f82091eb914b0572ed2f47ddfb1cd94aab8910d0dc130ff16257cc3a0921a04469bb21c039a3146e2671022c92927fa14602842363362fac2f111da0b4967090c32a94519f30b4421df87272dd4780357f566a98873d81e7726df8cfd9105ef7361a2c26b3d743a12d8c02ade393e89a2306fa9a3bc3f9da7748ef8aea441258197159b1c51767fbd90a18dfb0d8599b5248022050b13cd3222c9841982d1927946f49329304c424efb7f5d243696cd5d94632648e4027ee382cfba1897b96e61103807a89f4a767614cce3cb128357cf195662786245431718f407268bfa056d1ef1d95b823177b9d8af2d66ded651efdebb1f73037ae1ae56707178b10a48cabdcd87aa9ab7fc6c8e442f29410796c9d056ace2743d5d5f47044a6a0900618a9ef84f0d01ddb56dd99c683970989547092bfb09d59552800d4ebee991354424f7b7df5ce8229a1eb2d3da69ea20d00ee60695f197ca75a22583abe10742fa3a305e76870f2ec49dcd39261d0e576887db4289fc77238cb995ea1c55470634db4f224a46996eb10f823379a6e0b5870c166fc39f83cf537c17c0b3192d2eb6188917c796ade67f10b780719a6d532620322e3030c58a8e4f3a13ad39a24e283ca23b55dedf404a0aa771c9f904938111608c7aaae95f4ac58399bd3f620c23b91ceb52258236aff61e3ae005314405303ec7dc5e415052e7ef13b46f9874c69a1355fd43c73501b9ac27dc206d83ec14d604e87270e6cce5026f5d0b4f1136870fd1b1a65c07e267804b2786b6a8d3f410b76af56aa265a841dcfba1c539338ef898d45dd540a4524721a5e173bc649e89262a1d2ce884ef6793fcfd374fc411710c2a9b16595299c502f550d3ca3883ca04d338449b70e8b95c911f200a241ac1df1aefd83f1509525b7bb53ef6039fa430c9f1d5277289cf922177def00747f396bea7c8b49215d3e76c0295618f8f16013369366feafd5769e08414c560e50bc28c003ae0f03445020f2637418dd8b37c2fe06404a7f36bbfc21b94e8906e448de0533713fa1a6d4dc43ac70b72a20d7d75dbd82229f6a0456532759ff59c589b6775416c766d07fc5758edf26b1ecf7f21a09ade464447d09a41bf5571622d49bee8f4a65ce701bf9e62b44364f2017eed02fc195c7360d146b0a96f8a84cd11f82d5b9a49448e41c399467c73fbcf4a8abb593c02667decad1afa584b7cf51046f3d25cdc2d21cf3fc22181f39a86c407628e22bd30f3dac814e2650076cd93c7b6257627e60598c1f714001cebf75d0f657db835b88c5ee56cb1abf7f26b375b49a333283382b76927bbd644de6c65256eca2e0ce22a704effe0712e1bad1fc0f955720616cb774c66eedd7258c13aa456b9a2f81977be81e812140b1c2e9dbb1592c83b9de624fbfc1eeae31b212b3f1c50e6e26f023bc21fd34b5c0aa3de23757450b1d3bdf7345fc9a69af8c2f9911d32ca9f0491197f07db8d1c87a174bdabec38eed3ab7559c0c7d755908d2c560bc4bd2ead0ff37ad85c3735ecd69fdf135b558947671b150129ab8c6b52211923eac6ef464cf8bf7e6d1467e9a5682e5320f082757630b4ece2c40d707db6a3d42b759322e211bcccbc29a7c67d5394914e7d9046ed2d8a9ffcf4eb091632da6dbe67e80b0d55a3166e6cc6fe9cbd29ca961d417b91d1d4ac8a8a509d445af97113ada376cd83a263904590ee29e007479098c84837ed35e14ef7c88684d3890c796f9b01498ba9f34124089a8367b3ba2280aa81c0f28046996b31085e9ef215da562be89d836aba9fad5cb23b2076d315ca518e6f9cd01e096d2f93f5eddc772558edcb58b1be01ee79851f98cfbafe9785b1c0100ca379e301ce58aa175329e19bbd5c74c4efb76d0fb1ae88e70fa5350469de3b68c987287043c41a46ab86b4101b2245b9fc2ec443d91be1524767fa948390ee7470646327d79ae10f8bd18354efe1cdf548ceeadca42d6d43b3b424db10aeb5467d48e565d9d68932b2690fb10668ea5383525ffa21fafd75260c7b2911e56169cd7741ccf228d44fa78b3bef8425ad1b62d4596b3737e15d23e003a591a863db771788e54a798c2b9656d52cab1b3684d99315c6d5c55ead2a32c2e4e8b0b71f0782de832d0381bdbe33e39be7c3390f9c1e606f7df90d47b12b1f29db18ca9e52cbf91b1c72c905361e008b9366e109bf44f8cc572c9420dc70406bc67483b67da9cdee26c13f46f3fff1897267a4647597db2d0bbba3a29e89acaeaa818f9a2c786fb867f91516439e92641e3c6a1777ef2446c46a388db420cde4936e0dc62882b705c80329783b62b4a96bce76db927aee11b7123fc461243565a13d2a1e04ccf8a6cae6147c2e7e42acb8742e8dc4494488cf04b46148cd1f9163240c90eb8656321ec09ec957e777628f7f3856155b5ee569584c547f80e740d87a9719e39f27acfd18fb9f749884abff9ee99a24173f38875aa110c1b7acb0807b37be3d567b6b4f0ca181d03edea2872e5bddb4333af5230ec3009e91bdf0f38c38c5c66935715371440921116223993cfb42809b7aedc3eee7368c6d0d0f172a36ae53ca77ad3f6f386efcb9eab5d66b3bd5b519fd534af9f3cfb284dfae2f65fd9ee5ea4b1a5a5b7e75a1d259d43a3ddfd6b055efef5698e2563dfafed059e2ff5a7a0621e9d56f8f26d8f448aa3f441b3a11a07bdc95b37c32b00c4da2a42018655249d1aec8545280194a1edce46b01a8d9034629e412e3f69b0376cf1801e41e651830ce35b7618998ce39afffeb895182c8e4c9747e02f87eaa04cd03f5f2fce99d4866eab182e378bb601aba4221877e709279ec90561f926efbd23092c41c317882deeca17d316da52d8c433203d0b38e2577180ed67c1eff95817f3e73c6a4d0c9f8fcb100e099e6832f8c5e38b62470ceb28d373c619fd7ac801b76b5d5a1804b1a9402485f841458f1e77f46ac351e7a5b08d916337a3c5437c61bbb50408a0374f126498b28f25d20fc6b243b31ec59a3f32f29460dc7ffdb13daf8ea094a12036a2d6f36cd2e75471b6503c564bacbc3701d94ace6d2978322b92b7bca59d512967436e4193ce93a28ab244de9f6b0d66e7156ffa85a3f94911fe2036b40e8842a9ddcae22b40a1b70247918b42f84c081016febcb2b9159a0faeae75de6854ef2eb202a1735191c96c2c05af5d43351ba457b14dc5cc6bad738d1f11103b4c8bf1b738a40ff444610fa98156f098b97b0b36d63cdc249001f135b3fe56682e5dde74a3e9739bfcb9e899ae1d47a340708d7081f6029a4447930642afefdb5a8e52a3ec46d8174240cd51b1d85ff6145e3468778a8c73bfaa9ebee49c48ea510064f5d30e62c2c9cfccb5fbd2f5e93d9cc6a60a3d934bb1f4f4c99351b69a1eccfd3bb0c6f32a9f7ba30b421ee2363e1f428a85239ac2bbfe50fb1980b429d2862a5de6c43d8621fd94165997558025ff66b0d5eb535c3369bbb86d471b5b4f1c9af7e4ad1489130f1073c7d2ba744ce0e994cbe49908141647ee5089b3aa545a273916774b2a71346705a69c1ac147dd18a97cdd9fe296bcf836ff84ffc03d389d7e89cd2c8a33dc726dd1ce587a3fb479ce689312a1913f8594db138415d916e10297d9c83d2a38a5c6c572f235270f954de7273d8d711a9cfb84232cbc67cb7725a01778f6ca8cf1c1eeca62bc96b499fcc9edbb37222f20276f835181122050d51854ca0d0263d8eac9bb5d113eef3c570a642aac90e6ec9d7354152c43b3dde0d2c0917b59c3e593c8f81e9471ac29074c5068b4595811126babb4d8d6961e5b2be1b97886d5ba04266910a487079c1de0d531ea240168f0fe9d1dfdd807518c686f483356952b20256f766e9a328ba5d908cdd6dba6ed9ea98630b2c9fb20cc115d27601ac8673e347393ac5cce19d4066acf7a60611e8996f9ce3fba97ba333cc2001b5e66d4d00b1e51375b77945f7b972e875581b5cbbb4e63cfef6d310aabe338fdd841c52fa3162164fa68421ca3adeb0cf866696a64f3546f2ec71a0b284fafbd1cdc5cafb308a2d3b20d285cdc5f14bb90a5549004f4654e5ad85a2b2acaa0b96cade944105332e54f37acf313cf2ac75fd8e8a0be019b95d4f9dcac124d52008abd2e438a8a7fadec82bc3ef58a460f99823e22136d64d680f1c894823e6841b57eb556a10b1dd9531a619ff68845d1e18f64a75c69aac6a7bec829a73bf4248eb3c6e4d7b9cedd45bae428a75471358e39a31870fa682301f1bb9a529f953ec1df7f4b303b25c7ff6940a8af461bcb64bebf132469dda42026c8311770808ab013c7989d0e6796a0906d19320dd063f42e42e352a8324a349f2201925202081c7d3e3e47222cf8335a6295ac022401d8c07151beff613d02ab3d335bd8eea7f374c66ab154d064f4596145c586e845748ea1cd0f237e7145578d4265eca768842d587960aac12d1b9c69b71caf028be7d287909725362517b3c00f9152ec13466147b7c15b9059211310ef8c445799a2fe7fb150a3da7de43ab73a8d2c79a398cba2a13fb587ac985f117dfac8111a781fe5b2a1d04008f52cc95066f9a89cfe30c04eb42fc4cf014694bc841f101cf0dcca9868abc3a90811c2c3e242230f0d20a865a86f84dfdd359844e93367d02fc31ad263a4cd988a32c4b5fd4dea26a7a2b1c49cd365d2aa56c3bbf5edff294ac5a88c7b6d2d3a61e9c6f44a31ad10621008b4ea223d8f93752b898c7ee4722c3f4c6ce48294a846c81999eab240de73560a2749c5ac60ebebf424ba33233107f75569dd7251921615d15c463251f637cdbed5bb15e026df35965146fce1a207e625a69d419eaca869e715f71252f5a2adc6ab38eeeb8438f95d176931ba4e9012f18b2ac3b426e87650bff6662415e0233cfdcb37ab5c8883559736fad676295561676c3c09e650901b3222dbd24bb68565ce569946886241a3a2e1fb2695631bfd8620a4b08dd94758af9a17e2d2351ba9d419821130dbc9c0c401e0cc93f178c762ca4fc504c27d8edfb306a2d1a130781ea91f9ad38f82b1dacea4d79b5f484ebb59285a9ae3aa16e9e57c77fdf3594991e3137defefa9633bbaa87f10b0aab8ff2b72021ed288914087bc15a5aafc22b7030c1ef9982f18119ebdb7f1e16df5b12563d01dd3edcbc2a79a11e4fd2356787a8d7de89194ebbb5f617ee8c55927a0321b7e28459c82ca4cd4871e837cc84c85964f4ef3c8dc9f8f008b8e7c4bd7008b570c9e4b7abd263fa1fb3a8c2d0806aa555ea6d95e0dae4f12b0c233d3ac7916de605682268c03017302238c71b71034c497be72f0d10bd832b05b781bfc84c308fe1abe1d5bbf5ab1e3d878bcce08d000fa16a4d73898737dbc9573f965ec02047b17c50b0c4e8f401bc8e6dea4a0b967142315363f780d55a9d565a606a0fca179993739913c2283f5f943a78fecfb7fe77e17cff95cfd941443eab9f58e31473bbb6166ee87cdfb545a60b40e42b6f9adfdd216f6563487154884b1df62347431b6c5ad5c6381bbb4465b0561588f904315f20308388d1cd5f60dfed1e0fe3ea6dc80e4426f6aafa4da04eb068b5eea793c969c3142b023f284f22321246072bb11a2121c9a8212392218f45c408a4c7240dc8ef26e9a11d777eb9f626cd4a48ef1ba66984184497156dfdc2191852c48d91da0071e9c6efa0f28aae7683906512019a4555167041b40d373d8d290184e90757ba9518ae919d33ae2a32fccd22c5a82118413a08192108bef9ee84799f4921cdd245644a4396c7387fc8ca37b5d109427e8b01c115962d2a7a899514b2d21475d77e2aeb1d4a35425ef8e89abaabf32e7facabf63dc4d2a92bf043e31f1ea57c7f7ad0a334abdec9e57a432ba50ff668848257359e6c0165f2bcf875bfec9299efec407b9ca8f8fe9e8fba8c20d89210bf31e7cfd5091094d25137eace490928bb3dd44c69d234aa11f47a243075237e5ef60345069ddf6f6a7b9d8bf75fd9eed5bb84b88942d7cad55f6d8dad4174a0988dd531ead834ffcb95d7d734c7425333bdaa203e278c8513abf1c24829ae66747f615f6eb9026679bf8f78bdd6e4e4ea5433ed3902209be5423edd398bed1b2f31f5b5be3ea47977dc6ab57d9aab94a919df205c3c0ca164d2be8f84b7fd5b57f12b6ced6f66207dac49467c307800e3eb004917625fdce1c6e44137ad1364857ba673d7501bbbac69678bf885fcd1588891fc514fb3560c98ca84978cfee917a689694e160b447598f2ce603ecc944d91f59ac8e26fed73fa9ff003900fc8302732172c5fb8e90b0dc00481cca92089fe751766da3771db812fea1fef8dbaf77c8e289ca45eb38893ec32c5eaf082a16547d07b3a594d51c0027ed664322cf3e7374254c4206b6766e4b3be5dac1586a7a578b7f0e700de649ef7f5027f3fada4dcb22e8cc91194db6f71c7645fc7ac40f9894d1121b06590d428e94454c52c318f66cede75584add66a909b0cbe8e7be9a2e533f8107c4d863b65c17c606e09b923c0e3c6ac8ced6c751d4f878fef225e53e0534782fea7512aa821f26e02b615f16ad4b97a9996fb8e6d3111839e3be4eb2128ab3e200be0aef3599097af6ddfa7f776daf2218d131103592e2ea7fa5b4f94a6c6c8233aba40f390d799f05de00951e6381b124af7018091980d60cc110708c76732ec7af3d549b279740061ee94f489d81f3861dd76421e4614cea3532b4c683b3e82f3aaebfadc25a337ae936762074463a4bed102df8888c15b771d687ef14564fdc03db869fe1e54a99567e1d6a48cda34eb8bc4c1d3bfb6be39d1a85383f83732272c816a51a150abe3dce542d08cb4906f0cfd612010406bc969186cab516cd3683ff999b5f7dd438b0f8528410263c66e777853127c4e8202a16d749e93258b401f45d887b4c2b5bd08f6981175c64647aeffa224cd0b84b76baa2312808c0d5c4aea11e96c31b6eb47b27a9b27ca210e7767752f4bd7d10d21ea69708da4af0126161e5bb81d1aa1b0444aac6e80a926f5dc05d56269383fc550862e5897aa85cda79a0db3faf2784e4ea56879bff44f7c10c71e6b9ec6d283b0b541fe04af3a384acade270c5e618b2b2f50e82fdb818de0900dc2ca807d4e68b959e9f67eca6ca2a1dfee146ee58d75bd9b19590432f4b13fd6707d2807c6f4e575de4c5e660832a7d270fff0c90e3bb4cc321485b304893237d8c18ba00019c25c3d2479bbee17374f5de2a2663dda093d6db186d33f14552768dee5c4a9846eea053e908e9d764dcf8a51b4838c1ef3ac89cb0a2744b76caca1516c9178a5c4ba5eafa13e74d2b7136ff85d2e9c783ba0a6622a89e8a69a408b7c23c298986b405c593353f203fd77f85c88525683454dc7e1b2f67f20c616a6078bf5b04fa718ac6d427bd5b2a778a8a68b814d0e262e8d33a746c7f647a84583f684264c2e5a2e0c3d429b29980543db93dc11c582e7a0359699d22da1af7a36824e31c801064d01816e8f057f03c16f71d9a2259782968cc257480f22da1cf6cb1f637a44b1607b663b62a3f2fe9a30fc9f2097be3deb7c4d175e6f0ea59bd73cb6aae39b970b514343048ecfb21ef7e3942d01261a8b748a44f0d5aa08803e2dc8cff982165ef03061b89ab4061d21bc434b1d8f1c28858c503fe2a14f05702a112c8319b52bcc5f23f574d3c827423141342db81fe78e9b5c61fcc9d2f9183957b808c87a43f1ab7f6d6383fbd1c26ef66bed3fa93ca0fb8c27b9a56e26900eafa9f8deaf9dbc010a70383f91bcb92da7b882038c7c9c085e8867d9529b830b2c45454259c88aad09be42afd1a79a8ed9cb21d1fc2453a6b44ddfc2e9b8e945320c10948c39aa02cb6022bedc7bcdd0732e3077f094ece87bf0c88879cf0530a3dd56b80ab4d01f4fab735ef0a992fdff590cc656f32ca231c0e138e7b4a159b1364c4f25f90ffe11277551156fdd25ef66fd195f2d5f51bcb99a7bf8ae4fd12ce7bfc0be5e907f4fe2fa0f08745d9d6672882d43b13bdbe46f8cb3f956ec7c07c9e618d69e6a358444836a67f4790217d5440db70a40377c48a952c2fb614fcc63681b05c91d9bf333c0cefad48f054e24fb0949c6e4f5283b999d79e52680b875e9311b66a89c059c6e916b0796a13c29c6ab2b663c34ec375cc2835c0fed9d1391ca2a1069b7e852e359b80de0f5eb3bfa2e52fe8214dc4e1c33f4221a03c89be6988e6ef09fd46a5f9fd617d508e0bf54f0358ffaddf5f79ab98ef8165ed5dca7f962cce039bdd9f345d86d6a3407aa4fbf00cf4229ae6f8d9e93fbb9573d8cc640a4df3ab73669df81b242d6bc1e72eac91b3c8d60a53a398f3a5a5f5568c3f64e8b7c3f6abd5b14442e6e5270f9542d53857723af348b9e72ebe4ac6389d08cc974f89849f5aa3e70fff38616c92516a9fffffffb7bf67eed92b21bd4f17d050ac23d58376ad738aa6a1fb8456e5dc8f936f50423519508e51e15de18028dc6b1c626566f2fd3a768bb78c81cd444f9e3ca18c5488d3fc0f3ef54dd6947889c21954730ca55f75414c051c8be988d0d738336de506095b5b0fab62a7683d7a73bbb1c10cf48ed1643eae24641eb354ddab48cda968de14b91bcf92bcfd3c72f9f18a5f900bedb6de28dd726a5b0d01cae8beca82abb2bfbbf2b84eaa07914baf49598e8bfe2a863e489a992a4b3323f22205852ee24dc4958b8fc0ce574a71a9f91297c520335dfb0a120067102b73c70a16d921b133f0c4eb33c925f99c67724572703db3d9de4c1c67387fca5cfa733a51afc163a463759c02c63d10091ea6c9204866d5c8c9c505e003b1761b4ba75ca8b39880ed575586f73fec77f8e4c7c1659177000f910272066ac5694d541bf0005fc1b1090982b645b88e167f9294a32b49a0873e912d311fd138efd97d23c8fdcfe56025eb3b020ae534d512fd4d8e948389ec4739bcc88bed18b12ff67b42836fe8f559d62dcb737a9fa1f6b108880e5f67a6acc6527254457aa4838687618b0017e4b12852e19b837b80bfb4b691ce5d4aa56e7093c7665da198aac4bc1a347ce9d48108a14fcddb108e0895c376b8c1994f28ef6ac128e9b305fb565b4dc211b9f2cb181e4930ca318df94d685f31e6f59b252844eea0561714150123865ad2f74687dc92ee5d832f9d2794d1380c2f2c692d4b2f194517c7686049967afd883bf4bb2a724f28bf89105cebadb32c963ed45df181a7531bade62ae730b41bdec5d21a550b78e46b30a6c09f0d9fa83e0a5177e225237fe0f23c57b0aaed3cbf8744ef9c520b277a99ba108f3b367ff822dd5c655342d5fa2f201cbd8159644e555fb7db17266f6994b4810c418426f41390e5ce6330357664cbc7759f76045c1a978471723675c27871a7b0c1eca8b164091ced8e43c5b4c92e09aeeed4298f25aa21097d74d8e8fdae529efb2fa45d29c12c74e94ce373c0744b47714d020f41ee2b267f452ed3f03425f40e88eae4626faa4dd8c7fece0000263140384e6505cc3ac824d487487f1dca5055c7100b1bb1d8899739e9a7a693915b122e97b8085a3894fbb280f54ec6c330b8559acdb74094590cd1fb830e238b272951b90201a80819be291025cda7e96bf6317c38338ccf134b27f72a7794bb4a6a10ee8be48db5cb75f83bf61f08c3cf748f4175545159a956aaee3d374c4c177d2ebbc44a7a934a90a02949c8e1e54373d787dd37652840407dbe3584d094d261a38bc4c110cd6dcdf8b1b9a7d2b01b0102cd372043d3100f38d7078d06ef9a6bb7d4ad7c3b7936b41584681a32c8903efa7dfea450340d02089a436f94c4e00a2403ea7bb419dad219b8d22f7eca4353b7779982afe48390aadbba819ccae8e61b34999dcd4d3d2a74bb60ca75ad697c9d7174a740470e1a9933b65334c5c59703870722c9c4db2e5298824d38664b8b539ae6eae2f21143f04de9684bb339ab368a8a397c02b47fa5b4579984971c0ae70edd478bfcd7d8510b7548b80ead8816bd07e05eb943db5dc9a48ced18a53347ada4c772292eeac52e9b60cbb151d3b3f33041923919aa677a7862977c92f34d069d5da9671610664c0b2e8b5bc415d01ad2b6d66d423056e40f698290a2fc83ed1687d46565f10da4e5864c6f9d97e864d7781f4e89af9b941cac39e20860aa2216a6fa7575da2f363014b535faf16f10cb712b27796323fc768b40fd085a2f26805460795dcf06c2a607ea4b4f90e4baad8549498aed72bc953c647a6bcf70f71875af15b3f15064c546aff4724a14556abfd350df8aab938f0960c83ef22af3365b5a6e2ced8bbaee9f4fff29ff6740ac6f356a6262d360aa5be04b302891d8ed2b8659a4fc98b1709c5cd38d7f3e943be87e9edc67b4c2e33c0dbcf08c91604df402f0e574b1a9f1d616617cde43a85c6210b78d914c1ae8f3353d539358fd84cc6c2b8e2959d75bb16a10808733a2e9e3eda44c2fccc9a22490523bfd85e6c07c9d0d03142ff25d17438df2ab19a32719a12b1df7717b777e71596a2383bc84a4f642a1d8ba31916dad9ee3f1b477fe2f654448483042d492e394b253dffee81e81cfef6b947180515bdb3a1fab77f5b3f4da5d37a34f53dc55079802d15a09fa0debefebe100c77fc36770402c90078a825d5c8bb88029388881fc832ecc6c6e46883b3e592531dfee090b2bca21f7a087107be816e6ff5c30bcec0321167e05dae78291cef641bd7525aab464715bb7fa20b9b35a188fa1de69753763ec0346938148cbc0b07959abee523681662f8db1657860eafae084a00913190fb3496dff29b18ed6a17f893716fac05a7db894b4638486d003c6778f7ff0076bec83b3b2dcec0f24ccea0586714980d51f728e824058b4038cc09378105788a00dbfe3c203960b8b0186cfbb25f78b98340c182c8614f4cf0d9869c7eb88948b8a3a4220be1b2b4f406f9d1b2e25c345ae901b38c2c4f4637af31aee378019041ea840280070f7a0f784ff97b2b4801030c1b6acf92b0aaf629800e331a57b7a9fcf66f701c537edbe512085069808b1971850ab7074997ca28757915c2c9614daf788861473cd82093cfe4582d1952841554e5c3c11aa69487104818900c35c65eddc28d11b667d98f8692e9d310f99c660a2c5fb8489e0467bacdc1ca6ece4af134e2527f5a487e80a13e9a9cda34d88afb7761855ba0daa77e3f8234298254c6c88800e591225a6406213568067eb55624916a0f2a764be4489970d0156224c2023d93b60cc84915303d62d9af8b3505a72e9b51ca2fc878e66d99e59d304952ba10494b2c24c266cfd723ec88820cc2365537c735194689c0b00d4a3632fa7d1d38321aaf0f56bdae722f5f86f61800a859226d385d1193a2207a542d19c71eaca4a9301e68b67162b6a80d3c8f7bba112fdd9dad8a395a9aabd5ff431f11e748afea2ee222e012a626b03f3a22b6f7e0c8bfa19c740456e00b8cf2094e0ddf74989d8e14a22b1eff33af66916f013462a1d232eff8eec9c6fb0e857fee351f09ddbb2e75baba1e1437bf45063840a19d96349ac54f3b30df79c37d43beb73f38a417631a88d7310962219cae82c0a2525fa23638c91210c67d9cfdecee5e30112492ec8fac299c69d13faec643bbffa86866ac9ce44d6d18ada66abb81ce8bda50276d0ba8c5952c21e12cece69d45e2f40b29fdda435eb0650e1943f741ce0f569b197672a2d1060c191197347329c4d8996fd02ab96f87939acb2c78d15ed421a816ab8cb46fe758fa1b646309cbbea83b6d15f52bc9748a88fd98da29685720640a041c6e1431521949534f4b4f709964edd342bdf0d40b15f7d8f6c2d8d8ae29b03704a969305a52defab847c50247f48824a11a24cae5a5ea2591ac30ecb401b84437cbc8164733fece21976a0d46cd54448d71248f78a567a91de75f15345e2a976a47ed0a75ceb22983f0283b0b06e1e1134db1fceb6606170041513fbfdeea785edb1aca21dfd932739888d22627f630896081b06ad416a0684d40c47b81421f967f653100bf4983ae97a47e414d2ff205639f51ee1b26c64825600629ac72ddc4a1a326a64bf9cfd86c5b476277e5cf56f468d1e315980273fa2edf28bc68c5d0a7bd33350c553a1244000911269c0a0f6f86396d76cdf21fc933d59e00ea1f429cbd0b45121e6d566b2d2631b467752bd803e4ee820891eedab8f343ea6b2b010b4046e9467c4f7aa3b6152ce318c2ce7020b140e0f2e9e8356b7cc37237ff7a2057a6f9d6ec9947abbf8a0e127740b42539b375d6b4d26848b2b8dd1541bc0258358099c051929581b95ed9fd58e49714a9c732a7e0bea1f00df6637bc90ba7ca4054fb51ccbdbe8b62cb28f5e52201786b2d44bfb7b1a87bab0c86d017d2b30eac46d710b59446b65f8ea808516717b4fcb868ce1667952b0e716113e194ab7f02f2b154640b2f6f8c73c072437fd2025f47e203014b42a3910eaccc23a117f7d337e3a147a195e13a1966504578cb0e90a46ae7f30bee003bfc38871defca6b7776dcd11ca0ef41c2a658ce5df55041e706afcb357941d2cfb4466b0263ecf3fafdb640abd9727b084a19c8c76ee5119bc30eb102f08f526cd7411e98665cc85be52352953f9b92903ac59cf29867420a276fa284e28d1cb6dc010e7e2eba3ccdb9ab4e10a650ed850588572c2836d63652186c932c8f83b8134ba3cc52dd24db5ac345b82f62a43eb23559899ab57d238d1ef2cb6897ac67b760247e5f079f980ac636223137b880fe8d312ea33ea0b8c26baaf62331124273716b39b7b7a0a6ba62c60971f40f0f963bbb74526c2135247c3ebc5b85e5e7214b3a45d048ad69fda44cdfcbd2e393729eb6933c633c30ba39e716f1c5216e3b9588107a7f336e3725ee8e742cc2b2edb01e101f6094d652136b3278180c1388ecc05a2e83f78546c0aa6cb0f6dcf1dc068faec31859a779732661a23aea2c2bc12a104c3e2cd6161b08687a8055ecc224c9207b415df814d6c9a9934219805f5c635c92e9a69282a01edb12d7fe2ee4b41c4c283c25f7f23f1fd858cf796fa0e49fcde3cc0eb17efa56708f8e961e23d6355ccb722ec50121277aaf7dd0bdd5c26947cd3b08af7512970fbf185ed6334359b094dd833aec2c2db510508272a85c9cd07c86d1b540712335391e71a72f36144d9ca31ccc7f9868a368570d22444672936b2d6a3b6b87a70e6da71cfefc1b530baab04abfdebd98100235d73fb91f50fb3ad7996ffadeb6c556ec9d7bedd21f223ebd2132ad7d7ebe7b13f87360adfdc33e34021e27029e99b89db9d70a5c563a06b87b154f5fde94e6754c9f8241668514155332c58db982ffed701fa0fe6877fae6ebf1f4de88043b2ad08c971c264085a211326fe850ea722e3bde8ab33555ac56241398c66599f14740864cf2b66e74fe8f6ce88939641aecdab50f2b887ddbb3fd372688ea4d3c165b3bdb1626664bea0ac692ba7ff142a4a71cfb0989c50d9b2990f170a8f190095884b09cedfae9a016d40b6f2429735ddaba6d3df4fcf55c784fd74e96b65e2c3a03f16add8ba42cb1a62107632e9bf22681df737b14333545625a3a47e2c99475ad43246ec0f7691a9aa3de64281bf9bbb55a2b02a85ff15dbb9208f9434ce706b72707cab8b26733d76b483bb131a1861a6fa3870e6ab7358249055668eccc5bc613554d4a73569ad51c531d2daf3796acdfafdb2c39b3580c31c06d06883bea0d1bc018aa7bb176e0d6eb9668bbe3cf7a44318b77f35238909e0e4ea200c0911cbb20874a8310060e79bedfa2f0174ed476f93aa28c6e439aa0ec4a063e670b49a63236acdb6bc66bf5e1e19e77c86889d6a065c77adabfe37212e00c57065457b14c697cf2abd430ae8934c38918b5a280c1d9015fbd1dabc7e1be1c4e69b021aec83cdef861825cace078a7966bfaed28ea18fb3d23e6a37a72f1ba5610afcd7c2cf1fda3955aef3d26ff3aa8d2e98ff9f5626d61f010f401ea87c3e6340b14b83eb3b94424f9e64960e55a20cc93507dc32b1f989a9e00740f83d344fd177bea42c9f453873f13300c08712538ef9c724bf9c5acc177f28ccb4cee4a7ecd51abb471389a7a19fef56da4ca04b93847da922017e574174efa3c8f33b2274e9f16176be2ff32adc7e9c63312b300c515b00b7f469e336f2fe00e0b0875bc8c8d48cdcc271ef59da5035bcbdf8ca4e285ce356b2b449dc12c6ba01e40ebc1619ed1c95ebd57c587bda4c7f2aad2cccd0b2924374530cee19eacfe2c5a5bc4afdeddebfaa6029cf87883dad183bd2c2629a9de2088b2936e1c255595f96badf7f690e4301dae0a77fa677d0cf11aae0636819268d5214a1b890b1da73dfdc6d6a458b08e4f4b6c26b275c1ab32e1ff03336f1b567901a94f20d4736619d9095af2f301cac5bf47d8307ed21979c4c714dee377141169fc8f5501fae2451b257d9b517f0f5d96465e65ee080e46896eaebd3655fc12751d3ab70af2bb2edfb1abe05c385bbbda23da264d13480c15748b345a9371f3ddc9f660d05a834e3760220aa6a85b972f662fd7ffa9fa9fe62d6eac610be6c4de593b0ff6e3903aacca5aeff0bd4d4316422d0d72775e3ff1770432302bbb3b7b0b6e80c020ed10455e00ae6c28bd4f5a032705e7047f919cb8ce577119887f760f02dce6ea64c87998979b118603c0776a2e67707d6d61ed9df19c84239206934d092e29c61b152b1ad2f74ff5ef9ec2a4e38e07b50c0da6040794e0ef8db11e51bbe0e5a27648339e0e3a88f6d0e2d0d02c53b020ef80a763236012925af177d10841cf00f86656d01744a5e97721d1319c401ffe419199ba0a54629bd5e0aeef6c220077c8af95801c45176cd945d5728d1e5133fa9e1eff2e89dcea7a12c34cc2a6a7ff2611c13531b34dbee85324f0ee758e3fd6f59f2fc3ed51a46525b6491a55eebd528c0dfc4b74568d0ef9b6278dbee2a195215820b142b48ea137cfa14603b6fc88bd6131153e35c5e5d2309159627e5f9a3acc4e709b90414f279de9e88f83c7efc9d34b577854f46ec989fd8c9d9cce7ba18f2d3b5e16c040068c133fbc7fd47b46e6767b14399aa69ce27db390167d584ea072b8ae76dc76a91bb9fbf29a6e5456bc68dce5d4a98b92de0b9a8b02abecaa297cda46cec43d53d2fc9289976584f7137a17abda87832b61f1e085d84463aeb4e5a456339909ba2772215f8013551c59d786351c75dd986ae70348bc62a6fc6d49d1ea909fc26ba40254af076d3a4b9a8819810afa222ecf70e8a2e0770888a71da54c67f94bda11fe8302a245608d253a9fb7b574bc31880235624eb5261f7b7244c39c7c9eee646824c0908110f6ae12e0d76c0bedbb07a75b2c5389bb4fb223c194cfca67ff88817a2514edaef9a8583680a558405252ec47f1514fa7b200d7576a4612bc3433ae5945edd2fe26895e84bb8895763ed054780426c0f3ed27f80707132e12e9c07244c247e39d68c9c8e2a023997c6042fcb52a8ca58206ab9245dd1aa28db4cd0cc97deb5f8ee1a81e38c98a82edc92589e660bf938d4f9f228fa0d1c0b0d2adad9ffd8a13a8be7bdd098af77ae8e40dda2800e80a0fdbd7bf6b4e1cb0e9768ede83edb0b2ba9cd125a35a0b886250db590dffa692377020840452c4d65bc6ea0dd3fd3221d4ef8d25d60889fb00392356f368aef3444d0f6581495cce0b592c3504885d2497cf324bfb149308952bcb1097de14bd3bc7ac9d335a1e76433fa243d1d8e83de925c66185c6e536a026eac8afffbd900e09c6b9507c25547a887292110716416ae65508c6676ad75232f3facd60453ac6a0f0e467fed8e44bc3e0846ecc39e9e2779c68b42cc6c81326734d904539b6292894d3399e932d17946c600265c38a202bdedf5528977d8bf364fe72855f1ee3d6f7cfbd6b7befbe65bdf7ce3bbefbff1cd37dffbcef7ef7de3bcf5db1ab6f80a5021a8ffe75b7ff980c5a4f3768c5f398fdf13b2bc27825a2a8012e4b89720274c90aab8bbfdd5053b725bbca8ae434118cec58fe23ee4225294abb8bb80d535d80cdc23981b0c57328d42d034d78b52881149cfbec65bb7fbde9151bd991a349e3a2a0328c3d05d91b88da7b1a56d403afd023c3c22976f3eb8eac7525d49500d83449c8ea73937e4b9c17eb32718aceeed021580b020a9f62ea3e8268980ddd834daf88b839991517d04bafd4751d859b2ca7e6fd35d14366e1965c150ecfd5584a0e4c16315cb01cf9f76f5549422058b0a99402c64f449c87b0df3ca6da8701e1c82aa5dd3fd612bd0b13a00253a1edb33ccf22a10e3f94f9bd4862edd52a5884da25a7ad0a6ccd5466fd8ad43d77c11751830770529801875e887c9af978943a693aeb4d3485fdad3a529dd69d2971767a115a6f3201dfba9c3460f56458ecc89cbad8f59a6a2fd337954926806284b9a02952aedcd1c4790d71be4ac22d13bd657219a5baa31d0b21ad457211ddb393edff5ed6dfa836228f501260ed6657f0763a5a6858b922b4214fe9b7e58182d3c25849492dde6fd4b74b027c0a72994205f843d7ebfc3c08d3b59742285926db9d227c44ee76eea913858eb4f592081949ea7c728cedd231b75a1ff05381b7918656ffa7ff00c9dfa2f94c557b4360477ac352d0a2cc61fccf5007e6feb71298c2e5c45c19ee438704ba8c4b321fa88a85d92eb7ff65e2d103dca4033759315381bbf684e16e42cf8378dd5ee170fc4c25d44df0748b5ffce1071c09df46f0eb9c6af1a270939177c9ae36af4db01e3aa4b7e8e9f6b30cf0561179ee499a661308e3ad135f9176ad4214dea064b70f67ed19820ceb5f46f18a9d9af9e10853b08fdcf906afe8539d2913be1cf187a2dbf0d7ca0a8dce7e87d01bb5c133ed9230dd719c20788725a937e59410fbaa567780163fb6f8c88071cc9ff86d035fcae69529c63e1db38a6a6df1e30a85ee6e4fcb807eb5c1c66f1269d680d0783e81951d3bfa0471b6aa76c580367e797c60982dc659fc688dafdeed0b8e2829bf3cf15cc7380f09d2769a06f348d230e644dff0d15754023bdd912988ddf0f7a5457d871f67e0353ce0126ef27096b8ca3477461a269bffd23c4bed0d46eeb84740ee46043c9094642138e09251c1192f0f32660e14f36e91b0cc3c81352d37f41891ed6486db007cdee770d13c29c4bbec61135faed19a1b083dcef09afc6bf18231e7112ff18c2d7f68bc60471aea57fc348cd7ef58428dc41e87f8654f36f821b5d957376bc5d87a53966e6c92ac0b875fbf154b2c7d04c456c8dafa5d0a4923a60981b8c08c3d1a9d4c31182934c009f6d6df8fa013dda6f3f3489c84fd67a8d3e42fb8e879cb9d6f7bd7851723b566268cc3a46e1c333f0147a8c736b9de311a6fd498966df8045a145deb32295f4f6ebbe79a224963e872e90389386ff7b7637b46297694292dc3999cfcb1d8bbf4c606a30636ff140cf8def8a9c409e25e0218350bf88b959a2c3b53462d444e200b9b9d5d65ba3b29c85c40cdcd02ae73c75ffc80a6a1654c76bb7227f66ff5fed4a149f03e39f956ee88a233e0f7f4644b1492a584e2624abbdbb3aeeea10ae97510170ad90538512544f994e77fb4484c0affa36e1c3f175bef26ae4641afec0ab0c338be745bc8e855569b80290b54a5e50d72216d47b07058a7c1c8e96fd4b9bc4a0ec19d5cef3785856ea9387858b4a998879cf04759499a54205a33bb8402cc27f3cfd4491db73042b74a0b7e696a942e8ce53c044316662c1b03238c96321f8b9764b9d4537db042e59accd1de93befd3a86456bfef61e56f87fd50714fb98b6a19ced3c5524af3ea27f31899eda28b4081b7bc705750382e3d0c26022ac52425b8006c28698a05e5fb7b86382172acf2f118a7dc320b4ee894e6933fc8a2b0ac1f3301c3a0a2ecf2f7f23f58f5bbda912bfb55a0d18b3c517ffaef6d2c0091d5eee11e170e94edb3d5aef48bdb58a80d9187b206db6aa42484b18a86e3616900e48e1251a7144b43621b69c0820694d2d9ca4dede29f526324a8846cba9df20cc921bdff927669a04da1ef713635f1eaf8f9e972ade9fa8f004d1307bbfe1709a711f57ee776e57ec7ce5f6163224a4b7616a4a05b443f9926fe8411da79957d0094d021541ee2f83ebdd34278a2136ed45863d0a5e1b677161ac6a080fc8dd4a3e11163ce7b771d1cb7d37becb2483670775cf5fd90eef83e9d5b54a429e467afc0f166bbfda44c8fc022a117a7e01784701ccbf797e03fbb70ce0a07eb439cebe06e41fa161df401a813b819a4e46a920a073524b6c142f4b0642e0aa45e029868f651411ff3fede65a8b966b011ddbc0da85f2cc35b77d15415842c301b6a4f5e1cc3c1c2c77295c80f059ffa2c385618ea5d1b0d27f82982d3f818d0beb5bbbd5e4c9aba784c3ef8d0eafdbdd15cb4af5fb03f7164d64375023edcbf042cd449db25643ff26f31c603a0abbdce4719d3dbb16558a46df042e2c95fda9ed71cd26296339820d1068160dbe80a4d10fd2104931efd8d15fc46bc78381469fa726221aeb8a1de4437607f3fee0f9002ee6883183a4572e133605add887ecc78d72a9a9ed3ccce6660fdee19c3d3d84fd87ef88b1969ee0103e59f4f12333f982dad7d304bf2b3a431f317330cbd50253725594718c54bdc5dd4aa1d9b05abdae970235b770543101b1e7b3eee62dd808844a2354a43cbe1e6b738961124c66e5cc906b93d8bc81ad3abd3883964aa6aa10c87a0c76c0547c7d87d113e6164d691a530350ec241d7dcb84c73390ca1f48326359bc5652c3d0d442bf7e13cd57f6baeb0e36846c6f5c759b59f5154b0628b802e6df193cf3838afbc978ac459d69cfb0d92fb175219f0a49ff03996d6dd2631ca52d562509165eb2a81eb23156aa9b120e4c01375483fc76c3392e2d6008084423e262df9808bb2d023d77babcbcda680d0c48f9a7cc410b02e8cf0d63e039044b50b55e4374bef31b2ce765da7a9993336d05c5b438bde5eb8baaed96d6dc0d2dd1512860a84959625f64b0de679a29af7927264bbd92af110804c1271ac94382bc4867f3caaaeb7ef0fab223b80cc0d2650e5e8fdd77dc654195a6c481d167393d9403272b9568a0d4e64a39ac747ec481d60ee362c7412001cfa5017117889c70733a8c887879dd20ef97f19789800b045a05ab00ca815bd3d947f8bec599d32b793ea1f219c0306af8d12e933180f50ae48578492ff0ec4c81a35885d45f947048b9c464c5b94fdf884b84f303303169d3dff9632fa7a0e97cd007488de834de7d3730d1eba0ca002f9fc5c3a68b7f62bbcb8cc550d4f25f0e8cd483d716dd6804f519c4c7527ce21d245b70d0637d1a169a724eba7b3d5ee25f205169d4bf18d26cca7c586e78c25d703128a476acb3b4974195b9486be18c8043604248840e7de08d6c4063abb77d9d49cea79c932bc732aba40d001b966de5812399de85392b860a6fe0e47c9dcae60eff2c1101f5137d419f6c8de0ff62dec4bb594b8274e0fa76e1101b4a0ec094dd7e11130b020cf38c08313a6ba92d4403826627df3f62ff84391f243ab8651018cc1b467a88725f5dd80c66ca133b54c9a8746a0be2a1341bbad4f9c34e89b8b6fa87cb904720a5660ce39b66570b33c2a18deea6a49409dae63038a3855df1b093572582e1364e5ca8378a35c969252bd172ecfa1b4af181cc2033f2113db7ec3923396035530886c69cf4817389894daefba59c6385d1d04bf0ceeb1b55f345b46b9cca2082cbb048a3fd273603132a0ecfe26f01f10ed90e3a3153d283c4fd5e7e8861385575098b5497a6bc44fc1ecbd75e935b1f8cd85dd0c99d5b0088cb9a71b86995d6740e154ef2454712347cfe170efd0463171e7ea2fe6b94cce95c3ef7a6f1afc1de4445e639ba485ca3e894f2be5ef5a57c07555e3c723d20190ef87ad66ab41c896990f071ab62a62299e981922d038b0d3df2ccaf602921c739e451150098b3fda7617e8cb6bc2062dc4a074644e2f81c411b222003b301c7f80220c558d702e913e707075bf68996bd31e36290e751e97adbe557b3ef5087e1f8021ae2ea665207b80f1ae975cd1803e9b66f430015bca278be568fc6f2f7b2198b9d61d60decd708beb3129d601918be13323f4d7c7b56ed75818a85670a0daa9114dd64075240b19a87363f70b7401cd9f058a607d3b054a8b716a028dee601c8116f3b3f1781d50e7b5d57747bd642da40ae9d47851f0e78971d8fc8852f0843a8b8ed25d84e3dbd0908acd55bd67bea60c2cc1dde6b9c79703ac5f90ca71010d64615871482e8973cb3dcfd35fce3a060d419d3af084cb81e58da725140dc4d347b82ed0bfc818f22e3e94c70b2f82f76ae715b250e9250e15470a057e90c231a9f2ab226bf7a9f58caa63571edd03427a35b23c265fe587a624885775f99efed961a436eda71423bbef811f45573eff276c8f44182a09b73f697016a867d0c84b34becfce2cc01659332640df82cae00f977c6aec2534045fc4bf03fb3462d7869b411c3267995a22887c0213f8fd748bf5511bba63e91da02c1462d7af656bfb624ccd515c1a94691f4f09fe0511c813b660c71b909b2c2f344ae10519d97898ef213578af870f8539f69e62b49e1d972288eb4355c93bdd0066e1cff171040b5bead94448d89ac8097cc53dd3f10a38d9af1366faa27324c7da68ab22b893c233d67862a4fd5f3e7a459bc98634e2b565451aee32ef47caac9de605c5a22341ed24cd21ad37c2d88e2d1b6b92cf102536c3b3279f597450ca8a583bb5c71419582f6f7bf186e84f57c59da9b34da8ea1b1eea511ec70ed3f5c52e8cf92bb6154456bba23dd297b40ddc34429b2d4dcd0a3b21c54d9ecc667aa8bba02246375e869b3546e12a417d0a42a290e7120efb1ac55c5bd9d96461cc3252cb25721de96f41a393d410ae753559e75fa9f8f10a2a436a4c8f5a7f7a4f56e1a820283bc44ff4848a1c89f38385d6225058c058578ab3d58970a5e4c417aa38587a13a233c65ca29fd35ee64174a43d80c17149abe36a0cab234dd505b03c38755cb3ed7065a15c8ddf9bb2103e1ae074f9e9faa3897d7070662bfc5a5ee1fd94a4bed34ffafb0fb5fa4061c42a298f7d01746710a32d422c824d1498fe491a34aba29c31e1c0e239b1ab3ea2d43316f248701fbf54d6e551e92b7ea038e4f5fb88f908423cf2ce38feccc6071e7ebaf4930a1b1004cc8f7b100a43b4aa62898a1a270a8b83d51e32d7e99629f564308267d92f537aee97f856383e60f620f7f8eddf5bb9e50e5c24ba054072db9f23b7f859ad46f3fcf6368c49d7b52ea32f4898b492d871d3f2335d0209b5c587ed2798520511c83b57ca9218502e1074a3daa02d24fa0a65dbc5a2c58b0e32e3fe42d9860850978f0e90f0c134e62311f8ad6f3e367c4e6cf80461c3b3f26b78d4cadfabcbf97b42740dbf863626d3654fd05a72f1beb7e43218975cd9b3be93cdfda134b3e4b238bfb01069cb999bb705d1dedbdaf24be58c4ee4680b663ddb9ac008343a99ffdb7440cc72f31f3e640aabb638ad9f622b6fc5be4ec965472f2d4b91d0cbf8a3ff0a941a84313c044794159bfe96373346fd27bd50b10f58fddf63f7e50f85071852876b9eddb4c340ee601b76b8f213da2c70bbc3c55134b5688c655c94f26a8ee644c506b2c365c90629da43412d72872bd78d0cf0c778e00b9ff96613399065392186e10c504e443f0c34a356102562caad0fe83eec69f495d8d2cfbe38250c4e35fdcdbe7a8f5ce1e33c6b2ccca3a3a51d8a4a74ceb9480cb06a7aeae179917997093b8320e97aa47a587cadeed72733796ffb34a03f2ba7e4351fc6fbfffe0f73b8664c57d143ef8d2665ed7897eb7546d83e14d00f37eb265e611d913ac0dd75afaf3331c45fa6794ea62d104b87faf8539056e112e55f85248a45b5d16c7c442143971862354813049345208857d5fbacb0229c3a37ee335734a14c5648d88bb06550f4c361697264551d38543a62eba0e0baad44b9de442446b06054ffaedb8d847e440fa7884d96b06848fd6e708720baf68f8025704412120655bc7b7d9ba073a5106d08a94a70d4ffc1a2517aad8b06f2804a9f363f841b2ee4414e8900377a708f6cfe9872df66b2b095d83ddef1e81cd2ae29089e7753b2f4e58439d9a40f3d82407fbd481901343042710aba41158b38738c95998f1c8ef110675b38dc39f754bfd321ee17f864d06cf29eef05cd72772dc437e9f54611557122505bb33b248a6e8587efc76a4232d4f6c0914933b317ee2a6781cb84711b949c577db3fba8b5bd4951386994d5122be7558bd84aaf8ee58be8e34702ef86ad914b3e802956557af98ee962cbd4f2a1ca494abdacd51055197d47275efd72ecd35257a33ea9d20d10f30e8b45eaabc791553fef975c02c7dee0d553cbb76093f8461786f20ba08037d402335ea16bde6f3f6aff9fdfc010e6bbe626a6d4ae9da452059e0404250d4f107846b43acc40cb025745b02cf053d222214f17be49fc94b42c70d5d9e4eb23222587d21f60ff93c8a6e4c4676245a84028aec444aa628911b5442bb7dce2fa3f610d67a25fffd50d9cce21e89f026e0d7e0dac0c200dd2f953a7453fa3294e81ac4953f38ba093b09efae6b41a7c53b460d5fbfce04f91cfc8dd8d70cfc7727703b8e7a3001d6cd031051d493c3aac8e241e0086076cf10034c4265408baae6acbea5706d1425842e5b64a8485eeeb3354851be37c12fe787e2aa84461b3661c869f5a56fff947681f608403c870800f1c90e300200e4880c7014430f1458e93fc38b89ee5a76e7d69d5b599667983da37add45095c33c6d53557d294e39c0f3aa1b9b3034f2273bc344063c4c4451d1c0c0c89c76a5fa51b443b4ce2d37231632eaf28400f7e4e8c3f84472e858a20d189b50a737ed13de7609271ae0860670e1ee42dcd30021f50e9e4a044fcd40ad3c4aa0a1040794b851428887613553323f8a6ca97fed0914866fdae5692b88a656fa948eb9bc8109eb4afdbcf281314dbbf2daaa7c5f582d9a12f5a756ba245baa935a7e6af8edd36ebdf1993aad161960030f03b2f03040f32ce00ccf023ce059c0910504208932aa504c35785fdbd0a2b06b478d29953abcc06b629306b53d09e55b539c1aedd678d73da63875e2508a53956ca9a7ad3eff489df8a6afd17aff6792e0e22509f46f9288a974b82789ea2c2df545015370d7a9bfa9a7f2714a737f10ad802d017a48401512c0027707e947536799801bee5edd83841a4888e141220348581e2492f01ca186e7882f8ea0e288ceddbf2bb2d45018565048c2dc165028b2d4505556d3587ef42dc1d4df7c9f0ef5d678ace1c9b5f2e27e5275a23fa9bf99f11c81802e585a1010fac9a7a2692521a0f320e006ea0064b89b76d407c8c2dd1de59ea73de5470f50754993f3f7f418400b8f015c0a808702c0c0538009b8fb7f264f143e49685afff38f23dc43802b780860020f0124e02140e7eeafd37a9637ac5f75a626312604f078eae0f1d0c03381cb3d9e201e0f8e30dc33e80bc9b0864e429f3fe0c65846e7543c95a9d39a6ff20c200dcf00703080110ce03480031841058f112ff01801c44f3e9fbef665fe84b9ff280e7d3554853ee7d3568c3d456ce129c20245a49e22a2f01491798ad8e129e24613ee1140183c025882004c8f00ae47000538d115e5da97a957a83af1902b3dfd08abdee5c947553e129cc9d0894f5b2ab146f29f7fb8fb897b88f08287082edcab93fb38a5e9212274ac2bd64424e15e99b66788348670817b7582539a9ff2330904c1ad5f1c8d8408430bb1c373030deefe847b6ebcc0738388e7060ef76a639c6b4a344f98eab515abb6f5566d59d655ca38744dfb949a789b4aa52965cd6db535d55a49312c2f249927ea9bb627006704c0059e00d80028e1ee6fda35ffc63832a39752486a97e5b6e068330992e4e3b1f4e77f2efdc5a7bb8fdc0380230fcad8c8915a790000f204b1062fdc6d8e80206c4255d02e517f0611e35e4120d37eee09e28657638ae4b18106c9632389fb8cc74668ee13e30d324d1b38aa7affb345c23d40a8e1a4f9bade6bab07082ebcf466895366f4b735eda8dfae788040dd4f0f100c70d73ade14cb7d9624ee4a47df4733a24921614cda02314dbbe2294980bb0f714fa7099e0e17d525cb9a122b364d8f87e1483cfe0733fe10867bb5ff0f04f04314fc90c4abfbe7903ebca10f3ee883a90f38f8600677afbea64ec2f0a37379723f757f29dbed52f121007ba8c21ebad803cd1e58f4e0063da4400f55e8e193072de4a1087940920790fb554b67e9523f1816189a8a2c41e5ebd4a2529caa9f75a43835a45627e19fac0695396f928fa3f1e390d8b4ebeb1265d29fc96aeb89b2e80c1ea2c043860705dc810b7700c11d9eb843107650821d72ecd0803ac4d450f5916ae823b1d656a56abb4fa50ed1d2a44f1cd275d0e870061d5240074c87910e38aa1743f7b47bb4393f43e2135bd37ed69fd45985a12ec3395c63900308e4308a831f7210879a38546b98b18614d648ad21c4ddad290c7fe47c5843da9aea9b684c610d59614d99a2152d6ad352299eac2e6f88770ef1ae202b53bd2996677996f74cc91d3bf49376eca8df132f2d2f32a42255ea4459546b1ac021091c5ce060c41ba2f08624bce1ac4e623ef97585f323b1a646c3fca91cfc695dea1c6c324d3b9af63326cf9637b87b457243195e4119e7fc468e543778e161e8861c4c92dc10e3eea8cd112347ea4972030e23476a75c2b401086dc871f72aac19af8476f4d106264e16471b9c0d5e54af2f1b6a2ace8f24c4064f35864e7c566d4db71ccb7426f54152c627324a7d90d4075983b88622d4b00635cca0aeacdc8c6fda2956c3136a4051230e6a68c15d9455270ea2537f13a4458d540d21eed54d16c55d9e5e8d1bee55fd1beb9286541a1e908624d2200034b0010d6270f708380e3480000d24347cbcfabc53f971aa2ecb6ae5e4714a7d561d7e1f2e4154879f1a9ecc7c60c2fa85e069c730279cf98bc79599da445db97844fd19ac70862fce90e40c2138438cfb5543333e9e20c58031241f402adef5da2cadba2a5487787aad49e217a966e882198c6006339cccc080329451860fb85fb58998baa36a59a7ff86c2308c89f96d733a8ef9ef998aa94e2bde1b63991d3b76eca84cb30c5206ab0c0548c30e38d2c0421a5fb87b5977d48edb2aeb5375280c2b89c3961055c393969f49c34492c8f00632a441862890c1046498820c22197838e8cb4cb3523ffdbbcc456aa8d6aac252435a084ba8dd8555a2fad5d0c9f58109ab7e3da47e61099be05543d5c9a7fecef8aaa1f0e4fac0843554a1fe9c19d18c258af76b6b4275fe53aa4f3ceaacedb6f7fb68be8f068d24ee6ee448ad6e30de10701c68d478aaaf8979a47689d23647f2e39bd2a071d537ed991cac824da81f738a67be6f3496db6e34bdc158c8f7d1a4a0fe1cc301c4f00731c0410c2cf0cab22c9075d52642d3b463588bd45075f2a9bfcb8c12c311616883bb07711c6180411868bcca1faa52648937bee9cc9b40a669c770632c13daaaff8c3b9c918633ac7006196720e10c0f9cb181332c7794949a43852554e96b3fdfafa1eae4fac0d4d028a5e6a84090a64afd0dea4f42d49fe1a73ebea9d6fb7cd34ecd2081c192c060e97234fa3e9a94941cacf27d345fb0c0179af04217bc70857bb53f55cfb7a6f3b4268a56272e8515ef13df8c4733068717b838b8bb0fc761860e4a336ccc4880bb931c4717bcd0051478a5cbd234a6fa241cf2613dcb4fdd65d529f3c47b143fdb4a92fa2c6dc9d69afa1b6cdaafcb13ca99ffe6bfa3fcf937c619d4a39da2a312366fcedf93db30202398ef3b8d35b7850b375c38c016c4f06aa7b8de9c7105d9d2595abb052c706c41660b36ea586e7bc23bb5e79b68b4f0042d90b470c46ac1882c7c9185eb5578225341b7e5136a1c6be2119aa65d09532cd4c1731c5808030b26160ae036472a08b4cd54a7cc9d4b5597d74cf115ae708509b8699719c7151e700522ca184219a1bbcd11d089d114ef6cb11265b815aa608524364740468e54a8cd7ac60a272b30b1cdf47c7d927054010e55b0421572dc34ed884f30756d151050051c5400830a252a20600a634c01b539526f59412913c7a556299de2fca5d3de13bc6bc665463fd52965eaf2b7cdf8d62980a65022051db8db1c31eda8ada9e2e09314342085236e5152c811053b442189db1ca92c2d202347aaeab25293e28a37aef7abb628521472dcab2824611a4f1bfabc020534dcbdc67140210b7771b4e8cd68cd6a356a4df9636a85afb62828c47875cf14936fa2818208071968b83bce95c4f8ac1bf4a668cfb46a8bba9fc9f82293a185bbc7380e329ca84e2e5a56a5ea3f4f5843a7e813c4f02aff364bf2c44fb802639a2774ee3b3fce59862110c7e10435aafbfb339a7f9fa52986344ef8815757c76874f249398d3523d3b42bdf372ae9d44cd5b6d2a4a49cc61a3d1a09b94f242507abb87b8be3684235461ac67882bbdf388e318e8c718457a115d5a65a5155555490155555452a55a946eaa7415584f5c43ba5c247fdc2175d6a6a747716c7c1041930e1c404093041005ee9b086aaabcb7ca6a7131ef1cef1b184122c815c020e77aff07659a9398d39610d5527270a9f37678abee8b252f3b175ff8c1254f0e2389420a4d2f7b4fb4693c49083bbc3380e3164204607c44022c6a7fa5ceabf2897951ab1cc63cacc16ef1ad650b53196d12e2b353575da6c4b9fab4eab4c127a908423497841821b90a00577171d0712321292384211701c011f0147187dc0110617ee95fe272bdea7df2508fe93610d55ff64b5e819aa422c237125d52f4c655b8e25f9e78b610d559fab06b46b787252559f0afa6035617db19a6659a4562cf50bb7fe1bd650e934c577a95f18d65015ea509768fdff51b9acd4547bb345654c96b7547e7e1cacf57ead7184418411bc30c20a8ce0038c358081060e304080038c28dcab1d7fc27a078f13972933b563e37347355332d59554fdb5a71397e7f8a67dbf0c43fc52a119d7941996f42944d5d279cff224552090695d566aea69ebe8a44b2ba84b53e08b297b323116415de6df76a7f84fe576773fe1fc43c67c9ad79ae4251dd85feaf0120e983440007eab9a12eba8ad2ef3ef148ff29f6759ada948fd4e5c3e4a9fb6e27ddaaa4beb52ab9bc52f54abd2692faef8dc3e2a28c647159ec45450cb27acdad65a431db684614c18aa9fae27e2a756fa2ceb89fdd4eaab965afd2d757d54e7fcf7bce7a39c2d162dc772db6d6fcc4797dfa7495d6eab6d1813d650ad72aab14996199324d0a779876178525341e0274485356178025650cd270c7558bfb325256aabc712a7deb3866ab5cb73b45b9f8fe2d25906953d31a909478cb186bb57637c31468eddd64433c6c76b2915ffa2a793096a30e10baf98c004b4620210f76a096d488935e39ad24ba882670926f7eac37009dd49e8c4e7a72e215b25a0a1042daacf78ac66b5550935ee4ab0dc89e01831ccd8252a460dbc02a273e92c6f462b9ab435ed5265631c30e395cf783c4b0b9ab405222409484802063cb439928495249420210948b8c22b153c45aa9160193952ab23cce1086284a023618549d311b2f023004989f5084784b186576174e1f5c4619870189de3306eb8bb11ca70374212af8c3053e51457d49fa83fc130c3dd53d63cc1d0020c163014500431142149954b27c6baa67414a9d29822c06c0b6e0b8e462f2929e313b97fa6f98b2f7ca14595dad9a2295b3ee90b9a5b82a09448043e10010d0f6daa246e24ac8fc2102174c7315f9f88605556d525116ef810c8a886c0850f01f5216cbc3d4230c32b2178e1952e8570855742b08260c61804340861102c209801841cafceb3a6442034c0b422364be7a3b7e596e00f3cf083ff018e7adf94df9667ea032cf880043e80c2073664728a53fa9471acc90b1878bcc871f762d40335787a20831e08f1ea7e4bd5186ffbe339f2400e3c7081870752f0e0c60e7eb0031bec80c6ddab53d6e34f21a6baea37d1541faae1ef161df041076260f47560ea60870edcabf2fee954bec6baaca02a0765e400a54b1c98210c3820010e8ce080060745dc200b3790c10d72bc3a61ea17deb086be4aa7f97160c21aaad221d5dfd85d53f6a42bfef0065dbdc102ba20a32271b53affb5bfbb808157765b16ddc5a79e3e6ca006ea4f8f0dba2002135373ecc90626af36b0dc3d3528c3bd3a7199bf862e3f648884b8065ca4b8fea9ac418d579a0678a0419212cdf97ad200488ad619e061065ccca0f31954199021033475dace4f16d532f81c0331dcab1868516b8d41e8952706384e3b7ee15eed14dd6505c1200baff49b461858ee1589751233dc9324f12461adb526096d2eaa784119ee95469d2f48f282cedd0566b80b522ea8eede82325a90c4b620c659b0c6696b09b3808bd19e766481c9ddab5a59f0f115a4e1eefa9194fa91941accb1a7ea1a61590ae20da2290a888082110506f0eabea84dd39af6686bca14cb3163b22c9d5f53ad5b4afab42db8cfd7a3ef1b1fe7fbee09b8c8f80426ff71828f09d0d8e57d8b4d1394c0044036f966f5555941d7044790b630630b2edc1d54495bc4b87bb52b89b7c0e11eda9c296924acd53d2d36ab69924ae085fb970088bb5738a656d792600dcfeaf92fd290a00b77af2c096232ae3a48b03f556eadcb1108190117ee150a9be4084277ff2143e465049d57f8f4a711f8f9fa7c2dcad0a20b7c6a91851635ee67a945a7858be00bf730ac201a116421022022b8e15e85000cf72accfe4f7cfad328044eb87b653d201803041300018b7ba573a84dd3a62c88a5ba7f716a9a96f48131783e3003f76ae6c4a569713d3f30e4035d75c3f06f708c07da5095d7870792e8001a9e0e78a10314e840d6011b1cb8030766c0012b38000177bf714f165a984116dbbd3a4395de654b156a1df74cc98c2b8ff09e1ff2f84c82f54dbb9238c463eb34f495ac49ee38cb1de48f13a8acfec419a36c1638361086c5dbb4ba6ec0021bd8a18132dcb705a53855f1c666a9b4e8c966fc65dea39cbf44ed785f97368f52d00ce021b4a99569926a067090811aafd52dc50cd8702361ad1e034cc000053000720f6d40164df3b5291578d71a7381395c800aee6ee39e0ba08ecd722c51db9cb94085051fdc3db4a9a00a02dd32ac5096848514b040dd431bd04858a1b6086a4f58c4b8dff76081c375792da0865b408c6a6b8b5aa00baf5e2c9085bb058878cedf2b6cae20a20246a840aa023a2a500405c0a0800b28d0e2b1420f56ccc063850aac00e215aade527cd30e6bc856d04e4dac45fba6bd752ec3294e8c77584327e43dede7d1131e412c2d2131d562aac31aaaee677d4b955a9d3c4ecea7a7fad9a2d6bca5b5b7146ff9a7dd667a2a3536d1bf9f52b4c28809ac115a99409ec049155ba8428cea7e4e311986617d11ada7cd556c51d91809ab5802891d90d000494d6803aaa0fcfa96a091b0d23a6cb6288a6daad21685e4e38e537ea8463429244c4e5daf744ab664fbe64a6a087797c23d395e6cb33c1f45b145ed148361dde39f271eabcd59c9f9a0be80e200ca09f7ea4f9c3a3fbfe9649e76d4a45a992969abce34a84f85a3068e18385c54687ada37716870bc140d2f75b0a462a42c70af7429936cb631a3d358f37d382507aba4476c33b8ef17b87b14eed93f7675afc2aaf4483ea31b9f2e2b357a0d9d44dbe81b990cf72a0cdfb4d9daadbfa64c332533175edd969d335af30df74aa7272ecbd39ea850c3dd668b5241469545a62274a7a25e2adcab4752a266b87b8572816e77af363edf4463b3454734292a44c054e0152c0077af74b62c2d554c41f7ffc656a708ceefc486d316a7918906b306265a814eb28ed49b36905a2db14435ed894ff977a87462b39e76ac58a3a83d65106a4f55a316a55fdca0472d0ab5a83a7393879b2f2ad27cbdcb1c6e8c65b209ba416f724c81867bc6d5b495c4750a6f0a203ca50bca21a501dc3d887b4c5130a9c074c4bd0a6bca4c9da41ad6508552c31aaa6e19d690a73482521625274a9604dc43628174828724dd1d740f19800fc28ba07a9db2b490f8df445373e4a8c24a62fdff0345e7c851b1a0fc098faf522b52cd91a32a89a021b53a71498352b5d4214039a682bed14b050149b92de07edd828e46322c405252c6277292610192ffdacf9804f5b6e0fd6bb765b9f6818cfee215d49f7a34ba2d2929e313014dbb4f8ca4ccd8b431ce1607a3266d4db7051c0149b9232029a32ead204bd442beeffb52c627b24b15fde3084ced32bfad71771d30f6c636856278c8c509efd39a62c29a7bc323dc2bfcaf2b0f8ca201f1e001cf78b9d76ab003a0792f09d401da70f7fd2136a124308604864800091b33e09dfa1b1b940d8c4d75aff66977ce87f7c6a0163513de6bc3b0ee740c47bcb0474a475c8ce0a10abf8fc625ac5aa3a5a974962b46b6703fb1111a23265250418a0f688bcfffd46757fb660549619242f34821441441709b23f8ac20fd2954efb224459145144eb8bb912355c6393f8f9a38d4a451a385bbcd91ea240c4f52e2a7de3ff9e0534d8c7bcd8dca53440c0f3589ed582449912c8a840db8453abf8fc26691239c081edc4b652502867b45331a8d5a52d021590cc119620ed968de40330500b887c60934a89330a01d7a87ceb1a798980f4cb5a3aa480cda6505813c33e1ccc90c0364c890c980cc11991d324578222086290260040210e3454c8d276600478009014cca4b1a3c2f5be82c74125e31e1a786a5d32c4da85055c96a28aca0f0c4a57ee107aba1ea4bf6547e466b4e43adf6e8514f3edf476230bcf6f3f785b6c459096b13d5059ba8324cad40a635b7b6a33ef189454bb654d8acda9a6e05ddb7d525756142881a8488414807845c21a0207440230817415882a0045100144d80020450a478a048e24f5c517f5e135f1be3903a3c89a9f577993f3061058531a83f6bf81286ae896be812bed4266a4ca973ac4b58f3906bea3f95651dcbb3be4aad4eb434e968c16909d222840df7b40401c4071e2020901420eef24fdafaa56c4de34cad52a74555a6d53865cf94ade71349fc70c30f307e58e047901f0bf001061f3ef091fa00e2ee41b8c7c78a0f1b2c4f6039010bc8a263850f2b695841c10a8e67a57317222a24cc7582c5e81e323057c607109a161fdf5fa9bf01bf8f840975198658ed31c2ae182dba8435549f0c7daa0a7672d526aa4ae92c37c641d38c4f42aca6d44fd5615895b7de17ef25754125062a275021a9741e15234858b854586a13f5243c71f954586a28aca5b38c09ef87423a74a94d54971c39aa2aacd6def375ca9ea394cd2f9ede8584ba571e12102f3da4233c4eace184199576e20b77f7387185bb573acc91667c22a83f9d50b1312397efa341e113025440c0424088d11146598c72469f1e73e8e1024f0f0eb857553e09eb597e5f5849fca92f86fb6760c24ae24f0dc3fa62e812a6c4fa227ab2fb41afad091defdf609cb31c8d6852de44539a94f189f438c2e6c82dc330c50c7ca65cf1468e9c18444a09dd3da5c74bcaccf78d461425b57c1f4d0a0f0cf03879d4af0e5f16be167c3e3e1dd60a0a35280c75c6a10f141f41c22f3c09f28109c19caf7c549f2035888fda440df281094d3b25a5f69ba0fe9cbfa3212a6854415d3aaa20951bfb454e662a88c8e7b66493b6a6f3cddf368f1b6319978d71eebae0e9b2d01a9b3bc5a09d8a9d06822a92280e2223884cee364734f8a223dce60867c67f26495c17bb824e3893468e54aee65ad40ce7787faa6733634bb2855ec2a9a4adba9bb66a6ba0685d6839aea23de1eeff9904517f7e1f0d88fad3938d414556ca0ae0d536f768737c782e3878ae225ce505e4f280618d96e54141034a093c281640d1283a504a2a1c78aaafbc501d423c089d3ca1ceab930a4bc5672ae3d39fea59c2d4d009e8537199edf9a3de3a635405695c95896aaddad69445e99b8c51150cef999a76eb94e5fb68c21044fd099ef8fb4e985af5aea15a2b5b53113ced08863554eb2753d59cb3ded39e2d3554fdcfd44ad7fc282e7799c793a586aa8cc310a423fcff11ee16500c4034a025a6d044aa891c3bf6b0430a9e1d46d831c50e029c18e1e44f9870afb5da3a975a47de3a85a29e7c9af7c7d68a77cd39796d5af253ed5841da9aaa695ab09ef64d8c4355558dfb6b14e860719d659099fc3acd8fa633a7b14663442c221791374d2bdebd6402d72c8b5441c29826e99a6511f71224ee25a93325dd4b726ee95e8212cbd299fe38f1cb752fc1f9fd793cf1ca1e49e710f7922672fea6daf64e73178a65299bb3884d95ab06abc96ab49aad86ab11d574356230b1303a57a055f2d816f528c68f626ceafa12fa53c6a425cdd7a17be709279fb305c3b97f1a6bf6f824e9e31c1243c29cb8f491f73904c634d31f6f55f4fdc734e335cb22a63175c1b874962f6f8a2b1bbfa8bc29da8d5fae8981f8b832e9f832ee25e3ce18c5f91c72519b693a5d10e5122a72f67103e383c6bd8345098a6557e372feba97e01bf792d3c252ff638b7bc914a90ff2c4354bd34aca3c61dc4b4ed94cedd2b43935636e6276b631a98b557e2c71feb149277cfe3de1d39a683e6397db92ba586597e710f70e163e4c3b96a7697c1a5d965e8869cbb1bc291453dc96d449722f9922c69eac4e8340f1f94bf71222baa332f302d342b3f232040ab086e482cf9a71d93191e204e536d313ca8583a24b4cee7ea3a4e47a94323e11ecc2b12e9cefb3704627202c4b3f1574f249f93e1beeeab451caf844b4b6e6d86157daa53616a671a90d9661591a86494d1e4cfb011ad040083c04be01df000e54e03750b8073129b22fbe22e0ee2070070110d8a8a27604517f0601eec18488e9ce5557687c1cd3b427ed62529344187a8cc1b93871f713b8c360ee3ec4099321392fbe450946e03e8272e47e53847bd8c38466f43745b13c7960d501f57cd3aa3d1a50cf37517805d5e313d1254ad2256a4ba7899e4a7b7a8b3b01fec56799f738ea52f0cbbc35b7611845f337d654b1f96df6b16ddbb66d9ba6699aa6699aa66559966559966519866118866118865dd7755dd7755d97855998855998855998855998855998e7799ee7799ee7755dd7755dd7759d4824128944229148c4711cc7711cc771dbb66ddbb66ddba6699aa6699aa669599665599665598661188661188661d7755dd7755d9665599665599675799ee7799ee7795ed7755dd7755dd78944229148241289441cc7711cc7711cb76ddbb66ddbb66d9aa6699aa6699a966559966559966518866118866118765dd7755dd7755997d789b84dcbb0cbe5d4e251b87be92640e8901f652cc7ac87e0fc52a454f0cb972cd74c711114365fe5c739c4bd642c21dd4b76c8acc4e017f7923fff06d3b8975c527eabefe863c6c7cab52aa5b3cc2b3abf9c24528953b2fcf8f28ad6f467793e129cddddcdf30485cf96b29a762ec56a4de336536d5fb426a9d2cfa364fc139e114d5652c251fd5450773751a971771d262435e85c895236672b926af5b5f304ef78174ea0e13a572911d4daa2fbb467792af3a8cb5b4fe9f9559fb445550cc4dd89b815dcfde4264e2461a2a772b464a8840aee6edd04025ad42f72f1b863eb32c7bd049440e92cef6ffb23c6bbb60dbb56dff1f14653791c9560fe476db48db3c9b2caa34b8d68f371de342d0ee882bfeff3673df34386c8595a3366e69ea454b6a732c7dcf7a14252d9399fc29c2d3f6488bc6855f489c6a515a471e967d420aa73fe0545edf7a1bac3ae21f773ca1f65b8bbe9263cd4e0ae7305ea4e9ea2ec54e13648c10682987c2cd0b9da6799964ad1c64b8eecf4745fac226f0d9dabbb997815f013ccbf4bf0843389323e8e699662fe180f0028269d16be0f44b5ce9506f3a31d31a0b8c3aeb424b1480738e5ad242e4f9f75ae762976d805eafca8f9a6b1dc7f32ed32db0e14dc12b51020b2d0000f0226881513ee0e67febd2d8a92b776ef609132e1ae287105709d2bd3b6284a6a5f214c9e65e84d3beaad53996adadfe75e62e4861466944451639a76dc1a9fc06dc1228fa63698f12e21e2dec122c79e1ea72cb9970c29a171efa841cbecbf19cbed5e3293634fee9d2edcb244260268e87486c88ca3d2a5ee3e240725ed9fc93f33f32cd9beb9b2723e0a83fa17f49481dcbf0f24c7078b85639a7605c84bae34687215c0c4ca43fdee59dee051e70ac5c4ba9613f5513cea0aded847d5bbcb98929818f71218ed5ef252e29222ff43262133b87bcd98c467cd000bd2f032bac0831bd1bd03423099c9e15e22a4240814fc46c808123401cdc01d749636a1495b20a1119bd04805d984a1116dda657596baac55ce5bab736975d5279ff3f759da5349aad56873b5254e4d899f3f0565adcb6b43b8546d0db705c3da6364595a6cb6e8cd3a3f5ab3dd38a6ad20d4bd18458b94da3eaaee543ca54eab754cad763ade1264d2d6260c8de07c99f74ae8da37b1b4d4d334ad59d52a9bbc640cef5371d526ea1461e5119635a54e117a8914333131426a4a2d43986d477d5f63f3be891254104208218638d1fb7c1c23f54d34420821c410ee8edd4489181742082186a884104288214e5e5b11e57c143de28b82f3b742f934bab7e963a38dd413de3a5d11420821863061c01e4e5be68dcd99fc317ae54ba795d9d89cd124ae397ad450084a0dc35ae18dc3ab86aa55753923862c1da8b5ae939098eacf12f7fcba04aac455a7a5729ff8c45597a096baf10b7ed929ccf58ee9ee47b8776e74ae5012902a91d6040931bc9ad1b9fa442b9a2071c3bd7ef72c83a454b4bef681d86d597c5cfca2cd4752ced8fd2e248cdefa098dda4c835ad40c7aca406834f932266d81a454fee29508e87dea934567b45e414f599f7825ff3d8768776fc24d0ca00213a3f6f47d2606f8e1a9bff91eb527948cb71d757972770448e126055871f7139e2995537cae3cac3aaa3cee9b748a12600c130260e16eff9a987c21bd286c92f52b4b58888cdd96059327085e3c82fb2d588aa0ce150a107737c1a10594cd58755d95153a513857131c1070074b6799bf93b6a8948e124d9430a17355a216a50d26031080c900aebbd751ad9f127ff8c31f888476a9e2871e29f596a712285a766cc06facc9dd74e17cdf85f37d256a43db4d8a80719dab0b07c5444f2558a2b6d24fdafaa5fb6fde33b4a45a7d7d1aadcb546bf24ffb4ba169e3fd3ad4a772a3f9c73eede96790786ecaf4b4d9c6acec13bf5871e7533e9d4c6e50e086155ebf8c737e1b23390644b50f9dabfce069cc31094045edb52010930088c6c7017729f64849abb64ed07a949212eb18953eb109b23925d58c7fd4ea2663544e7114b5d2296aeb8e1d16f52ab5d210d85fba24eec2c4c60df7baadce150a050504d1143c8d3920be69ce1e4f7c9e984593f04d676eea83dcf2a6269d26d8d4df80f8a61adf5457379df9f1c42f37e3e7d098a5fd314373fe8da579fd178f9fba76c83e7f86a4f73d5fa7ae7d99fce569cc01eff9fa0f31ee5ebffa6dfd57ebb0dbe607d50a85cf9b475524aea74755adb54e71992d4e55ea138fda65a586a55627a679e9f453efcea54589d42a9716ad27210eb76115fb1b6b8a416aa5519b772df3a7540cf99c9aa5fd71cf9fb9ffe34dd19e43f2e3bc8c55b9566506bfcc905ee39b6a71cc09a19cc61c3ca4dc610f77a08387214e0d43985a9decd8a16b15c1177048a28234c270c61ce47087905ba8ddfa546ec7311940173ab89183d51d15b5a81d8db0431229157fc1f1715074e7d4e1dee1031996bb37c14bd6f09236d4c1dc196b94cd4b3413192eb8a318bf5c38e0958103f1f96c1d0825c660037d96322bbfd3fd1a544b50adce4782b3feb3dca745921243d493f81442f7f8297aff4553677c62ad4f169da9426d6d5579a70df7a9a83c421e5fe271f38f96f4699f389360589d6cfd286ca6a61d9e65ae3eeb300ccf3fb1d9a21fb2a5866a659a5f7a24e54cdd3bd4e16df950b6d8c4638971f4c6d8fc9dfafda5b22dcd32477ff488a63bd46f1aed4aadf44cad607eb4fca86759abaa54f9a8d55896b05975ad70ca5c9ef0993231fa3f7ea754301aca8fde3c79962649c2fc09cf5c8c9f304dd2286f9d92dae5dd2589cb4caad58826e5b684a394fc61a8a392d88658c65aad7ffcb3d6f4e28ce6bfa5796f794a991545e24aaad50dae5ac7be6510cba05286af7e27f5fbd4fac9549bfa194109a576992d9a860ad208bdbc9971305cc6c58508ee3e857bc0c007af747e9c54e78a0c336478a94a6709baf566c4765b96f391e0cf3f58aa93b4f1cbc62faf879c2df8e5e29442b6dde3e380f73f107c81699991f14104f4f1044906866606043f9d2b8d82f27d2098a2a0a4df173a7109ae542a2c952461eadfd37e645c5c4e2ce3e2f2179f279f2ae3e222e3e222a4e6d3a92a2b129724fe4ce29bce64204358f4cacc8b56a582523236453bc4f7812078febda5092c510ba2fafb48f335be6936a1a7141ca5a4a4a4e49413e6d492225a959417ad886998a8daa640a1025008ff42810832dce05e61b5897b49a3db8293840c5dedd7f7be8c6e4bc6dbde161fa39632e3728b7fc7279271ce0f9e18dca635dd7f534c31cb6874f2198d5272b0caf7ddcfc1e2f75d184eca69acf93e0be7fc9149db8d3ea13a010d2774e1a14d0585b5223981c479eb386f799d80c3dd330659f1d30435ccd36774a5095d34a1c60353b0c8eeeac84ca489c6cebadefa92a540470a99286aff76c3ac8b145ddece3666029d28889f91e4258edad54452ebb09a941f1d2870a2f17af2224791a759e3b621e990b13df698e8b2ae6cb4bcb73ab2f304911bedf69bf59908134791e8048e242f9127765a365a0ef3de029d268c4f7624a68d22aedb3a8fb3c8ce182251f4bc51c45df25a6266654c1047517c92db30ee769e27d2723a4bd8ba4ecc46f1b237b3b4ccba663a4ae0460b2345f67a1e6975db5b31c8cee22ceeda4891cd32ee922950749220ba441c8991deb88dd83692dcd941c2e6bd4864dd2b1a3171d4b24b059d235c91468e9bb76d64d6d92be26e3a615c6bb34cbbd7653d6b3791d74141c708ddbfbdbc9b71a3a8b3b6cb56d101e3da44d8edba31b3b28dec8ae08dd8468a96f62fc2b8ed8a703a5f601a2766dda66dd6a57998683b5101913e443a44e03672d4ae96715bc659e3888df03e5bbe0fefb3ec60a033046ddbecff35628f695a678d634708db288aa21fade5dd9b4e10c6edc7ed62e393d9ddfe5e537480c0597fb1ab69a275695713655f3adf34ad6954e9fc40bba2cf329138769c7675de9b7a747c8091186659967dd1f3b4cb59a68fd4f142bc5ac691a2d74411b334aea3f9be93ebf4e07a1c478ee4f53fde6bc330d3f75d1d1e74f6d236cf76a2c58998e65d9d1d6056e43cafcb385177655ca699becfa45393e43a3af030edbb8bebc6ee7a1a29b226ad9383ce6677dbbcce1a3d4dd4699ee9fbee9ba22d6121df67b11014bf7c5f099b295d070757f45d366a6f8944d7fd2c53a16fc079192662d7ed445c26de6b347d1f7896a0999e9ce874315ed6fec8893c0fbb9e7b0b077c24e5f789a549ead860d3388b596fdb38511b33f14ddf6759dc457e5fedd4a013af6c138d9b7559a3c85a614515557cdfdfd4fc8cd220b36427e22ee961a3dd2c5167fabe94ce0cbc8e7c51b76956f41be69163d5b66a30a7d88e0c32eb65e368478c1469deb5ec1e2d7acae9c4409475e49665dacd3491ddba4b7760a08d63f658b6719ac87bef7a622789665da4f8dddbbbddbfb6f1059ed869de8bc89b6dbf69b77381d65d1e478a36b3326f14ef98eab460146998a7691a897557b430ced46181155d4efcd1c34871fb2b9a406705a477adb589b48edb2c269296e97654f0db1dc50be348cb5df7eabc0e063a291091b7ebc66bc74bcb464bde9c0e175cf72291b67564e78de2bd5ee392a683820ec32e9b799e1d31d26e5666f35279d01829d23901877556ebae78c5edb2f77aa58e09c4ee37cfeaecf6f6b3cd7a13882625ff6e39e1fc637c74e6fb52c6ce169bc5d991d448afd3441c672d179d126057375e1ed6751d895d64d675aee89080c33a4de4ae25b2dad53c516a833a23b0f712af87618f5da326d22cf259be2fb5573a5a58a2d1bbda655def715977695c4ad31181356e966814ada813919cc8c23079b658d109c1e891a41dafc8d33652cc44515b7385021d108c9888cb3ccd7b0fbb77b448d3f77d23d3b6315b8b9d0ffc5f16466e9d266e97bc96e50191249fecc4cc1a459e25ca30d3f7e9991452a7035de6599ab769d9cd44762437934ed998b4c381abe3464eb3b6df44f6bad8f57d29369d2cae88f36c265a97e86277fb0ddc6d1491248689df5d1b668d8fa668d28e06c6cdf2340cb3acdb79a348d48d68525cb40be7fb3a1ce864a0c34811d6659b25ea386beb6040c4dd8b2449d172228bbc9d7681cdca2ecfb21de989de762216da25be98bd68895b976d9c55752cd071967d8bbbc4dfb891b43a576496bca2bdeffd28facb55c08aa37d91f42c8db397286ee0f78dbe6ffcc0d42e6d688ca400a14027ea6cc6bd763391e8761c894f3b82279cc999efcb2d5678ff9ec7fdc675d6b5659f99be2f631c6b9260a934cdffbe7d963846e6fbf0de9fb72ef3043631b3ac355e4c74592c23c5ef3b52854876d7dbaca8896e7679d665fabe120477a6425300c9a8919b76adf1afb113eda699beef064361b448ca1a339123338eb4fe1a370b337d5f0e16c19bd19a2213392469b94da46d9ed7799c8579a6ef03f1fe3e295096475ab1d3eed6dd2eb3ac68fa3e2a1edce3f78daecdc735bffcf17ddf774f2a7cd8ef7b738ba9be79d3dec7c9e9d821010e8789e4d861d65ed9e5919d364a47b21b452229ca9ebb2e6bbb65b667a9f2c41eb5cdd32ed16a97d5349175692fc3deca3cf25e9bd579d9357d1fde67096a5c0abece16bd72a691af5d97b39be8b236db3aec82820a4f746517e65dd6a589982895f7f9dfb75f84629eb546d15edadf4cc3fef125ea36edeaace875a39889ee296ed89689361113c7f74422cb74b2c8eb12c72b6edaf87f893a536572a47531cd8e1db9715bc6dd9b4ccb2e3b6659673beb71226ee69b82cbae4adcaee569a2e73cbb759de53d9252bb9417c344a28bbcb2ee72f7fa6bf24c2f5ed626ba3cd16bda5bee4ddff77df7fcd39b509b4bdff744e992a31589e46f5d9669e2765330b2b3ecb691dc66afa691a2774739b725e5fb348aa1f891fc8cbca2385e6286dd6cbb22f2b21b773b4eb32c767123e9da9899f1b237e3bebb9ee66956c665e226f22e8bbcdee579224bb323107b695de679dc386aa475652f7e9f69fee823f4442c1b2d11e689dbd661e4f700b9bf7f2f6deb3cec8aae4b23a5b048a0eb324eb41b66c91fed652dcce68a1d67498e13799e386ae3117b9f1475d735fecdbceb5dd3f7812223ff23e6592ffb17afc85dd7f47d202934ccf35e245af28e646675db43208ad18e9e47769bf5b2f15e91347ddff926f87da49a4eb39ca66ddd485ed8bddc68fabe952277d3b0ed337124c9d1f336d1f47da6cda5bb7f6c44fe5e9798611ab769e278696ffabe9b3a49df973a6dca35e49e25ea4c410f8d68b3444b245ed94892d9c859d3f7695c0aee138932236662c66997266edb465acdc95c4b2345a2f73c4cecee783913febe1f4f98f3c7f77d9ff622f016bbdedac7ecc665628c27d244bb8d9a665dccf334d1f47dfac63e0aee2f7d1f04603af2fee546d18e9d75bdce9abeeffb747eef4534be48ec441c47921b772df1fbbe0f3c4b0b82e2cd9832c44564314d7cbb5d6fafc8d9316f9d7209c9464fa4795694892e12d3acad948acf42f380142b08475e6cdbee1539ceea6ed67d1f14de466adc93ddb679a3c75d64a945b48936fbe4b5a3b5f7ca2c20e3388a5b67b5cb7524c7a1fe8cf93ed3ded813193676a2d5b6311b33abd32c139ada688ae6fb40f0fbaaf8619156f6d6356622d2b33cce23490ceed244493eacc8b2a24cf3ae31bb16295e161167474c845918e689d965b3d1cab8791829769b486a9965c52ba4c259db96599a481b3bcde238cf34c2b2d49aa82e594cf454a67c1f7a2abfef949e2fa4df468b715bb7596f3972bb76fe152744a26c14c951b4986779dca89920403ee789c84bbcbcd1669bb799be2f5bd3c863644951dc9ef3ba0ddbc4ee62a6efcb5b83a322b548dde9e901295f0fcfda3ee334cdcaacb76de266fa3eb04ad93631dbacf16616a65d32078f6cb319b7691a7939addbba377ddff7ed13f97d0ef8445877b13113b5d7b62bb29ce9fbfe33e9c3c3aeab13596ebc17375e32139dbe4f835b631378e627ba4e24caac2b22ef86892c27224ddf87c2b95489445d76352c13619ef5c851bca6ef03ef69417cbfeffb462410cacabc70d8a58d58672f2e135dde968da6ef2b9de5cdc98665de78c5edea3acd1a33ed9abe0ffc3e4d3b617c231335cdf2eed54496cc46aff34cdff77d1976c2182c6510bc71813acd209800eb3ec86d18ca05eaa890082500b4a38904ec60c009129f4bebf83c005bc2010a6002e3bc440e3089254e1a70bd0697a84c28a13f0cf82ce09e16d492d039147062400232de16896b8923c89d22e002df042671008d5b800172306a33a00037761cff8600dc869974d80582a5b334696baa9eb354ea06e0b8c0cf008cc04e78043f5f37dc86a1e36b51110e10009883081d43e4d89312425c2036416c2271a30620070040417c6c5ce0ce7603b1bfa4a3e4cad72c4de3cef9930e06a6c8323f0e08823be773b8115f0cc1072c74fe644f1b43f0010c5a001d21b8e328008d9bd8e8e006110e05386841f2206c005112734a8313ee9d2bdc008aeaa714541316726e709c20e23482180500c02a7730840fb62040280ff503392062077db8c2dd4b6eb803c0dd8328f1121493131d4c4e68b8d7af7edfc6253e747e989c40d7b942f18e1a86083189b0ad06cd922b6ee4ec230c4f3ea8cda833fdbe356e82e09ec4b7f842e712c776a1840a6c43dbc8364c1ba50d930dd046046c6cee6e43015ed221dd30d1016de801f567104e58711e01817a8c7ad4939c5b7e36f9423e990cb3c917526bade7912a6ace2dc12fdd07c5c0831d04e102dc6344be19c4d923a53651cf3741f09a18881774c0864b10ee008882beb5478f31eb1f561dd970c20e37213fe05ebfcf8444fd2f3e2f5081ab867a545fba9f5f08ff798b51d0b4ac9062482b35a5e6dc152b984ce1df85fba699beb8975811ada8a844d3c7b64d0c95322400c07000d310000030241a0cc76332b174beb30f14800164ae5cac5ea08ae430c921858c21c68000000000000048128200e13f56f7645aceece8a6fb95ba6e46f18047d9f866c9063b63d4dc0a71cb00da24490fe9011bdd4c0f8f8e9a5db1142e8b486d92b05e302bd8ff738da601e98b283fa26504b5652acef2e07aa36709aeebc4fe75bac0fd9efbbe487bed6e3141cf2c770a3dcb3770ee7f563f267d13d54c84122bd2d468a46fae882d22527c31daf0308232a9348c6303aa28b90acf87c8736fe19dc7be6972bf5eab96f6062e443533ade8f3b0f4e3dbeae7b1c589616d2164d8deb873dde2e34187ceac356d88c8e5d9cc36977e08c13ef148fda25d14377e6c4c6e1fddfcacbdc88e14d1af7c2c803bbfd00f37d40beefc9622b3da6c25947ed1b87199e3f1c5683da1b9de8e05da20e8b9e6d86b07f7efbf8c29356db92bf9593525a885cb0fdc6ff5399114043b3ae56eb8fd442e8137d00a37a3745e5998afc82dbf8994b0c66da05ca68484d431162a412eced7709c7394d5c7d47dda9dd003715a3dc7472d713fbd6eff0d11f5e2d7a76d120649dc7ea693b88c2b2393eb32be3bd7a6350cba479a0689880f210e2b87ce9bf7b2a4df00320aec1f807fdc18562908f5c6f756a00d471fc17812188d9eb04685354f80991f4ec5606467efddb72934b7ef6b53f6ae6f3071a41c054c562c70a4ff6cd81fce9eb1faaf1a5451681f0b17370a55fcc250536db1a117f1fc87ce7b89852cd2734bb1784ffd48ea28742aaddb163d554484846f92bf7319c33b71e533dcb40c615f51b3db829296aed670121f27970e2a069cecca87782537ad41bdcda58fb3cb0ff742450d5a7c6931f3247c9c556d23c356746097654a6a96c1010bae8c27a2d324669926c2c3443a4ef626777773fd5f5e1945946bea03da1c7a946e89c92066443cf1af44272aa17c71bc2ea9423fe1283827f5cf2529768c81172314f601c267b41a51a70946ea1ffc982f5bfe22ea65890f15b5b4de7f5e0d189f27dd14999666978d19b8a201e78fa7b9096e80352cc0e23f7fa1e2458b9c2037c78a5945bf4a128a37bbd002b2833a63ca9740ef0c8d658e9d61db293eafea2404fa410ceabf59b8df2c7d8a6250fe84daf1320743d7166594b2f80a7f1fa8fd579a9485eb4369595fa4654155e15f85d013b5a2e7e905795fba83d826cddbdad941c8715054acf01d92a52792e6b61db8561d0e86c83409c10af97d9a74a82494c461e9203c376295323756baa03b67b800044dc42e753756b689f834405758a4a4aedceca2b4cf96ee3f73c2bb895bfa031153adad579e77aba4cd2a7ae7519534c4a0f6df7ef49f77102ca203dba35f16b977e929aafd6ac90506e420d3a5dc1cd02f0bf8fc54c2f590062da2cbea781e7dd0779a0609aaa8bfef6a6477eed311359c3159da243f776021a4d65c13749497a098bb4c8e6b3fd33393ecda55090714bc80b75222da271297c9b3481244e8bc9133dea174237d28401857ea09d42a31fad0b42336267f45d70305e144aa780dba982514c302b8e5b2ae72bc6b8366b8b4a35465df1211c67c6dbae148b61d12a59e321452a5d8136b74daeb22a5d07bc226a63da1ee0c335cc724f05fe7e5d16398b370fa9f95906e84409a2f1196c3c3684da81fd208212e3b38479bdb05d044a4810a3e536604d1230c7bf6e2b3aec1c068fe20f06c373545fb9a013d10755e8b4210376ab090a545fc500717a2d172802e554a22657095ee84693aa80535f96e2257cd060422d69285a10305dd0d7779190c9cc00543b8824f3d90f8d03d36042174402f62a21ba9b6a9b7c1f2455d9074d9f0896f45234067ba8217e930532deb48abe310f6e0f86070d08ff694d34007c12f6b4a18fee36a432d899017dc553194441ab8c045598a55d14ec33666e5b5fc14ed6e4a379b84dee7ec9d49295b7789453612d91256f2acafa9cdbe433b15bb3ca34af876a39d2529d5e74dc70dec678df760e92faf8ee93703134002c50f8d9abd35c01f572d68f5f4653151e745eca5473e765e14bb1567802c9089bbcbf9bf0fa4f7e3d387fe5ed0118e1e704856356b12d4e64665e629a57d37433bb03a9a5202b942776062c2f09f0742d0823fbe3dd504c18f04db1da2c6fa6818e627f77e7d59699669ecb8953e9fe8f4185d5b4f5269a0de5b9c0ef85b5f7fff9bae14fa88f1198e7ba8258797545238d123460da44813ec3a094d5e06f5e8368a580ceda86fa6eb96aa3c5f21213133996f8788db43db992b5dd3c5745ad0ca38bc03a0066df9ca74538e71d291dace144235b37670ef7040baff913f1ad72e72c869fc6ac1b7c4932f09ceda876c1f7b084de76721391a6c0bde5d56fbe3c51ed6e7422502490e03fd761b9795851e4791f4d7d64a05a0819afb88610f49008bd61432001e20da322c2dcfdc7d6ca3020c5bacb7058028863209938093316046420f0fc880d5e1123f3494c48ac120e811c06632380a8f472a233f00921eedbe319f06d36ae47ffb616cb6902f34a992c1b3dc524c3e94bf6b7ee5d1002060006b9abba0fff9b9fc8b4cbf473156c8851d6b46f814b586cd2458828522f919c58221a93dbfbe230591f8d76ee843f9426a80031be58551d15104af9830eac4407a488a717776b5c84a6b189a0279c64e014567401ebace335fc5bb296d478e70e823f8cb7319a73e173b9ac2181c01599c93fda2ad27d3979ea0207e321019aad28892651e87f6e0a21fb81c7f80ba4d68fb510786f6e0b653ce0998bd3c0c70f65c15281c8d49ee5bce526dfe2e1b0a58e7d9ae6489b039bd846650d53efc00b454406526f6b8b001009dfbae96f2338c35c3c27798ae0bad9372bf3a04944d1c209e110be1eae8869ad5726bba625268ad34f5ab948d8e7929ed17fb0ec3fd377a9c1d3a3665b97ff65bcb0333290d7393eb97b99ff7e96c9e067a6b3c9a97ca573d9e2aece5aac2a66d9b53fe5b5b0d2cff7aa9cd7f3d55af71db586b7944ca7f659c846bdc71fce0a9666f6895c903f8d38a0730d0f4695ddfc3fea632671fa68bc8327f1dccd0bdff65e8fc9245757b024309f1c955e25037df4d6677de87a592710a2972749316666391e9a8752fe2c9d5a07ff6105280e979c207fe62ea758e53e0ba6343ae99d9a12a1d8dd3e91fbf95ef01843e172ce310604e8d4e3d053c734aff972519a316a17057db8eaf2d6cb45a5edf099b8787cb24e4b4803795a7427f8782a037fff061b0522badf8b00aab394d29eb01e4d217b679d96d0b3b97ad940b087df8edfcac5077ec98c361287dfa27453ab7217239877da166750b726729f8f19788a4cd52701fc17c34225d693afbcd5e65f6125dda23cfe7faf4392dfb3cc25d6f44b0f422bf9f7e8f4956e38071741177276a9be6d64c784c796d18a076609707cf41b03c56e99a0a4debcf63cb5cf7366663bddf9244cac5d95e0071052a136f083615ffd89611aa5a073279a089307e3ff07f269040a624b8413c9bd7b43ad05e98f47eae47097d0b3800cd588507f871f0f7b0af12283daec62ad5b6ea4e42ac0b152252f8b2c6cf4c3c7c6ace06c037327f5c96bdd9c4ff488060228878dedfafdc248cfbbcbb3391c2464a67ae59594d899a022d285f9054eab3c395cebd8334f7189f2b4777d02574fd5d11e11b88cf5ebebfc7de124fb21ce76b9ec324c6b48acbe868adf8a4fa195aa106639e00ce1e7b236662f760cf5854e1a3fd28faaba97c5a220f02c608636d0918cdece4533e5d0fe5ef887d48aebac8dd7765537aa882e8a78a6b2389864ce7e0b0e76c8e6a32437745507d1b58b60c2792df838495e9dbc1be9e9048f9c9d2860c722651b363aeb696c1b70aebdb945bff15631bb1d2bdb21d3d710cfb9130189bae76ce1fea613133fc20d163eadd509f3fdb5d93f734570c83921f59c3d408701f4fb99bf359113cfbab4ee208f58ccdb30881f059d20105b9112c6cfaf3f8c6aefa83ff9463009df08743f57d818f61f4cd4ea15df2fae33ba593c580a5ea874fb1e0af09e47707eafb73d024a8317525bf63d949d063665f9cd0d8532e984ad72a2d55557ed2ecc8f5af6a44339e1660fb9cbe29c79f3c61a1a7c1eb5b65ab717ce811c1c4e2d019a9f6fcf0bfbc466e89c89e8488428095b1761a29326662831443b7c59d012e62022e65fb65662b6358444cce607de51dea3146533cad50166ed40db2a578676a8700a82d0bf775ede9b560e3097d9d7dcb9cf9e6174a755a91b343b3665215e95d264d3daf5e36a19e066f66961c6c636002ccedb277efcfdf622d58de17192293e827f1eae09960801344bb3b1833cfca4397cb51f920850f12a8e8f4d50c252df973e4dc76100e46f57c8806872b41f1abdfcc434af1c1283cd6acd3649ce15604e24a2a05c21775f6f874892c8cf014847ae23105c9bce6b4abc36d76383a6f61d8a3a32f68d117e493a2945641d45a6f5c8e8516fd7a686b4c6a53be19efc2305bf357fb11b37de7d3ffcb99020f04903a2cea5228de8f4e443e9aa8ce43a7e873e25965a1244c0226642cb4c501df0f94a8df5d987f9fe53e5b5cdec5f9c78459197dc7367e24fae06fe5e0107903d8576719abc6bf7067f4f23d140044c01df1623602eb0cd33982d01a1cdfacb27870f7dbb7edca49a05f4c6303141aaac5a0bf97beb0daa0874f1f2e78849791aef6f54c5e2f5c56e444ad6c84a0fc1e5a70765f1eae47ccc7a4c6761152589efb76fabc02e484f0af2bee5dffc57bee25cab3e882b80df8fe16f497765afe4984ce42fc23a7bc663f22436ef170df922b24b9bf62e0c986d58bc6bbdcc86cbee7f756139ecffcdbd16eb3ab44dfdcbe1825486167cbabd5f01fc5dbdcf7259c19f259fff607264e9eb0f15554968b204073aadf2ae2aa7c403b08e49f7ad29f73194a117c4480d0d0365e5a8dcbbbeb7ca6ea77e8a55dd9da7f889fc963bea8f69fb019df4f879f324174dc9cee02eaed77475eb23c6018d78b7972fffd593a6d1a1876ffebebd61c123d87832fc7d8ffd85ff882b56d014ae43cbfaed34d53b65c9aabd6f277310ba08de893986738c32dfa9559ccf59d90dbdb1cf611db78d2e2129939bb9745858699737805a5a909fa40d0ab081285b84792b8074437ed1131cfb5437c05a8763034d705296a8ea47ee985584695fb6056661305e21b6d371dc79d732b581305016630b97a95bd1adb0f53ea18722eeeb45cc41cd54d0e178ef0c21b7a3fa88125d81777d92462c7caa2f1ff0d54346b7a74e0882d0f3bb475430b66d788819934420cec8f208001830f6fff80015a1c6484f68614c4bc910469c1086198187de8c6c719d1c02146b46d6ca365c1308fcc0c230d1b4b8621a289238667d238811919c808468c2086e983876fe180115a1c6638ab8612cc9e510660c20831d81f7970030719d2ce0103b33498c8ec0c6500334610c0f2d1c33739ca100d8e339a41438966cb382330308020cc8f3fb881230669e198a1191a4e644646328219434461fae0f11d944bc92defc1cd06dbfc6bab20db046c625cbbde9af5d55ca7562c3b4266a791c4c972e31e811d461077cbc73d423b8e308e168e5b447619595c2c390e11d8610471b77cdc23b4e308e368e1b845649791c5c592e310811d461077cbc73d423b8e308e168e5b447619595c2c390e11d8610471b77cdc23b4e308e368e1b845649791c5c592e310c10407690551dea19e3f7a772e6cd891c970e9e7a0d4813d046e630031581fdde5dfe337d536683d9b9d9c74c889115d3c0a71501809f764e2d0ba395c24bd3408ff9e2ebac35710974814f82ae301d64ff685db056a0e22dc089192c8b5bec10c2dfa3821e69a878f301892c530929910fabf0539eec2d9c34a9383fa1d1dad7e00cbc53c26ec33210fd38b099a6579c311507da2cca5cfe75992b29416b7bc508f392bdec43e09d998e2f71552742c0e5a75bf106b4260bd90bd131ed606c991f54db8ea22bd253b89ee7fe8055c1d7145b712c91a3829993664f098c376ec252e9846cf162c991da5ab3fc3c55df45bbd770c170e63833d99846cfbf4532462f3decf3ea851bd1dffa9034ee836c4fe4fddd24a842c826a4111a6826e7a50a38e0f9e5b7780c6ec5494570956ce0e8f774ddf98e3ea4dba4b3c42f66ce00d28c8af5a412e4fd2d1af49d42401c619cd00b0633802beb4ed065a271ff25e741092988f485402c68c3c4a874faccecd5aa94d3897a08aa30f42d2ec0b89020a267082d48696ae441d6c5f9e7eebcc1f3a7ac14fc2a29c087f59e12c07c0a7e9613a775e941b757e993cedf63a0eff1f616a73fe13249870db4de8697907e9ae462a8ffffa845284efcda6e5d868b991e5c954d6dfbb68d3c5f6639be43c0bd1327245a77503e89847483bc342f9fffb9d86692e40b6604280459b5a83b767b7f75d64412efb012a5f9c6c8747427b6380a4116bd6a9200db5233792544fe3391f69a37ffa9a5d613db859bd9399b8a479d06d7c7a1171c14393f8e17f0ddfd7ef18c03477608335d41ab0373325331ebb3ee7d75ed5b991bb4edced20de8c23ff91e2f4c740199512cf30c0d7724100ab6fc47f7a341e8af3f78284546f07a39a984fbc742977894fbd7c6e781ee7390e50425e2dac93b9b0f26f9fddf3730f7cf008102b4b157a5d5357f3fb0e70444b0564faf7f05526d707944ed6385042066cb3114f5bbe0345a7dbc0f2a19a6d4cd8a945833cd0bb4db617ed01ae0cede71203dddabc0c343b8067f3a14bdb952151ade9197bdfe0f4041953dfdf27063d0b32f54a19e9ae904ea34ea2a6ce051c54b88204aed14f96409275cf4647a180425c4ea8755f004c0f80605d13db26e963418b7fd08831469efb5b981e33f98087cfa29ee2293ec2ec5dc5c939a6bfb8a28e5a384e2cfb993296f7305b4e47bf531fff3538d7d105b6632329ce4f0d18ba2ca2542194e963a7bc8bcbf11c9b92822d230ed41e0cf9a8d1b607a0b37232def93d9156c441a321039e11151b331dfba3ef7b87f9d03acb9f96dd4df18e23f65f4cf4bdbdd8e3fe1b16e93ea415687304efdfd01401ac4fd3e55ed5d67f1503a4577b25ccfc8d3af0a06c9e1447f4231cb3c1dabedb1089c043a48b74b353fe4f5ea5d437f464ccafd00d4f10fba99a8c373de275c4ff3120fcaecc813e6ef71658e941d299fb38611f314ce654af52484384279d3412a44f5ec0d1b31b41d6ce9c624e0e7a9f2189b56ac9b67012eb7b3f49c30ce4366e7ffcefe0f5653806ab02dd35a408be2cd69db02b22d3548278bd4ce826d71d34033d1e5e983b67df3c22defff04322964b703154bce17f3584ec6ce15c3c8fc0df00b93d6424fc22182e32ff86d124beb260bc01f79b31b1f60e1af7ce97beefcf431bd12ede81647d23c89a0c0eb0ed3b6caacf5fb8fa127e7cd26ec06b7a7c827276a5bf6b5fb49b54ef61d68c863aedcfaadb9f823127a0daf93c8378873f22d455c49746852efe2899c35e19974ecb63aeb62fe254e80e2705a55722a419f4a7754cb941c11371fd053817af6057ba6e17cce985502e1b3d6754ba137448c3afdb508912f49fa5ed8b0a052017eb6da89cafc308206be75399e54861ad806315736e4b5596a10401bd2e7198949a1fa99e0b9ce9e2aeb57250823cc649e1f954a900c4b431d87e55f3f271a7cd5d85e829a07ea02dbc70b8342f98c116a294890f305b3fdb9c71f6b2ea692fe4a925dcae4b54bdad10f7c21910dc8fbdcb51b3cfb9ffcf292c3d5ead00c281b80150bcc292580fa61f196fbe3e5816ab80beadbadc0e79c66deada30ac0e0afb838a9b085fbb0cf98e814e91ddf8d9e7abbab2329674f2aef9004cc3c3258a40f1d5548f7ab26ffad85796b573581c89266572df40bba3645de80429d718f33fa5f5c34e841511603d6add8ae434668136b39f75f9b2c3db436f4ab916dfb7788318fab87e7cd9cda05aa820ed1e48b65b4be30dbb79387d8f955d7aec525db62df85e0ce612a0fb816402943e5d415e52b311ae2ca0713c9713d3a73ecb42017f49d0bbc5d96ded0085c120b80bc1c5b711f279777f6efbb4a3f12b8c4d43ce7ee3fbb3779e392c97d8a5a97bda98cdfa733c9997db1e1fbfd26ab2697bf23b62b1df0c9b547b9c584f294be28e0775228ad4e9e057a503ffee640e27bc3075134a5c69120edc26ce9873d0195230e1eb018a7347c3646aed5ffa2905eb69755b2b4346cb73143075195faf2cd19520e89dde3976bac0b23858a08e4c88cd14ddb90c655bdba0b1dbb07e437992147916b25477cf65dfb00c02724037a4f722300dc7f63736c857a687d1a0f12165b0b6d935bdf594d01cfe76eaa28c8e00dccd35f3671019cd710ea46cf35092e98f6b2209080c0656178725d6e3ebbf9fe04e1ad69735d47140966fee2b866060a0606afed5651db5b37accb934f0bed7bf58efeca3de073e18a09d392e6539eccc27f4452e70ec2bb21077e9d47aa7ff38db568b4dfe5cdc454fb97620e36081272df8c630be6c8bef8cf8aeca6557d16db05aef2dec1bbe904e245f401dd55d04d201c05953bc14b67c2098060f0b9ff4cb1333766a611ce8564087ab0b3034a38febb82e7d7b0b28d6de97e7bbf551c365bcf65796e335ea22eeae1896cd3ac92cc7300a60f684466fa63451a9dc2d0daed89edecfd599b238d03f81090d39274a151b18e472877cddd77cb0f244246a23986083c1daf02465e77c4374ee0decacec2c7de499980a6ae45afb659f7aaceaafa6927d7f55bed81bccfb1e691de8e5157d8335a33cc3654c9b04d74d1ffe78f09d3eab3214ae4b23dae01cb85cba54f944c5a848e2026f840f5dc1788de32649f24981ae4948d1134fb9f4e867acec5d8fea2f518840118c7fcc7d3c8b8aa88b7a7021782798e275de9a3fa3789fee4e43b5ab20d4f5851ca20b392238966e01ab34c125cfe13ec6ef49d3ec79e040f8a0073fb56ef8d8e85eaf30bbff67ba36b57f49b58ac88af2b8b897b286e2258201a5116dba5e768c3201676a0e320c7a9ac14bd71290f1fccba80541e6f376526b39dde707ed3904d52bdc859c2b065943a3d22c26a8cb32008a88893ce0fb1c95ad64868779da278535333615783efc2cf408c9d3c706705bb8da829e1952050120949ac6d1613a8b7c31b3756442982a324c9d732de62aaad93643e518aa9734ce7a261a9446eda8c76dce3e1faa9fa9b5abc0edd68b0963669d021a85a5c92957a594e2399fa16691a6b2ee16e5a03133b8c3d9eff563918b33dea419e56661601271a3a5315f8d4f3ac60d2773cae5fb2649eedf3e8f4cc2997af24485382f3678f6f18a34a7d1d94dd1fd81d718c907a5b40e7086ff32700d08305193b1d0d8730b51c84adc67d99944f19567acb90726aa0d39f7066f1bf1840c0512edc05ff56bff556a04c1f0d8b5e15730c0220313e97756c80d7c7dab874127d41a9a3d79a2bff06ced88237a699ec3fdd39c875e0e0eca8d1be7dffa867f287ffe7ca3479c3b7b197f52074d729b09bfc5f53797b37120fdf50e3a18c10af18b309f24fb93a2c24f50d5b223ee56ad09a5175b1efd45846cbeedf450b66d5eb946a3edcf5efcfd4207f6647c9a29b51e058c4816c9d890afe7506e3bc5565b07007f4f607fcc262d1250d864527e9d260a85aad52b2f5e2be7ba5ac0c2ffdbf7cca3b659679c7f963fbe8da50adc2f6fc8ac27aeca05a7b4c842df56c2966d74b31dc2d2bc09e1d7939f31ae9dfd6f1fd2dd6152f75d3c98494d482bbcbdc4d4b499bd44a27b96dc051966472dc7a048b2914a760a3bb0842d291354f6e2e3493a1c920930bb12186c82a8f6b434404a1e23b46beca86805722c9e2f0d9fad0304cb3a117ac4de1cce56c923381ea14d39e3be1361e57dc25c04c90e40678708959e3d58d09af59614852e22fda0635c56ea77db143474c7aef4b090601f46df192873bc3f465689b26b9773fd880324240b0be34d240ace60fbeddb53361280d2dc2c0d58db54688ed6cfe3a40889b894f7fc72169ee77ead5cc70d3afb6e28e678b839df43c187e9e388adeb44972ada6abe44a06349ab9f17e4b214478ee8e747050bbd3d1ddfd09f2ffc4a58bf1b16d94cc49e84169c74ad81301688503d569095965c9a5d7227e7672f502aa15c6a0f4371f19d1db864e8b3cbe626b0455be39fa24ca4177de9d1f0b60abc28643d1024dc29c83678e6015b033ffb7f165f463fc28b175bcd0ef00f5dddfdf076cbc6bf9f82debd6cd596c69b1cfa4eaf65f29487322cec0b0cb1cad2e992e0a54896fd89f1bba234d2a5e69a7284076d97dabcd1749b6584db3b836bad0cf2d6c7a453e7d55778bd4ac42663e1d0dfc2fd7b92be7b603e15de6098bf3a686e28c938dc15169beabc346c57617cfde93ccf5a4628ba1a526fcd3314ce5ff1e1e9afc27a2e77d95caf565e77644f99fc4db1d7fe63ec6c7c8a6ed30ba69fb748cfebb4320e43151c5c769882a690f3867d488026bc8d8b1a1dc47da03e64f523fc27c900c60b52f17cc40fc0d5a67fef35c34db24d7881938d01e853196feb64c59e4c46917a3c57ad143d81587483ac9d1978e8ad2c4c15fb27832fc00d7d4cebefc3a0ccdb6fe07609aba4045b0c3f065ad2e63061a06ade30382078231ab4608b5bd16971eb775d65bc02c2693bfb849406eb53776687ed590da2dd10f61b14f1b6b0524be5a0fe65b2691ca2a18eabf5b604034536dab6b65c3be46da7ee85eb22123717b6e119a8ecf9b10ba041bc7d6d2dc64fe45ad8abf285d81ccf73b57da39486abd314fea34728cc955fe5ff5fce3407dcc536cb51386d9e1bd15038eecaabb92c134540d090da1b70d6dcd340c83f5732c1f28fab8751c187258d1f92f5970b5810ddabe485fd8eb77d08fb8b027c03b16ba9fa2185e0e3577931b125c83ccc595a638dabe070f8f460fab4c639e96a2394727cc097696789ca2a76ba21032afa042ad14bdc3ca5c967ccdb89d2193631328b5557157573f8d54d675210df56141c628e140c3ea2af952872fa05018fa199c0f21ebab1096c7b10e1104fd8979d63ffc7e60eea5adaa71d5dca46eb21d553f00f46c0b26e6c3365fc0e2c0f3f42641ba472f015df6b5e9ed93a5542e8aeee3bdb6f93fea848e4e3ac3cda7b6e6063f334505b18313b0acd0ebc541e0a6daef9cd0b18346251efb6f84b01812c142c11087abd7f02c16a7e98b5775a8c883a5152e598d427922576aa9045a52561eb01f5b3d73d8d623504da158fc1cd4e03150636117f38e4aff314ff6637dd5b38820b33987bf9f10dda720964f7d53e8fc43e54251c56359706b16ba9898dad457c8ac1ce37edd554a5bb24af72e38210b1c4d8bfe1a64e303855d2a30670df5a0e86dc24a3642770f1f6758822e7e86931c55217f0cc6d49799d7c70d6c27483bfad92a7984afa94a473df6349b59bb600dc921c21195f50f431e8e10a487c69f74f0f59ad74a4f3b86b2d9af99b69b50e0a0587fe112d500251745ed2e29452de834e94059920a05810779cab8dc9e462fc01ae06079425835f1e08d91a5c62761f2efefefec892b6360f94eacb85e1c91ca39b91d2b24ab116ded968ee4764ee9a3d02e0add552f2bf0154801b46719941a1762853e6d8dce387231a929aafdafe41e93aa00bdeefe836b128372ff41c8a7680a993f7c7ad14351e7695966bf94f94562377f8e8c21217c973c4dabc9a01ee0fd218d77a72e65da1f9e52653054b732eda962072f3b27e7630b83d04fcd84e2612935e2ad40ffb2a3f729cb86c57e9ab7bb7ad33b96d16e5dd37d0f1b6a745a7a4124e67f9e17642dbb320edb95ff77984b4636eb310e672137906d62f205ca6a9645992c94334c3c113645338749c91cf368208192c9822eaf2241a3e0f7ad203be450ce1d0a16af2d1aadc48dfb44db281f85e9eca75e399fbe3d82d22495f05acfcaa1ce4afa9a55e436dc3eeb59e894bd24dc8527c8f6483d17221014c32c44c59758c75d7cbc250bbb7ef50dbe9b037d14052e20baa5124845c2b64ad09661527fec96958f7902fe8e0908db10b4440f31b2fa60ddc0d5bcdc3ca4deb7c83df13fff2462bffc8171f8ba4bd60ff96491a57f15576ee83907c720c98f6494233243424ad1ab19d85170ad46728e4d86eb3e3dd921a150250ba4bb424835cd165ef3ca6035bed9f3074d72dbe8e2beb547221e9d74b7ef851ac515c39390a4477bcb378e131e7cb568f62758ed69aef7e8bb814e670a480e5d9211f949223a13d86bd7686e2e72c7f5088fdc7cd58860f8ad6e37bcab093c9bafda4c5e5f9b71223f3aa94bb558c737b589ad6699dd09038ce60887e71971769017b4aedd70cd603d57005e51daac79e9e4c5a6521656293aff39efb028af93330322167ab16e7835ee4a6cd2893c4291af4b27769a8e735d526f8542c4223ee9fd358593abc7045e56a3359cf6bf774a988ad0d79661167c6ae82e0e6959127731860fb4750688c294079a6ceab99a7105670c9c21e07c192cef0c299ccdbd0a8923c25c2503f37ecb307252e846f046ac1f164a8fa39ec576ea54b8d217946480caea51d22712485c59f56780ca0625246440815e6bf69fbf0fe449f4c80f543af269835e9748f2b3a62b49d7362229777773d6650263b6073f2c55e15402997e0be01e3f8562364c4934302079e9f380dc590cca06e883de4d103006bad5ab64b3a4281d142b34fce6facf32e3646f9c3e7677e43106d379262a3d77919dc031847bb4d6586851b8d5492c9abb14979a55465a155999bd1ffe239285c886f4184da690b24a4edd9d9b26085d1e830b9c5b2b41f79fe2550dc42bb6b3ad8977c4787ba3f60ee85e525be4833d92c526cdbf0150a870e5cfd195ae6a7469788ea701e2f10e7b797afb55f7c3e12549ceee4e496f0d6d6a9033bfb223657206149a9e39853e29d6867e29b9fbc59f7535a1b09eb99b501f834d481cd81f8591cd3be31fb964de20e0f16e58a1c87c12d42a545ef47e99f77d042375449c37eb0de9d47d53104a034e66f2ad8151608dfe21a6113995cff9168b9d9f16e4f9a51eca1df039045cc8b184c36ca3e70c7c66b9c6ffa7f74114cc2360575e92e458c5cff441afa82d006de83f423c97ec3b8f70c9f3d0d8ee9d6625f602fcc4fe6c6fc7e23e7b89d3e456745954a3badc173a94ee00a72f050fb7186475f2139b326944668b87dd5d44a8f3367a729665f313d0f88b32b25b5a6317f1b9c1d347706cdcda747ce1b496d9493bab71cb953cfba8753b9876b5d7112439abf429a5f597ee9e0ba088c852321459cec5411e85b0619eb91040eb464192b4a317499caf6ef238a410e0d7fb83b46aafda4187fa780df1006a9b73b6d73bada2f8e5180aa65186389ccf3bd093a9d8fd403cc483a5401b6fc22f7606eb1f82f41d9a372b3ebfee4fa7964812c1ead8d8965ab29a33fade727e4c28bcaaa24cf5a034d8b025e5a5965a1874a2b57ec0045722bf0a29f3a92abae40aebe878348822ad3618367d13584153bbc9c53f3793dd35a8f09ee26e4412fc75cebc70c91da7a0e73e3ca6785ef94602502b6244887bead8dddaf0c6f3a8552e0ff39a5b0a27a96464686b48c0f621bbbb7414ad5cea39236b2338884b3beb7986b46160330920915505b9a72066e546e2987c5167a723565626b90c89a0634c564aa0ebd661b7e36794659dc7920164b64189503530cccd1e6b79f6b0f175eed95b727ee590c48b99651edc94a99f6f2b018bcc7164d47bb1742e6f7fa4be67c9fb3f4b103cb6512eea6e902d378e7535be2cbc75cf9ea52b21bfcddf85cec7ec9ec60bf02986554b5379f00c362e174a6e3b34bcf4383c87712e4ef55572e1d87dead39426d4459d942caa5422aea1f86a824b4c09e15aa8b101c4692c05c61a25c89c509e070beeda87a37ced3d956e57482a49bd734f2bf2967f007d3a014378a16d65a1d51e76e6f6109a1a8f303ffccd84d54dba1df0fd68ba52f3660febec67a6f49091923a16cddcc9124dde9aa9be6db6ea116aaa8979120affca4b4ca6735fed4ef599ca1e0b74582177dad20996ada5961e4519b3e423498baf89b845a8cfa5ee534b93442d29764f833afdda19aab576b0e6e2bbd5e0124ed2072447821fb3e141ce0adddcd67fa036c44aee319a1e11f9a1ebc04b75b99aa728d8adce5764fb54df1bb37ca9390605c14dd2d243711971d7b8834924945e49e20aa46823030d13b5ec69cb682311e428edadd47ab0555249757301c391a8448c3474535393a9e045624e74d4faca52d83db53119bf529620867bc9a95b7736a0802c25879f6f7a8b7ad5becde69aa5b3f51ec306ed92b03f79287013630ff6a7f0d1a1538851af449e82c9911b50aa1505dc98019115061a81a006a1911fdf9a5107281af3c4f42d5842ea416919d3f6b1d237934913b10e2fa4f486473f4edfd625aa9654889b28413b87150c0defe5363a6b204022417667089f7d3b79d5620851a754762e05eb96abad6682705114142a0d3cdb789e247d516149af4af4c4b3440b978888015beb56ce298248132fc3fad8bcabbaa312b483e38562812d77a6c6d6782b3b7afad0f171e1ec9da18e4acbe53c5ca390097f9bac31ec97bb94361a7bef889234720ddce1ab28fc10c80f124ae154e302934c3f87b582c5a42f05251f660daf34a11bf681dc06e443d0c65da74b0238eff077e21f0a38465e018ef265098214f4cbc0e7592ab8469f88bed5ada5d8ccf8fe01b757cf8df14d6f81abbc5418e37ae8b2202dad7706ffa38322061eba1e1cb988e63977ab02a2f40e6fe27bfc0a768d3d780219f2996f72a34b35c97be2457cc0b884025f86ce3108512b9379581289644fc47ab1d6505cd6035a38886bad3e09e8df6d3d7f283af5c5093c2e5f4a1b38727f0cbb84aae8f66f1c0205490321cccb7253ea12be0dd250275f19a3c634387d02ea71aef18e63eca7333c4483f7133daeae58e3de267b9f56d44214f806f9a3bd7f61ea9feb85c7a2cc65461a9101b4ea4917185e035aa2998dc2ab8edaeb36a498be30382d12548a6c4525157718c2e6ac9d748e289bac6f8b55cf07bb3500aee8f1eb3fed033f423558b4694ea72affafc5e3db67556d21d944a7cdaaf0ade58a30e41ffd3300fe4589ecea4c337f73e59626b0d8be96c613bc4876e198295df23fcf74da898b567d4b37ef36eccb9c41e50ce6ae78feba30347bfb74b9d71915eff7d0d0b953a97c91280d5c8145307dec4cf64bec616d96968750c6db82a8a1435a8cf123099433c6da3458f606b60320668857eb92c47fd433b7204ac05fd0acf1c529d60dd76500c705a2863d440ac2f012dfbaecb0a70bf5a866c94f38fd168010d1bd89d6cd243addc871be7162ec2f7dbaa9ee296d080e0bc91959c7cd23803367572c860cfdab8289f8835d3842f165cc4302cc3bb667f76b2e89a968b1b5dba11648b6755e8372790e9fda03b86be12987b13c657b11eecded29644aac8b3993b92d3fbf2ee8c5e8d7ef674ee5d5fd868a37c9dc23707c81a7138cad82e44fa13e82329daaa725396c24c150248c6217d751e3cd2768a3bbf261a25ab64cefc543adb7166370845ae36c8d4d8fc8a11a35c569b743f153f1b4ea576daadd8fe5f552e6fb933947be7afc049112943e86cb9c5b9550f1350da929eba03ef4389a85629f18e75242da12e61d262885691527b18cc8c6999f305f0aaf2bfaf0e2ea0255579583405224a25e50127d779b9fc82ca721dd30360845fc7c0d0c39eb3180ffab01d254dc70bd5d72d49b48cc0b5f715ef1adc75a517dbf75c199990bd59b816b2027f635b4f4a9f990a82d55e04febe3deb492bda745de0be44bc6561a5dc04dc7dbcca0f88d82bb65ab99db0d74b64e55e2797ad5ec5ac0e1eb940a2cd5e0dddc258b70154a7f829e466e6755ea8bb40d4d4173c5a5101431dde0f8a69e32c3d78d9ce51c003425653341d6402661b70c083e2b59d7f45ba88536890cc8d04eb7a4577b26556427a08925b3cee1fd42cb40535a74e777ee01bd6506e5b3dbe4b28261fd24a000ca0d6f35a7ac8a3bcb271cb2540a38743989381b8e398c23820514e234277ad668ce1f0546031ba6b6b253c643ecfce389e4519afb30eb301011ea7d09ed5457e1cce11259a8ca54ec107e41e35eeefdbca9c090b5b384332d7263decac48e23765312cf529e6feb415ed45b001fc8b553a9db6be3f7599d1249eab5a644ed1d0309f374de15d3f703487e5ff80d221f897dc3fe840193343ab8314eb98a611488d386b39387bf68a874b9c3701876e3bbf716f10fe1886981820e2f926bfdcdc517327e00328ef3548efeb9ff956d5ddf9c8c135cd46b6db4e5b8adf60cc4a978c56a7f40bb9f16f65f0e843484a954398be01548a102009092219d1aa9b8f3119771e9703a20bc3dfeaebd628b3bb4d9cb2a031c85f11109e35bba7441d3d3aeb374fb1a11b322d89ead6c83c1417587b85152cb6cbe4867074abb93ccd530f4aed47ef029761210e8a983d2405523211302dde39c16abfa617f346e91996593b70534a9061c341e3103ece7e3c7831e776de4c8349c056eb749852327d4523efce1d292796ddae476a18444b4859bc3b86bf2650bbf294cdfa21b9e73b0c7f5cde06740b7420554694e86f716fc05e6a7fa6bbde08d4cc47356c56daa258887e89d12b00eaf33487a266e562f496af359bbad11f9762339a7b9a9d303d0eb4b496920a09a6ad3d5b845fbd748b36df986edfd0177769fb2f4d34ba3bc61bf7324f1f5e72f665a3a9979efc6b5f8dd10b80098b7e6ec6fe239420449741dca96f83e5a274d0d0395b9d23f7b54d2edaa97eb91248e3cf0738b64d072fe6523d435f5ca07c9bc4b8e359c68c49910b3ea2e5c3e13bd81f9a6cdda405ab7e7f81b484dcba01412518db54cfabcadf36afd346fdfc889c9e4a185228217379bcc62f9a4328433ffc651c8818edf20c23dbb10bd68f057fbb6b56342c3529a38c493c8f7a5ce140776160c043f6b5ca25477fde6f89b332a64016bf4ae98bd5042835305fb930722ba13915a8def4999765437953ab36a0e35228af65f7aa9630ebdf365203d851a5bd28240a07d2fbbcdd16f877d21766673ffd39017ab7a2bb4ebb52a45d3e0e1a165ba542c10541a29ede7ad7c7eab8fa501f34aa828d46a57de53960f20ce023be4fd9d3bdef97cc98291bc12eac37dc11b4c539c611d968708d238cde713d44a24c7a9ed4befcfe58a2b21faff2375e6f7574e046e7c18dcc3851db9c02b9c717b6bb65bf3579fc9e4fe53c8bcb68a28580e221e55af1c348bf7580f8d65536e88dc51452ce4e1903c69a87fae4d83f8667cd7ae5c5f92d698133290f80e709d47fbf2770275dd54ab819cda1872beb0bc2cecc9ab7e633590a0e16e611f2cc4f4505aa01d53208ada1ef4fcacbe1593ba44c69b19554234003111676d61cb0af746e7006928597d72346d0e5a1e5d48d407f19bb01723930c0e14956f20c40307dbe8905abaff37264f1bbdee2c2a46913a4863ac313cdbefbacb11c857ee6e778d3976289433cd1600c8710ff8aa40c5befa20db8cb526bccc7e548511663e33dc9635eb2bddfcf50361b2618329c0e9874273bc42188c9c0e9a0e8604921fdfaa2fb8da8e3976319444e18a0c824c5daf96b1e89699f588077f3c3669287b10fc8e38fcb14fa21c92a8233276d443d1ac01aaaec86029c4ae98da4806510334d2118b78a4a43ade120b25bb9b703ae1bb67b1b831b7f7d891e847b400b64766e6410b1116ce3d0224cc7fe290e4a96305a0e17ce39f9dee86713a486357504afc7c0499ced89ea0c038a59962fca75617c91dfb7308c1e6a5967eb0f5d78fa9682276a93627596a0bcd8ccb3223d3c1fc56f31832998309a16b44055f600cf8b89e18b0b88bb1bd996774f68f4845185f66a8b7165d67f2aabb2b162c70cde293a61b6a89bc7ed7e52f9b679f6041b5a6b3eb87fd074cbfd1c5a6cae02e8d92c0505de514b576fe4e7f2e5bc7f1d505ddca37349de5c71abb7ef08e4f8e001e4a5ecdd6b60f9770975ca4adad7977e081f6b372c100c531af61486e71692143ce9db60bc6982f2ee3fcf1272880c23c504eb4989ce7784cab5216cba01aedb2de909d7b1db5bbca0844fbdf7f3a193db8911ce24c3093fc06064dec86c47f95d4eef04dc8017b98970f68a74913661c01e39b1328d38a7cb6b3b9cbbaf6af1f1631d1dfeda73f4dbbf3d0394d2586f822e17d936725638e317fac73e5cdd9435ba5acd6cf429f64686b37d862d4802ca4dd99852a12ca715f15e607d251397ad87f86f55fee013f5218f217fb51b5efa4c0f032066096026923de3815734e25b0cf360646c288ce250e777b805e5d585c5e29ec924e599e964c05aeff1ba99ff72b2749d25aa755f0152ca982b827b254f38ff6a62ad11190fe629027582e03a02dcc750490a23bd6fb212e16eb968758fb8f0de33773485a59e555e73e32e1167bcb5e6cea7e176efb55003fa32dc37e9903082719510fd9ecb03be4f577c2b5e437ce5816dc2ee7f40b22ec1a5e946f407623d5f63585cb01a754ddc59a730d2c696d42ed95d948a3c4abc7e81f982b4cf9e97303dc4467481fa674f4c561198495405186ed8c8226690fe06cb12f89d14ec64e33a4d0b030dbae3791cbcdeb08867941286672f610f179f2bac6dddff877ae0614e83d2eb68454de389a58e80e0d33b700889d279101ff3b9d5c3fa7bcfc43d5a37758886e6d8f322a09fa27df27f8c285f0e327e785e0fe1fc6c8432e33cf616dc01060d67f2bfb943d818a747830f292761be3ad81caababcf9835c443410645bcde9462e27e42ee212117e25f44d41a037357ea09263d0c16d5aa5df038adf7ff644e5d77de12b487b87e0d5bb37f3b26366ee798e2fb97e20385733d23c432a524ae1aa1ea4f9e73ff8dab463367035dde2edb94f5e71abe8f86cd760a0e834e6590ff4ef1fb3bb6943d6dccd88cb379350f1e14baa65640995ddc5db4183c147714f0dd2d89bd25ce4e568889a45bd134f11491f6cff623b269db8bd728c01fe01494cf6e4d179eec62b8dadd347a2d515a26e7eb319f4b9d17fd47db2ca2acfda79fc34f2ee2212b3a9adb6904e79e5798f2f95cb15b07ae4c2e3d5838e0399e4798ec7c37fefbdebf12ec3dcb39375b4592d2a93e5c8d8bf663cb3b092035b6808e5b8ea7c4c68a866ff90f055f3aee447106f396a7d38a9c44120b10a620e26f2f26319b9feeda7fb52e5b6b21dac677e19e924aad170c41774529cac1a9e15e21c1b808858b39535ba79434ab5a047eebb8e6c8bb8a8c13848060dbfeb339172f7273aa7677f19b1f098ed3e9b16dd4d2b38b4d842b205e671f92f0c1048edd28d4a559dae97254ae00f63b8867949700c7118820ada47667d086cf3892557a8f7323c53d2d9b96222cd62e6c29c32454bbf381ba77e9dd4ced6c809f611d268dd8b9d533cfa697ebe28300eb4ea9a0dcae91c6d9073b6208b4cae9b3e697397bcd054d74850d1b45351ab7570972c4f537bcd5c921bfc765b29ceda8050454459bb336093e15f4e498935c32be06e6f79a17f57c09eccdfb36998780eec2d9dad34aa037380e0465f7826c0b4f97cd6258f23b22c274f1ab7e301de91f2850a27f48d22435eebdcbb02393b6d10177a9cdd8aa540b632053bf8aecdb4751c85c6d8c8076447fdfe66c4e0a0e3530427356a04c364f13cf19187dd6aa224374731e0268d5c97c354315a753979458e3bb58c0f99471666d709e5b1423a63a6b674262d7cb77556005fd71c886c9376754c0d333710553d960f5f4447d4552cf5ad38be4900870b9e8c5a1c1c30b76b3a1af922803ab602fbc180ac9db36dcb6e8b8ca07e467bde02aeaa69a0ed23ba4ddf363c87646f1bef4855c434b7a56a9a9b44d8482033605f974c0a2e8e0de0f12ed85d30ab8b5235e608f7cc68b569e73b6d2146737f321a4b90b112f29057b9355cd6acd10e0f881b63eef36b9fdf8e9bd28e3a74657c86836491ff37b57d711aed6fa00b3a3f2aceaffef293e6cf9ac1deec8ca6815bf8229c6c1b5bc00803728fdd2fc9a07928fee2cdd4724a66e23c9b2cde8705c7b94527529aa4246d2da7a311813f8f35941b8988dc8c7803b8b613b3c030d0151ee228cda269db3d1fcc57865ef649dabcbc4ba34711ac0a0dcc04081a4fc17f98c43a01ebc1ef1dbd532b8f53876ee406ef1137c40d6f24e31b962be2320a650e9b6d14616ffa8e7d48e295034f0da8c704ab10878e2d462c3d52e77f7612ee3469feb5d99938009557a94b602cbf3656e0d8d1420468c6172ca8345b6fbda739d2e398a222983690b4e3f635da88e74ff7b14818bdbd320d2d040e27329e338dd741da8ccb10cc1a273241737459a39877a03ecf18f9f5fbde50e834a6cee0a9711106c095d0dabe33851a785c77f3d4e2a3744f6eef4a2aad86395a26558008d59811a423d6781ecb370a68fca3d54821144a94c7113be39c4ad4ae290908633ae765698bd9c6f038293f7e0cf9fefb404475aaae77b16622fdea6fdd7a1e8180c1336ba27b241e8c0d3b7d7c2edcd26d3c7001ca412a01a32451ef8d054151c17d953fc07e109fdee50044e5eba2d67c63dfbf3b3a5c43434287ab33f3a03dc17ac363848602e8bbc07eadc6ff2f753ca90e0231930f02f556d2e2edfe532b1e78283fe1f20ee666dae7c64e575b4f0c804a891de97af734c128fa06a26fbc483ee78646078a23af6a19787fc73287bbc377b048796114e3e8a574ce7f8cd412a49e9a3fe57a3df34cb73a52ba1b2197f445f3a1ab57ca66f94f978f0747063b9b7be5b579fed8ec19ccf7bbf62dbd34c7cd9f9d1f25fdbfacdac8c2faf6c1dddba3e7576836e75342c370b4d2b17fec2992051d45159e3f36eb647f2fa4a997d610290e9e97e9f7235e2439aeab07b235333be59ed9e3e37cb3404fd3aa71941406607627c92b32640ff8589f85a4046d571fa786820eaaa140f24e3d45b0baccbc8636eb3e0cbbce60981b3441751e36157c4facb839e382094f09523e40d4073198a4099fd911756cfdbef56bb952c0054ce7622a4b9178f9aeb1ff0c33c9f41889026a8d03c42633af9b5a4359db0fad7816295a4f8635d3a4819ca86550eef06f29bdbbe495b15c2d9f450520961463cd7da1c5d7734728402a9ccf39959e4ec6828bf15bb6c07b0c237d374dff4267ac58e72acf02d7bc8d4ac99dafc13270c5884e143fe6fd597a0b1f349d40052df61c475a0249026f8f9845988fcf01fd88c16ca08c39ce1304b558253cb4f16ee6c61a002eaf059f325a0a8ef7cfb7f59ead5bdccda76d75be2126c2b30401c528281d48931fa8892335341bca16f8167f02dfc4a40249a7c7ed73ef875041e537aa0c912f786abe09fb9ff9a8246cd4f2648294c4b9a14a094f765cf56c2d99b9dc0002e8929c64a47d0bad70b25c73c601baca3f0016acea3e7d9bdbeb414058fa46750de8bf633c0e91c5579847f1a2a376ff8c60df9965286a75ef3fd7a89a9ac24bf6f96d812c9dcd8ad34e9a4e4c1f689673912dda1d9948b0f9d0ddc76659412e56e8d89e22ebb8e408817af49b9d0e659dc7630c4e8878c9030ba6d97049efdc56afa8f3b67f3c4354576c884a59ae82a8929dcdbe3b3549744d2d5b40735423ea123b478b19839d594c42992ff9984596e7f9e1c65e1471a0162fc40bf79bff139d5f1434e7ada41952d6f94f5566e6bb767c61f0d3f0b1f2bf59943ded3fedc74e437b791e2f063901a384a8981c656a3577910318d6edde1e35a5aef36a1c8ecf222e7c3fe2758a9eaaa3181bcd6372bea531f1bcb8f84c4f55b151e3627068713e63e5698f64a2a3acc7a721c8a083801cdbd2238ae24c15b07173d21db6301ec14d1c0adbdf0dec141885c6509de7a2e4af562b9ad4dfe65c9ca3de80529b0b6c9f5a61fd0980553ad48db7423a3e08eb815e6dda1d56743077aa5606b380da69883e5969ebf5e5c6541bcfd37a29f43a2bcfde46679ca52829c5232af29da919e70a7ade6cf13a5623de62e2c4c7d6e2a4aa46a70e308fb795a702f7b79ecab61137c8e04928398206b7abdbb3d4da54037c841ad2d409779ec4db605e8b5289ad97641c1bd03e26d348bca56bfbe87171057594db0b8fb8e0ec672562ce3fc32722053d32ad9d6e3a3c44fe345391aa67756aca6c2bcaca4055329b7a6c071ae8baadccc4f706aa117da98005b6828c2636a89b93367e41324df8e81b9d7d451ed016a4f6ca41e08c775718cf49a72b1a332589b4cc03b67a2406a59315890bffe51994c15159e4bea207b5936e8570a6680a495c0c5ce9ecd707864be83dd34a77e9c4f8fad1dab959070a4a5c2a4d81e5b72603cb924f546f0e7b1ff81372d07f57128dccb101cdd31ee1a2ae48d22b4778961bba983cbe8ac5553492b023c5b7c2c5950bf9d643e58b608b63f1b1458e42860a294cf84aeac9dea2a2eba4dc0d23c49483dc72a6acae2c065be56530384959cb8db387ea1c4253d929381bede38986f59b5153f73a92a7c516ddcc162ad4e77056ba9fe291817c123592d0fb8941722fc118c17df79bb3163ee0caa1cc16bfbcb4d79556280369dd7c627e39160f12917c4c1f6fe7a4d519fd62570cea99f30f2b5ddb24cdaa4b81669fc1c73c12feb5473bc16e38f7aabb5b5d25412d5d7376cb51c07438fc55e0cb9647294d3e1c3da8c9ea894db41f4ad6b150fed67b0716dc8b2b23e1e81f41773af4fbfdfdd0461cf9cdebfbb0fe97e74ad31022bf75b909a9a2863737be4aba8ca0b373fab0ead282a4f78bc1c4c4b878f038b24c230e0b4e3d229573258328ce306aa855f492f8a33b06e4525c5b4892e924a501c00eaafb63918d879c728b3c5793eacaf567bd192485f05abaf92dfeafa8968539b4a61002281f462fc7f211e0a6836d687c4ced54b6c2cf153237357bd678990adde482650d5eb188f061c886c049c6a31580cf5b1888c5a32fde735348cc30d2b0ac7083d407deb7f5b5455d1b3dab8316da40769231cb5c29bb727006ad107a4c12800695d0295dd967bd011042da746e9c45b4f70f246af406e61a3a048f296fcb25cbac3d163f5d34f2c3fd750896049b83ca3398fd8626a8b0c2d8bd03f48d09a7d96a3e3350574ddc46c6c9c6e4abf2a267ea15a31b8086abb921e2840e7a763e7672eaa1e306206f8bd2e1c61cfcf7fabfb63a9794299262ef111585fd78cc7750c635598a22559127bd24cf3a70081c7c96288a07b81026eb0aed32e8aa8ed02cb004c610fb1845292dd90cbfb6233d34601358b5a6729b1e9236b7b07df36b10a43dcc1969fc47e6b7d8c3901e25627318d022f33580df41f2a2750781a325e9a6a3c863b22b0dfd20dba6127dd2c1ba16249ad42b498542585677a47f02a958e62f81849ea2b82e7f0b1e5d22c8ece203a1314a651d49da7a44c1becf7b501be32405e0a42218f1917904f846d0d27321c377bcfb83de05176eff0f2ded972b38bc034adc43954c8de4d35f9320dc890f0dec004abfb5766841fa56b907e75a2343d8d2b1ebf6ccbc0d34f492dab32411f489682878ca5ea7567700e8e7668dac21b525903d16ca198217883b929e739ae22cdbfb95feb2726451633b1c43edb625979858de3f1724fa04494eeffd22fe4d299e4ce01bf3f95e529855556dcd3f7fc7e963ac2404df8391eb7b3aae6e1a3b3ad2e4a37d8ac6d1292c59fd0db48681aa8c22d4b70a17ec0501785d750429c9b061749a8ba80c591ca8bb4f6780530fb84a340ae54a6b0c50eed45432e66631a42aebbb81c87eb3ff052e78b84b7105f2b9da129cf839f9358ec39b896c3bc4cd13cd838966f1e5f6116c73058ac7d26fb6647f43bc2513c1cac92551354ff092b4cbada970880a386cbd1e26b675dc37b2d7b617853abe981160984d1bd2171bb10a864c93e871e56d6d74d34f4468d8b8d554afc30a5bdb8eb070c07c87f8cb301610c53582a12e5857ccd53254ff6195f9f0f6ec41f563b6ab14b5a7606a069999b07aba8b631955e5b1ad9ebd25a4151ade517aeca5f5887a491634244f22910eceef9bdb6c28832b6c98d43e7e862fbd588eb84c380290ffff8cc78e207c5c7d4c9a1e4940f62dc2fe15dc95723acea9e9b1bf2e520de2e4daf4a411d1d2a0795144a8cafe7cc57cf9612764ad99bc0d5d72e7954d831b18fac772e7fcf4856708a54c013420e42a9f2ab63ca24f9c8bd7614d6ca08c6fd8c8e37e9ea80ab7eb2204b67d9a5645b1e2e848c7516c9fd4b8fc2fefce2b931fb7d34be55467f2db8ca2e966efa34e015dac800e7587f574b89ce1211fa5eb36f776df618fef0763e46340ed6e5b17a95f1c85b37e14fab6c10a2c2fd4833dc87498e9e067c2e446a92388d9bfdc76f98b1239b16792ecc4613f4afdeac60e55b9ace93751e563ca447396d7586f2e6f8deaf5cdfd27fe16fd7eada8653aa59228728e3252a0750df7c2f63f98f236a4f54bf8767eb13a3f9aa01b8fa39e872d0c5ec1d9d628e4133da8820cd51dd84ded46e58cbe54f12b8c49adee831e44bbbfe883cf9f7e6fa17f19f410936377075e5131bae0a23b1b95605bf86b1d6cacfa7b24791fa9b82a9b9165cf7161a72b271ca3e97d972e0930248328376c4871f3ca62ad6a4b790c46ea793058d58d1a74dd2d86777637964b3c55038a517b8aa5d67cd1b7152d1c3d4b3bfd51ef6f739d010d5e06159ab7f1d208a71ef0e6864b8b7f3d77a3de66a2b31414ad73332f2d2fed9f2b4f67c1e9efa694f93628a643600cd4eea64bda911118a5b0b2d42cd9c923f33223293779ea3775cb2ae22157f794f8cffb7002d4e3c909e923329c8dcd2842d18ab84b31aa443bea221ac9fd1dc027b2e6ab3612bb7153c101262b245259c572e86f9de4bf450fae068c724ac91058c5a3e2bbe72bf242a63cb91befed4db0d6ab00279bcd47ac45ffba1c90c10b3ac87d9090c3c4bd7d9b69d201a44db019941ba541e5b785cdebc1d053aa383ba840170c4280c88c5910f60c1cd82ac75e8ca05e47e4ea2af4e0902d5691110ea2d8c4fc6b707c233fa9e60c028e79f91e0dd8029543a5716a93d863b318c5754ef4de468e836cda139a891a166615b043c16ded67dca0121194e4b08e23e026e5e7b28033bec4bd9320b4550585398758a12c6121f1925f58f33666ac695ec2d3cf1db0412804c58b3356befaeb8c5ea0107efbb3696f8c1d5d80b49cef964d74f6ed483702586a7fc8afee5b69c4fcac2b6f2eef0b4d5fa48cf5a27ef5003b7b80feed45ab46acdd0dd472c31f7f75f090c61ca1be29bf030300c01823720105758046b4370f8da2613e26b5ef9d2d0a0bdd577f0f8b1f6a0e399c30a7968195be3f2d9d3757644a603978e40c8bbb3402ae568057ce7a5e413ea6bac6ae29ea7b0d6958e53698ca49d1e9717380b429f63342378f100e686015751829e6075b5d4851987b52b7d4547fd8fa53a862b58c670fe19094e37080ef1da7ccd80301a7d5cce2c718761827b0e2d13a585a4a9db179706cef83cbee9f40410286514c9934a0aa83fabeb07a5e25fe46a36c44a17f428efdaa3e281e36c51e8fc5476a1f0ee4e03c97b0227900caa73af5759f84d19ff0591f542505bf60b838c08364ed0f0249a56b41c5b464e4c0692946434ee98af2d05a1d925aad51218be72fb24bfbe866f6b2844d554850374be974022f48725311c5464a32c7ad849e5b6d1ef1585b8fdc31045c0b73bae3f34142ec8b9196994e8884ca0a0ea679bae418e79051fbc320c15b52f9cad8b236f000aee3752276d420799045fdc8e0c0424e76c64ce0b33c40db1daa6c31ced38154d8f623354e34deb965ac01751aebe9ec145de4cc8de638af39f4b118bfddf3faf507513af982138c3a47bc0bf1feb1221d8a07d8da35ee06cc1756ff64570d568f6da80b56228adf819561508c27e71b2d1657a0068b02fde9eb70f3d433ebe7409665a49917cb321d79698f6b3f33f093c096a2edc509dd07118dc53ef2d54eff259b5b6f412aa5235180f5c9552bf9f33b22856962650cdd030f9519b759c05214395fd158c1f3f40cbb52269231c4dcbab7c6e9aeac75cf4925e3919184f7f5fcfa46979e82c840f27813b50299e94a2a316eb793001093addb2ee1cf7248592a25b7fd91950215c1250d4b3ce4cb3fd84ccaff8ca20b6023095c6b0194c077afe30865eeb0f1048df31ece92ca002bfed4848152940472b4074767ae95404544b27a38cc5a7522d902f19edd602dc55cd2aa082cfb5ade02bf3183601fb0a0a22d280fb0b8c76da98ac843c8037c0b80d52016f8b39ed2a1f772024047f896d25b3a24568fed3e582b4b0796a1fe905ad7b168708756c7ff365cea85d7d2313b33bbdde7fa68f08669da206c63b4b06e1482b6f1f6721628f871f5d2373df7ee9d0423e9809b49b37eab86d9f170e96d8ae1164a2a6ebdb765857b93c91c315a54b7e74e5892248b0bd0f0355d540b2d36df8c3d81eb284366a88d8771caf9a8ee67c037ca9e61e6c16e0bca7d13795562032109baebba0d9dbe4d9284fdd8255361c21c363b8dcdb1f970e9e80e49bb536acaa9f994ce05cbb8a48761ef5c12d8065493e90e817c06d09de33fb6ebbcc1e08de953230afb21a41f2dbf3a8c5072ba23723e923621e1bf389ae3d1e4ab3f74602277f353d62ff3288b609cea683a22ed3c72ab87d930228c53788b4fc87e075f7816ee028e4b870cfce0430d98e58d2e076f1bc9d94771e4a8113014b201127834ca0035a4b1d652f4924dbfd6b47cbd4922cc2dd1501b3ee58fc3ea20c07ffc6dcc9f14f0fd042042449cb140a2ab5b76d5f373826f3c77a41b0557d4a994f484893ffae8babc3312d4860481011dc1075520a751317c1b34e6b15a0176156effe2a431cac673e00cfc4698374143f987e13d1e84ba13dd7928a1598c374c6f628ab1cd6c19cb30145683453be75e12fbbfd7381da041485322976122037364138ec39ca00c27a812f4ffbbb7f66c28782a99699cd7798986c820ddd9d7a8c939fd578c416ce12c4bc5959f5c233d7a8424d6f312cd7e8db5ba9858f86c1517db65f5fde1b0b3eb4314172069ba4db7bfdb225f52c8d527d349e68b260700b27706ee6f438b651a3e29bf1fe8f2b3f5ec6436db099b9a25e3294e0852bdb98d807b7da00df15884d2599a7d4307323e0f556c981403ca95dff2684163a6982a380d8b63f321122559dd4ce3836319d712b38fe30efd93af81f842307894eef9540ffabee76cf4f4612c9683d19abbd87e044df301fbce9c97914e980b34651fd021fdaec4fe473b12af9559308815db6e956c38fcc1550b52dbf8619411848aeab288f5b038cfb952101f517a4f59fc8b04c73f001c8a696d54bc1a964af471bbb0cd93cf43f265fa2fdff82ef701e77da3851f65b21b7ec57595ffd55c4259f340791d052d4bfe867ced0edc5e6c046c1fff49377dcecdbc76c269a7a02a09de1369380493b4e8a05aa2ea34612651be4aefb5ee58f8087892188ab5ca82f428ac53a03667379a8447cbbbc7cdb6231362062eaa3d84057e28e03e1cb26ad6ef4f1f99384782c9fa0203833285d3dff0e4d221b20a6fbe3e22e6284ad0ffcf0a098734b9a9974a1591167b2389a9066b0b4d91aac540fa541122fc4009334d9d50dd53647e8d25b506a3a462ccdf138654acba3d054d21c1f4feef7616e9dd4a6ca1ccb1a9e4f475ddfa20b4c2dd8c650b7f890e6af627d40aa883a4956684626d9dcd446cfceaa9ebabd57c8a54d87c46416cc0dfe05055f80b8579d8e2f18775b32640696d636930cb3730279cad57e06235be8d414e1fb8bf2bd086c0b150cd8291c25f5a0c483908850d80697fcc5d3ba8aaecea85a172d0c8229d297a6cd91e0842edb0b36dcb69c3fc3d867f1a82aadaa0117c33ee8a912365a55406bdd678552b0af27a15884bb9ceee84467707ebf33f959d246b04719e80cabc3266bfb4c914333b55a82f41a06fad0c516472463b07d1dfdc7b10a0c4877d81f5618fb3744387ec358b914e2472024aaf7e0809620bca322f68cf6037f6d92f3f2a86282bff59c7506855ee0b152f4c3a3467e6d2a8a227600813660566ffea9984e8836bc22cebb9a8538c9da9ebb7928c9a25ef897d2873cdab7cf72db336ecf133905e4094b2ffb017d0647bfb34405c8eb7c9cd0be50142ce3890ca2239280d04a5535fe176090cd5f39d27f1a0bfd449d4d216d18482465c70d85a4b88803144172a89f1a41e1b5e2a003601c6144d53f451e03b8314fea4cb31d32054a241ef16305e529e9328e0d24ac406822b89dc0e0d8ab2431bafb29e1386523645e592f4d7b0e415cf6de487da47795730f0c25ee21f6bb3aa98f3cab8ff2785bc638d8c45f32a659ce12e59c9878dad8b06b089c5c5397a9e1d8862dc10383b40877f6bafb758f11a2aaa3a5b1dc5a7ee3a57dde7d2f559d410e85ce3d498f60807953f1703dada1dadc89060130c421edf8426137e2b814480da9c002616ea25a83e3ae33289ecc74cde910fcfeeb61810faa0c766007cdb6db44cb46968b77d2bf9764d9b5fc28c0cfea493ae2db6d779e0186eb6fa95bd03d45164dea5d0bd12288c2711a1a8119cbaedf46f2e331c969c67bdae1067317fe2a4ec52cd70659c55ab50de2812149228da2e13c6852107febd0aa54119bdf0fd156f76931645abe33dbe673d597fbcd9cc751d1740567ed7ad1d6a3891ac63f4218179e3a81318c45f582406dc07902f6e9e692dff2154bb8656e5e88df0433eb475c6231101c5a3ef4a6d1f9c903f15987ba31f77f86163ddf9f10609113b8b88a19724aa715235c2725c70851f7bb53d8d55f8963ed0dbc1858fdb05d9e08f06123f45eaccb1da46c7fdbd98ac83074ed894f2ae26d09acc9b2ba5e89ee177d7892dfd2c90885dc313f53c9e5cb8f07a4db295f9a124fbbae3fdb1e3341394f8132771153e1261b41af587c6ea43170f2b39a80b92f4c0d930fe18efc3ff5199d810769990edee71d8795720bf5e64350928a928db8602021d9331406abe5c46f563574dcb88b19cc6320203340d45985d3e72d8cde0759c9c9a3a54fb82efc26e7b42e105e48d90ad434f05f43f0882903b6223c7bf983e0c19c053f0fd817abcabeee0adec1ea282da73ef84776a7e5b05c27b33d5b63231eb646e693a9d970086e74aaffe52b739e05801767a7b5a25035132a32d402f91cce274ec03ab6ce2e806bee77495e9a0bc7ea0f4b463ffec0b436fd55c91bb17c3d897c0df8c811e1b76ce17ef9981886710fa10fccd0dd1bd381e1a67fc1c2c6c2f4e811cacac0d5f7309dd989b16e0493d7ac85a09f72e04a3c3ebc845304d6c329b0eb657e46f9eaec56d192dfd3a2951ed711d497481a7a10be1fc8a9b80b0e8a52f0c682e2ab16a38a62b16cfd2991a5436746a804ae1ba2beff73521acabfc8aa4502b4c77fc204b9f4027cece152c52c6b33bf48b141553358865390d7b7111735c062c88014eb4132629da57eda715273e5c24d8e50576d6e4f46caa8d87e958e8eea336225962932fa0922ec166ac834290924d024ddb42d8ca641a8154a1a25c5c0b0a9cd6e8a8362a0e6798e6df3f102c7b1ac4e7d78950f554b7e86ddfb8828b840f34d11ae3d2f2d85a0f2c924f65f027eb360c6f858ce9e8f1a96bbaafb28ffb4f56772538b3a3090c71fe853656b815314e24b6c0150987a44eef26629ed00f9ae8871f6a1ecfc01f177d0a47ee8a95cb909a27ebe0081a1a4b389d301e0cb592afb2845c4eeecdebcf1ea4d4f4753ffc59e4bd016a429a10ad1be42e32f55e3f14fc4f69301758a7efd50223dbc1bcdcbdc37b4ce26df7c195da07d4b951a958c84555d7ba3d38eb2112be1bb6e91e5baba4f43181cd3bb0563c7000e83a1250b8881e447f41f9c75937dac927dd2d79c9f41d2bf2bab6cc6ff7563095c1b1179fca1e3211b8c50a37aab13c831a914d2b624756317414f0b242c37576c214536f62c9bc309fc4b0b9e966d98607c9a4847cb687ad54e73b14fc3581703382813be39899b636716704c15dbf914a9fb690891a497b59eb68b0ad353859bba988c1e83109de99fe65772678d8f0355a13a489d4b2a8817bf9b63c3c52921f4eacc4f4fe3a44b4f78f28a178aad841230dfb6f994e442e1d9dbea8a93c13c4291a7153c36e0757084fb2dc6b9bd4fa3eb308e00b5ae2c776ac2d9f51852430ced5d3ab4319d25263aa0db73f8ed1ced9a21be7150817c77dd257c31538a4ac1fc6ee446f01ab5d9b900b5569123c7bd8ae4039bab444a382fb20ac192cf358996685ed82fc4e3b8d139cf86683cbc0509523d61b8dfe1f4ada2d4a879de8b723a1be5322d0328fbfa8dcc190950d25030ad7a4861e4eb6ae9a50ed4b62c4745282a2ec1ad839790838b18fb9d7dd96997edbb072b73d46d9a6156f6db77d1867fd889de8edb1e3b955df18a3c39ee20a16bcc79ecaf7c6d40f2b5e0b38aeb8c3cd39d7c207c669353e6b17f18af1d7d7b2e1ee748e3093ee3dcb4e6406580478fb7146e705a0c9741cdf7134f391d0a3f7eef917a0f0cf6919a0e27f5e1e18f47da3e25cb6f5da99213f39a65f238c46f2f2d5d94b1dbf75dbf772723f19a7a593c96a6c5fd679d88bdf3746eee0c1121485098bc1da6831ca4efee4229ed99b7e76d67e96cfa44778a960afeade722a41a14c1571c0bcfca8fde3974c080a732184304c1039db92da023a600116480c0d260acb54623933d53672159606936acbd717f0b6869e92041b6641c2b6e2227c38869290ebeebba08280644bf4849fcdc715f44995168292251ec9556045722ffa440b9cfb7a1f35c1f8c8c8e40b30b7256c5e9273f79df5e74eca680847455bb072c2c172d61aa996eb889ef9c0dac2e66e4e3cd1ae6a2d742c20d779c30fa946cc5d61b039ccfb5155ab0dd9a6857f1a664dd5c55ab19ca545db158a87db16b4fd361c374723afa1037bb8c4f803c51526e1a0d7bb520afb1196f2f83cb49913d7db5accc96dbcb3c8be172c673b3b48a14cad8594add70910926bad10f04eb6f8c0257aa3b4633c45ca9aa03f5cbc0b2a5878d1afcae751da62daef4bf3b2d2a1fcbec558b9dfd5f5e74a3e9226b72d3fef1a3bd1e680bc4da6ca938a69c261e55fc8a4c59c4f6e36da5a2f787cfc3379d06d15f4abdd7ceef3b20287654946b57ed3ea7d5861cd253bca5201b6c09723f7243f67c260b143c7aa832f05618c837869cd9320b91fb78149296b6546ce952e8864de0b87c468df59969272ec2fe77475309ec30def8b5a7342abac5f8964cd66994be7b4489c7d8fffe6976686697da29ae7ef4160f4cd55c854f910a6a2055793db7e7a5485c776c990c68517eff640a0f5888e47e87634280f25449f35fe46514338394c3b41169de598751509c903447901b410029e8abd533f4a4c2c0db0fe06714981d5e1da08d9ade0947e4f79328458489fabc8f5c89ad6343c365c3b652931882abe9a78d2ce25d5f582e1586449d724e6550e66ce99d06b54c84fd95446957bd0bb96e34fc4ce034964307c6f829272a782268a2e0c605994bca3ae8464b40dbe79b36bf961140f363c472c75c383e804ab1429ad42ed7aac54c194f6f2eb8ce1b922ffe70c1bb5116cce8d7c05c634343bd2507d12220448e5080398275e9005c50a0abf48f81c2331e17a783cd8dae2b206acda236621658d388f7f76a00f90beb8c9158e53c13c520413b1f01dcf5cf4191ae825013384c309214ff3df16203f58c99e1143f6b3fce9eec45e3b257c05121b77b09bdbacd0a124be4171d8f4c1753ed0edefa8114f2d711d50ba2d3d52527e7a92122a6ddaa2c33dc01d1f8a37a97f918f0cd8fedec89ab1007acefde14f149c8bb7d4f1c5ab7bcb81b11cbed7c91cfc834bc2400db36d078747c646df31a4e23b06eeea67a2e121061ce30d314ec8470897b022ba741f5eb2c1dbad99ead7cbd197210fb01a1451af486d402e20f6791004c2f43a41719432f2acffd1edb308824c4578a49a9d3430b94cfc76d85022bdd0d3bc60701721edcd12e85705eadee18830dabb5b32e6a6f5b05191e9fd74360280ef4e7f94efffdf54b9059947b0a459862b3b3bf29f39727a673b3a843dd4b40d756c0b108610379d11d7a0319083fc507700092f0121442b602a94758f1350c87e205499b4e8835b5dd5393689d2605c0c42ac6980fb3519c03bc1741dbf0381415d264dc39c5aa09f472ed6855be982c42b374422e1e7a64ec8aa18ab9c068dffd923858d8ea87af703f64d4b0ce03d66dfc7e37cf8c0b59ec3204e2d8f3aade5bceffaaf617d6539e438eb1672fa9925cbc82df179f3341fdc77f87a3d93396e4b85bc9ec16580fe5e3094a4eb1f158aa91635aafdb6e8099ab1941ceb01cdcd17b6fc2f1c0ef135d8f167db19ea50e42ea8697c3bd9bc433817aaf31e5d4dbe04222d42ed625dd7c723740d10f295384ce3231b16621fdc0772554e76fb8c20daf1f3411eb3e9604a866a562cdcc7b5c22e6a7fc994cc7ddb83c804fe8c0c5905728fe678ea5be34225306115a15012f9629bb596c9cb5fb8fa29ea785baaf914eb1bbc9b0c24620fd4d4bdcc81c11650c032df5978f3d242a285503cb7fbc0c55849f07ad78207bab24c35d04c9abfcc5579c51fad7f21ff68adc14373b0b8dc0475f62dc4af2003d8dde5112ebb5e8a52ff928137db8c759636f009e3dbc23d01207bbf881379025a25351738059eec038ad83d0ed780a58e683eebb33fccf990ef91983598fac0126bc560574e8cd4a25d19b07e2c57c1e8648703143db101b68ed58c7d10be0cdd3150f9129b11859706f38f5303df990daff072d2459dc86ae5d4ce876ac675100d63d067935e9b14bef61fb3310d9b8074c9916d2e89b2bc249a9b02c978c4fc102c97ae56b99d50c0190ad72dc36fa6c542cc0fad953676dd097887c2de8403c458fd93f0ee3c462d256a347c04fdbc8807aa5b0caff46349f8e3b8f9219b5092052b15f42eab8bd0b09b16a8ada02f870310d85d3a717a738332c2eff83e688a3b32dd588042b715b28a27d03a83a446f17a9cb8e2275a4948a48b4cb4aaaa8ec8b79c5f8333782b966036190b567bfbfcb6990e4b59a3a068a592ec11328bb5b6c8786f9040c09af4231339d84e738efc4d05c417f0ee8490514b6b273c0d770d71a0f38b0ac43b907c453710d5d25baae0b726d0cd966185590842a8d5fdd7928d259157247bc3c0480ad00923172580b0c51597637da177c3bfda14659f43ead26ad6beecf4365b98e7c3151eb57e8093b1a3fa7c2fcfda5cc0408fd8c422a0659f5734977ea73eddee8a872c4a8724ede1b08f9991b6183412fd25f4b97804803fd6eca628b963d400c784d58b1b7da39041b1d1abd1e706c4b01d24b41914c663e94c259bb77d195702201c43172381f665ee373a78f083b4b361a2a41bc6822b9ddb33edb658eb0afe3c66d6605b19b18ccd758611fc433a6f86fe4efb57e3000ff58e1bdacb00f07c105115670201ac03f501d834564d9692947fb2b5ca1955f91ba89c704b57eee036523b422d6334f5de08c062125d466ab4c49a264af54f9c96101a91e06e2dd0c6709a557685ac828fa8692840e82aaa77beea05a05871d52a765a5cdb692133d23bb58c75ca2365e5c96915813f92c2336687cc098c8f0c983a4d29ca6d0dc21f60b06f83c2cbeb6f46c8d9b77f8b34bdbcec821b28e1b197dc7fdfb6188ea9e48fe15e0d201a86d1d4f806d014cc411b7edd8727f9d15f50f8d61da5034ada0255598b97d26217b6b9d627b7bd38efe30dfdc64933691f9a820b524e35a1cdcf803bf5d0a422a3113a6a0cff4216c804e0f7156fb9e15a89d147157aad0a7eb317ba6e6d830d487e37a0ba49b726ffb2ff9b266841db1d0f6967efcfca7cc21630511c656b287b9e9aae5d82ebe50520480b9ff76cacd2f5bb458f876f5066dfe2594e22991be7595e55038199368a8842bf8471ac04b4afcf204cfc13f63e92b8b27dd5ecaa7f5d85ff0a1f3e2dee255b4d9c9ea2c1d81e72a2253c44f294b6d1f7e4685f08f668206d81ee72f7e88d7cffaf94dce009beb72c0e7ae1e1bbc9ca60b659fc479c1058cf98ac1ec45071a42ae86eefe94e58dc6bc5f9f222c0c506242ff8b3d988a8d9349c5f411fa9bb14217c211c1d35bb41dca23518f2a996074f356420c1e2e5309af4d374beceebec53c359a7676e5e43cac72fdf070fceaee1cccfdb827d17223a20d69a3b51e04bfc7cd057b898212cd2c0bc95f8d0238e210b2104b930e26595785af6d6000988bcce3a903a87607e8beb2c957f7cd0d803a97d69a5e866706742c16037e88c1c02b515e1d0d16ee88a3e519a76893ae3945139308a9a9b6927808d54143e8f46f48f76bfa12871f5b754ca11ced715dab65cb005d98eaef876af4925ee4eac8561dcfa8da615d77363f06799f1eff433bdbac426c7e8c5e16bcda49e4edd4b514f7fbf7d4955bf016d3ed5614a593f4108ec6310eb98168c711deb5803e6cede2edc055ce274e620a10b859872ea0257de0c1e316d43618d3f0df3543461be472611b588dc6f4d84b5de45f4d1e62168a3ca7483960c9db030119bf601546d42084089b8ae1015caaa916aef60800467edb1b593cb75848cf234c9178b300841d27c0b119e5f17ad5776894c63ed844ca759c6f5bf9eadbb08178b3d5c42e4b8f6614573cf7dba808064b78943463070bf8584a9259d5f979dae9b0227ac557d9f68a3ffcf8b48967d7ab479793c5aebcc9852773fbf1a66c7395d5fd4bc56d0591c19c185a4e1912ee6d46aa9100d6b4749864deed404decdea68ca9ecb6e8bfd37f64568e7722fed8a6267493b90b3c3518d5f43a0db14430e45ff41a1a5244f8a9f4f7a354488d420b8b01009dff0860c2283b805eda7a2453b7410936cfe34e483537fb9ad5016474b68d4b71c5b7bc2e031142ac9fb684c486e3c585c022fe2d1da533fbce0342611e8d57d8a2b85fd6a374955b97cb6cff29f581de9c4eff14ad1dbc9c3cd0f5e381739ddd2789c26bc2c9666a7126442c633960013b0b75fe1a52d4b6388d73548df7629c719fb85e1e0f07045d8e67964bd55ccb36c64c42098687ec38800eae8aea2566c350022a68666fce433c00da8e28509298749948abb38b79f371eaf5343271fa7db85af7b96a741604a8fbfc8b421d17a61a3dcc0572cf72317d71f77e62bac1f9d1f7368324571aa813638d20a86fb83481429e4edee311f16e006adc44942a93e8d73d7d752c2f4ff0766f71a1545a4365580d56529a81ae726a59d92632669315c126b09278d6c139b266a8d403ea92be30d5ed21ef9d0291edc064e1f57e2e08e90d493433da497f4c6e50356f89b8e1d2b2e972eba8b3e533e8958602c826c7edf850cbd1310e725d6badd08349d79fda9d94b4826d2e087009e16a8b9f7da6448cfc143beacc8d9affa596feff56c080d1040a36dd6c56016307d8c4eeb0ebc973265fc9530fa6aead4068a6b271488d6c081f114f48ee307f98c471f3183c2d0c7facea0a65d79a853cd7cab331ff302a51e0dee22d97da136053b5156e2ff83e7743c3ccc87af5b6a872be1d8d9eb5a2d7124b2276ec8714e2ec00edf0481fdcd1392b10eb45b461eac0cf1490a05102f9bc113c0ac2021bc0d7646370ef74bd834935786c5eff8699ae1f96be9a3cc3840b43b455396e076637c3b80e922299b5cdd8bc3ae4b3f7a129714c1aa29e5ba9492ad50b698721ebc145be9ee10e6d100c0a9caed0c815246e6f143452e55cd1105eb341fd28c487637ce52c31671ab892369b1f2be26eccd142d8c357f3574f4ae94b09f00dc598c5598d61ce9f2922b685cc16161690fda5bfeb1dfce0ac2ece38dc8416a47d068e044b1171a4764f2b23348a4515b6d842ddf193ed15f558045cd97c0415c7731733c6d27fdc404bdaf78791dd76c69a302b853a67df5bdec7427b62c71dff94cad1aaf2c121a19aeedb2c62c076bdc5de3212aa51729169368d0cf67d1bc9d8ecb58f44d5daf27047e53771daa78321cac7a93b56e822820724570e5a9d92004d54d90200063e15a651026e08ec8bd2ba25a665128cb56b771b530889d22cbe31b9e7806bec97a57f0b8dfa59d631f785a97692698777de8692a419b0f97cb7de9349be83ee4bb1369f3d18143281f86819ccc0d44aaebc54163d8184cb7ca09dc8a4b35de7523a606c369367bd150d7890c2ba8597d0112bf9c691da5901135f089864b8ef10a69a71ad8172d18af62a99cd9bdaa89d588a9a86172eecdab1c7b0e5ee0ba95d67d543459472bade74c95a270788ae35a31becaa507990b4052078620857abd106092a98f898698887e9bf9cc62f4db3be94f84eadfa3b94667411746f2d74efa3f49e683ca0539c98972c90321bdb497e986abee104205b2d04cdb0f6618cb68ba3331ffd53ca786f8aa993983c1e11aee7bd36ad95f0c5d0bcee9d7d0fb319c9dceb133e75fc2e81d9ffd005cae9cbc5c9ac57dd87731fa98434d4341d6d715e5674808bf0e0dd453a9fa150c82de004ccf3ad5404a53b5272f690a0460479e8477989db80d3e9e426f013da1dd83a9e3947ce04f379cec0ea62e2ccd11620deac36c2eef9512e87f2d3aa98b7890ebb224ccafea328446a5a704be171a805e8f64db6dd0d2dc096f32dafb04f4946045b78a01b71293ad46613bccabf44b9166a550729f6c1adc5a4a1b0a5e7fb905cbeb847726207750ea5973c1a6175900b4d6c053c121230a360dfde6ad0b91a490f9bfcac9f8060d8d7aac0942d0cc53a238341dffe4d41f0364ead6acd6b1606d92f9c716f88301ffa42e5ad3bffed55f0ed3ed17a5c75fc3d78db9ddbab59bc602241dfa6d6e6aa05287593db4ec3b9b9d4624db5553b87ca61c963d07a43f8c09e4113965bbc41021209fddbe6f8757037b272833a0c657a65aa6294bb65c5ad3388c4e5276f6364418c26843c9f9ee4a34b8d39f588bdd11f12c273dbb13684e49e2972db40a6096f29371d757085fe97b01645fc717830227a0fa11cdbf05d9079d9f5f5f2e8acd9d7079e3fe51572c62c3ab98ec477597a8ada08df7157c0561950e7d7ef830f93e8d81237e4cf5f3afa0372cfc7ae4fbcbcb675d1e72fe710aba46e0e791f879e42344cd6f7c07616934a27700757ffc10a046b5260a695beabf78f82efa1d1afdfbc64f8e75ee54b5c8956fc2fc8cbb374c2f459b946a7f001c917c769b2e331552387f727ebe1d6734811caca2f4b2534da26a34a04fbdf0269bd3e532e75e08e27b6742e1c02b533ede1ed8a043f720382e4869d9e563b00ba6f461a33ca6245796f14c1e826a0f1d4939508e54f55a5a07acb3b4ac11c161381e2811e8d5519579a7a8d9a04f729f11baa18c4490df35538bf518add1f260f7c5e4b6f5350eb7c2542be28045a9dd2e726eeee57832d5c4b82f24b0d5c6d9aeceb2a81cb4cbdc092b9630d1c7c89ea4eec1701e0e5329ac2013032219f328e5b8f03aa7464263df9470d7a37aedaa6f073fb54b4168435315292942ba204cec7ae6bcacf3d83eba879451018fb367b8606b59daf64d85e76397a3b2bdf5fd0a334072cc6aced25e60d99f26aa6b803d5f97f4a40f3e10cfd9bf97206d8f83aac687bfe243e89e0f14fb0a3e5704ceafaaeedf09ff3585f5cd41d708e46d295237307935cacbc783061ff49589aaa5894c047323effe0b7cb49da5d16052252e68f6dc1c06405d4a24797a8bb5940ea158941802e996accb9b7137904b33898ecde6e7f8ed96894eef13de47a33d41f697b95e4d822d16f69f638fbf66d46fd7f39369205d7015f7cf1e2fa051f7e2dff3a152975acd8217c31179782762f7842116cc12df38939531e96938133e330fca56cd362ab8981b002a3b75d5631c36c4183aeadb40e5adec23563f920f32d57541fd799b282b0c5088ed0f5df095f9b3a253427f65cab3772e3412448c1338b2182b4db418da200d5d80bcaaacdf92323c99d082f537639185738d1f721968826313cdff11f3d5ea00caedd3e553aa230ef9fe79bd78a6655fa8fdd7ceff2bd386660d072742b0a1496eb9a556a504ea4dce297ae15a5ac2c049a620431eda7572dff7202b92862e8480e97c02bc0414b0be1887302ee2969bf175edad88b7b6da95a198c8055d2c56c6b29008d49f4faa7852ec62104c7a45de3f0d0423994c7e10f324cb5761d2084f580f885ffbec1a04304f1ec1facece071103df4820dda8d73cc53789d0f258955cd3bf64be8d8c5564dfbf4c62fd8ca21f7821c8c0fcc9b326ac5a956274460ca416472ca065dcd9b42b7e54c72ec3b633c0b14a7458f17ceea3dfdae60584efe7547383a83dee17ef13fc098b650ea708d32d0dcad7a72f8ea2ea6a40ec4dc22fc3a786dd40c290d6832223349d43ba7a5d143d41a0dc801cd95bb2e394feebcd47e5729c576e186180955df511c04889115d768dc639dca4a51fab97e3ff29a4828250aa28c919ac409c091ffeb07c8740039bcefe659bca08dee3838956bb1f2b9b2ab632bf9c7963edd89cab2eafbf374f8c61e06c3d775ca6ec336d519cef9cd67540c8b8b8d9bfbe4522c352e873fa3f0d6bae89a74513a66058069dcced619cdc53feef43b890d55d053da137527f9c8a6200c546a941cda8933b5141a9770e93812b37ca8856cd13a9207c52a070c00a0d7586ba9355e28428848ce03192090e8703b982a1009904ac75fb1c5fa470e8c7e2dc7852f1fa0770787310f3f3a283ac149c2605e7994969b6cfaedab6c36424368d00b2ab172af7818bf47b582462412f808ab9b373756cc72ac0fe4945cf6d2406ff99efde14ee52bb13ba20e88bf287b4206ca3450f73c85ebcd9d28977a007fae347f227a7ca138757bc5eecdd340cc4c28fd9d7a89104744fe52a8649e60c1cad863c541059918cd62c330584b62253466bc3e47d8822bdc99098ca7c117745c504c6475ccea700de76ae198298e633cef3d591fe4180bf467201d2cd8dfa5a3102bc7327c5fb1cd735556b899df30c610201e334decd829745c3b6e92a38b3118b52e8642d7635392add8e827292af10650e03e1fb348e85e6970c1c668e59a7af0ef47dd77cfb7e0d41f89f87ad18a7e23a21b2f8877e1731e054dcdb87361ef87282d2ca825311134d86cb4fa2131d4cfddcb26e9b5f91f61f049c89066cb9dc7ab2ae55cd92055f317b8c0464da2353c2c281ed83a1f28e8c70f0b1e5af61dbd05adb93aab663c5654aa842b7707d9389a2c364008f9b173a4d95e76582dd281c5409fb6b80e6f40b4720178c2592e14ce7dc1c54f7ff69fac079989ff3bb2dc8c5900b90e74a2cc64b64f281cc9a3a8cd9130d7ac4d5ea7a1a48c2af62d7399d3cc1504e28dedab6c686e4ea6ddce7fbf010667ce96e0f9adc0d6fbec7fd832837af32043f0666c213a3ddf711113c1348554b148893248d8291a08f55848c5870bbb7c2f35f9a0d2a08a7f80791a32536c11606d3dff92eeb1a9ffd500651f6d024bba6ffcbeb8d233bae624b5e3792b1bceed08bcfa65f2b96997aff20e41c08885ab79cffa0605869c733aee7085d7fc8285e30a2856434fc29772356abfe6cf5962b5332e7a6f21c6b559296b8f710963deecb709367e5b9074a1114442849bde85aeb1f4990fd6813a11df3cd171dc2cf145f5e00716348b27d08dd4b9221578c1da117f9389a44cf4d18cc3efc42a11f2c67082d0bd046e126d1d1e600c9da10d0ba56010918b61016cb471bcfebefc19a3669b684aeaf0ee597ea44c9647ddce28bad9a95955cc54a0be1106bd908a0abb270843f6dd64d6947d7841a9dc2696986cb082bc49cc4a46dd40962e57a4d050ba11a1e1de43f5c99c1dc7ec552a672f10c125c88ced1650d56784a368bb45b60580182faebbcb17791f6739865e2029bad507de79e4aef51ec4cc8b8eb86e5c648042302f1bb08c33ca7581efc98410b24bd56ec02570c1890ddadcc7617b07af5849cacd69d30a567609b388ff6ca950aeba5761a75abf58cf8874fd34230dec539f374ecb62d99e087df0572675bf81f01c4ec2d1b54e1225aa89e64b4647656da7144187267f6e6208558fe741279859733ddd68693f427540e916d2e0b460722b58e01dc8e67bd18015413f14adf130823201c2765d726f654fb9b1d7edfad401ba5902e7252db510068b6d12f46fcc8cb3eef28420dd3b281ac5e59d4f245ced2448fba6778fca326157a684fae9a8682801bd249f46704e2ae4500673b4eec0d0576852c64c0cd0c68c32cb7e61fe3a9d22d91303042621902a49fea21582f9ed09dee4202cc9b613902000a84b711390c17be1f169795371e606b9b8302ae513476ae2c28eba09dba9cc7fabd1afbb831e02a9c49614923b0576d32b9e73ef09bd6fd7ac3395f1f2b9e7c42081db0c232da1de0ebdedd8a8ba8d26b1dd8118fa110f67e700e28b8f348580a0796c2ba9a554e912bdde6539366b99528cf21d0c57c292e8942a2423abe663d3acba70689f9a10bd462f4552157e8b083c4b90baf5b3438178c26681ba1b17b5aa348fdec647fb59c10637dc930cb22f9aa41781af01ca1aac5a6c4de9b894648b3fb8a3ab307874917fa48ecead8a32425cc412b8a1d5e7cdfe592875b77bf9f54dd890ae552120a4c8d1f44b57938da9332e6cf53b8707cc0891964029321bc7334e1b487c5a68cf805889ec8cbd9b625426671c83729c259637383ec73ecde2cbcf91e8eca5ff3a14ee52ef5615c6811f0788a518a82cd50881268f4ad0f7ba0abf7f644b31f46b961af663f5949621605f05b100981963d30827ff160433bfbdbfce3852a62aa85311cbe341359533118893d9a3d2a19cc0e7e203ee1c32ea1c4bf178345be4606f41414266c52aeb67e966fbf77c1f7456ef4a0ae3bd8f862d9f40233bab5e7eae9ad1925c08deec2991bc4a3ce2ac0d2145429ac266af8e096f45853ce5614629cf4c551a00114dca04c10ef9522fd27de5802fcb7e9e3a99293233814dddcf690f0f86d0d034ba629a18a3de3cabfa3b96e94b427249a058bfe00d0f669a1486b5ed187eee16f994c9903d81e83d46dad6c898e5a9d801e3e1bbd80e0a4798bac8b662808dd0542f8b170f4b0dd59acd49279b792aa8aead1cba32afc91d4b08de3519aad0824d9e6e3485e5832d642f94f484cdc88b36e8c7ad9b243b49b55f07f8494c014f076b5b02e1142443e27ae072537d29db756181a28bf13c3fb4f661aa5737ffec8bbbff3fe87990f0b6611c2339866fd7f1d140d99ab2500a398b9684ae60ca9d1fa584172d23a55c819278589d3629a834f71c74074a5b3a9fa807ceb0b164c203d669e2e01806e119348c5961b2976a133a2d52cd7842e0414086aff6e9181e3cbc5a0c878387eb9f76f5f09b94600a110b21fb37790b187365b66c9da0d5d39234546484813b8943b8266045496965e93ecd00da1512ce14d657fe5416e639b5cfea1c81df1151dfe8dfd21d4d0fa4a7f708a2baba2adf4eaaf98698177916c50d2ad2f87a74e71da8cce043b6c4624a83e9c33652bc90da050d896c5273d4ac697226431bb5adfa7cf0afe65914ebb921a7417b602c9d06c18fb1e3025590e56949112e25e4a2806926dd403b70765b0e3ddaab53747621c155b56fbb032a4fbd241b0ce7803e24cd3084a54e554ab4c289f4a49a19a922981122527d735a3b0ab924036c3390acad92795c8d7ac2c31a10b1d3078e206a34671d3c123dcf55fec32dd5d990dd934b7ed735c1e6de58be6fc121e9dc3ed69163ad74f3c8d13ba3c75414ccae2924a102a1abd74ff3f6590ac6d6d4c061c83d78072be02312ad54fc45a696640ff501958e241ecb3058a822a1a355dda9251d1f5a01e6c0410d198c341f86fb194613e2e0d5d011c2accdd17477d8780e5a4ece61e82141019cc944f1039f155411c68bc15fb64fe6cd5dab1bd3d2f268c8ce11c8e7b4464a596bac3a8ac47bba5eb1a1b77b70ad7203f02d05f00022837aee418b9588d81ab18b1eaf123db5f7cc4ee68b45018ef85932dc8554827195982c4b3dbc45756d56a4f085680b778fa300a35e439d8b54717c38304998112fba9d83d681656780cd3734577af353049d817092ebd795ca86c39f710681ec640f3328ed5505d989f61634ee6c6915a81a972475519c18434073c76b5d83f8457929fc1721b43bfbe0a475049dae37142ef64dbc63914b1a1f8ae19bde82fa64602d2e37040edea4a6ef54e94b194666a6add8e47c571eb6b9d8675362dd84e0ac3f5ec72354cdc19ab461e0b056a319aad7008ac57030ea8c5080f3420b026e9ffffffffffffffff5f1c68bea1b5c812969294d91568b58d7d4a52da49a69492617b8fdfc03d00c0d96eb6db5a7f0b02eb0e810eec0ec1308b31c376f7f5fc66a98c0023d5ed94cb7cfa943d78a4811c483327467ee17be691e2b53333b24a8f33840c0101857286902189477c81fae49fa5cf131ff70f3c0885d263881012502843840c19e945b59ec5f618d773e92c9517ec30018f33980cf72165788042211244c81823bc285d3abd9371938db27b10f90193b163c7104763053b76a4e126d831c455c0230823bb385ebe0beb1ae7ff4a427ca06144174b9b9b194c733e7f2417b970c2e3cfcafc56c2082ecebabaa7def4274da1915be02db96717ed43b65e5bec693a63df25a5c545ab6a517ad65d8be9675b1a8da1059e51c38b988e192f348bd43766de4fb9ce9e604416bc9ca59664656846b32b148a09466291cee3314e46a8d2f5c1421bf9aa2736e65caf552894347c073ed80c1f67301935187945e61bb4435433765008465ce1cd8ab0974fcb82077985421963a41549cb2df5721811237434ce60c5fdd7526bf024545b99bc42842b41d0d09155eca6e5ce2561a5a3ffaad0e23bc79bb06f598c144652f1678b0cbaa4bbb8a26fc2082a36eda67a1b646ad3a9258c9ca2d92c9786119ac15f4c8f1a4918318531beb057fb6b1f13e26d83915294593c3466590b91fd0623a4304b3a7f4eb1d02367aa50283ff8f13e0ab424479a0a5566a24107824030228a93cb59cabed52a148ab7a00214e0a1819150a4fbae3f75340ddd4f854231c10828f4ccf7ef21943c398f7cc2b4f7e09d7c455cd40a8542a10819f1c44147a8bb203b8b1945150a65a41388c6e0921665337eb8543c30c209eb424b1ee27adf4357a1503030b289fe3f8dea28422d2c2244c8901d239af0469bbba0d57ebe5c2a148a8f1e0ea4d983b840082399e8a3a670314f555a911f66fce841c68e0fec28830785d282114ce8df6da3d447a776494c18b9c4f95aceabd3b27dea2563c412f6c6d1ed6daf0ceaaa5028690c3143c81011a431a40c0a8f1a5218a944fd41f47c0cd51fd754e9e1418400f90085e2418400413c4c3042897ce37c4ea174c86ad0245232ce5c0b1fa4e8d48af8087e441277b4d37ccf9b31ca5a414538073e821c8c44026f3b13de2346fcf8150ac58c40e29821fa3c2ff4ed45d030a3081a642c238fd8cc7d44dd93dea4318e40bfcb7a2d5c0791c1462c78683725ecb6051d23963ee468dfa04ea9d08100610aa5c62f4616c17f7f6cffb01f7b3b150a654411c711b9a305711b658466fca810c1400f821084314612b1c687d82a97bdea74a5470f1f293185d2a3c80f1e52860388d4b8c508225c2df73827ebd5b7fa60e410fd95ec30aac2c4ee06326288459d16fd7ccdcd5f15e2ccd965c3c629d72ca7072384a84198148c08a202a18111407460e40fe9ec39d7d2b80d57f2033a09255d34adf0a4a5fb50ba94e7d5253fd58777d488c2081f1021eb433c77ebc96f0fe7ac61a01793b6185b84abe8688542e93183113df469dd9b838cda5d9a1746f2b01cf7d4cedcc3c33ee7b2862661d23ee60e29a5744cfa85ef1366b20362a705cfd3a753b7a70e9ebcac11e192f86f0d053ce890890d3244b5641b2b3407ce5cb5a3da5eeda987302207f33a7fd8a8758ee73c1889c3dda1524c984c4f7982439ecfdeb4de56ac89236f38963ae206b4a5b7582e5a06193e69186903eaa2b5cea569b82486c2081b8ecbf194b29b5af2ad81371fe9318a880bfd8ea8c12eb5d250973a82863ef54c5cac31cdb1e660e40cc97b693ecf4b64b8dc0ca6d0be14a54c745bb00c6797673ee7f0cc82db1f182143161b3addfec5a06af64824d8c1e38508a9518591319c632a33d88ab890d388181654bae896450b197367240ca7b58a0fdb7953554606236048b8f5c6bb690c196f91912fa456f2ee740cb2b3bf5e487feec3e3e273b47fa40ba7d6de8cb7f80c7d557161bb12ef34aafd18d9c2625bc7cfe6149b945f4818d102b22a9430bdbeb165363e8c1246b250a96b1694bc35932bab092358b85ab8b77fe1b39bcb3285912b9cb39825265b4f57c6adc08bfdb28b293dfad45c05d4cbe9a27d7f5d98b6861146a870f21417ebd34d67971a9942a35d7ced93a1aefa6961440ad708d597a63ac3d38e429925b92e967c59cc829bc60814ba96be842c154af5cc3b788461e409dbb89cac947b0b1fdd11279859f464e6e622ea4577f02042c46bb061a40928996d539f96fb0bb211262c8ff02c98e84c8f31686409db89ea2c970b65ddf1a8c18812bed1d22c9efc9632ee434692f0988e375be2d473ee150a85481a6e020a650409ffc8af48ef8fd1727e04eb836d0e71dbb9b469c408ff85a8d372e6506f8b71d069263f5a3a9dcd12e3b89b356594503ab3651895dcfa9977eba73b8561b8d4fc1cccc4c43ec1683e8fc6d829bb5b1118cc09a92fe87423a75fdcf2bba433c688baf6788c61c317cb2ebc69e75c523bfe5e147ade2a4495bd34332f0cebd16d477b5edaba8b4ccc6fd64c7ecb95ea02bd58dfdb2ef9522673e16a6b7c92c163472685600336707172fdd4fc1365ea82b730cfaf6539998ebe1bb3454a9856c7ca8c7da86a61d6e8e2c7669e5a0bfa800d5a3cd7669a47a587cb314282cce2f0f2ef27d9594509952cf6fc23de8277ced08985ddb135897bd79c9cb0f8cfb458ba714564f68a752b46898e49ee4d8b2bee70d125cfe55de2f25620eae32ffa65cbbaba614542282d48794969156a693b25f7b2a4b496aa305987813f86b8ffd8f06214bf52e1983c31974543b68aaa50f16b5dc6ce2e87fefc140bbbe562f2bed1e1ae290ed5cba0d4630cab5229b8da5342f6778f69460abf52c45e334beeba8ce2b017eb265ce7365d44817d363fd9db1c2a463403c5a00c1ba1305f7e67686fd182e78002d9f1d5cf2aced30519f389ad4356d5cbf99a614f9c3f6656c83971d9ca4ea45c5eadd3a2d57294559ce064d2275b6e5f509eb38973ea30a08dfa701df26ad6421511d8d0c429de5a1c35ed17eecfc4a6b48de9f4e4925f27c406268c2ffb6b770ea79f3b9758aace4a352dc9659856021b96286f57e4bcf89b9eee4a6cdf49d665e9d0ec9512cb8b570ba36e5a4ee2499895a6a7f4059dc5b524f1085532a952d1e2e791a8c5334c9ff4cfe94648989559e684dd8fcbd947a07d9e99e47ed62f7404ee572e6a860c1e3ddf08dd93897031fad6fdc6085f3e87f8d1a26a3eb7083f84263b314a85d09c2210d92fddda6ff0f4b1441cacc340a666fcede48e97ed061169317392ffd935356dcc218ea19a93cb63faf36386d85387013b4566d9d17bdb398642b11ad828c42d684d326cd2a93b5f08d1e88b26b318fce5b9cddcc620d02ee9412693d1e326883bb470425fc8d7b4530562b5fd19edeb21ed444058a7fc5d1c2d9ee824fe83419b68cc25fe75d35f041b7e30e6fa381d3d3ba84df601559f84f6b78de95aaa42a1244f445660830faed9c610a644c674ff1e54376f153ff92cceab07b3098d1e42c6af0a2d7940810d3ce4a9c380fb1d3e5cd05da50536ee807e8baaf94fe7977d21a2041b7658f8b42245e7474b2daa25d8a8c39dfcb5253142cb7ad1414f1d06b6965beccb73d12b7b5480021eb03107343657a6902f7a2d72e85554e79873f898b17f1b71d84f467e5435e7933138fc3622735ce6ce7b558542e131c4d39014c4c0c61b167fe34bd5eb2ddb960d379061a30d77ef288fd32f7574930d68ad8dfdb598eebd3d828d352c77f2739df3a44aeb6ab0324b61e068a2e5e4b9dad33ba622031b69d8af5b12575a1ff74468d8c50531f5fb9b133a7668ecc0c619ced561007ff9cf3a4913fdba2b144a0f1e67081992289421455860c30c56ddb7a4d36b685858030a36cae08bbe17a74fe7585b150aa50708cab04106e3a78e41dbec4c59e503790f7c74c0c61836a135e850994bc9b089a16c558f37af531fd74618d02faa849647c35d58796c0c1e1fb00106e7934853791331b7bf80388fe9c53a539bba786141a6974d9ada0eea831d28838d2eb42e65166467164db65b830d2e9c2f5cd0a0c598a594090b36b6b00935a5f2cd2e377e5a70e335abdcbb9bf69831d8c8c2a393a7b10c4fb35b9a0e6c60219d53c72a4f617f99b17185ecdfc3c5d76eff0c82c18615fcbf0e272e69e135fa62b05185b48b41b998c6921923830d2ab8ba9f2531753be9a90a8542840436a6607ab7f9ecdab55963869cc186140a3d3a0713a3ab84ce4136a2a0267d66a77f73da4e031122c40536a070322de9e84bf9234468e3098b7a61336ad0d2c72c73c186131a0d2f86cfe28b8d2654c2947b7a0c16fa5be060830987b9b9b82e8ececb611b4bf893fe90594eba417b5aa1508238100aa58810204444604309a766d21526738c9d85cdb09184938bab235747262dbbc620e1cfb2a841cb7ed559ce0c19368ef0c63f5dba363aa95bc45bc0041b46a8936951377b94b138152371d599a3e5e5ac7d29d42046592f28112be257f74eec950e0819410d232b2dea78d0ee7c8f2fa18630fa58e11d4a2d4f6733186ccb17dada3746dd91083580c16b85ace897e4064fa5a008357e91b835357d31194d86d318522448087cb18ddeecd29e4a7e877a71b4f7d3a7636e318b660835788178bcce7a974227f184506317cb3966fe7398fc0fd78e140ca9a10bdcbe4a8b496c16beb44da8910bfd6baceace67930b5728141f3908f2c305357061ce2e7796e489e8dcab42a190a0c62d728fad1f17e3f6ea57060f20356c717de67039ee93a98d5628940f94086ad4e277c1d447e529ff60522855b438cd3b5563bcfc552673841ab3584c9e68d93b7d9fdd0fecf0c08e0e5020063564e1b91c22ab477907158a85e3b265acbfdeea7581459ee37d37df09efa47c05e25d4a2b5bf7ad4d6b1ca1862b4c635a8e59dfd9d1592b0c2e6243b6ef8566fc851aacf0f25eaed9983fa6bb5661e9e85bc8ca3cbd1d0c355461fadd58a274cb92bed9851aa93026cfeda07b9309cdf1420d54f09b523bfc6d99fcdc29daf8d991994db8badc166a9862cd1feb4bbf9845fd10156a94e20db13937dd6d672d93508314be24c57ff384a96b96851aa3c845c7af8eb9ca1caa1a55a8210a2e4ddcd44df7a4684fa8118ac5dd1b175fcae025ee1ff81843dc07424e70354051e6f47b273d3c8b56e2d1353ec10b234486d0f7925e318f8d91831a9e40746a7629debd33666b20a14627fad6d3a2be295bd343410d4e70b741e74f2ba317be0a6a6ce253def226cfe14eba6a35a48626381367992a6b8398d803130d1eef2ce0c1831a99707bb3647ff6b9ad4555983079f2f5bcf9a4cac96a44a1c62552a395d1f4665dd1d412bc09f52d6f351d345b8932aea4569ae879480993fa92c9356bdedc7b125a65ccf183f6b817fb190158c7e635393a8b961ff210332f476d31d56621e9c39f7d3a45c9cb1f65e7c31a2c3556a8ab133522d9433a88396b8dd1748ef693e8413bb57d779e64165324c94325345c7ffa9a9f198dc183040fc575182dd62d6d774a7287940ee6268429cf9aa5212476b8b4fca525ddef9f47fa03923a24bb64abc8d16ecac5cf20a143df9f6e327ccd29fb0c9239f8d52ed6cf6536b9190d12399c9599848e6949c6bf5448e250caba20c654c72b977d400287b4dcb957ab93cc5792bca113d5e6c17ccdf48d246e6845888627dde28d46d286e63d99aefeea32b77b88a0033c7440c2863b4dc54bfd20246b4034455447b7070f29f28310ecd80104087f60070f0aa5061648d4607437e5e1f35f625685421922e40c1f67b019202049c39ba2fe5e9b16ba63854219e2690ca15038408286a3660da7bfb79649ad909cc11c2f35a597f4df116a81c40c070f562fc59f742b4f1948ca80aea7fd1cd3a77849130309190a2d9b8531939f2f9e46911f6e2019836f42078d5fc26ffd42038918103aed994adb17e76538908461fbb84eee1f5fd6dbed4002866c45aff35e2ecfea19245f58d01d5f30e5f1dc4aea8547e9bcea24c4e8cec703922ee423bd4e457d668c5311122e64979dc399de7f59ceb790ba6cf22c8667f0fed120d1c2da529d16b5e50eeee23f20c942a926e22fe3e6fba749b080a9cf295e4793b2d115166be3984e227499f6adb0698c31ec3e57a891a982fddd995532fa576f8c404285aafc4b279784d43add14dcd9d3f8aebd1f1b2391027262da820e1d5fe6a202491454971b99b398c5d892788881040a49f18c9d6fae51059227a0e36d6b6de824564a244e28db3be64f6e4d38fbf6a60f111f944b226182f1a3a2714b6ec830e1816409762cd372f28d3b2e79f240a284648e778ddd596a41e8788124099eac19b971bf9e3c0709e6d4aa516d4e9a8ee117488e90a6ddd42cfda93239320389114e6be5d6a5e3e2895f8c74d078bb2342b67c3131da96639c6eba8d15f261dc6daa43ef95ba982a61a0643693164f2683fe8381de1b595a90933b6d0103d91bf3e142e8c9317f81ff785053b5119d7d0e387c618eca97de4589cb31ee85e19b36c8d96a4fedd2061cbc4849331b6d423e5bd8c8806317291dea565c0c32a8fb74719ddd69376bb92f83ca802317a60c27b6e64d358587061ab8487c67870ca6f3bb87068e5b209416a565598cb1451b3ade82b4eb6cf3c901472dca5c5aaebab10a3dcd0c3868d16831b36cdcabd511cf806316a6ee90975ecc51e3595934a7a5eb8c418cba4de701472c5c1f2d6896f4c57634b901072c0e42a97678d0b9233faf405a796bd26f23c4ad37e0704552f49bcbbb20b55546038e561cb3b8f97a364e578bda01072b9693523b429aecb5fdef806315deb79c4c0b2fcd9be655619bc77062ddd6fed2a948c6533fba41a7129a46c5a6e436ac9692f52ce7140999f6b297e7e85f6f0a4c9a069329bb617757709422710def9f654285697fe02045e673a5a7848a08384671095d2edf196e7fb522e0104532f9cba36549c7387228525626ad3da8313941e1a67f8cf11b169b858780e3138d5796f5e83d1d19c7e189f643a70cb9c1eaf2d3896450a65bf3888b734269e0e004271732d5e8467d190901c72696a5d0e28d7097e44777080e4d38ffe971c3a538177b1c9938efabe9a9cbbaea15c18109de6eb3f3e698cd445a2488f7e012c99be89c675a73af0787257c9bb9ccbaf153c69c4af8eae1b222a3c7ce5062f5d07b233eeae9c149243273f68ff167448424f196f8cc9d44ef42d63822a166414fe8dc63053820917bb6ea6fcb396ece8fc0cb4a78d41c592777471cfedab6d4ec447bb4116db5acd1d28396c24d46f866f2eeab9be9fc2591a00749c0b1885a12211e43cb92788b1d87224e61150646802311e82ed9f0a7e5b2b745c47a1983a72ff34df7f328e22d48c30c336a5801c72150da99f7cb3499a6d7105fa7f2f38edb69db2dc49f840729ab73e5e91102cf3eb7ac9a97640c12048e412c85c7cffc51632b5f18e0108415a75d3c3ff7cdfc076231ccd636dc6efb9a3b00c167f62c28b171398b08c71fd2325f3ba5aad974d20f8e9f38f522ddfb5d10471f98bfca2f6dc2c45b9e0fb5a0dd1ff3c4a39fbd87cdb54f9c12b31e0c9f636bce7d3728a53c2c76301d23f6aaae85f150abbcc88e9071ebe33bdce9df354b76b697b4d8e1b1326be13cb3e793a903324b2fe698fd99438be8f0c88fdc1f17f635ad73f8e435ed2a4bb4768c1c6c51fec558fbf36db1389c64d4d196d4a6f076b9889381030e76a9aa35a5c456eccb1b963a283397a4a76c41e4867d74eecc561aee21b781cffe3da21e5eb80ad9a0efbf58f31bafe12c7772316776316b8bd450a617fc7d6ffcc2e571a461b9462bdccbcf5ed8a001e922a6264ea74b425d010ae038c3bf717f638bbf39761a8719ce21d7756aaceb05f180a30cbd28dd2c6ce94ce9211d709001a91ffa33bc20c466a931a43dbbd4262aab67c53ee010c3ad1fbfb37895afa7c4431138c2b0d8bb33325f50e23c060c68ced7314773a945d9a380e30be8aecd71eb3c777ada0b5eaad966fb0f1f5fbe0bc7e7768c372f7a8f56080e2e2c5ec5877a499e14b5d9422f09a163f6fc0ee19d1610275a62c7b3fcd759b290d222ec64e5bacb921a0b88f1162174d094f692aec0e79c6ab57f0c5a6eb142b2055f719915b1707154612fbd7bf2a30b9a4b860ab6f8d6394a08a1c5bca66069d097d53bc688eca460078552430a38a48056adbcf586d7f5320ae8aa9297c4b4fe851d0a693b99e64f888dbf88e3097f922ea7fad272aacd359080c309c81fd51644a7cbcf198e2624f45589119d5a7231d4821d65f070030e2634f2e13fd25ffc24a43896806b8eb927846b66ccf0f0010e256cdd21f4c5cec7c68e018e24586263c85caefb41b421e0408226ce65d33f2e388e70de13ffabf1d65d5a7118a1eb2bd3c2aeb8a0457ba318b98712e2aa3a73d0d2c438bfbc5f7a84cee2199dc28d61f426576f57336939ec4280b4c08c1bc2e84bbbc5f0117efaf41bc140e6cdedff2cba69d08161f664a7a5167f648729ebc62f9ed9b05a7b69e3589d831bbe40735611b2a33eda97150ae5462f98b30f25bba2a9057d05043778f1ee7e4c4259e875ff54f0c62eccf67c7d725dfa167c5d5419d79a05cd39ae5972b1695e56c60e6a3c786ee002fbd49e749673837ad02d16735dce61d23be98f0d71226880c005376cd1cb9e74be1c37bee5238d21456ed4e2a03c6e4efab3e44b322d7cd96466119fb233b93f880851c12c521a4ada7587c89b87042830e3470e6ec8c2fc1a77fa516f44cc5f881bb1f863784145e98d329999551a6e821d05861bb0d85fbafe767dcd628ba1507adc78853926bddfa3bf25d5bbe18ae42839a77bd30a4d3d77a77e109db41c569cd96d69621d84886c1599f86e519412f70faa2afc184ff3cd889026a354b86be65f4a5bceb2204645baef49bc3c473ba9d58d53747b32e44b7af83d5303374cf1bd7f96afb6b4c9124ba197d68d51d464eb662b140a29ea9c5ddcd85736aa592a144a62214028941e65f0586e8c424f51f9e9ba25a1da240ac76c73d58e7b32f555281419dc08c5a285d6a41e5a102d58e8062896fae6b6f437c5e986821b9f48945b89ec16f47abb3ab8e1093f0b632dbc742284b64170c68d4e5cebc2b9864da1b75525c80d4eb0b3a9f7f19316f37536915e9ace21cabb3fcba209e46566a78a9d93c9cc44d9362fc8857fce9ec2446aa767dafe3b73aa2f510655fd4cca367a1663097d4e7bac5ec954a25642b1f46ca93bd57447898390bd1d3b9f96733a89cd742c53d639c8ac2491fa1b134255ebfc0523618bba8b0dc2936ccc40c2ef9cf6992d5958f78f583b0bcab49c7a6d568e58ac32fd9d4c737a988d309ec589ccf28ba14565c4eedddd9a2b4f5e5d8bc86d3f5dbc33737556c4a3bf2be4d77c960b4a845963d072e87c46b70e1156cfa8b76c6d42ade8105abee8bde94de4c8c710e9f5a40529562e8aed8540a87ccebd898ce23121d417f7d4f709f5ea6283488b2184b9d87983a72788a57859ec18673768f10f845996549d78519a467b00f19a743183b0def67bffb098b922d71e542d433fac2263f29276f5c1119f3f4be6b27c580a3999e25cd4ce35efa1fd4a2b5d4d9edaa20774c5b4a4f9535e6a973cfc275c63bbc8d01c8378c8659d199775dd051ddfa1fe4d4a26f159cfa466874f7c9853e1d76296fa3af8799d25eba42553daac5028144a8f2fdca0832d8eba950d6a54cd3e6270630e7aae0b1526553924bdaf5dea5ad7ece271e83aff4b171e7dcc4e386c4affad9fdc8b2e37deb08dec8f1f329f43e1861bda72139db71bcc366c03b2d4843815fd9eb9c486646c31a6dfdefca535113ec387171112e4c61a14ad25fdad32e6b09a1a3675d9474b52a49b1c552894f7213e88f08d341cd38aeea6cedf7dda0d34145ac2d5545e0cbae58d3394a3dc4ee878598e61ede1021e428a042141de3043f5b2bc7caa132176ab50286798e1820fec3003c580c70e82fc688119280614ca1966a081851b6538e3946d5c965c860c66cd92accb73a5ade5c61890db53c24766bea876854219e38618d050daf4b667854b251f4bb811866476d12e4b9f07f7180cbe54e572a6a5c5a4e5bed0dfcaf677959a76c30b587698b899f430f1e98239338b36b976eb8a0bca5cb7a608a142985285422172630b9afea73d2d86c97cbb42a1144143880f1f5ab02535b38ee9b14ba77270230b66d50ef25e3f7e6253a1504a70030bbebcd6f2a2b61c5e5d6e5ce13826b4329957a1506e5821a97b2e6be765d6d8dca8026a1a3d7cd666e8583571830a7b9027c34f8bd864778542f11b53f8a39fa5ffbaff784a0ac8ff9c848e3f7f53a328f82fc6143e72ae4f0405cbba5ed02d9638f1623b7678e011379e7052d2fde674c8f524e38474cb62b6694b42982c6f34811bd5956e766f2b23135acf14b32a1deb345628144c11dc5802da5f4e5ab28f21427cdc50c272a1425db3f6976e2401a18350fd9e3443a87f03096ec6e6ffce2d27153b100e92821d65f0e0f1831b4740ada7e751629ac95b6e18a10faa43b75442757041ed63a418fd7bce6269064de51b62e0d63defb2b0add5f2304c721f4bc3e7df91a911861161ec214be63d46df519d0a1a6604bf1863fa0a396ef1a95fbf9bdf8d5d3e911d0441a3f20121396c6198b6b84bab52b1cf83a420472dfe3cdf255f43e7121b2d721173ba5ef492962eb3b8a4b9a0936e867e912cdacdcda5f4b645a93116e9a0ffb3ba98cef49c1cb0384e3dfebfe9e478c5c2756913b6b9ff3697c31588ce2a2af573b698660fece8008f203fb8f2010aa515a8fd76d816cda0d7b3e21cddd9e9c1cfbbd4abb0ec2525a246448be854a129a1a23164f2965573a4c2cf1cb2ef7266523b2aac2fd32333f6bea03d85ff7286d813d9147bc8113ab42cfe5a662945228487b97791b1059b14084ff51c45b463d2c951a44d877e29635b4e650e51d8193a4b1d64f36a96ca110ab4ede8732f5dba4e0714a77b39645bf4b44e56a5727c6279737a3e2dc977b9a642a1f4e8b1a3c70e3b342891c313866da7b8a7d9be3989742299a49808ef98b4b98913bcd8f2c65231e3e7c29b48a6cbc26d869a58f296c2400b7264c2fbe095e9c2d2caac1c98683d3b33d426a5d1541ec87189b253b3a4e64b17ee52a900057258e2d0f0398e957013cf313cc85189dd5d74cfe9c5faf63c2590eff6db3df9939b25018f2241d0a8b460073926d18bf0f42583e967df92b06e9436f99e2b2d9da9489cfa4a4f33274d236e485c7e1a93d6cc66f9d467e478443ab74edf5fc7f6dc7144732f8b8b7526daaae4234723beb496e4cbe2e9947964442ec8e61ce192cc2c08881011ec20018f33980c0ae50c069263117b6bcae67639c6e00e86b0193e6a3c218722f81c2acefab763ef2947227c53ba47a6155bf314f90bc6c88188b46dc61265a7469fc69022690c294303390ea188c6fcc268cb12cb0d71082d8b49c6ace62804b3b1a5aeb12d97b5e42044d62dcb497654797f07815f277d1d449d92a61704aa83fe9c94c7356927cf1188c65a648bdd0222a54743d6a6d917afc4e30939fec04b3ae88dba9f33e1fbc1743f27731c79322871551feab3595f37e975e3f301a5a552efc26a965f8c5321c71e12edb52e662cff9b5d0fbbe7245bd67f25eeec001572e46129756e4c33df795f78609486bb696dcc498539ee70b60c2b2254b6b8faf920871dbeaa0cb1591abd49af8359eaeb18c37ececf911772d0e16f39c9121bbabe99650ea6daaa8b9d2583d68e1c38df97aed23ea78cc621e9310b2745bc7c9b83e0f09cf27de154282956bfc1fc235ed69f51fdbea51c6e6894385915b575f5b90d7e6ad72cc656883e9925e46003ba329f37ddab5dcb6b384793a7f7a47323ed1d898500498355c0a30539d490cc62be9c3dd7a34769b0c396dca42d8a0647b8385f7ab367488873495c28f1f099c50cbb28e52b5a7043c0c38c1c65605cba9222b4f5fb4d3220475e3c6f1df199cc3164265aea369ece178f3162409e9a6ec74c7b979e301cd737be32f3d6dd9e420e30285ae3754b322651ff0bebc69605518f592187171a6dba4ac76cfbbe5d406b72594bdca79914b9b08707212f4dba85e7b3b979ca37a132a885353cbb985eaa16c35a593878d29e3dd78e1efdb0809bf2aab00c2edda6afa0b84be1b22c5af789ad705f9a964dbd26ede457725481976e4e08ad263da89c830a976c6f2a9d2bb5ca9b42ee419a98939b2a29b86fea2cd5654167280a0b2ed797ea7f5313550d7240c10eb2a6b5fe9932664f505cce7292ee9e34f70424871390d57216652daf2ea69a80da243b5b471f612d4ce84609ed25e3e65842b756e7a5b427b5a7120aa1c3558b50ca9184cc656b1d2193d2ea0cca8184324cfce752dd163a9de3087cf2eb0bb9b72f6f7218a154cbd24bf1d05bfd2829c6f32d97a60fb71d8452042c78018502c47730648890203fa4073c2a25c4a83bd77727a5b784893c2814223c5450328c638c19abc3f247e95f1887f37cf1fd32994e3b184b42bb2c7cd2ff5765c5a004189a865797937c915dd62f16f7575f83dde7ed961894f8e2a0b4983786320b214d150ae5c77f192410810828141f3e28e9c5b97e3b3a9aa6f8951769f89c6ee61df5acdf45ffa67e267efed3f7125da0d3f7c60fd77ff1dc0a85924a729192f1563ff6ae86ac0825b8f0ed2bf3960add02d9b9e35e74ca6dcc630425b6c03ebf187b648eb1c5960a85d2c3063d2a40011a8c51520bbcbf2c45de6e5bd27b3cfb0980004143046394d0428ddf994b88121d979e85634279bffc2736cd8b2cb0925990a6849712151189c5261a2c18bd69da45d32236fa0a85c28292571cdde4bfe8828beafc2b25ae3896b24c8da934e668a950284172f08348094a5a9152dabf99a17a35324a58e1b7adc61db1fc98738542b141c92afa2ef99419bf13aa2b51852e977e5ffdb8981a557acca0241565d5e59bce6d2d6951549c5d0c03e9f5d2631f45bdd865a5e4148fb8c8f5ae8c295c50520a6ed7b3a44576c7299114ede675965d4b77f43b0a63e91ca3c8bb1c836f860c09010ac23cd0281105427ed96f520dd7dc84a20c737bfd9f614bb8a040884f116ea95bf972854229838719259fa842a970f5dc26e4479ed85b38f9196496c2ea2de9842f55fcbdb0eb36422de1049feb5ddab02e87cd6d13a88f979fe5f95cd1b29fe14328942bd184ed52e7d0a64517ecc20a8542a424136b349de66446555f5ca150887810213e8a0441a38c1d29c8400926da7bb5d7b06bde6206a2e412073917af66f3f47daac80f0f38fa01a405457e782007259638e674d182a84c42aef7924adc22d364cc71dd91021e44f807900e0841411134c818e2454860460925d27ffdb2e0713578ae26a1fb690ef7cb7c39aa2490ee9da92d9fe6117b24ce9d5fdf63be4bd92a858283124830ee5d9f7e5e12aba30a8552f208764dbebba465b1e322679438e2defdea921fcf26fe9246a4c5d082ba5688bdb82961049b3c897a59b896f2eb457877961eef514426da2d06cd0ce2d29388b2424e0759cbd4f289083bc8fad6d8f32d7852104a0eb160a74f37bca0bffa3744257ec4b33c56a91b2d84ed39690e1a52c3c69c1088d2202e738476318e83e8433f47f5f573f317447ea7dab999e7776b8542f151128875c5e6646c59bc2b35206e1ba5e75befa5f24f8542f11d7091923f3823675b50bf5628142794f8a18eee62754cb50d4257d287cbcb6d3d66cd9cb52be103af2f85f6dcccc1bd4aa3640fff9568d1e2bb293d2b08257ab0cb8579dfba3bd1e93ca0543c6a7f3497975a4af0d0e7d97029fa3467df3b76f0f843c91d3c4d3aac657c96f53f3bd8a6d5a48a67ef26751d76cffd164665e4f45da1507c206488ef60885f091d10fae2bd7f9d2a144ac91cb6cfa265ab3215a1463a289183498b9acdd3669f69ec951d257148c4abddb4a065b17b03874c8fd8a890f35ba77bc39bbba94b870f2f4255797620439efd04140a134adc703af7787a7cdef1ec2718620619632869831dba3a6d326d39f195b021d1185a16ad41a84f75a5073f7af00304144aa5c88f21ccc34bd6907ccc5afb2eab6dde10a1440d698ffe2a17a4e6f3701ab6d1a2bfd60b4a97cca3a16b9f8f315b8c663ed2681f6900394304256730e67ee566cca13d3533787f995ffecefb829d2565f04ec6ec1e4de42a6f11949041f1d9542d89e6d093567ce04186948c21fdd51d4d7f99259f188c2e6a335bbe131d9a9230dca55368f1c4ce57e6150a65074284547c38107e00493fa0500286c5e06160af97ffa3c8a82d979fa0e40b66414b2d67319d686c312fa45cce926e413ebc074084bca0a40bb6a4749f0921444be1c285448878329744dec8a7640b28b7ba5021e3eec68d168ee9529205d34b755695d291f720528285f52e8414f9f1fb71ef40c9157ecbed0ef9d228f1a20a855262054ee6c674a9c3dc922a2c092d2174d229fa473cc48ba0d1a3840a8dd87fe9d7f1b47c062553f8e5d6c3b23c7bfa78891412daf346d45abee359a1507af4e0e1409acb5012855c181dee19d26f3d470c25503895ad7cf67a8fa3b90a8592849227e41bb3201aec37bfb7254ef0a4b8756a49950b4255a150b852d20435069d4ddb3ae32b84122620ec6ceb5a74974dc92b14ca18254b48334bba84ea69f5584a28bd9224e8f28b49085da579a32e41c2af57c254e72c86edb0e4087926e1a73a59d6e65c85424941bc053c528911302dd76e654c1767fa622ccde89896beec416324c470ff32b894dda3bfcc0a85d2c30c148314c45b6002926124bb63aaf47441e77a302011c6dd755e7b428ca7f183818e413564be0cebe2090c73906b9bb3bd4f1dfa4542364b2123bf84fabdc7085eb0c34cb0a34ce0407a0b24be407adc347f419456e6497aa107fde4a37db40b9e23e1c5628bf9ec428a888f37c80f1e92cc40b28be2e5c6e675d53a272b144a0b4874d19b75fc100ddbe120427e40920bb35533e98b35092ebeb991a9f637bbf922b985d9743f63bc132fa7aa502824b6582fc7cc457559964356a1508608f1f101925a7ccac5182ace4fcb4923a18572592bdbe2414b2f59a15076808400691f3d82a4e0033b880001d2811d3b8afc60078542328b6f6b5e5062a386f99c93c8c22ca85fbbb0415f5c8d24166fd67570fd1c45e35ba150900a4440020b4be9c858b7f1745692bc02d3a695c14e3cc9d5f0901050283cc45d40e20a6496b342c9d0a75cd290b4c2b2bd9ef192e1f627324858a19d0b4237662e745a40b28ae51644bd9c7e55f469150a650524aac8d3c3001924a9e0a48ece6930f38d0a4850719886958b9653345fc62039456aad83d66a4dda4dc714b5cbecbd14b2fd6396c297c4e5be8fa2e3612545799d937c78398a452633ad1f93aed85f146b100b139919536aa130bd18576490e9f65e71800414bd6b8c9ab4cc5328cf27f4a04c8d0821d4dcc554281407927ef80822c4812412044901854264074284546a87a1008f33483c61127a5fd41ce26446b913c6144245887e30b190138ce65223347552e20bf15121c21524d984fee20821b7f9432839043bcae0a103124df0f76b2efe7dba0e9e4cbc3995e7b42b92602257d13025f724b944ee92dad2694d96f0f54fe3c7145502f7ffe421934c89af3d9e1c0f6ea2dd2399c42b26fcd365ab8d58819048420bb53f4ab4b59884160772061a65bc83004922e167f8bb77293f957e21814b4ab5cce9bbf825534611277206c923b41cb198340c9441d2883369248c8001c9224240a288a4e677b97d3c29d7ea8024114b7de5494d85b6b37307c82b3620410496b1fdd5f5e9a76f17480e918e6aaa114a87d36b9218624d31b6d699b3c8ce2944a334b61c34885900823178901042db515372fcb4545a0cc92016e4dfc57354d307251241b82523931031d2775f924018427fdb5e6a6d6b4a0288c24cc78b287d17eb21f9c3a2018b3068fef98ab2ea0fa522d8eb58e22f4bbdf45d22fa9ce1d294a87dff1911aa87d8b47207f941c40c1d8738636c397d6e504587210cb99add3bd785f8c45ab65442b97786950ef0a8401e3cab51071d84a8b45587cc94a64acb204ca23ee5cdf7827083fa0fb75ab2629302a1b5ecf7a936fa65f906846f5a1d83aadb1c4da8e30f8b313544899d522e0b0a493afce09659cca69af79eab42a104d1d18747a3697595f8b0d755b9d6b6ac077b0f5a55460f7549859646871ef8909974522e73eae53c683ac9759e6596ffe478388487a7695fd570f93b24423fd4684b1d35633be47290793fa8673926a58e3aa8392c3a2ce650c71cca68e5f265976f69580e575d872b6dcb607fc7a117739ccdb278bef8231c7a531df231e6cc257f1074bce1b8d5a0fbfba9c93b1d6e48c9ec89cd66291dd3d10684b2300d79ad4979c90633873ad6b0990c3ab5b89d1b3a5756a0430dcbdd317fd27eef365e49417e7c0b74a4e17c1a9e6ff4c619f9c040071a6ccf27343dc6fe52df597086949dd84ceeee7184a9063acc5046d32d6b929a1b1faf30910ec440471952a736b4a0a5ccf6cbd04106d44255e81ed96f3aa3630c763017c694e84bf2b43ac460a80c7a3ac3e53467da808e307042c7ad8fa3ee77bf19de021d6038bbe84fabaaee7d272f42021eaee30b88b26ba9366b4c2f390f10e8f0025f21c4a834f7185caf10e131544717f068f529427d7039710a7470e1171da6d44a997796b4053d2713de624e1ff5e57468a1dc685db3e13ccd721d59f84e44aceb55b8e0221d58b8ab4db84ba2ad19978e2ba4f2a5ccfede1f336e337458c1a4d7f2a8f5ff2c6650150ebaae19359ca7cfb25450731635a77bd94246c7140eef2c6acc691f5aa3951e3d3cc0838c327810210185f23e887805156133aea0430ae73852d34457c545a1f03003c5c07bf010838e28581ade526be6537cae030acd866f96373c0ee878427ed265293e0b567438c138a3c3b6957431b9700f213a9a604607138e17b72fcb23630b7aafe858c26396da197353883fe950026ef6292fc7ef2c6a4f0272c3edce654147b912128ede9e23a437b30717347dead0e830c2f9b399c8a03ebd601ac268f0800885528ce67316bf42e8cc61838891d2203ac790a361b02e653e71569a747d6120429fd40ebf8d299f9360b4f7727beed25c5f11187c9d66498e5c0ffbf72f7cf7e8d9b27d4bbd094e7ce195b237d1a94cdcda8bf47d6ccd885493417620cd0e0408e7092fbc5df1d2732dbe5b2922c403444270b28bbb72cfe5d30c22a3e944170b36ffb2f4b298f387cf87a8400a27b9e05c4c8b2222b4fa0985a4324e7061bc38de8296d4e8e416c676d87ccad2f2cc63eac4164b2e57b5c05c4e6861b998324e66a16dfc07f96d39ef9bb2e0254f5d3a36099d668a45957299a592a341da0916b7a0950b4e5e8167963b47edd2152dc815e8cfa6e5aaaecf1cd4150a454f5a611223354685bea0f93961c57576be49c995cfe29eac22f1926d75aeea2c279d2a8c5d9d549a7e693ee6d3384905b2932e9f6d296bf48d0aef3e3f857daeaa594f4e8116d3a597cf6f37f604c28929fc70f11bbfe71de3884209c24929527f2f9dec28211e5563831352f84173babc3ff6a95f229c8ca20d3ab91cdfd98928989fd1d1ea3d739f2714c6f5f9d399a12973d48313509c47f35f7d47c6dcd9278ad1c96737997a49dc3960202280c1892752a5733d84527d6153428afc680aa5470f221516f0189282223f3c40a114f9d14338e9c44183eb6f9e8a0ed339e1c4629c975a54a8a8cbb889c40925fab1328c3c97134db03ae2a3cca7f9162d138568eaf0fc7f11b639010f324e309177a7b7bb24de85d38aa021240d3e81104e2e919bd418d7694f77ce2a8a468f34dc0415223cc68e379c58a20d2e7dcb41dbe70ff232227052895df6243d8eacde721125d062504f9bd6c5d6cd5428949349a03ac8d7b0fb37322975226347193b4460821d63f0f00008c8e0c18213497cd24ed3d637dd5f8f84a5614e83b920c472ab50281500c10e0af038c3092418ed9cdf31ba9c3c622f8f793667cb591df71f43ca48407e543ee0831347a42d5ef69c674f66a71ad1c97f4ed5f0a12766469cd3a6cf0cca7cffba4ae56411d9060d4abe271dd646830891223f78c0e044118cd233e5b94aea76ec2411f77bd9b61c84307d414458b2652e978ba6269d43e06771f5929654b4ac1a2261a2f7ea547b5288f3aec6cff46d524c27842537834b272e3cfde9638890324e0661f9081532366aab4195119c08e274c9b31cc4bdff431e084397fe76ca00c2524a667b59ec6e49fb0a855224889b31c6c91f3c4d8f597f4abc5f7e406c96b34bcf85cfe5f5c1a04e9de68c9b5ffed4091ffed0eff8f3fae1c1933db0359a6ae553277a30c893a75c9468bc1c2c83470f4ef25066594a1953291ef4cdd95d787533cfffc91d0eb93efe99c5dbac49214f44880a2a457ec0400627765830dbf052a6eda40e07f5fc9b3246f58dc9133a946ae92e8bd5a269ec2a14ca1cbcccdeb93c35a1abad50283fd0891c10ba2e897cd01e7ce43d869841829338d4bee9bb4c2bfc420b87bf7410eaebc525cfe9324ede70d2a94a9d4abb0c32ad5028163871c3a7c9e514e23c63b60711ef81244eda70b9746ee7722a1dd9c07fdd759ecbd6f07f6acf31a67408590d8ed8f55dbf7561749e866dd7e57c2ebdccbce9040d7a2ed1e269fd85d3e5c91910ad7ff539eef9e7d80ce7b0d6781f5721d53a29c331fe99b624a65df43a21c3044ec6d0277d719ad4a7cdee9f88c1c78f331c7012061444c8024ec0d09f0617d6c34abea9abcad861aa0c0af0584ebed087dca44ea77917bdc4c18917d0fb7f555717a737da853ae7720f1d45ed7be5c23e967135dd3eb3b52d2ce0440b6f0ea7347df563fce7240b86cd52f726dd6ab32d27583088b5aa5c2d352f5f5758b4ab4d5a9261234dd6821d64ec2883c7084eac3080932a68426ed0129dd1bcb2d2c37330c4c9a0503c07437c0c1ee8840a6b8ee69b2cf3a82973328593d072a8eda04bc75e4fa4803271ab399a9059a34486a0817c08910b9c446159d8f3245d32f516a20a85628603711f453c0727d831060f1e29e0220c02169041068532c40c334eb083043bcad8d18b1328984106014e9e50c489f8f87146070a70e284069c3461d9fc49762e3e6fe6542894139c30e1d02d06a15b2c8da7ef25b42ddddd8b7efd31149c2881481abe83079c24e1cab825b4a6cfe286ce09127e9cd181079c1ce19c18010226c510800931ce4165a99cf7ce570fa30e2d7f0c91b33082e1230126c0c075747e79a3b92cf2fbc5a13c35fc32a6dbb6bef0f1e38c0e78b3070860d28bb346a8d28234152fdd26bcd852633435cb3e9da50742869c0102935d787b7aad3bc9fe1ce6fbf01e65f0f01f43cac841101398e86241e634e3f95cca4f2e2660820b744eba83c98f06198246111fe223c8fb308308fbc0870f21453460728bae3363e9e7e71a311a135ba8492d0e60420b22fee3c7190c3099852c62018b84d062b9a4651b5b4a935708790498b8627153c3bb9833b6f3df8aa3ecefe9c77a2d65b262153b4c54c16ccb82eb68f68fd224153e1660828a08989c420226a6988049294c4df2a327a15dfa9509298e36b29db3dfaa641e85034c4441840126a12032440811216318c004148b3232f3e35a446ff289640c17fe225a25e263e289637f6a2a148a492730cfbf49bcd4b2695860c28905d32f632342957b02934df8f871460760f000134df82da650b3994cf3a92b2f30c9c43ab7e6f109f2a35b6082891ce480cbb080c9253a2f21f7c36746f32b128411bf8005269648d58bef9a74bc8db93302934a10a144e3e3e2fa9a18e92e5c41144a0f4f3f7a60059349d8a6ee25ddb7d19c2c1349247a544b9aa4e83e97ae5028424c2241c40126904880c923fa72c934650e8308f901071347f8508049230260c2084d5f4fc8cfccfc24adf8a814f9e183333c21934510c044118cca38b3579f6a4a9808eb73e3ce7e129a5f2a26881080c92134a5254fefde9270d12a14ca182686008049211e9d5a50f320f74b2749c18410c8b1cd16eca57c0890e6327cc02ce080c920ee0ebed14ad5a990c90a084c04515ce79e6d87f693195e8404144a8f3478c8900e7480078f14c48bfc2004140a0fe42fa05078f8c02410465ff36bbf172f73b2925c4811370104177aac5bf6d4494dcb10213e3cc80f20417efcc1a02db8fb7dd2ffe2ba267e78f48ccbdb52c8a4dfab50282dd851068f22de820a111e634dfa50dfe7fbfad2cf92a8f890fd5fbd9aeb76e82bc88f1098ec41391d5cd44eaa4693eba118a1de1ba666c4cba6c0240ff86d85c9dc524679711f3d4cf070ce9866e4fafa8c0bfa8f216594617287e4a3877491d7825c267658379b6bd4fca57c774f42506052876cb3a810ddc1c570ba272128a0433fc22f4d6796b394c64de6c027b962bf9b9f1a3e1513399c450da14bfd67203ece10322405a981491ceaf04ca663085bd1470ac23e7a207f010a820c3181c3e667fd39665dbcd20a85d2a30528c081c91bccf2fd243698743927090932060f9484a08042f17106111ec8c40defc69bf6f81b5dee3807148aa3c1030741084cdab08ff8a6f2ab5262e3950aea71021e45d020c30320f01f43cae8d4a903266cc04fe73be584f0ffdf640de7a65411257a35e82f6abe7a9c4e1ee78a491adab0a34e6fc7b94c1e3434a3d38d9c8da5aea633a8dba6d15f8ed3161333983ff5a626a1fd49f53264dbde1994d4d7fe8c0919f0da9673be75c780345f91d5d4440c0b67d9f2fab987671286435ef650f1d93568bf42a1f4f02167f828828610a6507a78c2040ca5d6e8cbd28a4c9ec40a8522a4880f1f265f284f282d07f5eb15625628942b9878e1bd11be214747bf2d2b148a9a7401f7eb24ca638e932fe5e30c34ac60c2859378265bc0c433d142b7beb1e15265927ba95028144a8f34fec71037c942259e09163eb18e295e9eddceb90286053bcc0a761815ec3029d86150b0c390b1c39c80023ea860720573f79c6a119bf105132b9469571a5a12f522af1c9854a1dd9793d041646e393423d821821d21d801821d3830a1822da25cf29894779a7b0aeea8d32bbd31d7ba6c220573fc282db1eba3273389c2a75b70b9057db92a642878ae39fbcae6b7cbda1378a9baf7c5143be19cc205f3cd9e292fdb05932624b3e6667f77b1112d13ea9805978410a745b97109a98ca7f61ab712963fd98b61bcfc378992b0e9f14ea337a9ce929a20e115794163b53539c269763463b72c9ad6bc8911f8f89bc2b3b8184d7cc5c07eeef6a5518990831885fcca2c9b349d8c9d6318c966e8d03b1aea7be321e483e41006aba76994b6b81d9aac502839827187192f974d7d20073052213489502f35caaf0a85f26348911cbf408d6b8bdda872f86299d1d973b896d7e2a542a1ac20472f2e3deaef41ed1e5c8441b0e30c2623b92c72f0826f753126a172e745b80b4bd69d69917fa7a49b43178e576759be4cbdd7631372e4e24d3b9765d1f26cf9d1420e5c5432abff7232904da82452d368240e05438130180c0080418eb76e00531108204844261508c401a95ce0e6031480013f382a5c4a222e2a2016209085e2903028100544814018100a0383810c84921810e354f6dd215fcadef591a52fbe9fce4b0fd0ccf3506184b1511efe76371239cda16fc7bdfdcb70b1403c8e0459b523af618b14e19f3e18ec2b11ee09a816d2c32b70499648b9e245aa47edcc32b651e260da1433c62d6f29af5a2a9233f53ef3465d36ee26fca4b0b711be1dd36e8dcb16d33522fb51199a66a761b8d6963a2374e0b987aa3182044305cbd05f5ad8c156a50476bca58d4195acff6f37bc951cb5ccb6687a4544ac31fe60ff1efdeffc6d859ddf4e24129bbbaa92498b4dbce1005f7b1fdfcc44f66b6bc685d9c86681d66a801610741cb72458a72684191a240d19245916574c1ab0b780289290b15598e193cd2808b63b52503880d78a3422578ca86de259b6bdd9a2fd79bc32f5043f9af0479756d3b7ef19ef1c82e85eeabe9a67881b0d0a56d842d3509f815ef1b1bff5fa0787cb78d4a2f1b11b3fd5413bae30c345ce0e7b40950312a334c9d34c467c2048bcc8f0c186e50656e1cb42edc8a3b6c11f0c2c62d443e020d4440f3040dc7510d4b7811f928e69f78c01386104094fb24b74cabe7017a304e06ed466477a78e8f0ad3fb07897abc177c3e12f16c748af4970393a58035416a080feb80c72e9a4eeb380a08668ba0723ead37fe15290e18b83e0333bbf3ac86271349640c9f682972c333aef607151c0d6a564401e8fa524133e04fbbdbe1d1cf30e919d0d0084be85ab2f5281cf50efdc0ad24c986058df0cce0b4250dd305093d2e77e296f77942ce2009033910ec693b07df50dadc488d06391452998ba296e5b96ebb98b9ca111299a3ea8c4f1d9fb27600b0997d4c76fbb26965b93f0135263d9b896cb548911bf63138083a687c055dbaae8664ed66ccb2d0b6e8da6511dc737751f794a952d07e5315381ac3d14338a860e9bf0a80d53b9891a964693bfb7327f7a3355dc1ea3b8177a1f0a71f1ea82d5ecbd60356aff95ea008018e92a5e5e78c0178a2dc0666baa007d3d7b41750aa5fb338052318e3d64eccd1e3017b1a18f273b909d966c8df36272701527d348b6222e8ef3c446c9089110cd41203f41aaf918fe6c3945665a88a81caf6f2b7abb1eda402f8f3f884a8705ef8643274142e9e40d9377a21fd46fd8ec4f2f8460cc1fd24e7df326f7981b7209853d69b5d730e338f09a7bb49dfa8bc5d659b509e954b22a4625867b13d4704ac3feb37d0368b7b0d71c1bccf1df55ba0116093d9b11b0492c38624a0f3534e03601d231fbd43ceb13e31e70ea0358e796a78816cee47a0563370b1a8513b8446ed2ac73097b231fa562bd44ed1a56e89a51cef1f993233065e131fc2abe40eb821a8031c059c52252450c465cdfe21d1c8ccc5e729d488c3129beff26ebfb8d5ca617b8997158e43df74318ef6c049ff3d1a733f74c6a9283fbc24e0b7ef2e8ee9fc369cbf96e28edead5bc7e27f117dd34b5c69223a0fe6681defbdbfe8ec2eb85410ef052de99ccfc8ecd373adbcd8b6c91f36661cd08cc5928a2457dd8746e2033fd184793e04ead26c0fc13bb96533837aa85fda5a0d24b467e9b2110f2ac919cfae71d5df690cb55b7d71816baf584b1312b169ca6af38680a44fe5c93107b4649fccb117407e76ce18673b090f5184ccb04e949e5d1b048083f5462e2653582a3e3eb4228cc9e2a644c625936c73fd8217f74fa2a28108a49a5f8b2d4197143af9535671cf774fd9c5e3ceb79221615a047fdfbfddf090956288d42d33051a7ddf9949384456d04756d041c48f47249e107200ccc185be60793c4dee010f153e0d2f3d0fba9c09433ea1e744f36f94a4a6b07d53553c469ed077b286f6acb5a2136a1feb0ab43524fbdb97345a2d9a0360b9d79e3a8670de948a522dc18caaead358425492f5ca911156ae0822b0e62caad328009138e2abd23e08afa1ff279bf571b696a009d7f82e725c2fee01f4fb171ea16ae24fd0ef2c6de56191f1c21860dc6068f7b1698fb08aeed164f15647aca7d7435013f8907a78c57db7da1ee6f9b8de91f218550f6d890dde39e7c98fb240888374cefecf3f5190f83893c892f3ca078e85cb9475c29a3df719115dbd9469f728f7cf3b709a8503dd3f728eb178ee1b2d44136e1a42f17410596c7e00a0d200d0ca275a21dfb055c9e65d55b579022df263b6f17cfb12de3f16799e17c9e38298e79632a17e8f23220762cd52b48b516e84655115a7824bacca9059a9e213689a7a0f4efb9cfe9839317526cc37b5c5c3c2ba950a96f2dda03c40a54d0c07adc36efaf7871e305644408a052e3a6245e392dbaf50eb03f414fa908df950af725c896f607d8c67c3fc8d22d54476062b53c22ca95f98d5a6814a94c78d707eacb8a7f1f72fbb33e58e8997947f7b244052c68bf6b59a83ba64ccdd3e4cd377a7906b31de4bed4de66ae85e0cede8a177268909898207d6afc85d3b9ba5149bdc8630132f5e56a1c36fe528e525aa57f8ea0d90fe372e7fb780bbcc6950c202c45137a3043884edffba31268b643eaf4a23b228f5d55c7e838dda1fb4da836d17030714858b1e3b8a2ea46f14e91d7ac40a0290bcccff6c804ebd67baab41e41955e0673bfa49a75f8385282d8cba42abb9c77a4f4d31258f2ab31822517e9f3fe639da434a911ee263540aff53f68c3ef4b2a70b79e3a80d0c401cd993b8562d37b051902e4b90ee44923555dbb8f5dc0291b11534049126a846da04bf8e7140440db12b06824997c8a38077189ae41d341e7a20da8a02773888a879b0d284bf052e60d2c8e6d7a48251be8b0170a60601e9211136478a2506cc52f788d67ff725219d33838c9ed86c2701516960d8d1962a9a8bd233a330b8155d2c046e2e6600c28bb9bef028abcbcb892078a587282420bc221f968a3a131091ed8e0695dc863778126de27454fb35298ec02da67ad9077fd19beb5edd073b42eb22e7b944c814e766a3f90151540b9d868e76920749be47f0124dfc15578e54dd56ea15632c234a8b97adb6eea87f2e5e1ba81aa2ffadc5c3f719d2da5215051a242b389a2ae7b40e750089df38bff4401ab5ec533c0466c26519440abeceaf25b3209e8391bd6ad233801f822c1f13d2aa5ac6b65fa093923e680a071d67f2d4d5977c6a3c256b38278116d22026a4cc0b7cb62de3c468648fe6d98796fa66cfccb7a13c9e41912d40c46147a260801f6a0ce3fe85983805524b6f10e348822b44141c30b812eef3f76c9f1be67260923f39535a223a969eeb2ae8b642ee9b6be911af42b2c6e007a2c442d99167ab896024534fa450eae0d2a65761e40cf80ebfa79b65e92e10f7e52515494a0b93dc8a113aecb517d932f3989fe044dc3ec5c78e9b0c3fd37d0188ff9e5025fb1b08d4365513e40c7747751dfa80900c27da0f68088f8482bd918875971684667341b5197d390e9e43d4498d3314501c762a084e82c19bfa99b00c56f2298b474f78bede41f19238309610b2efa391a8fedea3ea7828266a0032983acc11e1ddd0ccfbb113ae592065c7283367c6865f7bf01a1636ab6a439b335588ff91df3427223e57263d01c3a3abc1f8b7e0ee0fecc8d0a9dc33ef6df22e5655f09d37e6acf9e71e037b7f61a842813de002436059ab36a0f9bb2b3ab88d7322b26f530c3482d3187a36eead2082f5c24e4281ab3065445f317a8ec2f066ad266fd00b99408174428f700005e94c172670e0746fb288a46fee501bcdd96fb406dfaec607cc3e9881c4a9801a4a3033a7ed9ea35907b32399a5cdb525aa028579740dfe80ae585d5544473f1634b992d4e353cb52caf44c15e0c6eb15b36b75155f015b940c871020911a668e510f5a28757c86a974eb137fa2946e3ed53a15f680cb2939457e6294868af864846af896722e2c978bf06fe7732e3c4f2b06b54241b5dc66cb570797c6c0861ceda2b8f02e3725da7efe18ccca6d1595637a9e240efdd9b84d3915e327220631a4b312128c60ee47e9a64277f3b474641dfe386767ffcdcc9e66d09ab106e09e37de658c1158b39fd2210a24f19451caec8f9a18091a4da2c2858e2c2528fb90e59b1f8bc38b42450e0908b69e003ed6206e88cf77ddeb1c55e52f940283e6c38d35625d9f684c8e46ce80d8f7bf703e2a2a6f4b276dbd5d54d88a455f2aa7048ca4666396cafe809a04223310de710e4aee4390e9a15086b6bddf19b7d8490fae8414bfe66a289ab13a480bb25c82dc5e1fe1d63c59bac953af2eb0175dc29c05d3ccabed281733e508bad34fb9b54804053a637616fa31dce1d81596c00e07d09ff534f4189b182b5f8f66c96844fee81af7d3109e868d1cf22adf4cd0aeedc2e274f5711d23e12dc2e88e836b71a49fdc51c0eb35d939438a9f0b73af56ab674403eab3db9b4adee070f9d69905873c6d63fb100b9c7b1fabbef5ebb848f0476c6fc90b5877d9e99d4786cad181aeacd3fcb782d5345cd5e6e008a00eef460c07a9981230258dab0dcc8c0f7ab5cbbc411f5b76fc53a7cc3d05f9a4a74e09980b10b91f3ddc42c84a2add92792cf8b69b2c2b3392a7da4a1a5fa438bad61e03c58bb0d755463f729b2f9085b741924cf6006718b5ffac65dd2c79666b6c76ae5b6254a9efd02652917268cc28087c837ae32926663f275f86e8e92458d63dbf3129fead7cd51486e20a2789361ded203045ff47d529f8489dfb61edfccfe6fc7c83b2c910291b84752b6005cd45c3bf3368c3d03994da746258cc7489dc27fec8aadfa4845bb3d7f311b117aba7a7e29b24a617aeb504b0001f04200107189af5fb8e4efc0fcff38602fd60b5269245de7e81cee8585ddc6ff267dc91316c3cf1c40f1400866104cbbae854b136b655c7fca1175f159b5bbd4d5662ae039a7223e682588e0a98ef2eef3f3d110fe6972f36ea84a19934a16c64a026bd5e808d26ea40a9208f3392c2bb7ce3a01ead15bdb4313232746bc61525b3aee8582b877074c0ba6961f8925e1bf528960a77d74e0582ac1101bc2b2eac586ae4f04148b01d3146337bfca387cd26239474550c28977bc3b3d26a21e39241c2b15983d2a2ca81c3785766337c72593bbc3cec80bd0967f60e776350a05e8033e05abdb883c11ede9ee973567c9da6745561ede6757060e6091e04173b91fe7d5d55852c3e7e867b9be4d049efc5167e614380e5fb8cce515294b95ff3858dae94710690ae5d7145eeffeda29db2e748a5df038cd2a0ed92165a2fa3f939461502d0cbb0c6366a452d2107483e132a049c6101d74502b299495ddfaacdce9fcaf61b450b6eb1153a862ee4afdcbddf994d61a40f4e01e866f9b4ffbd969288a5b849227c71790cd1dc44f605c8150cb414c5bb9b33bcd4613d4676008f48821d7b55261eb4005263d71dd5452e6ccf2992d393e17afbdf9a1a2bca211026359944db00cdf0ba1f6641fe94016aa89e82934d2da8172722a958ba1e5fc27a839b3a8d8065ba10825b6bc41aeb58d7fb5718473e6e38fbbd04850d54d2b4b204ce7dbc7c60798d46939cf0b79b58b97202083d4c011d5de6a7a1df9274f98e25a0deba74e7a4a4af902b5f5665a14986c6cd8974bbcfa9f2306dcbd0ce8c1e1728d153138aa64dc2de084f32a4815653e41ce81842ea74db5f25dd2688662a0802c01444651c62ee81bbc49f3c06957a056c14a260996427d2980fe4bf69e73a63065b532206f01f79f41a2e16d12ec2a169f7417931bf0ca869da5cc459fc0df93cb4dc971f544efc8d0a301bbb0cd9ba8bb38853855c34dbfb2539543158dab5edca2b61e98e9efac5b0a4338e11c0e4ad889c2492dcc85cb78d58afbcb1564d14a112dc61da124b91d0eeb4316695e730b28214cae50df9d5aae609b15671f3fac6dac3c724126beb77c94c6b917e972375cb51b984f8748c1950a507b36c73928dbed97d91cecc80b963a03aee5718422f5839d0eee6d428da4d967e4834b292eb4d126a96addc557c069f86070353df6b71e7a1af61098b11e5afc078c44b715342649a6b71f3494789081b8c0a4fa7bb110283c9ed176258904d07d3822e37e1baca29d7f2b288784033ec40f8b69cda58784e5c3fc78e910a1c8d11fbf90cfdb9e97e5f52ac9b4b0a19718711e167dfb6404dce138fd57614085923975f5f2fc17ab4dabb2967c1ab377dc81039fe01082b6671937de5cd56345a4863ae82b5039e705ea05269e306088cd98969fdf82a7e9aff6dc0e49754ab847b6af6c2c99dff143d106caebfc548aeb929523f2096250d6b846ba2d4ba5c784299952da4bed9b91406e92a348e8c322b53d3fab501966dab5a952e1a394254e670df286091275d1765f2b1ca1b14273a9f7407e38645e4e3044236045ed057f120881e815d25d83746a4d5d830fed92692a05b7e5c73fdc5601aed661b34ec9ac561a54183a98e3f75ae125fc43ebc6a5c1a8285e143a0cdeb6119f40383eb6fcf7f5c6c5e2bc181acb7a994c9f3b1f7c4daab9a67011f00c3495817d0b3158d4b83d58a4fee5279ac5690d1f3aa8fb6ca931be2d4b6232c7ed84d358b9c2f2055e42173ed965a864b670a417ad374a7d44e6d308f04b30f8bdc25e3ded770d6f139c0b79dced781e0c46058876864abcad751fda023aa15daaf670386b82101e2e7c22511fa5822b170c787cdee52ce64707e88b86d01ff7667dcb5dd4f4ccfde87dffb61cb65f1c1844745e4e4aa0bcbb66281e16a849b35e1d62cdc3324961caa1b86c788ba911ff2c7de3a1ba9e1cf08a4a051b95ea6facf25bdff72ff3d08a3b9b2af15d2997e770c9257751493e944ff06636b4274c9ff77d7bfe06325b9ebfa94c2a316843f9c4908679d30fad0d8688ccb516785d163437b82bfd6e424cd1d280eed7c4e639c57486c9ea750aad921e04478af7c12b52c71956e53bca048f05659149bcff8860bc33ad1f9f9e902fdb9d51c5851fcbdeebe4a185fd4b84badcfb62c9bd98de8b70dba4eeaf55541e3ab7c66922aef88f8925c85963c1bfba3122d652f2879907ac3d6780e62ea1337d8f5f5a95bd2ce85e987d94e111e342972a7e89e26f6d6233a0fdc0b4a0a37c1a9bd3ea790bd6f861445f1f176696b3223625b0570a645ae3d011002994dd6daca8db06e67e7f40e8708f4f8f31aff4100ca77c8e1dbb336f2169e795b65b5dcd617c5ffa651dccae9b3e1ff327e49059f9113160881db74663345288c3f86140b223f56ee5dcbce200144d85cb3cb7d48e50e4070208dc81d13c32bbf0cf2ce05752380327786d8635478909a594e86f8ccd8886c4f0f35dab543ff2981f97c1e08c54356115fdc985f085e0a733a7d368972a4b548add1b33867e8af28e1a4d4c48240829da23952ab89e97f2259a1817269aa22354e061063616825d4032fee5515fad861069c5c241550e361f3db63db20b0fb35f635098617d2554cd91c86b152a98382ff4716d2e7d41c39731050a64918212a0fd9d392160efb5f2c13d49904a0131807c1f148641849bd6f009280738febca1d4d84213b5e3cff4cd1956aff6aa634395567dacfaa02b03ce8f46bbf72beca442965ddf5d480e9586ef7a1ad9f23e38631fe258b6fb5f05590ef04167647e0c2a3c6a7c955e6b319e15eb7c5713222e869937063643864b10b6fee2dc14e0e58868780c70363639a9d7a48307eff1aa0aee218b37012c406601080179e2c1478c04ac6fe4d13e0bc4c188f288370708787b27cb7e7904eb364c7301c8a13288417ab287b3d97519360bf4b3da1194dd6f609a8fe03c5f978a778cc73df6f06ded9150ccf3f725f1ca563fa35f0513dfda7f383cf954f7e273e8537ab69882eaed78f6f9b08a39324ced4d4501922a91450f4f77fa109d38781a446663e4a65d59982e51cb0f8448b3c144235ab5a2b0faa30182d98734a425768c0c0a1acaa08a38eae4854a6d22a8e92f7249eb9df21e9156b71fd829cbb45ddc5e8669a9cddb4e06c53449d0c564e07c4efe10399334eeb9e79f2abccd55489677b53870bdead329812d7cd5fe655ead58af058ec5f201cd32f0a656096823626b297599cb10aa68fa844daddf2ddf96ecdf3bc39493f857433e3075916d83eba87dc2981626d43b9aa2d2153ae246c7039dd97545c57ba21a74067e97f98b5e5514e40ab861919cfc03b694e4ccde82d31f4b1e64dda9804d75cbd689fffb9d07f4b93f0b757245ac6b66c0ab78e0d8111198e36abb2702469f65bb46d6ca92b3cb0a5cd7dbe39528ac23f84325c64e7a823cfa1fce6edcaf2feb12c767a0df3295226dadba4cb55577d079ee54fc8776c01b32e29937900984885c51176ebaca7f1ac57a3353f157c8d70227a10054570c4e8660cb0d47361e857690b26a2cee57e9e7d36f5333ff2753f16d553ccbbf0e8ccfad7c9cbe305c9af1df6ed7eb497b7b303a39ec2eb769c136a54e099d419cbf5c08ab39341b4684b63c4f62ffd705300c4baa12b03ec5322485f1a106d62df8f3ceb66ed52aa1a64563c0d6349098f96497cfe2f6f7faa8658b6bfaf73905b738e64574c3d8285723c8b4622bd36f02a752dced7bd64d22bd0c2d52eb96abf76db0d08de679157b2a223ee43ab85d712f49389ed5fc45305468f348ac960aa7a906032c4f9fa0180e490dca3c66f7b29a791bd793c5d211e356c2c16dff29b0d8ec7b6019f4a60433cde13db2d48eb8945c6f7c5a103af523c1d5eefa2e2fa54dee0c283cd427640ed5b55d21e2aab7178975e021f72182881045e4c292b0266e15ea81239091f85a3ec399ae5d8cb5d71b0ee3c81eab871f9d0404001e3db6927d676bd251b9b4b0e7806038805d6b1990b2f0d235db8149c0f015e1439e6d98d0ef3b8ebdbafd7339476ab5a4125386fd3f44ca29a82059c5a1c455dc60f952769a823dfb08485f3b218a6b046cf4fe4a0b50665bb524c0f7f181bcca1c609e4d6930b9292c305f656abb7e53a32058aaead6a247135418b7beaffdfb3995173ac04150f007c4123aa0a48c95d8568b4498f528cde72683da4c48956a19f586751a432ffd87bf0deeb5d727dae3986b8ac4a5413b60047e29223dee30e700e32565b36d88d2f97010d85d2ac02acbc719bee45164dffe3a6311a688fb50f6ceac860fced2cec6822065006c18c84fb4246f1136e8cd29c211bec931900c1f3d05d75a3d6e497eb222eea57925a071061596132db9129ee3c037e7949b1b0cb866bdd95a56353b933800efa02c66ba832dc98b86f193cc570d25ddb0a3f518b28098f7c54a2d108b19dcb6bc56a5cbf05a42421063a5aa8bf076fa43a95a72d8298e6ce1622b230e833458cc3a0c2cffac42b472d4acb07565606fdd241424458245c057f54e49940a9e50921cf49a923ccf691e107b29ae97a05329f2f218b2d75e62de5b6f229a4d905d0fad03993275aeab7549d9692fa0bdb3ef81601720fd488e0f7b351fb95860bafd1dc12eb6b4c7cfd463a5a3e1e061a6a1468002f3daf162472d0450609e1e2d7734e1488002ede3067327fb96a11e987dbd1b821d8e9db0135181c23e0124ee3b48838f15404716424a95c840a119bdf5ab5d0391d31a5938ba90602ced12cf0f12583290090f4ec7b4bbe7b5a101b2a5d041d13563036e7ca6ee6350a43f2f3ebec879a8f1484b4585b4f56cd139b770e9a0fd0a9d7673fc159e338fe9348f023d171aa1a4fd7cb3e91870badcf0ee7882f64dffa7a905d6c3f8eabbd0c8e3417327623eef737fa352dceee9115570ff394b6038f41573d53a779c646b09a7aa59be159a4dfc39006f90e6380baa47cb9dc1d6b030c95c0950d32c58592e79a069ec97832f56c13564dfff83addf3782032e73cd934941c7f77ed5a48c6cea91a363190b32e55fe719179c4d6c18010bf5c4a23ee86a09afe937e7e09e12513f632a0f583972309264375e0119be7c30548d8a7ef6e0ca880fda623325589e9dc6e5bc5b68e6c9d6bd1a65d301649a3b4220aa5c69f45e177a15182d0e4033b9babc2ac099229d77c7c291dd42a409fba63dee5b2b6c83d345277d825914008bf87aa17c000b9d0249afba9283cc108144f57ba92aa5a5349898febdd665f18c1e60c3ab11b8ebdd328b4c5f3aff480c487417e40d828c643089632fa788947318f4c304f0e9a3c4a790beff8fff7ae4cbfe162e443b64a44bac41c559a77070f5023a66852201703f05c1dad0fcc5b07ffb10c30d465439960b70281489a6f48c5221ec004312f429842d9bbd6fdfd2943c12be69ae146ab6a1429ebdd301566f38fef8ae4c03bbc0c6f115bbc6eb919754eaa94a2441257fb8583b47be773e08a14caf75dc32b2fcbe9b6ba38e1cc074d76408392d108eff52fa1c5e1f81afd1eed1ccb73c05f26843b68c44f61c923dcd0a7b918488b0158e8221ff02797a29e76ca0eff257ba65807bd2efe214248edb06ed50b5611e702f4941cfb9b78c16787d1fb0d775b5535e59907c75c232021851dcbe083d9b5d3906ac0e94cc573d68458009e54ca2fedc807afa95c22db991c553662c0be3d3fe038ad3e076aa4df4a1e89db699c3ab75db7814bb8ccbc79619e4fa0a9e1caad22b2ccb590d8206cef89eb22a7c52af24cfe4a64716eb2e0c0ed5b2301e901dd02ceb91e22350893d559f22950bb44e30fb02206409db20b665f7815dd1f4092ab69f3f8b2bcf0a17ba1954474e5a035b7b281b9508af0c0e2127aed54c8df5e133ae0f1bd64df5179a0dbe64b0d382342cd51240915ee5d93649196a6e3e5ccc6170195fb1a07273f9d5fcf2c765f46a6400959429caea9e573881b2526fe8552c4851a457fb4525ea767f3b70dcc2d48f4a1ae394975c7493c57ba9c64091dd39faef4658f8b74070096fc8948e902acf146ffef145c04515b72df03838bb589b9c3215df715e98d0ed3face597c0402c502d3b6cf60d7403e845065002b4571260ffb2507ecac8f05db8ec293be54769c9ee5b268718a08532d8624d43e4f498297e556e89ef909e1f1bca706709d3e227a9d4b59600144477f300f9e6e7e0713a88c7bcadf47e6801be025a0bbcb5e504ffbdfe26e362a4a06d74ac92bfe8787ccb38f0a3fe434b035a45124aea0cc5a99d2b11da9085673c05b99af87cc99843052787b009a0cb6549e2a2ba64d6964ac6351acf996d24ab274f0ad04a9a72224da8a7bf172c7314883b868548faca72435438884828d78b6a7bf406cc607de33b48be016f28fc100d5ef922a455644390fe19c28c6309eed7a98d4fac88038bf7e88ab7ed0930f09ddd8ba7534bb021ca653407dafb235ffb9dd6ed69622755fd0490e699f85aa06a7370a71a3bb3bc30916c4fcfd89d2643454d7d09c34f37d933509e6708ff9c3d93367efc6b0826361528fbcc198c45eeabcf1811f2857325e4dfa221dba0947b6406d50646960d8a46af45903bcd88106609dae3d4d0d890300390acf1e7f8bfae1c5efe035ba49a2755aa1c70ba43b1e655db8bdd49338fb6fbe49f33090a3a64f94fea6cd8d38d0a5ab54fdcfb209120180382b4b737cd0b3bc96a83ba252048505acfb1ada4ed15e18b32f41216e68e87dc68c542b9bf014fd55ae2c707fd23d1af12832aadd24e6147c8a5a28cf03a0b39005cc058ba2a9f75bbb933631d7ada85b85a2941e87d9228ccb4b3227b93d4e5e675dbc1b6ad4634bcecdaa7ac844d14a4ec099c61917d7c90dfc5ed4378aee450d5315ac28f81e58b8be5b64c9c5538e6e2600d8fb8ef3321a2fe2b1577efb4209ce1de7e7f29f5284e19747afd2846e63d7f40259b52b3225ba98a6e95bd77dc7d5d79a21d57a887cab3ad403ad7770a6641041b838b6eb0b203dfb1417150ba9b7b9b310d1ea7504f857153aa17a00211805c0261f13e53825f5099806ebe0fc5ef473451ee27d27b62e99db83513d031d13148fc3ec5b84c51fd2a426b62574c9cfe09c47aa2ef4ddcddc4f49928da13593bb13a4f5c6c13b835d1ee27de7f62689ea87513d135b1314cdcfd09b89d09905533d6ca2db14ee635a4c6138fb1c4dcab285713e93fb1f4276ee509e843026451aed704598a871ce60816b2dc8a3cd480818d08a1e5235959c412bb0a15f3aea8600778d893ce8bbb26afac1504bf218d2c5082d9fe6f6c0d36b2e4a788b6b2762a037c6c7b0bac143cad8a3501109297b67ddc74bf1795d326c8b225244875823925426f8e48cd5e6d8a52cbdc6be871b4492a48b35a21a9e8191113338394ea6c9c8a72571be917419d04294ccb2a49fc1c1cb1ce802fc564cc9248d38b186eea171715345fdea9e7acc242be042a46bfc7b9c9090b79132c0807c8e8c2d396a7fc757f70e86bb54058a918f1e6c4aacb356f8b27caa9c02fca4efcae8ce29cef0dc21a07b1f70df682223294df995fd763c4b89734db501294a0255dd7a41f6a85bd85f880bd14c5729c6ba6616784a49174ebe1ec13a934fc7325a25977dd93e2a2940ee9df7ac29de3376ce787a338d98c04be61b44bd1a35cead8126a97a20c030881ccf243c3044c1c39c36982b274e13199bc446aefe3d17645e8514816bc7d55e03b9f28cf8f2f029f4e3ccc544b5b4acdb2224fa381cc63174b70115f33be471dc891b0fa8f52309f1ee51924dcda7b5d99d5dc362b785af5ee6dba6d0be3d01c59566406c6a404e39481a36bace38b5f2faf12227fce1e42d2ceb7f45d45e7af003b9f382ce7cd6dfec375c9fbc81fdfff240318b13b1684f0b483c9feb8ba90ca79683435ac1aaac9709fc4b13a49d45d708aea61453ae8c55d09062adaed170883cf84431606f619916b34a7bc28a1e7888b2204c1c55272fa87e16a73560b39bc597625da842728b38fd4968867f82b714607d7a8ed4fb5a960068a6d67d022ff68bf9be1e5139cf84339b4615d1450e971062ba9bdb517e601f84f008980c33e8a57b980122b31cfcebbcf0803078a04d0f096e35db00260d1c342c17704f7e5e8749f1f35bb1cf01a21e2abee5fb66738bf6f41d25bc51a048df4ca21da52f4d5d471cdea5691119f3463b9e5778903b4a3be7aee39e92bf33d46b953a84b0082e9491267c9016ab3776345a21c6412ddb1ad69d127301d5f654171665054c831618db1fa79288f2b61e668e7179461eacfd01862d8e8fcdd0f6838496caa43c1aa106991bd26518a251d048b77fa1ef1c052b699a12f3db5b3f3dce800aacd2da210a477f8118b20d79d18591ae38364979b595be98330fe3a4bc61e8f80398b8092170e327499aed608aab332f22278024ed4bab17211d9499cdb6c961e3edb7d3c956dd8c0bdcf8b2c735547abf58d91c2e125cec5a4439d8e3ec0ef3cbfb22878b6761d636ec952a15b06fb16486c45e1e202113560116615cbccfe7f92452ce52f47f19e21c628440ce38d4f8de63c771b38fce5754964406344c40837fcda21f5f171f2a34d5604f56c228c2500392ad62c977383d4d23e59e1661c586370dacaecbb7703fffece401e01fde91c4964faa45e73c930539e66d2edfbf3082318b4749afb47351614dc4bd28718bc47819238f57f98ab6c18f39ea18f3b45a27d1fa099b9513248421330b27d67033dc12a6e49ee7409b262eadd17f3f9345e131451fe96496d88febeced56eaef16806c6352706da52a470c01c954d6094b62ffb6633721711d3bc33110cba15252663cd81beeabd310a98734b11d5c3189786621277392f2c8a65fa2f714c2a28c476104583cd812fea599bc3b50b7b32c8c381684ba395c2f66bffd9f576eb60c986dd49589dfa1718094cf804065786c4f0f47dded110d7151ffd178a72c3ff0f8c8e4324b9067b649eb81df35caa20995642391330c5e99f7407f17d250d9e76bcdc0eb039a1fe8ea471ac21dc9400bcaf2bbecfdbfc20aa133933b1eecca0e8419f977dc718d508292e8ae4c655c4cc7513703c026334255a199c05935df8d9657949494af68d9488e59b5bf05fcc0a3114014941e053fdf83e5ae988fbe534cd373f6be27e1d8193c8c6b40bb178d01379fcb5baea355ea354f85e3d6292f5909ec7eaac388e73c2eb773a3c8b8e6df02055f51a7d5a2a2ce1fcc94530051283121f4b0dab0aeff1a8596aed1a2e8733e82731d75e0de5d5613237e1885ad7f28d4307a082b6bbeced3df0c2021bba579c695d65d15cc22dd734e0c38344e91c933038d4e3fd001490ece920e6e50a18bc0815848dd2fe847d7f308a3a8825a5749c2f98b5d83882fa5c814d7ae8c54f92df34fe61a49a1b866dec4b1de165ef1b9bab92ae1c6e82aa6fafa1b9667b9634f8da0931ea9a8f957ad0f4c536390e9f8f0378b8f270613626697336ae5f52fdcf75841095a0cd9155f92e43ec617e82bf517532a32f49617dcc1c6ad8346cb3fc44b76c0d7c8bb3193c5813c9d024295f14b0b86827b24716d5a84c643683ac9da9dcbbd01285261b785d2e1be07d335e0441992ed68065f2fcf7abd5a8c432844c730321303ee17c3948d6b4bd5b06126f23f85802a879b8c92c421c668ba64d6a5a856145ba8cf5a649663940c238f1ccce74e07adc03d1208621842e5a5c94c959038d5aa685c81b86fef8e1fa511b0ee3cbe1e84b06117014829d1d7a146eb4c596e8a817844924e7c03476610903c031e4c1dbba438684285b11c39539012f59ef4b14fb7040fd80313fe4d1ec8495f02da16af9ecda72e25f4ecc160b30b74cdf6699070e66e7f9994827c3d411ff226b6ebc24947d6b4c2b186e609081bc54bebae0d924ea708dbefd8716c6450fe7b9a31ea95c7d0bfe0f02480b882c350432a4d394c37dfdd22b30d3b83e42ab043b25dd6f424dd5220b1ce036c0e61ab6b3b7b995bed64494d0f8af5a32f93f6d564718f47bd20824b2a0c9cb184b8eacc9e33b4bf9859d49e43933731e5ba1cb26ac413a86dd8c58e9abe3b6105069b79e41fb37c7907d097df27fe3ff10efe1db718634e219e3d14f5e3366b991fcc89cf800e2c8bfb08bb05c9dd2a83848b1e27158a6a18e29e207fad8a5d29be17ccdfb08ddcc45f4096c9d9cd905efa129320d752a82c9b138c73e1c0fa6741bb6a050101f7217924be55a3b0fcbdabe37aa2189b4865b2a312d36cc23ba73cd514391411a8b05c7e2ac7494c3d7e1771543a79f30565a9c9a5f206066ccd012e5c7925c3406394996b7e7c5060cb96aaf08d2d71561840de280eeed2b3adc11cf0001f86c4f15580a5f49a59a3609032896c673a614e70bb52c30da45c1d9ac4b5bf1a98ea21d8964a7538e9e0b08e7c58e330e71dfc192686be8aec2872cb585512e45e1cd8b5eadbecd73a8988bed3c750084e87af29243da2b767752c330e0d399e6a0a9a42e263518904ded3fcbfb9ac40cc1440ff7662aac62e50be68b9f475aea5d60b3ac4c1839d3fb4299a00aff9cddf12f46bcd87840529f3784ad082e832a3d75299bb2d9b80a7906e66e8e36d0335f7b6ec2625aa50c652bfdfa6d4e22bf91b1dbec4133cede58cd31e938450a28f5511c23c23fe40a8f2a0f069b6b18355c4c4d1095bf22fa21a21d862e624f28ef8a86b5c733a0d26f8812386754d889cb9ff57eb887e5dc2cc20da0f37d09c62be6c588df130a8b4f0544648ac6ca94698556c8c878671d95f5ad931b89992c39ed565ead42addd298259831ad19a453792cf296176d9defb20c9ec3a20134ada3a5fe2b8dc396e1b7a2756b7c7802ee83428a6edcc95bcfac2ee2b21c65b33cb54a9f8507e83ae2ec65f29c0d58b6d30451d25a2e5b65fbd1afca1479125eb0457edc9d224cdea957012cb7a0be7b3ae736a10d3973733f17238385cb41905f18defbb64994f4b0ce83a401e1f9ad1076f127f21b9ec405418f8ad20a8dd0e8846c30efc18abecb0413aae728be178a29ee8d8d083c39eb1465a5a877f4e431f114b8b4c522d251f5f02e80028f30cce854080ada2abddd811db5d3e356dab8a03ece5c0425ca94dcdc5e97d63ab4eb87d8fbd9d46ccc474df2bbcb61a9156f230d0c37c5836adf67987279a178e4c084aaf6089eab084bbc13e8187545966447a67f0a59c006acb061944152befe3c2a78708c2f6c471581111e29a33762a9626bad6ae557ec977b8a22fce73d02d7bdd744177368200074bf6e76a7724cc1930838e9d772f77978281ff2eb0998e73bc0ee37a6c5c32734316232ba3fdb18a4497dc4f8ed14485d3aa96a83ce5111d1876ca2b73b49d940ff46fa5e68287ab45677fbd0deea5ac9da310c7823530a143b7cb01511e833d9d04165869581d2a43965f41bc1b7cb7630ed84909607ebc2428be101816ca55b55b85b31820ba17b054fc284e8a2d2f2355111dc9ff764a75825c51a06ec4dcecf6b226eb1c9954cb650629f61c0787ea8201f6feedd60ad579f9972a79b3d058151680839fe1bcc22c863e89215a3a3865a1b006d29d9cec88ff2f6bee90826ab221fec8b1e45a59cd1841788c51812eea8af5b9a5a4b75ba8ec5536e0067e02deeb673393ff055d0cf69ad4f90eb18f0e47ed09453f5819e5523ce6219fd0a36869c637cb176d2adb3e89fd5046cf0db3652e0bf6b4cbc6fdec0f20f0ff8389db4d5a1ed309daa80d87255b45eea6704e0385d834063483962a7fb9d40e8dc5466d441ca2213cbc95696ac31b0a7c43e99dc79f3a2ef2330edf34e181542b85720d8dd004283527d5c41156984e73998a3e076c9f1383cbf1fbafdf9c290b49d1d23e9515d0feaf73882a2b098de1ba41c57bdf821377774cbf9b546f819b2ff5c3a7f2dcb670cf7d70b8acfedec14a7c584f435b0ece65813ff526e5a24dda1f197fa4db5fed342ddc6c27567d1a1cc85dc87994076e569ce1460103d404450d060f452317013de6005a8ee1403c50f024c301f3ffffff5af5ffffffff6e0dbf6dad9bf5b7dd8a2636a52413c665af85cc18b4a6494a32252965d2f225c19d1a050000000000d9cb8c3c0104d803ea03b6c92fd3d0505b913c61d79c533ac60fa3e39538e14a21c3cc555776e366b0488d137ca0049226e0510913eea86409e7e891288119e56dfea94248d3199224244ca5142a48b7f8a12241022a69af51365ffd1e9780e408a9106a83a6ed7edf981b1223a055ea7793ec395d4d52843ae69c7afc2c2298e1d29a77a5cfffcf488f1d22922114e32baaf9a5b58544085a58fc58d22fab941007244140edb3bcae985cc7b74600b22001c2a9bff142c5be69aafc20992e7245eb7d2711f2c139af860e32a65116bfdf10b9b1ce63870818377af01761d8e8016244ceac724ccdddad40c2833b7b8eb6155eef2d33229243b283aaa49cc6d0e965651b43a28366742e8ef01eed41264202490eeca8040765d5198b495c96068f16921b282e429afce7f5b7a09114864a6c604ab14c98f6f08d9a5483e2d5b4777fd05fe193d0a08fd12b961ced926d181e90cce071fdcde223c68344069bfe24234e4ca46b6b01490cde92b2959af341e55ed17abcd5edfd14d4c85a2c60020ba0d1c5872bce9f229fcc43ee82f7d18a5bb37a6e28351a333f82639d43423cf0c18a47d62ed3b6fcb40547b4a0a1c3b938c2c72aeed37f6f6f29d5773538406387172342870f55a0362b5a1ee27ad71412a2c5472abeed94eeed93f03eed484808163c746041e38c0f54689e2cf4924c399476ec80c0c7293459e2fb99fdc3a6e8c31497ccf95eba4ebc6ab8f82805c23a9fa9a827a3ec1da9d13abac0c00729d8ef0d7923c4d56e35f818454a95e7787ae6a9d4178517a6d3baeda2875aa1703ea7e86e41a539f5f70314e9b1d87cb9ea5ddffff8849afad36f487324246487c8161f9ea8a3278b8f4e1cc49b95acd8e0e283137c0e42887fc87051c98f4d20bedf35c4dfc6325313654f4d6a5cbf4ca43234e8ac1c3e99ea60e2da97fbddf678f1181e1252638c0a74202424078e14828f4b687277632a8b9642c6125b69b98cbacb2996fda8c4bd5df7619a44cbfc2321212ef8a0443a6df688138d7b2a9f4465af1db7e6f7758392308751f9f2199f36cb9148af465f1d53cb5961482cba3779a918c4e6dd1e9125ef0dd9c9e208f91de1cf9c6ef3a021e5b5469c722fd39f1cfd6c950eef0f46e0964c939f68bc5df26311a8183c59aaf29c4fa628623759b7b193772766221821f4759c69cc69424428b3311bb3581c2bcb214cabe7b9b3780895c42b7c18a21c2c08fdea58d22ba51057c920f46acc84869310f5e9f552d7cc223a1f041e34c4de26b51f5505e1ff6e674fc994a9d7035150a7e346261d3cd3f50188ee3ef3dc2ff887c732934e9669a4ddc80fc85dd9ccacdb29aa7d58cb74b48f8d49dba97c5877ec92bafaeca1b25025f542d3ef2c7a389d5e53b9d4ca8332da41b3ea744cdde1e1a4821077d9b22ed1ce48cd72e709d70af2e91dbca4757325d72d314f8e26cbec658ef511092bd21db395efcab535ba8a65adff54cec6ce13a9625591de6233f2659a1c485261182def7fb33f57413d24a870fd35d43ac6d48fab059253684964a6c892a84a8125519142f7cf3467aa1764344946710af2b772da51f96e9488225d427cd2b69945e96405982009c57bbb7ec1fe4e75a780e268499eccdef1bb54f78984fe25950d71fe999678c2a85a3164b685fa5127544dd3db35eb1417e644e9bdbad5fd43cdd24d14439c768ccf41452c174834c17f929daca46dfa94cb849d92aed9b830269cd3d65e3163fe4c74896f6db4fb5513915822997334f5f7994afca33ca5dc3b1a53ef269050c2f9bcaab5935f6b9749b429b24d3fea2629f64a2461eaddf7cef172b75991282ce68cfacc9e363a9040d667513d11fb1cbde4117b5af1dccb6529c449e2886b2de5cf5be51d0d37028d9e4f76af84ac5e19f12865797173089552bb887d469325cf5fb6f761814411251bd38df14cc913912411ae9a7b560abf69d508438208649031888ab193b40e490ed17d5f90cf4e2989214a6396298b9ae76b37121292024921ccf4f36a1d0fa52b891066fdb48c2ddb49c63688ea845ee7e8693e620a22b56f1e6a673cf45d81b064ced95fdf02885472f9ccfb794f298de40fb5458d41644d3190f8c1fc49c6fab75f02491fcc381554569eb64d7a49f8f0c8d19636293b254b2aa243b20776535ce50fa2b474120b1c7ea3023446128f9d8008247a50d3c9fefba4ea634892875f2c7eaa65a9f2f8bf408287decadc828c4772c662dadb56d1b48ede4090dc218d317c949a6bb456edb06c075196543ca6664280457341c30c491d3e131fe4d2c9facd183aa0c1e5aa84f69a3ca5640ea8168bbd0c2653634a2207cc43feb956300ea6d5faf4494dfc55140e97e7d89c672db506ed0dbb8fda5f2571cb3addc086e6a063e3cd553c6d2868f554973baf5a336ca82dfd27ad9e25ae37c91aca9a651fcb2a5ce592a80191b5cf7ccd18923498528fcafee315426b341c3faf99274a437fb84372863f75765cd706061233f4d9e5c492d0246528f57ba9f1cf4ac8a007f9f4586e1e94501ac341fe667a8ee9426a522286e4d3627c4a6a97cf14066fdf53f435db0c0c9ffe76ee5ecb4dd57dc1ec49b56a6b4f0615f7c272eea12937051dde77a16859848666f4ccb1b9d078ac935aa3dee2be5b4006f39c9fc3e5d85d9921d182622b1bdb15b6e422c9021bcb4afa654dead7536548b0c047392d2a357fbe792557f0cd845cbab015bc3e197eaedec164525285d4994c93a1fe7a557581840a88582c0b94994e19cbad3c463385b35ccc75aebea9faf222478ff62d74209102679553492d0f523ca686240a5c2c0bf6f5f13a2c09141805581aa976314144755b294bec6ec9ccddf0627288773fb8fbb83e323144b946a809536b3a746652883ece4acc2da8586126441b6d3c657d5ecb9c9f0c62590d27be4c347cb688c1230c2eca9808c2a4353486cc9b573b2781d84d8f76e74c5a4a3513401834d347a734f5d7493976d0d062f287fe4fc5e2aa6bbe7efd50bcadad338dd1f55e1fb6a435cd67f0d261a3133e5437321b7fdb640f7cc765b98d17bd7b4df4806a4f4f614ee63edd51c1240f45d19643a63ead371e19133c18ca53b4a0ea62feb8a5c91969105eba4ee3bf537387748c79ce7c276dda01f99f92ae647e51842582491d0ebf999449fd78bd29ae43644207fbd544667fbefb9c339903e2a2c6aecaa636a3692287644cb2e265bbe2f069b61c3fc71461752f1c5231fb85ba51da62f206ff93c811d54144ca3d7080e00b1b13080941133720c494b6158b6a57511d3e9274ac7b61c68a408c323e1012f280491b3a65aef7595e6e7399b021a5ec4608d1eb50f935fc265bd3c674d5a0584a325ae5ade48b2669f83ba899a5d46723731b98a0c14b9d199438a12254ed000d1e366ee4f082060a266728e5755df8142ee2723398bdf93d68b9d327721998bba062cc4efca9870c6b6ab2acdc7f5ad31e03de5a318647510c66ac7f0e6329554e3261c8f2ef2ae66d68901d180c6affc1c35cd6780a0a265f287c7bfef12b5997a35e50eb42dab109174ab236bac688c6f86b0bb89f5ead69a8a5785a48473fa12aa9da0c31b3a0f88c8d7df6bd09e1040be5f4a1746eabfcb9c257c054752e71d1b5829a725c724dc974b453855a6c93343d3b6a979e5061af4fb24353574e6e4fe16829ffdd5b16d3734be14e42ef6509dd49c76c1410d27afbba3db8c50e0ad68ea7cffc5bbe95e1617060f2842d599cc9585c8da277c2263694c7fcbf0d93263c9fab4c5f663615222618bfcede766cf6dc25689a2ed58df4d1a534232121ef3a44788c3151c2bf3178968fab6efa4b429ac1b2375aee9ca38c0437d6dca652a1ad64cae408ccfa45379dbf89114c7b37d1ddd11b2dc2a2b1b594aacbce9b89e0c5f1bfa0628e657d4f8650d29d73f5b82995d57b2284c2f544473da929773a08f9eaf55bfb95e77681907dfeecb814622ac93f4883c64c29aa65e283d62c482ff94e7a900aed59435ff3ecd63cb092f4263bc0355b3689b33022ed890ef08fab7e1dc7724c7e0926396035ab7ef5ecc9b0e1090e36cdf41dfbeea4c46e82c90df82445e6539c6a4ed2890d107e79f4071da2efac490d506ebabb363223150809e96242834c34c7bbf4b92c99d2c064065b695cd2518dc1af890c58fb8aaf217cf6779fc4e0fe8dd70a233d45cfbfa2d0d164de126f24248486c415e924bbcec7352321213b44c058d7c147d28a6ea3c5139d0dd072809603ac544900031260c60d1e235fd808c3019505ba2c4c0104088019ec00090078ece8e1810104c0bfd81e5f84b1370e20801d3a1000020018910380a0c1d8e0a16364c70d111104809c21078e64061ebea30c4e86183870380e038090c18c1c0987e32800c8188c0d1e374676ac188c0d1e64d8e830181b3c5a0c1c3d4444100002064c4ce3cfa78be8108e64b11e2121385c870819365a6447183678e8d000c817cae961745fa7bc703e257457ce21de291b7130f6031a00e9822122cb02840b99dab0f4d85a9f947e04640bd76887c75cce717ad542712a546add6016b4d678b1944794aa110b7eab87ad38a7e45ef40aa6cb9c08f1e9649b02102bf0f39a45c45f76b86a2424e40b1d8ea341aab067e96b0f9700840aea5727df0cadbe910186c8afdf10a95123041908011619c082478f0dbc7bc05b0c0e08600b205330291cefadd975b451782f7e9c598d6f397ba080554a513e35cf88d38f60514c0f0660d100062c20813ca19041968531eef5eb26e1080a409c60f97bdc7071345eae9126a0ca378912997261f4204c70c366e6a45205ad276406c812be0f3a87ae4fb19b62204ad8b64ffb6c8c7233224812144d53ff23b251942048408dcad2b0499e8936418e604e9ace94ce5eea2b48078811f80ca5fccf432b0029c27da1dc42295399f1418890ce5976b37df0022043f832d54478ae9c55fb0c8008015d57736963e305481056f5b89af47720e8371b424b755d4ef30f102d7a499a4aba19a33ed07be672501f7b50de243627b9330f12aff4e15565846abe8336ad2a66ce900efed3d0dca1d2a91d25901cecaa374209f97ed14f1c9c925e9edd57b9ef6f700c21f4fe3a36387fc86f4d4aac411b222d9606d9212ca441294253d734c951dade026406261933c8aa8cc900912164faf4141919031203b6940abab4df685339af3877ba8aa1657145e15395bdc5542b4a3ab5b5725c543061051a2c7389937f29fe5b85c13ae690b927aac83669a84d253a28218f60928a645619bdf29a296f898b092a8e7a5fdaf4fb7696fc145a129a9bd49b9fcab129ca57ea323bf9a7b094023f9d97f2e89c435e458afcbf772e08cdff3e47a1e75e6976d29de7c58928d21b3dabf4b062298722d94189bdd2f6e976501c4be5d6e9d3153eccaa4f98f3e7946b0e16432c38269ea892e526cff1469f92a91c934e1432ea9a74e99863f59c38d6b646e9321d7f429bf884304b1edfa3ed569a28e75ce78ca922c624137e509bf36dc4c7662130c1841533a9bc1cf56a77b3c0e412dfbf7b89f68d537562094df4925af79e9183b13c42422230a944b27df6328667cce0a184a163771efbb78bc924fa8a9fe3e39d32b12490f13b850c7315e735658841011d3f89c4ab498ce7312f0b5142a252f76542c996b1e8993ca2309f9b3f541c61b08f0db2698d4c1a6192775a9a30a23421c459886bb8145dc4e12f938d5ad2f63153041feadde40895637d2e11297d62a9b9058445a893c8288ca32886822008214010c46f3a7311483058481a8c0624c2b890b4ca0f13808088e3409138108c44616118844114c3201002210cc220104d198390618c727633f3e95239b3d807b4a614e881d4dcb93e1874c15280c10d48ba69c2bd4075052e59ef0a74369576e0dfa6a935e049e2b8c9c2fa2446b67cacb8275a3994e6b7b16d83682c474bbec82b54c0c7a64f90f23f2d94876f2c811b98e93773cb79f1590e93110f121f3554f70fd2c8a2e681f98caed9db462af52419bf216c6e20ab25f6a766533504678d292f1af5f39b69ae04e00f841814504e8b7f710966c5c29392d8ce5b2fd01a4949702562172d99d471eef6c9e51540bc918e639b7381e482a7d447c23594001940fe388c17ec43e19284c6e4fb6c890f89840937de26aee98789c798004ea026042e43cb229a0465a54971e75fe1c1099dcbe67480c24334b0e02f09a63291e6a7a73aa167b3f747d997dec4ac60a14258d5a30561298abc7c7ca2e4d0014d5d3488d4ac76ec0cc9e4471948bb492ab39ddecfdfa52169d70d24c08c5770191f2da124906f8723fc08dac0414059e3af515bc900059e6442f66897f77469758479a90533213789a164324e12330e3c8e3a5eeabe023218c06554a7f3b984e87e7d8bc52ab054a507589f1024ebb48d6484c411a515231f0400d9bf234b4e324191c14bc1905447321d18f615ed490275de9380ebfbb24765bc55696e9552408c4acbe6391219e19f7f49cd7bf1dd3248b1404ed943d1ca1bc1a6173a2ab3273a36086320f79f55b408b75ac8e18e8baa10d67dae0da6c38018985ec74a2d67bc6a2c92f4a32fca3ecc138fb1b0570b5f0635d6cb2895761def4320d04572c86537fc616289d859f7e20eaf491e804ec6aea85699ea2b2868be09848b4a62283c148564dcb7faafc8e6cc1be219ab4154fee04ff164b82147f8e57d53813ec6fa459e3ce0ad9c7e907216c9bede1060109557d3050b14363ab659080121bd8292ef01bcfe5c4aeecad02eb6a58296ed599dd3828524e0491448e239ce73859bed8b881ca6dfbdbc8142172a1e6986314f39c8f785160fd971d2dffb684a9390e0ed429b8e3a64356e55ba23ff3070b6335bb5b1436cd1748c133b16d1b934f75362a52cd27d41ec20541f1595b1a8bf8e891c704db8c9e16584142a29fda0aee97c20b22be63a3fc7ca2e7ca658249ff729407bc5331e939d33fd36f4522737c9391e8c9d9ad3a4c41a4a1c621751c9ebb39685c99fa6b4dcb860d361f717862a4cd7f5a436f6f5ffe1065a1718ef06046bad3165759cb2977c7b36b324f0abeabbd42f923390899db6627784dd43cf299f26da7262c3e4adbfd9e0e2dec122674eae192a526dda704f32651d80c7991a204d467501030c80064020eed4292e71844e1301a3294794a1b17e942613dc8c529157e3acb7ee82fcd0b0d9e4268fba8fdc083fad35e496893240f667482fe0a2f117ad44e9d99966f293cd2cad181b469e339548a820acb8a0612919b017f8c0e9ea302890e19f6fa9f94b4bd5b8e3a8290b1f82861bfa38900d2e8832cb056f43c4f7c7ed7b01ebd6411355ebebe2d0c76f81b46cb1026205ea9d1086f50bd0313a305a2b950a8738976aa902bf948476299fe8650991a30f716b6f8894de4a94047c5a63a4450f2fb7673168eaca8ec3bfdfed2c64c11496974f26d1dc7a99da6e0f662ed8f596df0924cd41b170f12c3fd80db256fa98e04216795eeca4762601d4bc8d96e4945265b94108c8fe8005c91f7e90845a9e2362c4b008d63aa65e097b9017d7cbd96f80dc0eac9247491bc8ecab7dc7003070eb52c0155f823bae1a6ce7bffa2d6b8e35ac28ee445a51fa81f5cbdbe308200a3b5543e171c7c491d84f857474c88bf28b19c00853656294fdf3f79d441187b721e5793c19e62abb219ce5f42518ddb099abf32e659993aa03a3e452f8b33dfc71c7e5df7fcb7986d3049261db981b5f5d31481de6488792410755bbf0c1ab41cb3661a7878b229bf0848a59b5fdd86f74e387877eeb530e0b6d7db5bf04cc6254a4482c67770226ee594d2bc8d1442a1f16387bdeced8e6ebe503303fb0de3639d0d707251f51cce827c0f30a9d5224037e602e03f6f690b2a38efd9027b017322a12f058c9023085497b64ff71665108aa4d44c8159a9f2fce72164d2ded2fda4fbf8cc3d63f8468c20bea0d932d5f86c6df29de575af76105723eb264b061a7118a2d1cd50a8732b73ff9dd639d0d72fb8dfa15d1d050ff0dabd3e69d796c97ef325d7ecf9ea6f387b41ea12230b7af6ef8a4d9b70166d2d2e38cec3280fc1e72ffe5519e2013e39565f755f2a2e9c39b37c464902620f8ad5710f68021a84d90ccfe225684507709a28a53f22c195c5996c4ce10ef432e80aacaed6ddb1326e13cfb75f2630813801e130658421d0499d1a8e4e27e209459dd67dd81adf6ab460c3da1859107ec2d9ecad5250192ce1e87c9fcfae26b5cb91267a3d877211e755622da1658c4a801e1c1238c6739a17d66bf9c64a536ee518567bbd62c2eba37c7e83e52fe6d8f356dc244711a754702ffd18634c4f3057e7d17fc3d815fa5beae5c173ea083b01568eaf1f4ced963975f1d35b69e5608189a28d44e386503abda1684b4a71d7ec30739b2637ceaaedd4cf4b3d778f5d3ce85cf517e4338cd50d9d43a1bfe139abc3345e9050b20d71044d76083a6ea1f1a237e9d5488fa2848aa9351367c6628f2c2fef8e1c4a5be220c6e2a7f13c186a4255d08a707068055211726611a35211be3ed96c6bded4b074f33ba961a52252705e07ede8d60d1ea2fdec6f902d60eb7a256e819e587a43bef8c23eca3dfa8158a19bc1158f42f1ad4efbd33b296bf535adfba2dfa4a6aeeb114d47b75eca42052baca7b9a58a3367f10fe099f04fe1bbe3d06ef0cfaac98f52f54508ec2a9b4e5cd504a795d8f585e53de5caa0198a97642b7ae38b1eb69d03bf3c8a5106c5c56dbe710e170b2f649f3f58ceb45206a1b67cfae6738926145355193353962cfb4dad15af002418d06a1bf8d2c5524398e588af641d609c1543d8c4c8256fcc196efb30556678ad5fe407234ee11038e49ab24faa1e3172546c159eb7f2d4e642735a470a004589c44516a41eecae55f80b1aa872b5b5601d687998211741cd161517f28f12ca6e199a0e720dad0e6ac0b92fae6e5c35e35817c86c983562bf24c47629872a95c9665da613c4b2b762753beda118b84450e5161afe34b563d03a9de173216ca94f8ccd8024fb56a7681e5a289c2f83aa83eef7d8171aba851f59df96894abfc844eea3c490ac04a6b27f1cd7f7a1e71b9dcccb0c7ac6b2ff78cf667a90c3940fd48731e6cb44ba18b2a1a8c25505679680effd00f800f815b32aa4eae3a3d76e8463130f9167639484a24bc6df9e05854892828497f4d93ff175398b30cb058ed23db3bda2faea210b40861144ee862b2465ee47611888120560ea5363a560b77085efa7334d662c207fc157666bbf26a411b695cdea5a1bd7c5e3d54e249ac6592c91b16734208673bc355a64f5fa550e8cab996f54b22d3efd1a9c9d9796dbe71eb0da8f8757da36eca8a21452f3496482dd291d6989837d8fe0c71031cc7895d284648a3a6b99a964e3c6d8c78f83a91e70bb4b4752eb2d78121cecf89229324803408a217f39f99a8a0ac208e98cb775743878afcdc8125217cb2a84a7a38757d1fa405f26cd007bba6a5a9119397f6912e33a361316ffa2148b8125d59784c57890c0aa9f854085d908c807d34ad92819814e8367a8ff03e1d40a12fbc91adb7c27e76e070910188c92966c466510a1e2952a2c90c67922dbbe3fd3820eb7b46970c3f3a5a23b24a934b98a2958bc3df07a690e7a205599bc91c55b491e173d938e1b919975dfb17111f61525b640925543e9122d80a165260ce5c63338800106df9b0cb29422b1f0de5cfbf7a895e2a930e71b4f4d990c3b8bfde4a5519f5774eb03914887733100c7168f3fbdd7dde455db9a9a434c81a638f5db6d2376b05d66188bb2fff590d14b4ca8aa5facf6c2b5b274020e005865a36895446a8a987ff5315b4046829c5224d8033a40d2c4145a6a04342a80eb22654ed2ab83d9ce10cde48f9229252c5b7d2098ca6e5467cd97232f2825e494ac9e55e983df8c7c8e5dc3cf861a40959e4c19e5ad98f949453aa778859e43439328e914422f0a5b4fe234b03c5612d9080b745ad2333a2c4c874e6f68b512e7d1d7336e94707e810650da4a0a60d8d515d99d956dedda9a521a49141f332f21bbf03e9fe52fc0021ff79ed3fec5fd93fccbf6880fd5c9cfdc06c86ca4b0d47d7fc919f809ae03537ca962ee628c6015905d72db79027ebd116e367e0b9567c99e362edcd45cb354f1d76e361d69ff0f6008370a08b6c995c8180a76b187ba4698d99c1ac8319c2845960389884db891559f0d0cdb89dab77bcaafb9320753e98e0316b36f50cd6218e0f859f8a58af3ecdf885301b6a2409", + "0x31a3a2ce3603138b8b352e8f192ca55a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f6584bfaf470c1b26175646980f6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xd5c41b52a371aa36c9254ce34324f2a54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x2b06af9719ac64d755623cda8ddd9b944e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcd710b30bd2eab0352ddcc26417aa1940b76934f4cc08dee01012d059e1b83ee": "0x00", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500d1064d79ff558056772616e800e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195043f25e7a03a30387696d6f6e8092156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507f532159f03d44eb6175646980f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0x1405f2411d0af5a7ff397e7c9dc68d194e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ab7b30d24546522861756469804e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a00d3cb0425699a66772616e804bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0x3a65787472696e7369635f696e646578": "0x00000000" }, "childrenDefault": {} } } -} \ No newline at end of file +} diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index c0e225666e47..502c9dbf7217 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -24,8 +24,10 @@ use kusama_runtime as kusama; use kusama_runtime::constants::currency::UNITS as KSM; use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use pallet_staking::Forcing; +#[cfg(feature = "polkadot-native")] use polkadot::constants::currency::UNITS as DOT; use polkadot_primitives::v1::{AccountId, AccountPublic, AssignmentId, ValidatorId}; +#[cfg(feature = "polkadot-native")] use polkadot_runtime as polkadot; use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; use sp_consensus_babe::AuthorityId as BabeId; @@ -44,6 +46,7 @@ use westend_runtime as westend; #[cfg(feature = "westend-native")] use westend_runtime::constants::currency::UNITS as WND; +#[cfg(feature = "polkadot-native")] const POLKADOT_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; #[cfg(feature = "kusama-native")] const KUSAMA_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; @@ -71,34 +74,42 @@ pub struct Extensions { } /// The `ChainSpec` parameterized for the polkadot runtime. +#[cfg(feature = "polkadot-native")] pub type PolkadotChainSpec = service::GenericChainSpec; +// Dummy chain spec, in case when we don't have the native runtime. +pub type DummyChainSpec = service::GenericChainSpec<(), Extensions>; + +// Dummy chain spec, but that is fine when we don't have the native runtime. +#[cfg(not(feature = "polkadot-native"))] +pub type PolkadotChainSpec = DummyChainSpec; + /// The `ChainSpec` parameterized for the kusama runtime. #[cfg(feature = "kusama-native")] pub type KusamaChainSpec = service::GenericChainSpec; /// The `ChainSpec` parameterized for the kusama runtime. -// This actually uses the polkadot chain spec, but that is fine when we don't have the native runtime. +// Dummy chain spec, but that is fine when we don't have the native runtime. #[cfg(not(feature = "kusama-native"))] -pub type KusamaChainSpec = PolkadotChainSpec; +pub type KusamaChainSpec = DummyChainSpec; /// The `ChainSpec` parameterized for the westend runtime. #[cfg(feature = "westend-native")] pub type WestendChainSpec = service::GenericChainSpec; /// The `ChainSpec` parameterized for the westend runtime. -// This actually uses the polkadot chain spec, but that is fine when we don't have the native runtime. +// Dummy chain spec, but that is fine when we don't have the native runtime. #[cfg(not(feature = "westend-native"))] -pub type WestendChainSpec = PolkadotChainSpec; +pub type WestendChainSpec = DummyChainSpec; /// The `ChainSpec` parameterized for the rococo runtime. #[cfg(feature = "rococo-native")] pub type RococoChainSpec = service::GenericChainSpec; /// The `ChainSpec` parameterized for the rococo runtime. -// This actually uses the polkadot chain spec, but that is fine when we don't have the native runtime. +// Dummy chain spec, but that is fine when we don't have the native runtime. #[cfg(not(feature = "rococo-native"))] -pub type RococoChainSpec = PolkadotChainSpec; +pub type RococoChainSpec = DummyChainSpec; /// Extension for the Rococo genesis config to support a custom changes to the genesis state. #[derive(serde::Serialize, serde::Deserialize)] @@ -146,7 +157,12 @@ pub fn wococo_config() -> Result { } /// The default parachains host configuration. -#[cfg(any(feature = "rococo-native", feature = "kusama-native", feature = "westend-native"))] +#[cfg(any( + feature = "rococo-native", + feature = "kusama-native", + feature = "westend-native", + feature = "polkadot-native" +))] fn default_parachains_host_configuration( ) -> polkadot_runtime_parachains::configuration::HostConfiguration< polkadot_primitives::v1::BlockNumber, @@ -174,7 +190,6 @@ fn default_parachains_host_configuration( ump_service_total_weight: 4 * 1_000_000_000, max_upward_message_size: 1024 * 1024, max_upward_message_num_per_candidate: 5, - hrmp_open_request_ttl: 5, hrmp_sender_deposit: 0, hrmp_recipient_deposit: 0, hrmp_channel_max_capacity: 8, @@ -195,6 +210,7 @@ fn default_parachains_host_configuration( } } +#[cfg(feature = "polkadot-native")] fn polkadot_session_keys( babe: BabeId, grandpa: GrandpaId, @@ -272,6 +288,7 @@ fn rococo_session_keys( } } +#[cfg(feature = "polkadot-native")] fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { // subkey inspect "$SECRET" let endowed_accounts = vec![]; @@ -352,6 +369,10 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene claims: polkadot::ClaimsConfig { claims: vec![], vesting: vec![] }, vesting: polkadot::VestingConfig { vesting: vec![] }, treasury: Default::default(), + configuration: polkadot::ConfigurationConfig { + config: default_parachains_host_configuration(), + }, + paras: Default::default(), } } @@ -1053,6 +1074,7 @@ fn rococo_staging_testnet_config_genesis(wasm_binary: &[u8]) -> rococo_runtime:: } /// Polkadot staging testnet config. +#[cfg(feature = "polkadot-native")] pub fn polkadot_staging_testnet_config() -> Result { let wasm_binary = polkadot::WASM_BINARY.ok_or("Polkadot development wasm not available")?; let boot_nodes = vec![]; @@ -1218,6 +1240,7 @@ fn testnet_accounts() -> Vec { } /// Helper function to create polkadot `GenesisConfig` for testing +#[cfg(feature = "polkadot-native")] pub fn polkadot_testnet_genesis( wasm_binary: &[u8], initial_authorities: Vec<( @@ -1296,6 +1319,10 @@ pub fn polkadot_testnet_genesis( claims: polkadot::ClaimsConfig { claims: vec![], vesting: vec![] }, vesting: polkadot::VestingConfig { vesting: vec![] }, treasury: Default::default(), + configuration: polkadot::ConfigurationConfig { + config: default_parachains_host_configuration(), + }, + paras: Default::default(), } } @@ -1531,7 +1558,10 @@ pub fn rococo_testnet_genesis( authority_discovery: rococo_runtime::AuthorityDiscoveryConfig { keys: vec![] }, sudo: rococo_runtime::SudoConfig { key: root_key.clone() }, configuration: rococo_runtime::ConfigurationConfig { - config: default_parachains_host_configuration(), + config: polkadot_runtime_parachains::configuration::HostConfiguration { + max_validators_per_core: Some(1), + ..default_parachains_host_configuration() + }, }, hrmp: Default::default(), paras: rococo_runtime::ParasConfig { paras: vec![] }, @@ -1557,6 +1587,7 @@ pub fn rococo_testnet_genesis( } } +#[cfg(feature = "polkadot-native")] fn polkadot_development_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { polkadot_testnet_genesis( wasm_binary, @@ -1597,6 +1628,7 @@ fn rococo_development_config_genesis(wasm_binary: &[u8]) -> rococo_runtime::Gene } /// Polkadot development config (single validator Alice) +#[cfg(feature = "polkadot-native")] pub fn polkadot_development_config() -> Result { let wasm_binary = polkadot::WASM_BINARY.ok_or("Polkadot development wasm not available")?; @@ -1694,6 +1726,7 @@ pub fn wococo_development_config() -> Result { )) } +#[cfg(feature = "polkadot-native")] fn polkadot_local_testnet_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { polkadot_testnet_genesis( wasm_binary, @@ -1707,6 +1740,7 @@ fn polkadot_local_testnet_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig } /// Polkadot local testnet config (multivalidator Alice + Bob) +#[cfg(feature = "polkadot-native")] pub fn polkadot_local_testnet_config() -> Result { let wasm_binary = polkadot::WASM_BINARY.ok_or("Polkadot development wasm not available")?; @@ -1817,18 +1851,23 @@ pub fn rococo_local_testnet_config() -> Result { )) } -/// Wococo is a temporary testnet that uses the same runtime as rococo. +/// Wococo is a temporary testnet that uses almost the same runtime as rococo. #[cfg(feature = "rococo-native")] fn wococo_local_testnet_genesis(wasm_binary: &[u8]) -> rococo_runtime::GenesisConfig { rococo_testnet_genesis( wasm_binary, - vec![get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob")], + vec![ + get_authority_keys_from_seed("Alice"), + get_authority_keys_from_seed("Bob"), + get_authority_keys_from_seed("Charlie"), + get_authority_keys_from_seed("Dave"), + ], get_account_id_from_seed::("Alice"), None, ) } -/// Wococo local testnet config (multivalidator Alice + Bob) +/// Wococo local testnet config (multivalidator Alice + Bob + Charlie + Dave) #[cfg(feature = "rococo-native")] pub fn wococo_local_testnet_config() -> Result { let wasm_binary = rococo::WASM_BINARY.ok_or("Wococo development wasm not available")?; diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 72277434b50c..a1005f284686 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -24,12 +24,10 @@ mod parachains_db; mod relay_chain_selection; #[cfg(feature = "full-node")] -mod overseer; +pub mod overseer; #[cfg(feature = "full-node")] -pub use self::overseer::{ - create_default_subsystems, OverseerGen, OverseerGenArgs, RealOverseerGen, -}; +pub use self::overseer::{OverseerGen, OverseerGenArgs, RealOverseerGen}; #[cfg(all(test, feature = "disputes"))] mod tests; @@ -54,8 +52,9 @@ use { pub use sp_core::traits::SpawnNamed; #[cfg(feature = "full-node")] pub use { - polkadot_overseer::{Handle, Overseer, OverseerHandle}, + polkadot_overseer::{Handle, Overseer, OverseerConnector, OverseerHandle}, polkadot_primitives::v1::ParachainHost, + relay_chain_selection::SelectRelayChain, sc_client_api::AuxStore, sp_authority_discovery::AuthorityDiscoveryApi, sp_blockchain::HeaderBackend, @@ -68,6 +67,8 @@ use polkadot_subsystem::jaeger; use std::{sync::Arc, time::Duration}; use prometheus_endpoint::Registry; +#[cfg(feature = "full-node")] +use service::KeystoreContainer; use service::RpcHandlers; use telemetry::TelemetryWorker; #[cfg(feature = "full-node")] @@ -82,11 +83,15 @@ pub use polkadot_client::WestendExecutorDispatch; #[cfg(feature = "kusama-native")] pub use polkadot_client::KusamaExecutorDispatch; +#[cfg(feature = "polkadot-native")] +pub use polkadot_client::PolkadotExecutorDispatch; + pub use chain_spec::{KusamaChainSpec, PolkadotChainSpec, RococoChainSpec, WestendChainSpec}; pub use consensus_common::{block_validation::Chain, Proposal, SelectChain}; +#[cfg(feature = "full-node")] pub use polkadot_client::{ AbstractClient, Client, ClientHandle, ExecuteWithClient, FullBackend, FullClient, - PolkadotExecutorDispatch, RuntimeApiCollection, + RuntimeApiCollection, }; pub use polkadot_primitives::v1::{Block, BlockId, CollatorPair, Hash, Id as ParaId}; pub use sc_client_api::{Backend, CallExecutor, ExecutionStrategy}; @@ -110,6 +115,7 @@ pub use sp_runtime::{ #[cfg(feature = "kusama-native")] pub use kusama_runtime; +#[cfg(feature = "polkadot-native")] pub use polkadot_runtime; #[cfg(feature = "rococo-native")] pub use rococo_runtime; @@ -226,6 +232,10 @@ pub enum Error { #[cfg(feature = "full-node")] #[error("Creating a custom database is required for validators")] DatabasePathRequired, + + #[cfg(feature = "full-node")] + #[error("Expected at least one of polkadot, kusama, westend or rococo runtime feature")] + NoRuntime, } /// Can be called for a `Configuration` to identify which network the configuration targets. @@ -293,14 +303,15 @@ fn jaeger_launch_collector_with_agent( } #[cfg(feature = "full-node")] -type FullSelectChain = relay_chain_selection::SelectRelayChainWithFallback; +type FullSelectChain = relay_chain_selection::SelectRelayChain; #[cfg(feature = "full-node")] -type FullGrandpaBlockImport = grandpa::GrandpaBlockImport< - FullBackend, - Block, - FullClient, - FullSelectChain, ->; +type FullGrandpaBlockImport = + grandpa::GrandpaBlockImport< + FullBackend, + Block, + FullClient, + ChainSelection, + >; #[cfg(feature = "light-node")] type LightBackend = service::TLightBackendWithHash; @@ -310,36 +321,29 @@ type LightClient = service::TLightClientWithBackend; #[cfg(feature = "full-node")] -fn new_partial( +struct Basics +where + RuntimeApi: ConstructRuntimeApi> + + Send + + Sync + + 'static, + RuntimeApi::RuntimeApi: + RuntimeApiCollection>, + ExecutorDispatch: NativeExecutionDispatch + 'static, +{ + task_manager: TaskManager, + client: Arc>, + backend: Arc, + keystore_container: KeystoreContainer, + telemetry: Option, +} + +#[cfg(feature = "full-node")] +fn new_partial_basics( config: &mut Configuration, jaeger_agent: Option, telemetry_worker_handle: Option, -) -> Result< - service::PartialComponents< - FullClient, - FullBackend, - FullSelectChain, - sc_consensus::DefaultImportQueue>, - sc_transaction_pool::FullPool>, - ( - impl service::RpcExtensionBuilder, - ( - babe::BabeBlockImport< - Block, - FullClient, - FullGrandpaBlockImport, - >, - grandpa::LinkHalf, FullSelectChain>, - babe::BabeLink, - beefy_gadget::notification::BeefySignedCommitmentSender, - ), - grandpa::SharedVoterState, - std::time::Duration, // slot-duration - Option, - ), - >, - Error, -> +) -> Result, Error> where RuntimeApi: ConstructRuntimeApi> + Send @@ -391,12 +395,53 @@ where jaeger_launch_collector_with_agent(task_manager.spawn_handle(), &*config, jaeger_agent)?; - let select_chain = relay_chain_selection::SelectRelayChainWithFallback::new( - backend.clone(), - Handle::new_disconnected(), - polkadot_node_subsystem_util::metrics::Metrics::register(config.prometheus_registry())?, - ); + Ok(Basics { task_manager, client, backend, keystore_container, telemetry }) +} +#[cfg(feature = "full-node")] +fn new_partial( + config: &mut Configuration, + Basics { task_manager, backend, client, keystore_container, telemetry }: Basics< + RuntimeApi, + ExecutorDispatch, + >, + select_chain: ChainSelection, +) -> Result< + service::PartialComponents< + FullClient, + FullBackend, + ChainSelection, + sc_consensus::DefaultImportQueue>, + sc_transaction_pool::FullPool>, + ( + impl service::RpcExtensionBuilder, + ( + babe::BabeBlockImport< + Block, + FullClient, + FullGrandpaBlockImport, + >, + grandpa::LinkHalf, ChainSelection>, + babe::BabeLink, + beefy_gadget::notification::BeefySignedCommitmentSender, + ), + grandpa::SharedVoterState, + std::time::Duration, // slot-duration + Option, + ), + >, + Error, +> +where + RuntimeApi: ConstructRuntimeApi> + + Send + + Sync + + 'static, + RuntimeApi::RuntimeApi: + RuntimeApiCollection>, + ExecutorDispatch: NativeExecutionDispatch + 'static, + ChainSelection: 'static + SelectChain, +{ let transaction_pool = sc_transaction_pool::BasicPool::new_full( config.transaction_pool.clone(), config.role.is_authority().into(), @@ -665,23 +710,53 @@ where let disable_grandpa = config.disable_grandpa; let name = config.network.node_name.clone(); - let service::PartialComponents { + let basics = new_partial_basics::( + &mut config, + jaeger_agent, + telemetry_worker_handle, + )?; + + let prometheus_registry = config.prometheus_registry().cloned(); + + let overseer_connector = OverseerConnector::default(); + let overseer_handle = Handle::new(overseer_connector.handle()); + + let chain_spec = config.chain_spec.cloned_box(); + + // we should remove this check before we deploy parachains on polkadot + // TODO: https://github.com/paritytech/polkadot/issues/3326 + let is_relay_chain = chain_spec.is_kusama() || + chain_spec.is_westend() || + chain_spec.is_rococo() || + chain_spec.is_wococo(); + + let local_keystore = basics.keystore_container.local_keystore(); + let requires_overseer_for_chain_sel = local_keystore.is_some() && + is_relay_chain && + (role.is_authority() || is_collator.is_collator()); + + let select_chain = SelectRelayChain::new( + basics.backend.clone(), + overseer_handle.clone(), + requires_overseer_for_chain_sel, + polkadot_node_subsystem_util::metrics::Metrics::register(prometheus_registry.as_ref())?, + ); + + let service::PartialComponents::<_, _, SelectRelayChain<_>, _, _, _> { client, backend, mut task_manager, keystore_container, - mut select_chain, + select_chain, import_queue, transaction_pool, other: (rpc_extensions_builder, import_setup, rpc_setup, slot_duration, mut telemetry), - } = new_partial::( + } = new_partial::>( &mut config, - jaeger_agent, - telemetry_worker_handle, + basics, + select_chain, )?; - let prometheus_registry = config.prometheus_registry().cloned(); - let shared_voter_state = rpc_setup; let auth_disc_publish_non_global_ips = config.network.allow_non_globals_in_dht; @@ -690,7 +765,7 @@ where // Substrate nodes. config.network.extra_sets.push(grandpa::grandpa_peers_set_config()); - if config.chain_spec.is_rococo() || config.chain_spec.is_wococo() { + if chain_spec.is_rococo() || chain_spec.is_wococo() { config.network.extra_sets.push(beefy_gadget::beefy_peers_set_config()); } @@ -775,7 +850,6 @@ where col_data: crate::parachains_db::REAL_COLUMNS.col_dispute_coordinator_data, }; - let chain_spec = config.chain_spec.cloned_box(); let rpc_handlers = service::spawn_tasks(service::SpawnTasksParams { config, backend: backend.clone(), @@ -795,7 +869,10 @@ where let overseer_client = client.clone(); let spawner = task_manager.spawn_handle(); - let active_leaves = futures::executor::block_on(active_leaves(&select_chain, &*client))?; + // Cannot use the `RelayChainSelection`, since that'd require a setup _and running_ overseer + // which we are about to setup. + let active_leaves = + futures::executor::block_on(active_leaves(select_chain.as_longest_chain(), &*client))?; let authority_discovery_service = if role.is_authority() || is_collator.is_collator() { use futures::StreamExt; @@ -832,7 +909,6 @@ where None }; - let local_keystore = keystore_container.local_keystore(); if local_keystore.is_none() { tracing::info!("Cannot run as validator without local keystore."); } @@ -843,6 +919,7 @@ where let overseer_handle = if let Some((authority_discovery_service, keystore)) = maybe_params { let (overseer, overseer_handle) = overseer_gen .generate::>( + overseer_connector, OverseerGenArgs { leaves: active_leaves, keystore, @@ -866,43 +943,37 @@ where dispute_coordinator_config, }, )?; - let handle = Handle::Connected(overseer_handle.clone()); - let handle_clone = handle.clone(); - - task_manager.spawn_essential_handle().spawn_blocking( - "overseer", - Box::pin(async move { - use futures::{pin_mut, select, FutureExt}; - - let forward = polkadot_overseer::forward_events(overseer_client, handle_clone); - - let forward = forward.fuse(); - let overseer_fut = overseer.run().fuse(); - - pin_mut!(overseer_fut); - pin_mut!(forward); - - select! { - _ = forward => (), - _ = overseer_fut => (), - complete => (), - } - }), - ); - // we should remove this check before we deploy parachains on polkadot - // TODO: https://github.com/paritytech/polkadot/issues/3326 - let should_connect_overseer = chain_spec.is_kusama() || - chain_spec.is_westend() || - chain_spec.is_rococo() || - chain_spec.is_wococo(); - - if should_connect_overseer { - select_chain.connect_to_overseer(overseer_handle.clone()); - } else { - tracing::info!("Overseer is running in the disconnected state"); + let handle = Handle::new(overseer_handle.clone()); + + { + let handle = handle.clone(); + task_manager.spawn_essential_handle().spawn_blocking( + "overseer", + Box::pin(async move { + use futures::{pin_mut, select, FutureExt}; + + let forward = polkadot_overseer::forward_events(overseer_client, handle); + + let forward = forward.fuse(); + let overseer_fut = overseer.run().fuse(); + + pin_mut!(overseer_fut); + pin_mut!(forward); + + select! { + _ = forward => (), + _ = overseer_fut => (), + complete => (), + } + }), + ); } Some(handle) } else { + assert!( + !requires_overseer_for_chain_sel, + "Precondition congruence (false) is guaranteed by manual checking. qed" + ); None }; @@ -1219,6 +1290,32 @@ where Ok((task_manager, rpc_handlers)) } +#[cfg(feature = "full-node")] +macro_rules! chain_ops { + ($config:expr, $jaeger_agent:expr, $telemetry_worker_handle:expr; $scope:ident, $executor:ident, $variant:ident) => {{ + let telemetry_worker_handle = $telemetry_worker_handle; + let jaeger_agent = $jaeger_agent; + let mut config = $config; + let basics = new_partial_basics::<$scope::RuntimeApi, $executor>( + config, + jaeger_agent, + telemetry_worker_handle, + )?; + + use ::sc_consensus::LongestChain; + // use the longest chain selection, since there is no overseer available + let chain_selection = LongestChain::new(basics.backend.clone()); + + let service::PartialComponents { client, backend, import_queue, task_manager, .. } = + new_partial::<$scope::RuntimeApi, $executor, LongestChain<_, Block>>( + &mut config, + basics, + chain_selection, + )?; + Ok((Arc::new(Client::$variant(client)), backend, import_queue, task_manager)) + }}; +} + /// Builds a new object suitable for chain operations. #[cfg(feature = "full-node")] pub fn new_chain_ops( @@ -1235,46 +1332,29 @@ pub fn new_chain_ops( > { config.keystore = service::config::KeystoreConfig::InMemory; + let telemetry_worker_handle = None; + #[cfg(feature = "rococo-native")] if config.chain_spec.is_rococo() || config.chain_spec.is_wococo() { - let service::PartialComponents { client, backend, import_queue, task_manager, .. } = - new_partial::( - config, - jaeger_agent, - None, - )?; - return Ok((Arc::new(Client::Rococo(client)), backend, import_queue, task_manager)) + return chain_ops!(config, jaeger_agent, telemetry_worker_handle; rococo_runtime, RococoExecutorDispatch, Rococo) } #[cfg(feature = "kusama-native")] if config.chain_spec.is_kusama() { - let service::PartialComponents { client, backend, import_queue, task_manager, .. } = - new_partial::( - config, - jaeger_agent, - None, - )?; - return Ok((Arc::new(Client::Kusama(client)), backend, import_queue, task_manager)) + return chain_ops!(config, jaeger_agent, telemetry_worker_handle; kusama_runtime, KusamaExecutorDispatch, Kusama) } #[cfg(feature = "westend-native")] if config.chain_spec.is_westend() { - let service::PartialComponents { client, backend, import_queue, task_manager, .. } = - new_partial::( - config, - jaeger_agent, - None, - )?; - return Ok((Arc::new(Client::Westend(client)), backend, import_queue, task_manager)) + return chain_ops!(config, jaeger_agent, telemetry_worker_handle; westend_runtime, WestendExecutorDispatch, Westend) } - let service::PartialComponents { client, backend, import_queue, task_manager, .. } = - new_partial::( - config, - jaeger_agent, - None, - )?; - Ok((Arc::new(Client::Polkadot(client)), backend, import_queue, task_manager)) + #[cfg(feature = "polkadot-native")] + { + return chain_ops!(config, jaeger_agent, telemetry_worker_handle; polkadot_runtime, PolkadotExecutorDispatch, Polkadot) + } + #[cfg(not(feature = "polkadot-native"))] + Err(Error::NoRuntime) } /// Build a new light node. @@ -1295,7 +1375,13 @@ pub fn build_light(config: Configuration) -> Result<(TaskManager, RpcHandlers), return new_light::(config) } - new_light::(config) + #[cfg(feature = "polkadot-native")] + { + return new_light::(config) + } + + #[cfg(not(feature = "polkadot-native"))] + Err(Error::NoRuntime) } #[cfg(feature = "full-node")] @@ -1353,15 +1439,21 @@ pub fn build_full( .map(|full| full.with_client(Client::Westend)) } - new_full::( - config, - is_collator, - grandpa_pause, - disable_beefy, - jaeger_agent, - telemetry_worker_handle, - None, - overseer_gen, - ) - .map(|full| full.with_client(Client::Polkadot)) + #[cfg(feature = "polkadot-native")] + { + return new_full::( + config, + is_collator, + grandpa_pause, + disable_beefy, + jaeger_agent, + telemetry_worker_handle, + None, + overseer_gen, + ) + .map(|full| full.with_client(Client::Polkadot)) + } + + #[cfg(not(feature = "polkadot-native"))] + Err(Error::NoRuntime) } diff --git a/node/service/src/overseer.rs b/node/service/src/overseer.rs index 280187f977b0..4651626d46b5 100644 --- a/node/service/src/overseer.rs +++ b/node/service/src/overseer.rs @@ -15,6 +15,7 @@ // along with Polkadot. If not, see . use super::{AuthorityDiscoveryApi, Block, Error, Hash, IsCollator, Registry, SpawnNamed}; +use lru::LruCache; use polkadot_availability_distribution::IncomingRequestReceivers; use polkadot_node_core_approval_voting::Config as ApprovalVotingConfig; use polkadot_node_core_av_store::Config as AvailabilityConfig; @@ -22,7 +23,16 @@ use polkadot_node_core_candidate_validation::Config as CandidateValidationConfig use polkadot_node_core_chain_selection::Config as ChainSelectionConfig; use polkadot_node_core_dispute_coordinator::Config as DisputeCoordinatorConfig; use polkadot_node_network_protocol::request_response::{v1 as request_v1, IncomingRequestReceiver}; -use polkadot_overseer::{AllSubsystems, BlockInfo, Overseer, OverseerHandle}; +#[cfg(any(feature = "malus", test))] +pub use polkadot_overseer::{ + dummy::{dummy_overseer_builder, DummySubsystem}, + HeadSupportsParachains, +}; +use polkadot_overseer::{ + metrics::Metrics as OverseerMetrics, BlockInfo, MetricsTrait, Overseer, OverseerBuilder, + OverseerConnector, OverseerHandle, +}; + use polkadot_primitives::v1::ParachainHost; use sc_authority_discovery::Service as AuthorityDiscoveryService; use sc_client_api::AuxStore; @@ -99,12 +109,11 @@ where pub dispute_coordinator_config: DisputeCoordinatorConfig, } -/// Create a default, unaltered set of subsystems. -/// -/// A convenience for usage with malus, to avoid -/// repetitive code across multiple behavior strain implementations. -pub fn create_default_subsystems<'a, Spawner, RuntimeClient>( +/// Obtain a prepared `OverseerBuilder`, that is initialized +/// with all default values. +pub fn prepared_overseer_builder<'a, Spawner, RuntimeClient>( OverseerGenArgs { + leaves, keystore, runtime_client, parachains_db, @@ -124,10 +133,11 @@ pub fn create_default_subsystems<'a, Spawner, RuntimeClient>( candidate_validation_config, chain_selection_config, dispute_coordinator_config, - .. }: OverseerGenArgs<'a, Spawner, RuntimeClient>, ) -> Result< - AllSubsystems< + OverseerBuilder< + Spawner, + Arc, CandidateValidationSubsystem, CandidateBackingSubsystem, StatementDistributionSubsystem, @@ -147,7 +157,7 @@ pub fn create_default_subsystems<'a, Spawner, RuntimeClient>( CollatorProtocolSubsystem, ApprovalDistributionSubsystem, ApprovalVotingSubsystem, - GossipSupportSubsystem, + GossipSupportSubsystem, DisputeCoordinatorSubsystem, DisputeParticipationSubsystem, DisputeDistributionSubsystem, @@ -161,41 +171,44 @@ where Spawner: 'static + SpawnNamed + Clone + Unpin, { use polkadot_node_subsystem_util::metrics::Metrics; + use std::iter::FromIterator; + + let metrics = ::register(registry)?; - let all_subsystems = AllSubsystems { - availability_distribution: AvailabilityDistributionSubsystem::new( + let builder = Overseer::builder() + .availability_distribution(AvailabilityDistributionSubsystem::new( keystore.clone(), IncomingRequestReceivers { pov_req_receiver, chunk_req_receiver }, Metrics::register(registry)?, - ), - availability_recovery: AvailabilityRecoverySubsystem::with_chunks_only( + )) + .availability_recovery(AvailabilityRecoverySubsystem::with_chunks_only( available_data_req_receiver, Metrics::register(registry)?, - ), - availability_store: AvailabilityStoreSubsystem::new( + )) + .availability_store(AvailabilityStoreSubsystem::new( parachains_db.clone(), availability_config, Metrics::register(registry)?, - ), - bitfield_distribution: BitfieldDistributionSubsystem::new(Metrics::register(registry)?), - bitfield_signing: BitfieldSigningSubsystem::new( + )) + .bitfield_distribution(BitfieldDistributionSubsystem::new(Metrics::register(registry)?)) + .bitfield_signing(BitfieldSigningSubsystem::new( spawner.clone(), keystore.clone(), Metrics::register(registry)?, - ), - candidate_backing: CandidateBackingSubsystem::new( + )) + .candidate_backing(CandidateBackingSubsystem::new( spawner.clone(), keystore.clone(), Metrics::register(registry)?, - ), - candidate_validation: CandidateValidationSubsystem::with_config( + )) + .candidate_validation(CandidateValidationSubsystem::with_config( candidate_validation_config, Metrics::register(registry)?, // candidate-validation metrics Metrics::register(registry)?, // validation host metrics - ), - chain_api: ChainApiSubsystem::new(runtime_client.clone(), Metrics::register(registry)?), - collation_generation: CollationGenerationSubsystem::new(Metrics::register(registry)?), - collator_protocol: { + )) + .chain_api(ChainApiSubsystem::new(runtime_client.clone(), Metrics::register(registry)?)) + .collation_generation(CollationGenerationSubsystem::new(Metrics::register(registry)?)) + .collator_protocol({ let side = match is_collator { IsCollator::Yes(collator_pair) => ProtocolSide::Collator( network_service.local_peer_id().clone(), @@ -210,48 +223,63 @@ where }, }; CollatorProtocolSubsystem::new(side) - }, - network_bridge: NetworkBridgeSubsystem::new( + }) + .network_bridge(NetworkBridgeSubsystem::new( network_service.clone(), authority_discovery_service.clone(), Box::new(network_service.clone()), Metrics::register(registry)?, - ), - provisioner: ProvisionerSubsystem::new(spawner.clone(), (), Metrics::register(registry)?), - runtime_api: RuntimeApiSubsystem::new( + )) + .provisioner(ProvisionerSubsystem::new(spawner.clone(), (), Metrics::register(registry)?)) + .runtime_api(RuntimeApiSubsystem::new( runtime_client.clone(), Metrics::register(registry)?, spawner.clone(), - ), - statement_distribution: StatementDistributionSubsystem::new( + )) + .statement_distribution(StatementDistributionSubsystem::new( keystore.clone(), statement_req_receiver, Metrics::register(registry)?, - ), - approval_distribution: ApprovalDistributionSubsystem::new(Metrics::register(registry)?), - approval_voting: ApprovalVotingSubsystem::with_config( + )) + .approval_distribution(ApprovalDistributionSubsystem::new(Metrics::register(registry)?)) + .approval_voting(ApprovalVotingSubsystem::with_config( approval_voting_config, parachains_db.clone(), keystore.clone(), Box::new(network_service.clone()), Metrics::register(registry)?, - ), - gossip_support: GossipSupportSubsystem::new(keystore.clone()), - dispute_coordinator: DisputeCoordinatorSubsystem::new( + )) + .gossip_support(GossipSupportSubsystem::new( + keystore.clone(), + authority_discovery_service.clone(), + )) + .dispute_coordinator(DisputeCoordinatorSubsystem::new( parachains_db.clone(), dispute_coordinator_config, keystore.clone(), - ), - dispute_participation: DisputeParticipationSubsystem::new(), - dispute_distribution: DisputeDistributionSubsystem::new( + Metrics::register(registry)?, + )) + .dispute_participation(DisputeParticipationSubsystem::new()) + .dispute_distribution(DisputeDistributionSubsystem::new( keystore.clone(), dispute_req_receiver, authority_discovery_service.clone(), Metrics::register(registry)?, - ), - chain_selection: ChainSelectionSubsystem::new(chain_selection_config, parachains_db), - }; - Ok(all_subsystems) + )) + .chain_selection(ChainSelectionSubsystem::new(chain_selection_config, parachains_db)) + .leaves(Vec::from_iter( + leaves + .into_iter() + .map(|BlockInfo { hash, parent_hash: _, number }| (hash, number)), + )) + .activation_external_listeners(Default::default()) + .span_per_active_leaf(Default::default()) + .active_leaves(Default::default()) + .supports_parachains(runtime_client) + .known_leaves(LruCache::new(KNOWN_LEAVES_CACHE_SIZE)) + .metrics(metrics) + .spawner(spawner); + Ok(builder) } /// Trait for the `fn` generating the overseer. @@ -262,6 +290,7 @@ pub trait OverseerGen { /// Overwrite the full generation of the overseer, including the subsystems. fn generate<'a, Spawner, RuntimeClient>( &self, + connector: OverseerConnector, args: OverseerGenArgs<'a, Spawner, RuntimeClient>, ) -> Result<(Overseer>, OverseerHandle), Error> where @@ -270,19 +299,22 @@ pub trait OverseerGen { Spawner: 'static + SpawnNamed + Clone + Unpin, { let gen = RealOverseerGen; - RealOverseerGen::generate::(&gen, args) + RealOverseerGen::generate::(&gen, connector, args) } // It would be nice to make `create_subsystems` part of this trait, // but the amount of generic arguments that would be required as // as consequence make this rather annoying to implement and use. } +use polkadot_overseer::KNOWN_LEAVES_CACHE_SIZE; + /// The regular set of subsystems. pub struct RealOverseerGen; impl OverseerGen for RealOverseerGen { fn generate<'a, Spawner, RuntimeClient>( &self, + connector: OverseerConnector, args: OverseerGenArgs<'a, Spawner, RuntimeClient>, ) -> Result<(Overseer>, OverseerHandle), Error> where @@ -290,14 +322,8 @@ impl OverseerGen for RealOverseerGen { RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, Spawner: 'static + SpawnNamed + Clone + Unpin, { - let spawner = args.spawner.clone(); - let leaves = args.leaves.clone(); - let runtime_client = args.runtime_client.clone(); - let registry = args.registry.clone(); - - let all_subsystems = create_default_subsystems::(args)?; - - Overseer::new(leaves, all_subsystems, registry, runtime_client, spawner) + prepared_overseer_builder(args)? + .build_with_connector(connector) .map_err(|e| e.into()) } } diff --git a/node/service/src/relay_chain_selection.rs b/node/service/src/relay_chain_selection.rs index 184d526eac47..31d878218e8f 100644 --- a/node/service/src/relay_chain_selection.rs +++ b/node/service/src/relay_chain_selection.rs @@ -39,7 +39,7 @@ use super::{HeaderProvider, HeaderProviderProvider}; use consensus_common::{Error as ConsensusError, SelectChain}; use futures::channel::oneshot; use polkadot_node_subsystem_util::metrics::{self, prometheus}; -use polkadot_overseer::{AllMessages, Handle, OverseerHandle}; +use polkadot_overseer::{AllMessages, Handle}; use polkadot_primitives::v1::{ Block as PolkadotBlock, BlockNumber, Hash, Header as PolkadotHeader, }; @@ -109,66 +109,67 @@ impl Metrics { } /// A chain-selection implementation which provides safety for relay chains. -pub struct SelectRelayChainWithFallback> { - // A fallback to use in case the overseer is disconnected. - // - // This is used on relay chains which have not yet enabled - // parachains as well as situations where the node is offline. - fallback: sc_consensus::LongestChain, - selection: SelectRelayChain, +pub struct SelectRelayChain> { + is_relay_chain: bool, + longest_chain: sc_consensus::LongestChain, + selection: SelectRelayChainInner, } -impl Clone for SelectRelayChainWithFallback +impl Clone for SelectRelayChain where B: sc_client_api::Backend, - SelectRelayChain: Clone, + SelectRelayChainInner: Clone, { fn clone(&self) -> Self { - Self { fallback: self.fallback.clone(), selection: self.selection.clone() } + Self { + longest_chain: self.longest_chain.clone(), + is_relay_chain: self.is_relay_chain, + selection: self.selection.clone(), + } } } -impl SelectRelayChainWithFallback +impl SelectRelayChain where B: sc_client_api::Backend + 'static, { - /// Create a new [`SelectRelayChainWithFallback`] wrapping the given chain backend + /// Create a new [`SelectRelayChain`] wrapping the given chain backend /// and a handle to the overseer. - pub fn new(backend: Arc, overseer: Handle, metrics: Metrics) -> Self { - SelectRelayChainWithFallback { - fallback: sc_consensus::LongestChain::new(backend.clone()), - selection: SelectRelayChain::new(backend, overseer, metrics), + pub fn new(backend: Arc, overseer: Handle, is_relay_chain: bool, metrics: Metrics) -> Self { + tracing::debug!( + target: LOG_TARGET, + "Using {} as chain selection algorithm", + if is_relay_chain { "dispute aware relay" } else { "longest" } + ); + SelectRelayChain { + longest_chain: sc_consensus::LongestChain::new(backend.clone()), + selection: SelectRelayChainInner::new(backend, overseer, metrics), + is_relay_chain, } } -} -impl SelectRelayChainWithFallback -where - B: sc_client_api::Backend + 'static, -{ - /// Given an overseer handle, this connects the [`SelectRelayChainWithFallback`]'s - /// internal handle and its clones to the same overseer. - pub fn connect_to_overseer(&mut self, handle: OverseerHandle) { - self.selection.overseer.connect_to_overseer(handle); + /// Allow access to the inner chain, for usage during the node setup. + pub fn as_longest_chain(&self) -> &sc_consensus::LongestChain { + &self.longest_chain } } #[async_trait::async_trait] -impl SelectChain for SelectRelayChainWithFallback +impl SelectChain for SelectRelayChain where B: sc_client_api::Backend + 'static, { async fn leaves(&self) -> Result, ConsensusError> { - if self.selection.overseer.is_disconnected() { - return self.fallback.leaves().await + if !self.is_relay_chain { + return self.longest_chain.leaves().await } self.selection.leaves().await } async fn best_chain(&self) -> Result { - if self.selection.overseer.is_disconnected() { - return self.fallback.best_chain().await + if !self.is_relay_chain { + return self.longest_chain.best_chain().await } self.selection.best_chain().await } @@ -177,36 +178,36 @@ where &self, target_hash: Hash, maybe_max_number: Option, - ) -> Result, ConsensusError> { + ) -> Result { let longest_chain_best = - self.fallback.finality_target(target_hash, maybe_max_number).await?; + self.longest_chain.finality_target(target_hash, maybe_max_number).await?; - if self.selection.overseer.is_disconnected() { + if !self.is_relay_chain { return Ok(longest_chain_best) } self.selection - .finality_target_with_fallback(target_hash, longest_chain_best, maybe_max_number) + .finality_target_with_longest_chain(target_hash, longest_chain_best, maybe_max_number) .await } } /// A chain-selection implementation which provides safety for relay chains /// but does not handle situations where the overseer is not yet connected. -pub struct SelectRelayChain { +pub struct SelectRelayChainInner { backend: Arc, overseer: OH, metrics: Metrics, } -impl SelectRelayChain +impl SelectRelayChainInner where B: HeaderProviderProvider, OH: OverseerHandleT, { - /// Create a new [`SelectRelayChain`] wrapping the given chain backend + /// Create a new [`SelectRelayChainInner`] wrapping the given chain backend /// and a handle to the overseer. pub fn new(backend: Arc, overseer: OH, metrics: Metrics) -> Self { - SelectRelayChain { backend, overseer, metrics } + SelectRelayChainInner { backend, overseer, metrics } } fn block_header(&self, hash: Hash) -> Result { @@ -234,13 +235,13 @@ where } } -impl Clone for SelectRelayChain +impl Clone for SelectRelayChainInner where B: HeaderProviderProvider + Send + Sync, OH: OverseerHandleT, { fn clone(&self) -> Self { - SelectRelayChain { + SelectRelayChainInner { backend: self.backend.clone(), overseer: self.overseer.clone(), metrics: self.metrics.clone(), @@ -273,7 +274,7 @@ impl OverseerHandleT for Handle { } } -impl SelectRelayChain +impl SelectRelayChainInner where B: HeaderProviderProvider, OH: OverseerHandleT, @@ -288,9 +289,14 @@ where .send_msg(ChainSelectionMessage::Leaves(tx), std::any::type_name::()) .await; - rx.await + let leaves = rx + .await .map_err(Error::OverseerDisconnected) - .map_err(|e| ConsensusError::Other(Box::new(e))) + .map_err(|e| ConsensusError::Other(Box::new(e)))?; + + tracing::trace!(target: LOG_TARGET, ?leaves, "Chain selection leaves"); + + Ok(leaves) } /// Among all leaves, pick the one which is the best chain to build upon. @@ -305,6 +311,8 @@ where .ok_or_else(|| ConsensusError::Other(Box::new(Error::EmptyLeaves)))? .clone(); + tracing::trace!(target: LOG_TARGET, ?best_leaf, "Best chain"); + self.block_header(best_leaf) } @@ -317,13 +325,14 @@ where /// /// It will also constrain the chain to only chains which are fully /// approved, and chains which contain no disputes. - pub(crate) async fn finality_target_with_fallback( + pub(crate) async fn finality_target_with_longest_chain( &self, target_hash: Hash, - best_leaf: Option, + best_leaf: Hash, maybe_max_number: Option, - ) -> Result, ConsensusError> { + ) -> Result { let mut overseer = self.overseer.clone(); + tracing::trace!(target: LOG_TARGET, ?best_leaf, "Longest chain"); let subchain_head = if cfg!(feature = "disputes") { let (tx, rx) = oneshot::channel(); @@ -339,15 +348,19 @@ where .map_err(Error::OverseerDisconnected) .map_err(|e| ConsensusError::Other(Box::new(e)))?; + tracing::trace!(target: LOG_TARGET, ?best, "Best leaf containing"); + match best { // No viable leaves containing the block. - None => return Ok(Some(target_hash)), + None => return Ok(target_hash), Some(best) => best, } } else { - match best_leaf { - None => return Ok(Some(target_hash)), - Some(best_leaf) => best_leaf, + tracing::trace!(target: LOG_TARGET, ?best_leaf, "Dummy disputes active"); + if best_leaf == target_hash { + return Ok(target_hash) + } else { + best_leaf } }; @@ -366,12 +379,13 @@ where "`finality_target` max number is less than target number", ); } - return Ok(Some(target_hash)) + return Ok(target_hash) } // find the current number. let subchain_header = self.block_header(subchain_head)?; if subchain_header.number <= max { + tracing::trace!(target: LOG_TARGET, ?best_leaf, "Constrained sub-chain head",); subchain_head } else { let (ancestor_hash, _) = @@ -381,7 +395,11 @@ where &subchain_header, ) .map_err(|e| ConsensusError::ChainLookup(format!("{:?}", e)))?; - + tracing::trace!( + target: LOG_TARGET, + ?ancestor_hash, + "Grandpa walk backwards sub-chain head" + ); ancestor_hash } }, @@ -412,6 +430,12 @@ where } }; + tracing::trace!( + target: LOG_TARGET, + ?subchain_head, + "Ancestor approval restriction applied", + ); + let lag = initial_leaf_number.saturating_sub(subchain_number); self.metrics.note_approval_checking_finality_lag(lag); @@ -427,7 +451,7 @@ where subchain_number, "Mismatch of anticipated block descriptions and block number difference.", ); - return Ok(Some(target_hash)) + return Ok(target_hash) } // 3. Constrain according to disputes: let (tx, rx) = oneshot::channel(); @@ -454,6 +478,12 @@ where (lag, subchain_head) }; + tracing::trace!( + target: LOG_TARGET, + ?subchain_head, + "Disputed blocks in ancestry restriction applied", + ); + // 4. Apply the maximum safeguard to the finality lag. if lag > MAX_FINALITY_LAG { // We need to constrain our vote as a safety net to @@ -461,8 +491,9 @@ where let safe_target = initial_leaf_number - MAX_FINALITY_LAG; if safe_target <= target_number { + tracing::warn!(target: LOG_TARGET, ?target_hash, "Safeguard enforced finalization"); // Minimal vote needs to be on the target number. - Ok(Some(target_hash)) + Ok(target_hash) } else { // Otherwise we're looking for a descendant. let initial_leaf_header = self.block_header(initial_leaf)?; @@ -473,10 +504,16 @@ where ) .map_err(|e| ConsensusError::ChainLookup(format!("{:?}", e)))?; - Ok(Some(forced_target)) + tracing::warn!( + target: LOG_TARGET, + ?forced_target, + "Safeguard enforced finalization of child" + ); + + Ok(forced_target) } } else { - Ok(Some(subchain_head)) + Ok(subchain_head) } } } diff --git a/node/service/src/tests.rs b/node/service/src/tests.rs index 34ac69d78cc7..22eeeacb051b 100644 --- a/node/service/src/tests.rs +++ b/node/service/src/tests.rs @@ -79,7 +79,7 @@ fn test_harness>( let (finality_target_tx, finality_target_rx) = oneshot::channel::>(); - let select_relay_chain = SelectRelayChain::::new( + let select_relay_chain = SelectRelayChainInner::::new( Arc::new(case_vars.chain.clone()), context.sender().clone(), Default::default(), @@ -88,10 +88,10 @@ fn test_harness>( let target_hash = case_vars.target_block.clone(); let selection_process = async move { let best = select_relay_chain - .finality_target_with_fallback(target_hash, Some(target_hash), None) + .finality_target_with_longest_chain(target_hash, target_hash, None) .await .unwrap(); - finality_target_tx.send(best).unwrap(); + finality_target_tx.send(Some(best)).unwrap(); () }; diff --git a/node/subsystem-test-helpers/Cargo.toml b/node/subsystem-test-helpers/Cargo.toml index f6b82257c346..e17ce65a763f 100644 --- a/node/subsystem-test-helpers/Cargo.toml +++ b/node/subsystem-test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-node-subsystem-test-helpers" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" description = "Subsystem traits and message definitions" diff --git a/node/subsystem-test-helpers/src/lib.rs b/node/subsystem-test-helpers/src/lib.rs index fe2b19144d5e..0d155dc1384e 100644 --- a/node/subsystem-test-helpers/src/lib.rs +++ b/node/subsystem-test-helpers/src/lib.rs @@ -150,22 +150,25 @@ pub fn sender_receiver() -> (TestSubsystemSender, mpsc::UnboundedReceiver for TestSubsystemSender { - async fn send_message(&mut self, msg: AllMessages) { - self.tx.send(msg).await.expect("test overseer no longer live"); +impl overseer::SubsystemSender for TestSubsystemSender +where + T: Into + Send + 'static, +{ + async fn send_message(&mut self, msg: T) { + self.tx.send(msg.into()).await.expect("test overseer no longer live"); } - async fn send_messages(&mut self, msgs: T) + async fn send_messages(&mut self, msgs: X) where - T: IntoIterator + Send, - T::IntoIter: Send, + X: IntoIterator + Send, + X::IntoIter: Send, { - let mut iter = stream::iter(msgs.into_iter().map(Ok)); + let mut iter = stream::iter(msgs.into_iter().map(|msg| Ok(msg.into()))); self.tx.send_all(&mut iter).await.expect("test overseer no longer live"); } - fn send_unbounded_message(&mut self, msg: AllMessages) { - self.tx.unbounded_send(msg).expect("test overseer no longer live"); + fn send_unbounded_message(&mut self, msg: T) { + self.tx.unbounded_send(msg.into()).expect("test overseer no longer live"); } } @@ -369,7 +372,7 @@ mod tests { use super::*; use futures::executor::block_on; use polkadot_node_subsystem::messages::CollatorProtocolMessage; - use polkadot_overseer::{AllSubsystems, Handle, HeadSupportsParachains, Overseer}; + use polkadot_overseer::{dummy::dummy_overseer_builder, Handle, HeadSupportsParachains}; use polkadot_primitives::v1::Hash; struct AlwaysSupportsParachains; @@ -383,17 +386,15 @@ mod tests { fn forward_subsystem_works() { let spawner = sp_core::testing::TaskExecutor::new(); let (tx, rx) = mpsc::channel(2); - let all_subsystems = - AllSubsystems::<()>::dummy().replace_collator_protocol(|_| ForwardSubsystem(tx)); - let (overseer, handle) = Overseer::new( - Vec::new(), - all_subsystems, - None, - AlwaysSupportsParachains, - spawner.clone(), - ) - .unwrap(); - let mut handle = Handle::Connected(handle); + let (overseer, handle) = + dummy_overseer_builder(spawner.clone(), AlwaysSupportsParachains, None) + .unwrap() + .replace_collator_protocol(|_| ForwardSubsystem(tx)) + .leaves(vec![]) + .build() + .unwrap(); + + let mut handle = Handle::new(handle); spawner.spawn("overseer", overseer.run().then(|_| async { () }).boxed()); diff --git a/node/subsystem-types/Cargo.toml b/node/subsystem-types/Cargo.toml index fb7a1088820b..0fa9a96f1a43 100644 --- a/node/subsystem-types/Cargo.toml +++ b/node/subsystem-types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-node-subsystem-types" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" description = "Subsystem traits and message definitions" diff --git a/node/subsystem-types/src/messages.rs b/node/subsystem-types/src/messages.rs index 691289614d14..ea70d3b2707a 100644 --- a/node/subsystem-types/src/messages.rs +++ b/node/subsystem-types/src/messages.rs @@ -23,6 +23,7 @@ //! Subsystems' APIs are defined separately from their implementation, leading to easier mocking. use futures::channel::oneshot; +use sc_network::Multiaddr; use thiserror::Error; pub use sc_network::IfDisconnected; @@ -50,6 +51,7 @@ use polkadot_statement_table::v1::Misbehavior; use std::{ collections::{BTreeMap, HashSet}, sync::Arc, + time::Duration, }; /// Network events as transmitted to other subsystems, wrapped in their message types. @@ -113,6 +115,8 @@ pub enum CandidateValidationMessage { ValidateFromChainState( CandidateDescriptor, Arc, + /// Execution timeout + Duration, oneshot::Sender>, ), /// Validate a candidate with provided, exhaustive parameters for validation. @@ -129,6 +133,8 @@ pub enum CandidateValidationMessage { ValidationCode, CandidateDescriptor, Arc, + /// Execution timeout + Duration, oneshot::Sender>, ), } @@ -137,8 +143,8 @@ impl CandidateValidationMessage { /// If the current variant contains the relay parent hash, return it. pub fn relay_parent(&self) -> Option { match self { - Self::ValidateFromChainState(_, _, _) => None, - Self::ValidateFromExhaustive(_, _, _, _, _) => None, + Self::ValidateFromChainState(_, _, _, _) => None, + Self::ValidateFromExhaustive(_, _, _, _, _, _) => None, } } } @@ -345,6 +351,14 @@ pub enum NetworkBridgeMessage { /// authority discovery has failed to resolve. failed: oneshot::Sender, }, + /// Alternative to `ConnectToValidators` in case you already know the `Multiaddrs` you want to be + /// connected to. + ConnectToResolvedValidators { + /// Each entry corresponds to the addresses of an already resolved validator. + validator_addrs: Vec>, + /// The peer set we want the connection on. + peer_set: PeerSet, + }, /// Inform the distribution subsystems about the new /// gossip network topology formed. NewGossipTopology { @@ -365,6 +379,7 @@ impl NetworkBridgeMessage { Self::SendValidationMessages(_) => None, Self::SendCollationMessages(_) => None, Self::ConnectToValidators { .. } => None, + Self::ConnectToResolvedValidators { .. } => None, Self::SendRequests { .. } => None, Self::NewGossipTopology { .. } => None, } @@ -476,17 +491,19 @@ pub enum AvailabilityStoreMessage { tx: oneshot::Sender>, }, - /// Store a `AvailableData` in the AV store. - /// If `ValidatorIndex` is present store corresponding chunk also. + /// Store a `AvailableData` and all of its chunks in the AV store. /// /// Return `Ok(())` if the store operation succeeded, `Err(())` if it failed. - StoreAvailableData( - CandidateHash, - Option, - u32, - AvailableData, - oneshot::Sender>, - ), + StoreAvailableData { + /// A hash of the candidate this `available_data` belongs to. + candidate_hash: CandidateHash, + /// The number of validators in the session. + n_validators: u32, + /// The `AvailableData` itself. + available_data: AvailableData, + /// Sending side of the channel to send result to. + tx: oneshot::Sender>, + }, } impl AvailabilityStoreMessage { @@ -513,7 +530,7 @@ pub enum ChainApiMessage { /// Get the cumulative weight of the given block, by hash. /// If the block or weight is unknown, this returns `None`. /// - /// Note: this the weight within the low-level fork-choice rule, + /// Note: this is the weight within the low-level fork-choice rule, /// not the high-level one implemented in the chain-selection subsystem. /// /// Weight is used for comparing blocks in a fork-choice rule. @@ -850,5 +867,9 @@ pub enum ApprovalDistributionMessage { } /// Message to the Gossip Support subsystem. -#[derive(Debug)] -pub enum GossipSupportMessage {} +#[derive(Debug, derive_more::From)] +pub enum GossipSupportMessage { + /// Dummy constructor, so we can receive networking events. + #[from] + NetworkBridgeUpdateV1(NetworkBridgeEvent), +} diff --git a/node/subsystem-util/Cargo.toml b/node/subsystem-util/Cargo.toml index a6f8052b01cb..8fb43e7946f7 100644 --- a/node/subsystem-util/Cargo.toml +++ b/node/subsystem-util/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-node-subsystem-util" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" description = "Subsystem traits and message definitions" @@ -9,11 +9,11 @@ description = "Subsystem traits and message definitions" async-trait = "0.1.51" futures = "0.3.17" itertools = "0.10" -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } pin-project = "1.0.8" rand = "0.8.3" thiserror = "1.0.26" -tracing = "0.1.26" +tracing = "0.1.28" derive_more = "0.99.11" lru = "0.6.6" diff --git a/node/subsystem-util/src/rolling_session_window.rs b/node/subsystem-util/src/rolling_session_window.rs index a7afc4f8c949..fc2957b7ea23 100644 --- a/node/subsystem-util/src/rolling_session_window.rs +++ b/node/subsystem-util/src/rolling_session_window.rs @@ -19,7 +19,7 @@ //! This is useful for consensus components which need to stay up-to-date about recent sessions but don't //! care about the state of particular blocks. -use polkadot_primitives::v1::{Hash, Header, SessionIndex, SessionInfo}; +use polkadot_primitives::v1::{Hash, SessionIndex, SessionInfo}; use futures::channel::oneshot; use polkadot_node_subsystem::{ @@ -131,7 +131,7 @@ impl RollingSessionWindow { } /// When inspecting a new import notification, updates the session info cache to match - /// the session of the imported block. + /// the session of the imported block's child. /// /// this only needs to be called on heads where we are directly notified about import, as sessions do /// not change often and import notifications are expected to be typically increasing in session number. @@ -141,7 +141,6 @@ impl RollingSessionWindow { &mut self, ctx: &mut (impl SubsystemContext + overseer::SubsystemContext), block_hash: Hash, - block_header: &Header, ) -> Result { if self.window_size == 0 { return Ok(SessionWindowUpdate::Unchanged) @@ -150,11 +149,9 @@ impl RollingSessionWindow { let session_index = { let (s_tx, s_rx) = oneshot::channel(); - // The genesis is guaranteed to be at the beginning of the session and its parent state - // is non-existent. Therefore if we're at the genesis, we request using its state and - // not the parent. + // We're requesting session index of a child to populate the cache in advance. ctx.send_message(RuntimeApiMessage::Request( - if block_header.number == 0 { block_hash } else { block_header.parent_hash }, + block_hash, RuntimeApiRequest::SessionIndexForChild(s_tx), )) .await; @@ -289,6 +286,7 @@ mod tests { use assert_matches::assert_matches; use polkadot_node_subsystem::messages::{AllMessages, AvailabilityRecoveryMessage}; use polkadot_node_subsystem_test_helpers::make_subsystem_context; + use polkadot_primitives::v1::Header; use sp_core::testing::TaskExecutor; const TEST_WINDOW_SIZE: SessionIndex = 6; @@ -329,9 +327,8 @@ mod tests { let hash = header.hash(); let test_fut = { - let header = header.clone(); Box::pin(async move { - window.cache_session_info_for_head(&mut ctx, hash, &header).await.unwrap(); + window.cache_session_info_for_head(&mut ctx, hash).await.unwrap(); assert_eq!(window.earliest_session, Some(expected_start_session)); assert_eq!( @@ -348,7 +345,7 @@ mod tests { h, RuntimeApiRequest::SessionIndexForChild(s_tx), )) => { - assert_eq!(h, header.parent_hash); + assert_eq!(h, hash); let _ = s_tx.send(Ok(session)); } ); @@ -497,9 +494,8 @@ mod tests { let hash = header.hash(); let test_fut = { - let header = header.clone(); Box::pin(async move { - let res = window.cache_session_info_for_head(&mut ctx, hash, &header).await; + let res = window.cache_session_info_for_head(&mut ctx, hash).await; assert!(res.is_err()); }) @@ -512,7 +508,7 @@ mod tests { h, RuntimeApiRequest::SessionIndexForChild(s_tx), )) => { - assert_eq!(h, header.parent_hash); + assert_eq!(h, hash); let _ = s_tx.send(Ok(session)); } ); @@ -559,9 +555,8 @@ mod tests { let hash = header.hash(); let test_fut = { - let header = header.clone(); Box::pin(async move { - window.cache_session_info_for_head(&mut ctx, hash, &header).await.unwrap(); + window.cache_session_info_for_head(&mut ctx, hash).await.unwrap(); assert_eq!(window.earliest_session, Some(session)); assert_eq!(window.session_info, vec![dummy_session_info(session)]); diff --git a/node/subsystem-util/src/runtime/mod.rs b/node/subsystem-util/src/runtime/mod.rs index e1ac19e0e8fc..f086d31c661c 100644 --- a/node/subsystem-util/src/runtime/mod.rs +++ b/node/subsystem-util/src/runtime/mod.rs @@ -199,7 +199,7 @@ impl RuntimeInfo { /// Build `ValidatorInfo` for the current session. /// /// - /// Returns: `None` if not a validator. + /// Returns: `None` if not a parachain validator. async fn get_validator_info(&self, session_info: &SessionInfo) -> Result { if let Some(our_index) = self.get_our_index(&session_info.validators).await { // Get our group index: diff --git a/node/subsystem/Cargo.toml b/node/subsystem/Cargo.toml index 19a8ea469db6..5f6f1f2ca4a7 100644 --- a/node/subsystem/Cargo.toml +++ b/node/subsystem/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-node-subsystem" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" description = "Subsystem traits and message definitions and the generated overseer" diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index e7ae19bcb39e..054f0d5997bb 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -24,7 +24,9 @@ pub use jaeger::*; pub use polkadot_node_jaeger as jaeger; -pub use polkadot_overseer::{self as overseer, ActiveLeavesUpdate, OverseerSignal}; +pub use polkadot_overseer::{ + self as overseer, ActiveLeavesUpdate, OverseerConnector, OverseerSignal, +}; pub use polkadot_node_subsystem_types::{ errors::{self, *}, diff --git a/node/test/client/Cargo.toml b/node/test/client/Cargo.toml index bae3ef3fb70e..b6aa140fece6 100644 --- a/node/test/client/Cargo.toml +++ b/node/test/client/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "polkadot-test-client" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } # Polkadot dependencies polkadot-test-runtime = { path = "../../../runtime/test-runtime" } diff --git a/node/test/polkadot-simnet/common/Cargo.toml b/node/test/polkadot-simnet/common/Cargo.toml index 232413df67d7..70a788e33640 100644 --- a/node/test/polkadot-simnet/common/Cargo.toml +++ b/node/test/polkadot-simnet/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-simnet" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" diff --git a/node/test/polkadot-simnet/common/src/lib.rs b/node/test/polkadot-simnet/common/src/lib.rs index 60e1f925bbd3..c2d7ac3c67de 100644 --- a/node/test/polkadot-simnet/common/src/lib.rs +++ b/node/test/polkadot-simnet/common/src/lib.rs @@ -31,10 +31,9 @@ use sc_executor::NativeElseWasmExecutor; use sc_service::{TFullBackend, TFullClient}; use sp_runtime::{app_crypto::sp_core::H256, generic::Era, AccountId32}; use std::{error::Error, future::Future, str::FromStr}; -use support::{weights::Weight, StorageValue}; +use support::weights::Weight; use test_runner::{ - build_runtime, client_parts, task_executor, ChainInfo, ConfigOrChainSpec, Node, - SignatureVerificationOverride, + build_runtime, client_parts, ChainInfo, ConfigOrChainSpec, Node, SignatureVerificationOverride, }; type BlockImport = BabeBlockImport>; @@ -139,7 +138,7 @@ where let proposal_hash = { // note the call (pre-image?) of the call. node.submit_extrinsic( - DemocracyCall::note_preimage(call.into().encode()), + DemocracyCall::note_preimage { encoded_proposal: call.into().encode() }, Some(whales[0].clone()), ) .await?; @@ -162,15 +161,16 @@ where // submit external_propose call through council collective { - let external_propose = - DemocracyCall::external_propose_majority(proposal_hash.clone().into()); + let external_propose = DemocracyCall::external_propose_majority { + proposal_hash: proposal_hash.clone().into(), + }; let length = external_propose.using_encoded(|x| x.len()) as u32 + 1; let weight = Weight::MAX / 100_000_000; - let proposal = CouncilCollectiveCall::propose( - council_collective.len() as u32, - Box::new(external_propose.clone().into()), - length, - ); + let proposal = CouncilCollectiveCall::propose { + threshold: council_collective.len() as u32, + proposal: Box::new(external_propose.clone().into()), + length_bound: length, + }; node.submit_extrinsic(proposal.clone(), Some(council_collective[0].clone())) .await?; @@ -192,13 +192,18 @@ where // vote for member in &council_collective[1..] { - let call = CouncilCollectiveCall::vote(hash.clone(), index, true); + let call = CouncilCollectiveCall::vote { proposal: hash.clone(), index, approve: true }; node.submit_extrinsic(call, Some(member.clone())).await?; } node.seal_blocks(1).await; // close vote - let call = CouncilCollectiveCall::close(hash, index, weight, length); + let call = CouncilCollectiveCall::close { + proposal_hash: hash, + index, + proposal_weight_bound: weight, + length_bound: length, + }; node.submit_extrinsic(call, Some(council_collective[0].clone())).await?; node.seal_blocks(1).await; @@ -228,15 +233,18 @@ where // next technical collective must fast track the proposal. { - let fast_track = - DemocracyCall::fast_track(proposal_hash.into(), FastTrackVotingPeriod::get(), 0); + let fast_track = DemocracyCall::fast_track { + proposal_hash: proposal_hash.into(), + voting_period: FastTrackVotingPeriod::get(), + delay: 0, + }; let weight = Weight::MAX / 100_000_000; let length = fast_track.using_encoded(|x| x.len()) as u32 + 1; - let proposal = TechnicalCollectiveCall::propose( - technical_collective.len() as u32, - Box::new(fast_track.into()), - length, - ); + let proposal = TechnicalCollectiveCall::propose { + threshold: technical_collective.len() as u32, + proposal: Box::new(fast_track.into()), + length_bound: length, + }; node.submit_extrinsic(proposal, Some(technical_collective[0].clone())).await?; node.seal_blocks(1).await; @@ -260,13 +268,19 @@ where // vote for member in &technical_collective[1..] { - let call = TechnicalCollectiveCall::vote(hash.clone(), index, true); + let call = + TechnicalCollectiveCall::vote { proposal: hash.clone(), index, approve: true }; node.submit_extrinsic(call, Some(member.clone())).await?; } node.seal_blocks(1).await; // close vote - let call = TechnicalCollectiveCall::close(hash, index, weight, length); + let call = CouncilCollectiveCall::close { + proposal_hash: hash, + index, + proposal_weight_bound: weight, + length_bound: length, + }; node.submit_extrinsic(call, Some(technical_collective[0].clone())).await?; node.seal_blocks(1).await; @@ -310,14 +324,14 @@ where format!("democracy::Event::Started not found in events: {:#?}", node.events()) })?; - let call = DemocracyCall::vote( + let call = DemocracyCall::vote { ref_index, - AccountVote::Standard { + vote: AccountVote::Standard { vote: Vote { aye: true, conviction: Conviction::Locked1x }, // 10 DOTS balance: 10_000_000_000_000, }, - ); + }; for whale in whales { node.submit_extrinsic(call.clone(), Some(whale)).await?; } @@ -360,7 +374,6 @@ where use structopt::StructOpt; let tokio_runtime = build_runtime()?; - let task_executor = task_executor(tokio_runtime.handle().clone()); // parse cli args let cmd = ::from_args(); // set up logging @@ -369,7 +382,7 @@ where logger.init()?; // set up the test-runner - let config = cmd.create_configuration(&cmd.run.base, task_executor)?; + let config = cmd.create_configuration(&cmd.run.base, tokio_runtime.handle().clone())?; sc_cli::print_node_infos::(&config); let (rpc, task_manager, client, pool, command_sink, backend) = client_parts::(ConfigOrChainSpec::Config(config))?; @@ -392,11 +405,10 @@ mod tests { #[test] fn test_runner() { let runtime = build_runtime().unwrap(); - let task_executor = task_executor(runtime.handle().clone()); let (rpc, task_manager, client, pool, command_sink, backend) = client_parts::(ConfigOrChainSpec::ChainSpec( Box::new(polkadot_development_config().unwrap()), - task_executor, + runtime.handle().clone(), )) .unwrap(); let node = @@ -407,9 +419,12 @@ mod tests { node.seal_blocks(1).await; // submit extrinsics let alice = MultiSigner::from(Alice.public()).into_account(); - node.submit_extrinsic(system::Call::remark((b"hello world").to_vec()), Some(alice)) - .await - .unwrap(); + node.submit_extrinsic( + system::Call::remark { remark: (b"hello world").to_vec() }, + Some(alice), + ) + .await + .unwrap(); // look ma, I can read state. let _events = node.with_state(|| system::Pallet::::events()); diff --git a/node/test/polkadot-simnet/node/Cargo.toml b/node/test/polkadot-simnet/node/Cargo.toml index 0bb23500a466..6cf6ed9990c6 100644 --- a/node/test/polkadot-simnet/node/Cargo.toml +++ b/node/test/polkadot-simnet/node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-simnet-node" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" diff --git a/node/test/polkadot-simnet/test/Cargo.toml b/node/test/polkadot-simnet/test/Cargo.toml index d73b1c990c63..18b41010f6ac 100644 --- a/node/test/polkadot-simnet/test/Cargo.toml +++ b/node/test/polkadot-simnet/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-simnet-test" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" diff --git a/node/test/polkadot-simnet/test/src/main.rs b/node/test/polkadot-simnet/test/src/main.rs index 240167aa54fe..e637c72ba076 100644 --- a/node/test/polkadot-simnet/test/src/main.rs +++ b/node/test/polkadot-simnet/test/src/main.rs @@ -35,7 +35,7 @@ fn main() -> Result<(), Box> { .ok_or("Polkadot development wasm not available")? .to_vec(); // upgrade runtime. - dispatch_with_root(system::Call::set_code(wasm_binary), &node).await?; + dispatch_with_root(system::Call::set_code { code: wasm_binary }, &node).await?; // assert that the runtime has been updated by looking at events let events = node @@ -74,8 +74,11 @@ fn main() -> Result<(), Box> { ); // post upgrade tests, a simple balance transfer - node.submit_extrinsic(balances::Call::transfer(dest.into(), balance), Some(from)) - .await?; + node.submit_extrinsic( + balances::Call::transfer { dest: dest.into(), value: balance }, + Some(from), + ) + .await?; node.seal_blocks(1).await; let events = node diff --git a/node/test/service/Cargo.toml b/node/test/service/Cargo.toml index 5dcbacc0f1e9..97b885f9dc49 100644 --- a/node/test/service/Cargo.toml +++ b/node/test/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-test-service" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" @@ -8,9 +8,10 @@ edition = "2018" futures = "0.3.17" futures01 = { package = "futures", version = "0.1.29" } hex = "0.4.3" -tracing = "0.1.26" +tracing = "0.1.28" rand = "0.8.3" tempfile = "3.2.0" +tokio = "1.12.0" # Polkadot dependencies polkadot-overseer = { path = "../../overseer" } @@ -59,4 +60,4 @@ substrate-test-client = { git = "https://github.com/paritytech/substrate", branc pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } serde_json = "1.0.67" substrate-test-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } -tokio = { version = "1.10", features = ["macros"] } +tokio = { version = "1.12", features = ["macros"] } diff --git a/node/test/service/src/lib.rs b/node/test/service/src/lib.rs index f8207829852b..d52b9ecc3284 100644 --- a/node/test/service/src/lib.rs +++ b/node/test/service/src/lib.rs @@ -41,8 +41,7 @@ use sc_network::{ }; use service::{ config::{DatabaseSource, KeystoreConfig, MultiaddrWithPeerId, WasmExecutionMethod}, - BasePath, Configuration, KeepBlocks, Role, RpcHandlers, TaskExecutor, TaskManager, - TransactionStorageMode, + BasePath, Configuration, KeepBlocks, Role, RpcHandlers, TaskManager, TransactionStorageMode, }; use sp_arithmetic::traits::SaturatedConversion; use sp_blockchain::HeaderBackend; @@ -112,7 +111,7 @@ impl ClientHandle for TestClient { /// and can be used to make adjustments to the runtime genesis storage. pub fn node_config( storage_update_func: impl Fn(), - task_executor: TaskExecutor, + tokio_handle: tokio::runtime::Handle, key: Sr25519Keyring, boot_nodes: Vec, is_validator: bool, @@ -149,7 +148,7 @@ pub fn node_config( impl_name: "polkadot-test-node".to_string(), impl_version: "0.1".to_string(), role, - task_executor, + tokio_handle, transaction_pool: Default::default(), network: network_config, keystore: KeystoreConfig::InMemory, @@ -171,7 +170,6 @@ pub fn node_config( offchain_worker: sc_client_api::ExecutionStrategy::NativeWhenPossible, other: sc_client_api::ExecutionStrategy::NativeWhenPossible, }, - rpc_http_threads: None, rpc_http: None, rpc_ws: None, rpc_ipc: None, @@ -204,13 +202,13 @@ pub fn node_config( /// The `storage_update_func` function will be executed in an externalities provided environment /// and can be used to make adjustments to the runtime genesis storage. pub fn run_validator_node( - task_executor: TaskExecutor, + tokio_handle: tokio::runtime::Handle, key: Sr25519Keyring, storage_update_func: impl Fn(), boot_nodes: Vec, worker_program_path: Option, ) -> PolkadotTestNode { - let config = node_config(storage_update_func, task_executor, key, boot_nodes, true); + let config = node_config(storage_update_func, tokio_handle, key, boot_nodes, true); let multiaddr = config.network.listen_addresses[0].clone(); let NewFull { task_manager, client, network, rpc_handlers, overseer_handle, .. } = new_full(config, IsCollator::No, worker_program_path) @@ -236,13 +234,13 @@ pub fn run_validator_node( /// The collator functionality still needs to be registered at the node! This can be done using /// [`PolkadotTestNode::register_collator`]. pub fn run_collator_node( - task_executor: TaskExecutor, + tokio_handle: tokio::runtime::Handle, key: Sr25519Keyring, storage_update_func: impl Fn(), boot_nodes: Vec, collator_pair: CollatorPair, ) -> PolkadotTestNode { - let config = node_config(storage_update_func, task_executor, key, boot_nodes, false); + let config = node_config(storage_update_func, tokio_handle, key, boot_nodes, false); let multiaddr = config.network.listen_addresses[0].clone(); let NewFull { task_manager, client, network, rpc_handlers, overseer_handle, .. } = new_full(config, IsCollator::Yes(collator_pair), None) @@ -288,16 +286,16 @@ impl PolkadotTestNode { validation_code: impl Into, genesis_head: impl Into, ) -> Result<(), RpcTransactionError> { - let call = ParasSudoWrapperCall::sudo_schedule_para_initialize( + let call = ParasSudoWrapperCall::sudo_schedule_para_initialize { id, - ParaGenesisArgs { + genesis: ParaGenesisArgs { genesis_head: genesis_head.into(), validation_code: validation_code.into(), parachain: true, }, - ); + }; - self.send_extrinsic(SudoCall::sudo(Box::new(call.into())), Sr25519Keyring::Alice) + self.send_extrinsic(SudoCall::sudo { call: Box::new(call.into()) }, Sr25519Keyring::Alice) .await .map(drop) } @@ -379,10 +377,10 @@ pub fn construct_transfer_extrinsic( dest: sp_keyring::AccountKeyring, value: Balance, ) -> UncheckedExtrinsic { - let function = polkadot_test_runtime::Call::Balances(pallet_balances::Call::transfer( - MultiSigner::from(dest.public()).into_account().into(), + let function = polkadot_test_runtime::Call::Balances(pallet_balances::Call::transfer { + dest: MultiSigner::from(dest.public()).into_account().into(), value, - )); + }); construct_extrinsic(client, function, origin, 0) } diff --git a/node/test/service/tests/build-blocks.rs b/node/test/service/tests/build-blocks.rs index 74bef3277bae..e32d9c941878 100644 --- a/node/test/service/tests/build-blocks.rs +++ b/node/test/service/tests/build-blocks.rs @@ -14,21 +14,25 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use futures::{future, pin_mut, select}; +use futures::{future, pin_mut, select, FutureExt}; use polkadot_test_service::*; -use service::TaskExecutor; use sp_keyring::Sr25519Keyring; #[substrate_test_utils::test] -async fn ensure_test_service_build_blocks(task_executor: TaskExecutor) { +async fn ensure_test_service_build_blocks() { let mut builder = sc_cli::LoggerBuilder::new(""); builder.with_colors(false); builder.init().expect("Sets up logger"); - let mut alice = - run_validator_node(task_executor.clone(), Sr25519Keyring::Alice, || {}, Vec::new(), None); + let mut alice = run_validator_node( + tokio::runtime::Handle::current(), + Sr25519Keyring::Alice, + || {}, + Vec::new(), + None, + ); let mut bob = run_validator_node( - task_executor.clone(), + tokio::runtime::Handle::current(), Sr25519Keyring::Bob, || {}, vec![alice.addr.clone()], diff --git a/node/test/service/tests/call-function.rs b/node/test/service/tests/call-function.rs index ce84c1ee96e2..9a6ea4950ff9 100644 --- a/node/test/service/tests/call-function.rs +++ b/node/test/service/tests/call-function.rs @@ -15,17 +15,17 @@ // along with Polkadot. If not, see . use polkadot_test_service::*; -use service::TaskExecutor; use sp_keyring::Sr25519Keyring::{Alice, Bob}; #[substrate_test_utils::test] -async fn call_function_actually_work(task_executor: TaskExecutor) { - let alice = run_validator_node(task_executor, Alice, || {}, Vec::new(), None); - - let function = polkadot_test_runtime::Call::Balances(pallet_balances::Call::transfer( - Default::default(), - 1, - )); +async fn call_function_actually_work() { + let alice = + run_validator_node(tokio::runtime::Handle::current(), Alice, || {}, Vec::new(), None); + + let function = polkadot_test_runtime::Call::Balances(pallet_balances::Call::transfer { + dest: Default::default(), + value: 1, + }); let output = alice.send_extrinsic(function, Bob).await.unwrap(); let res = output.result.expect("return value expected"); diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index e4ff85cc20ec..5a09573f7926 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] description = "Types and utilities for creating and working with parachains" edition = "2018" @@ -11,6 +11,7 @@ edition = "2018" # various unnecessary Substrate-specific endpoints. parity-scale-codec = { version = "2.0.0", default-features = false, features = [ "derive" ] } parity-util-mem = { version = "0.10.0", optional = true } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -26,6 +27,7 @@ default = ["std"] wasm-api = [] std = [ "parity-scale-codec/std", + "scale-info/std", "serde/std", "sp-std/std", "sp-runtime/std", diff --git a/parachain/src/lib.rs b/parachain/src/lib.rs index 2cf441e88c9f..e73103d5578d 100644 --- a/parachain/src/lib.rs +++ b/parachain/src/lib.rs @@ -47,6 +47,7 @@ pub mod primitives; +#[cfg(all(not(feature = "std"), feature = "wasm-api"))] mod wasm_api; #[cfg(all(not(feature = "std"), feature = "wasm-api"))] diff --git a/parachain/src/primitives.rs b/parachain/src/primitives.rs index d8677e7bb759..bda56bf59e8c 100644 --- a/parachain/src/primitives.rs +++ b/parachain/src/primitives.rs @@ -21,6 +21,7 @@ use sp_std::vec::Vec; use frame_support::weights::Weight; use parity_scale_codec::{CompactAs, Decode, Encode}; +use scale_info::TypeInfo; use sp_core::{RuntimeDebug, TypeId}; use sp_runtime::traits::Hash as _; @@ -40,12 +41,11 @@ pub use polkadot_core_primitives::BlockNumber as RelayChainBlockNumber; /// Parachain head data included in the chain. #[derive( - PartialEq, Eq, Clone, PartialOrd, Ord, Encode, Decode, RuntimeDebug, derive_more::From, + PartialEq, Eq, Clone, PartialOrd, Ord, Encode, Decode, RuntimeDebug, derive_more::From, TypeInfo, )] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Default, Hash, MallocSizeOf))] pub struct HeadData(#[cfg_attr(feature = "std", serde(with = "bytes"))] pub Vec); -#[cfg(feature = "std")] impl HeadData { /// Returns the hash of this head data. pub fn hash(&self) -> Hash { @@ -54,7 +54,9 @@ impl HeadData { } /// Parachain validation code. -#[derive(Default, PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, derive_more::From)] +#[derive( + Default, PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, derive_more::From, TypeInfo, +)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Hash, MallocSizeOf))] pub struct ValidationCode(#[cfg_attr(feature = "std", serde(with = "bytes"))] pub Vec); @@ -70,7 +72,7 @@ impl ValidationCode { /// This type is produced by [`ValidationCode::hash`]. /// /// This type makes it easy to enforce that a hash is a validation code hash on the type level. -#[derive(Clone, Copy, Encode, Decode, Default, Hash, Eq, PartialEq, PartialOrd, Ord)] +#[derive(Clone, Copy, Encode, Decode, Default, Hash, Eq, PartialEq, PartialOrd, Ord, TypeInfo)] #[cfg_attr(feature = "std", derive(MallocSizeOf))] pub struct ValidationCodeHash(Hash); @@ -113,7 +115,7 @@ impl sp_std::fmt::LowerHex for ValidationCodeHash { /// Parachain block data. /// /// Contains everything required to validate para-block, may contain block and witness data. -#[derive(PartialEq, Eq, Clone, Encode, Decode, derive_more::From)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, derive_more::From, TypeInfo)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, MallocSizeOf))] pub struct BlockData(#[cfg_attr(feature = "std", serde(with = "bytes"))] pub Vec); @@ -131,6 +133,7 @@ pub struct BlockData(#[cfg_attr(feature = "std", serde(with = "bytes"))] pub Vec PartialEq, PartialOrd, RuntimeDebug, + TypeInfo, )] #[cfg_attr( feature = "std", @@ -228,7 +231,9 @@ impl sp_std::ops::Sub for Id { } } -#[derive(Clone, Copy, Default, Encode, Decode, Eq, PartialEq, Ord, PartialOrd, RuntimeDebug)] +#[derive( + Clone, Copy, Default, Encode, Decode, Eq, PartialEq, Ord, PartialOrd, RuntimeDebug, TypeInfo, +)] pub struct Sibling(pub Id); impl From for Sibling { @@ -329,8 +334,9 @@ impl AccountIdConversion for Id { /// unidirectional, meaning that `(A, B)` and `(B, A)` refer to different channels. The convention is /// that we use the first item tuple for the sender and the second for the recipient. Only one channel /// is allowed between two participants in one direction, i.e. there cannot be 2 different channels -/// identified by `(A, B)`. -#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Encode, Decode, RuntimeDebug)] +/// identified by `(A, B)`. A channel with the same para id in sender and recipient is invalid. That +/// is, however, not enforced. +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Encode, Decode, RuntimeDebug, TypeInfo)] #[cfg_attr(feature = "std", derive(Hash))] pub struct HrmpChannelId { /// The para that acts as the sender in this channel. @@ -339,6 +345,13 @@ pub struct HrmpChannelId { pub recipient: Id, } +impl HrmpChannelId { + /// Returns true if the given id corresponds to either the sender or the recipient. + pub fn is_participant(&self, id: Id) -> bool { + id == self.sender || id == self.recipient + } +} + /// A message from a parachain to its Relay Chain. pub type UpwardMessage = Vec; @@ -363,7 +376,7 @@ impl DmpMessageHandler for () { } /// The aggregate XCMP message format. -#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode)] +#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] pub enum XcmpMessageFormat { /// Encoded `VersionedXcm` messages, all concatenated. ConcatenatedVersionedXcm, diff --git a/parachain/test-parachains/Cargo.toml b/parachain/test-parachains/Cargo.toml index 13b9febd2f1c..cf2f4415628d 100644 --- a/parachain/test-parachains/Cargo.toml +++ b/parachain/test-parachains/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "test-parachains" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] description = "Integration tests using the test-parachains" edition = "2018" [dependencies] tiny-keccak = "2.0.2" -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } adder = { package = "test-parachain-adder", path = "adder" } halt = { package = "test-parachain-halt", path = "halt" } diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index 80cd51ea8de5..fbc6bc24613d 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-adder" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] description = "Test parachain which adds to a number as its state transition" edition = "2018" @@ -8,7 +8,7 @@ build = "build.rs" [dependencies] parachain = { package = "polkadot-parachain", path = "../../", default-features = false, features = [ "wasm-api" ] } -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } tiny-keccak = { version = "2.0.2", features = ["keccak"] } dlmalloc = { version = "0.2.1", features = [ "global" ] } diff --git a/parachain/test-parachains/adder/collator/Cargo.toml b/parachain/test-parachains/adder/collator/Cargo.toml index 98a680daebae..4315051ff9a9 100644 --- a/parachain/test-parachains/adder/collator/Cargo.toml +++ b/parachain/test-parachains/adder/collator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-adder-collator" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] description = "Collator for the adder test parachain" edition = "2018" @@ -14,7 +14,7 @@ name = "adder_collator_puppet_worker" path = "bin/puppet_worker.rs" [dependencies] -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } futures = "0.3.17" futures-timer = "3.0.2" log = "0.4.13" @@ -44,4 +44,4 @@ substrate-test-utils = { git = "https://github.com/paritytech/substrate", branch sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } -tokio = { version = "1.10", features = ["macros"] } +tokio = { version = "1.12", features = ["macros"] } diff --git a/parachain/test-parachains/adder/collator/README.md b/parachain/test-parachains/adder/collator/README.md index be5922b9f95a..4347a9a8ced7 100644 --- a/parachain/test-parachains/adder/collator/README.md +++ b/parachain/test-parachains/adder/collator/README.md @@ -1,12 +1,14 @@ # How to run this collator First start two validators that will run for the relay chain: + ```sh cargo run --release -- -d alice --chain rococo-local --validator --alice --port 50551 cargo run --release -- -d bob --chain rococo-local --validator --bob --port 50552 ``` Next start the collator that will collate for the adder parachain: + ```sh cargo run --release -p test-parachain-adder-collator -- --tmp --chain rococo-local --port 50553 ``` diff --git a/parachain/test-parachains/adder/collator/tests/integration.rs b/parachain/test-parachains/adder/collator/tests/integration.rs index 3d9530d02ed9..fb922e93c596 100644 --- a/parachain/test-parachains/adder/collator/tests/integration.rs +++ b/parachain/test-parachains/adder/collator/tests/integration.rs @@ -21,7 +21,7 @@ const PUPPET_EXE: &str = env!("CARGO_BIN_EXE_adder_collator_puppet_worker"); // If this test is failing, make sure to run all tests with the `real-overseer` feature being enabled. #[substrate_test_utils::test] -async fn collating_using_adder_collator(task_executor: sc_service::TaskExecutor) { +async fn collating_using_adder_collator() { use futures::join; use polkadot_primitives::v1::Id as ParaId; use sp_keyring::AccountKeyring::*; @@ -34,7 +34,7 @@ async fn collating_using_adder_collator(task_executor: sc_service::TaskExecutor) // start alice let alice = polkadot_test_service::run_validator_node( - task_executor.clone(), + tokio::runtime::Handle::current(), Alice, || {}, vec![], @@ -43,7 +43,7 @@ async fn collating_using_adder_collator(task_executor: sc_service::TaskExecutor) // start bob let bob = polkadot_test_service::run_validator_node( - task_executor.clone(), + tokio::runtime::Handle::current(), Bob, || {}, vec![alice.addr.clone()], @@ -60,7 +60,7 @@ async fn collating_using_adder_collator(task_executor: sc_service::TaskExecutor) // run the collator node let mut charlie = polkadot_test_service::run_collator_node( - task_executor.clone(), + tokio::runtime::Handle::current(), Charlie, || {}, vec![alice.addr.clone(), bob.addr.clone()], diff --git a/parachain/test-parachains/halt/Cargo.toml b/parachain/test-parachains/halt/Cargo.toml index c191cce20d06..dd9a087928cf 100644 --- a/parachain/test-parachains/halt/Cargo.toml +++ b/parachain/test-parachains/halt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-halt" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] description = "Test parachain which executes forever" edition = "2018" diff --git a/parachain/test-parachains/halt/src/lib.rs b/parachain/test-parachains/halt/src/lib.rs index 0c56cfe6393e..3c1416f3c6e9 100644 --- a/parachain/test-parachains/halt/src/lib.rs +++ b/parachain/test-parachains/halt/src/lib.rs @@ -39,20 +39,18 @@ pub fn wasm_binary_unwrap() -> &'static [u8] { #[panic_handler] #[no_mangle] pub fn panic(_info: &core::panic::PanicInfo) -> ! { - unsafe { core::intrinsics::abort() } + core::intrinsics::abort() } #[cfg(not(feature = "std"))] #[alloc_error_handler] #[no_mangle] pub fn oom(_: core::alloc::Layout) -> ! { - unsafe { - core::intrinsics::abort(); - } + core::intrinsics::abort(); } #[cfg(not(feature = "std"))] #[no_mangle] -pub extern "C" fn validate_block(params: *const u8, len: usize) -> u64 { +pub extern "C" fn validate_block(_params: *const u8, _len: usize) -> u64 { loop {} } diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 9b106e864cf7..4aa5d00a3a7c 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,12 +1,13 @@ [package] name = "polkadot-primitives" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] serde = { version = "1.0.130", optional = true, features = ["derive"] } -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["bit-vec", "derive"] } +scale-info = { version = "1.0", default-features = false, features = ["bit-vec", "derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["bit-vec", "derive"] } primitives = { package = "sp-core", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } application-crypto = { package = "sp-application-crypto", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -34,6 +35,7 @@ default = ["std"] std = [ "application-crypto/std", "parity-scale-codec/std", + "scale-info/std", "primitives/std", "inherents/std", "trie/std", diff --git a/primitives/src/v0.rs b/primitives/src/v0.rs index 1cbeb916d482..7e15a0b87308 100644 --- a/primitives/src/v0.rs +++ b/primitives/src/v0.rs @@ -23,6 +23,7 @@ use bitvec::vec::BitVec; use parity_scale_codec::{Decode, Encode}; #[cfg(feature = "std")] use parity_util_mem::{MallocSizeOf, MallocSizeOfOps}; +use scale_info::TypeInfo; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; @@ -106,7 +107,7 @@ impl MallocSizeOf for ValidatorId { } /// Index of the validator is used as a lightweight replacement of the `ValidatorId` when appropriate. -#[derive(Eq, Ord, PartialEq, PartialOrd, Copy, Clone, Encode, Decode)] +#[derive(Eq, Ord, PartialEq, PartialOrd, Copy, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Hash, MallocSizeOf))] pub struct ValidatorIndex(pub u32); @@ -139,7 +140,7 @@ impl MallocSizeOf for ValidatorSignature { } /// Retriability for a given active para. -#[derive(Clone, Eq, PartialEq, Encode, Decode)] +#[derive(Clone, Eq, PartialEq, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug))] pub enum Retriable { /// Ineligible for retry. This means it's either a parachain that is always scheduled anyway or @@ -205,7 +206,7 @@ impl SwapAux for () { } /// Identifier for a chain, either one of a number of parachains or the relay chain. -#[derive(Copy, Clone, PartialEq, Encode, Decode)] +#[derive(Copy, Clone, PartialEq, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug))] pub enum Chain { /// The relay chain. @@ -215,7 +216,7 @@ pub enum Chain { } /// The duty roster specifying what jobs each validator must do. -#[derive(Clone, PartialEq, Encode, Decode)] +#[derive(Clone, PartialEq, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Default, Debug))] pub struct DutyRoster { /// Lookup from validator index to chain on which that validator has a duty to validate. @@ -226,7 +227,7 @@ pub struct DutyRoster { /// to fully validate the candidate. /// /// These are global parameters that apply to all parachain candidates in a block. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default))] pub struct GlobalValidationData { /// The maximum code size permitted, in bytes. @@ -239,7 +240,7 @@ pub struct GlobalValidationData { /// Extra data that is needed along with the other fields in a `CandidateReceipt` /// to fully validate the candidate. These fields are parachain-specific. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default))] pub struct LocalValidationData { /// The parent head-data. @@ -261,7 +262,7 @@ pub struct LocalValidationData { } /// Commitments made in a `CandidateReceipt`. Many of these are outputs of validation. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default))] pub struct CandidateCommitments { /// Fees paid from the chain to the relay chain validators. @@ -310,7 +311,7 @@ fn check_collator_signature>( } /// All data pertaining to the execution of a parachain candidate. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default))] pub struct CandidateReceipt { /// The ID of the parachain this is a candidate for. @@ -395,7 +396,7 @@ impl Ord for CandidateReceipt { /// All the data which is omitted in an `AbridgedCandidateReceipt`, but that /// is necessary for validation of the parachain candidate. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default))] pub struct OmittedValidationData { /// The global validation schedule. @@ -409,7 +410,7 @@ pub struct OmittedValidationData { /// Much info in a candidate-receipt is duplicated from the relay-chain state. /// When submitting to the relay-chain, this data should be omitted as it can /// be re-generated from relay-chain state. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default))] pub struct AbridgedCandidateReceipt { /// The ID of the parachain this is a candidate for. @@ -544,7 +545,7 @@ impl Ord for AbridgedCandidateReceipt { } /// A unique descriptor of the candidate receipt, in a lightweight format. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default))] pub struct CandidateDescriptor { /// The ID of the para this is a candidate for. @@ -564,7 +565,7 @@ pub struct CandidateDescriptor { } /// A collation sent by a collator. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default))] pub struct CollationInfo { /// The ID of the parachain this is a candidate for. @@ -619,7 +620,7 @@ impl CollationInfo { /// A full collation. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Encode, Decode))] +#[cfg_attr(feature = "std", derive(Debug, Encode, Decode, TypeInfo))] pub struct Collation { /// Candidate receipt itself. pub info: CollationInfo, @@ -629,7 +630,7 @@ pub struct Collation { /// A Proof-of-Validation block. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Encode, Decode))] +#[cfg_attr(feature = "std", derive(Debug, Encode, Decode, TypeInfo))] pub struct PoVBlock { /// Block data. pub block_data: BlockData, @@ -645,7 +646,7 @@ impl PoVBlock { /// The data that is kept available about a particular parachain block. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Encode, Decode))] +#[cfg_attr(feature = "std", derive(Debug, Encode, Decode, TypeInfo))] pub struct AvailableData { /// The PoV block. pub pov_block: PoVBlock, @@ -677,7 +678,7 @@ impl CompactStatement { } // Inner helper for codec on `CompactStatement`. -#[derive(Encode, Decode)] +#[derive(Encode, Decode, TypeInfo)] enum CompactStatementInner { #[codec(index = 1)] Seconded(CandidateHash), @@ -733,7 +734,7 @@ impl CompactStatement { /// An either implicit or explicit attestation to the validity of a parachain /// candidate. -#[derive(Clone, Eq, PartialEq, Decode, Encode, RuntimeDebug)] +#[derive(Clone, Eq, PartialEq, Decode, Encode, RuntimeDebug, TypeInfo)] pub enum ValidityAttestation { /// Implicit validity attestation by issuing. /// This corresponds to issuance of a `Candidate` statement. @@ -804,7 +805,7 @@ impl AttestedCandidate { } /// A fee schedule for messages. This is a linear function in the number of bytes of a message. -#[derive(PartialEq, Eq, PartialOrd, Hash, Default, Clone, Copy, Encode, Decode)] +#[derive(PartialEq, Eq, PartialOrd, Hash, Default, Clone, Copy, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct FeeSchedule { /// The base fee charged for all messages. diff --git a/primitives/src/v1/mod.rs b/primitives/src/v1/mod.rs index dec17ca915a7..40ca368fc6e9 100644 --- a/primitives/src/v1/mod.rs +++ b/primitives/src/v1/mod.rs @@ -18,6 +18,7 @@ use bitvec::vec::BitVec; use parity_scale_codec::{Decode, Encode}; +use scale_info::TypeInfo; use sp_std::{collections::btree_map::BTreeMap, prelude::*}; use application_crypto::KeyTypeId; @@ -236,6 +237,13 @@ pub const ASSIGNMENT_KEY_TYPE_ID: KeyTypeId = KeyTypeId(*b"asgn"); /// * when detecting a code decompression bomb in the client pub const MAX_CODE_SIZE: u32 = 3 * 1024 * 1024; +/// Maximum head data size we support right now. +/// +/// Used for: +/// * initial genesis for the Parachains configuration +/// * checking updates to this stored runtime configuration do not exceed this limit +pub const MAX_HEAD_DATA_SIZE: u32 = 1 * 1024 * 1024; + /// Maximum PoV size we support right now. /// /// Used for: @@ -319,7 +327,7 @@ fn check_collator_signature>( } /// A unique descriptor of the candidate receipt. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default, Hash, MallocSizeOf))] pub struct CandidateDescriptor { /// The ID of the para this is a candidate for. @@ -361,7 +369,7 @@ impl> CandidateDescriptor { } /// A candidate-receipt. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default, MallocSizeOf))] pub struct CandidateReceipt { /// The descriptor of the candidate. @@ -386,7 +394,7 @@ impl CandidateReceipt { } /// All data pertaining to the execution of a para candidate. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default))] pub struct FullCandidateReceipt { /// The inner candidate receipt. @@ -399,7 +407,7 @@ pub struct FullCandidateReceipt { } /// A candidate-receipt with commitments directly included. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default, Hash, MallocSizeOf))] pub struct CommittedCandidateReceipt { /// The descriptor of the candidate. @@ -480,7 +488,7 @@ impl Ord for CommittedCandidateReceipt { /// /// The `PersistedValidationData` should be relatively lightweight primarily because it is constructed /// during inclusion for each candidate and therefore lies on the critical path of inclusion. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default, MallocSizeOf))] pub struct PersistedValidationData { /// The parent head-data. @@ -501,7 +509,7 @@ impl PersistedValidationData { } /// Commitments made in a `CandidateReceipt`. Many of these are outputs of validation. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Default, Hash, MallocSizeOf))] pub struct CandidateCommitments { /// Messages destined to be interpreted by the Relay chain itself. @@ -526,7 +534,7 @@ impl CandidateCommitments { } /// A bitfield concerning availability of backed candidates. -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct AvailabilityBitfield(pub BitVec); impl From> for AvailabilityBitfield { @@ -549,7 +557,7 @@ pub type SignedAvailabilityBitfields = Vec; pub type UncheckedSignedAvailabilityBitfields = Vec; /// A backed (or backable, depending on context) candidate. -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] #[cfg_attr(feature = "std", derive(Default))] pub struct BackedCandidate { /// The candidate referred to. @@ -637,7 +645,7 @@ pub fn check_candidate_backing + Clone + Encode>( } /// The unique (during session) index of a core. -#[derive(Encode, Decode, Default, PartialOrd, Ord, Eq, PartialEq, Clone, Copy)] +#[derive(Encode, Decode, Default, PartialOrd, Ord, Eq, PartialEq, Clone, Copy, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, Hash, MallocSizeOf))] pub struct CoreIndex(pub u32); @@ -648,7 +656,7 @@ impl From for CoreIndex { } /// The unique (during session) index of a validator group. -#[derive(Encode, Decode, Default, Clone, Copy, Debug, PartialEq, Eq)] +#[derive(Encode, Decode, Default, Clone, Copy, Debug, PartialEq, Eq, TypeInfo)] #[cfg_attr(feature = "std", derive(Hash, MallocSizeOf))] pub struct GroupIndex(pub u32); @@ -659,12 +667,12 @@ impl From for GroupIndex { } /// A claim on authoring the next block for a given parathread. -#[derive(Clone, Encode, Decode, Default)] +#[derive(Clone, Encode, Decode, Default, TypeInfo)] #[cfg_attr(feature = "std", derive(PartialEq, Debug))] pub struct ParathreadClaim(pub Id, pub CollatorId); /// An entry tracking a claim to ensure it does not pass the maximum number of retries. -#[derive(Clone, Encode, Decode, Default)] +#[derive(Clone, Encode, Decode, Default, TypeInfo)] #[cfg_attr(feature = "std", derive(PartialEq, Debug))] pub struct ParathreadEntry { /// The claim. @@ -674,7 +682,7 @@ pub struct ParathreadEntry { } /// What is occupying a specific availability core. -#[derive(Clone, Encode, Decode)] +#[derive(Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(PartialEq, Debug))] pub enum CoreOccupied { /// A parathread. @@ -684,7 +692,7 @@ pub enum CoreOccupied { } /// A helper data-type for tracking validator-group rotations. -#[derive(Clone, Encode, Decode)] +#[derive(Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(PartialEq, Debug, MallocSizeOf))] pub struct GroupRotationInfo { /// The block number where the session started. @@ -772,7 +780,7 @@ impl GroupRotationInfo { } /// Information about a core which is currently occupied. -#[derive(Clone, Encode, Decode)] +#[derive(Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, PartialEq, MallocSizeOf))] pub struct OccupiedCore { // NOTE: this has no ParaId as it can be deduced from the candidate descriptor. @@ -808,7 +816,7 @@ impl OccupiedCore { } /// Information about a core which is currently occupied. -#[derive(Clone, Encode, Decode)] +#[derive(Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, PartialEq, Default, MallocSizeOf))] pub struct ScheduledCore { /// The ID of a para scheduled. @@ -818,7 +826,7 @@ pub struct ScheduledCore { } /// The state of a particular availability core. -#[derive(Clone, Encode, Decode)] +#[derive(Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug, PartialEq, MallocSizeOf))] pub enum CoreState { /// The core is currently occupied. @@ -854,7 +862,7 @@ impl CoreState { } /// An assumption being made about the state of an occupied core. -#[derive(Clone, Copy, Encode, Decode)] +#[derive(Clone, Copy, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(PartialEq, Eq, Hash, Debug))] pub enum OccupiedCoreAssumption { /// The candidate occupying the core was made available and included to free the core. @@ -869,7 +877,7 @@ pub enum OccupiedCoreAssumption { } /// An even concerning a candidate. -#[derive(Clone, Encode, Decode)] +#[derive(Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(PartialEq, Debug, MallocSizeOf))] pub enum CandidateEvent { /// This candidate receipt was backed in the most recent block. @@ -888,15 +896,35 @@ pub enum CandidateEvent { } /// Information about validator sets of a session. -#[derive(Clone, Encode, Decode, RuntimeDebug)] +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo)] #[cfg_attr(feature = "std", derive(PartialEq, Default, MallocSizeOf))] pub struct SessionInfo { /// Validators in canonical ordering. + /// + /// NOTE: There might be more authorities in the current session, than `validators` participating + /// in parachain consensus. See + /// [`max_validators`](https://github.com/paritytech/polkadot/blob/a52dca2be7840b23c19c153cf7e110b1e3e475f8/runtime/parachains/src/configuration.rs#L148). + /// + /// `SessionInfo::validators` will be limited to to `max_validators` when set. pub validators: Vec, /// Validators' authority discovery keys for the session in canonical ordering. + /// + /// NOTE: The first `validators.len()` entries will match the corresponding validators in + /// `validators`, afterwards any remaining authorities can be found. This is any authorities not + /// participating in parachain consensus - see + /// [`max_validators`](https://github.com/paritytech/polkadot/blob/a52dca2be7840b23c19c153cf7e110b1e3e475f8/runtime/parachains/src/configuration.rs#L148) #[cfg_attr(feature = "std", ignore_malloc_size_of = "outside type")] pub discovery_keys: Vec, /// The assignment keys for validators. + /// + /// NOTE: There might be more authorities in the current session, than validators participating + /// in parachain consensus. See + /// [`max_validators`](https://github.com/paritytech/polkadot/blob/a52dca2be7840b23c19c153cf7e110b1e3e475f8/runtime/parachains/src/configuration.rs#L148). + /// + /// Therefore: + /// ```ignore + /// assignment_keys.len() == validators.len() && validators.len() <= discovery_keys.len() + /// ``` pub assignment_keys: Vec, /// Validators in shuffled ordering - these are the validator groups as produced /// by the `Scheduler` module for the session and are typically referred to by @@ -1013,7 +1041,7 @@ impl From for u8 { /// Abridged version of `HostConfiguration` (from the `Configuration` parachains host runtime module) /// meant to be used by a parachain or PDK such as cumulus. -#[derive(Clone, Encode, Decode, RuntimeDebug)] +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo)] #[cfg_attr(feature = "std", derive(PartialEq))] pub struct AbridgedHostConfiguration { /// The maximum validation code size, in bytes. @@ -1046,7 +1074,7 @@ pub struct AbridgedHostConfiguration { /// Abridged version of `HrmpChannel` (from the `Hrmp` parachains host runtime module) meant to be /// used by a parachain or PDK such as cumulus. -#[derive(Clone, Encode, Decode, RuntimeDebug)] +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo)] #[cfg_attr(feature = "std", derive(PartialEq))] pub struct AbridgedHrmpChannel { /// The maximum number of messages that can be pending in the channel at once. @@ -1072,7 +1100,7 @@ pub struct AbridgedHrmpChannel { } /// A possible upgrade restriction that prevents a parachain from performing an upgrade. -#[derive(Encode, Decode, PartialEq, RuntimeDebug)] +#[derive(Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] pub enum UpgradeRestriction { /// There is an upgrade restriction and there are no details about its specifics nor how long /// it could last. @@ -1085,7 +1113,7 @@ pub enum UpgradeRestriction { /// /// This data type appears in the last step of the upgrade process. After the parachain observes it /// and reacts to it the upgrade process concludes. -#[derive(Encode, Decode, PartialEq, RuntimeDebug)] +#[derive(Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] pub enum UpgradeGoAhead { /// Abort the upgrade process. There is something wrong with the validation code previously /// submitted by the parachain. This variant can also be used to prevent upgrades by the governance @@ -1153,7 +1181,7 @@ impl From for runtime_primitives::DigestItem { /// A statement about a candidate, to be used within the dispute resolution process. /// /// Statements are either in favor of the candidate's validity or against it. -#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug, TypeInfo)] pub enum DisputeStatement { /// A valid statement, of the given kind. #[codec(index = 0)] @@ -1222,7 +1250,7 @@ impl DisputeStatement { } /// Different kinds of statements of validity on a candidate. -#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug, TypeInfo)] pub enum ValidDisputeStatementKind { /// An explicit statement issued as part of a dispute. #[codec(index = 0)] @@ -1239,7 +1267,7 @@ pub enum ValidDisputeStatementKind { } /// Different kinds of statements of invalidity on a candidate. -#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug, TypeInfo)] pub enum InvalidDisputeStatementKind { /// An explicit statement issued as part of a dispute. #[codec(index = 0)] @@ -1267,7 +1295,7 @@ impl ExplicitDisputeStatement { } /// A set of statements about a specific candidate. -#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug, TypeInfo)] pub struct DisputeStatementSet { /// The candidate referenced by this set. pub candidate_hash: CandidateHash, @@ -1281,7 +1309,7 @@ pub struct DisputeStatementSet { pub type MultiDisputeStatementSet = Vec; /// The entire state of a dispute. -#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq)] +#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, TypeInfo)] pub struct DisputeState { /// A bitfield indicating all validators for the candidate. pub validators_for: BitVec, // one bit per validator. @@ -1294,7 +1322,7 @@ pub struct DisputeState { } /// Parachains inherent-data passed into the runtime by a block author -#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug, TypeInfo)] pub struct InherentData { /// Signed bitfields by validators about availability. pub bitfields: UncheckedSignedAvailabilityBitfields, diff --git a/primitives/src/v1/signed.rs b/primitives/src/v1/signed.rs index 66908216ebb3..612cc1516895 100644 --- a/primitives/src/v1/signed.rs +++ b/primitives/src/v1/signed.rs @@ -15,6 +15,7 @@ // along with Polkadot. If not, see . use parity_scale_codec::{Decode, Encode}; +use scale_info::TypeInfo; #[cfg(feature = "std")] use application_crypto::AppKey; @@ -41,7 +42,7 @@ use crate::v0::{SigningContext, ValidatorId, ValidatorIndex, ValidatorSignature} pub struct Signed(UncheckedSigned); /// Unchecked signed data, can be converted to `Signed` by checking the signature. -#[derive(Clone, PartialEq, Eq, RuntimeDebug, Encode, Decode)] +#[derive(Clone, PartialEq, Eq, RuntimeDebug, Encode, Decode, TypeInfo)] pub struct UncheckedSigned { /// The payload is part of the signed data. The rest is the signing context, /// which is known both at signing and at validation. diff --git a/roadmap/implementers-guide/src/node/approval/approval-voting.md b/roadmap/implementers-guide/src/node/approval/approval-voting.md index 2366d7281d9e..adb95e1f6389 100644 --- a/roadmap/implementers-guide/src/node/approval/approval-voting.md +++ b/roadmap/implementers-guide/src/node/approval/approval-voting.md @@ -111,6 +111,9 @@ CandidateHash => CandidateEntry ```rust const APPROVAL_SESSIONS: SessionIndex = 6; + +// The minimum amount of ticks that an assignment must have been known for. +const APPROVAL_DELAY: Tick = 2; ``` In-memory state: @@ -268,7 +271,7 @@ On receiving an `ApprovedAncestor(Hash, BlockNumber, response_channel)`: * If the `approval_entry` is approved, this doesn't need to be woken up again. * If `RequiredTranches::All` - no wakeup. We assume other incoming votes will trigger wakeup and potentially re-schedule. * If `RequiredTranches::Pending { considered, next_no_show, uncovered, maximum_broadcast, clock_drift }` - schedule at the lesser of the next no-show tick, or the tick, offset positively by `clock_drift` of the next non-empty tranche we are aware of after `considered`, including any tranche containing our own unbroadcast assignment. This can lead to no wakeup in the case that we have already broadcast our assignment and there are no pending no-shows; that is, we have approval votes for every assignment we've received that is not already a no-show. In this case, we will be re-triggered by other validators broadcasting their assignments. - * If `RequiredTranches::Exact { next_no_show, .. }` - set a wakeup for the next no-show tick. + * If `RequiredTranches::Exact { next_no_show, latest_assignment_tick, .. }` - set a wakeup for the earlier of the next no-show tick or the latest assignment tick + `APPROVAL_DELAY`. #### Launch Approval Work @@ -278,7 +281,7 @@ On receiving an `ApprovedAncestor(Hash, BlockNumber, response_channel)`: * Load the historical validation code of the parachain by dispatching a `RuntimeApiRequest::ValidationCodeByHash(descriptor.validation_code_hash)` against the state of `block_hash`. * Spawn a background task with a clone of `background_tx` * Wait for the available data - * Issue a `CandidateValidationMessage::ValidateFromExhaustive` message + * Issue a `CandidateValidationMessage::ValidateFromExhaustive` message with `APPROVAL_EXECUTION_TIMEOUT` as the timeout parameter. * Wait for the result of validation * Check that the result of validation, if valid, matches the commitments in the receipt. * If valid, issue a message on `background_tx` detailing the request. @@ -335,6 +338,8 @@ enum RequiredTranches { /// event that there are some assignments that don't have corresponding approval votes. If this /// is `None`, all assignments have approvals. next_no_show: Option, + /// The last tick at which a needed assignment was received. + last_assignment_tick: Option, } } ``` @@ -355,8 +360,9 @@ Likewise, when considering how many tranches to take, the no-show depth should b * Set a clock drift of `depth * no_show_duration` * Take tranches up to `tranche_now - clock_drift` until all needed assignments are met. * Keep track of the `next_no_show` according to the clock drift, as we go. + * Keep track of the `last_assignment_tick` as we go. * If running out of tranches before then, return `Pending { considered, next_no_show, maximum_broadcast, clock_drift }` - * If there are no no-shows, return `Exact { needed, tolerated_missing, next_no_show }` + * If there are no no-shows, return `Exact { needed, tolerated_missing, next_no_show, last_assignment_tick }` * `maximum_broadcast` is either `DelayTranche::max_value()` at tranche 0 or otherwise by the last considered tranche + the number of uncovered no-shows at this point. * If there are no-shows, return to the beginning, incrementing `depth` and attempting to cover the number of no-shows. Each no-show must be covered by a non-empty tranche, which are tranches that have at least one assignment. Each non-empty tranche covers exactly one no-show. * If at any point, it seems that all validators are required, do an early return with `RequiredTranches::All` which indicates that everyone should broadcast. @@ -367,7 +373,9 @@ Likewise, when considering how many tranches to take, the no-show depth should b * If we have `3 * n_approvals > n_validators`, return true. This is because any set with f+1 validators must have at least one honest validator, who has approved the candidate. * If `n_tranches` is `RequiredTranches::Pending`, return false * If `n_tranches` is `RequiredTranches::All`, return false. - * If `n_tranches` is `RequiredTranches::Exact { tranche, tolerated_missing, .. }`, then we return whether all assigned validators up to `tranche` less `tolerated_missing` have approved. e.g. if we had 5 tranches and 1 tolerated missing, we would accept only if all but 1 of assigned validators in tranches 0..=5 have approved. In that example, we also accept all validators in tranches 0..=5 having approved, but that would indicate that the `RequiredTranches` value was incorrectly constructed, so it is not realistic. `tolerated_missing` actually represents covered no-shows. If there are more missing approvals than there are tolerated missing, that indicates that there are some assignments which are not yet no-shows, but may become no-shows, and we should wait for the validators to either approve or become no-shows. + * If `n_tranches` is `RequiredTranches::Exact { tranche, tolerated_missing, latest_assignment_tick, .. }`, then we return whether all assigned validators up to `tranche` less `tolerated_missing` have approved and `latest_assignment_tick + APPROVAL_DELAY >= tick_now`. + * e.g. if we had 5 tranches and 1 tolerated missing, we would accept only if all but 1 of assigned validators in tranches 0..=5 have approved. In that example, we also accept all validators in tranches 0..=5 having approved, but that would indicate that the `RequiredTranches` value was incorrectly constructed, so it is not realistic. `tolerated_missing` actually represents covered no-shows. If there are more missing approvals than there are tolerated missing, that indicates that there are some assignments which are not yet no-shows, but may become no-shows, and we should wait for the validators to either approve or become no-shows. + * e.g. If the above passes and the `latest_assignment_tick` was 5 and the current tick was 6, then we'd return false. ### Time diff --git a/roadmap/implementers-guide/src/node/backing/candidate-backing.md b/roadmap/implementers-guide/src/node/backing/candidate-backing.md index c39ffabdcd98..4b25a89cb1a5 100644 --- a/roadmap/implementers-guide/src/node/backing/candidate-backing.md +++ b/roadmap/implementers-guide/src/node/backing/candidate-backing.md @@ -123,7 +123,7 @@ Dispatch a [`AvailabilityDistributionMessage`][ADM]`::FetchPoV{ validator_index, ### Validate PoV Block Create a `(sender, receiver)` pair. -Dispatch a `CandidateValidationMessage::Validate(validation function, candidate, pov, sender)` and listen on the receiver for a response. +Dispatch a `CandidateValidationMessage::Validate(validation function, candidate, pov, BACKING_EXECUTION_TIMEOUT, sender)` and listen on the receiver for a response. ### Distribute Signed Statement diff --git a/roadmap/implementers-guide/src/node/disputes/dispute-participation.md b/roadmap/implementers-guide/src/node/disputes/dispute-participation.md index b3e1c11fa2be..fc0517fa4e1e 100644 --- a/roadmap/implementers-guide/src/node/disputes/dispute-participation.md +++ b/roadmap/implementers-guide/src/node/disputes/dispute-participation.md @@ -48,7 +48,7 @@ Conclude. * If the data is recovered, dispatch a [`RuntimeApiMessage::ValidationCodeByHash`][RuntimeApiMessage] with the parameters `(candidate_receipt.descriptor.validation_code_hash)` at `state.recent_block.hash`. * Dispatch a [`AvailabilityStoreMessage::StoreAvailableData`][AvailabilityStoreMessage] with the data. * If the code is not fetched from the chain, return. This should be impossible with correct relay chain configuration, at least if chain synchronization is working correctly. -* Dispatch a [`CandidateValidationMessage::ValidateFromExhaustive`][CandidateValidationMessage] with the available data and the validation code. +* Dispatch a [`CandidateValidationMessage::ValidateFromExhaustive`][CandidateValidationMessage] with the available data and the validation code and `APPROVAL_EXECUTION_TIMEOUT` as the timeout parameter. * If the validation result is `Invalid`, [cast invalid votes](#cast-votes) and return. * If the validation fails, [cast invalid votes](#cast-votes) and return. * If the validation succeeds, compute the `CandidateCommitments` based on the validation result and compare against the candidate receipt's `commitments_hash`. If they match, [cast valid votes](#cast-votes) and if not, [cast invalid votes](#cast-votes). diff --git a/roadmap/implementers-guide/src/runtime/disputes.md b/roadmap/implementers-guide/src/runtime/disputes.md index 4fb70eb93d03..83ca86b36b04 100644 --- a/roadmap/implementers-guide/src/runtime/disputes.md +++ b/roadmap/implementers-guide/src/runtime/disputes.md @@ -101,7 +101,7 @@ Frozen: Option, 1. If there is a dispute under `(Sessionindex, CandidateHash)` with fewer than `byzantine_threshold + 1` participating validators, decrease `SpamSlots` by 1 for each validator in the `DisputeState`. 1. If there is a dispute under `(SessionIndex, CandidateHash)` that has concluded against the candidate, invoke `revert_and_freeze` with the stored block number. -* `could_be_invalid(SessionIndex, CandidateHash) -> bool`: Returns whether a candidate has a live dispute ongoing or a dispute which has already concluded in the negative. +* `concluded_invalid(SessionIndex, CandidateHash) -> bool`: Returns whether a candidate has already concluded a dispute in the negative. * `is_frozen()`: Load the value of `Frozen` from storage. Return true if `Some` and false if `None`. @@ -109,4 +109,5 @@ Frozen: Option, * `revert_and_freeze(BlockNumber)`: 1. If `is_frozen()` return. - 1. Set `Frozen` to `Some(BlockNumber)` to indicate a rollback to the given block number is necessary. + 1. Set `Frozen` to `Some(BlockNumber)` to indicate a rollback to the block number. + 1. Issue a `Revert(BlockNumber + 1)` log to indicate a rollback of the block's child in the header chain, which is the same as a rollback to the block number. diff --git a/roadmap/implementers-guide/src/runtime/hrmp.md b/roadmap/implementers-guide/src/runtime/hrmp.md index a19e89b0b379..2b0b4751e30a 100644 --- a/roadmap/implementers-guide/src/runtime/hrmp.md +++ b/roadmap/implementers-guide/src/runtime/hrmp.md @@ -11,8 +11,6 @@ HRMP related structs: struct HrmpOpenChannelRequest { /// Indicates if this request was confirmed by the recipient. confirmed: bool, - /// How many session boundaries ago this request was seen. - age: SessionIndex, /// The amount that the sender supplied at the time of creation of this request. sender_deposit: Balance, /// The maximum message size that could be put into the channel. @@ -158,8 +156,8 @@ Candidate Enactment: 1. Decrement `C.msg_count` 1. Decrement `C.total_size` by `M`'s payload size. 1. Set `HrmpWatermarks` for `P` to be equal to `new_hrmp_watermark` - > NOTE: That collecting digests can be inefficient and the time it takes grows very fast. Thanks to the aggresive - > parametrization this shouldn't be a big of a deal. + > NOTE: That collecting digests can be inefficient and the time it takes grows very fast. Thanks to the aggressive + > parameterization this shouldn't be a big of a deal. > If that becomes a problem consider introducing an extra dictionary which says at what block the given sender > sent a message to the recipient. @@ -212,6 +210,13 @@ the parachain executed the message. - The DM is sent using `queue_downward_message`. - The DM is represented by the `HrmpChannelAccepted` XCM message. - `recipient` is set to `origin`. +* `hrmp_cancel_open_request(ch)`: + 1. Check that `origin` is either `ch.sender` or `ch.recipient` + 1. Check that the open channel request `ch` exists. + 1. Check that the open channel request for `ch` is not confirmed. + 1. Remove `ch` from `HrmpOpenChannelRequests` and `HrmpOpenChannelRequestsList` + 1. Decrement `HrmpAcceptedChannelRequestCount` for `ch.recipient` by 1. + 1. Unreserve the deposit of `ch.sender`. * `hrmp_close_channel(ch)`: 1. Check that `origin` is either `ch.sender` or `ch.recipient` 1. Check that `HrmpChannels` for `ch` exists. @@ -233,15 +238,12 @@ the parachain executed the message. 1. Remove all outbound channels of `P`, i.e. `(P, _)`, 1. Remove `HrmpOpenChannelRequestCount` for `P` 1. Remove `HrmpAcceptedChannelRequestCount` for `P`. + 1. Remove `HrmpOpenChannelRequests` and `HrmpOpenChannelRequestsList` for `(P, _)` and `(_, P)`. + 1. For each removed channel request `C`: + 1. Unreserve the sender's deposit if the sender is not present in `outgoing_paras` + 1. Unreserve the recipient's deposit if `C` is confirmed and the recipient is not present in `outgoing_paras` 1. For each channel designator `D` in `HrmpOpenChannelRequestsList` we query the request `R` from `HrmpOpenChannelRequests`: - 1. if `R.confirmed = false`: - 1. increment `R.age` by 1. - 1. if `R.age` reached a preconfigured time-to-live limit `config.hrmp_open_request_ttl`, then: - 1. refund `R.sender_deposit` to the sender - 1. decrement `HrmpOpenChannelRequestCount` for `D.sender` by 1. - 1. remove `R` - 1. remove `D` - 2. if `R.confirmed = true`, + 1. if `R.confirmed = true`, 1. if both `D.sender` and `D.recipient` are not offboarded. 1. create a new channel `C` between `(D.sender, D.recipient)`. 1. Initialize the `C.sender_deposit` with `R.sender_deposit` and `C.recipient_deposit` diff --git a/roadmap/implementers-guide/src/runtime/parainherent.md b/roadmap/implementers-guide/src/runtime/parainherent.md index ed4d6fe7d90b..f9aacc2c3578 100644 --- a/roadmap/implementers-guide/src/runtime/parainherent.md +++ b/roadmap/implementers-guide/src/runtime/parainherent.md @@ -1,4 +1,4 @@ -# ParaInherent +# `ParaInherent` This module is responsible for providing all data given to the runtime by the block author to the various parachains modules. The entry-point is mandatory, in that it must be invoked exactly once within every block, and it is also "inherent", in that it is provided with no origin by the block author. The data within it carries its own authentication; i.e. the data takes the form of signed statements by validators. If any of the steps within fails, the entry-point is considered as having failed and the block will be invalid. @@ -26,15 +26,15 @@ Included: Option<()>, 1. Hash the parent header and make sure that it corresponds to the block hash of the parent (tracked by the `frame_system` FRAME module), 1. Invoke `Disputes::provide_multi_dispute_data`. 1. If `Disputes::is_frozen`, return and set `Included` to `Some(())`. - 1. If there are any created disputes from the current session, invoke `Inclusion::collect_disputed` with the disputed candidates. Annotate each returned core with `FreedReason::Concluded`. + 1. If there are any concluded disputes from the current session, invoke `Inclusion::collect_disputed` with the disputed candidates. Annotate each returned core with `FreedReason::Concluded`, sort them, and invoke `Scheduler::free_cores` with them. 1. The `Bitfields` are first forwarded to the `Inclusion::process_bitfields` routine, returning a set of freed cores. Provide the number of availability cores (`Scheduler::availability_cores().len()`) as the expected number of bits and a `Scheduler::core_para` as a core-lookup to the `process_bitfields` routine. Annotate each of these freed cores with `FreedReason::Concluded`. 1. For each freed candidate from the `Inclusion::process_bitfields` call, invoke `Disputes::note_included(current_session, candidate)`. 1. If `Scheduler::availability_timeout_predicate` is `Some`, invoke `Inclusion::collect_pending` using it and annotate each of those freed cores with `FreedReason::TimedOut`. - 1. Combine and sort the dispute-freed cores, the bitfield-freed cores, and the timed-out cores. + 1. Combine and sort the the bitfield-freed cores and the timed-out cores. 1. Invoke `Scheduler::clear` 1. Invoke `Scheduler::schedule(freed_cores, System::current_block())` 1. Extract `parent_storage_root` from the parent header, - 1. If `Disputes::could_be_invalid(current_session, candidate)` is true for any of the `backed_candidates`, fail. + 1. If `Disputes::concluded_invalid(current_session, candidate)` is true for any of the `backed_candidates`, fail. 1. Invoke the `Inclusion::process_candidates` routine with the parameters `(parent_storage_root, backed_candidates, Scheduler::scheduled(), Scheduler::group_validators)`. 1. Call `Scheduler::occupied` using the return value of the `Inclusion::process_candidates` call above, first sorting the list of assigned core indices. 1. Call the `Ump::process_pending_upward_messages` routine to execute all messages in upward dispatch queues. diff --git a/roadmap/implementers-guide/src/runtime/scheduler.md b/roadmap/implementers-guide/src/runtime/scheduler.md index 68b1a8abb722..16c3280d1808 100644 --- a/roadmap/implementers-guide/src/runtime/scheduler.md +++ b/roadmap/implementers-guide/src/runtime/scheduler.md @@ -82,7 +82,7 @@ digraph { ## Validator Groups -Validator group assignments do not need to change very quickly. The security benefits of fast rotation are redundant with the challenge mechanism in the [Approval process](../protocol-approval.md). Because of this, we only divide validators into groups at the beginning of the session and do not shuffle membership during the session. However, we do take steps to ensure that no particular validator group has dominance over a single parachain or parathread-multiplexer for an entire session to provide better guarantees of liveness. +Validator group assignments do not need to change very quickly. The security benefits of fast rotation are redundant with the challenge mechanism in the [Approval process](../protocol-approval.md). Because of this, we only divide validators into groups at the beginning of the session and do not shuffle membership during the session. However, we do take steps to ensure that no particular validator group has dominance over a single parachain or parathread-multiplexer for an entire session to provide better guarantees of live-ness. Validator groups rotate across availability cores in a round-robin fashion, with rotation occurring at fixed intervals. The i'th group will be assigned to the `(i+k)%n`'th core at any point in time, where `k` is the number of rotations that have occurred in the session, and `n` is the number of cores. This makes upcoming rotations within the same session predictable. @@ -185,7 +185,7 @@ Actions: 1. Resize `AvailabilityCores` to have length `n_cores` with all `None` entries. 1. Compute new validator groups by shuffling using a secure randomness beacon - Note that the total number of validators `V` in AV may not be evenly divided by `n_cores`. - - The groups are selected by partitioning AV. The first V % N groups will have (V / n_cores) + 1 members, while the remaining groups will have (V / N) members each. + - The groups are selected by partitioning AV. The first `V % N` groups will have `(V / n_cores) + 1` members, while the remaining groups will have `(V / N)` members each. - Instead of using the indices within AV, which point to the broader set, indices _into_ AV should be used. This implies that groups should have simply ascending validator indices. 1. Prune the parathread queue to remove all retries beyond `configuration.parathread_retries`. - Also prune all parathread claims corresponding to de-registered parathreads. @@ -209,11 +209,13 @@ No finalization routine runs for this module. - The core used for the parathread claim is the `next_core` field of the `ParathreadQueue` and adding `Paras::parachains().len()` to it. - `next_core` is then updated by adding 1 and taking it modulo `config.parathread_cores`. - The claim is then added to the claim index. -- `schedule(Vec<(CoreIndex, FreedReason)>, now: BlockNumber)`: schedule new core assignments, with a parameter indicating previously-occupied cores which are to be considered returned and why they are being returned. +- `free_cores(Vec<(CoreIndex, FreedReason)>)`: indicate previosuly-occupied cores which are to be considered returned and why they are being returned. - All freed parachain cores should be assigned to their respective parachain - All freed parathread cores whose reason for freeing was `FreedReason::Concluded` should have the claim removed from the claim index. - All freed parathread cores whose reason for freeing was `FreedReason::TimedOut` should have the claim added to the parathread queue again without retries incremented - All freed parathread cores should take the next parathread entry from the queue. +- `schedule(Vec<(CoreIndex, FreedReason)>, now: BlockNumber)`: schedule new core assignments, with a parameter indicating previously-occupied cores which are to be considered returned and why they are being returned. + - Invoke `free_cores(freed_cores)` - The i'th validator group will be assigned to the `(i+k)%n`'th core at any point in time, where `k` is the number of rotations that have occurred in the session, and `n` is the total number of cores. This makes upcoming rotations within the same session predictable. Rotations are based off of `now`. - `scheduled() -> Vec`: Get currently scheduled core assignments. - `occupied(Vec)`. Note that the given cores have become occupied. diff --git a/roadmap/implementers-guide/src/runtime/session_info.md b/roadmap/implementers-guide/src/runtime/session_info.md index a37f61af08d7..5ee63ab5a903 100644 --- a/roadmap/implementers-guide/src/runtime/session_info.md +++ b/roadmap/implementers-guide/src/runtime/session_info.md @@ -8,27 +8,47 @@ Helper structs: ```rust struct SessionInfo { - // validators in canonical ordering. These are the public keys used for backing, - // dispute participation, and approvals. + /// Validators in canonical ordering. + /// + /// NOTE: There might be more authorities in the current session, than `validators` participating + /// in parachain consensus. See + /// [`max_validators`](https://github.com/paritytech/polkadot/blob/a52dca2be7840b23c19c153cf7e110b1e3e475f8/runtime/parachains/src/configuration.rs#L148). + /// + /// `SessionInfo::validators` will be limited to to `max_validators` when set. validators: Vec, - // validators' authority discovery keys for the session in canonical ordering. - discovery_keys: Vec, - // The assignment keys for validators. + /// Validators' authority discovery keys for the session in canonical ordering. + /// + /// NOTE: The first `validators.len()` entries will match the corresponding validators in + /// `validators`, afterwards any remaining authorities can be found. This is any authorities not + /// participating in parachain consensus - see + /// [`max_validators`](https://github.com/paritytech/polkadot/blob/a52dca2be7840b23c19c153cf7e110b1e3e475f8/runtime/parachains/src/configuration.rs#L148) + #[cfg_attr(feature = "std", ignore_malloc_size_of = "outside type")] + discovery_keys: Vec, + /// The assignment keys for validators. + /// + /// NOTE: There might be more authorities in the current session, than validators participating + /// in parachain consensus. See + /// [`max_validators`](https://github.com/paritytech/polkadot/blob/a52dca2be7840b23c19c153cf7e110b1e3e475f8/runtime/parachains/src/configuration.rs#L148). + /// + /// Therefore: + /// ```ignore + /// assignment_keys.len() == validators.len() && validators.len() <= discovery_keys.len() + /// ``` assignment_keys: Vec, - // validators in shuffled ordering - these are the validator groups as produced - // by the `Scheduler` module for the session and are typically referred to by - // `GroupIndex`. + /// Validators in shuffled ordering - these are the validator groups as produced + /// by the `Scheduler` module for the session and are typically referred to by + /// `GroupIndex`. validator_groups: Vec>, - // The number of availability cores used by the protocol during this session. + /// The number of availability cores used by the protocol during this session. n_cores: u32, - // the zeroth delay tranche width. + /// The zeroth delay tranche width. zeroth_delay_tranche_width: u32, - // The number of samples we do of relay_vrf_modulo. + /// The number of samples we do of `relay_vrf_modulo`. relay_vrf_modulo_samples: u32, - // The number of delay tranches in total. + /// The number of delay tranches in total. n_delay_tranches: u32, - // How many slots (BABE / SASSAFRAS) must pass before an assignment is considered a - // no-show. + /// How many slots (BABE / SASSAFRAS) must pass before an assignment is considered a + /// no-show. no_show_slots: u32, /// The number of validators needed to approve a block. needed_approvals: u32, diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index 78d536f1a21c..f3195e713399 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -785,6 +785,9 @@ enum ValidationResult { Invalid, } +const BACKING_EXECUTION_TIMEOUT: Duration = 2 seconds; +const APPROVAL_EXECUTION_TIMEOUT: Duration = 6 seconds; + /// Messages received by the Validation subsystem. /// /// ## Validation Requests @@ -807,6 +810,7 @@ pub enum CandidateValidationMessage { ValidateFromChainState( CandidateDescriptor, Arc, + Duration, // Execution timeout. oneshot::Sender>, ), /// Validate a candidate with provided, exhaustive parameters for validation. @@ -823,6 +827,7 @@ pub enum CandidateValidationMessage { ValidationCode, CandidateDescriptor, Arc, + Duration, // Execution timeout. oneshot::Sender>, ), } diff --git a/roadmap/implementers-guide/src/types/runtime.md b/roadmap/implementers-guide/src/types/runtime.md index 8f52bf8bc76a..5749aeca866a 100644 --- a/roadmap/implementers-guide/src/types/runtime.md +++ b/roadmap/implementers-guide/src/types/runtime.md @@ -42,7 +42,7 @@ struct HostConfiguration { pub dispute_period: SessionIndex, /// How long after dispute conclusion to accept statements. pub dispute_post_conclusion_acceptance_period: BlockNumber, - /// The maximum number of dispute spam slots + /// The maximum number of dispute spam slots pub dispute_max_spam_slots: u32, /// How long it takes for a dispute to conclude by time-out, if no supermajority is reached. pub dispute_conclusion_by_time_out_period: BlockNumber, @@ -85,8 +85,6 @@ struct HostConfiguration { /// decide to do with its PoV so this value in practice will be picked as a fraction of the PoV /// size. pub max_downward_message_size: u32, - /// Number of sessions after which an HRMP open channel request expires. - pub hrmp_open_request_ttl: u32, /// The deposit that the sender should provide for opening an HRMP channel. pub hrmp_sender_deposit: u32, /// The deposit that the recipient should provide for accepting opening an HRMP channel. @@ -119,7 +117,7 @@ struct HostConfiguration { Inherent data passed to a runtime entry-point for the advancement of parachain consensus. This contains 3 pieces of data: -1. [`Bitfields`](availability.md#signed-availability-bitfield) +1. [`Bitfields`](availability.md#signed-availability-bitfield) 2. [`BackedCandidates`](backing.md#backed-candidate) 3. [`MultiDisputeStatementSet`](disputes.md#multidisputestatementset) diff --git a/runtime/common/slot_range_helper/Cargo.toml b/runtime/common/slot_range_helper/Cargo.toml index 54d1fe693d0b..aec6b69355fe 100644 --- a/runtime/common/slot_range_helper/Cargo.toml +++ b/runtime/common/slot_range_helper/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "slot-range-helper" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] paste = "1.0" enumn = "0.1.3" -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } diff --git a/runtime/common/src/auctions.rs b/runtime/common/src/auctions.rs index 3e9a5e0b5cb6..e605328885eb 100644 --- a/runtime/common/src/auctions.rs +++ b/runtime/common/src/auctions.rs @@ -34,8 +34,9 @@ use primitives::v1::Id as ParaId; use sp_runtime::traits::{CheckedSub, One, Saturating, Zero}; use sp_std::{mem::swap, prelude::*}; -type CurrencyOf = <::Leaser as Leaser>::Currency; -type BalanceOf = <<::Leaser as Leaser>::Currency as Currency< +type CurrencyOf = + <::Leaser as Leaser<::BlockNumber>>::Currency; +type BalanceOf = <<::Leaser as Leaser<::BlockNumber>>::Currency as Currency< ::AccountId, >>::Balance; @@ -65,7 +66,9 @@ impl WeightInfo for TestWeightInfo { /// An auction index. We count auctions in this type. pub type AuctionIndex = u32; -type LeasePeriodOf = <::Leaser as Leaser>::LeasePeriod; +type LeasePeriodOf = + <::Leaser as Leaser<::BlockNumber>>::LeasePeriod; + // Winning data type. This encodes the top bidders of each range together with their bid. type WinningData = [Option<(::AccountId, ParaId, BalanceOf)>; SlotRange::SLOT_RANGE_COUNT]; @@ -91,7 +94,11 @@ pub mod pallet { type Event: From> + IsType<::Event>; /// The type representing the leasing system. - type Leaser: Leaser; + type Leaser: Leaser< + Self::BlockNumber, + AccountId = Self::AccountId, + LeasePeriod = Self::BlockNumber, + >; /// The parachain registrar type. type Registrar: Registrar; @@ -118,12 +125,6 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] - #[pallet::metadata( - T::AccountId = "AccountId", - T::BlockNumber = "BlockNumber", - LeasePeriodOf = "LeasePeriod", - BalanceOf = "Balance", - )] pub enum Event { /// An auction started. Provides its index and the block number where it will begin to /// close and the first lease period of the quadruplet that is auctioned. @@ -305,9 +306,8 @@ pub mod pallet { } } -impl Auctioneer for Pallet { +impl Auctioneer for Pallet { type AccountId = T::AccountId; - type BlockNumber = T::BlockNumber; type LeasePeriod = T::BlockNumber; type Currency = CurrencyOf; @@ -319,7 +319,7 @@ impl Auctioneer for Pallet { } // Returns the status of the auction given the current block number. - fn auction_status(now: Self::BlockNumber) -> AuctionStatus { + fn auction_status(now: T::BlockNumber) -> AuctionStatus { let early_end = match AuctionInfo::::get() { Some((_, early_end)) => early_end, None => return AuctionStatus::NotStarted, @@ -352,12 +352,13 @@ impl Auctioneer for Pallet { Self::handle_bid(bidder, para, AuctionCounter::::get(), first_slot, last_slot, amount) } - fn lease_period_index() -> Self::LeasePeriod { - T::Leaser::lease_period_index() + fn lease_period_index(b: T::BlockNumber) -> Option<(Self::LeasePeriod, bool)> { + T::Leaser::lease_period_index(b) } - fn lease_period() -> Self::LeasePeriod { - T::Leaser::lease_period() + #[cfg(any(feature = "runtime-benchmarks", test))] + fn lease_period_length() -> (T::BlockNumber, T::BlockNumber) { + T::Leaser::lease_period_length() } fn has_won_an_auction(para: ParaId, bidder: &T::AccountId) -> bool { @@ -380,10 +381,11 @@ impl Pallet { ) -> DispatchResult { let maybe_auction = AuctionInfo::::get(); ensure!(maybe_auction.is_none(), Error::::AuctionInProgress); - ensure!( - lease_period_index >= T::Leaser::lease_period_index(), - Error::::LeasePeriodInPast - ); + let now = frame_system::Pallet::::block_number(); + if let Some((current_lease_period, _)) = T::Leaser::lease_period_index(now) { + // If there is no active lease period, then we don't need to make this check. + ensure!(lease_period_index >= current_lease_period, Error::::LeasePeriodInPast); + } // Bump the counter. let n = AuctionCounter::::mutate(|n| { @@ -573,7 +575,9 @@ impl Pallet { let period_count = LeasePeriodOf::::from(range.len() as u32); match T::Leaser::lease_out(para, &leaser, amount, period_begin, period_count) { - Err(LeaseError::ReserveFailed) | Err(LeaseError::AlreadyEnded) => { + Err(LeaseError::ReserveFailed) | + Err(LeaseError::AlreadyEnded) | + Err(LeaseError::NoLeasePeriod) => { // Should never happen since we just unreserved this amount (and our offset is from the // present period). But if it does, there's not much we can do. }, @@ -605,7 +609,7 @@ impl Pallet { .map(|(_, _, amount)| *amount * (range.len() as u32).into()) }; for i in 0..SlotRange::LEASE_PERIODS_PER_SLOT { - let r = SlotRange::new_bounded(0, 0, i as u32).expect("`i < 4`; qed"); + let r = SlotRange::new_bounded(0, 0, i as u32).expect("`i < LPPS`; qed"); if let Some(bid) = best_bid(r) { best_winners_ending_at[i] = (vec![r], bid); } @@ -741,7 +745,7 @@ mod tests { } pub struct TestLeaser; - impl Leaser for TestLeaser { + impl Leaser for TestLeaser { type AccountId = u64; type LeasePeriod = BlockNumber; type Currency = Balances; @@ -755,7 +759,10 @@ mod tests { ) -> Result<(), LeaseError> { LEASES.with(|l| { let mut leases = l.borrow_mut(); - if period_begin < Self::lease_period_index() { + let now = System::block_number(); + let (current_lease_period, _) = + Self::lease_period_index(now).ok_or(LeaseError::NoLeasePeriod)?; + if period_begin < current_lease_period { return Err(LeaseError::AlreadyEnded) } for period in period_begin..(period_begin + period_count) { @@ -785,12 +792,18 @@ mod tests { .unwrap_or_default() } - fn lease_period() -> Self::LeasePeriod { - 10 + fn lease_period_length() -> (BlockNumber, BlockNumber) { + (10, 0) } - fn lease_period_index() -> Self::LeasePeriod { - (System::block_number() / Self::lease_period()).into() + fn lease_period_index(b: BlockNumber) -> Option<(Self::LeasePeriod, bool)> { + let (lease_period_length, offset) = Self::lease_period_length(); + let b = b.checked_sub(offset)?; + + let lease_period = b / lease_period_length; + let first_block = (b % lease_period_length).is_zero(); + + Some((lease_period, first_block)) } fn already_leased( diff --git a/runtime/common/src/claims.rs b/runtime/common/src/claims.rs index f2be5a954b3c..a89bd0b4d03a 100644 --- a/runtime/common/src/claims.rs +++ b/runtime/common/src/claims.rs @@ -24,6 +24,7 @@ use frame_support::{ pub use pallet::*; use parity_scale_codec::{Decode, Encode}; use primitives::v1::ValidityError; +use scale_info::TypeInfo; #[cfg(feature = "std")] use serde::{self, Deserialize, Deserializer, Serialize, Serializer}; use sp_io::{crypto::secp256k1_ecdsa_recover, hashing::keccak_256}; @@ -71,7 +72,7 @@ impl WeightInfo for TestWeightInfo { } /// The kind of statement an account needs to make for a claim to be valid. -#[derive(Encode, Decode, Clone, Copy, Eq, PartialEq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, Copy, Eq, PartialEq, RuntimeDebug, TypeInfo)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum StatementKind { /// Statement required to be made by non-SAFT holders. @@ -105,7 +106,7 @@ impl Default for StatementKind { /// An Ethereum address (i.e. 20 bytes, used to represent an Ethereum account). /// /// This gets serialized to the 0x-prefixed hex representation. -#[derive(Clone, Copy, PartialEq, Eq, Encode, Decode, Default, RuntimeDebug)] +#[derive(Clone, Copy, PartialEq, Eq, Encode, Decode, Default, RuntimeDebug, TypeInfo)] pub struct EthereumAddress([u8; 20]); #[cfg(feature = "std")] @@ -141,7 +142,7 @@ impl<'de> Deserialize<'de> for EthereumAddress { } } -#[derive(Encode, Decode, Clone)] +#[derive(Encode, Decode, Clone, TypeInfo)] pub struct EcdsaSignature(pub [u8; 65]); impl PartialEq for EcdsaSignature { @@ -180,7 +181,6 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] - #[pallet::metadata(T::AccountId = "AccountId", BalanceOf = "Balance")] pub enum Event { /// Someone claimed some DOTs. `[who, ethereum_address, amount]` Claimed(T::AccountId, EthereumAddress, BalanceOf), @@ -473,14 +473,14 @@ pub mod pallet { // // The weight of this logic is included in the `claim` dispatchable. // - Call::claim(account, ethereum_signature) => { + Call::claim { dest: account, ethereum_signature } => { let data = account.using_encoded(to_ascii_hex); (Self::eth_recover(ðereum_signature, &data, &[][..]), None) }, // // The weight of this logic is included in the `claim_attest` dispatchable. // - Call::claim_attest(account, ethereum_signature, statement) => { + Call::claim_attest { dest: account, ethereum_signature, statement } => { let data = account.using_encoded(to_ascii_hex); ( Self::eth_recover(ðereum_signature, &data, &statement), @@ -588,7 +588,8 @@ impl Pallet { /// Validate `attest` calls prior to execution. Needed to avoid a DoS attack since they are /// otherwise free to place on chain. -#[derive(Encode, Decode, Clone, Eq, PartialEq)] +#[derive(Encode, Decode, Clone, Eq, PartialEq, TypeInfo)] +#[scale_info(skip_type_params(T))] pub struct PrevalidateAttests(sp_std::marker::PhantomData) where ::Call: IsSubType>; @@ -643,7 +644,7 @@ where _len: usize, ) -> TransactionValidity { if let Some(local_call) = call.is_sub_type() { - if let Call::attest(attested_statement) = local_call { + if let Call::attest { statement: attested_statement } = local_call { let signer = Preclaims::::get(who) .ok_or(InvalidTransaction::Custom(ValidityError::SignerHasNoClaim.into()))?; if let Some(s) = Signing::::get(signer) { @@ -1035,7 +1036,9 @@ mod tests { fn valid_attest_transactions_are_free() { new_test_ext().execute_with(|| { let p = PrevalidateAttests::::new(); - let c = Call::Claims(ClaimsCall::attest(StatementKind::Saft.to_text().to_vec())); + let c = Call::Claims(ClaimsCall::attest { + statement: StatementKind::Saft.to_text().to_vec(), + }); let di = c.get_dispatch_info(); assert_eq!(di.pays_fee, Pays::No); let r = p.validate(&42, &c, &di, 20); @@ -1047,11 +1050,15 @@ mod tests { fn invalid_attest_transactions_are_recognized() { new_test_ext().execute_with(|| { let p = PrevalidateAttests::::new(); - let c = Call::Claims(ClaimsCall::attest(StatementKind::Regular.to_text().to_vec())); + let c = Call::Claims(ClaimsCall::attest { + statement: StatementKind::Regular.to_text().to_vec(), + }); let di = c.get_dispatch_info(); let r = p.validate(&42, &c, &di, 20); assert!(r.is_err()); - let c = Call::Claims(ClaimsCall::attest(StatementKind::Saft.to_text().to_vec())); + let c = Call::Claims(ClaimsCall::attest { + statement: StatementKind::Saft.to_text().to_vec(), + }); let di = c.get_dispatch_info(); let r = p.validate(&69, &c, &di, 20); assert!(r.is_err()); @@ -1282,7 +1289,10 @@ mod tests { assert_eq!( >::validate_unsigned( source, - &ClaimsCall::claim(1, sig::(&alice(), &1u64.encode(), &[][..])) + &ClaimsCall::claim { + dest: 1, + ethereum_signature: sig::(&alice(), &1u64.encode(), &[][..]) + } ), Ok(ValidTransaction { priority: 100, @@ -1295,19 +1305,26 @@ mod tests { assert_eq!( >::validate_unsigned( source, - &ClaimsCall::claim(0, EcdsaSignature([0; 65])) + &ClaimsCall::claim { dest: 0, ethereum_signature: EcdsaSignature([0; 65]) } ), InvalidTransaction::Custom(ValidityError::InvalidEthereumSignature.into()).into(), ); assert_eq!( >::validate_unsigned( source, - &ClaimsCall::claim(1, sig::(&bob(), &1u64.encode(), &[][..])) + &ClaimsCall::claim { + dest: 1, + ethereum_signature: sig::(&bob(), &1u64.encode(), &[][..]) + } ), InvalidTransaction::Custom(ValidityError::SignerHasNoClaim.into()).into(), ); let s = sig::(&dave(), &1u64.encode(), StatementKind::Regular.to_text()); - let call = ClaimsCall::claim_attest(1, s, StatementKind::Regular.to_text().to_vec()); + let call = ClaimsCall::claim_attest { + dest: 1, + ethereum_signature: s, + statement: StatementKind::Regular.to_text().to_vec(), + }; assert_eq!( >::validate_unsigned(source, &call), Ok(ValidTransaction { @@ -1321,31 +1338,43 @@ mod tests { assert_eq!( >::validate_unsigned( source, - &ClaimsCall::claim_attest( - 1, - EcdsaSignature([0; 65]), - StatementKind::Regular.to_text().to_vec() - ) + &ClaimsCall::claim_attest { + dest: 1, + ethereum_signature: EcdsaSignature([0; 65]), + statement: StatementKind::Regular.to_text().to_vec() + } ), InvalidTransaction::Custom(ValidityError::InvalidEthereumSignature.into()).into(), ); let s = sig::(&bob(), &1u64.encode(), StatementKind::Regular.to_text()); - let call = ClaimsCall::claim_attest(1, s, StatementKind::Regular.to_text().to_vec()); + let call = ClaimsCall::claim_attest { + dest: 1, + ethereum_signature: s, + statement: StatementKind::Regular.to_text().to_vec(), + }; assert_eq!( >::validate_unsigned(source, &call), InvalidTransaction::Custom(ValidityError::SignerHasNoClaim.into()).into(), ); let s = sig::(&dave(), &1u64.encode(), StatementKind::Saft.to_text()); - let call = ClaimsCall::claim_attest(1, s, StatementKind::Regular.to_text().to_vec()); + let call = ClaimsCall::claim_attest { + dest: 1, + ethereum_signature: s, + statement: StatementKind::Regular.to_text().to_vec(), + }; assert_eq!( >::validate_unsigned(source, &call), InvalidTransaction::Custom(ValidityError::SignerHasNoClaim.into()).into(), ); let s = sig::(&dave(), &1u64.encode(), StatementKind::Saft.to_text()); - let call = ClaimsCall::claim_attest(1, s, StatementKind::Saft.to_text().to_vec()); + let call = ClaimsCall::claim_attest { + dest: 1, + ethereum_signature: s, + statement: StatementKind::Saft.to_text().to_vec(), + }; assert_eq!( >::validate_unsigned(source, &call), InvalidTransaction::Custom(ValidityError::InvalidStatement.into()).into(), @@ -1414,7 +1443,7 @@ mod benchmarking { super::Pallet::::mint_claim(RawOrigin::Root.into(), eth_address, VALUE.into(), vesting, None)?; assert_eq!(Claims::::get(eth_address), Some(VALUE.into())); let source = sp_runtime::transaction_validity::TransactionSource::External; - let call = Call::::claim(account.clone(), signature.clone()); + let call = Call::::claim { dest: account.clone(), ethereum_signature: signature.clone() }; }: { super::Pallet::::validate_unsigned(source, &call).map_err(|e| -> &'static str { e.into() })?; super::Pallet::::claim(RawOrigin::None.into(), account, signature)?; @@ -1459,7 +1488,7 @@ mod benchmarking { let signature = sig::(&secret_key, &account.encode(), statement.to_text()); super::Pallet::::mint_claim(RawOrigin::Root.into(), eth_address, VALUE.into(), vesting, Some(statement))?; assert_eq!(Claims::::get(eth_address), Some(VALUE.into())); - let call = Call::::claim_attest(account.clone(), signature.clone(), StatementKind::Regular.to_text().to_vec()); + let call = Call::::claim_attest { dest: account.clone(), ethereum_signature: signature.clone(), statement: StatementKind::Regular.to_text().to_vec() }; let source = sp_runtime::transaction_validity::TransactionSource::External; }: { super::Pallet::::validate_unsigned(source, &call).map_err(|e| -> &'static str { e.into() })?; @@ -1489,10 +1518,10 @@ mod benchmarking { Preclaims::::insert(&account, eth_address); assert_eq!(Claims::::get(eth_address), Some(VALUE.into())); - let call = super::Call::attest(StatementKind::Regular.to_text().to_vec()); + let call = super::Call::attest { statement: StatementKind::Regular.to_text().to_vec() }; // We have to copy the validate statement here because of trait issues... :( let validate = |who: &T::AccountId, call: &super::Call| -> DispatchResult { - if let Call::attest(attested_statement) = call { + if let Call::attest{ statement: attested_statement } = call { let signer = Preclaims::::get(who).ok_or("signer has no claim")?; if let Some(s) = Signing::::get(signer) { ensure!(&attested_statement[..] == s.to_text(), "invalid statement"); diff --git a/runtime/common/src/crowdloan.rs b/runtime/common/src/crowdloan.rs index e0dc0d4c8395..115a89fac542 100644 --- a/runtime/common/src/crowdloan.rs +++ b/runtime/common/src/crowdloan.rs @@ -63,6 +63,7 @@ use frame_support::{ pub use pallet::*; use parity_scale_codec::{Decode, Encode}; use primitives::v1::Id as ParaId; +use scale_info::TypeInfo; use sp_runtime::{ traits::{ AccountIdConversion, CheckedAdd, Hash, IdentifyAccount, One, Saturating, Verify, Zero, @@ -71,8 +72,11 @@ use sp_runtime::{ }; use sp_std::vec::Vec; -type CurrencyOf = <::Auctioneer as Auctioneer>::Currency; -type LeasePeriodOf = <::Auctioneer as Auctioneer>::LeasePeriod; +type CurrencyOf = + <::Auctioneer as Auctioneer<::BlockNumber>>::Currency; +type LeasePeriodOf = <::Auctioneer as Auctioneer< + ::BlockNumber, +>>::LeasePeriod; type BalanceOf = as Currency<::AccountId>>::Balance; #[allow(dead_code)] @@ -124,7 +128,7 @@ impl WeightInfo for TestWeightInfo { } } -#[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug)] +#[derive(Encode, Decode, Copy, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] pub enum LastContribution { Never, PreEnding(u32), @@ -133,7 +137,7 @@ pub enum LastContribution { /// Information on a funding effort for a pre-existing parachain. We assume that the parachain ID /// is known as it's used for the key of the storage item for which this is the value (`Funds`). -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] #[codec(dumb_trait_bound)] pub struct FundInfo { /// The owning account who placed the deposit. @@ -202,8 +206,8 @@ pub mod pallet { /// The type representing the auctioning system. type Auctioneer: Auctioneer< + Self::BlockNumber, AccountId = Self::AccountId, - BlockNumber = Self::BlockNumber, LeasePeriod = Self::BlockNumber, >; @@ -242,7 +246,6 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] - #[pallet::metadata(T::AccountId = "AccountId", BalanceOf = "Balance")] pub enum Event { /// Create a new crowdloaning campaign. `[fund_index]` Created(ParaId), @@ -275,7 +278,7 @@ pub mod pallet { FirstPeriodTooFarInFuture, /// Last lease period must be greater than first lease period. LastPeriodBeforeFirstPeriod, - /// The last lease period cannot be more then 3 periods after the first period. + /// The last lease period cannot be more than 3 periods after the first period. LastPeriodTooFarInFuture, /// The campaign ends before the current block number. The end must be in the future. CannotEndInPast, @@ -313,6 +316,8 @@ pub mod pallet { AlreadyInNewRaise, /// No contributions allowed during the VRF delay VrfDelayInProgress, + /// A lease period has not started yet, due to an offset in the starting block. + NoLeasePeriod, } #[pallet::hooks] @@ -365,20 +370,31 @@ pub mod pallet { verifier: Option, ) -> DispatchResult { let depositor = ensure_signed(origin)?; + let now = frame_system::Pallet::::block_number(); ensure!(first_period <= last_period, Error::::LastPeriodBeforeFirstPeriod); let last_period_limit = first_period .checked_add(&((SlotRange::LEASE_PERIODS_PER_SLOT as u32) - 1).into()) .ok_or(Error::::FirstPeriodTooFarInFuture)?; ensure!(last_period <= last_period_limit, Error::::LastPeriodTooFarInFuture); - ensure!(end > >::block_number(), Error::::CannotEndInPast); - let last_possible_win_date = (first_period.saturating_add(One::one())) - .saturating_mul(T::Auctioneer::lease_period()); - ensure!(end <= last_possible_win_date, Error::::EndTooFarInFuture); - ensure!( - first_period >= T::Auctioneer::lease_period_index(), - Error::::FirstPeriodInPast - ); + ensure!(end > now, Error::::CannotEndInPast); + + // Here we check the lease period on the ending block is at most the first block of the + // period after `first_period`. If it would be larger, there is no way we could win an + // active auction, thus it would make no sense to have a crowdloan this long. + let (lease_period_at_end, is_first_block) = + T::Auctioneer::lease_period_index(end).ok_or(Error::::NoLeasePeriod)?; + let adjusted_lease_period_at_end = if is_first_block { + lease_period_at_end.saturating_sub(One::one()) + } else { + lease_period_at_end + }; + ensure!(adjusted_lease_period_at_end <= first_period, Error::::EndTooFarInFuture); + + // Can't start a crowdloan for a lease period that already passed. + if let Some((current_lease_period, _)) = T::Auctioneer::lease_period_index(now) { + ensure!(first_period >= current_lease_period, Error::::FirstPeriodInPast); + } // There should not be an existing fund. ensure!(!Funds::::contains_key(index), Error::::FundNotEnded); @@ -439,7 +455,9 @@ pub mod pallet { ensure!(now < fund.end, Error::::ContributionPeriodOver); // Make sure crowdloan is in a valid lease period - let current_lease_period = T::Auctioneer::lease_period_index(); + let now = frame_system::Pallet::::block_number(); + let (current_lease_period, _) = + T::Auctioneer::lease_period_index(now).ok_or(Error::::NoLeasePeriod)?; ensure!(current_lease_period <= fund.first_period, Error::::ContributionPeriodOver); // Make sure crowdloan has not already won. @@ -751,7 +769,8 @@ impl Pallet { // `fund.end` can represent the end of a failed crowdloan or the beginning of retirement // If the current lease period is past the first period they are trying to bid for, then // it is already too late to win the bid. - let current_lease_period = T::Auctioneer::lease_period_index(); + let (current_lease_period, _) = + T::Auctioneer::lease_period_index(now).ok_or(Error::::NoLeasePeriod)?; ensure!( now >= fund.end || current_lease_period > fund.first_period, Error::::FundNotEnded @@ -931,14 +950,16 @@ mod tests { } pub struct TestAuctioneer; - impl Auctioneer for TestAuctioneer { + impl Auctioneer for TestAuctioneer { type AccountId = u64; - type BlockNumber = BlockNumber; type LeasePeriod = u64; type Currency = Balances; fn new_auction(duration: u64, lease_period_index: u64) -> DispatchResult { - assert!(lease_period_index >= Self::lease_period_index()); + let now = System::block_number(); + let (current_lease_period, _) = + Self::lease_period_index(now).ok_or("no lease period yet")?; + assert!(lease_period_index >= current_lease_period); let ending = System::block_number().saturating_add(duration); AUCTION.with(|p| *p.borrow_mut() = Some((lease_period_index, ending))); @@ -991,12 +1012,17 @@ mod tests { Ok(()) } - fn lease_period_index() -> u64 { - System::block_number() / Self::lease_period() + fn lease_period_index(b: BlockNumber) -> Option<(u64, bool)> { + let (lease_period_length, offset) = Self::lease_period_length(); + let b = b.checked_sub(offset)?; + + let lease_period = b / lease_period_length; + let first_block = (b % lease_period_length).is_zero(); + Some((lease_period, first_block)) } - fn lease_period() -> u64 { - 20 + fn lease_period_length() -> (u64, u64) { + (20, 0) } fn has_won_an_auction(para: ParaId, bidder: &u64) -> bool { @@ -1367,7 +1393,8 @@ mod tests { let para_3 = new_para(); assert_ok!(Crowdloan::create(Origin::signed(1), para_3, 1000, 1, 4, 40, None)); run_to_block(40); - assert_eq!(TestAuctioneer::lease_period_index(), 2); + let now = System::block_number(); + assert_eq!(TestAuctioneer::lease_period_index(now).unwrap().0, 2); assert_noop!( Crowdloan::contribute(Origin::signed(1), para_3, 49, None), Error::::ContributionPeriodOver @@ -1842,7 +1869,11 @@ mod benchmarking { fn create_fund(id: u32, end: T::BlockNumber) -> ParaId { let cap = BalanceOf::::max_value(); - let lease_period_index = T::Auctioneer::lease_period_index(); + let (_, offset) = T::Auctioneer::lease_period_length(); + // Set to the very beginning of lease period index 0. + frame_system::Pallet::::set_block_number(offset); + let now = frame_system::Pallet::::block_number(); + let (lease_period_index, _) = T::Auctioneer::lease_period_index(now).unwrap_or_default(); let first_period = lease_period_index; let last_period = lease_period_index + ((SlotRange::LEASE_PERIODS_PER_SLOT as u32) - 1).into(); @@ -1894,7 +1925,8 @@ mod benchmarking { let cap = BalanceOf::::max_value(); let first_period = 0u32.into(); let last_period = 3u32.into(); - let end = T::Auctioneer::lease_period(); + let (lpl, offset) = T::Auctioneer::lease_period_length(); + let end = lpl + offset; let caller: T::AccountId = whitelisted_caller(); let head_data = T::Registrar::worst_head_data(); @@ -1913,7 +1945,9 @@ mod benchmarking { // Contribute has two arms: PreEnding and Ending, but both are equal complexity. contribute { - let fund_index = create_fund::(1, 100u32.into()); + let (lpl, offset) = T::Auctioneer::lease_period_length(); + let end = lpl + offset; + let fund_index = create_fund::(1, end); let caller: T::AccountId = whitelisted_caller(); let contribution = T::MinContribution::get(); CurrencyOf::::make_free_balance_be(&caller, BalanceOf::::max_value()); @@ -1931,7 +1965,9 @@ mod benchmarking { } withdraw { - let fund_index = create_fund::(1337, 100u32.into()); + let (lpl, offset) = T::Auctioneer::lease_period_length(); + let end = lpl + offset; + let fund_index = create_fund::(1337, end); let caller: T::AccountId = whitelisted_caller(); let contributor = account("contributor", 0, 0); contribute_fund::(&contributor, fund_index); @@ -1942,9 +1978,12 @@ mod benchmarking { } // Worst case: Refund removes `RemoveKeysLimit` keys, and is fully refunded. + #[skip_meta] refund { let k in 0 .. T::RemoveKeysLimit::get(); - let fund_index = create_fund::(1337, 100u32.into()); + let (lpl, offset) = T::Auctioneer::lease_period_length(); + let end = lpl + offset; + let fund_index = create_fund::(1337, end); // Dissolve will remove at most `RemoveKeysLimit` at once. for i in 0 .. k { @@ -1959,7 +1998,9 @@ mod benchmarking { } dissolve { - let fund_index = create_fund::(1337, 100u32.into()); + let (lpl, offset) = T::Auctioneer::lease_period_length(); + let end = lpl + offset; + let fund_index = create_fund::(1337, end); let caller: T::AccountId = whitelisted_caller(); frame_system::Pallet::::set_block_number(T::BlockNumber::max_value()); }: _(RawOrigin::Signed(caller.clone()), fund_index) @@ -1972,7 +2013,8 @@ mod benchmarking { let cap = BalanceOf::::max_value(); let first_period = 0u32.into(); let last_period = 3u32.into(); - let end = T::Auctioneer::lease_period(); + let (lpl, offset) = T::Auctioneer::lease_period_length(); + let end = lpl + offset; let caller: T::AccountId = whitelisted_caller(); let head_data = T::Registrar::worst_head_data(); @@ -1996,7 +2038,9 @@ mod benchmarking { } add_memo { - let fund_index = create_fund::(1, 100u32.into()); + let (lpl, offset) = T::Auctioneer::lease_period_length(); + let end = lpl + offset; + let fund_index = create_fund::(1, end); let caller: T::AccountId = whitelisted_caller(); contribute_fund::(&caller, fund_index); let worst_memo = vec![42; T::MaxMemoLength::get().into()]; @@ -2010,7 +2054,9 @@ mod benchmarking { } poke { - let fund_index = create_fund::(1, 100u32.into()); + let (lpl, offset) = T::Auctioneer::lease_period_length(); + let end = lpl + offset; + let fund_index = create_fund::(1, end); let caller: T::AccountId = whitelisted_caller(); contribute_fund::(&caller, fund_index); NewRaise::::kill(); @@ -2027,7 +2073,8 @@ mod benchmarking { on_initialize { // We test the complexity over different number of new raise let n in 2 .. 100; - let end_block: T::BlockNumber = 100u32.into(); + let (lpl, offset) = T::Auctioneer::lease_period_length(); + let end_block = lpl + offset - 1u32.into(); let pubkey = crypto::create_ed25519_pubkey(b"//verifier".to_vec()); @@ -2042,7 +2089,8 @@ mod benchmarking { Crowdloan::::contribute(RawOrigin::Signed(contributor).into(), fund_index, contribution, Some(sig))?; } - let lease_period_index = T::Auctioneer::lease_period_index(); + let now = frame_system::Pallet::::block_number(); + let (lease_period_index, _) = T::Auctioneer::lease_period_index(now).unwrap_or_default(); let duration = end_block .checked_sub(&frame_system::Pallet::::block_number()) .ok_or("duration of auction less than zero")?; @@ -2061,7 +2109,7 @@ mod benchmarking { impl_benchmark_test_suite!( Crowdloan, - crate::integration_tests::new_test_ext(), + crate::integration_tests::new_test_ext_with_offset(10), crate::integration_tests::Test, ); } diff --git a/runtime/common/src/elections.rs b/runtime/common/src/elections.rs index b85d8013f4f4..03989a64b439 100644 --- a/runtime/common/src/elections.rs +++ b/runtime/common/src/elections.rs @@ -17,11 +17,13 @@ //! Code for elections. use super::{BlockExecutionWeight, BlockLength, BlockWeights}; +use frame_election_provider_support::{SortedListProvider, VoteWeight}; use frame_support::{ parameter_types, weights::{DispatchClass, Weight}, }; use sp_runtime::Perbill; +use sp_std::{boxed::Box, convert::From, marker::PhantomData}; parameter_types! { /// A limit for off-chain phragmen unsigned solution submission. @@ -43,15 +45,106 @@ parameter_types! { .get(DispatchClass::Normal); } -/// The numbers configured here should always be more than the the maximum limits of staking pallet -/// to ensure election snapshot will not run out of memory. +/// The numbers configured here could always be more than the the maximum limits of staking pallet +/// to ensure election snapshot will not run out of memory. For now, we set them to smaller values +/// since the staking is bounded and the weight pipeline takes hours for this single pallet. pub struct BenchmarkConfig; impl pallet_election_provider_multi_phase::BenchmarkingConfig for BenchmarkConfig { - const VOTERS: [u32; 2] = [5_000, 10_000]; - const TARGETS: [u32; 2] = [1_000, 2_000]; - const ACTIVE_VOTERS: [u32; 2] = [1000, 4_000]; - const DESIRED_TARGETS: [u32; 2] = [400, 800]; - const SNAPSHOT_MAXIMUM_VOTERS: u32 = 25_000; - const MINER_MAXIMUM_VOTERS: u32 = 15_000; - const MAXIMUM_TARGETS: u32 = 2000; + const VOTERS: [u32; 2] = [1000, 2000]; + const TARGETS: [u32; 2] = [500, 1000]; + const ACTIVE_VOTERS: [u32; 2] = [500, 800]; + const DESIRED_TARGETS: [u32; 2] = [200, 400]; + const SNAPSHOT_MAXIMUM_VOTERS: u32 = 1000; + const MINER_MAXIMUM_VOTERS: u32 = 1000; + const MAXIMUM_TARGETS: u32 = 300; +} + +/// The accuracy type used for genesis election provider; +pub type OnOnChainAccuracy = sp_runtime::Perbill; + +/// The election provider of the genesis +pub type GenesisElectionOf = + frame_election_provider_support::onchain::OnChainSequentialPhragmen; + +/// Maximum number of iterations for balancing that will be executed in the embedded miner of +/// pallet-election-provider-multi-phase. +pub const MINER_MAX_ITERATIONS: u32 = 10; + +/// A source of random balance for the NPoS Solver, which is meant to be run by the offchain worker +/// election miner. +pub struct OffchainRandomBalancing; +impl frame_support::pallet_prelude::Get> + for OffchainRandomBalancing +{ + fn get() -> Option<(usize, sp_npos_elections::ExtendedBalance)> { + use sp_runtime::{codec::Decode, traits::TrailingZeroInput}; + let iters = match MINER_MAX_ITERATIONS { + 0 => 0, + max @ _ => { + let seed = sp_io::offchain::random_seed(); + let random = ::decode(&mut TrailingZeroInput::new(&seed)) + .expect("input is padded with zeroes; qed") % + max.saturating_add(1); + random as usize + }, + }; + + Some((iters, 0)) + } +} + +/// Implementation of `frame_election_provider_support::SortedListProvider` that updates the +/// bags-list but uses [`pallet_staking::Nominators`] for `iter`. This is meant to be a transitionary +/// implementation for runtimes to "test" out the bags-list by keeping it up to date, but not yet +/// using it for snapshot generation. In contrast, a "complete" implementation would use bags-list +/// for `iter`. +pub struct UseNominatorsAndUpdateBagsList(PhantomData); +impl SortedListProvider + for UseNominatorsAndUpdateBagsList +{ + type Error = pallet_bags_list::Error; + + fn iter() -> Box> { + Box::new(pallet_staking::Nominators::::iter().map(|(n, _)| n)) + } + + fn count() -> u32 { + pallet_bags_list::Pallet::::count() + } + + fn contains(id: &T::AccountId) -> bool { + pallet_bags_list::Pallet::::contains(id) + } + + fn on_insert(id: T::AccountId, weight: VoteWeight) -> Result<(), Self::Error> { + pallet_bags_list::Pallet::::on_insert(id, weight) + } + + fn on_update(id: &T::AccountId, new_weight: VoteWeight) { + pallet_bags_list::Pallet::::on_update(id, new_weight); + } + + fn on_remove(id: &T::AccountId) { + pallet_bags_list::Pallet::::on_remove(id); + } + + fn regenerate( + all: impl IntoIterator, + weight_of: Box VoteWeight>, + ) -> u32 { + pallet_bags_list::Pallet::::regenerate(all, weight_of) + } + + fn sanity_check() -> Result<(), &'static str> { + pallet_bags_list::Pallet::::sanity_check() + } + + fn clear(count: Option) -> u32 { + pallet_bags_list::Pallet::::clear(count) + } + + #[cfg(feature = "runtime-benchmarks")] + fn weight_update_worst_case(who: &T::AccountId, is_increase: bool) -> VoteWeight { + pallet_bags_list::Pallet::::weight_update_worst_case(who, is_increase) + } } diff --git a/runtime/common/src/integration_tests.rs b/runtime/common/src/integration_tests.rs index 50a1e9efaaac..f8f84b5f1fbc 100644 --- a/runtime/common/src/integration_tests.rs +++ b/runtime/common/src/integration_tests.rs @@ -108,6 +108,7 @@ parameter_types! { pub const EpochDuration: u64 = 10; pub const ExpectedBlockTime: Moment = 6_000; pub const ReportLongevity: u64 = 10; + pub const MaxAuthorities: u32 = 100_000; } impl pallet_babe::Config for Test { @@ -126,6 +127,7 @@ impl pallet_babe::Config for Test { )>>::IdentificationTuple; type HandleEquivocation = (); type WeightInfo = (); + type MaxAuthorities = MaxAuthorities; } parameter_types! { @@ -156,13 +158,16 @@ impl pallet_balances::Config for Test { type ReserveIdentifier = [u8; 8]; } -impl configuration::Config for Test {} +impl configuration::Config for Test { + type WeightInfo = configuration::weights::WeightInfo; +} impl shared::Config for Test {} impl paras::Config for Test { type Origin = Origin; type Event = Event; + type WeightInfo = paras::weights::WeightInfo; } parameter_types! { @@ -198,6 +203,7 @@ impl auctions::Config for Test { parameter_types! { pub const LeasePeriod: BlockNumber = 100; + pub static LeaseOffset: BlockNumber = 0; } impl slots::Config for Test { @@ -205,6 +211,7 @@ impl slots::Config for Test { type Currency = Balances; type Registrar = Registrar; type LeasePeriod = LeasePeriod; + type LeaseOffset = LeaseOffset; type WeightInfo = crate::slots::TestWeightInfo; } @@ -249,6 +256,11 @@ pub fn new_test_ext() -> TestExternalities { ext } +pub fn new_test_ext_with_offset(n: BlockNumber) -> TestExternalities { + LeaseOffset::set(n); + new_test_ext() +} + const BLOCKS_PER_SESSION: u32 = 10; fn maybe_new_session(n: u32) { @@ -293,171 +305,176 @@ fn last_event() -> Event { System::events().pop().expect("Event expected").event } +// Runs an end to end test of the auction, crowdloan, slots, and onboarding process over varying +// lease period offsets. #[test] fn basic_end_to_end_works() { - new_test_ext().execute_with(|| { - let para_1 = LOWEST_PUBLIC_ID; - let para_2 = LOWEST_PUBLIC_ID + 1; - assert!(System::block_number().is_one()); - // User 1 and 2 will own parachains - Balances::make_free_balance_be(&1, 1_000_000_000); - Balances::make_free_balance_be(&2, 1_000_000_000); - // First register 2 parathreads - let genesis_head = Registrar::worst_head_data(); - let validation_code = Registrar::worst_validation_code(); - assert_ok!(Registrar::reserve(Origin::signed(1))); - assert_ok!(Registrar::register( - Origin::signed(1), - ParaId::from(para_1), - genesis_head.clone(), - validation_code.clone(), - )); - assert_ok!(Registrar::reserve(Origin::signed(2))); - assert_ok!(Registrar::register( - Origin::signed(2), - ParaId::from(2001), - genesis_head, - validation_code, - )); - - // Paras should be onboarding - assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Onboarding)); - assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Onboarding)); - - // Start a new auction in the future - let duration = 99u32; - let lease_period_index_start = 4u32; - assert_ok!(Auctions::new_auction(Origin::root(), duration, lease_period_index_start)); - - // 2 sessions later they are parathreads - run_to_session(2); - assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parathread)); - assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parathread)); + for offset in [0u32, 50, 100, 200].iter() { + LeaseOffset::set(*offset); + new_test_ext().execute_with(|| { + let para_1 = LOWEST_PUBLIC_ID; + let para_2 = LOWEST_PUBLIC_ID + 1; + assert!(System::block_number().is_one()); + // User 1 and 2 will own parachains + Balances::make_free_balance_be(&1, 1_000_000_000); + Balances::make_free_balance_be(&2, 1_000_000_000); + // First register 2 parathreads + let genesis_head = Registrar::worst_head_data(); + let validation_code = Registrar::worst_validation_code(); + assert_ok!(Registrar::reserve(Origin::signed(1))); + assert_ok!(Registrar::register( + Origin::signed(1), + ParaId::from(para_1), + genesis_head.clone(), + validation_code.clone(), + )); + assert_ok!(Registrar::reserve(Origin::signed(2))); + assert_ok!(Registrar::register( + Origin::signed(2), + ParaId::from(2001), + genesis_head, + validation_code, + )); - // Para 1 will bid directly for slot 1, 2 - // Open a crowdloan for Para 2 for slot 3, 4 - assert_ok!(Crowdloan::create( - Origin::signed(2), - ParaId::from(para_2), - 1_000, // Cap - lease_period_index_start + 2, // First Slot - lease_period_index_start + 3, // Last Slot - 200, // Block End - None, - )); - let crowdloan_account = Crowdloan::fund_account_id(ParaId::from(para_2)); + // Paras should be onboarding + assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Onboarding)); + assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Onboarding)); - // Auction ending begins on block 100, so we make a bid before then. - run_to_block(90); + // Start a new auction in the future + let duration = 99u32 + offset; + let lease_period_index_start = 4u32; + assert_ok!(Auctions::new_auction(Origin::root(), duration, lease_period_index_start)); - Balances::make_free_balance_be(&10, 1_000_000_000); - Balances::make_free_balance_be(&20, 1_000_000_000); + // 2 sessions later they are parathreads + run_to_session(2); + assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parathread)); + assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parathread)); - // User 10 will bid directly for parachain 1 - assert_ok!(Auctions::bid( - Origin::signed(10), - ParaId::from(para_1), - 1, // Auction Index - lease_period_index_start + 0, // First Slot - lease_period_index_start + 1, // Last slot - 910, // Amount - )); - - // User 2 will be a contribute to crowdloan for parachain 2 - Balances::make_free_balance_be(&2, 1_000_000_000); - assert_ok!(Crowdloan::contribute(Origin::signed(2), ParaId::from(para_2), 920, None)); - - // Auction ends at block 110 - run_to_block(109); - assert_eq!( - last_event(), - crowdloan::Event::::HandleBidResult(ParaId::from(para_2), Ok(())).into(), - ); - run_to_block(110); - assert_eq!(last_event(), auctions::Event::::AuctionClosed(1).into()); - - // Paras should have won slots - assert_eq!( - slots::Leases::::get(ParaId::from(para_1)), - // -- 1 --- 2 --- 3 --------- 4 ------------ 5 -------- - vec![None, None, None, Some((10, 910)), Some((10, 910))], - ); - assert_eq!( - slots::Leases::::get(ParaId::from(para_2)), - // -- 1 --- 2 --- 3 --- 4 --- 5 ---------------- 6 --------------------------- 7 ---------------- - vec![ - None, - None, - None, - None, + // Para 1 will bid directly for slot 1, 2 + // Open a crowdloan for Para 2 for slot 3, 4 + assert_ok!(Crowdloan::create( + Origin::signed(2), + ParaId::from(para_2), + 1_000, // Cap + lease_period_index_start + 2, // First Slot + lease_period_index_start + 3, // Last Slot + 200 + offset, // Block End None, - Some((crowdloan_account, 920)), - Some((crowdloan_account, 920)) - ], - ); - - // Should not be able to contribute to a winning crowdloan - Balances::make_free_balance_be(&3, 1_000_000_000); - assert_noop!( - Crowdloan::contribute(Origin::signed(3), ParaId::from(2001), 10, None), - CrowdloanError::::BidOrLeaseActive - ); - - // New leases will start on block 400 - let lease_start_block = 400; - run_to_block(lease_start_block); - - // First slot, Para 1 should be transitioning to Parachain - assert_eq!( - Paras::lifecycle(ParaId::from(para_1)), - Some(ParaLifecycle::UpgradingParathread) - ); - assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parathread)); - - // Two sessions later, it has upgraded - run_to_block(lease_start_block + 20); - assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parachain)); - assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parathread)); - - // Second slot nothing happens :) - run_to_block(lease_start_block + 100); - assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parachain)); - assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parathread)); - - // Third slot, Para 2 should be upgrading, and Para 1 is downgrading - run_to_block(lease_start_block + 200); - assert_eq!( - Paras::lifecycle(ParaId::from(para_1)), - Some(ParaLifecycle::DowngradingParachain) - ); - assert_eq!( - Paras::lifecycle(ParaId::from(para_2)), - Some(ParaLifecycle::UpgradingParathread) - ); + )); + let crowdloan_account = Crowdloan::fund_account_id(ParaId::from(para_2)); - // Two sessions later, they have transitioned - run_to_block(lease_start_block + 220); - assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parathread)); - assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parachain)); + // Auction ending begins on block 100 + offset, so we make a bid before then. + run_to_block(90 + offset); - // Fourth slot nothing happens :) - run_to_block(lease_start_block + 300); - assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parathread)); - assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parachain)); + Balances::make_free_balance_be(&10, 1_000_000_000); + Balances::make_free_balance_be(&20, 1_000_000_000); - // Fifth slot, Para 2 is downgrading - run_to_block(lease_start_block + 400); - assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parathread)); - assert_eq!( - Paras::lifecycle(ParaId::from(para_2)), - Some(ParaLifecycle::DowngradingParachain) - ); + // User 10 will bid directly for parachain 1 + assert_ok!(Auctions::bid( + Origin::signed(10), + ParaId::from(para_1), + 1, // Auction Index + lease_period_index_start + 0, // First Slot + lease_period_index_start + 1, // Last slot + 910, // Amount + )); - // Two sessions later, Para 2 is downgraded - run_to_block(lease_start_block + 420); - assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parathread)); - assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parathread)); - }); + // User 2 will be a contribute to crowdloan for parachain 2 + Balances::make_free_balance_be(&2, 1_000_000_000); + assert_ok!(Crowdloan::contribute(Origin::signed(2), ParaId::from(para_2), 920, None)); + + // Auction ends at block 110 + offset + run_to_block(109 + offset); + assert_eq!( + last_event(), + crowdloan::Event::::HandleBidResult(ParaId::from(para_2), Ok(())).into(), + ); + run_to_block(110 + offset); + assert_eq!(last_event(), auctions::Event::::AuctionClosed(1).into()); + + // Paras should have won slots + assert_eq!( + slots::Leases::::get(ParaId::from(para_1)), + // -- 1 --- 2 --- 3 --------- 4 ------------ 5 -------- + vec![None, None, None, Some((10, 910)), Some((10, 910))], + ); + assert_eq!( + slots::Leases::::get(ParaId::from(para_2)), + // -- 1 --- 2 --- 3 --- 4 --- 5 ---------------- 6 --------------------------- 7 ---------------- + vec![ + None, + None, + None, + None, + None, + Some((crowdloan_account, 920)), + Some((crowdloan_account, 920)) + ], + ); + + // Should not be able to contribute to a winning crowdloan + Balances::make_free_balance_be(&3, 1_000_000_000); + assert_noop!( + Crowdloan::contribute(Origin::signed(3), ParaId::from(2001), 10, None), + CrowdloanError::::BidOrLeaseActive + ); + + // New leases will start on block 400 + let lease_start_block = 400 + offset; + run_to_block(lease_start_block); + + // First slot, Para 1 should be transitioning to Parachain + assert_eq!( + Paras::lifecycle(ParaId::from(para_1)), + Some(ParaLifecycle::UpgradingParathread) + ); + assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parathread)); + + // Two sessions later, it has upgraded + run_to_block(lease_start_block + 20); + assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parachain)); + assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parathread)); + + // Second slot nothing happens :) + run_to_block(lease_start_block + 100); + assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parachain)); + assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parathread)); + + // Third slot, Para 2 should be upgrading, and Para 1 is downgrading + run_to_block(lease_start_block + 200); + assert_eq!( + Paras::lifecycle(ParaId::from(para_1)), + Some(ParaLifecycle::DowngradingParachain) + ); + assert_eq!( + Paras::lifecycle(ParaId::from(para_2)), + Some(ParaLifecycle::UpgradingParathread) + ); + + // Two sessions later, they have transitioned + run_to_block(lease_start_block + 220); + assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parathread)); + assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parachain)); + + // Fourth slot nothing happens :) + run_to_block(lease_start_block + 300); + assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parathread)); + assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parachain)); + + // Fifth slot, Para 2 is downgrading + run_to_block(lease_start_block + 400); + assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parathread)); + assert_eq!( + Paras::lifecycle(ParaId::from(para_2)), + Some(ParaLifecycle::DowngradingParachain) + ); + + // Two sessions later, Para 2 is downgraded + run_to_block(lease_start_block + 420); + assert_eq!(Paras::lifecycle(ParaId::from(para_1)), Some(ParaLifecycle::Parathread)); + assert_eq!(Paras::lifecycle(ParaId::from(para_2)), Some(ParaLifecycle::Parathread)); + }); + } } #[test] diff --git a/runtime/common/src/paras_registrar.rs b/runtime/common/src/paras_registrar.rs index 3c9e80993205..448bc5092403 100644 --- a/runtime/common/src/paras_registrar.rs +++ b/runtime/common/src/paras_registrar.rs @@ -35,12 +35,13 @@ use sp_std::{prelude::*, result}; use crate::traits::{OnSwap, Registrar}; pub use pallet::*; use parity_scale_codec::{Decode, Encode}; +use scale_info::TypeInfo; use sp_runtime::{ traits::{CheckedSub, Saturating}, RuntimeDebug, }; -#[derive(Encode, Decode, Clone, PartialEq, Eq, Default, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, Eq, Default, RuntimeDebug, TypeInfo)] pub struct ParaInfo { /// The account that has placed a deposit for registering this para. pub(crate) manager: Account, @@ -124,7 +125,6 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] - #[pallet::metadata(T::AccountId = "AccountId")] pub enum Event { Registered(ParaId, T::AccountId), Deregistered(ParaId), @@ -213,7 +213,7 @@ pub mod pallet { /// /// ## Events /// The `Registered` event is emitted in case of success. - #[pallet::weight(T::WeightInfo::register())] + #[pallet::weight(::WeightInfo::register())] pub fn register( origin: OriginFor, id: ParaId, @@ -231,7 +231,7 @@ pub mod pallet { /// /// The deposit taken can be specified for this registration. Any `ParaId` /// can be registered, including sub-1000 IDs which are System Parachains. - #[pallet::weight(T::WeightInfo::force_register())] + #[pallet::weight(::WeightInfo::force_register())] pub fn force_register( origin: OriginFor, who: T::AccountId, @@ -247,7 +247,7 @@ pub mod pallet { /// Deregister a Para Id, freeing all data and returning any deposit. /// /// The caller must be Root, the `para` owner, or the `para` itself. The para must be a parathread. - #[pallet::weight(T::WeightInfo::deregister())] + #[pallet::weight(::WeightInfo::deregister())] pub fn deregister(origin: OriginFor, id: ParaId) -> DispatchResult { Self::ensure_root_para_or_owner(origin, id)?; Self::do_deregister(id) @@ -264,7 +264,7 @@ pub mod pallet { /// `ParaId` to be a long-term identifier of a notional "parachain". However, their /// scheduling info (i.e. whether they're a parathread or parachain), auction information /// and the auction deposit are switched. - #[pallet::weight(T::WeightInfo::swap())] + #[pallet::weight(::WeightInfo::swap())] pub fn swap(origin: OriginFor, id: ParaId, other: ParaId) -> DispatchResult { Self::ensure_root_para_or_owner(origin, id)?; @@ -325,7 +325,7 @@ pub mod pallet { /// /// ## Events /// The `Reserved` event is emitted in case of success, which provides the ID reserved for use. - #[pallet::weight(T::WeightInfo::reserve())] + #[pallet::weight(::WeightInfo::reserve())] pub fn reserve(origin: OriginFor) -> DispatchResult { let who = ensure_signed(origin)?; let id = NextFreeParaId::::get().max(LOWEST_PUBLIC_ID); @@ -657,9 +657,12 @@ mod tests { impl paras::Config for Test { type Origin = Origin; type Event = Event; + type WeightInfo = paras::weights::WeightInfo; } - impl configuration::Config for Test {} + impl configuration::Config for Test { + type WeightInfo = configuration::weights::WeightInfo; + } parameter_types! { pub const ParaDeposit: Balance = 10; diff --git a/runtime/common/src/purchase.rs b/runtime/common/src/purchase.rs index f2b2a7a299b8..42a545730c94 100644 --- a/runtime/common/src/purchase.rs +++ b/runtime/common/src/purchase.rs @@ -23,6 +23,7 @@ use frame_support::{ use frame_system::pallet_prelude::*; pub use pallet::*; use parity_scale_codec::{Decode, Encode}; +use scale_info::TypeInfo; use sp_core::sr25519; use sp_runtime::{ traits::{CheckedAdd, Saturating, Verify, Zero}, @@ -33,8 +34,8 @@ use sp_std::prelude::*; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; -/// The kind of a statement an account needs to make for a claim to be valid. -#[derive(Encode, Decode, Clone, Copy, Eq, PartialEq, RuntimeDebug)] +/// The kind of statement an account needs to make for a claim to be valid. +#[derive(Encode, Decode, Clone, Copy, Eq, PartialEq, RuntimeDebug, TypeInfo)] pub enum AccountValidity { /// Account is not valid. Invalid, @@ -70,7 +71,7 @@ impl AccountValidity { } /// All information about an account regarding the purchase of DOTs. -#[derive(Encode, Decode, Default, Clone, Eq, PartialEq, RuntimeDebug)] +#[derive(Encode, Decode, Default, Clone, Eq, PartialEq, RuntimeDebug, TypeInfo)] pub struct AccountStatus { /// The current validity status of the user. Will denote if the user has passed KYC, /// how much they are able to purchase, and when their purchase process has completed. @@ -129,11 +130,6 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] - #[pallet::metadata( - T::AccountId = "AccountId", - T::BlockNumber = "BlockNumber", - BalanceOf = "Balance", - )] pub enum Event { /// A [new] account was created. AccountCreated(T::AccountId), @@ -1071,7 +1067,7 @@ mod tests { ); // Vesting lock is removed in whole on block 101 (100 blocks after block 1) System::set_block_number(100); - let vest_call = Call::Vesting(pallet_vesting::Call::::vest()); + let vest_call = Call::Vesting(pallet_vesting::Call::::vest {}); assert_ok!(vest_call.clone().dispatch(Origin::signed(alice()))); assert_ok!(vest_call.clone().dispatch(Origin::signed(bob()))); assert_eq!(::VestingSchedule::vesting_balance(&alice()), Some(45)); diff --git a/runtime/common/src/slots.rs b/runtime/common/src/slots.rs index 0dac47c71136..35c520afeaf1 100644 --- a/runtime/common/src/slots.rs +++ b/runtime/common/src/slots.rs @@ -83,6 +83,10 @@ pub mod pallet { #[pallet::constant] type LeasePeriod: Get; + /// The number of blocks to offset each lease period by. + #[pallet::constant] + type LeaseOffset: Get; + /// Weight Information for the Extrinsics in the Pallet type WeightInfo: WeightInfo; } @@ -110,11 +114,6 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] - #[pallet::metadata( - T::AccountId = "AccountId", - LeasePeriodOf = "LeasePeriod", - BalanceOf = "Balance", - )] pub enum Event { /// A new `[lease_period]` is beginning. NewLeasePeriod(LeasePeriodOf), @@ -143,14 +142,15 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(n: T::BlockNumber) -> Weight { - // If we're beginning a new lease period then handle that. - let lease_period = T::LeasePeriod::get(); - if (n % lease_period).is_zero() { - let lease_period_index = n / lease_period; - Self::manage_lease_period_start(lease_period_index) - } else { - 0 + if let Some((lease_period, first_block)) = Self::lease_period_index(n) { + // If we're beginning a new lease period then handle that. + if first_block { + return Self::manage_lease_period_start(lease_period) + } } + + // We didn't return early above, so we didn't do anything. + 0 } } @@ -326,7 +326,7 @@ impl crate::traits::OnSwap for Pallet { } } -impl Leaser for Pallet { +impl Leaser for Pallet { type AccountId = T::AccountId; type LeasePeriod = T::BlockNumber; type Currency = T::Currency; @@ -338,7 +338,9 @@ impl Leaser for Pallet { period_begin: Self::LeasePeriod, period_count: Self::LeasePeriod, ) -> Result<(), LeaseError> { - let current_lease_period = Self::lease_period_index(); + let now = frame_system::Pallet::::block_number(); + let (current_lease_period, _) = + Self::lease_period_index(now).ok_or(LeaseError::NoLeasePeriod)?; // Finally, we update the deposit held so it is `amount` for the new lease period // indices that were won in the auction. let offset = period_begin @@ -432,12 +434,18 @@ impl Leaser for Pallet { .unwrap_or_else(Zero::zero) } - fn lease_period() -> Self::LeasePeriod { - T::LeasePeriod::get() + #[cfg(any(feature = "runtime-benchmarks", test))] + fn lease_period_length() -> (T::BlockNumber, T::BlockNumber) { + (T::LeasePeriod::get(), T::LeaseOffset::get()) } - fn lease_period_index() -> Self::LeasePeriod { - >::block_number() / T::LeasePeriod::get() + fn lease_period_index(b: T::BlockNumber) -> Option<(Self::LeasePeriod, bool)> { + // Note that blocks before `LeaseOffset` do not count as any lease period. + let offset_block_now = b.checked_sub(&T::LeaseOffset::get())?; + let lease_period = offset_block_now / T::LeasePeriod::get(); + let first_block = (offset_block_now % T::LeasePeriod::get()).is_zero(); + + Some((lease_period, first_block)) } fn already_leased( @@ -445,7 +453,11 @@ impl Leaser for Pallet { first_period: Self::LeasePeriod, last_period: Self::LeasePeriod, ) -> bool { - let current_lease_period = Self::lease_period_index(); + let now = frame_system::Pallet::::block_number(); + let (current_lease_period, _) = match Self::lease_period_index(now) { + Some(clp) => clp, + None => return true, + }; // Can't look in the past, so we pick whichever is the biggest. let start_period = first_period.max(current_lease_period); @@ -550,6 +562,7 @@ mod tests { parameter_types! { pub const LeasePeriod: BlockNumber = 10; + pub static LeaseOffset: BlockNumber = 0; pub const ParaDeposit: u64 = 1; } @@ -558,6 +571,7 @@ mod tests { type Currency = Balances; type Registrar = TestRegistrar; type LeasePeriod = LeasePeriod; + type LeaseOffset = LeaseOffset; type WeightInfo = crate::slots::TestWeightInfo; } @@ -589,12 +603,14 @@ mod tests { fn basic_setup_works() { new_test_ext().execute_with(|| { run_to_block(1); - assert_eq!(Slots::lease_period(), 10); - assert_eq!(Slots::lease_period_index(), 0); + assert_eq!(Slots::lease_period_length(), (10, 0)); + let now = System::block_number(); + assert_eq!(Slots::lease_period_index(now).unwrap().0, 0); assert_eq!(Slots::deposit_held(1.into(), &1), 0); run_to_block(10); - assert_eq!(Slots::lease_period_index(), 1); + let now = System::block_number(); + assert_eq!(Slots::lease_period_index(now).unwrap().0, 1); }); } @@ -855,7 +871,8 @@ mod tests { )); run_to_block(20); - assert_eq!(Slots::lease_period_index(), 2); + let now = System::block_number(); + assert_eq!(Slots::lease_period_index(now).unwrap().0, 2); // Can't lease from the past assert!(Slots::lease_out(1.into(), &1, 1, 1, 1).is_err()); // Lease in the current period triggers onboarding @@ -918,6 +935,37 @@ mod tests { assert_eq!(TestRegistrar::::operations(), vec![(2.into(), 1, true),]); }); } + + #[test] + fn lease_period_offset_works() { + new_test_ext().execute_with(|| { + let (lpl, offset) = Slots::lease_period_length(); + assert_eq!(offset, 0); + assert_eq!(Slots::lease_period_index(0), Some((0, true))); + assert_eq!(Slots::lease_period_index(1), Some((0, false))); + assert_eq!(Slots::lease_period_index(lpl - 1), Some((0, false))); + assert_eq!(Slots::lease_period_index(lpl), Some((1, true))); + assert_eq!(Slots::lease_period_index(lpl + 1), Some((1, false))); + assert_eq!(Slots::lease_period_index(2 * lpl - 1), Some((1, false))); + assert_eq!(Slots::lease_period_index(2 * lpl), Some((2, true))); + assert_eq!(Slots::lease_period_index(2 * lpl + 1), Some((2, false))); + + // Lease period is 10, and we add an offset of 5. + LeaseOffset::set(5); + let (lpl, offset) = Slots::lease_period_length(); + assert_eq!(offset, 5); + assert_eq!(Slots::lease_period_index(0), None); + assert_eq!(Slots::lease_period_index(1), None); + assert_eq!(Slots::lease_period_index(offset), Some((0, true))); + assert_eq!(Slots::lease_period_index(lpl), Some((0, false))); + assert_eq!(Slots::lease_period_index(lpl - 1 + offset), Some((0, false))); + assert_eq!(Slots::lease_period_index(lpl + offset), Some((1, true))); + assert_eq!(Slots::lease_period_index(lpl + offset + 1), Some((1, false))); + assert_eq!(Slots::lease_period_index(2 * lpl - 1 + offset), Some((1, false))); + assert_eq!(Slots::lease_period_index(2 * lpl + offset), Some((2, true))); + assert_eq!(Slots::lease_period_index(2 * lpl + offset + 1), Some((2, false))); + }); + } } #[cfg(feature = "runtime-benchmarks")] diff --git a/runtime/common/src/traits.rs b/runtime/common/src/traits.rs index eb5e0eda517b..98abe62c2a11 100644 --- a/runtime/common/src/traits.rs +++ b/runtime/common/src/traits.rs @@ -94,10 +94,12 @@ pub enum LeaseError { AlreadyLeased, /// The period to be leased has already ended. AlreadyEnded, + /// A lease period has not started yet, due to an offset in the starting block. + NoLeasePeriod, } /// Lease manager. Used by the auction module to handle parachain slot leases. -pub trait Leaser { +pub trait Leaser { /// An account identifier for a leaser. type AccountId; @@ -127,17 +129,22 @@ pub trait Leaser { ) -> Result<(), LeaseError>; /// Return the amount of balance currently held in reserve on `leaser`'s account for leasing `para`. This won't - /// go down outside of a lease period. + /// go down outside a lease period. fn deposit_held( para: ParaId, leaser: &Self::AccountId, ) -> >::Balance; - /// The lease period. This is constant, but can't be a `const` due to it being a runtime configurable quantity. - fn lease_period() -> Self::LeasePeriod; + /// The length of a lease period, and any offset which may be introduced. + /// This is only used in benchmarking to automate certain calls. + #[cfg(any(feature = "runtime-benchmarks", test))] + fn lease_period_length() -> (BlockNumber, BlockNumber); - /// Returns the current lease period. - fn lease_period_index() -> Self::LeasePeriod; + /// Returns the lease period at `block`, and if this is the first block of a new lease period. + /// + /// Will return `None` if the first lease period has not started yet, for example when an offset + /// is placed. + fn lease_period_index(block: BlockNumber) -> Option<(Self::LeasePeriod, bool)>; /// Returns true if the parachain already has a lease in any of lease periods in the inclusive /// range `[first_period, last_period]`, intersected with the unbounded range [`current_lease_period`..] . @@ -189,13 +196,10 @@ impl AuctionStatus { } } -pub trait Auctioneer { +pub trait Auctioneer { /// An account identifier for a leaser. type AccountId; - /// The measurement type for counting blocks. - type BlockNumber; - /// The measurement type for counting lease periods (generally the same as `BlockNumber`). type LeasePeriod; @@ -207,13 +211,10 @@ pub trait Auctioneer { /// This can only happen when there isn't already an auction in progress. Accepts the `duration` /// of this auction and the `lease_period_index` of the initial lease period of the four that /// are to be auctioned. - fn new_auction( - duration: Self::BlockNumber, - lease_period_index: Self::LeasePeriod, - ) -> DispatchResult; + fn new_auction(duration: BlockNumber, lease_period_index: Self::LeasePeriod) -> DispatchResult; /// Given the current block number, return the current auction status. - fn auction_status(now: Self::BlockNumber) -> AuctionStatus; + fn auction_status(now: BlockNumber) -> AuctionStatus; /// Place a bid in the current auction. /// @@ -234,11 +235,16 @@ pub trait Auctioneer { amount: >::Balance, ) -> DispatchResult; - /// Returns the current lease period. - fn lease_period_index() -> Self::LeasePeriod; + /// The length of a lease period, and any offset which may be introduced. + /// This is only used in benchmarking to automate certain calls. + #[cfg(any(feature = "runtime-benchmarks", test))] + fn lease_period_length() -> (BlockNumber, BlockNumber); - /// Returns the length of a lease period. - fn lease_period() -> Self::LeasePeriod; + /// Returns the lease period at `block`, and if this is the first block of a new lease period. + /// + /// Will return `None` if the first lease period has not started yet, for example when an offset + /// is placed. + fn lease_period_index(block: BlockNumber) -> Option<(Self::LeasePeriod, bool)>; /// Check if the para and user combination has won an auction in the past. fn has_won_an_auction(para: ParaId, bidder: &Self::AccountId) -> bool; diff --git a/runtime/common/src/xcm_sender.rs b/runtime/common/src/xcm_sender.rs index af1f783cfa9a..2d75edfd4571 100644 --- a/runtime/common/src/xcm_sender.rs +++ b/runtime/common/src/xcm_sender.rs @@ -27,7 +27,8 @@ pub struct ChildParachainRouter(PhantomData<(T, W)>); impl SendXcm for ChildParachainRouter { - fn send_xcm(dest: MultiLocation, msg: Xcm<()>) -> SendResult { + fn send_xcm(dest: impl Into, msg: Xcm<()>) -> SendResult { + let dest = dest.into(); match dest { MultiLocation { parents: 0, interior: X1(Parachain(id)) } => { // Downward message passing. diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index e1099be3d795..e431b1425dfe 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -49,7 +49,10 @@ use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; use beefy_primitives::crypto::AuthorityId as BeefyId; use frame_support::{ construct_runtime, parameter_types, - traits::{Contains, Everything, InstanceFilter, KeyOwnerProofSystem, LockIdentifier, Nothing}, + traits::{ + Contains, Everything, InstanceFilter, KeyOwnerProofSystem, LockIdentifier, Nothing, + OnRuntimeUpgrade, + }, weights::Weight, PalletId, RuntimeDebug, }; @@ -100,6 +103,9 @@ use constants::{currency::*, fee::*, time::*}; // Weights used in the runtime. mod weights; +// Voter bag threshold definitions. +mod voter_bags; + #[cfg(test)] mod tests; @@ -112,13 +118,13 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 9100, + spec_version: 9110, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] apis: version::create_apis_vec![[]], - transaction_version: 5, + transaction_version: 7, }; /// The BABE epoch configuration at genesis. @@ -138,7 +144,7 @@ pub fn native_version() -> NativeVersion { pub struct BaseFilter; impl Contains for BaseFilter { fn contains(c: &Call) -> bool { - !matches!(c, Call::Registrar(paras_registrar::Call::swap(..))) + !matches!(c, Call::Registrar(paras_registrar::Call::swap { .. })) } } @@ -234,6 +240,8 @@ impl pallet_babe::Config for Runtime { pallet_babe::EquivocationHandler; type WeightInfo = (); + + type MaxAuthorities = MaxAuthorities; } parameter_types! { @@ -268,11 +276,15 @@ impl pallet_balances::Config for Runtime { parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; + /// This value increases the priority of `Operational` transactions by adding + /// a "virtual tip" that's equal to the `OperationalFeeMultiplier * final_fee`. + pub const OperationalFeeMultiplier: u8 = 5; } impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = CurrencyAdapter>; type TransactionByteFee = TransactionByteFee; + type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = WeightToFee; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; } @@ -342,14 +354,15 @@ parameter_types! { pub const SignedDepositByte: Balance = deposit(0, 10) / 1024; // Each good submission will get 1/10 KSM as reward pub SignedRewardBase: Balance = UNITS / 10; - // fallback: emergency phase. - pub const Fallback: pallet_election_provider_multi_phase::FallbackStrategy = - pallet_election_provider_multi_phase::FallbackStrategy::Nothing; pub SolutionImprovementThreshold: Perbill = Perbill::from_rational(5u32, 10_000); // miner configs - pub const MinerMaxIterations: u32 = 10; pub OffchainRepeat: BlockNumber = 5; + + /// Whilst `UseNominatorsAndUpdateBagsList` or `UseNominatorsMap` is in use, this can still be a + /// very large value. Once the `BagsList` is in full motion, staking might open its door to many + /// more nominators, and this value should instead be what is a "safe" number (e.g. 22500). + pub const VoterSnapshotPerBlock: u32 = 22_500; } sp_npos_elections::generate_solution_type!( @@ -376,22 +389,37 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type RewardHandler = (); // nothing to do upon rewards type SignedPhase = SignedPhase; type SolutionImprovementThreshold = SolutionImprovementThreshold; - type MinerMaxIterations = MinerMaxIterations; type MinerMaxWeight = OffchainSolutionWeightLimit; // For now use the one from staking. type MinerMaxLength = OffchainSolutionLengthLimit; type OffchainRepeat = OffchainRepeat; type MinerTxPriority = NposSolutionPriority; type DataProvider = Staking; type Solution = NposCompactSolution24; - type OnChainAccuracy = Perbill; - type Fallback = Fallback; + type Fallback = pallet_election_provider_multi_phase::NoFallback; + type Solver = frame_election_provider_support::SequentialPhragmen< + AccountId, + pallet_election_provider_multi_phase::SolutionAccuracyOf, + runtime_common::elections::OffchainRandomBalancing, + >; type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig; type ForceOrigin = EnsureOneOf< AccountId, EnsureRoot, pallet_collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>, >; - type WeightInfo = weights::pallet_election_provider_multi_phase::WeightInfo; + type WeightInfo = weights::pallet_election_provider_multi_phase::WeightInfo; + type VoterSnapshotPerBlock = VoterSnapshotPerBlock; +} + +parameter_types! { + pub const BagThresholds: &'static [u64] = &voter_bags::THRESHOLDS; +} + +impl pallet_bags_list::Config for Runtime { + type Event = Event; + type VoteWeightProvider = Staking; + type WeightInfo = weights::pallet_bags_list::WeightInfo; + type BagThresholds = BagThresholds; } fn era_payout( @@ -473,6 +501,11 @@ type SlashCancelOrigin = EnsureOneOf< pallet_collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>, >; +impl frame_election_provider_support::onchain::Config for Runtime { + type Accuracy = runtime_common::elections::OnOnChainAccuracy; + type DataProvider = Staking; +} + impl pallet_staking::Config for Runtime { const MAX_NOMINATIONS: u32 = ::LIMIT as u32; @@ -480,10 +513,7 @@ impl pallet_staking::Config for Runtime { type UnixTime = Timestamp; type CurrencyToVote = CurrencyToVote; type ElectionProvider = ElectionProviderMultiPhase; - type GenesisElectionProvider = - frame_election_provider_support::onchain::OnChainSequentialPhragmen< - pallet_election_provider_multi_phase::OnChainConfig, - >; + type GenesisElectionProvider = runtime_common::elections::GenesisElectionOf; type RewardRemainder = Treasury; type Event = Event; type Slash = Treasury; @@ -498,6 +528,9 @@ impl pallet_staking::Config for Runtime { type NextNewSession = Session; type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; type OffendingValidatorsThreshold = OffendingValidatorsThreshold; + // Use the nominators map to iter voters, but also perform the bags-list migration and keep + // it up-to-date. + type SortedListProvider = runtime_common::elections::UseNominatorsAndUpdateBagsList; type WeightInfo = weights::pallet_staking::WeightInfo; } @@ -672,6 +705,9 @@ parameter_types! { pub const BountyValueMinimum: Balance = 200 * CENTS; pub const MaxApprovals: u32 = 100; pub const MaxAuthorities: u32 = 100_000; + pub const MaxKeys: u32 = 10_000; + pub const MaxPeerInHeartbeats: u32 = 10_000; + pub const MaxPeerDataEncodingSize: u32 = 1_000; } type ApproveOrigin = EnsureOneOf< @@ -744,6 +780,9 @@ impl pallet_im_online::Config for Runtime { type ReportUnresponsiveness = Offences; type UnsignedPriority = ImOnlineUnsignedPriority; type WeightInfo = weights::pallet_im_online::WeightInfo; + type MaxKeys = MaxKeys; + type MaxPeerInHeartbeats = MaxPeerInHeartbeats; + type MaxPeerDataEncodingSize = MaxPeerDataEncodingSize; } impl pallet_grandpa::Config for Runtime { @@ -767,6 +806,7 @@ impl pallet_grandpa::Config for Runtime { >; type WeightInfo = (); + type MaxAuthorities = MaxAuthorities; } /// Submits transaction with the node's public and signature type. Adheres to the signed extension @@ -965,7 +1005,17 @@ parameter_types! { /// The type used to represent the kinds of proxying allowed. #[derive( - Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug, MaxEncodedLen, + Copy, + Clone, + Eq, + PartialEq, + Ord, + PartialOrd, + Encode, + Decode, + RuntimeDebug, + MaxEncodedLen, + scale_info::TypeInfo, )] pub enum ProxyType { Any, @@ -990,9 +1040,9 @@ impl InstanceFilter for ProxyType { Call::System(..) | Call::Babe(..) | Call::Timestamp(..) | - Call::Indices(pallet_indices::Call::claim(..)) | - Call::Indices(pallet_indices::Call::free(..)) | - Call::Indices(pallet_indices::Call::freeze(..)) | + Call::Indices(pallet_indices::Call::claim {..}) | + Call::Indices(pallet_indices::Call::free {..}) | + Call::Indices(pallet_indices::Call::freeze {..}) | // Specifically omitting Indices `transfer`, `force_transfer` // Specifically omitting the entire Balances pallet Call::Authorship(..) | @@ -1012,24 +1062,24 @@ impl InstanceFilter for ProxyType { Call::Utility(..) | Call::Identity(..) | Call::Society(..) | - Call::Recovery(pallet_recovery::Call::as_recovered(..)) | - Call::Recovery(pallet_recovery::Call::vouch_recovery(..)) | - Call::Recovery(pallet_recovery::Call::claim_recovery(..)) | - Call::Recovery(pallet_recovery::Call::close_recovery(..)) | - Call::Recovery(pallet_recovery::Call::remove_recovery(..)) | - Call::Recovery(pallet_recovery::Call::cancel_recovered(..)) | + Call::Recovery(pallet_recovery::Call::as_recovered {..}) | + Call::Recovery(pallet_recovery::Call::vouch_recovery {..}) | + Call::Recovery(pallet_recovery::Call::claim_recovery {..}) | + Call::Recovery(pallet_recovery::Call::close_recovery {..}) | + Call::Recovery(pallet_recovery::Call::remove_recovery {..}) | + Call::Recovery(pallet_recovery::Call::cancel_recovered {..}) | // Specifically omitting Recovery `create_recovery`, `initiate_recovery` - Call::Vesting(pallet_vesting::Call::vest(..)) | - Call::Vesting(pallet_vesting::Call::vest_other(..)) | + Call::Vesting(pallet_vesting::Call::vest {..}) | + Call::Vesting(pallet_vesting::Call::vest_other {..}) | // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` Call::Scheduler(..) | Call::Proxy(..) | Call::Multisig(..) | Call::Gilt(..) | - Call::Registrar(paras_registrar::Call::register(..)) | - Call::Registrar(paras_registrar::Call::deregister(..)) | + Call::Registrar(paras_registrar::Call::register {..}) | + Call::Registrar(paras_registrar::Call::deregister {..}) | // Specifically omitting Registrar `swap` - Call::Registrar(paras_registrar::Call::reserve(..)) | + Call::Registrar(paras_registrar::Call::reserve {..}) | Call::Crowdloan(..) | Call::Slots(..) | Call::Auctions(..) // Specifically omitting the entire XCM Pallet @@ -1047,10 +1097,10 @@ impl InstanceFilter for ProxyType { }, ProxyType::IdentityJudgement => matches!( c, - Call::Identity(pallet_identity::Call::provide_judgement(..)) | Call::Utility(..) + Call::Identity(pallet_identity::Call::provide_judgement { .. }) | Call::Utility(..) ), ProxyType::CancelProxy => { - matches!(c, Call::Proxy(pallet_proxy::Call::reject_announcement(..))) + matches!(c, Call::Proxy(pallet_proxy::Call::reject_announcement { .. })) }, ProxyType::Auction => matches!( c, @@ -1086,7 +1136,9 @@ impl pallet_proxy::Config for Runtime { impl parachains_origin::Config for Runtime {} -impl parachains_configuration::Config for Runtime {} +impl parachains_configuration::Config for Runtime { + type WeightInfo = weights::runtime_parachains_configuration::WeightInfo; +} impl parachains_shared::Config for Runtime {} @@ -1101,6 +1153,7 @@ impl parachains_inclusion::Config for Runtime { impl parachains_paras::Config for Runtime { type Origin = Origin; type Event = Event; + type WeightInfo = weights::runtime_parachains_paras::WeightInfo; } parameter_types! { @@ -1111,6 +1164,7 @@ impl parachains_ump::Config for Runtime { type Event = Event; type UmpSink = crate::parachains_ump::XcmSink, Runtime>; type FirstMessageFactorPercent = FirstMessageFactorPercent; + type ExecuteOverweightOrigin = EnsureRoot; } impl parachains_dmp::Config for Runtime {} @@ -1128,6 +1182,7 @@ impl parachains_scheduler::Config for Runtime {} impl parachains_initializer::Config for Runtime { type Randomness = pallet_babe::RandomnessFromOneEpochAgo; type ForceOrigin = EnsureRoot; + type WeightInfo = weights::runtime_parachains_initializer::WeightInfo; } parameter_types! { @@ -1154,6 +1209,7 @@ impl slots::Config for Runtime { type Currency = Balances; type Registrar = Registrar; type LeasePeriod = LeasePeriod; + type LeaseOffset = (); type WeightInfo = weights::runtime_common_slots::WeightInfo; } @@ -1444,6 +1500,9 @@ construct_runtime! { // Gilts pallet. Gilt: pallet_gilt::{Pallet, Call, Storage, Event, Config} = 38, + // Provides a semi-sorted list of nominators for staking. + BagsList: pallet_bags_list::{Pallet, Call, Storage, Event} = 39, + // Parachains pallets. Start indices at 50 to leave room. ParachainsOrigin: parachains_origin::{Pallet, Origin} = 50, Configuration: parachains_configuration::{Pallet, Call, Storage, Config} = 51, @@ -1498,11 +1557,186 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPallets, - (), + ( + CouncilStoragePrefixMigration, + TechnicalCommitteeStoragePrefixMigration, + TechnicalMembershipStoragePrefixMigration, + MigrateTipsPalletPrefix, + BountiesPrefixMigration, + StakingBagsListMigrationV8, + ), >; /// The payload being signed in the transactions. pub type SignedPayload = generic::SignedPayload; +const BOUNTIES_OLD_PREFIX: &str = "Treasury"; + +/// Migrate from 'Treasury' to the new prefix 'Bounties' +pub struct BountiesPrefixMigration; + +impl OnRuntimeUpgrade for BountiesPrefixMigration { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + use frame_support::traits::PalletInfo; + let name = ::PalletInfo::name::() + .expect("Bounties is part of runtime, so it has a name; qed"); + pallet_bounties::migrations::v4::migrate::(BOUNTIES_OLD_PREFIX, name) + } + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + use frame_support::traits::PalletInfo; + let name = ::PalletInfo::name::() + .expect("Bounties is part of runtime, so it has a name; qed"); + pallet_bounties::migrations::v4::pre_migration::( + BOUNTIES_OLD_PREFIX, + name, + ); + Ok(()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + use frame_support::traits::PalletInfo; + let name = ::PalletInfo::name::() + .expect("Bounties is part of runtime, so it has a name; qed"); + pallet_bounties::migrations::v4::post_migration::( + BOUNTIES_OLD_PREFIX, + name, + ); + Ok(()) + } +} + +const COUNCIL_OLD_PREFIX: &str = "Instance1Collective"; +/// Migrate from `Instance1Collective` to the new pallet prefix `Council` +pub struct CouncilStoragePrefixMigration; + +impl OnRuntimeUpgrade for CouncilStoragePrefixMigration { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + pallet_collective::migrations::v4::migrate::(COUNCIL_OLD_PREFIX) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + pallet_collective::migrations::v4::pre_migrate::(COUNCIL_OLD_PREFIX); + Ok(()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + pallet_collective::migrations::v4::post_migrate::(COUNCIL_OLD_PREFIX); + Ok(()) + } +} + +const TECHNICAL_COMMITTEE_OLD_PREFIX: &str = "Instance2Collective"; +/// Migrate from `Instance2Collective` to the new pallet prefix `TechnicalCommittee` +pub struct TechnicalCommitteeStoragePrefixMigration; + +impl OnRuntimeUpgrade for TechnicalCommitteeStoragePrefixMigration { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + pallet_collective::migrations::v4::migrate::( + TECHNICAL_COMMITTEE_OLD_PREFIX, + ) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + pallet_collective::migrations::v4::pre_migrate::( + TECHNICAL_COMMITTEE_OLD_PREFIX, + ); + Ok(()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + pallet_collective::migrations::v4::post_migrate::( + TECHNICAL_COMMITTEE_OLD_PREFIX, + ); + Ok(()) + } +} + +const TECHNICAL_MEMBERSHIP_OLD_PREFIX: &str = "Instance1Membership"; +/// Migrate from `Instance1Membership` to the new pallet prefix `TechnicalMembership` +pub struct TechnicalMembershipStoragePrefixMigration; + +impl OnRuntimeUpgrade for TechnicalMembershipStoragePrefixMigration { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + use frame_support::traits::PalletInfo; + let name = ::PalletInfo::name::() + .expect("TechnicalMembership is part of runtime, so it has a name; qed"); + pallet_membership::migrations::v4::migrate::( + TECHNICAL_MEMBERSHIP_OLD_PREFIX, + name, + ) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + use frame_support::traits::PalletInfo; + let name = ::PalletInfo::name::() + .expect("TechnicalMembership is part of runtime, so it has a name; qed"); + pallet_membership::migrations::v4::pre_migrate::( + TECHNICAL_MEMBERSHIP_OLD_PREFIX, + name, + ); + Ok(()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + use frame_support::traits::PalletInfo; + let name = ::PalletInfo::name::() + .expect("TechnicalMembership is part of runtime, so it has a name; qed"); + pallet_membership::migrations::v4::post_migrate::( + TECHNICAL_MEMBERSHIP_OLD_PREFIX, + name, + ); + Ok(()) + } +} + +const TIPS_OLD_PREFIX: &str = "Treasury"; +/// Migrate pallet-tips from `Treasury` to the new pallet prefix `Tips` +pub struct MigrateTipsPalletPrefix; + +impl OnRuntimeUpgrade for MigrateTipsPalletPrefix { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + pallet_tips::migrations::v4::migrate::(TIPS_OLD_PREFIX) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + pallet_tips::migrations::v4::pre_migrate::(TIPS_OLD_PREFIX); + Ok(()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + pallet_tips::migrations::v4::post_migrate::(TIPS_OLD_PREFIX); + Ok(()) + } +} + +// Migration to generate pallet staking's `SortedListProvider` from pre-existing nominators. +pub struct StakingBagsListMigrationV8; + +impl OnRuntimeUpgrade for StakingBagsListMigrationV8 { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + pallet_staking::migrations::v8::migrate::() + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + pallet_staking::migrations::v8::pre_migrate::() + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + pallet_staking::migrations::v8::post_migrate::() + } +} + #[cfg(not(feature = "disable-runtime-api"))] sp_api::impl_runtime_apis! { impl sp_api::Core for Runtime { @@ -1521,7 +1755,7 @@ sp_api::impl_runtime_apis! { impl sp_api::Metadata for Runtime { fn metadata() -> OpaqueMetadata { - Runtime::metadata().into() + OpaqueMetadata::new(Runtime::metadata().into()) } } @@ -1709,7 +1943,7 @@ sp_api::impl_runtime_apis! { slot_duration: Babe::slot_duration(), epoch_length: EpochDuration::get(), c: BABE_GENESIS_EPOCH_CONFIG.c, - genesis_authorities: Babe::authorities(), + genesis_authorities: Babe::authorities().to_vec(), randomness: Babe::randomness(), allowed_slots: BABE_GENESIS_EPOCH_CONFIG.allowed_slots, } @@ -1789,10 +2023,13 @@ sp_api::impl_runtime_apis! { #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade() -> Result<(Weight, Weight), sp_runtime::RuntimeString> { + fn on_runtime_upgrade() -> (Weight, Weight) { log::info!("try-runtime::on_runtime_upgrade kusama."); - let weight = Executive::try_runtime_upgrade()?; - Ok((weight, BlockWeights::get().max_block)) + let weight = Executive::try_runtime_upgrade().unwrap(); + (weight, BlockWeights::get().max_block) + } + fn execute_block_no_check(block: Block) -> Weight { + Executive::execute_block_no_check(block) } } @@ -1819,7 +2056,11 @@ sp_api::impl_runtime_apis! { list_benchmark!(list, extra, runtime_common::claims, Claims); list_benchmark!(list, extra, runtime_common::slots, Slots); list_benchmark!(list, extra, runtime_common::paras_registrar, Registrar); + list_benchmark!(list, extra, runtime_parachains::configuration, Configuration); + list_benchmark!(list, extra, runtime_parachains::initializer, Initializer); + list_benchmark!(list, extra, runtime_parachains::paras, Paras); // Substrate + list_benchmark!(list, extra, pallet_bags_list, BagsList); list_benchmark!(list, extra, pallet_balances, Balances); list_benchmark!(list, extra, pallet_bounties, Bounties); list_benchmark!(list, extra, pallet_collective, Council); @@ -1892,8 +2133,12 @@ sp_api::impl_runtime_apis! { add_benchmark!(params, batches, runtime_common::claims, Claims); add_benchmark!(params, batches, runtime_common::slots, Slots); add_benchmark!(params, batches, runtime_common::paras_registrar, Registrar); + add_benchmark!(params, batches, runtime_parachains::configuration, Configuration); + add_benchmark!(params, batches, runtime_parachains::initializer, Initializer); + add_benchmark!(params, batches, runtime_parachains::paras, Paras); // Substrate add_benchmark!(params, batches, pallet_balances, Balances); + add_benchmark!(params, batches, pallet_bags_list, BagsList); add_benchmark!(params, batches, pallet_bounties, Bounties); add_benchmark!(params, batches, pallet_collective, Council); add_benchmark!(params, batches, pallet_collective, TechnicalCommittee); diff --git a/runtime/kusama/src/tests.rs b/runtime/kusama/src/tests.rs index 103987e8b0fd..d2c1c725e3a9 100644 --- a/runtime/kusama/src/tests.rs +++ b/runtime/kusama/src/tests.rs @@ -79,10 +79,10 @@ fn block_cost() { #[ignore] fn transfer_cost_min_multiplier() { let min_multiplier = runtime_common::MinimumMultiplier::get(); - let call = >::transfer_keep_alive( - Default::default(), - Default::default(), - ); + let call = pallet_balances::Call::::transfer_keep_alive { + dest: Default::default(), + value: Default::default(), + }; let info = call.get_dispatch_info(); // convert to outer call. let call = Call::Balances(call); diff --git a/runtime/kusama/src/voter_bags.rs b/runtime/kusama/src/voter_bags.rs new file mode 100644 index 000000000000..52f4a9d5c33a --- /dev/null +++ b/runtime/kusama/src/voter_bags.rs @@ -0,0 +1,234 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Autogenerated voter bag thresholds. +//! +//! Generated on 2021-07-05T14:34:44.453491278+00:00 +//! for the kusama runtime. + +/// Existential weight for this runtime. +#[cfg(any(test, feature = "std"))] +#[allow(unused)] +pub const EXISTENTIAL_WEIGHT: u64 = 33_333_333; + +/// Constant ratio between bags for this runtime. +#[cfg(any(test, feature = "std"))] +#[allow(unused)] +pub const CONSTANT_RATIO: f64 = 1.1455399939091000; + +/// Upper thresholds delimiting the bag list. +pub const THRESHOLDS: [u64; 200] = [ + 33_333_333, + 38_184_666, + 43_742_062, + 50_108_281, + 57_401_040, + 65_755_187, + 75_325_197, + 86_288_026, + 98_846_385, + 113_232_487, + 129_712_342, + 148_590_675, + 170_216_561, + 194_989_878, + 223_368_704, + 255_877_784, + 293_118_235, + 335_778_661, + 384_647_885, + 440_629_536, + 504_758_756, + 578_221_342, + 662_375_673, + 758_777_824, + 869_210_344, + 995_715_212, + 1_140_631_598, + 1_306_639_114, + 1_496_807_363, + 1_714_652_697, + 1_964_203_240, + 2_250_073_368, + 2_577_549_032, + 2_952_685_502, + 3_382_419_332, + 3_874_696_621, + 4_438_619_944, + 5_084_616_664, + 5_824_631_742, + 6_672_348_610, + 7_643_442_186, + 8_755_868_715, + 10_030_197_794, + 11_489_992_720, + 13_162_246_190, + 15_077_879_420, + 17_272_313_899, + 19_786_126_359, + 22_665_799_069, + 25_964_579_327, + 29_743_464_044, + 34_072_327_620, + 39_031_213_974, + 44_711_816_618, + 51_219_174_136, + 58_673_612_428, + 67_212_969_623, + 76_995_144_813, + 88_201_017_720, + 101_037_793_302, + 115_742_833_124, + 132_588_044_352, + 151_884_907_519, + 173_990_236_034, + 199_312_773_927, + 228_320_753_830, + 261_550_554_952, + 299_616_621_127, + 343_222_822_341, + 393_175_469_814, + 450_398_225_296, + 515_949_180_262, + 591_040_420_815, + 677_060_440_060, + 775_599_812_382, + 888_480_604_352, + 1_017_790_066_098, + 1_165_919_226_119, + 1_335_607_103_187, + 1_529_991_352_850, + 1_752_666_285_025, + 2_007_749_325_472, + 2_299_957_150_072, + 2_634_692_899_685, + 3_018_146_088_258, + 3_457_407_051_560, + 3_960_598_052_785, + 4_537_023_469_264, + 5_197_341_837_346, + 5_953_762_936_697, + 6_820_273_558_240, + 7_812_896_130_365, + 8_949_984_985_591, + 10_252_565_745_880, + 11_744_724_102_088, + 13_454_051_176_370, + 15_412_153_702_632, + 17_655_238_458_639, + 20_224_781_756_373, + 23_168_296_370_008, + 26_540_210_082_583, + 30_402_872_096_348, + 34_827_705_916_070, + 39_896_530_022_963, + 45_703_070_759_499, + 52_354_695_399_464, + 59_974_397_449_015, + 68_703_070_888_447, + 78_702_115_407_088, + 90_156_420_804_069, + 103_277_785_738_759, + 118_308_834_046_123, + 135_527_501_032_588, + 155_252_172_707_386, + 177_847_572_977_594, + 203_731_507_665_501, + 233_382_590_050_230, + 267_349_090_784_630, + 306_259_075_829_029, + 350_832_019_859_793, + 401_892_109_893_305, + 460_383_485_119_292, + 527_387_694_739_404, + 604_143_696_619_511, + 692_070_766_545_736, + 792_794_741_693_469, + 908_178_083_570_703, + 1_040_354_316_321_961, + 1_191_767_477_182_765, + 1_365_217_308_553_008, + 1_563_911_027_324_411, + 1_791_522_628_715_580, + 2_052_260_821_186_860, + 2_350_946_848_602_280, + 2_693_103_638_628_474, + 3_085_057_925_791_037, + 3_534_057_237_519_885, + 4_048_403_906_342_940, + 4_637_608_586_213_668, + 5_312_566_111_603_995, + 6_085_756_951_128_531, + 6_971_477_980_728_040, + 7_986_106_843_580_624, + 9_148_404_784_952_770, + 10_479_863_561_632_778, + 12_005_102_840_561_012, + 13_752_325_434_854_380, + 15_753_838_794_879_048, + 18_046_652_397_130_688, + 20_673_162_077_088_732, + 23_681_933_959_870_064, + 27_128_602_484_145_260, + 31_076_899_124_450_156, + 35_599_830_833_736_348, + 40_781_029_996_443_328, + 46_716_300_853_732_512, + 53_515_390_995_440_424, + 61_304_020_674_959_928, + 70_226_207_470_596_936, + 80_446_929_278_126_800, + 92_155_174_875_271_168, + 105_567_438_465_310_176, + 120_931_722_816_550_704, + 138_532_125_018_688_464, + 158_694_089_650_123_072, + 181_790_426_491_212_160, + 208_248_204_055_475_872, + 238_556_646_405_290_848, + 273_276_179_270_092_192, + 313_048_792_736_563_520, + 358_609_912_124_694_080, + 410_801_996_551_064_960, + 470_590_116_626_953_088, + 539_079_799_334_522_496, + 617_537_470_046_187_776, + 707_413_869_675_350_912, + 810_370_879_959_114_368, + 928_312_252_892_475_904, + 1_063_418_812_524_189_696, + 1_218_188_780_021_782_528, + 1_395_483_967_646_286_592, + 1_598_582_695_797_773_824, + 1_831_240_411_607_374_592, + 2_097_759_129_958_809_600, + 2_403_066_980_955_773_440, + 2_752_809_334_727_236_096, + 3_153_453_188_536_351_744, + 3_612_406_746_388_564_480, + 4_138_156_402_255_148_032, + 4_740_423_659_834_265_600, + 5_430_344_890_413_097_984, + 6_220_677_252_688_132_096, + 7_126_034_582_154_840_064, + 8_163_157_611_837_691_904, + 9_351_223_520_943_572_992, + 10_712_200_535_224_332_288, + 12_271_254_135_873_939_456, + 14_057_212_388_066_050_048, + 16_103_098_993_404_108_800, + 18_446_744_073_709_551_615, +]; diff --git a/runtime/kusama/src/weights/mod.rs b/runtime/kusama/src/weights/mod.rs index 680fb6aaed90..ea8c2fc7f58d 100644 --- a/runtime/kusama/src/weights/mod.rs +++ b/runtime/kusama/src/weights/mod.rs @@ -16,6 +16,7 @@ //! A list of the different weight modules for our runtime. pub mod frame_system; +pub mod pallet_bags_list; pub mod pallet_balances; pub mod pallet_bounties; pub mod pallet_collective_council; @@ -43,3 +44,6 @@ pub mod runtime_common_claims; pub mod runtime_common_crowdloan; pub mod runtime_common_paras_registrar; pub mod runtime_common_slots; +pub mod runtime_parachains_configuration; +pub mod runtime_parachains_initializer; +pub mod runtime_parachains_paras; diff --git a/runtime/kusama/src/weights/pallet_bags_list.rs b/runtime/kusama/src/weights/pallet_bags_list.rs new file mode 100644 index 000000000000..38285f4c2145 --- /dev/null +++ b/runtime/kusama/src/weights/pallet_bags_list.rs @@ -0,0 +1,65 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `pallet_bags_list` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-17, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_bags_list +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `pallet_bags_list`. +pub struct WeightInfo(PhantomData); +impl pallet_bags_list::WeightInfo for WeightInfo { + // Storage: Staking Bonded (r:1 w:0) + // Storage: Staking Ledger (r:1 w:0) + // Storage: BagsList ListNodes (r:4 w:4) + // Storage: BagsList ListBags (r:1 w:1) + fn rebag_non_terminal() -> Weight { + (65_491_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } + // Storage: Staking Bonded (r:1 w:0) + // Storage: Staking Ledger (r:1 w:0) + // Storage: BagsList ListNodes (r:3 w:3) + // Storage: BagsList ListBags (r:2 w:2) + fn rebag_terminal() -> Weight { + (64_253_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/pallet_balances.rs b/runtime/kusama/src/weights/pallet_balances.rs index 74001c453815..1ec240b75fc9 100644 --- a/runtime/kusama/src/weights/pallet_balances.rs +++ b/runtime/kusama/src/weights/pallet_balances.rs @@ -72,4 +72,10 @@ impl pallet_balances::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: System Account (r:1 w:1) + fn force_unreserve() -> Weight { + (27_766_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } } diff --git a/runtime/kusama/src/weights/pallet_collective_council.rs b/runtime/kusama/src/weights/pallet_collective_council.rs index 21abbb70bf35..4ffa6f5cda03 100644 --- a/runtime/kusama/src/weights/pallet_collective_council.rs +++ b/runtime/kusama/src/weights/pallet_collective_council.rs @@ -41,7 +41,7 @@ use frame_support::{traits::Get, weights::Weight}; use sp_std::marker::PhantomData; -/// Weight functions for pallet_collective. +/// Weight functions for `pallet_collective`. pub struct WeightInfo(PhantomData); impl pallet_collective::WeightInfo for WeightInfo { // Storage: Instance1Collective Members (r:1 w:1) diff --git a/runtime/kusama/src/weights/pallet_collective_technical_committee.rs b/runtime/kusama/src/weights/pallet_collective_technical_committee.rs index e860a1d224e7..d61bb433c99e 100644 --- a/runtime/kusama/src/weights/pallet_collective_technical_committee.rs +++ b/runtime/kusama/src/weights/pallet_collective_technical_committee.rs @@ -41,7 +41,7 @@ use frame_support::{traits::Get, weights::Weight}; use sp_std::marker::PhantomData; -/// Weight functions for pallet_collective. +/// Weight functions for `pallet_collective`. pub struct WeightInfo(PhantomData); impl pallet_collective::WeightInfo for WeightInfo { // Storage: Instance2Collective Members (r:1 w:1) diff --git a/runtime/kusama/src/weights/pallet_democracy.rs b/runtime/kusama/src/weights/pallet_democracy.rs index f6a4991a3fbb..4063e31905c2 100644 --- a/runtime/kusama/src/weights/pallet_democracy.rs +++ b/runtime/kusama/src/weights/pallet_democracy.rs @@ -129,6 +129,13 @@ impl pallet_democracy::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) } + fn on_initialize_base_with_launch_period(r: u32) -> Weight { + (7_295_000 as Weight) + // Standard Error: 4_000 + .saturating_add((5_093_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + } fn delegate(r: u32) -> Weight { (54_128_000 as Weight) // Standard Error: 5_000 diff --git a/runtime/kusama/src/weights/pallet_election_provider_multi_phase.rs b/runtime/kusama/src/weights/pallet_election_provider_multi_phase.rs index 913050e48491..c9219a954918 100644 --- a/runtime/kusama/src/weights/pallet_election_provider_multi_phase.rs +++ b/runtime/kusama/src/weights/pallet_election_provider_multi_phase.rs @@ -83,7 +83,7 @@ impl pallet_election_provider_multi_phase::WeightInfo f // Storage: ElectionProviderMultiPhase SnapshotMetadata (r:0 w:1) // Storage: ElectionProviderMultiPhase DesiredTargets (r:0 w:1) // Storage: ElectionProviderMultiPhase Snapshot (r:0 w:1) - fn create_snapshot_internal() -> Weight { + fn create_snapshot_internal(_: u32, _: u32) -> Weight { (8_835_233_000 as Weight).saturating_add(T::DbWeight::get().writes(3 as Weight)) } // Storage: ElectionProviderMultiPhase SignedSubmissionIndices (r:1 w:1) diff --git a/runtime/kusama/src/weights/pallet_staking.rs b/runtime/kusama/src/weights/pallet_staking.rs index 2df8f525cc54..5f385be7167e 100644 --- a/runtime/kusama/src/weights/pallet_staking.rs +++ b/runtime/kusama/src/weights/pallet_staking.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// Copyright 2017-2021 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -15,8 +15,8 @@ // along with Polkadot. If not, see . //! Autogenerated weights for `pallet_staking` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-07-01, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-17, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 // Executed Command: @@ -33,6 +33,8 @@ // --header=./file_header.txt // --output=./runtime/kusama/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] @@ -42,182 +44,369 @@ use sp_std::marker::PhantomData; /// Weight functions for `pallet_staking`. pub struct WeightInfo(PhantomData); impl pallet_staking::WeightInfo for WeightInfo { + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking HistoryDepth (r:1 w:0) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Payee (r:0 w:1) fn bond() -> Weight { - (70_648_000 as Weight) + (66_934_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } + // Storage: Staking Bonded (r:1 w:0) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: BagsList ListNodes (r:3 w:3) + // Storage: BagsList ListBags (r:2 w:2) fn bond_extra() -> Weight { - (54_235_000 as Weight) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) - .saturating_add(T::DbWeight::get().writes(2 as Weight)) + (106_496_000 as Weight) + .saturating_add(T::DbWeight::get().reads(8 as Weight)) + .saturating_add(T::DbWeight::get().writes(7 as Weight)) } + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking Nominators (r:1 w:0) + // Storage: Staking MinNominatorBond (r:1 w:0) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Balances Locks (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: BagsList ListNodes (r:3 w:3) + // Storage: Staking Bonded (r:1 w:0) + // Storage: BagsList ListBags (r:2 w:2) fn unbond() -> Weight { - (57_950_000 as Weight) - .saturating_add(T::DbWeight::get().reads(6 as Weight)) - .saturating_add(T::DbWeight::get().writes(3 as Weight)) + (115_916_000 as Weight) + .saturating_add(T::DbWeight::get().reads(12 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) } - fn withdraw_unbonded_update(s: u32) -> Weight { - (49_532_000 as Weight) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Balances Locks (r:1 w:1) + // Storage: System Account (r:1 w:1) + fn withdraw_unbonded_update(s: u32, ) -> Weight { + (47_633_000 as Weight) // Standard Error: 0 - .saturating_add((29_000 as Weight).saturating_mul(s as Weight)) + .saturating_add((25_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } - fn withdraw_unbonded_kill(s: u32) -> Weight { - (81_722_000 as Weight) - // Standard Error: 1_000 - .saturating_add((2_331_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(8 as Weight)) - .saturating_add(T::DbWeight::get().writes(6 as Weight)) - .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking SlashingSpans (r:1 w:0) + // Storage: Staking Validators (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Payee (r:0 w:1) + fn withdraw_unbonded_kill(_s: u32, ) -> Weight { + (94_253_000 as Weight) + .saturating_add(T::DbWeight::get().reads(13 as Weight)) + .saturating_add(T::DbWeight::get().writes(11 as Weight)) } + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking MinValidatorBond (r:1 w:0) + // Storage: Staking Validators (r:1 w:1) + // Storage: Staking MaxValidatorsCount (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) + // Storage: Staking CounterForValidators (r:1 w:1) fn validate() -> Weight { - (31_838_000 as Weight) - .saturating_add(T::DbWeight::get().reads(6 as Weight)) - .saturating_add(T::DbWeight::get().writes(2 as Weight)) + (63_555_000 as Weight) + .saturating_add(T::DbWeight::get().reads(11 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) } - fn kick(k: u32) -> Weight { - (10_120_000 as Weight) - // Standard Error: 6_000 - .saturating_add((18_142_000 as Weight).saturating_mul(k as Weight)) + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + fn kick(k: u32, ) -> Weight { + (9_518_000 as Weight) + // Standard Error: 11_000 + .saturating_add((16_662_000 as Weight).saturating_mul(k as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(k as Weight))) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(k as Weight))) } - fn nominate(n: u32) -> Weight { - (37_716_000 as Weight) - // Standard Error: 6_000 - .saturating_add((5_240_000 as Weight).saturating_mul(n as Weight)) - .saturating_add(T::DbWeight::get().reads(7 as Weight)) + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking MinNominatorBond (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking MaxNominatorsCount (r:1 w:0) + // Storage: Staking Validators (r:2 w:0) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: Staking Bonded (r:1 w:0) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) + fn nominate(n: u32, ) -> Weight { + (74_049_000 as Weight) + // Standard Error: 16_000 + .saturating_add((5_118_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(12 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(n as Weight))) - .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) } + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking Validators (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) fn chill() -> Weight { - (16_594_000 as Weight).saturating_add(T::DbWeight::get().reads(3 as Weight)) + (62_972_000 as Weight) + .saturating_add(T::DbWeight::get().reads(8 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) } + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking Payee (r:0 w:1) fn set_payee() -> Weight { - (11_260_000 as Weight) + (10_848_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking Ledger (r:2 w:2) fn set_controller() -> Weight { - (24_156_000 as Weight) + (23_892_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } + // Storage: Staking ValidatorCount (r:0 w:1) fn set_validator_count() -> Weight { - (2_123_000 as Weight).saturating_add(T::DbWeight::get().writes(1 as Weight)) + (2_279_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking ForceEra (r:0 w:1) fn force_no_eras() -> Weight { - (2_458_000 as Weight).saturating_add(T::DbWeight::get().writes(1 as Weight)) + (2_614_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking ForceEra (r:0 w:1) fn force_new_era() -> Weight { - (2_428_000 as Weight).saturating_add(T::DbWeight::get().writes(1 as Weight)) + (2_592_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking ForceEra (r:0 w:1) fn force_new_era_always() -> Weight { - (2_435_000 as Weight).saturating_add(T::DbWeight::get().writes(1 as Weight)) + (2_572_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn set_invulnerables(v: u32) -> Weight { - (2_524_000 as Weight) + // Storage: Staking Invulnerables (r:0 w:1) + fn set_invulnerables(v: u32, ) -> Weight { + (2_700_000 as Weight) // Standard Error: 0 - .saturating_add((23_000 as Weight).saturating_mul(v as Weight)) + .saturating_add((57_000 as Weight).saturating_mul(v as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn force_unstake(s: u32) -> Weight { - (57_861_000 as Weight) + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking SlashingSpans (r:1 w:0) + // Storage: Staking Validators (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Ledger (r:0 w:1) + // Storage: Staking Payee (r:0 w:1) + // Storage: Staking SpanSlash (r:0 w:2) + fn force_unstake(s: u32, ) -> Weight { + (90_113_000 as Weight) // Standard Error: 1_000 - .saturating_add((2_315_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(6 as Weight)) - .saturating_add(T::DbWeight::get().writes(6 as Weight)) + .saturating_add((2_230_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(11 as Weight)) + .saturating_add(T::DbWeight::get().writes(12 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } - fn cancel_deferred_slash(s: u32) -> Weight { - (3_460_645_000 as Weight) - // Standard Error: 221_000 - .saturating_add((19_673_000 as Weight).saturating_mul(s as Weight)) + // Storage: Staking UnappliedSlashes (r:1 w:1) + fn cancel_deferred_slash(s: u32, ) -> Weight { + (2_809_466_000 as Weight) + // Standard Error: 181_000 + .saturating_add((16_204_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn payout_stakers_dead_controller(n: u32) -> Weight { - (108_055_000 as Weight) - // Standard Error: 15_000 - .saturating_add((47_913_000 as Weight).saturating_mul(n as Weight)) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking HistoryDepth (r:1 w:0) + // Storage: Staking ErasValidatorReward (r:1 w:0) + // Storage: Staking Bonded (r:2 w:0) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking ErasStakersClipped (r:1 w:0) + // Storage: Staking ErasRewardPoints (r:1 w:0) + // Storage: Staking ErasValidatorPrefs (r:1 w:0) + // Storage: Staking Payee (r:2 w:0) + // Storage: System Account (r:2 w:2) + fn payout_stakers_dead_controller(n: u32, ) -> Weight { + (113_536_000 as Weight) + // Standard Error: 16_000 + .saturating_add((45_494_000 as Weight).saturating_mul(n as Weight)) .saturating_add(T::DbWeight::get().reads(10 as Weight)) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().writes(2 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(n as Weight))) } - fn payout_stakers_alive_staked(n: u32) -> Weight { - (122_624_000 as Weight) - // Standard Error: 22_000 - .saturating_add((60_815_000 as Weight).saturating_mul(n as Weight)) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking HistoryDepth (r:1 w:0) + // Storage: Staking ErasValidatorReward (r:1 w:0) + // Storage: Staking Bonded (r:2 w:0) + // Storage: Staking Ledger (r:2 w:2) + // Storage: Staking ErasStakersClipped (r:1 w:0) + // Storage: Staking ErasRewardPoints (r:1 w:0) + // Storage: Staking ErasValidatorPrefs (r:1 w:0) + // Storage: Staking Payee (r:2 w:0) + // Storage: System Account (r:2 w:2) + // Storage: Balances Locks (r:2 w:2) + fn payout_stakers_alive_staked(n: u32, ) -> Weight { + (134_960_000 as Weight) + // Standard Error: 25_000 + .saturating_add((58_130_000 as Weight).saturating_mul(n as Weight)) .saturating_add(T::DbWeight::get().reads(11 as Weight)) .saturating_add(T::DbWeight::get().reads((5 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().writes(3 as Weight)) .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(n as Weight))) } - fn rebond(l: u32) -> Weight { - (46_725_000 as Weight) - // Standard Error: 1_000 - .saturating_add((62_000 as Weight).saturating_mul(l as Weight)) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) - .saturating_add(T::DbWeight::get().writes(3 as Weight)) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: BagsList ListNodes (r:3 w:3) + // Storage: Staking Bonded (r:1 w:0) + // Storage: BagsList ListBags (r:2 w:2) + fn rebond(l: u32, ) -> Weight { + (103_717_000 as Weight) + // Standard Error: 4_000 + .saturating_add((65_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(9 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) } - fn set_history_depth(e: u32) -> Weight { + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking HistoryDepth (r:1 w:1) + // Storage: Staking ErasStakersClipped (r:0 w:2) + // Storage: Staking ErasValidatorPrefs (r:0 w:2) + // Storage: Staking ErasValidatorReward (r:0 w:1) + // Storage: Staking ErasRewardPoints (r:0 w:1) + // Storage: Staking ErasStakers (r:0 w:2) + // Storage: Staking ErasTotalStake (r:0 w:1) + // Storage: Staking ErasStartSessionIndex (r:0 w:1) + fn set_history_depth(e: u32, ) -> Weight { (0 as Weight) - // Standard Error: 68_000 - .saturating_add((32_190_000 as Weight).saturating_mul(e as Weight)) + // Standard Error: 69_000 + .saturating_add((31_059_000 as Weight).saturating_mul(e as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) .saturating_add(T::DbWeight::get().writes((7 as Weight).saturating_mul(e as Weight))) } - fn reap_stash(s: u32) -> Weight { - (68_887_000 as Weight) - // Standard Error: 0 - .saturating_add((2_318_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(7 as Weight)) - .saturating_add(T::DbWeight::get().writes(8 as Weight)) + // Storage: System Account (r:1 w:1) + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking SlashingSpans (r:1 w:1) + // Storage: Staking Validators (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Ledger (r:0 w:1) + // Storage: Staking Payee (r:0 w:1) + // Storage: Staking SpanSlash (r:0 w:1) + fn reap_stash(s: u32, ) -> Weight { + (93_312_000 as Weight) + // Standard Error: 1_000 + .saturating_add((2_226_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(11 as Weight)) + .saturating_add(T::DbWeight::get().writes(12 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } - fn new_era(v: u32, n: u32) -> Weight { + // Storage: Staking CounterForNominators (r:1 w:0) + // Storage: Staking CounterForValidators (r:1 w:0) + // Storage: Staking Validators (r:2 w:0) + // Storage: Staking Bonded (r:101 w:0) + // Storage: Staking Ledger (r:101 w:0) + // Storage: Staking SlashingSpans (r:1 w:0) + // Storage: Staking Nominators (r:101 w:0) + // Storage: System BlockWeight (r:1 w:1) + // Storage: Staking ValidatorCount (r:1 w:0) + // Storage: Staking MinimumValidatorCount (r:1 w:0) + // Storage: Staking CurrentEra (r:1 w:1) + // Storage: Staking HistoryDepth (r:1 w:0) + // Storage: Staking ErasStakersClipped (r:0 w:1) + // Storage: Staking ErasValidatorPrefs (r:0 w:1) + // Storage: Staking ErasStakers (r:0 w:1) + // Storage: Staking ErasTotalStake (r:0 w:1) + // Storage: Staking ErasStartSessionIndex (r:0 w:1) + fn new_era(v: u32, n: u32, ) -> Weight { (0 as Weight) - // Standard Error: 734_000 - .saturating_add((296_342_000 as Weight).saturating_mul(v as Weight)) + // Standard Error: 724_000 + .saturating_add((300_240_000 as Weight).saturating_mul(v as Weight)) // Standard Error: 36_000 - .saturating_add((46_481_000 as Weight).saturating_mul(n as Weight)) + .saturating_add((49_412_000 as Weight).saturating_mul(n as Weight)) .saturating_add(T::DbWeight::get().reads(10 as Weight)) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(v as Weight))) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().writes(4 as Weight)) .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(v as Weight))) } - fn get_npos_voters(v: u32, n: u32, s: u32) -> Weight { + // Storage: Staking CounterForNominators (r:1 w:0) + // Storage: Staking CounterForValidators (r:1 w:0) + // Storage: Staking Validators (r:501 w:0) + // Storage: Staking Bonded (r:1500 w:0) + // Storage: Staking Ledger (r:1500 w:0) + // Storage: Staking SlashingSpans (r:21 w:0) + // Storage: Staking Nominators (r:1001 w:0) + // Storage: System BlockWeight (r:1 w:1) + fn get_npos_voters(v: u32, n: u32, s: u32, ) -> Weight { (0 as Weight) - // Standard Error: 92_000 - .saturating_add((24_187_000 as Weight).saturating_mul(v as Weight)) - // Standard Error: 92_000 - .saturating_add((27_771_000 as Weight).saturating_mul(n as Weight)) - // Standard Error: 3_152_000 - .saturating_add((40_493_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) + // Standard Error: 83_000 + .saturating_add((23_656_000 as Weight).saturating_mul(v as Weight)) + // Standard Error: 83_000 + .saturating_add((31_191_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 2_847_000 + .saturating_add((37_983_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(v as Weight))) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn get_npos_targets(v: u32) -> Weight { + // Storage: Staking Validators (r:501 w:0) + // Storage: System BlockWeight (r:1 w:1) + fn get_npos_targets(v: u32, ) -> Weight { (0 as Weight) // Standard Error: 27_000 - .saturating_add((10_233_000 as Weight).saturating_mul(v as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add((9_398_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(v as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking MinValidatorBond (r:0 w:1) + // Storage: Staking MaxValidatorsCount (r:0 w:1) + // Storage: Staking ChillThreshold (r:0 w:1) + // Storage: Staking MaxNominatorsCount (r:0 w:1) + // Storage: Staking MinNominatorBond (r:0 w:1) fn set_staking_limits() -> Weight { - (5_708_000 as Weight).saturating_add(T::DbWeight::get().writes(5 as Weight)) + (5_996_000 as Weight) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) } + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking ChillThreshold (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking MaxNominatorsCount (r:1 w:0) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: Staking MinNominatorBond (r:1 w:0) + // Storage: Staking Validators (r:1 w:0) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) fn chill_other() -> Weight { - (39_559_000 as Weight) - .saturating_add(T::DbWeight::get().reads(7 as Weight)) - .saturating_add(T::DbWeight::get().writes(2 as Weight)) + (76_568_000 as Weight) + .saturating_add(T::DbWeight::get().reads(11 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) } } diff --git a/runtime/kusama/src/weights/runtime_parachains_configuration.rs b/runtime/kusama/src/weights/runtime_parachains_configuration.rs new file mode 100644 index 000000000000..ae840f37752d --- /dev/null +++ b/runtime/kusama/src/weights/runtime_parachains_configuration.rs @@ -0,0 +1,91 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_parachains::configuration` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-17, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_parachains::configuration +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/runtime_parachains_configuration.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_parachains::configuration`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::configuration::WeightInfo for WeightInfo { + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_block_number() -> Weight { + (12_378_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_u32() -> Weight { + (12_384_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_option_u32() -> Weight { + (12_746_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_weight() -> Weight { + (12_563_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Benchmark Override (r:0 w:0) + fn set_hrmp_open_request_ttl() -> Weight { + (2_000_000_000_000 as Weight) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_balance() -> Weight { + (12_644_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/runtime_parachains_initializer.rs b/runtime/kusama/src/weights/runtime_parachains_initializer.rs new file mode 100644 index 000000000000..6b41892d3e45 --- /dev/null +++ b/runtime/kusama/src/weights/runtime_parachains_initializer.rs @@ -0,0 +1,55 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_parachains::initializer` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-25, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_parachains::initializer +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/runtime_parachains_initializer.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_parachains::initializer`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::initializer::WeightInfo for WeightInfo { + // Storage: System Digest (r:1 w:1) + fn force_approve(d: u32, ) -> Weight { + (5_156_000 as Weight) + // Standard Error: 0 + .saturating_add((2_000 as Weight).saturating_mul(d as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/runtime_parachains_paras.rs b/runtime/kusama/src/weights/runtime_parachains_paras.rs new file mode 100644 index 000000000000..728d95561bfc --- /dev/null +++ b/runtime/kusama/src/weights/runtime_parachains_paras.rs @@ -0,0 +1,106 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_parachains::paras` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_parachains::paras +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/runtime_parachains_paras.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_parachains::paras`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::paras::WeightInfo for WeightInfo { + // Storage: Paras CurrentCodeHash (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras PastCodeMeta (r:1 w:1) + // Storage: Paras PastCodePruning (r:1 w:1) + // Storage: Paras PastCodeHash (r:0 w:1) + // Storage: Paras CodeByHash (r:0 w:1) + fn force_set_current_code(c: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } + // Storage: Paras Heads (r:0 w:1) + fn force_set_current_head(s: u32, ) -> Weight { + (16_088_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: Paras FutureCodeUpgrades (r:1 w:1) + // Storage: Paras UpcomingUpgrades (r:1 w:1) + // Storage: Paras UpgradeCooldowns (r:1 w:1) + // Storage: System Digest (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras CodeByHash (r:0 w:1) + // Storage: Paras FutureCodeHash (r:0 w:1) + // Storage: Paras UpgradeRestrictionSignal (r:0 w:1) + fn force_schedule_code_upgrade(c: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + } + // Storage: Paras FutureCodeUpgrades (r:1 w:1) + // Storage: Paras FutureCodeHash (r:1 w:1) + // Storage: Paras CurrentCodeHash (r:1 w:1) + // Storage: System Digest (r:1 w:1) + // Storage: Paras PastCodeMeta (r:1 w:1) + // Storage: Paras PastCodePruning (r:1 w:1) + // Storage: Paras Heads (r:0 w:1) + // Storage: Paras PastCodeHash (r:0 w:1) + // Storage: Paras UpgradeGoAheadSignal (r:0 w:1) + fn force_note_new_head(s: u32, ) -> Weight { + (69_114_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(9 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras ActionsQueue (r:1 w:1) + fn force_queue_action() -> Weight { + (26_752_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/parachains/Cargo.toml b/runtime/parachains/Cargo.toml index 71c6874428cf..c281269b8682 100644 --- a/runtime/parachains/Cargo.toml +++ b/runtime/parachains/Cargo.toml @@ -1,15 +1,16 @@ [package] name = "polkadot-runtime-parachains" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] bitvec = { version = "0.20.1", default-features = false, features = ["alloc"] } -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } log = { version = "0.4.14", default-features = false } rustc-hex = { version = "2.1.0", default-features = false } -serde = { version = "1.0.130", features = ["derive"], optional = true } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } +serde = { version = "1.0.130", features = [ "derive" ], optional = true } derive_more = "0.99.14" bitflags = "1.3.2" @@ -27,12 +28,12 @@ pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } xcm = { package = "xcm", path = "../../xcm", default-features = false } xcm-executor = { package = "xcm-executor", path = "../../xcm/xcm-executor", default-features = false } @@ -56,6 +57,7 @@ std = [ "bitvec/std", "parity-scale-codec/std", "rustc-hex/std", + "scale-info/std", "serde", "primitives/std", "inherents/std", diff --git a/runtime/parachains/src/configuration.rs b/runtime/parachains/src/configuration.rs index b675bf9034cb..69ff43615678 100644 --- a/runtime/parachains/src/configuration.rs +++ b/runtime/parachains/src/configuration.rs @@ -19,17 +19,25 @@ //! Configuration can change only at session boundaries and is buffered until then. use crate::shared; -use frame_support::pallet_prelude::*; +use frame_support::{pallet_prelude::*, weights::constants::WEIGHT_PER_MILLIS}; use frame_system::pallet_prelude::*; use parity_scale_codec::{Decode, Encode}; -use primitives::v1::{Balance, SessionIndex, MAX_CODE_SIZE, MAX_POV_SIZE}; +use primitives::v1::{Balance, SessionIndex, MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE, MAX_POV_SIZE}; use sp_runtime::traits::Zero; use sp_std::prelude::*; +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; +pub mod weights; + pub use pallet::*; +pub mod migration; + +const LOG_TARGET: &str = "runtime::configuration"; + /// All configuration of the runtime with respect to parachains and parathreads. -#[derive(Clone, Encode, Decode, PartialEq, sp_core::RuntimeDebug)] +#[derive(Clone, Encode, Decode, PartialEq, sp_core::RuntimeDebug, scale_info::TypeInfo)] #[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] pub struct HostConfiguration { // NOTE: This structure is used by parachains via merkle proofs. Therefore, this struct requires @@ -91,8 +99,6 @@ pub struct HostConfiguration { pub hrmp_max_parachain_outbound_channels: u32, /// The maximum number of outbound HRMP channels a parathread is allowed to open. pub hrmp_max_parathread_outbound_channels: u32, - /// Number of sessions after which an HRMP open channel request expires. - pub hrmp_open_request_ttl: u32, /// The deposit that the sender should provide for opening an HRMP channel. pub hrmp_sender_deposit: Balance, /// The deposit that the recipient should provide for accepting opening an HRMP channel. @@ -168,6 +174,9 @@ pub struct HostConfiguration { pub needed_approvals: u32, /// The number of samples to do of the `RelayVRFModulo` approval assignment criterion. pub relay_vrf_modulo_samples: u32, + /// The maximum amount of weight any individual upward message may consume. Messages above this + /// weight go into the overweight queue and may only be serviced explicitly. + pub ump_max_individual_weight: Weight, } impl> Default for HostConfiguration { @@ -202,7 +211,6 @@ impl> Default for HostConfiguration> Default for HostConfiguration HostConfiguration { ) } + if self.max_head_data_size > MAX_HEAD_DATA_SIZE { + panic!( + "`max_head_data_size` ({}) is bigger than allowed by the client ({})", + self.max_head_data_size, MAX_HEAD_DATA_SIZE + ) + } + if self.max_pov_size > MAX_POV_SIZE { panic!("`max_pov_size` is bigger than allowed by the client") } } } +pub trait WeightInfo { + fn set_config_with_block_number() -> Weight; + fn set_config_with_u32() -> Weight; + fn set_config_with_option_u32() -> Weight; + fn set_config_with_weight() -> Weight; + fn set_config_with_balance() -> Weight; + fn set_hrmp_open_request_ttl() -> Weight; +} + #[frame_support::pallet] pub mod pallet { use super::*; #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] + #[pallet::storage_version(migration::STORAGE_VERSION)] pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config + shared::Config {} + pub trait Config: frame_system::Config + shared::Config { + /// Weight information for extrinsics in this pallet. + type WeightInfo: WeightInfo; + } #[pallet::error] pub enum Error { @@ -304,7 +333,10 @@ pub mod pallet { #[pallet::call] impl Pallet { /// Set the validation upgrade frequency. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_block_number(), + DispatchClass::Operational, + ))] pub fn set_validation_upgrade_frequency( origin: OriginFor, new: T::BlockNumber, @@ -317,7 +349,10 @@ pub mod pallet { } /// Set the validation upgrade delay. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_block_number(), + DispatchClass::Operational, + ))] pub fn set_validation_upgrade_delay( origin: OriginFor, new: T::BlockNumber, @@ -330,7 +365,10 @@ pub mod pallet { } /// Set the acceptance period for an included candidate. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_block_number(), + DispatchClass::Operational, + ))] pub fn set_code_retention_period( origin: OriginFor, new: T::BlockNumber, @@ -343,7 +381,10 @@ pub mod pallet { } /// Set the max validation code size for incoming upgrades. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_max_code_size(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; ensure!(new <= MAX_CODE_SIZE, Error::::InvalidNewValue); @@ -354,7 +395,10 @@ pub mod pallet { } /// Set the max POV block size for incoming upgrades. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_max_pov_size(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; ensure!(new <= MAX_POV_SIZE, Error::::InvalidNewValue); @@ -365,9 +409,13 @@ pub mod pallet { } /// Set the max head data size for paras. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_max_head_data_size(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; + ensure!(new <= MAX_HEAD_DATA_SIZE, Error::::InvalidNewValue); Self::update_config_member(|config| { sp_std::mem::replace(&mut config.max_head_data_size, new) != new }); @@ -375,7 +423,10 @@ pub mod pallet { } /// Set the number of parathread execution cores. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_parathread_cores(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -385,7 +436,10 @@ pub mod pallet { } /// Set the number of retries for a particular parathread. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_parathread_retries(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -395,7 +449,10 @@ pub mod pallet { } /// Set the parachain validator-group rotation frequency - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_block_number(), + DispatchClass::Operational, + ))] pub fn set_group_rotation_frequency( origin: OriginFor, new: T::BlockNumber, @@ -411,7 +468,10 @@ pub mod pallet { } /// Set the availability period for parachains. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_block_number(), + DispatchClass::Operational, + ))] pub fn set_chain_availability_period( origin: OriginFor, new: T::BlockNumber, @@ -427,7 +487,10 @@ pub mod pallet { } /// Set the availability period for parathreads. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_block_number(), + DispatchClass::Operational, + ))] pub fn set_thread_availability_period( origin: OriginFor, new: T::BlockNumber, @@ -443,7 +506,10 @@ pub mod pallet { } /// Set the scheduling lookahead, in expected number of blocks at peak throughput. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_scheduling_lookahead(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -453,7 +519,10 @@ pub mod pallet { } /// Set the maximum number of validators to assign to any core. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_option_u32(), + DispatchClass::Operational, + ))] pub fn set_max_validators_per_core( origin: OriginFor, new: Option, @@ -466,7 +535,10 @@ pub mod pallet { } /// Set the maximum number of validators to use in parachain consensus. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_option_u32(), + DispatchClass::Operational, + ))] pub fn set_max_validators(origin: OriginFor, new: Option) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -476,7 +548,10 @@ pub mod pallet { } /// Set the dispute period, in number of sessions to keep for disputes. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_dispute_period(origin: OriginFor, new: SessionIndex) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -486,7 +561,10 @@ pub mod pallet { } /// Set the dispute post conclusion acceptance period. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_block_number(), + DispatchClass::Operational, + ))] pub fn set_dispute_post_conclusion_acceptance_period( origin: OriginFor, new: T::BlockNumber, @@ -500,7 +578,10 @@ pub mod pallet { } /// Set the maximum number of dispute spam slots. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_dispute_max_spam_slots(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -510,7 +591,10 @@ pub mod pallet { } /// Set the dispute conclusion by time out period. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_block_number(), + DispatchClass::Operational, + ))] pub fn set_dispute_conclusion_by_time_out_period( origin: OriginFor, new: T::BlockNumber, @@ -524,7 +608,10 @@ pub mod pallet { /// Set the no show slots, in number of number of consensus slots. /// Must be at least 1. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_no_show_slots(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; @@ -537,7 +624,10 @@ pub mod pallet { } /// Set the total number of delay tranches. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_n_delay_tranches(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -547,7 +637,10 @@ pub mod pallet { } /// Set the zeroth delay tranche width. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_zeroth_delay_tranche_width(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -557,7 +650,10 @@ pub mod pallet { } /// Set the number of validators needed to approve a block. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_needed_approvals(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -567,7 +663,10 @@ pub mod pallet { } /// Set the number of samples to do of the `RelayVRFModulo` approval assignment criterion. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_relay_vrf_modulo_samples(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -577,7 +676,10 @@ pub mod pallet { } /// Sets the maximum items that can present in a upward dispatch queue at once. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_max_upward_queue_count(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -587,7 +689,10 @@ pub mod pallet { } /// Sets the maximum total size of items that can present in a upward dispatch queue at once. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_max_upward_queue_size(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -597,7 +702,10 @@ pub mod pallet { } /// Set the critical downward message size. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_max_downward_message_size(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -607,7 +715,10 @@ pub mod pallet { } /// Sets the soft limit for the phase of dispatching dispatchable upward messages. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_weight(), + DispatchClass::Operational, + ))] pub fn set_ump_service_total_weight(origin: OriginFor, new: Weight) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -617,7 +728,10 @@ pub mod pallet { } /// Sets the maximum size of an upward message that can be sent by a candidate. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_max_upward_message_size(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -627,7 +741,10 @@ pub mod pallet { } /// Sets the maximum number of messages that a candidate can contain. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_max_upward_message_num_per_candidate( origin: OriginFor, new: u32, @@ -640,17 +757,21 @@ pub mod pallet { } /// Sets the number of sessions after which an HRMP open channel request expires. - #[pallet::weight((1_000, DispatchClass::Operational))] - pub fn set_hrmp_open_request_ttl(origin: OriginFor, new: u32) -> DispatchResult { - ensure_root(origin)?; - Self::update_config_member(|config| { - sp_std::mem::replace(&mut config.hrmp_open_request_ttl, new) != new - }); - Ok(()) + #[pallet::weight(( + T::WeightInfo::set_hrmp_open_request_ttl(), + DispatchClass::Operational, + ))] + // Deprecated, but is not marked as such, because that would trigger warnings coming from + // the macro. + pub fn set_hrmp_open_request_ttl(_origin: OriginFor, _new: u32) -> DispatchResult { + Err("this doesn't have any effect".into()) } /// Sets the amount of funds that the sender should provide for opening an HRMP channel. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_balance(), + DispatchClass::Operational, + ))] pub fn set_hrmp_sender_deposit(origin: OriginFor, new: Balance) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -661,7 +782,10 @@ pub mod pallet { /// Sets the amount of funds that the recipient should provide for accepting opening an HRMP /// channel. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_balance(), + DispatchClass::Operational, + ))] pub fn set_hrmp_recipient_deposit(origin: OriginFor, new: Balance) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -671,7 +795,10 @@ pub mod pallet { } /// Sets the maximum number of messages allowed in an HRMP channel at once. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_hrmp_channel_max_capacity(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -681,7 +808,10 @@ pub mod pallet { } /// Sets the maximum total size of messages in bytes allowed in an HRMP channel at once. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_hrmp_channel_max_total_size(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -691,7 +821,10 @@ pub mod pallet { } /// Sets the maximum number of inbound HRMP channels a parachain is allowed to accept. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_hrmp_max_parachain_inbound_channels( origin: OriginFor, new: u32, @@ -704,7 +837,10 @@ pub mod pallet { } /// Sets the maximum number of inbound HRMP channels a parathread is allowed to accept. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_hrmp_max_parathread_inbound_channels( origin: OriginFor, new: u32, @@ -717,7 +853,10 @@ pub mod pallet { } /// Sets the maximum size of a message that could ever be put into an HRMP channel. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_hrmp_channel_max_message_size(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { @@ -727,7 +866,10 @@ pub mod pallet { } /// Sets the maximum number of outbound HRMP channels a parachain is allowed to open. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_hrmp_max_parachain_outbound_channels( origin: OriginFor, new: u32, @@ -740,7 +882,10 @@ pub mod pallet { } /// Sets the maximum number of outbound HRMP channels a parathread is allowed to open. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_hrmp_max_parathread_outbound_channels( origin: OriginFor, new: u32, @@ -753,7 +898,10 @@ pub mod pallet { } /// Sets the maximum number of outbound HRMP messages can be sent by a candidate. - #[pallet::weight((1_000, DispatchClass::Operational))] + #[pallet::weight(( + T::WeightInfo::set_config_with_u32(), + DispatchClass::Operational, + ))] pub fn set_hrmp_max_message_num_per_candidate( origin: OriginFor, new: u32, @@ -764,10 +912,27 @@ pub mod pallet { }); Ok(()) } + + /// Sets the maximum amount of weight any individual upward message may consume. + #[pallet::weight(( + T::WeightInfo::set_config_with_weight(), + DispatchClass::Operational, + ))] + pub fn set_ump_max_individual_weight(origin: OriginFor, new: Weight) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.ump_max_individual_weight, new) != new + }); + Ok(()) + } } #[pallet::hooks] impl Hooks> for Pallet { + fn on_runtime_upgrade() -> Weight { + migration::migrate_to_latest::() + } + fn integrity_test() { assert_eq!( &ActiveConfig::::hashed_key(), @@ -888,7 +1053,6 @@ mod tests { ump_service_total_weight: 20000, max_upward_message_size: 448, max_upward_message_num_per_candidate: 5, - hrmp_open_request_ttl: 1312, hrmp_sender_deposit: 22, hrmp_recipient_deposit: 4905, hrmp_channel_max_capacity: 3921, @@ -899,6 +1063,7 @@ mod tests { hrmp_max_parachain_outbound_channels: 100, hrmp_max_parathread_outbound_channels: 200, hrmp_max_message_num_per_candidate: 20, + ump_max_individual_weight: 909, }; assert!(::PendingConfig::get(shared::SESSION_DELAY).is_none()); @@ -1013,11 +1178,6 @@ mod tests { new_config.max_upward_message_num_per_candidate, ) .unwrap(); - Configuration::set_hrmp_open_request_ttl( - Origin::root(), - new_config.hrmp_open_request_ttl, - ) - .unwrap(); Configuration::set_hrmp_sender_deposit(Origin::root(), new_config.hrmp_sender_deposit) .unwrap(); Configuration::set_hrmp_recipient_deposit( @@ -1065,6 +1225,11 @@ mod tests { new_config.hrmp_max_message_num_per_candidate, ) .unwrap(); + Configuration::set_ump_max_individual_weight( + Origin::root(), + new_config.ump_max_individual_weight, + ) + .unwrap(); assert_eq!( ::PendingConfig::get(shared::SESSION_DELAY), diff --git a/runtime/parachains/src/configuration/benchmarking.rs b/runtime/parachains/src/configuration/benchmarking.rs new file mode 100644 index 000000000000..8b319cb8fabb --- /dev/null +++ b/runtime/parachains/src/configuration/benchmarking.rs @@ -0,0 +1,44 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::configuration::*; +use frame_benchmarking::{benchmarks, impl_benchmark_test_suite, BenchmarkError, BenchmarkResult}; +use frame_system::RawOrigin; +use sp_runtime::traits::One; + +benchmarks! { + set_config_with_block_number {}: set_code_retention_period(RawOrigin::Root, One::one()) + + set_config_with_u32 {}: set_max_code_size(RawOrigin::Root, 100) + + set_config_with_option_u32 {}: set_max_validators(RawOrigin::Root, Some(10)) + + set_config_with_weight {}: set_ump_service_total_weight(RawOrigin::Root, 3_000_000) + + set_hrmp_open_request_ttl {}: { + Err(BenchmarkError::Override( + BenchmarkResult::from_weight(T::BlockWeights::get().max_block) + ))?; + } + + set_config_with_balance {}: set_hrmp_sender_deposit(RawOrigin::Root, 100_000_000_000) +} + +impl_benchmark_test_suite!( + Pallet, + crate::mock::new_test_ext(Default::default()), + crate::mock::Test +); diff --git a/runtime/parachains/src/configuration/migration.rs b/runtime/parachains/src/configuration/migration.rs new file mode 100644 index 000000000000..6909eecc15a9 --- /dev/null +++ b/runtime/parachains/src/configuration/migration.rs @@ -0,0 +1,314 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! A module that is responsible for migration of storage. + +use crate::configuration::{self, Config, Pallet, Store}; +use frame_support::{pallet_prelude::*, traits::StorageVersion, weights::Weight}; +use frame_system::pallet_prelude::BlockNumberFor; + +/// The current storage version. +pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + +/// Migrates the pallet storage to the most recent version, checking and setting the `StorageVersion`. +pub fn migrate_to_latest() -> Weight { + let mut weight = 0; + + if StorageVersion::get::>() == 0 { + weight += migrate_to_v1::(); + StorageVersion::new(1).put::>(); + } + + weight +} + +mod v0 { + use super::*; + use primitives::v1::{Balance, SessionIndex}; + + #[derive(parity_scale_codec::Encode, parity_scale_codec::Decode, Debug)] + pub struct HostConfiguration { + pub max_code_size: u32, + pub max_head_data_size: u32, + pub max_upward_queue_count: u32, + pub max_upward_queue_size: u32, + pub max_upward_message_size: u32, + pub max_upward_message_num_per_candidate: u32, + pub hrmp_max_message_num_per_candidate: u32, + pub validation_upgrade_frequency: BlockNumber, + pub validation_upgrade_delay: BlockNumber, + pub max_pov_size: u32, + pub max_downward_message_size: u32, + pub ump_service_total_weight: Weight, + pub hrmp_max_parachain_outbound_channels: u32, + pub hrmp_max_parathread_outbound_channels: u32, + pub _hrmp_open_request_ttl: u32, + pub hrmp_sender_deposit: Balance, + pub hrmp_recipient_deposit: Balance, + pub hrmp_channel_max_capacity: u32, + pub hrmp_channel_max_total_size: u32, + pub hrmp_max_parachain_inbound_channels: u32, + pub hrmp_max_parathread_inbound_channels: u32, + pub hrmp_channel_max_message_size: u32, + pub code_retention_period: BlockNumber, + pub parathread_cores: u32, + pub parathread_retries: u32, + pub group_rotation_frequency: BlockNumber, + pub chain_availability_period: BlockNumber, + pub thread_availability_period: BlockNumber, + pub scheduling_lookahead: u32, + pub max_validators_per_core: Option, + pub max_validators: Option, + pub dispute_period: SessionIndex, + pub dispute_post_conclusion_acceptance_period: BlockNumber, + pub dispute_max_spam_slots: u32, + pub dispute_conclusion_by_time_out_period: BlockNumber, + pub no_show_slots: u32, + pub n_delay_tranches: u32, + pub zeroth_delay_tranche_width: u32, + pub needed_approvals: u32, + pub relay_vrf_modulo_samples: u32, + } + + impl> Default for HostConfiguration { + fn default() -> Self { + HostConfiguration { + group_rotation_frequency: 1u32.into(), + chain_availability_period: 1u32.into(), + thread_availability_period: 1u32.into(), + no_show_slots: 1u32.into(), + validation_upgrade_frequency: Default::default(), + validation_upgrade_delay: Default::default(), + code_retention_period: Default::default(), + max_code_size: Default::default(), + max_pov_size: Default::default(), + max_head_data_size: Default::default(), + parathread_cores: Default::default(), + parathread_retries: Default::default(), + scheduling_lookahead: Default::default(), + max_validators_per_core: Default::default(), + max_validators: None, + dispute_period: 6, + dispute_post_conclusion_acceptance_period: 100.into(), + dispute_max_spam_slots: 2, + dispute_conclusion_by_time_out_period: 200.into(), + n_delay_tranches: Default::default(), + zeroth_delay_tranche_width: Default::default(), + needed_approvals: Default::default(), + relay_vrf_modulo_samples: Default::default(), + max_upward_queue_count: Default::default(), + max_upward_queue_size: Default::default(), + max_downward_message_size: Default::default(), + ump_service_total_weight: Default::default(), + max_upward_message_size: Default::default(), + max_upward_message_num_per_candidate: Default::default(), + _hrmp_open_request_ttl: Default::default(), + hrmp_sender_deposit: Default::default(), + hrmp_recipient_deposit: Default::default(), + hrmp_channel_max_capacity: Default::default(), + hrmp_channel_max_total_size: Default::default(), + hrmp_max_parachain_inbound_channels: Default::default(), + hrmp_max_parathread_inbound_channels: Default::default(), + hrmp_channel_max_message_size: Default::default(), + hrmp_max_parachain_outbound_channels: Default::default(), + hrmp_max_parathread_outbound_channels: Default::default(), + hrmp_max_message_num_per_candidate: Default::default(), + } + } + } +} + +/// Migrates the `HostConfiguration` from v0 (with deprecated `hrmp_open_request_ttl` and without +/// `ump_max_individual_weight`) to v1 (without HRMP TTL and with max individual weight). +/// Uses the `Default` implementation of `HostConfiguration` to choose a value for `ump_max_individual_weight`. +/// +/// NOTE: Only use this function if you know what you are doing. Default to using `migrate_to_latest`. +pub fn migrate_to_v1() -> Weight { + // Unusual formatting is justified: + // - make it easier to verify that fields assign what they supposed to assign. + // - this code is transient and will be removed after all migrations are done. + // - this code is important enough to optimize for legibility sacrificing consistency. + #[rustfmt::skip] + let translate = + |pre: v0::HostConfiguration>| -> configuration::HostConfiguration> + { + super::HostConfiguration { + +max_code_size : pre.max_code_size, +max_head_data_size : pre.max_head_data_size, +max_upward_queue_count : pre.max_upward_queue_count, +max_upward_queue_size : pre.max_upward_queue_size, +max_upward_message_size : pre.max_upward_message_size, +max_upward_message_num_per_candidate : pre.max_upward_message_num_per_candidate, +hrmp_max_message_num_per_candidate : pre.hrmp_max_message_num_per_candidate, +validation_upgrade_frequency : pre.validation_upgrade_frequency, +validation_upgrade_delay : pre.validation_upgrade_delay, +max_pov_size : pre.max_pov_size, +max_downward_message_size : pre.max_downward_message_size, +ump_service_total_weight : pre.ump_service_total_weight, +hrmp_max_parachain_outbound_channels : pre.hrmp_max_parachain_outbound_channels, +hrmp_max_parathread_outbound_channels : pre.hrmp_max_parathread_outbound_channels, +hrmp_sender_deposit : pre.hrmp_sender_deposit, +hrmp_recipient_deposit : pre.hrmp_recipient_deposit, +hrmp_channel_max_capacity : pre.hrmp_channel_max_capacity, +hrmp_channel_max_total_size : pre.hrmp_channel_max_total_size, +hrmp_max_parachain_inbound_channels : pre.hrmp_max_parachain_inbound_channels, +hrmp_max_parathread_inbound_channels : pre.hrmp_max_parathread_inbound_channels, +hrmp_channel_max_message_size : pre.hrmp_channel_max_message_size, +code_retention_period : pre.code_retention_period, +parathread_cores : pre.parathread_cores, +parathread_retries : pre.parathread_retries, +group_rotation_frequency : pre.group_rotation_frequency, +chain_availability_period : pre.chain_availability_period, +thread_availability_period : pre.thread_availability_period, +scheduling_lookahead : pre.scheduling_lookahead, +max_validators_per_core : pre.max_validators_per_core, +max_validators : pre.max_validators, +dispute_period : pre.dispute_period, +dispute_post_conclusion_acceptance_period: pre.dispute_post_conclusion_acceptance_period, +dispute_max_spam_slots : pre.dispute_max_spam_slots, +dispute_conclusion_by_time_out_period : pre.dispute_conclusion_by_time_out_period, +no_show_slots : pre.no_show_slots, +n_delay_tranches : pre.n_delay_tranches, +zeroth_delay_tranche_width : pre.zeroth_delay_tranche_width, +needed_approvals : pre.needed_approvals, +relay_vrf_modulo_samples : pre.relay_vrf_modulo_samples, + +ump_max_individual_weight: >>::default().ump_max_individual_weight, + } + }; + + if let Err(_) = as Store>::ActiveConfig::translate(|pre| pre.map(translate)) { + // `Err` is returned when the pre-migration type cannot be deserialized. This + // cannot happen if the migration runs correctly, i.e. against the expected version. + // + // This happening almost surely will lead to a panic somewhere else. Corruption seems + // to be unlikely to be caused by this. So we just log. Maybe it'll work out still? + log::error!( + target: configuration::LOG_TARGET, + "unexpected error when performing translation of the configuration type during storage upgrade to v1." + ); + } + + T::DbWeight::get().reads_writes(1, 1) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::{new_test_ext, Test}; + + #[test] + fn v0_deserialized_from_actual_data() { + // Fetched at Kusama 9,207,703 (0xbfe5227324c08b3ab67e0473a360acbce43efbd7b42041d0033adaf9ff2c5330) + // + // This exceeds the maximal line width length, but that's fine, since this is not code and + // doesn't need to be read and also leaving it as one line allows to easily copy it. + let raw_config = hex_literal::hex!["0000a000005000000a00000000c8000000c800000a0000000a00000040380000580200000000500000c8000000e87648170000000a0000000000000048000000c09e5d9a2f3d00000000000000000000c09e5d9a2f3d00000000000000000000e8030000009001000a00000000000000009001008070000000000000000000000a0000000a0000000a00000001000000010500000001c8000000060000005802000002000000580200000200000059000000000000001e00000028000000"]; + + let v0 = v0::HostConfiguration::::decode(&mut &raw_config[..]) + .unwrap(); + + // We check only a sample of the values here. If we missed any fields or messed up data types + // that would skew all the fields coming after. + assert_eq!(v0.max_code_size, 10_485_760); + assert_eq!(v0.validation_upgrade_frequency, 14_400); + assert_eq!(v0.max_pov_size, 5_242_880); + assert_eq!(v0._hrmp_open_request_ttl, 72); + assert_eq!(v0.hrmp_channel_max_message_size, 102_400); + assert_eq!(v0.dispute_max_spam_slots, 2); + assert_eq!(v0.n_delay_tranches, 89); + assert_eq!(v0.relay_vrf_modulo_samples, 40); + } + + #[test] + fn test_migrate_to_v1() { + // Host configuration has lots of fields. However, in this migration we add one and remove one + // field. The most important part to check are a couple of the last fields. We also pick + // extra fields to check arbitrarily, e.g. depending on their position (i.e. the middle) and + // also their type. + // + // We specify only the picked fields and the rest should be provided by the `Default` + // implementation. That implementation is copied over between the two types and should work + // fine. + let v0 = v0::HostConfiguration:: { + relay_vrf_modulo_samples: 0xFEEDBEEFu32, + needed_approvals: 69, + thread_availability_period: 55, + hrmp_recipient_deposit: 1337, + max_pov_size: 1111, + ..Default::default() + }; + + new_test_ext(Default::default()).execute_with(|| { + // Implant the v0 version in the state. + frame_support::storage::unhashed::put_raw( + &configuration::ActiveConfig::::hashed_key(), + &v0.encode(), + ); + + migrate_to_v1::(); + + let v1 = configuration::ActiveConfig::::get(); + + // The same motivation as for the migration code. See `migrate_to_v1`. + #[rustfmt::skip] + { + assert_eq!(v0.max_code_size , v1.max_code_size); + assert_eq!(v0.max_head_data_size , v1.max_head_data_size); + assert_eq!(v0.max_upward_queue_count , v1.max_upward_queue_count); + assert_eq!(v0.max_upward_queue_size , v1.max_upward_queue_size); + assert_eq!(v0.max_upward_message_size , v1.max_upward_message_size); + assert_eq!(v0.max_upward_message_num_per_candidate , v1.max_upward_message_num_per_candidate); + assert_eq!(v0.hrmp_max_message_num_per_candidate , v1.hrmp_max_message_num_per_candidate); + assert_eq!(v0.validation_upgrade_frequency , v1.validation_upgrade_frequency); + assert_eq!(v0.validation_upgrade_delay , v1.validation_upgrade_delay); + assert_eq!(v0.max_pov_size , v1.max_pov_size); + assert_eq!(v0.max_downward_message_size , v1.max_downward_message_size); + assert_eq!(v0.ump_service_total_weight , v1.ump_service_total_weight); + assert_eq!(v0.hrmp_max_parachain_outbound_channels , v1.hrmp_max_parachain_outbound_channels); + assert_eq!(v0.hrmp_max_parathread_outbound_channels , v1.hrmp_max_parathread_outbound_channels); + assert_eq!(v0.hrmp_sender_deposit , v1.hrmp_sender_deposit); + assert_eq!(v0.hrmp_recipient_deposit , v1.hrmp_recipient_deposit); + assert_eq!(v0.hrmp_channel_max_capacity , v1.hrmp_channel_max_capacity); + assert_eq!(v0.hrmp_channel_max_total_size , v1.hrmp_channel_max_total_size); + assert_eq!(v0.hrmp_max_parachain_inbound_channels , v1.hrmp_max_parachain_inbound_channels); + assert_eq!(v0.hrmp_max_parathread_inbound_channels , v1.hrmp_max_parathread_inbound_channels); + assert_eq!(v0.hrmp_channel_max_message_size , v1.hrmp_channel_max_message_size); + assert_eq!(v0.code_retention_period , v1.code_retention_period); + assert_eq!(v0.parathread_cores , v1.parathread_cores); + assert_eq!(v0.parathread_retries , v1.parathread_retries); + assert_eq!(v0.group_rotation_frequency , v1.group_rotation_frequency); + assert_eq!(v0.chain_availability_period , v1.chain_availability_period); + assert_eq!(v0.thread_availability_period , v1.thread_availability_period); + assert_eq!(v0.scheduling_lookahead , v1.scheduling_lookahead); + assert_eq!(v0.max_validators_per_core , v1.max_validators_per_core); + assert_eq!(v0.max_validators , v1.max_validators); + assert_eq!(v0.dispute_period , v1.dispute_period); + assert_eq!(v0.dispute_post_conclusion_acceptance_period, v1.dispute_post_conclusion_acceptance_period); + assert_eq!(v0.dispute_max_spam_slots , v1.dispute_max_spam_slots); + assert_eq!(v0.dispute_conclusion_by_time_out_period , v1.dispute_conclusion_by_time_out_period); + assert_eq!(v0.no_show_slots , v1.no_show_slots); + assert_eq!(v0.n_delay_tranches , v1.n_delay_tranches); + assert_eq!(v0.zeroth_delay_tranche_width , v1.zeroth_delay_tranche_width); + assert_eq!(v0.needed_approvals , v1.needed_approvals); + assert_eq!(v0.relay_vrf_modulo_samples , v1.relay_vrf_modulo_samples); + + assert_eq!(v1.ump_max_individual_weight, 20_000_000_000); + }; // ; makes this a statement. `rustfmt::skip` cannot be put on an expression. + }); + } +} diff --git a/runtime/parachains/src/configuration/weights.rs b/runtime/parachains/src/configuration/weights.rs new file mode 100644 index 000000000000..da70d6cb29d1 --- /dev/null +++ b/runtime/parachains/src/configuration/weights.rs @@ -0,0 +1,82 @@ + +//! Autogenerated weights for `runtime_parachains::configuration` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-17, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/polkadot +// benchmark +// --chain +// westend-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet +// runtime_parachains::configuration +// --steps +// 50 +// --repeat +// 20 +// --raw +// --extrinsic +// * +// --output +// runtime/parachains/src/configuration/weights.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_parachains::configuration`. +pub struct WeightInfo(PhantomData); +impl super::WeightInfo for WeightInfo { + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_block_number() -> Weight { + (16_730_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_u32() -> Weight { + (16_592_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_option_u32() -> Weight { + (16_419_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_weight() -> Weight { + (16_732_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Benchmark Override (r:0 w:0) + fn set_hrmp_open_request_ttl() -> Weight { + (2_000_000_000_000 as Weight) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_balance() -> Weight { + (16_752_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/parachains/src/disputes.rs b/runtime/parachains/src/disputes.rs index 43388c64b01c..1ec5515667fb 100644 --- a/runtime/parachains/src/disputes.rs +++ b/runtime/parachains/src/disputes.rs @@ -23,6 +23,7 @@ use crate::{ }; use bitvec::{bitvec, order::Lsb0 as BitOrderLsb0}; use frame_support::{ensure, traits::Get, weights::Weight}; +use frame_system::pallet_prelude::*; use parity_scale_codec::{Decode, Encode}; use primitives::v1::{ byzantine_threshold, supermajority_threshold, ApprovalVote, CandidateHash, CompactStatement, @@ -30,21 +31,27 @@ use primitives::v1::{ InvalidDisputeStatementKind, MultiDisputeStatementSet, SessionIndex, SigningContext, ValidDisputeStatementKind, ValidatorId, ValidatorIndex, ValidatorSignature, }; +use scale_info::TypeInfo; use sp_runtime::{ traits::{AppVerify, One, Saturating, Zero}, DispatchError, RuntimeDebug, SaturatedConversion, }; use sp_std::{collections::btree_set::BTreeSet, prelude::*}; +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; + +pub use crate::Origin as ParachainOrigin; + /// Whether the dispute is local or remote. -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] pub enum DisputeLocation { Local, Remote, } /// The result of a dispute, whether the candidate is deemed valid (for) or invalid (against). -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] pub enum DisputeResult { Valid, Invalid, @@ -122,9 +129,8 @@ pub trait DisputesHandler { included_in: BlockNumber, ); - /// Whether the given candidate could be invalid, i.e. there is an ongoing - /// or concluded dispute with supermajority-against. - fn could_be_invalid(session: SessionIndex, candidate_hash: CandidateHash) -> bool; + /// Whether the given candidate concluded invalid in a dispute with supermajority. + fn concluded_invalid(session: SessionIndex, candidate_hash: CandidateHash) -> bool; /// Called by the initializer to initialize the configuration module. fn initializer_initialize(now: BlockNumber) -> Weight; @@ -158,7 +164,7 @@ impl DisputesHandler for () { ) { } - fn could_be_invalid(_session: SessionIndex, _candidate_hash: CandidateHash) -> bool { + fn concluded_invalid(_session: SessionIndex, _candidate_hash: CandidateHash) -> bool { false } @@ -194,8 +200,8 @@ impl DisputesHandler for pallet::Pallet { pallet::Pallet::::note_included(session, candidate_hash, included_in) } - fn could_be_invalid(session: SessionIndex, candidate_hash: CandidateHash) -> bool { - pallet::Pallet::::could_be_invalid(session, candidate_hash) + fn concluded_invalid(session: SessionIndex, candidate_hash: CandidateHash) -> bool { + pallet::Pallet::::concluded_invalid(session, candidate_hash) } fn initializer_initialize(now: T::BlockNumber) -> Weight { @@ -211,6 +217,17 @@ impl DisputesHandler for pallet::Pallet { } } +pub trait WeightInfo { + fn force_unfreeze() -> Weight; +} + +pub struct TestWeightInfo; +impl WeightInfo for TestWeightInfo { + fn force_unfreeze() -> Weight { + 0 + } +} + pub use pallet::*; #[frame_support::pallet] pub mod pallet { @@ -222,6 +239,9 @@ pub mod pallet { type Event: From> + IsType<::Event>; type RewardValidators: RewardValidators; type PunishValidators: PunishValidators; + + /// Weight information for extrinsics in this pallet. + type WeightInfo: WeightInfo; } #[pallet::pallet] @@ -284,8 +304,8 @@ pub mod pallet { DisputeTimedOut(CandidateHash), /// A dispute has concluded with supermajority against a candidate. /// Block authors should no longer build on top of this head and should - /// instead revert to the block at the given height which is the last - /// known valid block in this chain. + /// instead revert the block at the given height. This should be the + /// number of the child of the last known valid block in the chain. Revert(T::BlockNumber), } @@ -303,6 +323,21 @@ pub mod pallet { DuplicateStatement, /// Too many spam slots used by some specific validator. PotentialSpam, + /// A dispute where there are only votes on one side. + SingleSidedDispute, + } + + #[pallet::origin] + pub type Origin = ParachainOrigin; + + #[pallet::call] + impl Pallet { + #[pallet::weight(::WeightInfo::force_unfreeze())] + pub fn force_unfreeze(origin: OriginFor) -> DispatchResult { + ensure_root(origin)?; + Frozen::::set(None); + Ok(()) + } } } @@ -380,6 +415,13 @@ impl From for Error { } } +#[derive(RuntimeDebug, PartialEq, Eq)] +struct ImportUndo { + validator_index: ValidatorIndex, + valid: bool, + new_participant: bool, +} + struct DisputeStateImporter { state: DisputeState, now: BlockNumber, @@ -395,7 +437,11 @@ impl DisputeStateImporter { DisputeStateImporter { state, now, new_participants, pre_flags } } - fn import(&mut self, validator: ValidatorIndex, valid: bool) -> Result<(), VoteImportError> { + fn import( + &mut self, + validator: ValidatorIndex, + valid: bool, + ) -> Result { let (bits, other_bits) = if valid { (&mut self.state.validators_for, &mut self.state.validators_against) } else { @@ -414,16 +460,31 @@ impl DisputeStateImporter { return Err(VoteImportError::ValidatorIndexOutOfBounds) } + let mut undo = ImportUndo { validator_index: validator, valid, new_participant: false }; + bits.set(validator.0 as usize, true); // New participants tracks those which didn't appear on either // side of the dispute until now. So we check the other side // and checked the first side before. if other_bits.get(validator.0 as usize).map_or(false, |b| !*b) { + undo.new_participant = true; self.new_participants.set(validator.0 as usize, true); } - Ok(()) + Ok(undo) + } + + fn undo(&mut self, undo: ImportUndo) { + if undo.valid { + self.state.validators_for.set(undo.validator_index.0 as usize, false); + } else { + self.state.validators_against.set(undo.validator_index.0 as usize, false); + } + + if undo.new_participant { + self.new_participants.set(undo.validator_index.0 as usize, false); + } } fn finish(mut self) -> ImportSummary { @@ -757,10 +818,13 @@ impl Pallet { let valid = statement.indicates_validity(); - if let Err(_) = importer.import(*validator_index, valid) { - filter.remove_index(i); - continue - } + let undo = match importer.import(*validator_index, valid) { + Ok(u) => u, + Err(_) => { + filter.remove_index(i); + continue + }, + }; // Check signature after attempting import. // @@ -778,6 +842,7 @@ impl Pallet { statement, signature, ) { + importer.undo(undo); filter.remove_index(i); continue } @@ -786,6 +851,13 @@ impl Pallet { importer.finish() }; + // Reject disputes which don't have at least one vote on each side. + if summary.state.validators_for.count_ones() == 0 || + summary.state.validators_against.count_ones() == 0 + { + return StatementSetFilter::RemoveAll + } + // Apply spam slot changes. Bail early if too many occupied. let is_local = >::contains_key(&set.session, &set.candidate_hash); if !is_local { @@ -918,6 +990,13 @@ impl Pallet { importer.finish() }; + // Reject disputes which don't have at least one vote on each side. + ensure!( + summary.state.validators_for.count_ones() > 0 && + summary.state.validators_against.count_ones() > 0, + Error::::SingleSidedDispute, + ); + // Apply spam slot changes. Bail early if too many occupied. let is_local = >::contains_key(&set.session, &set.candidate_hash); if !is_local { @@ -1034,10 +1113,10 @@ impl Pallet { } } - pub(crate) fn could_be_invalid(session: SessionIndex, candidate_hash: CandidateHash) -> bool { + pub(crate) fn concluded_invalid(session: SessionIndex, candidate_hash: CandidateHash) -> bool { >::get(&session, &candidate_hash).map_or(false, |dispute| { - // A dispute that is ongoing or has concluded with supermajority-against. - dispute.concluded_at.is_none() || has_supermajority_against(&dispute) + // A dispute that has concluded with supermajority-against. + has_supermajority_against(&dispute) }) } @@ -1048,9 +1127,14 @@ impl Pallet { pub(crate) fn revert_and_freeze(revert_to: T::BlockNumber) { if Self::last_valid_block().map_or(true, |last| last > revert_to) { Frozen::::set(Some(revert_to)); - Self::deposit_event(Event::Revert(revert_to)); + + // The `Revert` log is about reverting a block, not reverting to a block. + // If we want to revert to block X in the current chain, we need to revert + // block X+1. + let revert = revert_to + One::one(); + Self::deposit_event(Event::Revert(revert)); frame_system::Pallet::::deposit_log( - ConsensusLog::Revert(revert_to.saturated_into()).into(), + ConsensusLog::Revert(revert.saturated_into()).into(), ); } } @@ -1382,15 +1466,14 @@ mod tests { }; new_test_ext(mock_genesis_config).execute_with(|| { + // We need 6 validators for the byzantine threshold to be 2 let v0 = ::Pair::generate().0; let v1 = ::Pair::generate().0; let v2 = ::Pair::generate().0; let v3 = ::Pair::generate().0; - - // NOTE: v0 index will be 0 - // NOTE: v1 index will be 3 - // NOTE: v2 index will be 2 - // NOTE: v3 index will be 1 + let v4 = ::Pair::generate().0; + let v5 = ::Pair::generate().0; + let v6 = ::Pair::generate().0; run_to_block(start, |b| { // a new session at each block @@ -1402,52 +1485,72 @@ mod tests { (&1, v1.public()), (&2, v2.public()), (&3, v3.public()), + (&4, v4.public()), + (&5, v5.public()), + (&6, v6.public()), ], Some(vec![ (&0, v0.public()), (&1, v1.public()), (&2, v2.public()), (&3, v3.public()), + (&4, v4.public()), + (&5, v5.public()), + (&6, v6.public()), ]), )) }); let candidate_hash = CandidateHash(sp_core::H256::repeat_byte(1)); - // v0 votes for 3 + // v0 votes for 3, v6 against. let stmts = vec![DisputeStatementSet { candidate_hash: candidate_hash.clone(), session: start - 1, - statements: vec![( - DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), - ValidatorIndex(0), - v0.sign( - &ExplicitDisputeStatement { - valid: true, - candidate_hash: candidate_hash.clone(), - session: start - 1, - } - .signing_payload(), + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(0), + v0.sign( + &ExplicitDisputeStatement { + valid: true, + candidate_hash: candidate_hash.clone(), + session: start - 1, + } + .signing_payload(), + ), ), - )], + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(6), + v2.sign( + &ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: start - 1, + } + .signing_payload(), + ), + ), + ], }]; assert_ok!( Pallet::::provide_multi_dispute_data(stmts), vec![(9, candidate_hash.clone())], ); - assert_eq!(SpamSlots::::get(start - 1), Some(vec![1, 0, 0, 0])); + assert_eq!(SpamSlots::::get(start - 1), Some(vec![1, 0, 0, 0, 0, 0, 1])); // Run to timeout period run_to_block(start + dispute_conclusion_by_time_out_period, |_| None); - assert_eq!(SpamSlots::::get(start - 1), Some(vec![1, 0, 0, 0])); + assert_eq!(SpamSlots::::get(start - 1), Some(vec![1, 0, 0, 0, 0, 0, 1])); // Run to timeout + 1 in order to executive on_finalize(timeout) run_to_block(start + dispute_conclusion_by_time_out_period + 1, |_| None); - assert_eq!(SpamSlots::::get(start - 1), Some(vec![0, 0, 0, 0])); + assert_eq!(SpamSlots::::get(start - 1), Some(vec![0, 0, 0, 0, 0, 0, 0])); assert_eq!( PUNISH_VALIDATORS_INCONCLUSIVE.with(|r| r.borrow()[0].clone()), - (9, vec![ValidatorIndex(0)]), + (9, vec![ValidatorIndex(0), ValidatorIndex(6)]), ); }); } @@ -1538,7 +1641,12 @@ mod tests { run_to_block(3, |b| { // a new session at each block if b == 1 { - Some((true, b, vec![(&0, v0.public())], Some(vec![(&0, v0.public())]))) + Some(( + true, + b, + vec![(&0, v0.public()), (&1, v1.public())], + Some(vec![(&0, v0.public()), (&1, v1.public())]), + )) } else { Some((true, b, vec![(&1, v1.public())], Some(vec![(&1, v1.public())]))) } @@ -1548,18 +1656,32 @@ mod tests { let stmts = vec![DisputeStatementSet { candidate_hash: candidate_hash.clone(), session: 1, - statements: vec![( - DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), - ValidatorIndex(0), - v0.sign( - &ExplicitDisputeStatement { - valid: true, - candidate_hash: candidate_hash.clone(), - session: 1, - } - .signing_payload(), + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(0), + v0.sign( + &ExplicitDisputeStatement { + valid: true, + candidate_hash: candidate_hash.clone(), + session: 1, + } + .signing_payload(), + ), ), - )], + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(1), + v1.sign( + &ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: 1, + } + .signing_payload(), + ), + ), + ], }]; assert_ok!( @@ -1596,10 +1718,16 @@ mod tests { fn test_freeze_on_note_included() { new_test_ext(Default::default()).execute_with(|| { let v0 = ::Pair::generate().0; + let v1 = ::Pair::generate().0; run_to_block(6, |b| { // a new session at each block - Some((true, b, vec![(&0, v0.public())], Some(vec![(&0, v0.public())]))) + Some(( + true, + b, + vec![(&0, v0.public()), (&1, v1.public())], + Some(vec![(&0, v0.public()), (&1, v1.public())]), + )) }); let candidate_hash = CandidateHash(sp_core::H256::repeat_byte(1)); @@ -1608,18 +1736,44 @@ mod tests { let stmts = vec![DisputeStatementSet { candidate_hash: candidate_hash.clone(), session: 3, - statements: vec![( - DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), - ValidatorIndex(0), - v0.sign( - &ExplicitDisputeStatement { - valid: false, - candidate_hash: candidate_hash.clone(), - session: 3, - } - .signing_payload(), + statements: vec![ + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(0), + v0.sign( + &ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: 3, + } + .signing_payload(), + ), ), - )], + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(1), + v1.sign( + &ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: 3, + } + .signing_payload(), + ), + ), + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(1), + v1.sign( + &ExplicitDisputeStatement { + valid: true, + candidate_hash: candidate_hash.clone(), + session: 3, + } + .signing_payload(), + ), + ), + ], }]; assert!(Pallet::::provide_multi_dispute_data(stmts).is_ok()); @@ -1632,35 +1786,66 @@ mod tests { fn test_freeze_provided_against_supermajority_for_included() { new_test_ext(Default::default()).execute_with(|| { let v0 = ::Pair::generate().0; + let v1 = ::Pair::generate().0; run_to_block(6, |b| { // a new session at each block - Some((true, b, vec![(&0, v0.public())], Some(vec![(&0, v0.public())]))) + Some(( + true, + b, + vec![(&0, v0.public()), (&1, v1.public())], + Some(vec![(&0, v0.public()), (&1, v1.public())]), + )) }); let candidate_hash = CandidateHash(sp_core::H256::repeat_byte(1)); - Pallet::::note_included(3, candidate_hash.clone(), 3); - // v0 votes for 3 let stmts = vec![DisputeStatementSet { candidate_hash: candidate_hash.clone(), session: 3, - statements: vec![( - DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), - ValidatorIndex(0), - v0.sign( - &ExplicitDisputeStatement { - valid: false, - candidate_hash: candidate_hash.clone(), - session: 3, - } - .signing_payload(), + statements: vec![ + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(0), + v0.sign( + &ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: 3, + } + .signing_payload(), + ), ), - )], + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(1), + v1.sign( + &ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: 3, + } + .signing_payload(), + ), + ), + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(1), + v1.sign( + &ExplicitDisputeStatement { + valid: true, + candidate_hash: candidate_hash.clone(), + session: 3, + } + .signing_payload(), + ), + ), + ], }]; - assert!(Pallet::::provide_multi_dispute_data(stmts).is_ok()); + Pallet::::note_included(3, candidate_hash.clone(), 3); + assert!(Pallet::::provide_multi_dispute_data(stmts).is_ok()); assert_eq!(Frozen::::get(), Some(2)); }); } @@ -1675,15 +1860,22 @@ mod tests { #[test] fn test_provide_multi_dispute_success_and_other() { new_test_ext(Default::default()).execute_with(|| { + // 7 validators needed for byzantine threshold of 2. let v0 = ::Pair::generate().0; let v1 = ::Pair::generate().0; let v2 = ::Pair::generate().0; let v3 = ::Pair::generate().0; - - // NOTE: v0 index will be 0 - // NOTE: v1 index will be 3 - // NOTE: v2 index will be 2 - // NOTE: v3 index will be 1 + let v4 = ::Pair::generate().0; + let v5 = ::Pair::generate().0; + let v6 = ::Pair::generate().0; + + // v0 -> 0 + // v1 -> 3 + // v2 -> 6 + // v3 -> 5 + // v4 -> 1 + // v5 -> 4 + // v6 -> 2 run_to_block(6, |b| { // a new session at each block @@ -1695,47 +1887,97 @@ mod tests { (&1, v1.public()), (&2, v2.public()), (&3, v3.public()), + (&4, v4.public()), + (&5, v5.public()), + (&6, v6.public()), ], Some(vec![ (&0, v0.public()), (&1, v1.public()), (&2, v2.public()), (&3, v3.public()), + (&4, v4.public()), + (&5, v5.public()), + (&6, v6.public()), ]), )) }); let candidate_hash = CandidateHash(sp_core::H256::repeat_byte(1)); - // v0 votes for 3 + // v0 votes for 3, v6 votes against let stmts = vec![DisputeStatementSet { candidate_hash: candidate_hash.clone(), session: 3, - statements: vec![( - DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), - ValidatorIndex(0), - v0.sign( - &ExplicitDisputeStatement { - valid: true, - candidate_hash: candidate_hash.clone(), - session: 3, - } - .signing_payload(), + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(0), + v0.sign( + &ExplicitDisputeStatement { + valid: true, + candidate_hash: candidate_hash.clone(), + session: 3, + } + .signing_payload(), + ), ), - )], + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(2), + v6.sign( + &ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: 3, + } + .signing_payload(), + ), + ), + ], }]; assert_ok!( Pallet::::provide_multi_dispute_data(stmts), vec![(3, candidate_hash.clone())], ); - assert_eq!(SpamSlots::::get(3), Some(vec![1, 0, 0, 0])); + assert_eq!(SpamSlots::::get(3), Some(vec![1, 0, 1, 0, 0, 0, 0])); - // v1 votes for 4 and for 3 + // v1 votes for 4 and for 3, v6 votes against 4. let stmts = vec![ DisputeStatementSet { candidate_hash: candidate_hash.clone(), session: 4, + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(3), + v1.sign( + &ExplicitDisputeStatement { + valid: true, + candidate_hash: candidate_hash.clone(), + session: 4, + } + .signing_payload(), + ), + ), + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(2), + v6.sign( + &ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: 4, + } + .signing_payload(), + ), + ), + ], + }, + DisputeStatementSet { + candidate_hash: candidate_hash.clone(), + session: 3, statements: vec![( DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), ValidatorIndex(3), @@ -1743,23 +1985,7 @@ mod tests { &ExplicitDisputeStatement { valid: true, candidate_hash: candidate_hash.clone(), - session: 4, - } - .signing_payload(), - ), - )], - }, - DisputeStatementSet { - candidate_hash: candidate_hash.clone(), - session: 3, - statements: vec![( - DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), - ValidatorIndex(3), - v1.sign( - &ExplicitDisputeStatement { - valid: true, - candidate_hash: candidate_hash.clone(), - session: 3, + session: 3, } .signing_payload(), ), @@ -1771,17 +1997,17 @@ mod tests { Pallet::::provide_multi_dispute_data(stmts), vec![(4, candidate_hash.clone())], ); - assert_eq!(SpamSlots::::get(3), Some(vec![0, 0, 0, 0])); // Confirmed as no longer spam - assert_eq!(SpamSlots::::get(4), Some(vec![0, 0, 0, 1])); + assert_eq!(SpamSlots::::get(3), Some(vec![0, 0, 0, 0, 0, 0, 0])); // Confirmed as no longer spam + assert_eq!(SpamSlots::::get(4), Some(vec![0, 0, 1, 1, 0, 0, 0])); - // v3 votes against 3 and for 5 + // v3 votes against 3 and for 5, v6 votes against 5. let stmts = vec![ DisputeStatementSet { candidate_hash: candidate_hash.clone(), session: 3, statements: vec![( DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), - ValidatorIndex(1), + ValidatorIndex(5), v3.sign( &ExplicitDisputeStatement { valid: false, @@ -1795,36 +2021,50 @@ mod tests { DisputeStatementSet { candidate_hash: candidate_hash.clone(), session: 5, - statements: vec![( - DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), - ValidatorIndex(1), - v3.sign( - &ExplicitDisputeStatement { - valid: true, - candidate_hash: candidate_hash.clone(), - session: 5, - } - .signing_payload(), + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(5), + v3.sign( + &ExplicitDisputeStatement { + valid: true, + candidate_hash: candidate_hash.clone(), + session: 5, + } + .signing_payload(), + ), ), - )], + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(2), + v6.sign( + &ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: 5, + } + .signing_payload(), + ), + ), + ], }, ]; assert_ok!( Pallet::::provide_multi_dispute_data(stmts), vec![(5, candidate_hash.clone())], ); - assert_eq!(SpamSlots::::get(3), Some(vec![0, 0, 0, 0])); - assert_eq!(SpamSlots::::get(4), Some(vec![0, 0, 0, 1])); - assert_eq!(SpamSlots::::get(5), Some(vec![0, 1, 0, 0])); + assert_eq!(SpamSlots::::get(3), Some(vec![0, 0, 0, 0, 0, 0, 0])); + assert_eq!(SpamSlots::::get(4), Some(vec![0, 0, 1, 1, 0, 0, 0])); + assert_eq!(SpamSlots::::get(5), Some(vec![0, 0, 1, 0, 0, 1, 0])); - // v2 votes for 3 and againt 5 + // v2 votes for 3 and against 5 let stmts = vec![ DisputeStatementSet { candidate_hash: candidate_hash.clone(), session: 3, statements: vec![( DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), - ValidatorIndex(2), + ValidatorIndex(6), v2.sign( &ExplicitDisputeStatement { valid: true, @@ -1840,7 +2080,7 @@ mod tests { session: 5, statements: vec![( DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), - ValidatorIndex(2), + ValidatorIndex(6), v2.sign( &ExplicitDisputeStatement { valid: false, @@ -1853,55 +2093,87 @@ mod tests { }, ]; assert_ok!(Pallet::::provide_multi_dispute_data(stmts), vec![]); - assert_eq!(SpamSlots::::get(3), Some(vec![0, 0, 0, 0])); - assert_eq!(SpamSlots::::get(4), Some(vec![0, 0, 0, 1])); - assert_eq!(SpamSlots::::get(5), Some(vec![0, 0, 0, 0])); - - // v0 votes for 5 - let stmts = vec![DisputeStatementSet { - candidate_hash: candidate_hash.clone(), - session: 5, - statements: vec![( - DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), - ValidatorIndex(0), - v0.sign( - &ExplicitDisputeStatement { - valid: false, - candidate_hash: candidate_hash.clone(), - session: 5, - } - .signing_payload(), - ), - )], - }]; - - assert_ok!(Pallet::::provide_multi_dispute_data(stmts), vec![]); - assert_eq!(SpamSlots::::get(3), Some(vec![0, 0, 0, 0])); - assert_eq!(SpamSlots::::get(4), Some(vec![0, 0, 0, 1])); - assert_eq!(SpamSlots::::get(5), Some(vec![0, 0, 0, 0])); - - // v1 votes for 5 - let stmts = vec![DisputeStatementSet { - candidate_hash: candidate_hash.clone(), - session: 5, - statements: vec![( - DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), - ValidatorIndex(3), - v1.sign( - &ExplicitDisputeStatement { - valid: false, - candidate_hash: candidate_hash.clone(), - session: 5, - } - .signing_payload(), - ), - )], - }]; + assert_eq!(SpamSlots::::get(3), Some(vec![0, 0, 0, 0, 0, 0, 0])); + assert_eq!(SpamSlots::::get(4), Some(vec![0, 0, 1, 1, 0, 0, 0])); + assert_eq!(SpamSlots::::get(5), Some(vec![0, 0, 0, 0, 0, 0, 0])); + let stmts = vec![ + // 0, 4, and 5 vote against 5 + DisputeStatementSet { + candidate_hash: candidate_hash.clone(), + session: 5, + statements: vec![ + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(0), + v0.sign( + &ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: 5, + } + .signing_payload(), + ), + ), + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(1), + v4.sign( + &ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: 5, + } + .signing_payload(), + ), + ), + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(4), + v5.sign( + &ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: 5, + } + .signing_payload(), + ), + ), + ], + }, + // 4 and 5 vote for 3 + DisputeStatementSet { + candidate_hash: candidate_hash.clone(), + session: 3, + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(1), + v4.sign( + &ExplicitDisputeStatement { + valid: true, + candidate_hash: candidate_hash.clone(), + session: 3, + } + .signing_payload(), + ), + ), + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(4), + v5.sign( + &ExplicitDisputeStatement { + valid: true, + candidate_hash: candidate_hash.clone(), + session: 3, + } + .signing_payload(), + ), + ), + ], + }, + ]; assert_ok!(Pallet::::provide_multi_dispute_data(stmts), vec![]); - assert_eq!(SpamSlots::::get(3), Some(vec![0, 0, 0, 0])); - assert_eq!(SpamSlots::::get(4), Some(vec![0, 0, 0, 1])); - assert_eq!(SpamSlots::::get(5), Some(vec![0, 0, 0, 0])); assert_eq!( Pallet::::disputes(), @@ -1910,28 +2182,28 @@ mod tests { 5, candidate_hash.clone(), DisputeState { - validators_for: bitvec![BitOrderLsb0, u8; 0, 1, 0, 0], - validators_against: bitvec![BitOrderLsb0, u8; 1, 0, 1, 1], + validators_for: bitvec![BitOrderLsb0, u8; 0, 0, 0, 0, 0, 1, 0], + validators_against: bitvec![BitOrderLsb0, u8; 1, 1, 1, 0, 1, 0, 1], start: 6, - concluded_at: Some(6), // 3 vote against + concluded_at: Some(6), // 5 vote against } ), ( 3, candidate_hash.clone(), DisputeState { - validators_for: bitvec![BitOrderLsb0, u8; 1, 0, 1, 1], - validators_against: bitvec![BitOrderLsb0, u8; 0, 1, 0, 0], + validators_for: bitvec![BitOrderLsb0, u8; 1, 1, 0, 1, 1, 0, 1], + validators_against: bitvec![BitOrderLsb0, u8; 0, 0, 1, 0, 0, 1, 0], start: 6, - concluded_at: Some(6), // 3 vote for + concluded_at: Some(6), // 5 vote for } ), ( 4, candidate_hash.clone(), DisputeState { - validators_for: bitvec![BitOrderLsb0, u8; 0, 0, 0, 1], - validators_against: bitvec![BitOrderLsb0, u8; 0, 0, 0, 0], + validators_for: bitvec![BitOrderLsb0, u8; 0, 0, 0, 1, 0, 0, 0], + validators_against: bitvec![BitOrderLsb0, u8; 0, 0, 1, 0, 0, 0, 0], start: 6, concluded_at: None, } @@ -1939,28 +2211,28 @@ mod tests { ] ); - assert_eq!(Pallet::::could_be_invalid(3, candidate_hash.clone()), false); // It has 3 votes for - assert_eq!(Pallet::::could_be_invalid(4, candidate_hash.clone()), true); - assert_eq!(Pallet::::could_be_invalid(5, candidate_hash.clone()), true); + assert!(!Pallet::::concluded_invalid(3, candidate_hash.clone())); + assert!(!Pallet::::concluded_invalid(4, candidate_hash.clone())); + assert!(Pallet::::concluded_invalid(5, candidate_hash.clone())); // Ensure inclusion removes spam slots - assert_eq!(SpamSlots::::get(4), Some(vec![0, 0, 0, 1])); + assert_eq!(SpamSlots::::get(4), Some(vec![0, 0, 1, 1, 0, 0, 0])); Pallet::::note_included(4, candidate_hash.clone(), 4); - assert_eq!(SpamSlots::::get(4), Some(vec![0, 0, 0, 0])); + assert_eq!(SpamSlots::::get(4), Some(vec![0, 0, 0, 0, 0, 0, 0])); // Ensure the reward_validator function was correctly called assert_eq!( REWARD_VALIDATORS.with(|r| r.borrow().clone()), vec![ - (3, vec![ValidatorIndex(0)]), - (4, vec![ValidatorIndex(3)]), + (3, vec![ValidatorIndex(0), ValidatorIndex(2)]), + (4, vec![ValidatorIndex(2), ValidatorIndex(3)]), (3, vec![ValidatorIndex(3)]), - (3, vec![ValidatorIndex(1)]), - (5, vec![ValidatorIndex(1)]), - (3, vec![ValidatorIndex(2)]), - (5, vec![ValidatorIndex(2)]), - (5, vec![ValidatorIndex(0)]), - (5, vec![ValidatorIndex(3)]), + (3, vec![ValidatorIndex(5)]), + (5, vec![ValidatorIndex(2), ValidatorIndex(5)]), + (3, vec![ValidatorIndex(6)]), + (5, vec![ValidatorIndex(6)]), + (5, vec![ValidatorIndex(0), ValidatorIndex(1), ValidatorIndex(4)]), + (3, vec![ValidatorIndex(1), ValidatorIndex(4)]), ], ); @@ -1973,10 +2245,10 @@ mod tests { (3, vec![]), (3, vec![]), (5, vec![]), - (3, vec![ValidatorIndex(1)]), - (5, vec![]), + (3, vec![]), (5, vec![]), (5, vec![]), + (3, vec![ValidatorIndex(2), ValidatorIndex(5)]), ], ); @@ -1991,8 +2263,8 @@ mod tests { (5, vec![]), (3, vec![]), (5, vec![]), - (5, vec![]), - (5, vec![ValidatorIndex(1)]), + (5, vec![ValidatorIndex(5)]), + (3, vec![]), ], ); }) @@ -2017,8 +2289,8 @@ mod tests { Pallet::::revert_and_freeze(0); assert_eq!(Frozen::::get(), Some(0)); - assert_eq!(System::digest().logs[0], ConsensusLog::Revert(0).into()); - System::assert_has_event(Event::Revert(0).into()); + assert_eq!(System::digest().logs[0], ConsensusLog::Revert(1).into()); + System::assert_has_event(Event::Revert(1).into()); }) } @@ -2504,10 +2776,16 @@ mod tests { fn filter_removes_duplicates_within_set() { new_test_ext(Default::default()).execute_with(|| { let v0 = ::Pair::generate().0; + let v1 = ::Pair::generate().0; run_to_block(3, |b| { // a new session at each block - Some((true, b, vec![(&0, v0.public())], Some(vec![(&0, v0.public())]))) + Some(( + true, + b, + vec![(&0, v0.public()), (&1, v1.public())], + Some(vec![(&0, v0.public()), (&1, v1.public())]), + )) }); let candidate_hash = CandidateHash(sp_core::H256::repeat_byte(1)); @@ -2519,9 +2797,17 @@ mod tests { } .signing_payload(); + let payload_against = ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash.clone(), + session: 1, + } + .signing_payload(); + let sig_a = v0.sign(&payload); let sig_b = v0.sign(&payload); let sig_c = v0.sign(&payload); + let sig_d = v1.sign(&payload_against); let mut statements = vec![DisputeStatementSet { candidate_hash: candidate_hash.clone(), @@ -2542,6 +2828,11 @@ mod tests { ValidatorIndex(0), sig_c, ), + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(1), + sig_d.clone(), + ), ], }]; @@ -2552,16 +2843,87 @@ mod tests { vec![DisputeStatementSet { candidate_hash: candidate_hash.clone(), session: 1, - statements: vec![( - DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), - ValidatorIndex(0), - sig_a, - ),] + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(0), + sig_a, + ), + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(1), + sig_d, + ), + ] }] ) }) } + #[test] + fn filter_bad_signatures_correctly_detects_single_sided() { + new_test_ext(Default::default()).execute_with(|| { + let v0 = ::Pair::generate().0; + let v1 = ::Pair::generate().0; + let v2 = ::Pair::generate().0; + let v3 = ::Pair::generate().0; + + run_to_block(3, |b| { + // a new session at each block + Some(( + true, + b, + vec![ + (&0, v0.public()), + (&1, v1.public()), + (&2, v2.public()), + (&3, v3.public()), + ], + Some(vec![ + (&0, v0.public()), + (&1, v1.public()), + (&2, v2.public()), + (&3, v3.public()), + ]), + )) + }); + + let candidate_hash_a = CandidateHash(sp_core::H256::repeat_byte(1)); + + let payload = |c_hash: &CandidateHash, valid| { + ExplicitDisputeStatement { valid, candidate_hash: c_hash.clone(), session: 1 } + .signing_payload() + }; + + let payload_a = payload(&candidate_hash_a, true); + let payload_a_bad = payload(&candidate_hash_a, false); + + let sig_0 = v0.sign(&payload_a); + let sig_1 = v1.sign(&payload_a_bad); + + let mut statements = vec![DisputeStatementSet { + candidate_hash: candidate_hash_a.clone(), + session: 1, + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(0), + sig_0.clone(), + ), + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(2), + sig_1.clone(), + ), + ], + }]; + + Pallet::::filter_multi_dispute_data(&mut statements); + + assert!(statements.is_empty()); + }) + } + #[test] fn filter_correctly_accounts_spam_slots() { let dispute_max_spam_slots = 2; @@ -2575,10 +2937,14 @@ mod tests { }; new_test_ext(mock_genesis_config).execute_with(|| { + // We need 7 validators for the byzantine threshold to be 2 let v0 = ::Pair::generate().0; let v1 = ::Pair::generate().0; let v2 = ::Pair::generate().0; let v3 = ::Pair::generate().0; + let v4 = ::Pair::generate().0; + let v5 = ::Pair::generate().0; + let v6 = ::Pair::generate().0; run_to_block(3, |b| { // a new session at each block @@ -2590,12 +2956,18 @@ mod tests { (&1, v1.public()), (&2, v2.public()), (&3, v3.public()), + (&4, v4.public()), + (&5, v5.public()), + (&6, v6.public()), ], Some(vec![ (&0, v0.public()), (&1, v1.public()), (&2, v2.public()), (&3, v3.public()), + (&4, v4.public()), + (&5, v5.public()), + (&6, v6.public()), ]), )) }); @@ -2604,26 +2976,18 @@ mod tests { let candidate_hash_b = CandidateHash(sp_core::H256::repeat_byte(2)); let candidate_hash_c = CandidateHash(sp_core::H256::repeat_byte(3)); - let payload_a = ExplicitDisputeStatement { - valid: true, - candidate_hash: candidate_hash_a.clone(), - session: 1, - } - .signing_payload(); + let payload = |c_hash: &CandidateHash, valid| { + ExplicitDisputeStatement { valid, candidate_hash: c_hash.clone(), session: 1 } + .signing_payload() + }; - let payload_b = ExplicitDisputeStatement { - valid: true, - candidate_hash: candidate_hash_b.clone(), - session: 1, - } - .signing_payload(); + let payload_a = payload(&candidate_hash_a, true); + let payload_b = payload(&candidate_hash_b, true); + let payload_c = payload(&candidate_hash_c, true); - let payload_c = ExplicitDisputeStatement { - valid: true, - candidate_hash: candidate_hash_c.clone(), - session: 1, - } - .signing_payload(); + let payload_a_bad = payload(&candidate_hash_a, false); + let payload_b_bad = payload(&candidate_hash_b, false); + let payload_c_bad = payload(&candidate_hash_c, false); let sig_0a = v0.sign(&payload_a); let sig_0b = v0.sign(&payload_b); @@ -2631,16 +2995,29 @@ mod tests { let sig_1b = v1.sign(&payload_b); + let sig_2a = v2.sign(&payload_a_bad); + let sig_2b = v2.sign(&payload_b_bad); + let sig_2c = v2.sign(&payload_c_bad); + let mut statements = vec![ + // validators 0 and 2 get 1 spam slot from this. DisputeStatementSet { candidate_hash: candidate_hash_a.clone(), session: 1, - statements: vec![( - DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), - ValidatorIndex(0), - sig_0a.clone(), - )], + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(0), + sig_0a.clone(), + ), + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(6), + sig_2a.clone(), + ), + ], }, + // Validators 0, 2, and 3 get no spam slots for this DisputeStatementSet { candidate_hash: candidate_hash_b.clone(), session: 1, @@ -2655,16 +3032,29 @@ mod tests { ValidatorIndex(3), sig_1b.clone(), ), + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(6), + sig_2b.clone(), + ), ], }, + // Validators 0 and 2 get an extra spam slot for this. DisputeStatementSet { candidate_hash: candidate_hash_c.clone(), session: 1, - statements: vec![( - DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), - ValidatorIndex(0), - sig_0c.clone(), - )], + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(0), + sig_0c.clone(), + ), + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(6), + sig_2c.clone(), + ), + ], }, ]; @@ -2743,7 +3133,7 @@ mod tests { &candidate_hash_a, DisputeState { validators_for: bitvec![BitOrderLsb0, u8; 0; 4], - validators_against: bitvec![BitOrderLsb0, u8; 0; 4], + validators_against: bitvec![BitOrderLsb0, u8; 1; 4], start: 0, concluded_at: Some(0), }, @@ -2754,7 +3144,7 @@ mod tests { &candidate_hash_b, DisputeState { validators_for: bitvec![BitOrderLsb0, u8; 0; 4], - validators_against: bitvec![BitOrderLsb0, u8; 0; 4], + validators_against: bitvec![BitOrderLsb0, u8; 1; 4], start: 0, concluded_at: Some(1), }, @@ -2819,10 +3209,16 @@ mod tests { fn filter_removes_duplicate_statements_sets() { new_test_ext(Default::default()).execute_with(|| { let v0 = ::Pair::generate().0; + let v1 = ::Pair::generate().0; run_to_block(3, |b| { // a new session at each block - Some((true, b, vec![(&0, v0.public())], Some(vec![(&0, v0.public())]))) + Some(( + true, + b, + vec![(&0, v0.public()), (&1, v1.public())], + Some(vec![(&0, v0.public()), (&1, v1.public())]), + )) }); let candidate_hash_a = CandidateHash(sp_core::H256::repeat_byte(1)); @@ -2834,27 +3230,51 @@ mod tests { } .signing_payload(); + let payload_against = ExplicitDisputeStatement { + valid: false, + candidate_hash: candidate_hash_a.clone(), + session: 1, + } + .signing_payload(); + let sig_a = v0.sign(&payload); + let sig_a_against = v1.sign(&payload_against); + let sig_b = v0.sign(&payload); + let sig_b_against = v1.sign(&payload_against); let mut statements = vec![ DisputeStatementSet { candidate_hash: candidate_hash_a.clone(), session: 1, - statements: vec![( - DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), - ValidatorIndex(0), - sig_a.clone(), - )], + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(0), + sig_a.clone(), + ), + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(1), + sig_a_against.clone(), + ), + ], }, DisputeStatementSet { candidate_hash: candidate_hash_a.clone(), session: 1, - statements: vec![( - DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), - ValidatorIndex(0), - sig_b.clone(), - )], + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(0), + sig_b.clone(), + ), + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(1), + sig_b_against.clone(), + ), + ], }, ]; @@ -2865,13 +3285,95 @@ mod tests { vec![DisputeStatementSet { candidate_hash: candidate_hash_a.clone(), session: 1, - statements: vec![( - DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), - ValidatorIndex(0), - sig_a, - ),] + statements: vec![ + ( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(0), + sig_a.clone(), + ), + ( + DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), + ValidatorIndex(1), + sig_a_against.clone(), + ), + ], }] ); }) } + + #[test] + fn filter_ignores_single_sided() { + new_test_ext(Default::default()).execute_with(|| { + let v0 = ::Pair::generate().0; + + run_to_block(3, |b| { + // a new session at each block + Some((true, b, vec![(&0, v0.public())], Some(vec![(&0, v0.public())]))) + }); + + let candidate_hash_a = CandidateHash(sp_core::H256::repeat_byte(1)); + + let payload = ExplicitDisputeStatement { + valid: true, + candidate_hash: candidate_hash_a.clone(), + session: 1, + } + .signing_payload(); + + let sig_a = v0.sign(&payload); + + let mut statements = vec![DisputeStatementSet { + candidate_hash: candidate_hash_a.clone(), + session: 1, + statements: vec![( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(0), + sig_a.clone(), + )], + }]; + + Pallet::::filter_multi_dispute_data(&mut statements); + + assert!(statements.is_empty()); + }) + } + + #[test] + fn import_ignores_single_sided() { + new_test_ext(Default::default()).execute_with(|| { + let v0 = ::Pair::generate().0; + + run_to_block(3, |b| { + // a new session at each block + Some((true, b, vec![(&0, v0.public())], Some(vec![(&0, v0.public())]))) + }); + + let candidate_hash_a = CandidateHash(sp_core::H256::repeat_byte(1)); + + let payload = ExplicitDisputeStatement { + valid: true, + candidate_hash: candidate_hash_a.clone(), + session: 1, + } + .signing_payload(); + + let sig_a = v0.sign(&payload); + + let statements = vec![DisputeStatementSet { + candidate_hash: candidate_hash_a.clone(), + session: 1, + statements: vec![( + DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), + ValidatorIndex(0), + sig_a.clone(), + )], + }]; + + assert_err!( + Pallet::::provide_multi_dispute_data(statements), + DispatchError::from(Error::::SingleSidedDispute), + ); + }) + } } diff --git a/runtime/parachains/src/disputes/benchmarking.rs b/runtime/parachains/src/disputes/benchmarking.rs new file mode 100644 index 000000000000..b884d1a6e799 --- /dev/null +++ b/runtime/parachains/src/disputes/benchmarking.rs @@ -0,0 +1,36 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use super::*; + +use frame_benchmarking::{benchmarks, impl_benchmark_test_suite}; +use frame_system::RawOrigin; +use sp_runtime::traits::One; + +benchmarks! { + force_unfreeze { + Frozen::::set(Some(One::one())); + }: _(RawOrigin::Root) + verify { + assert!(Frozen::::get().is_none()) + } +} + +impl_benchmark_test_suite!( + Pallet, + crate::mock::new_test_ext(Default::default()), + crate::mock::Test +); diff --git a/runtime/parachains/src/hrmp.rs b/runtime/parachains/src/hrmp.rs index c31f658faf36..7e489ba73cf0 100644 --- a/runtime/parachains/src/hrmp.rs +++ b/runtime/parachains/src/hrmp.rs @@ -25,6 +25,7 @@ use primitives::v1::{ Balance, Hash, HrmpChannelId, Id as ParaId, InboundHrmpMessage, OutboundHrmpMessage, SessionIndex, }; +use scale_info::TypeInfo; use sp_runtime::traits::{AccountIdConversion, BlakeTwo256, Hash as HashT, UniqueSaturatedInto}; use sp_std::{ collections::{btree_map::BTreeMap, btree_set::BTreeSet}, @@ -35,12 +36,13 @@ use sp_std::{ pub use pallet::*; /// A description of a request to open an HRMP channel. -#[derive(Encode, Decode)] +#[derive(Encode, Decode, TypeInfo)] pub struct HrmpOpenChannelRequest { /// Indicates if this request was confirmed by the recipient. pub confirmed: bool, - /// How many session boundaries ago this request was seen. - pub age: SessionIndex, + /// NOTE: this field is deprecated. Channel open requests became non-expiring and this value + /// became unused. + pub _age: SessionIndex, /// The amount that the sender supplied at the time of creation of this request. pub sender_deposit: Balance, /// The maximum message size that could be put into the channel. @@ -52,7 +54,7 @@ pub struct HrmpOpenChannelRequest { } /// A metadata of an HRMP channel. -#[derive(Encode, Decode)] +#[derive(Encode, Decode, TypeInfo)] #[cfg_attr(test, derive(Debug))] pub struct HrmpChannel { // NOTE: This structure is used by parachains via merkle proofs. Therefore, this struct requires @@ -141,8 +143,9 @@ impl fmt::Debug for OutboundHrmpAcceptanceErr { "more HRMP messages than permitted by config ({} > {})", sent, permitted, ), - NotSorted { idx } => - write!(fmt, "the HRMP messages are not sorted (first unsorted is at index {})", idx,), + NotSorted { idx } => { + write!(fmt, "the HRMP messages are not sorted (first unsorted is at index {})", idx,) + }, NoSuchChannel { idx, channel_id } => write!( fmt, "the HRMP message at index {} is sent to a non existent channel {:?}->{:?}", @@ -200,6 +203,9 @@ pub mod pallet { /// Open HRMP channel requested. /// `[sender, recipient, proposed_max_capacity, proposed_max_message_size]` OpenChannelRequested(ParaId, ParaId, u32, u32), + /// An HRMP channel request sent by the receiver was canceled by either party. + /// `[by_parachain, channel_id]` + OpenChannelCanceled(ParaId, HrmpChannelId), /// Open HRMP channel accepted. `[sender, recipient]` OpenChannelAccepted(ParaId, ParaId), /// HRMP channel closed. `[by_parachain, channel_id]` @@ -238,6 +244,12 @@ pub mod pallet { CloseHrmpChannelDoesntExist, /// The channel close request is already requested. CloseHrmpChannelAlreadyUnderway, + /// Canceling is requested by neither the sender nor recipient of the open channel request. + CancelHrmpOpenChannelUnauthorized, + /// The open request doesn't exist. + OpenHrmpChannelDoesntExist, + /// Cannot cancel an HRMP open channel request because it is already confirmed. + OpenHrmpChannelAlreadyConfirmed, } /// The set of pending HRMP open channel requests. @@ -375,7 +387,7 @@ pub mod pallet { /// parameters. /// /// - `proposed_max_capacity` - specifies how many messages can be in the channel at once. - /// - `proposed_max_message_size` - specifies the maximum size of any of the messages. + /// - `proposed_max_message_size` - specifies the maximum size of the messages. /// /// These numbers are a subject to the relay-chain configuration limits. /// @@ -464,6 +476,22 @@ pub mod pallet { Self::process_hrmp_close_channel_requests(); Ok(()) } + + /// This cancels a pending open channel request. It can be canceled be either of the sender + /// or the recipient for that request. The origin must be either of those. + /// + /// The cancelling happens immediately. It is not possible to cancel the request if it is + /// already accepted. + #[pallet::weight(0)] + pub fn hrmp_cancel_open_request( + origin: OriginFor, + channel_id: HrmpChannelId, + ) -> DispatchResult { + let origin = ensure_parachain(::Origin::from(origin))?; + Self::cancel_open_request(origin, channel_id.clone())?; + Self::deposit_event(Event::OpenChannelCanceled(origin, channel_id)); + Ok(()) + } } } @@ -507,19 +535,77 @@ impl Pallet { notification: &initializer::SessionChangeNotification, outgoing_paras: &[ParaId], ) { - Self::perform_outgoing_para_cleanup(outgoing_paras); + Self::perform_outgoing_para_cleanup(¬ification.prev_config, outgoing_paras); Self::process_hrmp_open_channel_requests(¬ification.prev_config); Self::process_hrmp_close_channel_requests(); } /// Iterate over all paras that were noted for offboarding and remove all the data /// associated with them. - fn perform_outgoing_para_cleanup(outgoing: &[ParaId]) { + fn perform_outgoing_para_cleanup( + config: &HostConfiguration, + outgoing: &[ParaId], + ) { + Self::clean_open_channel_requests(config, outgoing); for outgoing_para in outgoing { Self::clean_hrmp_after_outgoing(outgoing_para); } } + // Go over the HRMP open channel requests and remove all in which offboarding paras participate. + // + // This will also perform the refunds for the counterparty if it doesn't offboard. + fn clean_open_channel_requests( + config: &HostConfiguration, + outgoing: &[ParaId], + ) { + // First collect all the channel ids of the open requests in which there is at least one + // party presents in the outgoing list. + // + // Both the open channel request list and outgoing list are expected to be small enough. + // In the most common case there will be only single outgoing para. + let open_channel_reqs = ::HrmpOpenChannelRequestsList::get(); + let (go, stay): (Vec, Vec) = open_channel_reqs + .into_iter() + .partition(|req_id| outgoing.iter().any(|id| req_id.is_participant(*id))); + ::HrmpOpenChannelRequestsList::put(stay); + + // Then iterate over all open requests to be removed, pull them out of the set and perform + // the refunds if applicable. + for req_id in go { + let req_data = match ::HrmpOpenChannelRequests::take(&req_id) { + Some(req_data) => req_data, + None => { + // Can't normally happen but no need to panic. + continue + }, + }; + + // Return the deposit of the sender, but only if it is not the para being offboarded. + if !outgoing.contains(&req_id.sender) { + T::Currency::unreserve( + &req_id.sender.into_account(), + req_data.sender_deposit.unique_saturated_into(), + ); + } + + // If the request was confirmed, then it means it was confirmed in the finished session. + // Therefore, the config's hrmp_recipient_deposit represents the actual value of the + // deposit. + // + // We still want to refund the deposit only if the para is not being offboarded. + if req_data.confirmed { + if !outgoing.contains(&req_id.recipient) { + T::Currency::unreserve( + &req_id.recipient.into_account(), + config.hrmp_recipient_deposit.unique_saturated_into(), + ); + } + Self::decrease_accepted_channel_request_count(req_id.recipient); + } + } + } + /// Remove all storage entries associated with the given para. fn clean_hrmp_after_outgoing(outgoing_para: &ParaId) { ::HrmpOpenChannelRequestCount::remove(outgoing_para); @@ -561,7 +647,7 @@ impl Pallet { idx -= 1; let channel_id = open_req_channels[idx].clone(); - let mut request = ::HrmpOpenChannelRequests::get(&channel_id).expect( + let request = ::HrmpOpenChannelRequests::get(&channel_id).expect( "can't be `None` due to the invariant that the list contains the same items as the set; qed", ); @@ -595,52 +681,11 @@ impl Pallet { }); } - let new_open_channel_req_cnt = - ::HrmpOpenChannelRequestCount::get(&channel_id.sender) - .saturating_sub(1); - if new_open_channel_req_cnt != 0 { - ::HrmpOpenChannelRequestCount::insert( - &channel_id.sender, - new_open_channel_req_cnt, - ); - } else { - ::HrmpOpenChannelRequestCount::remove(&channel_id.sender); - } - - let new_accepted_channel_req_cnt = - ::HrmpAcceptedChannelRequestCount::get(&channel_id.recipient) - .saturating_sub(1); - if new_accepted_channel_req_cnt != 0 { - ::HrmpAcceptedChannelRequestCount::insert( - &channel_id.recipient, - new_accepted_channel_req_cnt, - ); - } else { - ::HrmpAcceptedChannelRequestCount::remove(&channel_id.recipient); - } + Self::decrease_open_channel_request_count(channel_id.sender); + Self::decrease_accepted_channel_request_count(channel_id.recipient); let _ = open_req_channels.swap_remove(idx); ::HrmpOpenChannelRequests::remove(&channel_id); - } else { - request.age += 1; - if request.age == config.hrmp_open_request_ttl { - // got stale - ::HrmpOpenChannelRequestCount::mutate(&channel_id.sender, |v| { - *v -= 1; - }); - - let _ = open_req_channels.swap_remove(idx); - if let Some(HrmpOpenChannelRequest { sender_deposit, .. }) = - ::HrmpOpenChannelRequests::take(&channel_id) - { - T::Currency::unreserve( - &channel_id.sender.into_account(), - sender_deposit.unique_saturated_into(), - ); - } - } else { - ::HrmpOpenChannelRequests::insert(&channel_id, request); - } } } @@ -996,7 +1041,7 @@ impl Pallet { &channel_id, HrmpOpenChannelRequest { confirmed: false, - age: 0, + _age: 0, sender_deposit: config.hrmp_sender_deposit, max_capacity: proposed_max_capacity, max_message_size: proposed_max_message_size, @@ -1081,13 +1126,40 @@ impl Pallet { Ok(()) } - fn close_channel(origin: ParaId, channel_id: HrmpChannelId) -> Result<(), Error> { + fn cancel_open_request(origin: ParaId, channel_id: HrmpChannelId) -> DispatchResult { // check if the origin is allowed to close the channel. - ensure!( - origin == channel_id.sender || origin == channel_id.recipient, - Error::::CloseHrmpChannelUnauthorized, + ensure!(channel_id.is_participant(origin), Error::::CancelHrmpOpenChannelUnauthorized); + + let open_channel_req = ::HrmpOpenChannelRequests::get(&channel_id) + .ok_or(Error::::OpenHrmpChannelDoesntExist)?; + ensure!(!open_channel_req.confirmed, Error::::OpenHrmpChannelAlreadyConfirmed); + + // Remove the request by the channel id and sync the accompanying list with the set. + ::HrmpOpenChannelRequests::remove(&channel_id); + ::HrmpOpenChannelRequestsList::mutate(|open_req_channels| { + if let Some(pos) = open_req_channels.iter().position(|x| x == &channel_id) { + open_req_channels.swap_remove(pos); + } + }); + + Self::decrease_open_channel_request_count(channel_id.sender); + // Don't decrease `HrmpAcceptedChannelRequestCount` because we don't consider confirmed + // requests here. + + // Unreserve the sender's deposit. The recipient could not have left their deposit because + // we ensured that the request is not confirmed. + T::Currency::unreserve( + &channel_id.sender.into_account(), + open_channel_req.sender_deposit.unique_saturated_into(), ); + Ok(()) + } + + fn close_channel(origin: ParaId, channel_id: HrmpChannelId) -> Result<(), Error> { + // check if the origin is allowed to close the channel. + ensure!(channel_id.is_participant(origin), Error::::CloseHrmpChannelUnauthorized); + // check if the channel requested to close does exist. ensure!( ::HrmpChannels::get(&channel_id).is_some(), @@ -1167,6 +1239,30 @@ impl Pallet { } } +impl Pallet { + /// Decreases the open channel request count for the given sender. If the value reaches zero + /// it is removed completely. + fn decrease_open_channel_request_count(sender: ParaId) { + ::HrmpOpenChannelRequestCount::mutate_exists(&sender, |opt_rc| { + *opt_rc = opt_rc.and_then(|rc| match rc.saturating_sub(1) { + 0 => None, + n => Some(n), + }); + }); + } + + /// Decreases the accepted channel request count for the given sender. If the value reaches + /// zero it is removed completely. + fn decrease_accepted_channel_request_count(recipient: ParaId) { + ::HrmpAcceptedChannelRequestCount::mutate_exists(&recipient, |opt_rc| { + *opt_rc = opt_rc.and_then(|rc| match rc.saturating_sub(1) { + 0 => None, + n => Some(n), + }); + }); + } +} + #[cfg(test)] mod tests { use super::*; @@ -1231,7 +1327,6 @@ mod tests { hrmp_channel_max_total_size: u32, hrmp_sender_deposit: Balance, hrmp_recipient_deposit: Balance, - hrmp_open_request_ttl: u32, } impl Default for GenesisConfigBuilder { @@ -1247,7 +1342,6 @@ mod tests { hrmp_channel_max_total_size: 16, hrmp_sender_deposit: 100, hrmp_recipient_deposit: 100, - hrmp_open_request_ttl: 3, } } } @@ -1267,7 +1361,6 @@ mod tests { config.hrmp_channel_max_total_size = self.hrmp_channel_max_total_size; config.hrmp_sender_deposit = self.hrmp_sender_deposit; config.hrmp_recipient_deposit = self.hrmp_recipient_deposit; - config.hrmp_open_request_ttl = self.hrmp_open_request_ttl; genesis } } @@ -1819,36 +1912,41 @@ mod tests { } #[test] - fn refund_deposit_on_request_expiry() { + fn refund_deposit_on_offboarding() { let para_a = 32.into(); let para_b = 64.into(); let mut genesis = GenesisConfigBuilder::default(); genesis.hrmp_sender_deposit = 20; genesis.hrmp_recipient_deposit = 15; - genesis.hrmp_open_request_ttl = 2; new_test_ext(genesis.build()).execute_with(|| { - // Register two parachains funded with different amounts of funds, send an open channel - // request but do not accept it. + // Register two parachains and open a channel between them. register_parachain_with_balance(para_a, 100); register_parachain_with_balance(para_b, 110); run_to_block(5, Some(vec![4, 5])); Hrmp::init_open_channel(para_a, para_b, 2, 8).unwrap(); + Hrmp::accept_open_channel(para_b, para_a).unwrap(); assert_eq!(::Currency::free_balance(¶_a.into_account()), 80); - assert_eq!(::Currency::free_balance(¶_b.into_account()), 110); + assert_eq!(::Currency::free_balance(¶_b.into_account()), 95); + run_to_block(8, Some(vec![8])); + assert!(channel_exists(para_a, para_b)); - // Request age is 1 out of 2 - run_to_block(10, Some(vec![10])); - assert_eq!(::Currency::free_balance(¶_a.into_account()), 80); + // Then deregister one parachain. + deregister_parachain(para_a); + run_to_block(10, Some(vec![9, 10])); + + // The channel should be removed. + assert!(!Paras::is_valid_para(para_a)); + assert!(!channel_exists(para_a, para_b)); + assert_storage_consistency_exhaustive(); - // Request age is 2 out of 2. The request should expire. - run_to_block(20, Some(vec![20])); assert_eq!(::Currency::free_balance(¶_a.into_account()), 100); + assert_eq!(::Currency::free_balance(¶_b.into_account()), 110); }); } #[test] - fn refund_deposit_on_offboarding() { + fn no_dangling_open_requests() { let para_a = 32.into(); let para_b = 64.into(); @@ -1860,24 +1958,54 @@ mod tests { register_parachain_with_balance(para_a, 100); register_parachain_with_balance(para_b, 110); run_to_block(5, Some(vec![4, 5])); + + // Start opening a channel a->b Hrmp::init_open_channel(para_a, para_b, 2, 8).unwrap(); - Hrmp::accept_open_channel(para_b, para_a).unwrap(); assert_eq!(::Currency::free_balance(¶_a.into_account()), 80); - assert_eq!(::Currency::free_balance(¶_b.into_account()), 95); - run_to_block(8, Some(vec![8])); - assert!(channel_exists(para_a, para_b)); - // Then deregister one parachain. + // Then deregister one parachain, but don't wait two sessions until it takes effect. + // Instead, para_b will confirm the request, which will take place the same time + // the offboarding should happen. deregister_parachain(para_a); - run_to_block(10, Some(vec![9, 10])); + run_to_block(9, Some(vec![9])); + Hrmp::accept_open_channel(para_b, para_a).unwrap(); + assert_eq!(::Currency::free_balance(¶_b.into_account()), 95); + assert!(!channel_exists(para_a, para_b)); + run_to_block(10, Some(vec![10])); - // The channel should be removed. - assert!(!Paras::is_valid_para(para_a)); + // The outcome we expect is para_b should receive the refund. + assert_eq!(::Currency::free_balance(¶_b.into_account()), 110); assert!(!channel_exists(para_a, para_b)); assert_storage_consistency_exhaustive(); + }); + } + + #[test] + fn cancel_pending_open_channel_request() { + let para_a = 32.into(); + let para_b = 64.into(); + let mut genesis = GenesisConfigBuilder::default(); + genesis.hrmp_sender_deposit = 20; + genesis.hrmp_recipient_deposit = 15; + new_test_ext(genesis.build()).execute_with(|| { + // Register two parachains and open a channel between them. + register_parachain_with_balance(para_a, 100); + register_parachain_with_balance(para_b, 110); + run_to_block(5, Some(vec![4, 5])); + + // Start opening a channel a->b + Hrmp::init_open_channel(para_a, para_b, 2, 8).unwrap(); + assert_eq!(::Currency::free_balance(¶_a.into_account()), 80); + + // Cancel opening the channel + Hrmp::cancel_open_request(para_a, HrmpChannelId { sender: para_a, recipient: para_b }) + .unwrap(); assert_eq!(::Currency::free_balance(¶_a.into_account()), 100); - assert_eq!(::Currency::free_balance(¶_b.into_account()), 110); + + run_to_block(10, Some(vec![10])); + assert!(!channel_exists(para_a, para_b)); + assert_storage_consistency_exhaustive(); }); } } diff --git a/runtime/parachains/src/inclusion.rs b/runtime/parachains/src/inclusion.rs index 5c43c2308696..7150dbbfb798 100644 --- a/runtime/parachains/src/inclusion.rs +++ b/runtime/parachains/src/inclusion.rs @@ -28,6 +28,7 @@ use primitives::v1::{ CandidateHash, CandidateReceipt, CommittedCandidateReceipt, CoreIndex, GroupIndex, HeadData, Id as ParaId, SigningContext, UncheckedSignedAvailabilityBitfields, ValidatorIndex, }; +use scale_info::TypeInfo; use sp_runtime::{ traits::{One, Saturating}, DispatchError, @@ -43,7 +44,7 @@ pub use pallet::*; /// /// The bitfield's signature should be checked at the point of submission. Afterwards it can be /// dropped. -#[derive(Encode, Decode)] +#[derive(Encode, Decode, TypeInfo)] #[cfg_attr(test, derive(Debug))] pub struct AvailabilityBitfieldRecord { bitfield: AvailabilityBitfield, // one bit per core. @@ -51,7 +52,7 @@ pub struct AvailabilityBitfieldRecord { } /// A backed candidate pending availability. -#[derive(Encode, Decode, PartialEq)] +#[derive(Encode, Decode, PartialEq, TypeInfo)] #[cfg_attr(test, derive(Debug))] pub struct CandidatePendingAvailability { /// The availability core this is assigned to. @@ -134,7 +135,6 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] - #[pallet::metadata(T::Hash = "Hash")] pub enum Event { /// A candidate was backed. `[candidate, head_data]` CandidateBacked(CandidateReceipt, HeadData, CoreIndex, GroupIndex), @@ -170,8 +170,6 @@ pub mod pallet { NewCodeTooLarge, /// Candidate not in parent context. CandidateNotInParentContext, - /// The bitfield contains a bit relating to an unassigned availability core. - UnoccupiedBitInBitfield, /// Invalid group index in core assignment. InvalidGroupIndex, /// Insufficient (non-majority) backing. @@ -182,8 +180,6 @@ pub mod pallet { NotCollatorSigned, /// The validation data hash does not match expected. ValidationDataHashMismatch, - /// Internal error only returned when compiled with debug assertions. - InternalError, /// The downward message queue is not processed correctly. IncorrectDownwardMessageHandling, /// At least one upward message sent does not pass the acceptance criteria. @@ -194,6 +190,9 @@ pub mod pallet { InvalidOutboundHrmp, /// The validation code hash of the candidate is not valid. InvalidValidationCodeHash, + /// The `para_head` hash in the candidate descriptor doesn't match the hash of the actual para head in the + /// commitments. + ParaHeadMismatch, } /// The latest bitfield for each validator, referred to by their index in the validator set. @@ -237,8 +236,10 @@ impl Pallet { for _ in >::drain() {} } - /// Process a set of incoming bitfields. Return a `vec` of cores freed by candidates - /// becoming available. + /// Process a set of incoming bitfields. + /// + /// Returns a `Vec` of `CandidateHash`es and their respective `AvailabilityCore`s that became available, + /// and cores free. pub(crate) fn process_bitfields( expected_bits: usize, unchecked_bitfields: UncheckedSignedAvailabilityBitfields, @@ -247,10 +248,12 @@ impl Pallet { let validators = shared::Pallet::::active_validator_keys(); let session_index = shared::Pallet::::session_index(); - let mut assigned_paras_record: Vec<_> = (0..expected_bits) + let mut assigned_paras_record = (0..expected_bits) .map(|bit_index| core_lookup(CoreIndex::from(bit_index as u32))) - .map(|core_para| core_para.map(|p| (p, PendingAvailability::::get(&p)))) - .collect(); + .map(|opt_para_id| { + opt_para_id.map(|para_id| (para_id, PendingAvailability::::get(¶_id))) + }) + .collect::>(); // do sanity checks on the bitfields: // 1. no more than one bitfield per validator @@ -258,14 +261,6 @@ impl Pallet { // 3. each bitfield has exactly `expected_bits` // 4. signature is valid. let signed_bitfields = { - let occupied_bitmask: BitVec = assigned_paras_record - .iter() - .map(|p| { - p.as_ref() - .map_or(false, |(_id, pending_availability)| pending_availability.is_some()) - }) - .collect(); - let mut last_index = None; let signing_context = SigningContext { @@ -292,12 +287,6 @@ impl Pallet { Error::::ValidatorIndexOutOfBounds, ); - ensure!( - occupied_bitmask.clone() & unchecked_bitfield.unchecked_payload().0.clone() == - unchecked_bitfield.unchecked_payload().0, - Error::::UnoccupiedBitInBitfield, - ); - let validator_public = &validators[unchecked_bitfield.unchecked_validator_index().0 as usize]; @@ -317,20 +306,26 @@ impl Pallet { for (bit_idx, _) in signed_bitfield.payload().0.iter().enumerate().filter(|(_, is_av)| **is_av) { - let (_, pending_availability) = assigned_paras_record[bit_idx] - .as_mut() - .expect("validator bitfields checked not to contain bits corresponding to unoccupied cores; qed"); + let pending_availability = if let Some((_, pending_availability)) = + assigned_paras_record[bit_idx].as_mut() + { + pending_availability + } else { + // For honest validators, this happens in case of unoccupied cores, + // which in turn happens in case of a disputed candidate. + // A malicious one might include arbitrary indices, but they are represented + // by `None` values and will be sorted out in the next if case. + continue + }; // defensive check - this is constructed by loading the availability bitfield record, // which is always `Some` if the core is occupied - that's why we're here. let val_idx = signed_bitfield.validator_index().0 as usize; - if let Some(mut bit) = pending_availability - .as_mut() - .and_then(|r| r.availability_votes.get_mut(val_idx)) - { + if let Some(mut bit) = + pending_availability.as_mut().and_then(|candidate_pending_availability| { + candidate_pending_availability.availability_votes.get_mut(val_idx) + }) { *bit = true; - } else if cfg!(debug_assertions) { - ensure!(false, Error::::InternalError); } } @@ -465,6 +460,12 @@ impl Pallet { Error::::InvalidValidationCodeHash, ); + ensure!( + candidate.descriptor().para_head == + candidate.candidate.commitments.head_data.hash(), + Error::::ParaHeadMismatch, + ); + if let Err(err) = check_cx.check_validation_outputs( para_id, &candidate.candidate.commitments.head_data, @@ -1169,6 +1170,7 @@ mod tests { struct TestCandidateBuilder { para_id: ParaId, head_data: HeadData, + para_head_hash: Option, pov_hash: Hash, relay_parent: Hash, persisted_validation_data_hash: Hash, @@ -1186,6 +1188,7 @@ mod tests { relay_parent: self.relay_parent, persisted_validation_data_hash: self.persisted_validation_data_hash, validation_code_hash: self.validation_code.hash(), + para_head: self.para_head_hash.unwrap_or_else(|| self.head_data.hash()), ..Default::default() }, commitments: CandidateCommitments { @@ -1405,13 +1408,14 @@ mod tests { bare_bitfield, &signing_context, )); - - assert!(ParaInclusion::process_bitfields( - expected_bits(), - vec![signed.into()], - &core_lookup, - ) - .is_err()); + assert_eq!( + ParaInclusion::process_bitfields( + expected_bits(), + vec![signed.into()], + &core_lookup, + ), + Ok(vec![]) + ); } // empty bitfield signed: always OK, but kind of useless. @@ -2214,6 +2218,41 @@ mod tests { Err(Error::::InvalidValidationCodeHash.into()), ); } + + // Para head hash in descriptor doesn't match head data + { + let mut candidate = TestCandidateBuilder { + para_id: chain_a, + relay_parent: System::parent_hash(), + pov_hash: Hash::repeat_byte(1), + persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), + hrmp_watermark: RELAY_PARENT_NUM, + para_head_hash: Some(Hash::random()), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let backed = block_on(back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + )); + + assert_eq!( + ParaInclusion::process_candidates( + Default::default(), + vec![backed], + vec![chain_a_assignment.clone()], + &group_validators, + ), + Err(Error::::ParaHeadMismatch.into()), + ); + } }); } diff --git a/runtime/parachains/src/initializer.rs b/runtime/parachains/src/initializer.rs index 3b4e94fb4cb1..95e3310e37fe 100644 --- a/runtime/parachains/src/initializer.rs +++ b/runtime/parachains/src/initializer.rs @@ -24,11 +24,19 @@ use crate::{ disputes::DisputesHandler, dmp, hrmp, inclusion, paras, scheduler, session_info, shared, ump, }; -use frame_support::traits::{OneSessionHandler, Randomness}; +use frame_support::{ + traits::{OneSessionHandler, Randomness}, + weights::Weight, +}; +use frame_system::limits::BlockWeights; use parity_scale_codec::{Decode, Encode}; use primitives::v1::{BlockNumber, ConsensusLog, SessionIndex, ValidatorId}; +use scale_info::TypeInfo; use sp_std::prelude::*; +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; + pub use pallet::*; /// Information about a session change that has just occurred. @@ -61,13 +69,23 @@ impl> Default for SessionChangeNotification, queued: Vec, session_index: SessionIndex, } +pub trait WeightInfo { + fn force_approve(d: u32) -> Weight; +} + +impl WeightInfo for () { + fn force_approve(_: u32) -> Weight { + BlockWeights::default().max_block + } +} + #[frame_support::pallet] pub mod pallet { use super::*; @@ -95,6 +113,8 @@ pub mod pallet { type Randomness: Randomness; /// An origin which is allowed to force updates to parachains. type ForceOrigin: EnsureOrigin<::Origin>; + /// Weight information for extrinsics in this pallet. + type WeightInfo: WeightInfo; } /// Whether the parachains modules have been initialized within this block. @@ -180,7 +200,12 @@ pub mod pallet { /// Issue a signal to the consensus engine to forcibly act as though all parachain /// blocks in all relay chain blocks up to and including the given number in the current /// chain are valid and should be finalized. - #[pallet::weight((0, DispatchClass::Operational))] + #[pallet::weight(( + ::WeightInfo::force_approve( + frame_system::Pallet::::digest().logs.len() as u32, + ), + DispatchClass::Operational, + ))] pub fn force_approve(origin: OriginFor, up_to: BlockNumber) -> DispatchResult { T::ForceOrigin::ensure_origin(origin)?; diff --git a/runtime/parachains/src/initializer/benchmarking.rs b/runtime/parachains/src/initializer/benchmarking.rs new file mode 100644 index 000000000000..d73c427f133d --- /dev/null +++ b/runtime/parachains/src/initializer/benchmarking.rs @@ -0,0 +1,44 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use super::*; +use frame_benchmarking::{benchmarks, impl_benchmark_test_suite}; +use frame_system::{DigestItemOf, RawOrigin}; +use primitives::v1::ConsensusLog; + +// Random large number for the digest +const DIGEST_MAX_LEN: u32 = 65536; + +benchmarks! { + force_approve { + let d in 0 .. DIGEST_MAX_LEN; + for _ in 0 .. d { + >::deposit_log(ConsensusLog::ForceApprove(d).into()); + } + }: _(RawOrigin::Root, d + 1) + verify { + assert_eq!( + >::digest().logs.last().unwrap(), + &>::from(ConsensusLog::ForceApprove(d + 1)), + ); + } +} + +impl_benchmark_test_suite!( + Pallet, + crate::mock::new_test_ext(Default::default()), + crate::mock::Test +); diff --git a/runtime/parachains/src/lib.rs b/runtime/parachains/src/lib.rs index 1ea90bb84e63..ab48d693d601 100644 --- a/runtime/parachains/src/lib.rs +++ b/runtime/parachains/src/lib.rs @@ -20,6 +20,7 @@ //! particular the `Initializer` module, as it is responsible for initializing the state //! of the other modules. +#![cfg_attr(feature = "runtime-benchmarks", recursion_limit = "256")] #![cfg_attr(not(feature = "std"), no_std)] pub mod configuration; diff --git a/runtime/parachains/src/mock.rs b/runtime/parachains/src/mock.rs index fc45eed0d1a5..9e646dbbc1ca 100644 --- a/runtime/parachains/src/mock.rs +++ b/runtime/parachains/src/mock.rs @@ -18,12 +18,15 @@ use crate::{ configuration, disputes, dmp, hrmp, inclusion, initializer, paras, paras_inherent, scheduler, - session_info, shared, ump, + session_info, shared, + ump::{self, MessageId, UmpSink}, + ParaId, }; -use frame_support::{parameter_types, traits::GenesisBuild}; +use frame_support::{parameter_types, traits::GenesisBuild, weights::Weight}; use frame_support_test::TestRandomness; +use parity_scale_codec::Decode; use primitives::v1::{ - AuthorityDiscoveryId, Balance, BlockNumber, Header, SessionIndex, ValidatorIndex, + AuthorityDiscoveryId, Balance, BlockNumber, Header, SessionIndex, UpwardMessage, ValidatorIndex, }; use sp_core::H256; use sp_io::TestExternalities; @@ -109,15 +112,19 @@ impl pallet_balances::Config for Test { impl crate::initializer::Config for Test { type Randomness = TestRandomness; type ForceOrigin = frame_system::EnsureRoot; + type WeightInfo = (); } -impl crate::configuration::Config for Test {} +impl crate::configuration::Config for Test { + type WeightInfo = crate::configuration::weights::WeightInfo; +} impl crate::shared::Config for Test {} impl crate::paras::Config for Test { type Origin = Origin; type Event = Event; + type WeightInfo = crate::paras::weights::WeightInfo; } impl crate::dmp::Config for Test {} @@ -128,8 +135,9 @@ parameter_types! { impl crate::ump::Config for Test { type Event = Event; - type UmpSink = crate::ump::mock_sink::MockUmpSink; + type UmpSink = TestUmpSink; type FirstMessageFactorPercent = FirstMessageFactorPercent; + type ExecuteOverweightOrigin = frame_system::EnsureRoot; } impl crate::hrmp::Config for Test { @@ -142,6 +150,7 @@ impl crate::disputes::Config for Test { type Event = Event; type RewardValidators = Self; type PunishValidators = Self; + type WeightInfo = crate::disputes::TestWeightInfo; } thread_local! { @@ -232,6 +241,41 @@ pub fn availability_rewards() -> HashMap { AVAILABILITY_REWARDS.with(|r| r.borrow().clone()) } +std::thread_local! { + static PROCESSED: RefCell> = RefCell::new(vec![]); +} + +/// Return which messages have been processed by `pocess_upward_message` and clear the buffer. +pub fn take_processed() -> Vec<(ParaId, UpwardMessage)> { + PROCESSED.with(|opt_hook| std::mem::take(&mut *opt_hook.borrow_mut())) +} + +/// An implementation of a UMP sink that just records which messages were processed. +/// +/// A message's weight is defined by the first 4 bytes of its data, which we decode into a +/// `u32`. +pub struct TestUmpSink; +impl UmpSink for TestUmpSink { + fn process_upward_message( + actual_origin: ParaId, + actual_msg: &[u8], + max_weight: Weight, + ) -> Result { + let weight = match u32::decode(&mut &actual_msg[..]) { + Ok(w) => w as Weight, + Err(_) => return Ok(0), // same as the real `UmpSink` + }; + if weight > max_weight { + let id = sp_io::hashing::blake2_256(actual_msg); + return Err((id, weight)) + } + PROCESSED.with(|opt_hook| { + opt_hook.borrow_mut().push((actual_origin, actual_msg.to_owned())); + }); + Ok(weight) + } +} + pub struct TestRewardValidators; impl inclusion::RewardValidators for TestRewardValidators { @@ -271,3 +315,11 @@ pub struct MockGenesisConfig { pub configuration: crate::configuration::GenesisConfig, pub paras: crate::paras::GenesisConfig, } + +pub fn assert_last_event(generic_event: Event) { + let events = frame_system::Pallet::::events(); + let system_event: ::Event = generic_event.into(); + // compare to the last event record + let frame_system::EventRecord { event, .. } = &events[events.len() - 1]; + assert_eq!(event, &system_event); +} diff --git a/runtime/parachains/src/origin.rs b/runtime/parachains/src/origin.rs index ba4ad549c78e..83d4dcc25d99 100644 --- a/runtime/parachains/src/origin.rs +++ b/runtime/parachains/src/origin.rs @@ -54,7 +54,7 @@ pub mod pallet { /// Origin for the parachains. #[pallet::origin] - #[derive(PartialEq, Eq, Clone, Encode, Decode, sp_core::RuntimeDebug)] + #[derive(PartialEq, Eq, Clone, Encode, Decode, sp_core::RuntimeDebug, scale_info::TypeInfo)] pub enum Origin { /// It comes from a parachain. Parachain(ParaId), diff --git a/runtime/parachains/src/paras.rs b/runtime/parachains/src/paras.rs index 170914d8f518..666012a3b4e3 100644 --- a/runtime/parachains/src/paras.rs +++ b/runtime/parachains/src/paras.rs @@ -31,6 +31,7 @@ use primitives::v1::{ ConsensusLog, HeadData, Id as ParaId, SessionIndex, UpgradeGoAhead, UpgradeRestriction, ValidationCode, ValidationCodeHash, }; +use scale_info::TypeInfo; use sp_core::RuntimeDebug; use sp_runtime::{traits::One, DispatchResult, SaturatedConversion}; use sp_std::{prelude::*, result}; @@ -40,10 +41,14 @@ use serde::{Deserialize, Serialize}; pub use crate::Origin as ParachainOrigin; +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; +pub mod weights; + pub use pallet::*; // the two key times necessary to track for every code replacement. -#[derive(Default, Encode, Decode)] +#[derive(Default, Encode, Decode, TypeInfo)] #[cfg_attr(test, derive(Debug, Clone, PartialEq))] pub struct ReplacementTimes { /// The relay-chain block number that the code upgrade was expected to be activated. @@ -58,7 +63,7 @@ pub struct ReplacementTimes { /// Metadata used to track previous parachain validation code that we keep in /// the state. -#[derive(Default, Encode, Decode)] +#[derive(Default, Encode, Decode, TypeInfo)] #[cfg_attr(test, derive(Debug, Clone, PartialEq))] pub struct ParaPastCodeMeta { /// Block numbers where the code was expected to be replaced and where the code @@ -87,7 +92,7 @@ enum UseCodeAt { /// If the para is in a "transition state", it is expected that the parachain is /// queued in the `ActionsQueue` to transition it into a stable state. Its lifecycle /// state will be used to determine the state transition to apply to the para. -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub enum ParaLifecycle { /// Para is new and is onboarding as a Parathread or Parachain. Onboarding, @@ -255,7 +260,7 @@ impl ParaPastCodeMeta { } /// Arguments for initializing a para. -#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct ParaGenesisArgs { /// The initial head data to use. @@ -266,6 +271,14 @@ pub struct ParaGenesisArgs { pub parachain: bool, } +pub trait WeightInfo { + fn force_set_current_code(c: u32) -> Weight; + fn force_set_current_head(s: u32) -> Weight; + fn force_schedule_code_upgrade(c: u32) -> Weight; + fn force_note_new_head(s: u32) -> Weight; + fn force_queue_action() -> Weight; +} + #[frame_support::pallet] pub mod pallet { use super::*; @@ -282,6 +295,9 @@ pub mod pallet { + Into::Origin>>; type Event: From + IsType<::Event>; + + /// Weight information for extrinsics in this pallet. + type WeightInfo: WeightInfo; } #[pallet::event] @@ -489,7 +505,7 @@ pub mod pallet { #[pallet::call] impl Pallet { /// Set the storage for the parachain validation code immediately. - #[pallet::weight(0)] + #[pallet::weight(::WeightInfo::force_set_current_code(new_code.0.len() as u32))] pub fn force_set_current_code( origin: OriginFor, para: ParaId, @@ -508,7 +524,7 @@ pub mod pallet { } /// Set the storage for the current parachain head data immediately. - #[pallet::weight(0)] + #[pallet::weight(::WeightInfo::force_set_current_head(new_head.0.len() as u32))] pub fn force_set_current_head( origin: OriginFor, para: ParaId, @@ -521,7 +537,7 @@ pub mod pallet { } /// Schedule an upgrade as if it was scheduled in the given relay parent block. - #[pallet::weight(0)] + #[pallet::weight(::WeightInfo::force_schedule_code_upgrade(new_code.0.len() as u32))] pub fn force_schedule_code_upgrade( origin: OriginFor, para: ParaId, @@ -536,7 +552,7 @@ pub mod pallet { } /// Note a new block head for para within the context of the current block. - #[pallet::weight(0)] + #[pallet::weight(::WeightInfo::force_note_new_head(new_head.0.len() as u32))] pub fn force_note_new_head( origin: OriginFor, para: ParaId, @@ -552,7 +568,7 @@ pub mod pallet { /// Put a parachain directly into the next session's action queue. /// We can't queue it any sooner than this without going into the /// initializer... - #[pallet::weight(0)] + #[pallet::weight(::WeightInfo::force_queue_action())] pub fn force_queue_action(origin: OriginFor, para: ParaId) -> DispatchResult { ensure_root(origin)?; let next_session = shared::Pallet::::session_index().saturating_add(One::one()); diff --git a/runtime/parachains/src/paras/benchmarking.rs b/runtime/parachains/src/paras/benchmarking.rs new file mode 100644 index 000000000000..2e9a26c260a3 --- /dev/null +++ b/runtime/parachains/src/paras/benchmarking.rs @@ -0,0 +1,135 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use super::*; +use crate::{configuration::HostConfiguration, shared}; +use frame_benchmarking::{benchmarks, impl_benchmark_test_suite}; +use frame_system::RawOrigin; +use primitives::v1::{HeadData, Id as ParaId, ValidationCode, MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE}; +use sp_runtime::traits::{One, Saturating}; + +// 2 ^ 10, because binary search time complexity is O(log(2, n)) and n = 1024 gives us a big and +// round number. +// Due to the limited number of parachains, the number of pruning, upcoming upgrades and cooldowns +// shouldn't exceed this number. +const SAMPLE_SIZE: u32 = 1024; + +fn assert_last_event(generic_event: ::Event) { + let events = frame_system::Pallet::::events(); + let system_event: ::Event = generic_event.into(); + // compare to the last event record + let frame_system::EventRecord { event, .. } = &events[events.len() - 1]; + assert_eq!(event, &system_event); +} + +fn generate_disordered_pruning() { + let mut needs_pruning = Vec::new(); + + for i in 0..SAMPLE_SIZE { + let id = ParaId::from(i); + let block_number = T::BlockNumber::from(1000u32); + needs_pruning.push((id, block_number)); + } + + as Store>::PastCodePruning::put(needs_pruning); +} + +fn generate_disordered_upgrades() { + let mut upgrades = Vec::new(); + let mut cooldowns = Vec::new(); + + for i in 0..SAMPLE_SIZE { + let id = ParaId::from(i); + let block_number = T::BlockNumber::from(1000u32); + upgrades.push((id, block_number)); + cooldowns.push((id, block_number)); + } + + as Store>::UpcomingUpgrades::put(upgrades); + as Store>::UpgradeCooldowns::put(cooldowns); +} + +fn generate_disordered_actions_queue() { + let mut queue = Vec::new(); + let next_session = shared::Pallet::::session_index().saturating_add(One::one()); + + for _ in 0..SAMPLE_SIZE { + let id = ParaId::from(1000); + queue.push(id); + } + + as Store>::ActionsQueue::mutate(next_session, |v| { + *v = queue; + }); +} + +benchmarks! { + force_set_current_code { + let c in 1 .. MAX_CODE_SIZE; + let new_code = ValidationCode(vec![0; c as usize]); + let para_id = ParaId::from(c as u32); + generate_disordered_pruning::(); + }: _(RawOrigin::Root, para_id, new_code) + verify { + assert_last_event::(Event::CurrentCodeUpdated(para_id).into()); + } + force_set_current_head { + let s in 1 .. MAX_HEAD_DATA_SIZE; + let new_head = HeadData(vec![0; s as usize]); + let para_id = ParaId::from(1000); + }: _(RawOrigin::Root, para_id, new_head) + verify { + assert_last_event::(Event::CurrentHeadUpdated(para_id).into()); + } + force_schedule_code_upgrade { + let c in 1 .. MAX_CODE_SIZE; + let new_code = ValidationCode(vec![0; c as usize]); + let para_id = ParaId::from(c as u32); + let block = T::BlockNumber::from(c); + generate_disordered_upgrades::(); + }: _(RawOrigin::Root, para_id, new_code, block) + verify { + assert_last_event::(Event::CodeUpgradeScheduled(para_id).into()); + } + force_note_new_head { + let s in 1 .. MAX_HEAD_DATA_SIZE; + let para_id = ParaId::from(1000); + let new_head = HeadData(vec![0; s as usize]); + // schedule an expired code upgrade for this para_id so that force_note_new_head would use + // the worst possible code path + let expired = frame_system::Pallet::::block_number().saturating_sub(One::one()); + let config = HostConfiguration::::default(); + generate_disordered_pruning::(); + Pallet::::schedule_code_upgrade(para_id, ValidationCode(vec![0]), expired, &config); + }: _(RawOrigin::Root, para_id, new_head) + verify { + assert_last_event::(Event::NewHeadNoted(para_id).into()); + } + force_queue_action { + let para_id = ParaId::from(1000); + generate_disordered_actions_queue::(); + }: _(RawOrigin::Root, para_id) + verify { + let next_session = crate::shared::Pallet::::session_index().saturating_add(One::one()); + assert_last_event::(Event::ActionQueued(para_id, next_session).into()); + } +} + +impl_benchmark_test_suite!( + Pallet, + crate::mock::new_test_ext(Default::default()), + crate::mock::Test +); diff --git a/runtime/parachains/src/paras/weights.rs b/runtime/parachains/src/paras/weights.rs new file mode 100644 index 000000000000..d02acf4bc687 --- /dev/null +++ b/runtime/parachains/src/paras/weights.rs @@ -0,0 +1,97 @@ + +//! Autogenerated weights for `runtime_parachains::paras` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/polkadot +// benchmark +// --chain +// westend-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet +// runtime_parachains::paras +// --steps +// 50 +// --repeat +// 20 +// --raw +// --extrinsic +// * +// --output +// runtime/parachains/src/paras/weights.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_parachains::paras`. +pub struct WeightInfo(PhantomData); +impl super::WeightInfo for WeightInfo { + // Storage: Paras CurrentCodeHash (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras PastCodeMeta (r:1 w:1) + // Storage: Paras PastCodePruning (r:1 w:1) + // Storage: Paras PastCodeHash (r:0 w:1) + // Storage: Paras CodeByHash (r:0 w:1) + fn force_set_current_code(c: u32, ) -> Weight { + (14_669_000 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } + // Storage: Paras Heads (r:0 w:1) + fn force_set_current_head(s: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 0 + .saturating_add((2_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: Paras FutureCodeUpgrades (r:1 w:1) + // Storage: Paras UpcomingUpgrades (r:1 w:1) + // Storage: Paras UpgradeCooldowns (r:1 w:1) + // Storage: System Digest (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras CodeByHash (r:0 w:1) + // Storage: Paras FutureCodeHash (r:0 w:1) + // Storage: Paras UpgradeRestrictionSignal (r:0 w:1) + fn force_schedule_code_upgrade(c: u32, ) -> Weight { + (37_383_000 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + } + // Storage: Paras FutureCodeUpgrades (r:1 w:1) + // Storage: Paras FutureCodeHash (r:1 w:1) + // Storage: Paras CurrentCodeHash (r:1 w:1) + // Storage: System Digest (r:1 w:1) + // Storage: Paras PastCodeMeta (r:1 w:1) + // Storage: Paras PastCodePruning (r:1 w:1) + // Storage: Paras Heads (r:0 w:1) + // Storage: Paras PastCodeHash (r:0 w:1) + // Storage: Paras UpgradeGoAheadSignal (r:0 w:1) + fn force_note_new_head(s: u32, ) -> Weight { + (60_855_000 as Weight) + // Standard Error: 0 + .saturating_add((2_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(9 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras ActionsQueue (r:1 w:1) + fn force_queue_action() -> Weight { + (32_014_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/parachains/src/paras_inherent.rs b/runtime/parachains/src/paras_inherent.rs index 82e21cbe1805..cbffb9ff7937 100644 --- a/runtime/parachains/src/paras_inherent.rs +++ b/runtime/parachains/src/paras_inherent.rs @@ -66,8 +66,8 @@ pub mod pallet { /// The hash of the submitted parent header doesn't correspond to the saved block hash of /// the parent. InvalidParentHeader, - /// Potentially invalid candidate. - CandidateCouldBeInvalid, + /// Disputed candidate that was concluded invalid. + CandidateConcludedInvalid, } /// Whether the paras inherent was included within this block. @@ -123,7 +123,7 @@ pub mod pallet { target: LOG_TARGET, "dropping signed_bitfields and backed_candidates because they produced \ an invalid paras inherent: {:?}", - err, + err.error, ); ParachainsInherentData { @@ -135,11 +135,11 @@ pub mod pallet { }, }; - Some(Call::enter(inherent_data)) + Some(Call::enter { data: inherent_data }) } fn is_inherent(call: &Self::Call) -> bool { - matches!(call, Call::enter(..)) + matches!(call, Call::enter { .. }) } } @@ -173,30 +173,40 @@ pub mod pallet { // Handle disputes logic. let current_session = >::session_index(); - let freed_disputed: Vec<(_, FreedReason)> = { - let fresh_disputes = T::DisputesHandler::provide_multi_dispute_data(disputes)?; + { + let new_current_dispute_sets: Vec<_> = disputes + .iter() + .filter(|s| s.session == current_session) + .map(|s| (s.session, s.candidate_hash)) + .collect(); + + let _ = T::DisputesHandler::provide_multi_dispute_data(disputes)?; if T::DisputesHandler::is_frozen() { // The relay chain we are currently on is invalid. Proceed no further on parachains. Included::::set(Some(())); return Ok(Some(MINIMAL_INCLUSION_INHERENT_WEIGHT).into()) } - let any_current_session_disputes = - fresh_disputes.iter().any(|(s, _)| s == ¤t_session); - - if any_current_session_disputes { - let current_session_disputes: Vec<_> = fresh_disputes + let mut freed_disputed = if !new_current_dispute_sets.is_empty() { + let concluded_invalid_disputes: Vec<_> = new_current_dispute_sets .iter() - .filter(|(s, _)| s == ¤t_session) + .filter(|(s, c)| T::DisputesHandler::concluded_invalid(*s, *c)) .map(|(_, c)| *c) .collect(); - >::collect_disputed(current_session_disputes) + >::collect_disputed(concluded_invalid_disputes) .into_iter() .map(|core| (core, FreedReason::Concluded)) .collect() } else { Vec::new() + }; + + if !freed_disputed.is_empty() { + // unstable sort is fine, because core indices are unique + // i.e. the same candidate can't occupy 2 cores at once. + freed_disputed.sort_unstable_by_key(|pair| pair.0); // sort by core index + >::free_cores(freed_disputed); } }; @@ -224,12 +234,13 @@ pub mod pallet { }; // Schedule paras again, given freed cores, and reasons for freeing. - let mut freed = freed_disputed + let mut freed = freed_concluded .into_iter() - .chain(freed_concluded.into_iter().map(|(c, _hash)| (c, FreedReason::Concluded))) + .map(|(c, _hash)| (c, FreedReason::Concluded)) .chain(freed_timeout.into_iter().map(|c| (c, FreedReason::TimedOut))) .collect::>(); + // unstable sort is fine, because core indices are unique. freed.sort_unstable_by_key(|pair| pair.0); // sort by core index >::clear(); @@ -238,14 +249,14 @@ pub mod pallet { let backed_candidates = limit_backed_candidates::(backed_candidates); let backed_candidates_len = backed_candidates.len() as Weight; - // Refuse to back any candidates that are disputed or invalid. + // Refuse to back any candidates that were disputed and are concluded invalid. for candidate in &backed_candidates { ensure!( - !T::DisputesHandler::could_be_invalid( + !T::DisputesHandler::concluded_invalid( current_session, candidate.candidate.hash(), ), - Error::::CandidateCouldBeInvalid, + Error::::CandidateConcludedInvalid, ); } @@ -429,12 +440,14 @@ mod tests { System::set_block_consumed_resources(used_block_weight, 0); // execute the paras inherent - let post_info = Call::::enter(ParachainsInherentData { - bitfields: signed_bitfields, - backed_candidates, - disputes: Vec::new(), - parent_header: default_header(), - }) + let post_info = Call::::enter { + data: ParachainsInherentData { + bitfields: signed_bitfields, + backed_candidates, + disputes: Vec::new(), + parent_header: default_header(), + }, + } .dispatch_bypass_filter(None.into()) .unwrap_err() .post_info; @@ -477,12 +490,14 @@ mod tests { System::set_block_consumed_resources(used_block_weight, 0); // execute the paras inherent - let post_info = Call::::enter(ParachainsInherentData { - bitfields: signed_bitfields, - backed_candidates, - disputes: Vec::new(), - parent_header: header, - }) + let post_info = Call::::enter { + data: ParachainsInherentData { + bitfields: signed_bitfields, + backed_candidates, + disputes: Vec::new(), + parent_header: header, + }, + } .dispatch_bypass_filter(None.into()) .unwrap(); diff --git a/runtime/parachains/src/scheduler.rs b/runtime/parachains/src/scheduler.rs index ef06fb79beba..8e948e3b5529 100644 --- a/runtime/parachains/src/scheduler.rs +++ b/runtime/parachains/src/scheduler.rs @@ -40,6 +40,7 @@ use primitives::v1::{ CollatorId, CoreIndex, CoreOccupied, GroupIndex, GroupRotationInfo, Id as ParaId, ParathreadClaim, ParathreadEntry, ScheduledCore, ValidatorIndex, }; +use scale_info::TypeInfo; use sp_runtime::traits::{One, Saturating}; use sp_std::{convert::TryInto, prelude::*}; @@ -48,7 +49,7 @@ use crate::{configuration, initializer::SessionChangeNotification, paras}; pub use pallet::*; /// A queued parathread entry, pre-assigned to a core. -#[derive(Encode, Decode, Default)] +#[derive(Encode, Decode, Default, TypeInfo)] #[cfg_attr(test, derive(PartialEq, Debug))] pub struct QueuedParathread { claim: ParathreadEntry, @@ -56,7 +57,7 @@ pub struct QueuedParathread { } /// The queue of all parathread claims. -#[derive(Encode, Decode, Default)] +#[derive(Encode, Decode, Default, TypeInfo)] #[cfg_attr(test, derive(PartialEq, Debug))] pub struct ParathreadClaimQueue { queue: Vec, @@ -97,7 +98,7 @@ pub enum FreedReason { } /// The assignment type. -#[derive(Clone, Encode, Decode)] +#[derive(Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(PartialEq, Debug))] pub enum AssignmentKind { /// A parachain. @@ -107,7 +108,7 @@ pub enum AssignmentKind { } /// How a free core is scheduled to be assigned. -#[derive(Clone, Encode, Decode)] +#[derive(Clone, Encode, Decode, TypeInfo)] #[cfg_attr(feature = "std", derive(PartialEq, Debug))] pub struct CoreAssignment { /// The core that is assigned. @@ -368,6 +369,43 @@ impl Pallet { }) } + /// Free unassigned cores. Provide a list of cores that should be considered newly-freed along with the reason + /// for them being freed. The list is assumed to be sorted in ascending order by core index. + pub(crate) fn free_cores(just_freed_cores: impl IntoIterator) { + let config = >::config(); + + AvailabilityCores::::mutate(|cores| { + for (freed_index, freed_reason) in just_freed_cores { + if (freed_index.0 as usize) < cores.len() { + match cores[freed_index.0 as usize].take() { + None => continue, + Some(CoreOccupied::Parachain) => {}, + Some(CoreOccupied::Parathread(entry)) => { + match freed_reason { + FreedReason::Concluded => { + // After a parathread candidate has successfully been included, + // open it up for further claims! + ParathreadClaimIndex::::mutate(|index| { + if let Ok(i) = index.binary_search(&entry.claim.0) { + index.remove(i); + } + }) + }, + FreedReason::TimedOut => { + // If a parathread candidate times out, it's not the collator's fault, + // so we don't increment retries. + ParathreadQueue::::mutate(|queue| { + queue.enqueue_entry(entry, config.parathread_cores); + }) + }, + } + }, + } + } + } + }) + } + /// Schedule all unassigned cores, where possible. Provide a list of cores that should be considered /// newly-freed along with the reason for them being freed. The list is assumed to be sorted in /// ascending order by core index. @@ -375,38 +413,9 @@ impl Pallet { just_freed_cores: impl IntoIterator, now: T::BlockNumber, ) { - let mut cores = AvailabilityCores::::get(); - let config = >::config(); - - for (freed_index, freed_reason) in just_freed_cores { - if (freed_index.0 as usize) < cores.len() { - match cores[freed_index.0 as usize].take() { - None => continue, - Some(CoreOccupied::Parachain) => {}, - Some(CoreOccupied::Parathread(entry)) => { - match freed_reason { - FreedReason::Concluded => { - // After a parathread candidate has successfully been included, - // open it up for further claims! - ParathreadClaimIndex::::mutate(|index| { - if let Ok(i) = index.binary_search(&entry.claim.0) { - index.remove(i); - } - }) - }, - FreedReason::TimedOut => { - // If a parathread candidate times out, it's not the collator's fault, - // so we don't increment retries. - ParathreadQueue::::mutate(|queue| { - queue.enqueue_entry(entry, config.parathread_cores); - }) - }, - } - }, - } - } - } + Self::free_cores(just_freed_cores); + let cores = AvailabilityCores::::get(); let parachains = >::parachains(); let mut scheduled = Scheduled::::get(); let mut parathread_queue = ParathreadQueue::::get(); @@ -509,7 +518,6 @@ impl Pallet { Scheduled::::set(scheduled); ParathreadQueue::::set(parathread_queue); - AvailabilityCores::::set(cores); } /// Note that the given cores have become occupied. Behavior undefined if any of the given cores were not scheduled diff --git a/runtime/parachains/src/session_info.rs b/runtime/parachains/src/session_info.rs index feed95b099bf..d69f71e827b9 100644 --- a/runtime/parachains/src/session_info.rs +++ b/runtime/parachains/src/session_info.rs @@ -19,7 +19,10 @@ //! //! See https://w3f.github.io/parachain-implementers-guide/runtime/session_info.html. -use crate::{configuration, paras, scheduler, shared, util::take_active_subset}; +use crate::{ + configuration, paras, scheduler, shared, + util::{take_active_subset, take_active_subset_and_inactive}, +}; use frame_support::{pallet_prelude::*, traits::OneSessionHandler}; use primitives::v1::{AssignmentId, AuthorityDiscoveryId, SessionIndex, SessionInfo}; use sp_std::vec::Vec; @@ -120,7 +123,7 @@ impl Pallet { // create a new entry in `Sessions` with information about the current session let new_session_info = SessionInfo { validators, // these are from the notification and are thus already correct. - discovery_keys: take_active_subset(&active_set, &discovery_keys), + discovery_keys: take_active_subset_and_inactive(&active_set, &discovery_keys), assignment_keys: take_active_subset(&active_set, &assignment_keys), validator_groups, n_cores, @@ -176,6 +179,7 @@ mod tests { new_test_ext, Configuration, MockGenesisConfig, Origin, ParasShared, SessionInfo, System, Test, }, + util::take_active_subset, }; use keyring::Sr25519Keyring; use primitives::v1::{BlockNumber, ValidatorId, ValidatorIndex}; @@ -357,7 +361,7 @@ mod tests { assert_eq!(session.validators, validators); assert_eq!( session.discovery_keys, - take_active_subset(&active_set, &unscrambled_discovery), + take_active_subset_and_inactive(&active_set, &unscrambled_discovery), ); assert_eq!( session.assignment_keys, diff --git a/runtime/parachains/src/ump.rs b/runtime/parachains/src/ump.rs index 40f1a5a3acda..b7a1c9f508fd 100644 --- a/runtime/parachains/src/ump.rs +++ b/runtime/parachains/src/ump.rs @@ -18,14 +18,11 @@ use crate::{ configuration::{self, HostConfiguration}, initializer, }; -use frame_support::pallet_prelude::*; +use frame_support::{pallet_prelude::*, traits::EnsureOrigin}; +use frame_system::pallet_prelude::*; use primitives::v1::{Id as ParaId, UpwardMessage}; use sp_std::{ - collections::{btree_map::BTreeMap, vec_deque::VecDeque}, - convert::TryFrom, - fmt, - marker::PhantomData, - prelude::*, + collections::btree_map::BTreeMap, convert::TryFrom, fmt, marker::PhantomData, mem, prelude::*, }; use xcm::latest::Outcome; @@ -74,10 +71,18 @@ impl UmpSink for () { /// if the message content is unique. pub type MessageId = [u8; 32]; +/// Index used to identify overweight messages. +pub type OverweightIndex = u64; + /// A specific implementation of a `UmpSink` where messages are in the XCM format /// and will be forwarded to the XCM Executor. pub struct XcmSink(PhantomData<(XcmExecutor, Config)>); +/// Returns a [`MessageId`] for the given upward message payload. +fn upward_message_id(data: &[u8]) -> MessageId { + sp_io::hashing::blake2_256(data) +} + impl, C: Config> UmpSink for XcmSink { fn process_upward_message( origin: ParaId, @@ -86,11 +91,11 @@ impl, C: Config> UmpSink for XcmSi ) -> Result { use parity_scale_codec::DecodeLimit; use xcm::{ - latest::{Error as XcmError, Junction, MultiLocation, Xcm}, + latest::{Error as XcmError, Junction, Xcm}, VersionedXcm, }; - let id = sp_io::hashing::blake2_256(&data[..]); + let id = upward_message_id(&data[..]); let maybe_msg = VersionedXcm::::decode_all_with_depth_limit( xcm::MAX_XCM_DECODE_DEPTH, &mut &data[..], @@ -106,9 +111,8 @@ impl, C: Config> UmpSink for XcmSi Ok(0) }, Ok(Ok(xcm_message)) => { - let xcm_junction: Junction = Junction::Parachain(origin.into()); - let xcm_location: MultiLocation = xcm_junction.into(); - let outcome = XcmExecutor::execute_xcm(xcm_location, xcm_message, max_weight); + let xcm_junction = Junction::Parachain(origin.into()); + let outcome = XcmExecutor::execute_xcm(xcm_junction, xcm_message, max_weight); match outcome { Outcome::Error(XcmError::WeightLimitReached(required)) => Err((id, required)), outcome => { @@ -181,6 +185,9 @@ pub mod pallet { /// /// Generally you'll want this to be a bit more - 150 or 200 would be good values. type FirstMessageFactorPercent: Get; + + /// Origin which is allowed to execute overweight messages. + type ExecuteOverweightOrigin: EnsureOrigin; } #[pallet::event] @@ -201,6 +208,26 @@ pub mod pallet { /// Some downward messages have been received and will be processed. /// \[ para, count, size \] UpwardMessagesReceived(ParaId, u32, u32), + /// The weight budget was exceeded for an individual downward message. + /// + /// This message can be later dispatched manually using `service_overweight` dispatchable + /// using the assigned `overweight_index`. + /// + /// \[ para, id, overweight_index, required \] + OverweightEnqueued(ParaId, MessageId, OverweightIndex, Weight), + /// Downward message from the overweight queue was executed with the given actual weight + /// used. + /// + /// \[ overweight_index, used \] + OverweightServiced(OverweightIndex, Weight), + } + + #[pallet::error] + pub enum Error { + /// The message index given is unknown. + UnknownMessageIndex, + /// The amount of weight given is possibly not enough for executing the message. + WeightOverLimit, } /// The messages waiting to be handled by the relay-chain originating from a certain parachain. @@ -211,7 +238,7 @@ pub mod pallet { /// The messages are processed in FIFO order. #[pallet::storage] pub type RelayDispatchQueues = - StorageMap<_, Twox64Concat, ParaId, VecDeque, ValueQuery>; + StorageMap<_, Twox64Concat, ParaId, Vec, ValueQuery>; /// Size of the dispatch queues. Caches sizes of the queues in `RelayDispatchQueue`. /// @@ -246,8 +273,49 @@ pub mod pallet { #[pallet::storage] pub type NextDispatchRoundStartWith = StorageValue<_, ParaId>; + /// The messages that exceeded max individual message weight budget. + /// + /// These messages stay there until manually dispatched. + #[pallet::storage] + pub type Overweight = + StorageMap<_, Twox64Concat, OverweightIndex, (ParaId, Vec), OptionQuery>; + + /// The number of overweight messages ever recorded in `Overweight` (and thus the lowest free + /// index). + #[pallet::storage] + pub type OverweightCount = StorageValue<_, OverweightIndex, ValueQuery>; + #[pallet::call] - impl Pallet {} + impl Pallet { + /// Service a single overweight upward message. + /// + /// - `origin`: Must pass `ExecuteOverweightOrigin`. + /// - `index`: The index of the overweight message to service. + /// - `weight_limit`: The amount of weight that message execution may take. + /// + /// Errors: + /// - `UnknownMessageIndex`: Message of `index` is unknown. + /// - `WeightOverLimit`: Message execution may use greater than `weight_limit`. + /// + /// Events: + /// - `OverweightServiced`: On success. + #[pallet::weight(weight_limit.saturating_add(1_000_000))] + pub fn service_overweight( + origin: OriginFor, + index: OverweightIndex, + weight_limit: Weight, + ) -> DispatchResultWithPostInfo { + T::ExecuteOverweightOrigin::ensure_origin(origin)?; + + let (sender, data) = + Overweight::::get(index).ok_or(Error::::UnknownMessageIndex)?; + let used = T::UmpSink::process_upward_message(sender, &data[..], weight_limit) + .map_err(|_| Error::::WeightOverLimit)?; + Overweight::::remove(index); + Self::deposit_event(Event::OverweightServiced(index, used)); + Ok(Some(used.saturating_add(1_000_000)).into()) + } + } } /// Routines related to the upward message passing. @@ -407,25 +475,39 @@ impl Pallet { config.ump_service_total_weight - weight_used }; - // dequeue the next message from the queue of the dispatchee - let (upward_message, became_empty) = queue_cache.dequeue::(dispatchee); - if let Some(upward_message) = upward_message { - match T::UmpSink::process_upward_message( - dispatchee, - &upward_message[..], - max_weight, - ) { - Ok(used) => weight_used += used, + // attempt to process the next message from the queue of the dispatchee; if not beyond + // our remaining weight limit, then consume it. + let maybe_next = queue_cache.peek_front::(dispatchee); + if let Some(upward_message) = maybe_next { + match T::UmpSink::process_upward_message(dispatchee, upward_message, max_weight) { + Ok(used) => { + weight_used += used; + let _ = queue_cache.consume_front::(dispatchee); + }, Err((id, required)) => { - // we process messages in order and don't drop them if we run out of weight, so need to break - // here. - Self::deposit_event(Event::WeightExhausted(id, max_weight, required)); - break + if required > config.ump_max_individual_weight { + // overweight - add to overweight queue and continue with message + // execution consuming the message. + let upward_message = queue_cache.consume_front::(dispatchee).expect( + "`consume_front` should return the same msg as `peek_front`;\ + if we get into this branch then `peek_front` returned `Some`;\ + thus `upward_message` cannot be `None`; qed", + ); + let index = Self::stash_overweight(dispatchee, upward_message); + Self::deposit_event(Event::OverweightEnqueued( + dispatchee, id, index, required, + )); + } else { + // we process messages in order and don't drop them if we run out of weight, + // so need to break here without calling `consume_front`. + Self::deposit_event(Event::WeightExhausted(id, max_weight, required)); + break + } }, } } - if became_empty { + if queue_cache.is_empty::(dispatchee) { // the queue is empty now - this para doesn't need attention anymore. cursor.remove(); } else { @@ -438,12 +520,25 @@ impl Pallet { weight_used } + + /// Puts a given upward message into the list of overweight messages allowing it to be executed + /// later. + fn stash_overweight(sender: ParaId, upward_message: Vec) -> OverweightIndex { + let index = ::OverweightCount::mutate(|count| { + let index = *count; + *count += 1; + index + }); + + ::Overweight::insert(index, (sender, upward_message)); + index + } } /// To avoid constant fetching, deserializing and serialization the queues are cached. /// -/// After an item dequeued from a queue for the first time, the queue is stored in this struct rather -/// than being serialized and persisted. +/// After an item dequeued from a queue for the first time, the queue is stored in this struct +/// rather than being serialized and persisted. /// /// This implementation works best when: /// @@ -461,9 +556,10 @@ impl Pallet { struct QueueCache(BTreeMap); struct QueueCacheEntry { - queue: VecDeque, - count: u32, + queue: Vec, total_size: u32, + consumed_count: usize, + consumed_size: usize, } impl QueueCache { @@ -471,26 +567,46 @@ impl QueueCache { Self(BTreeMap::new()) } - /// Dequeues one item from the upward message queue of the given para. - /// - /// Returns `(upward_message, became_empty)`, where + fn ensure_cached(&mut self, para: ParaId) -> &mut QueueCacheEntry { + self.0.entry(para).or_insert_with(|| { + let queue = RelayDispatchQueues::::get(¶); + let (_, total_size) = RelayDispatchQueueSize::::get(¶); + QueueCacheEntry { queue, total_size, consumed_count: 0, consumed_size: 0 } + }) + } + + /// Returns the message at the front of `para`'s queue, or `None` if the queue is empty. /// - /// - `upward_message` a dequeued message or `None` if the queue _was_ empty. - /// - `became_empty` is true if the queue _became_ empty. - fn dequeue(&mut self, para: ParaId) -> (Option, bool) { - let cache_entry = self.0.entry(para).or_insert_with(|| { - let queue = as Store>::RelayDispatchQueues::get(¶); - let (count, total_size) = as Store>::RelayDispatchQueueSize::get(¶); - QueueCacheEntry { queue, count, total_size } - }); - let upward_message = cache_entry.queue.pop_front(); - if let Some(ref msg) = upward_message { - cache_entry.count -= 1; - cache_entry.total_size -= msg.len() as u32; + /// Does not mutate the queue. + fn peek_front(&mut self, para: ParaId) -> Option<&UpwardMessage> { + let entry = self.ensure_cached::(para); + entry.queue.get(entry.consumed_count) + } + + /// Attempts to remove one message from the front of `para`'s queue. If the queue is empty, then + /// does nothing. + fn consume_front(&mut self, para: ParaId) -> Option { + let cache_entry = self.ensure_cached::(para); + + match cache_entry.queue.get_mut(cache_entry.consumed_count) { + Some(msg) => { + cache_entry.consumed_count += 1; + cache_entry.consumed_size += msg.len(); + + Some(mem::take(msg)) + }, + None => None, } + } - let became_empty = cache_entry.queue.is_empty(); - (upward_message, became_empty) + /// Returns if the queue for the given para is empty. + /// + /// That is, if this returns `true` then the next call to [`peek_front`] will return `None`. + /// + /// Does not mutate the queue. + fn is_empty(&mut self, para: ParaId) -> bool { + let cache_entry = self.ensure_cached::(para); + cache_entry.consumed_count >= cache_entry.queue.len() } /// Flushes the updated queues into the storage. @@ -498,14 +614,16 @@ impl QueueCache { // NOTE we use an explicit method here instead of Drop impl because it has unwanted semantics // within runtime. It is dangerous to use because of double-panics and flushing on a panic // is not necessary as well. - for (para, QueueCacheEntry { queue, count, total_size }) in self.0 { - if queue.is_empty() { + for (para, entry) in self.0 { + if entry.consumed_count >= entry.queue.len() { // remove the entries altogether. - as Store>::RelayDispatchQueues::remove(¶); - as Store>::RelayDispatchQueueSize::remove(¶); - } else { - as Store>::RelayDispatchQueues::insert(¶, queue); - as Store>::RelayDispatchQueueSize::insert(¶, (count, total_size)); + RelayDispatchQueues::::remove(¶); + RelayDispatchQueueSize::::remove(¶); + } else if entry.consumed_count > 0 { + RelayDispatchQueues::::insert(¶, &entry.queue[entry.consumed_count..]); + let count = (entry.queue.len() - entry.consumed_count) as u32; + let size = entry.total_size.saturating_sub(entry.consumed_size as u32); + RelayDispatchQueueSize::::insert(¶, (count, size)); } } } @@ -586,137 +704,13 @@ impl NeedsDispatchCursor { } #[cfg(test)] -pub(crate) mod mock_sink { - //! An implementation of a mock UMP sink that allows attaching a probe for mocking the weights - //! and checking the sent messages. - //! - //! A default behavior of the UMP sink is to ignore an incoming message and return 0 weight. - //! - //! A probe can be attached to the mock UMP sink. When attached, the mock sink would consult the - //! probe to check whether the received message was expected and what weight it should return. - //! - //! There are two rules on how to use a probe: - //! - //! 1. There can be only one active probe at a time. Creation of another probe while there is - //! already an active one leads to a panic. The probe is scoped to a thread where it was created. - //! - //! 2. All messages expected by the probe must be received by the time of dropping it. Unreceived - //! messages will lead to a panic while dropping a probe. - - use super::{MessageId, ParaId, UmpSink, UpwardMessage}; - use frame_support::weights::Weight; - use std::{cell::RefCell, collections::vec_deque::VecDeque}; - - #[derive(Debug)] - struct UmpExpectation { - expected_origin: ParaId, - expected_msg: UpwardMessage, - mock_weight: Weight, - } - - std::thread_local! { - // `Some` here indicates that there is an active probe. - static HOOK: RefCell>> = RefCell::new(None); - } - - pub struct MockUmpSink; - impl UmpSink for MockUmpSink { - fn process_upward_message( - actual_origin: ParaId, - actual_msg: &[u8], - _max_weight: Weight, - ) -> Result { - Ok(HOOK - .with(|opt_hook| { - opt_hook.borrow_mut().as_mut().map(|hook| { - let UmpExpectation { expected_origin, expected_msg, mock_weight } = - match hook.pop_front() { - Some(expectation) => expectation, - None => { - panic!( - "The probe is active but didn't expect the message:\n\n\t{:?}.", - actual_msg, - ); - }, - }; - assert_eq!(expected_origin, actual_origin); - assert_eq!(expected_msg, &actual_msg[..]); - mock_weight - }) - }) - .unwrap_or(0)) - } - } - - pub struct Probe { - _private: (), - } - - impl Probe { - pub fn new() -> Self { - HOOK.with(|opt_hook| { - let prev = opt_hook.borrow_mut().replace(VecDeque::default()); - - // that can trigger if there were two probes were created during one session which - // is may be a bit strict, but may save time figuring out what's wrong. - // if you land here and you do need the two probes in one session consider - // dropping the the existing probe explicitly. - assert!(prev.is_none()); - }); - Self { _private: () } - } - - /// Add an expected message. - /// - /// The enqueued messages are processed in FIFO order. - pub fn assert_msg( - &mut self, - expected_origin: ParaId, - expected_msg: UpwardMessage, - mock_weight: Weight, - ) { - HOOK.with(|opt_hook| { - opt_hook.borrow_mut().as_mut().unwrap().push_back(UmpExpectation { - expected_origin, - expected_msg, - mock_weight, - }) - }); - } - } - - impl Drop for Probe { - fn drop(&mut self) { - let _ = HOOK.try_with(|opt_hook| { - let prev = opt_hook.borrow_mut().take().expect( - "this probe was created and hasn't been yet destroyed; - the probe cannot be replaced; - there is only one probe at a time allowed; - thus it cannot be `None`; - qed", - ); - - if !prev.is_empty() { - // some messages are left unchecked. We should notify the developer about this. - // however, we do so only if the thread doesn't panic already. Otherwise, the - // developer would get a SIGILL or SIGABRT without a meaningful error message. - if !std::thread::panicking() { - panic!( - "the probe is dropped and not all expected messages arrived: {:?}", - prev - ); - } - } - }); - // an `Err` here signals here that the thread local was already destroyed. - } - } -} - -#[cfg(test)] -mod tests { - use super::{mock_sink::Probe, *}; - use crate::mock::{new_test_ext, Configuration, MockGenesisConfig, Ump}; +pub(crate) mod tests { + use super::*; + use crate::mock::{ + assert_last_event, new_test_ext, take_processed, Configuration, MockGenesisConfig, Origin, + System, Test, Ump, + }; + use frame_support::{assert_noop, assert_ok, weights::Weight}; use std::collections::HashSet; struct GenesisConfigBuilder { @@ -725,6 +719,7 @@ mod tests { max_upward_queue_count: u32, max_upward_queue_size: u32, ump_service_total_weight: Weight, + ump_max_individual_weight: Weight, } impl Default for GenesisConfigBuilder { @@ -735,6 +730,7 @@ mod tests { max_upward_queue_count: 4, max_upward_queue_size: 64, ump_service_total_weight: 1000, + ump_max_individual_weight: 100, } } } @@ -749,6 +745,7 @@ mod tests { config.max_upward_queue_count = self.max_upward_queue_count; config.max_upward_queue_size = self.max_upward_queue_size; config.ump_service_total_weight = self.ump_service_total_weight; + config.ump_max_individual_weight = self.ump_max_individual_weight; genesis } } @@ -826,15 +823,12 @@ mod tests { #[test] fn dispatch_single_message() { let a = ParaId::from(228); - let msg = vec![1, 2, 3]; + let msg = 1000u32.encode(); new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { - let mut probe = Probe::new(); - - probe.assert_msg(a, msg.clone(), 0); - queue_upward_msg(a, msg); - + queue_upward_msg(a, msg.clone()); Ump::process_pending_upward_messages(); + assert_eq!(take_processed(), vec![(a, msg)]); assert_storage_consistency_exhaustive(); }); @@ -846,11 +840,11 @@ mod tests { let c = ParaId::from(228); let q = ParaId::from(911); - let a_msg_1 = vec![1, 2, 3]; - let a_msg_2 = vec![3, 2, 1]; - let c_msg_1 = vec![4, 5, 6]; - let c_msg_2 = vec![9, 8, 7]; - let q_msg = b"we are Q".to_vec(); + let a_msg_1 = (200u32, "a_msg_1").encode(); + let a_msg_2 = (100u32, "a_msg_2").encode(); + let c_msg_1 = (300u32, "c_msg_1").encode(); + let c_msg_2 = (100u32, "c_msg_2").encode(); + let q_msg = (500u32, "q_msg").encode(); new_test_ext( GenesisConfigBuilder { ump_service_total_weight: 500, ..Default::default() }.build(), @@ -864,52 +858,65 @@ mod tests { assert_storage_consistency_exhaustive(); // we expect only two first messages to fit in the first iteration. - { - let mut probe = Probe::new(); - - probe.assert_msg(a, a_msg_1.clone(), 300); - probe.assert_msg(c, c_msg_1.clone(), 300); - Ump::process_pending_upward_messages(); - assert_storage_consistency_exhaustive(); - - drop(probe); - } + Ump::process_pending_upward_messages(); + assert_eq!(take_processed(), vec![(a, a_msg_1), (c, c_msg_1)]); + assert_storage_consistency_exhaustive(); queue_upward_msg(c, c_msg_2.clone()); assert_storage_consistency_exhaustive(); // second iteration should process the second message. - { - let mut probe = Probe::new(); + Ump::process_pending_upward_messages(); + assert_eq!(take_processed(), vec![(q, q_msg)]); + assert_storage_consistency_exhaustive(); - probe.assert_msg(q, q_msg.clone(), 500); - Ump::process_pending_upward_messages(); - assert_storage_consistency_exhaustive(); + // 3rd iteration. + Ump::process_pending_upward_messages(); + assert_eq!(take_processed(), vec![(a, a_msg_2), (c, c_msg_2)]); + assert_storage_consistency_exhaustive(); - drop(probe); - } + // finally, make sure that the queue is empty. + Ump::process_pending_upward_messages(); + assert_eq!(take_processed(), vec![]); + assert_storage_consistency_exhaustive(); + }); + } - // 3rd iteration. - { - let mut probe = Probe::new(); + #[test] + fn dispatch_keeps_message_after_weight_exhausted() { + let a = ParaId::from(128); - probe.assert_msg(a, a_msg_2.clone(), 100); - probe.assert_msg(c, c_msg_2.clone(), 100); - Ump::process_pending_upward_messages(); - assert_storage_consistency_exhaustive(); + let a_msg_1 = (300u32, "a_msg_1").encode(); + let a_msg_2 = (300u32, "a_msg_2").encode(); - drop(probe); + new_test_ext( + GenesisConfigBuilder { + ump_service_total_weight: 500, + ump_max_individual_weight: 300, + ..Default::default() } + .build(), + ) + .execute_with(|| { + queue_upward_msg(a, a_msg_1.clone()); + queue_upward_msg(a, a_msg_2.clone()); - // finally, make sure that the queue is empty. - { - let probe = Probe::new(); + assert_storage_consistency_exhaustive(); - Ump::process_pending_upward_messages(); - assert_storage_consistency_exhaustive(); + // we expect only one message to fit in the first iteration. + Ump::process_pending_upward_messages(); + assert_eq!(take_processed(), vec![(a, a_msg_1)]); + assert_storage_consistency_exhaustive(); - drop(probe); - } + // second iteration should process the remaining message. + Ump::process_pending_upward_messages(); + assert_eq!(take_processed(), vec![(a, a_msg_2)]); + assert_storage_consistency_exhaustive(); + + // finally, make sure that the queue is empty. + Ump::process_pending_upward_messages(); + assert_eq!(take_processed(), vec![]); + assert_storage_consistency_exhaustive(); }); } @@ -918,9 +925,9 @@ mod tests { let a = ParaId::from(1991); let b = ParaId::from(1999); - let a_msg_1 = vec![1, 2, 3]; - let a_msg_2 = vec![3, 2, 1]; - let b_msg_1 = vec![4, 5, 6]; + let a_msg_1 = (300u32, "a_msg_1").encode(); + let a_msg_2 = (300u32, "a_msg_2").encode(); + let b_msg_1 = (300u32, "b_msg_1").encode(); new_test_ext( GenesisConfigBuilder { ump_service_total_weight: 900, ..Default::default() }.build(), @@ -935,18 +942,8 @@ mod tests { queue_upward_msg(a, a_msg_1.clone()); queue_upward_msg(a, a_msg_2.clone()); queue_upward_msg(b, b_msg_1.clone()); - - { - let mut probe = Probe::new(); - - probe.assert_msg(a, a_msg_1.clone(), 300); - probe.assert_msg(b, b_msg_1.clone(), 300); - probe.assert_msg(a, a_msg_2.clone(), 300); - - Ump::process_pending_upward_messages(); - - drop(probe); - } + Ump::process_pending_upward_messages(); + assert_eq!(take_processed(), vec![(a, a_msg_1), (b, b_msg_1), (a, a_msg_2)]); }); } @@ -976,4 +973,71 @@ mod tests { assert_eq!(size, 3); }); } + + #[test] + fn service_overweight_unknown() { + // This test just makes sure that 0 is not a valid index and we can use it not worrying in + // the next test. + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + assert_noop!( + Ump::service_overweight(Origin::root(), 0, 1000), + Error::::UnknownMessageIndex + ); + }); + } + + #[test] + fn overweight_queue_works() { + let para_a = ParaId::from(2021); + + let a_msg_1 = (301u32, "a_msg_1").encode(); + let a_msg_2 = (500u32, "a_msg_2").encode(); + let a_msg_3 = (500u32, "a_msg_3").encode(); + + new_test_ext( + GenesisConfigBuilder { + ump_service_total_weight: 900, + ump_max_individual_weight: 300, + ..Default::default() + } + .build(), + ) + .execute_with(|| { + // HACK: Start with the block number 1. This is needed because should an event be + // emitted during the genesis block they will be implicitly wiped. + System::set_block_number(1); + + // This one is overweight. However, the weight is plenty and we can afford to execute + // this message, thus expect it. + queue_upward_msg(para_a, a_msg_1.clone()); + Ump::process_pending_upward_messages(); + assert_eq!(take_processed(), vec![(para_a, a_msg_1)]); + + // This is overweight and this message cannot fit into the total weight budget. + queue_upward_msg(para_a, a_msg_2.clone()); + queue_upward_msg(para_a, a_msg_3.clone()); + Ump::process_pending_upward_messages(); + assert_last_event( + Event::OverweightEnqueued(para_a, upward_message_id(&a_msg_3[..]), 0, 500).into(), + ); + + // Now verify that if we wanted to service this overweight message with less than enough + // weight it will fail. + assert_noop!( + Ump::service_overweight(Origin::root(), 0, 499), + Error::::WeightOverLimit + ); + + // ... and if we try to service it with just enough weight it will succeed as well. + assert_ok!(Ump::service_overweight(Origin::root(), 0, 500)); + assert_last_event(Event::OverweightServiced(0, 500).into()); + + // ... and if we try to service a message with index that doesn't exist it will error + // out. + assert_noop!( + Ump::service_overweight(Origin::root(), 1, 1000), + Error::::UnknownMessageIndex + ); + }); + } } diff --git a/runtime/parachains/src/util.rs b/runtime/parachains/src/util.rs index 4f9d1e588ba1..2e0625f42202 100644 --- a/runtime/parachains/src/util.rs +++ b/runtime/parachains/src/util.rs @@ -18,7 +18,7 @@ //! on all modules. use primitives::v1::{Id as ParaId, PersistedValidationData, ValidatorIndex}; -use sp_std::vec::Vec; +use sp_std::{collections::btree_set::BTreeSet, vec::Vec}; use crate::{configuration, hrmp, paras}; @@ -41,15 +41,53 @@ pub fn make_persisted_validation_data( }) } -/// Take the active subset of a set containing all validators. -pub fn take_active_subset(active_validators: &[ValidatorIndex], set: &[T]) -> Vec { - let subset: Vec<_> = active_validators +/// Take an active subset of a set containing all validators. +/// +/// First item in pair will be all items in set have indices found in the `active` indices set (in +/// the order of the `active` vec, the second item will contain the rest, in the original order. +/// +/// ```ignore +/// split_active_subset(active, all).0 == take_active_subset(active, all) +/// ``` +pub fn split_active_subset(active: &[ValidatorIndex], all: &[T]) -> (Vec, Vec) { + let active_set: BTreeSet<_> = active.iter().cloned().collect(); + // active result has ordering of active set. + let active_result = take_active_subset(active, all); + // inactive result preserves original ordering of `all`. + let inactive_result = all .iter() - .filter_map(|i| set.get(i.0 as usize)) + .enumerate() + .filter(|(i, _)| !active_set.contains(&ValidatorIndex(*i as _))) + .map(|(_, v)| v) .cloned() .collect(); - if subset.len() != active_validators.len() { + if active_result.len() != active.len() { + log::warn!( + target: "runtime::parachains", + "Took active validators from set with wrong size.", + ); + } + + (active_result, inactive_result) +} + +/// Uses `split_active_subset` and concatenates the inactive to the active vec. +/// +/// ```ignore +/// split_active_subset(active, all)[0..active.len()]) == take_active_subset(active, all) +/// ``` +pub fn take_active_subset_and_inactive(active: &[ValidatorIndex], all: &[T]) -> Vec { + let (mut a, mut i) = split_active_subset(active, all); + a.append(&mut i); + a +} + +/// Take the active subset of a set containing all validators. +pub fn take_active_subset(active: &[ValidatorIndex], set: &[T]) -> Vec { + let subset: Vec<_> = active.iter().filter_map(|i| set.get(i.0 as usize)).cloned().collect(); + + if subset.len() != active.len() { log::warn!( target: "runtime::parachains", "Took active validators from set with wrong size", @@ -58,3 +96,23 @@ pub fn take_active_subset(active_validators: &[ValidatorIndex], set: & subset } + +#[cfg(test)] +mod tests { + + use sp_std::vec::Vec; + + use crate::util::{split_active_subset, take_active_subset}; + use primitives::v1::ValidatorIndex; + + #[test] + fn take_active_subset_is_compatible_with_split_active_subset() { + let active: Vec<_> = vec![ValidatorIndex(1), ValidatorIndex(7), ValidatorIndex(3)]; + let validators = vec![9, 1, 6, 7, 4, 5, 2, 3, 0, 8]; + let (selected, unselected) = split_active_subset(&active, &validators); + let selected2 = take_active_subset(&active, &validators); + assert_eq!(selected, selected2); + assert_eq!(unselected, vec![9, 6, 4, 5, 2, 0, 8]); + assert_eq!(selected, vec![1, 3, 7]); + } +} diff --git a/runtime/polkadot/src/constants.rs b/runtime/polkadot/src/constants.rs index cd3a6927d23a..3b53a55d6990 100644 --- a/runtime/polkadot/src/constants.rs +++ b/runtime/polkadot/src/constants.rs @@ -39,6 +39,7 @@ pub mod time { pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); pub const HOURS: BlockNumber = MINUTES * 60; pub const DAYS: BlockNumber = HOURS * 24; + pub const WEEKS: BlockNumber = DAYS * 7; // 1 in 4 blocks (on average, not counting collisions) will be primary babe blocks. pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4); diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index a4ca46ba7d3a..96a04b86e233 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -22,17 +22,26 @@ use pallet_transaction_payment::CurrencyAdapter; use runtime_common::{ - claims, impls::DealWithFees, AssignmentSessionKeyPlaceholder, BlockHashCount, BlockLength, - BlockWeights, CurrencyToVote, OffchainSolutionLengthLimit, OffchainSolutionWeightLimit, - ParachainSessionKeyPlaceholder, RocksDbWeight, SlowAdjustingFeeUpdate, + auctions, claims, crowdloan, impls::DealWithFees, paras_registrar, slots, BlockHashCount, + BlockLength, BlockWeights, CurrencyToVote, OffchainSolutionLengthLimit, + OffchainSolutionWeightLimit, RocksDbWeight, SlowAdjustingFeeUpdate, +}; + +use runtime_parachains::{ + configuration as parachains_configuration, dmp as parachains_dmp, hrmp as parachains_hrmp, + inclusion as parachains_inclusion, initializer as parachains_initializer, + origin as parachains_origin, paras as parachains_paras, + paras_inherent as parachains_paras_inherent, reward_points as parachains_reward_points, + runtime_api_impl::v1 as parachains_runtime_api_impl, scheduler as parachains_scheduler, + session_info as parachains_session_info, shared as parachains_shared, ump as parachains_ump, }; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; use beefy_primitives::crypto::AuthorityId as BeefyId; use frame_support::{ construct_runtime, parameter_types, - traits::{Contains, KeyOwnerProofSystem, LockIdentifier}, - weights::Weight, + traits::{Contains, KeyOwnerProofSystem, LockIdentifier, OnRuntimeUpgrade}, + weights::{constants::WEIGHT_PER_MILLIS, Weight}, PalletId, RuntimeDebug, }; use frame_system::{EnsureOneOf, EnsureRoot}; @@ -44,9 +53,9 @@ use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo}; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use primitives::v1::{ AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CommittedCandidateReceipt, - CoreState, GroupRotationInfo, Hash, Id, InboundDownwardMessage, InboundHrmpMessage, Moment, - Nonce, OccupiedCoreAssumption, PersistedValidationData, SessionInfo, Signature, ValidationCode, - ValidationCodeHash, ValidatorId, ValidatorIndex, + CoreState, GroupRotationInfo, Hash, Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, + Moment, Nonce, OccupiedCoreAssumption, PersistedValidationData, SessionInfo, Signature, + ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, }; use sp_core::{ u32_trait::{_1, _2, _3, _4, _5}, @@ -96,13 +105,13 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 9100, + spec_version: 9110, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] apis: version::create_apis_vec![[]], - transaction_version: 7, + transaction_version: 8, }; /// The BABE epoch configuration at genesis. @@ -148,7 +157,19 @@ impl Contains for BaseFilter { Call::Multisig(_) | Call::Bounties(_) | Call::Tips(_) | - Call::ElectionProviderMultiPhase(_) => true, + Call::ElectionProviderMultiPhase(_) | + Call::Configuration(_) | + Call::ParasShared(_) | + Call::ParaInclusion(_) | + Call::Paras(_) | + Call::Initializer(_) | + Call::ParaInherent(_) | + Call::Dmp(_) | + Call::Ump(_) | + Call::Hrmp(_) | + Call::Slots(_) => true, + // Disable paras registration, crowdloans, and auctions for now. + Call::Registrar(_) | Call::Auctions(_) | Call::Crowdloan(_) => false, } } } @@ -245,6 +266,8 @@ impl pallet_babe::Config for Runtime { pallet_babe::EquivocationHandler; type WeightInfo = (); + + type MaxAuthorities = MaxAuthorities; } parameter_types! { @@ -279,11 +302,15 @@ impl pallet_balances::Config for Runtime { parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; + /// This value increases the priority of `Operational` transactions by adding + /// a "virtual tip" that's equal to the `OperationalFeeMultiplier * final_fee`. + pub const OperationalFeeMultiplier: u8 = 5; } impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = CurrencyAdapter>; type TransactionByteFee = TransactionByteFee; + type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = WeightToFee; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; } @@ -315,8 +342,8 @@ impl_opaque_keys! { pub grandpa: Grandpa, pub babe: Babe, pub im_online: ImOnline, - pub para_validator: ParachainSessionKeyPlaceholder, - pub para_assignment: AssignmentSessionKeyPlaceholder, + pub para_validator: Initializer, + pub para_assignment: ParaSessionInfo, pub authority_discovery: AuthorityDiscovery, } } @@ -351,14 +378,15 @@ parameter_types! { pub const SignedDepositByte: Balance = deposit(0, 10) / 1024; // Each good submission will get 1 DOT as reward pub SignedRewardBase: Balance = 1 * UNITS; - // fallback: emergency phase. - pub const Fallback: pallet_election_provider_multi_phase::FallbackStrategy = - pallet_election_provider_multi_phase::FallbackStrategy::Nothing; pub SolutionImprovementThreshold: Perbill = Perbill::from_rational(5u32, 10_000); // miner configs - pub const MinerMaxIterations: u32 = 10; pub OffchainRepeat: BlockNumber = 5; + + /// Whilst `UseNominatorsAndUpdateBagsList` or `UseNominatorsMap` is in use, this can still be a + /// very large value. Once the `BagsList` is in full motion, staking might open its door to many + /// more nominators, and this value should instead be what is a "safe" number (e.g. 22500). + pub const VoterSnapshotPerBlock: u32 = 22_500; } sp_npos_elections::generate_solution_type!( @@ -385,22 +413,26 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type SlashHandler = (); // burn slashes type RewardHandler = (); // nothing to do upon rewards type SolutionImprovementThreshold = SolutionImprovementThreshold; - type MinerMaxIterations = MinerMaxIterations; type MinerMaxWeight = OffchainSolutionWeightLimit; // For now use the one from staking. type MinerMaxLength = OffchainSolutionLengthLimit; type OffchainRepeat = OffchainRepeat; type MinerTxPriority = NposSolutionPriority; type DataProvider = Staking; - type OnChainAccuracy = Perbill; type Solution = NposCompactSolution16; - type Fallback = Fallback; + type Fallback = pallet_election_provider_multi_phase::NoFallback; + type Solver = frame_election_provider_support::SequentialPhragmen< + AccountId, + pallet_election_provider_multi_phase::SolutionAccuracyOf, + runtime_common::elections::OffchainRandomBalancing, + >; type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig; type ForceOrigin = EnsureOneOf< AccountId, EnsureRoot, pallet_collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>, >; - type WeightInfo = weights::pallet_election_provider_multi_phase::WeightInfo; + type WeightInfo = weights::pallet_election_provider_multi_phase::WeightInfo; + type VoterSnapshotPerBlock = VoterSnapshotPerBlock; } // TODO #6469: This shouldn't be static, but a lazily cached value, not built unless needed, and @@ -436,6 +468,11 @@ type SlashCancelOrigin = EnsureOneOf< pallet_collective::EnsureProportionAtLeast<_3, _4, AccountId, CouncilCollective>, >; +impl frame_election_provider_support::onchain::Config for Runtime { + type Accuracy = runtime_common::elections::OnOnChainAccuracy; + type DataProvider = Staking; +} + impl pallet_staking::Config for Runtime { const MAX_NOMINATIONS: u32 = ::LIMIT as u32; @@ -457,10 +494,10 @@ impl pallet_staking::Config for Runtime { type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type NextNewSession = Session; type ElectionProvider = ElectionProviderMultiPhase; - type GenesisElectionProvider = - frame_election_provider_support::onchain::OnChainSequentialPhragmen< - pallet_election_provider_multi_phase::OnChainConfig, - >; + type GenesisElectionProvider = runtime_common::elections::GenesisElectionOf; + // Use the nominator map to iter voter AND no-ops for all SortedListProvider hooks. The migration + // to bags-list is a no-op, but the storage version will be updated. + type SortedListProvider = pallet_staking::UseNominatorsMap; type WeightInfo = weights::pallet_staking::WeightInfo; } @@ -675,6 +712,9 @@ parameter_types! { pub const BountyValueMinimum: Balance = 10 * DOLLARS; pub const MaxApprovals: u32 = 100; pub const MaxAuthorities: u32 = 100_000; + pub const MaxKeys: u32 = 10_000; + pub const MaxPeerInHeartbeats: u32 = 10_000; + pub const MaxPeerDataEncodingSize: u32 = 1_000; } type ApproveOrigin = EnsureOneOf< @@ -747,6 +787,9 @@ impl pallet_im_online::Config for Runtime { type ReportUnresponsiveness = Offences; type UnsignedPriority = ImOnlineUnsignedPriority; type WeightInfo = weights::pallet_im_online::WeightInfo; + type MaxKeys = MaxKeys; + type MaxPeerInHeartbeats = MaxPeerInHeartbeats; + type MaxPeerDataEncodingSize = MaxPeerDataEncodingSize; } impl pallet_grandpa::Config for Runtime { @@ -770,6 +813,7 @@ impl pallet_grandpa::Config for Runtime { >; type WeightInfo = (); + type MaxAuthorities = MaxAuthorities; } /// Submits a transaction with the node's public and signature type. Adheres to the signed extension @@ -902,7 +946,17 @@ parameter_types! { /// The type used to represent the kinds of proxying allowed. #[derive( - Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug, MaxEncodedLen, + Copy, + Clone, + Eq, + PartialEq, + Ord, + PartialOrd, + Encode, + Decode, + RuntimeDebug, + MaxEncodedLen, + scale_info::TypeInfo, )] pub enum ProxyType { Any = 0, @@ -912,6 +966,7 @@ pub enum ProxyType { // Skip 4 as it is now removed (was SudoBalances) IdentityJudgement = 5, CancelProxy = 6, + Auction = 7, } #[cfg(test)] @@ -960,9 +1015,9 @@ impl InstanceFilter for ProxyType { Call::Scheduler(..) | Call::Babe(..) | Call::Timestamp(..) | - Call::Indices(pallet_indices::Call::claim(..)) | - Call::Indices(pallet_indices::Call::free(..)) | - Call::Indices(pallet_indices::Call::freeze(..)) | + Call::Indices(pallet_indices::Call::claim{..}) | + Call::Indices(pallet_indices::Call::free{..}) | + Call::Indices(pallet_indices::Call::freeze{..}) | // Specifically omitting Indices `transfer`, `force_transfer` // Specifically omitting the entire Balances pallet Call::Authorship(..) | @@ -979,13 +1034,20 @@ impl InstanceFilter for ProxyType { Call::Bounties(..) | Call::Tips(..) | Call::Claims(..) | - Call::Vesting(pallet_vesting::Call::vest(..)) | - Call::Vesting(pallet_vesting::Call::vest_other(..)) | + Call::Vesting(pallet_vesting::Call::vest{..}) | + Call::Vesting(pallet_vesting::Call::vest_other{..}) | // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` Call::Utility(..) | Call::Identity(..) | Call::Proxy(..) | - Call::Multisig(..) + Call::Multisig(..) | + Call::Registrar(paras_registrar::Call::register {..}) | + Call::Registrar(paras_registrar::Call::deregister {..}) | + // Specifically omitting Registrar `swap` + Call::Registrar(paras_registrar::Call::reserve {..}) | + Call::Crowdloan(..) | + Call::Slots(..) | + Call::Auctions(..) // Specifically omitting the entire XCM Pallet ), ProxyType::Governance => matches!( c, @@ -1000,11 +1062,15 @@ impl InstanceFilter for ProxyType { }, ProxyType::IdentityJudgement => matches!( c, - Call::Identity(pallet_identity::Call::provide_judgement(..)) | Call::Utility(..) + Call::Identity(pallet_identity::Call::provide_judgement { .. }) | Call::Utility(..) ), ProxyType::CancelProxy => { - matches!(c, Call::Proxy(pallet_proxy::Call::reject_announcement(..))) + matches!(c, Call::Proxy(pallet_proxy::Call::reject_announcement { .. })) }, + ProxyType::Auction => matches!( + c, + Call::Auctions(..) | Call::Crowdloan(..) | Call::Registrar(..) | Call::Slots(..) + ), } } fn is_superset(&self, o: &Self) -> bool { @@ -1033,6 +1099,143 @@ impl pallet_proxy::Config for Runtime { type AnnouncementDepositFactor = AnnouncementDepositFactor; } +impl parachains_origin::Config for Runtime {} + +impl parachains_configuration::Config for Runtime { + type WeightInfo = weights::runtime_parachains_configuration::WeightInfo; +} + +impl parachains_shared::Config for Runtime {} + +impl parachains_session_info::Config for Runtime {} + +impl parachains_inclusion::Config for Runtime { + type Event = Event; + type DisputesHandler = (); + type RewardValidators = parachains_reward_points::RewardValidatorsWithEraPoints; +} + +impl parachains_paras::Config for Runtime { + type Origin = Origin; + type Event = Event; + type WeightInfo = weights::runtime_parachains_paras::WeightInfo; +} + +parameter_types! { + pub const FirstMessageFactorPercent: u64 = 100; +} + +impl parachains_ump::Config for Runtime { + type Event = Event; + type UmpSink = (); + type FirstMessageFactorPercent = FirstMessageFactorPercent; + type ExecuteOverweightOrigin = EnsureRoot; +} + +impl parachains_dmp::Config for Runtime {} + +impl parachains_hrmp::Config for Runtime { + type Event = Event; + type Origin = Origin; + type Currency = Balances; +} + +impl parachains_paras_inherent::Config for Runtime {} + +impl parachains_scheduler::Config for Runtime {} + +impl parachains_initializer::Config for Runtime { + type Randomness = pallet_babe::RandomnessFromOneEpochAgo; + type ForceOrigin = EnsureRoot; + type WeightInfo = weights::runtime_parachains_initializer::WeightInfo; +} + +parameter_types! { + // Mostly arbitrary deposit price, but should provide an adequate incentive not to spam reserve + // `ParaId`s. + pub const ParaDeposit: Balance = 100 * DOLLARS; + pub const ParaDataByteDeposit: Balance = deposit(0, 1); +} + +impl paras_registrar::Config for Runtime { + type Event = Event; + type Origin = Origin; + type Currency = Balances; + type OnSwap = (Crowdloan, Slots); + type ParaDeposit = ParaDeposit; + type DataDepositPerByte = ParaDataByteDeposit; + type WeightInfo = weights::runtime_common_paras_registrar::WeightInfo; +} + +parameter_types! { + // 12 weeks = 3 months per lease period -> 8 lease periods ~ 2 years + pub const LeasePeriod: BlockNumber = 12 * WEEKS; + // Polkadot Genesis was on May 26, 2020. + // Target Parachain Onboarding Date: Dec 15, 2021. + // Difference is 568 days. + // We want a lease period to start on the target onboarding date. + // 568 % (12 * 7) = 64 day offset + pub const LeaseOffset: BlockNumber = 64 * DAYS; +} + +impl slots::Config for Runtime { + type Event = Event; + type Currency = Balances; + type Registrar = Registrar; + type LeasePeriod = LeasePeriod; + type LeaseOffset = LeaseOffset; + type WeightInfo = weights::runtime_common_slots::WeightInfo; +} + +parameter_types! { + pub const CrowdloanId: PalletId = PalletId(*b"py/cfund"); + // Accounts for 10_000 contributions, each using 48 bytes (16 bytes for balance, and 32 bytes + // for a memo). + pub const SubmissionDeposit: Balance = deposit(1, 480_000); + // The minimum crowdloan contribution. + pub const MinContribution: Balance = 5 * DOLLARS; + pub const RemoveKeysLimit: u32 = 1000; + // Allow 32 bytes for an additional memo to a crowdloan. + pub const MaxMemoLength: u8 = 32; +} + +impl crowdloan::Config for Runtime { + type Event = Event; + type PalletId = CrowdloanId; + type SubmissionDeposit = SubmissionDeposit; + type MinContribution = MinContribution; + type RemoveKeysLimit = RemoveKeysLimit; + type Registrar = Registrar; + type Auctioneer = Auctions; + type MaxMemoLength = MaxMemoLength; + type WeightInfo = weights::runtime_common_crowdloan::WeightInfo; +} + +parameter_types! { + // The average auction is 7 days long, so this will be 70% for ending period. + // 5 Days = 72000 Blocks @ 6 sec per block + pub const EndingPeriod: BlockNumber = 5 * DAYS; + // ~ 1000 samples per day -> ~ 20 blocks per sample -> 2 minute samples + pub const SampleLength: BlockNumber = 2 * MINUTES; +} + +type AuctionInitiate = EnsureOneOf< + AccountId, + EnsureRoot, + pallet_collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>, +>; + +impl auctions::Config for Runtime { + type Event = Event; + type Leaser = Slots; + type Registrar = Registrar; + type EndingPeriod = EndingPeriod; + type SampleLength = SampleLength; + type Randomness = pallet_babe::RandomnessFromOneEpochAgo; + type InitiateOrigin = AuctionInitiate; + type WeightInfo = weights::runtime_common_auctions::WeightInfo; +} + construct_runtime! { pub enum Runtime where Block = Block, @@ -1094,6 +1297,25 @@ construct_runtime! { // Election pallet. Only works with staking, but placed here to maintain indices. ElectionProviderMultiPhase: pallet_election_provider_multi_phase::{Pallet, Call, Storage, Event, ValidateUnsigned} = 36, + // Parachains pallets. Start indices at 50 to leave room. + ParachainsOrigin: parachains_origin::{Pallet, Origin} = 50, + Configuration: parachains_configuration::{Pallet, Call, Storage, Config} = 51, + ParasShared: parachains_shared::{Pallet, Call, Storage} = 52, + ParaInclusion: parachains_inclusion::{Pallet, Call, Storage, Event} = 53, + ParaInherent: parachains_paras_inherent::{Pallet, Call, Storage, Inherent} = 54, + ParaScheduler: parachains_scheduler::{Pallet, Storage} = 55, + Paras: parachains_paras::{Pallet, Call, Storage, Event, Config} = 56, + Initializer: parachains_initializer::{Pallet, Call, Storage} = 57, + Dmp: parachains_dmp::{Pallet, Call, Storage} = 58, + Ump: parachains_ump::{Pallet, Call, Storage, Event} = 59, + Hrmp: parachains_hrmp::{Pallet, Call, Storage, Event} = 60, + ParaSessionInfo: parachains_session_info::{Pallet, Storage} = 61, + + // Parachain Onboarding Pallets. Start indices at 70 to leave room. + Registrar: paras_registrar::{Pallet, Call, Storage, Event} = 70, + Slots: slots::{Pallet, Call, Storage, Event} = 71, + Auctions: auctions::{Pallet, Call, Storage, Event} = 72, + Crowdloan: crowdloan::{Pallet, Call, Storage, Event} = 73, } } @@ -1127,11 +1349,226 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPallets, - (), + ( + SetInitialHostConfiguration, + BountiesPrefixMigration, + CouncilStoragePrefixMigration, + TechnicalCommitteeStoragePrefixMigration, + TechnicalMembershipStoragePrefixMigration, + MigrateTipsPalletPrefix, + ), >; /// The payload being signed in transactions. pub type SignedPayload = generic::SignedPayload; +const BOUNTIES_OLD_PREFIX: &str = "Treasury"; + +/// Migrate from 'Treasury' to the new prefix 'Bounties' +pub struct BountiesPrefixMigration; + +impl OnRuntimeUpgrade for BountiesPrefixMigration { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + use frame_support::traits::PalletInfo; + let name = ::PalletInfo::name::() + .expect("Bounties is part of runtime, so it has a name; qed"); + pallet_bounties::migrations::v4::migrate::(BOUNTIES_OLD_PREFIX, name) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + use frame_support::traits::PalletInfo; + let name = ::PalletInfo::name::() + .expect("Bounties is part of runtime, so it has a name; qed"); + pallet_bounties::migrations::v4::pre_migration::( + BOUNTIES_OLD_PREFIX, + name, + ); + Ok(()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + use frame_support::traits::PalletInfo; + let name = ::PalletInfo::name::() + .expect("Bounties is part of runtime, so it has a name; qed"); + pallet_bounties::migrations::v4::post_migration::( + BOUNTIES_OLD_PREFIX, + name, + ); + Ok(()) + } +} + +const COUNCIL_OLD_PREFIX: &str = "Instance1Collective"; +/// Migrate from `Instance1Collective` to the new pallet prefix `Council` +pub struct CouncilStoragePrefixMigration; + +impl OnRuntimeUpgrade for CouncilStoragePrefixMigration { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + pallet_collective::migrations::v4::migrate::(COUNCIL_OLD_PREFIX) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + pallet_collective::migrations::v4::pre_migrate::(COUNCIL_OLD_PREFIX); + Ok(()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + pallet_collective::migrations::v4::post_migrate::(COUNCIL_OLD_PREFIX); + Ok(()) + } +} + +const TECHNICAL_COMMITTEE_OLD_PREFIX: &str = "Instance2Collective"; +/// Migrate from `Instance2Collective` to the new pallet prefix `TechnicalCommittee` +pub struct TechnicalCommitteeStoragePrefixMigration; + +impl OnRuntimeUpgrade for TechnicalCommitteeStoragePrefixMigration { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + pallet_collective::migrations::v4::migrate::( + TECHNICAL_COMMITTEE_OLD_PREFIX, + ) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + pallet_collective::migrations::v4::pre_migrate::( + TECHNICAL_COMMITTEE_OLD_PREFIX, + ); + Ok(()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + pallet_collective::migrations::v4::post_migrate::( + TECHNICAL_COMMITTEE_OLD_PREFIX, + ); + Ok(()) + } +} + +const TECHNICAL_MEMBERSHIP_OLD_PREFIX: &str = "Instance1Membership"; +/// Migrate from `Instance1Membership` to the new pallet prefix `TechnicalMembership` +pub struct TechnicalMembershipStoragePrefixMigration; + +impl OnRuntimeUpgrade for TechnicalMembershipStoragePrefixMigration { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + use frame_support::traits::PalletInfo; + let name = ::PalletInfo::name::() + .expect("TechnialMembership is part of runtime, so it has a name; qed"); + pallet_membership::migrations::v4::migrate::( + TECHNICAL_MEMBERSHIP_OLD_PREFIX, + name, + ) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + use frame_support::traits::PalletInfo; + let name = ::PalletInfo::name::() + .expect("TechnicalMembership is part of runtime, so it has a name; qed"); + pallet_membership::migrations::v4::pre_migrate::( + TECHNICAL_MEMBERSHIP_OLD_PREFIX, + name, + ); + Ok(()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + use frame_support::traits::PalletInfo; + let name = ::PalletInfo::name::() + .expect("TechnicalMembership is part of runtime, so it has a name; qed"); + pallet_membership::migrations::v4::post_migrate::( + TECHNICAL_MEMBERSHIP_OLD_PREFIX, + name, + ); + Ok(()) + } +} + +/// Set the initial host configuration for Polkadot. +pub struct SetInitialHostConfiguration; +impl OnRuntimeUpgrade for SetInitialHostConfiguration { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + use parachains_configuration::HostConfiguration; + + let active_config: HostConfiguration = HostConfiguration { + max_code_size: 10_485_760, + max_head_data_size: 20_480, + max_upward_queue_count: 10, + max_upward_queue_size: 51_200, + max_upward_message_size: 51_200, + max_upward_message_num_per_candidate: 10, + hrmp_max_message_num_per_candidate: 10, + validation_upgrade_frequency: 14_400, + validation_upgrade_delay: 600, + max_pov_size: 5_242_880, + max_downward_message_size: 51_200, + ump_service_total_weight: 100_000_000_000, + hrmp_max_parachain_outbound_channels: 10, + hrmp_max_parathread_outbound_channels: 0, + hrmp_sender_deposit: deposit(1004, 100 * 1024), + hrmp_recipient_deposit: deposit(1004, 100 * 1024), + hrmp_channel_max_capacity: 1_000, + hrmp_channel_max_total_size: 102_400, + hrmp_max_parachain_inbound_channels: 10, + hrmp_max_parathread_inbound_channels: 0, + hrmp_channel_max_message_size: 102_400, + code_retention_period: EPOCH_DURATION_IN_SLOTS * 6, + parathread_cores: 0, + parathread_retries: 0, + group_rotation_frequency: 10, + chain_availability_period: 10, + thread_availability_period: 10, + scheduling_lookahead: 1, + max_validators_per_core: Some(5), + max_validators: Some(200), + dispute_period: 6, + dispute_post_conclusion_acceptance_period: 600, + dispute_max_spam_slots: 2, + dispute_conclusion_by_time_out_period: 600, + no_show_slots: 2, + n_delay_tranches: 89, + zeroth_delay_tranche_width: 0, + needed_approvals: 30, + relay_vrf_modulo_samples: 40, + ump_max_individual_weight: 20 * WEIGHT_PER_MILLIS, + }; + + // Only set the config if it's needed to be set explicitly. + if Configuration::config() == Default::default() { + Configuration::force_set_active_config(active_config); + } + + RocksDbWeight::get().reads(1) + RocksDbWeight::get().writes(1) + } +} + +const TIPS_OLD_PREFIX: &str = "Treasury"; +/// Migrate pallet-tips from `Treasury` to the new pallet prefix `Tips` +pub struct MigrateTipsPalletPrefix; + +impl OnRuntimeUpgrade for MigrateTipsPalletPrefix { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + pallet_tips::migrations::v4::migrate::(TIPS_OLD_PREFIX) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + pallet_tips::migrations::v4::pre_migrate::(TIPS_OLD_PREFIX); + Ok(()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + pallet_tips::migrations::v4::post_migrate::(TIPS_OLD_PREFIX); + Ok(()) + } +} + #[cfg(not(feature = "disable-runtime-api"))] sp_api::impl_runtime_apis! { impl sp_api::Core for Runtime { @@ -1150,7 +1587,7 @@ sp_api::impl_runtime_apis! { impl sp_api::Metadata for Runtime { fn metadata() -> OpaqueMetadata { - Runtime::metadata().into() + OpaqueMetadata::new(Runtime::metadata().into()) } } @@ -1193,60 +1630,69 @@ sp_api::impl_runtime_apis! { impl primitives::v1::ParachainHost for Runtime { fn validators() -> Vec { - Vec::new() + parachains_runtime_api_impl::validators::() } fn validator_groups() -> (Vec>, GroupRotationInfo) { - (Vec::new(), GroupRotationInfo { session_start_block: 0, group_rotation_frequency: 0, now: 0 }) + parachains_runtime_api_impl::validator_groups::() } fn availability_cores() -> Vec> { - Vec::new() + parachains_runtime_api_impl::availability_cores::() } - fn persisted_validation_data(_: Id, _: OccupiedCoreAssumption) + fn persisted_validation_data(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option> { - None + parachains_runtime_api_impl::persisted_validation_data::(para_id, assumption) } - fn check_validation_outputs(_: Id, _: primitives::v1::CandidateCommitments) -> bool { - false + fn check_validation_outputs( + para_id: ParaId, + outputs: primitives::v1::CandidateCommitments, + ) -> bool { + parachains_runtime_api_impl::check_validation_outputs::(para_id, outputs) } fn session_index_for_child() -> SessionIndex { - 0 + parachains_runtime_api_impl::session_index_for_child::() } - fn session_info(_: SessionIndex) -> Option { - None + fn validation_code(para_id: ParaId, assumption: OccupiedCoreAssumption) + -> Option { + parachains_runtime_api_impl::validation_code::(para_id, assumption) } - fn validation_code(_: Id, _: OccupiedCoreAssumption) -> Option { - None + fn candidate_pending_availability(para_id: ParaId) -> Option> { + parachains_runtime_api_impl::candidate_pending_availability::(para_id) } - fn candidate_pending_availability(_: Id) -> Option> { - None + fn candidate_events() -> Vec> { + parachains_runtime_api_impl::candidate_events::(|ev| { + match ev { + Event::ParaInclusion(ev) => { + Some(ev) + } + _ => None, + } + }) } - fn candidate_events() -> Vec> { - Vec::new() + fn session_info(index: SessionIndex) -> Option { + parachains_runtime_api_impl::session_info::(index) } - fn dmq_contents( - _recipient: Id, - ) -> Vec> { - Vec::new() + fn dmq_contents(recipient: ParaId) -> Vec> { + parachains_runtime_api_impl::dmq_contents::(recipient) } fn inbound_hrmp_channels_contents( - _recipient: Id - ) -> BTreeMap>> { - BTreeMap::new() + recipient: ParaId + ) -> BTreeMap>> { + parachains_runtime_api_impl::inbound_hrmp_channels_contents::(recipient) } - fn validation_code_by_hash(_hash: ValidationCodeHash) -> Option { - None + fn validation_code_by_hash(hash: ValidationCodeHash) -> Option { + parachains_runtime_api_impl::validation_code_by_hash::(hash) } } @@ -1329,7 +1775,7 @@ sp_api::impl_runtime_apis! { slot_duration: Babe::slot_duration(), epoch_length: EpochDuration::get(), c: BABE_GENESIS_EPOCH_CONFIG.c, - genesis_authorities: Babe::authorities(), + genesis_authorities: Babe::authorities().to_vec(), randomness: Babe::randomness(), allowed_slots: BABE_GENESIS_EPOCH_CONFIG.allowed_slots, } @@ -1409,10 +1855,14 @@ sp_api::impl_runtime_apis! { #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade() -> Result<(Weight, Weight), sp_runtime::RuntimeString> { + fn on_runtime_upgrade() -> (Weight, Weight) { log::info!("try-runtime::on_runtime_upgrade polkadot."); - let weight = Executive::try_runtime_upgrade()?; - Ok((weight, BlockWeights::get().max_block)) + let weight = Executive::try_runtime_upgrade().unwrap(); + (weight, BlockWeights::get().max_block) + } + + fn execute_block_no_check(block: Block) -> Weight { + Executive::execute_block_no_check(block) } } @@ -1435,6 +1885,10 @@ sp_api::impl_runtime_apis! { // NOTE: Make sure to prefix these `runtime_common::` so that path resolves correctly // in the generated file. list_benchmark!(list, extra, runtime_common::claims, Claims); + list_benchmark!(list, extra, runtime_common::crowdloan, Crowdloan); + list_benchmark!(list, extra, runtime_common::claims, Claims); + list_benchmark!(list, extra, runtime_common::slots, Slots); + list_benchmark!(list, extra, runtime_common::paras_registrar, Registrar); // Substrate list_benchmark!(list, extra, pallet_balances, Balances); list_benchmark!(list, extra, pallet_bounties, Bounties); @@ -1503,6 +1957,10 @@ sp_api::impl_runtime_apis! { // NOTE: Make sure to prefix these `runtime_common::` so that path resolves correctly // in the generated file. add_benchmark!(params, batches, runtime_common::claims, Claims); + add_benchmark!(params, batches, runtime_common::crowdloan, Crowdloan); + add_benchmark!(params, batches, runtime_common::claims, Claims); + add_benchmark!(params, batches, runtime_common::slots, Slots); + add_benchmark!(params, batches, runtime_common::paras_registrar, Registrar); // Substrate add_benchmark!(params, batches, pallet_balances, Balances); add_benchmark!(params, batches, pallet_bounties, Bounties); @@ -1578,10 +2036,10 @@ mod test_fees { #[ignore] fn transfer_cost_min_multiplier() { let min_multiplier = runtime_common::MinimumMultiplier::get(); - let call = >::transfer_keep_alive( - Default::default(), - Default::default(), - ); + let call = pallet_balances::Call::::transfer_keep_alive { + dest: Default::default(), + value: Default::default(), + }; let info = call.get_dispatch_info(); // convert to outer call. let call = Call::Balances(call); diff --git a/runtime/polkadot/src/weights/mod.rs b/runtime/polkadot/src/weights/mod.rs index 046bc9f0a4c1..19842799a533 100644 --- a/runtime/polkadot/src/weights/mod.rs +++ b/runtime/polkadot/src/weights/mod.rs @@ -37,4 +37,11 @@ pub mod pallet_tips; pub mod pallet_treasury; pub mod pallet_utility; pub mod pallet_vesting; +pub mod runtime_common_auctions; pub mod runtime_common_claims; +pub mod runtime_common_crowdloan; +pub mod runtime_common_paras_registrar; +pub mod runtime_common_slots; +pub mod runtime_parachains_configuration; +pub mod runtime_parachains_initializer; +pub mod runtime_parachains_paras; diff --git a/runtime/polkadot/src/weights/pallet_balances.rs b/runtime/polkadot/src/weights/pallet_balances.rs index 1fd1ac72f6d4..8aff3b4185f9 100644 --- a/runtime/polkadot/src/weights/pallet_balances.rs +++ b/runtime/polkadot/src/weights/pallet_balances.rs @@ -72,4 +72,10 @@ impl pallet_balances::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: System Account (r:1 w:1) + fn force_unreserve() -> Weight { + (27_766_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } } diff --git a/runtime/polkadot/src/weights/pallet_collective_council.rs b/runtime/polkadot/src/weights/pallet_collective_council.rs index d0a389bfac09..6d7eabaef2b2 100644 --- a/runtime/polkadot/src/weights/pallet_collective_council.rs +++ b/runtime/polkadot/src/weights/pallet_collective_council.rs @@ -41,7 +41,7 @@ use frame_support::{traits::Get, weights::Weight}; use sp_std::marker::PhantomData; -/// Weight functions for pallet_collective. +/// Weight functions for `pallet_collective`. pub struct WeightInfo(PhantomData); impl pallet_collective::WeightInfo for WeightInfo { // Storage: Instance1Collective Members (r:1 w:1) diff --git a/runtime/polkadot/src/weights/pallet_collective_technical_committee.rs b/runtime/polkadot/src/weights/pallet_collective_technical_committee.rs index 9c50b3b58ba1..a272fc708f00 100644 --- a/runtime/polkadot/src/weights/pallet_collective_technical_committee.rs +++ b/runtime/polkadot/src/weights/pallet_collective_technical_committee.rs @@ -41,7 +41,7 @@ use frame_support::{traits::Get, weights::Weight}; use sp_std::marker::PhantomData; -/// Weight functions for pallet_collective. +/// Weight functions for `pallet_collective`. pub struct WeightInfo(PhantomData); impl pallet_collective::WeightInfo for WeightInfo { // Storage: Instance2Collective Members (r:1 w:1) diff --git a/runtime/polkadot/src/weights/pallet_democracy.rs b/runtime/polkadot/src/weights/pallet_democracy.rs index 868ff527ec1d..f5af1c433b95 100644 --- a/runtime/polkadot/src/weights/pallet_democracy.rs +++ b/runtime/polkadot/src/weights/pallet_democracy.rs @@ -129,6 +129,13 @@ impl pallet_democracy::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) } + fn on_initialize_base_with_launch_period(r: u32) -> Weight { + (7_728_000 as Weight) + // Standard Error: 4_000 + .saturating_add((5_099_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + } fn delegate(r: u32) -> Weight { (53_667_000 as Weight) // Standard Error: 4_000 diff --git a/runtime/polkadot/src/weights/pallet_election_provider_multi_phase.rs b/runtime/polkadot/src/weights/pallet_election_provider_multi_phase.rs index 82de96068ff0..a4af284de9ad 100644 --- a/runtime/polkadot/src/weights/pallet_election_provider_multi_phase.rs +++ b/runtime/polkadot/src/weights/pallet_election_provider_multi_phase.rs @@ -83,7 +83,7 @@ impl pallet_election_provider_multi_phase::WeightInfo f // Storage: ElectionProviderMultiPhase SnapshotMetadata (r:0 w:1) // Storage: ElectionProviderMultiPhase DesiredTargets (r:0 w:1) // Storage: ElectionProviderMultiPhase Snapshot (r:0 w:1) - fn create_snapshot_internal() -> Weight { + fn create_snapshot_internal(_: u32, _: u32) -> Weight { (8_835_233_000 as Weight).saturating_add(T::DbWeight::get().writes(3 as Weight)) } // Storage: ElectionProviderMultiPhase SignedSubmissionIndices (r:1 w:1) diff --git a/runtime/polkadot/src/weights/pallet_staking.rs b/runtime/polkadot/src/weights/pallet_staking.rs index 81b65921bbf1..2e30aabcbf09 100644 --- a/runtime/polkadot/src/weights/pallet_staking.rs +++ b/runtime/polkadot/src/weights/pallet_staking.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// Copyright 2017-2021 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -15,8 +15,8 @@ // along with Polkadot. If not, see . //! Autogenerated weights for `pallet_staking` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-07-01, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-17, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 // Executed Command: @@ -33,6 +33,8 @@ // --header=./file_header.txt // --output=./runtime/polkadot/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] @@ -42,181 +44,343 @@ use sp_std::marker::PhantomData; /// Weight functions for `pallet_staking`. pub struct WeightInfo(PhantomData); impl pallet_staking::WeightInfo for WeightInfo { + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking HistoryDepth (r:1 w:0) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Payee (r:0 w:1) fn bond() -> Weight { - (70_259_000 as Weight) + (64_842_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } + // Storage: Staking Bonded (r:1 w:0) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Nominators (r:1 w:0) fn bond_extra() -> Weight { - (53_621_000 as Weight) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) + (63_943_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking Nominators (r:1 w:0) + // Storage: Staking MinNominatorBond (r:1 w:0) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Balances Locks (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: Staking Bonded (r:1 w:0) fn unbond() -> Weight { - (57_038_000 as Weight) - .saturating_add(T::DbWeight::get().reads(6 as Weight)) + (67_903_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } - fn withdraw_unbonded_update(s: u32) -> Weight { - (49_182_000 as Weight) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Balances Locks (r:1 w:1) + // Storage: System Account (r:1 w:1) + fn withdraw_unbonded_update(s: u32, ) -> Weight { + (46_134_000 as Weight) // Standard Error: 0 - .saturating_add((31_000 as Weight).saturating_mul(s as Weight)) + .saturating_add((36_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } - fn withdraw_unbonded_kill(s: u32) -> Weight { - (81_006_000 as Weight) - // Standard Error: 1_000 - .saturating_add((2_333_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(8 as Weight)) - .saturating_add(T::DbWeight::get().writes(6 as Weight)) - .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking SlashingSpans (r:1 w:0) + // Storage: Staking Validators (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Payee (r:0 w:1) + fn withdraw_unbonded_kill(_s: u32, ) -> Weight { + (67_717_000 as Weight) + .saturating_add(T::DbWeight::get().reads(9 as Weight)) + .saturating_add(T::DbWeight::get().writes(7 as Weight)) } + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking MinValidatorBond (r:1 w:0) + // Storage: Staking Validators (r:1 w:1) + // Storage: Staking MaxValidatorsCount (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: Staking CounterForValidators (r:1 w:1) fn validate() -> Weight { - (31_525_000 as Weight) - .saturating_add(T::DbWeight::get().reads(6 as Weight)) - .saturating_add(T::DbWeight::get().writes(2 as Weight)) + (36_901_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) } - fn kick(k: u32) -> Weight { - (10_487_000 as Weight) - // Standard Error: 7_000 - .saturating_add((16_334_000 as Weight).saturating_mul(k as Weight)) + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + fn kick(k: u32, ) -> Weight { + (9_945_000 as Weight) + // Standard Error: 10_000 + .saturating_add((15_330_000 as Weight).saturating_mul(k as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(k as Weight))) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(k as Weight))) } - fn nominate(n: u32) -> Weight { - (38_083_000 as Weight) - // Standard Error: 10_000 - .saturating_add((5_185_000 as Weight).saturating_mul(n as Weight)) - .saturating_add(T::DbWeight::get().reads(7 as Weight)) + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking MinNominatorBond (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking MaxNominatorsCount (r:1 w:0) + // Storage: Staking Validators (r:2 w:0) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: Staking Bonded (r:1 w:0) + fn nominate(n: u32, ) -> Weight { + (48_492_000 as Weight) + // Standard Error: 14_000 + .saturating_add((4_775_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(8 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking Validators (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) fn chill() -> Weight { - (16_783_000 as Weight).saturating_add(T::DbWeight::get().reads(3 as Weight)) + (36_148_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking Payee (r:0 w:1) fn set_payee() -> Weight { - (11_391_000 as Weight) + (10_737_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking Ledger (r:2 w:2) fn set_controller() -> Weight { - (24_470_000 as Weight) + (23_913_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } + // Storage: Staking ValidatorCount (r:0 w:1) fn set_validator_count() -> Weight { - (1_879_000 as Weight).saturating_add(T::DbWeight::get().writes(1 as Weight)) + (2_027_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking ForceEra (r:0 w:1) fn force_no_eras() -> Weight { - (2_139_000 as Weight).saturating_add(T::DbWeight::get().writes(1 as Weight)) + (2_343_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking ForceEra (r:0 w:1) fn force_new_era() -> Weight { - (2_096_000 as Weight).saturating_add(T::DbWeight::get().writes(1 as Weight)) + (2_369_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking ForceEra (r:0 w:1) fn force_new_era_always() -> Weight { - (2_089_000 as Weight).saturating_add(T::DbWeight::get().writes(1 as Weight)) + (2_400_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn set_invulnerables(v: u32) -> Weight { - (2_143_000 as Weight) + // Storage: Staking Invulnerables (r:0 w:1) + fn set_invulnerables(v: u32, ) -> Weight { + (2_197_000 as Weight) // Standard Error: 0 - .saturating_add((23_000 as Weight).saturating_mul(v as Weight)) + .saturating_add((56_000 as Weight).saturating_mul(v as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn force_unstake(s: u32) -> Weight { - (58_264_000 as Weight) - // Standard Error: 1_000 - .saturating_add((2_309_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(6 as Weight)) - .saturating_add(T::DbWeight::get().writes(6 as Weight)) + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking SlashingSpans (r:1 w:0) + // Storage: Staking Validators (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Ledger (r:0 w:1) + // Storage: Staking Payee (r:0 w:1) + // Storage: Staking SpanSlash (r:0 w:2) + fn force_unstake(s: u32, ) -> Weight { + (62_032_000 as Weight) + // Standard Error: 2_000 + .saturating_add((2_220_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } - fn cancel_deferred_slash(s: u32) -> Weight { - (3_444_385_000 as Weight) - // Standard Error: 224_000 - .saturating_add((19_743_000 as Weight).saturating_mul(s as Weight)) + // Storage: Staking UnappliedSlashes (r:1 w:1) + fn cancel_deferred_slash(s: u32, ) -> Weight { + (2_811_250_000 as Weight) + // Standard Error: 182_000 + .saturating_add((16_184_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn payout_stakers_dead_controller(n: u32) -> Weight { - (106_496_000 as Weight) - // Standard Error: 13_000 - .saturating_add((46_186_000 as Weight).saturating_mul(n as Weight)) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking HistoryDepth (r:1 w:0) + // Storage: Staking ErasValidatorReward (r:1 w:0) + // Storage: Staking Bonded (r:2 w:0) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking ErasStakersClipped (r:1 w:0) + // Storage: Staking ErasRewardPoints (r:1 w:0) + // Storage: Staking ErasValidatorPrefs (r:1 w:0) + // Storage: Staking Payee (r:2 w:0) + // Storage: System Account (r:2 w:2) + fn payout_stakers_dead_controller(n: u32, ) -> Weight { + (118_075_000 as Weight) + // Standard Error: 20_000 + .saturating_add((44_116_000 as Weight).saturating_mul(n as Weight)) .saturating_add(T::DbWeight::get().reads(10 as Weight)) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().writes(2 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(n as Weight))) } - fn payout_stakers_alive_staked(n: u32) -> Weight { - (131_706_000 as Weight) - // Standard Error: 20_000 - .saturating_add((60_519_000 as Weight).saturating_mul(n as Weight)) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking HistoryDepth (r:1 w:0) + // Storage: Staking ErasValidatorReward (r:1 w:0) + // Storage: Staking Bonded (r:2 w:0) + // Storage: Staking Ledger (r:2 w:2) + // Storage: Staking ErasStakersClipped (r:1 w:0) + // Storage: Staking ErasRewardPoints (r:1 w:0) + // Storage: Staking ErasValidatorPrefs (r:1 w:0) + // Storage: Staking Payee (r:2 w:0) + // Storage: System Account (r:2 w:2) + // Storage: Balances Locks (r:2 w:2) + fn payout_stakers_alive_staked(n: u32, ) -> Weight { + (126_296_000 as Weight) + // Standard Error: 27_000 + .saturating_add((57_142_000 as Weight).saturating_mul(n as Weight)) .saturating_add(T::DbWeight::get().reads(11 as Weight)) .saturating_add(T::DbWeight::get().reads((5 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().writes(3 as Weight)) .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(n as Weight))) } - fn rebond(l: u32) -> Weight { - (46_089_000 as Weight) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: Staking Nominators (r:1 w:0) + // Storage: Staking Bonded (r:1 w:0) + fn rebond(l: u32, ) -> Weight { + (60_559_000 as Weight) // Standard Error: 1_000 - .saturating_add((64_000 as Weight).saturating_mul(l as Weight)) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add((63_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } - fn set_history_depth(e: u32) -> Weight { + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking HistoryDepth (r:1 w:1) + // Storage: Staking ErasStakersClipped (r:0 w:2) + // Storage: Staking ErasValidatorPrefs (r:0 w:2) + // Storage: Staking ErasValidatorReward (r:0 w:1) + // Storage: Staking ErasRewardPoints (r:0 w:1) + // Storage: Staking ErasStakers (r:0 w:2) + // Storage: Staking ErasTotalStake (r:0 w:1) + // Storage: Staking ErasStartSessionIndex (r:0 w:1) + fn set_history_depth(e: u32, ) -> Weight { (0 as Weight) - // Standard Error: 67_000 - .saturating_add((32_486_000 as Weight).saturating_mul(e as Weight)) + // Standard Error: 68_000 + .saturating_add((30_894_000 as Weight).saturating_mul(e as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) .saturating_add(T::DbWeight::get().writes((7 as Weight).saturating_mul(e as Weight))) } - fn reap_stash(s: u32) -> Weight { - (69_019_000 as Weight) - // Standard Error: 0 - .saturating_add((2_317_000 as Weight).saturating_mul(s as Weight)) + // Storage: System Account (r:1 w:1) + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking SlashingSpans (r:1 w:1) + // Storage: Staking Validators (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Ledger (r:0 w:1) + // Storage: Staking Payee (r:0 w:1) + // Storage: Staking SpanSlash (r:0 w:1) + fn reap_stash(s: u32, ) -> Weight { + (65_173_000 as Weight) + // Standard Error: 1_000 + .saturating_add((2_213_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(8 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } - fn new_era(v: u32, n: u32) -> Weight { + // Storage: Staking CounterForNominators (r:1 w:0) + // Storage: Staking CounterForValidators (r:1 w:0) + // Storage: Staking Validators (r:2 w:0) + // Storage: Staking Bonded (r:101 w:0) + // Storage: Staking Ledger (r:101 w:0) + // Storage: Staking SlashingSpans (r:1 w:0) + // Storage: Staking Nominators (r:101 w:0) + // Storage: System BlockWeight (r:1 w:1) + // Storage: Staking ValidatorCount (r:1 w:0) + // Storage: Staking MinimumValidatorCount (r:1 w:0) + // Storage: Staking CurrentEra (r:1 w:1) + // Storage: Staking HistoryDepth (r:1 w:0) + // Storage: Staking ErasStakersClipped (r:0 w:1) + // Storage: Staking ErasValidatorPrefs (r:0 w:1) + // Storage: Staking ErasStakers (r:0 w:1) + // Storage: Staking ErasTotalStake (r:0 w:1) + // Storage: Staking ErasStartSessionIndex (r:0 w:1) + fn new_era(v: u32, n: u32, ) -> Weight { (0 as Weight) - // Standard Error: 666_000 - .saturating_add((306_698_000 as Weight).saturating_mul(v as Weight)) - // Standard Error: 33_000 - .saturating_add((47_483_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 811_000 + .saturating_add((298_100_000 as Weight).saturating_mul(v as Weight)) + // Standard Error: 40_000 + .saturating_add((49_163_000 as Weight).saturating_mul(n as Weight)) .saturating_add(T::DbWeight::get().reads(10 as Weight)) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(v as Weight))) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().writes(4 as Weight)) .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(v as Weight))) } - fn get_npos_voters(v: u32, n: u32, s: u32) -> Weight { + // Storage: Staking CounterForNominators (r:1 w:0) + // Storage: Staking CounterForValidators (r:1 w:0) + // Storage: Staking Validators (r:501 w:0) + // Storage: Staking Bonded (r:1500 w:0) + // Storage: Staking Ledger (r:1500 w:0) + // Storage: Staking SlashingSpans (r:21 w:0) + // Storage: Staking Nominators (r:1001 w:0) + // Storage: System BlockWeight (r:1 w:1) + fn get_npos_voters(v: u32, n: u32, s: u32, ) -> Weight { (0 as Weight) - // Standard Error: 97_000 - .saturating_add((25_109_000 as Weight).saturating_mul(v as Weight)) - // Standard Error: 97_000 - .saturating_add((27_162_000 as Weight).saturating_mul(n as Weight)) - // Standard Error: 3_332_000 - .saturating_add((50_488_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) + // Standard Error: 101_000 + .saturating_add((23_378_000 as Weight).saturating_mul(v as Weight)) + // Standard Error: 101_000 + .saturating_add((29_757_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 3_446_000 + .saturating_add((45_519_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(v as Weight))) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn get_npos_targets(v: u32) -> Weight { + // Storage: Staking Validators (r:501 w:0) + // Storage: System BlockWeight (r:1 w:1) + fn get_npos_targets(v: u32, ) -> Weight { (0 as Weight) - // Standard Error: 31_000 - .saturating_add((10_220_000 as Weight).saturating_mul(v as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) + // Standard Error: 30_000 + .saturating_add((9_490_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(v as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking MinValidatorBond (r:0 w:1) + // Storage: Staking MaxValidatorsCount (r:0 w:1) + // Storage: Staking ChillThreshold (r:0 w:1) + // Storage: Staking MaxNominatorsCount (r:0 w:1) + // Storage: Staking MinNominatorBond (r:0 w:1) fn set_staking_limits() -> Weight { - (5_584_000 as Weight).saturating_add(T::DbWeight::get().writes(5 as Weight)) + (5_680_000 as Weight) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) } + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking ChillThreshold (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking MaxNominatorsCount (r:1 w:0) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: Staking MinNominatorBond (r:1 w:0) + // Storage: Staking Validators (r:1 w:0) fn chill_other() -> Weight { - (39_524_000 as Weight) + (48_185_000 as Weight) .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } diff --git a/runtime/polkadot/src/weights/runtime_common_auctions.rs b/runtime/polkadot/src/weights/runtime_common_auctions.rs new file mode 100644 index 000000000000..6e81685ad718 --- /dev/null +++ b/runtime/polkadot/src/weights/runtime_common_auctions.rs @@ -0,0 +1,65 @@ +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_common::auctions` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-07-01, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_common::auctions +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_common::auctions`. +pub struct WeightInfo(PhantomData); +impl runtime_common::auctions::WeightInfo for WeightInfo { + fn new_auction() -> Weight { + (24_436_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn bid() -> Weight { + (137_499_000 as Weight) + .saturating_add(T::DbWeight::get().reads(8 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn on_initialize() -> Weight { + (23_555_687_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3688 as Weight)) + .saturating_add(T::DbWeight::get().writes(3683 as Weight)) + } + fn cancel_auction() -> Weight { + (5_007_594_000 as Weight) + .saturating_add(T::DbWeight::get().reads(73 as Weight)) + .saturating_add(T::DbWeight::get().writes(3673 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/runtime_common_crowdloan.rs b/runtime/polkadot/src/weights/runtime_common_crowdloan.rs new file mode 100644 index 000000000000..7929c8c16754 --- /dev/null +++ b/runtime/polkadot/src/weights/runtime_common_crowdloan.rs @@ -0,0 +1,132 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_common::crowdloan` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-15, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_common::crowdloan +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/runtime_common_crowdloan.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_common::crowdloan`. +pub struct WeightInfo(PhantomData); +impl runtime_common::crowdloan::WeightInfo for WeightInfo { + // Storage: Crowdloan Funds (r:1 w:1) + // Storage: Registrar Paras (r:1 w:1) + // Storage: Paras ParaLifecycles (r:1 w:0) + // Storage: Crowdloan NextTrieIndex (r:1 w:1) + fn create() -> Weight { + (78_186_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + // Storage: Crowdloan Funds (r:1 w:1) + // Storage: Slots Leases (r:1 w:0) + // Storage: Auctions AuctionInfo (r:1 w:0) + // Storage: System Account (r:1 w:1) + // Storage: Crowdloan EndingsCount (r:1 w:0) + // Storage: Crowdloan NewRaise (r:1 w:1) + // Storage: unknown [0xd861ea1ebf4800d4b89f4ff787ad79ee96d9a708c85b57da7eb8f9ddeda61291] (r:1 w:1) + fn contribute() -> Weight { + (294_308_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + // Storage: Crowdloan Funds (r:1 w:1) + // Storage: System Account (r:2 w:2) + // Storage: unknown [0xc85982571aa615c788ef9b2c16f54f25773fd439e8ee1ed2aa3ae43d48e880f0] (r:1 w:1) + fn withdraw() -> Weight { + (102_518_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + // Storage: Skipped Metadata (r:0 w:0) + fn refund(k: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 22_000 + .saturating_add((38_550_000 as Weight).saturating_mul(k as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(k as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(k as Weight))) + } + // Storage: Crowdloan Funds (r:1 w:1) + // Storage: System Account (r:1 w:1) + fn dissolve() -> Weight { + (58_176_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + // Storage: Crowdloan Funds (r:1 w:1) + fn edit() -> Weight { + (37_125_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Crowdloan Funds (r:1 w:0) + // Storage: unknown [0xd861ea1ebf4800d4b89f4ff787ad79ee96d9a708c85b57da7eb8f9ddeda61291] (r:1 w:1) + fn add_memo() -> Weight { + (55_338_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Crowdloan Funds (r:1 w:0) + // Storage: Crowdloan NewRaise (r:1 w:1) + fn poke() -> Weight { + (41_233_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Auctions AuctionInfo (r:1 w:0) + // Storage: Crowdloan EndingsCount (r:1 w:1) + // Storage: Crowdloan NewRaise (r:1 w:1) + // Storage: Crowdloan Funds (r:2 w:0) + // Storage: Auctions AuctionCounter (r:1 w:0) + // Storage: Paras ParaLifecycles (r:2 w:0) + // Storage: Slots Leases (r:2 w:0) + // Storage: Auctions Winning (r:1 w:1) + // Storage: Auctions ReservedAmounts (r:2 w:2) + // Storage: System Account (r:2 w:2) + fn on_initialize(n: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 25_000 + .saturating_add((98_572_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().reads((5 as Weight).saturating_mul(n as Weight))) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(n as Weight))) + } +} diff --git a/runtime/polkadot/src/weights/runtime_common_paras_registrar.rs b/runtime/polkadot/src/weights/runtime_common_paras_registrar.rs new file mode 100644 index 000000000000..84d3a89e92d0 --- /dev/null +++ b/runtime/polkadot/src/weights/runtime_common_paras_registrar.rs @@ -0,0 +1,99 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_common::paras_registrar` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-16, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_common::paras_registrar +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/runtime_common_paras_registrar.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_common::paras_registrar`. +pub struct WeightInfo(PhantomData); +impl runtime_common::paras_registrar::WeightInfo for WeightInfo { + // Storage: Registrar NextFreeParaId (r:1 w:1) + // Storage: Registrar Paras (r:1 w:1) + // Storage: Paras ParaLifecycles (r:1 w:0) + fn reserve() -> Weight { + (43_636_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + // Storage: Registrar Paras (r:1 w:1) + // Storage: Paras ParaLifecycles (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras ActionsQueue (r:1 w:1) + // Storage: Paras UpcomingParasGenesis (r:0 w:1) + fn register() -> Weight { + (5_587_963_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + // Storage: Registrar Paras (r:1 w:1) + // Storage: Paras ParaLifecycles (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras ActionsQueue (r:1 w:1) + // Storage: Paras UpcomingParasGenesis (r:0 w:1) + fn force_register() -> Weight { + (5_568_018_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + // Storage: Registrar Paras (r:1 w:1) + // Storage: Paras ParaLifecycles (r:1 w:1) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras ActionsQueue (r:1 w:1) + // Storage: Registrar PendingSwap (r:0 w:1) + fn deregister() -> Weight { + (76_644_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + // Storage: Registrar Paras (r:1 w:0) + // Storage: Registrar PendingSwap (r:1 w:1) + // Storage: Paras ParaLifecycles (r:2 w:2) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras ActionsQueue (r:1 w:1) + // Storage: Crowdloan Funds (r:2 w:2) + // Storage: Slots Leases (r:2 w:2) + fn swap() -> Weight { + (68_141_000 as Weight) + .saturating_add(T::DbWeight::get().reads(10 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/runtime_common_slots.rs b/runtime/polkadot/src/weights/runtime_common_slots.rs new file mode 100644 index 000000000000..07101259d100 --- /dev/null +++ b/runtime/polkadot/src/weights/runtime_common_slots.rs @@ -0,0 +1,73 @@ +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_common::slots` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-07-01, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_common::slots +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_common::slots`. +pub struct WeightInfo(PhantomData); +impl runtime_common::slots::WeightInfo for WeightInfo { + fn force_lease() -> Weight { + (92_502_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn manage_lease_period_start(c: u32, t: u32) -> Weight { + (0 as Weight) + // Standard Error: 17_000 + .saturating_add((16_401_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 17_000 + .saturating_add((34_480_000 as Weight).saturating_mul(t as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(t as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(t as Weight))) + } + fn clear_all_leases() -> Weight { + (194_756_000 as Weight) + .saturating_add(T::DbWeight::get().reads(9 as Weight)) + .saturating_add(T::DbWeight::get().writes(9 as Weight)) + } + fn trigger_onboard() -> Weight { + (41_785_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/runtime_parachains_configuration.rs b/runtime/polkadot/src/weights/runtime_parachains_configuration.rs new file mode 100644 index 000000000000..ae840f37752d --- /dev/null +++ b/runtime/polkadot/src/weights/runtime_parachains_configuration.rs @@ -0,0 +1,91 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_parachains::configuration` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-17, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_parachains::configuration +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/runtime_parachains_configuration.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_parachains::configuration`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::configuration::WeightInfo for WeightInfo { + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_block_number() -> Weight { + (12_378_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_u32() -> Weight { + (12_384_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_option_u32() -> Weight { + (12_746_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_weight() -> Weight { + (12_563_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Benchmark Override (r:0 w:0) + fn set_hrmp_open_request_ttl() -> Weight { + (2_000_000_000_000 as Weight) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_balance() -> Weight { + (12_644_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/runtime_parachains_initializer.rs b/runtime/polkadot/src/weights/runtime_parachains_initializer.rs new file mode 100644 index 000000000000..6b41892d3e45 --- /dev/null +++ b/runtime/polkadot/src/weights/runtime_parachains_initializer.rs @@ -0,0 +1,55 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_parachains::initializer` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-25, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_parachains::initializer +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/runtime_parachains_initializer.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_parachains::initializer`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::initializer::WeightInfo for WeightInfo { + // Storage: System Digest (r:1 w:1) + fn force_approve(d: u32, ) -> Weight { + (5_156_000 as Weight) + // Standard Error: 0 + .saturating_add((2_000 as Weight).saturating_mul(d as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/runtime_parachains_paras.rs b/runtime/polkadot/src/weights/runtime_parachains_paras.rs new file mode 100644 index 000000000000..728d95561bfc --- /dev/null +++ b/runtime/polkadot/src/weights/runtime_parachains_paras.rs @@ -0,0 +1,106 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_parachains::paras` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_parachains::paras +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/runtime_parachains_paras.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_parachains::paras`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::paras::WeightInfo for WeightInfo { + // Storage: Paras CurrentCodeHash (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras PastCodeMeta (r:1 w:1) + // Storage: Paras PastCodePruning (r:1 w:1) + // Storage: Paras PastCodeHash (r:0 w:1) + // Storage: Paras CodeByHash (r:0 w:1) + fn force_set_current_code(c: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } + // Storage: Paras Heads (r:0 w:1) + fn force_set_current_head(s: u32, ) -> Weight { + (16_088_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: Paras FutureCodeUpgrades (r:1 w:1) + // Storage: Paras UpcomingUpgrades (r:1 w:1) + // Storage: Paras UpgradeCooldowns (r:1 w:1) + // Storage: System Digest (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras CodeByHash (r:0 w:1) + // Storage: Paras FutureCodeHash (r:0 w:1) + // Storage: Paras UpgradeRestrictionSignal (r:0 w:1) + fn force_schedule_code_upgrade(c: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + } + // Storage: Paras FutureCodeUpgrades (r:1 w:1) + // Storage: Paras FutureCodeHash (r:1 w:1) + // Storage: Paras CurrentCodeHash (r:1 w:1) + // Storage: System Digest (r:1 w:1) + // Storage: Paras PastCodeMeta (r:1 w:1) + // Storage: Paras PastCodePruning (r:1 w:1) + // Storage: Paras Heads (r:0 w:1) + // Storage: Paras PastCodeHash (r:0 w:1) + // Storage: Paras UpgradeGoAheadSignal (r:0 w:1) + fn force_note_new_head(s: u32, ) -> Weight { + (69_114_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(9 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras ActionsQueue (r:1 w:1) + fn force_queue_action() -> Weight { + (26_752_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index 005c3310969b..c110174aec15 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -46,6 +46,7 @@ use runtime_common::{ BlockHashCount, BlockLength, BlockWeights, RocksDbWeight, SlowAdjustingFeeUpdate, }; use runtime_parachains::{self, runtime_api_impl::v1 as runtime_api_impl}; +use scale_info::TypeInfo; use sp_core::{OpaqueMetadata, RuntimeDebug}; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, @@ -93,6 +94,7 @@ use xcm_executor::XcmExecutor; /// Constant values used within the runtime. pub mod constants; mod validator_manager; +mod weights; // Make the WASM binary available. #[cfg(feature = "std")] @@ -101,9 +103,9 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); /// Runtime version (Rococo). pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("rococo"), - impl_name: create_runtime_str!("parity-rococo-v1.7"), + impl_name: create_runtime_str!("parity-rococo-v1.8"), authoring_version: 0, - spec_version: 9102, + spec_version: 9106, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -210,7 +212,7 @@ construct_runtime! { Ump: parachains_ump::{Pallet, Call, Storage, Event}, Hrmp: parachains_hrmp::{Pallet, Call, Storage, Event, Config}, ParaSessionInfo: parachains_session_info::{Pallet, Storage}, - ParasDisputes: parachains_disputes::{Pallet, Storage, Event}, + ParasDisputes: parachains_disputes::{Pallet, Call, Storage, Event}, // Parachain Onboarding Pallets Registrar: paras_registrar::{Pallet, Call, Storage, Event, Config}, @@ -249,9 +251,11 @@ construct_runtime! { Utility: pallet_utility::{Pallet, Call, Event} = 90, Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 91, + Multisig: pallet_multisig::{Pallet, Call, Storage, Event}, // Pallet for sending XCM. XcmPallet: pallet_xcm::{Pallet, Call, Storage, Event, Origin} = 99, + } } @@ -368,6 +372,7 @@ impl parachains_disputes::Config for Runtime { type Event = Event; type RewardValidators = (); type PunishValidators = (); + type WeightInfo = weights::runtime_parachains_disputes::WeightInfo; } parameter_types! { @@ -376,6 +381,9 @@ parameter_types! { parameter_types! { pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); + pub const MaxKeys: u32 = 10_000; + pub const MaxPeerInHeartbeats: u32 = 10_000; + pub const MaxPeerDataEncodingSize: u32 = 1_000; } impl pallet_im_online::Config for Runtime { @@ -386,6 +394,9 @@ impl pallet_im_online::Config for Runtime { type ReportUnresponsiveness = Offences; type UnsignedPriority = ImOnlineUnsignedPriority; type WeightInfo = (); + type MaxKeys = MaxKeys; + type MaxPeerInHeartbeats = MaxPeerInHeartbeats; + type MaxPeerDataEncodingSize = MaxPeerDataEncodingSize; } parameter_types! { @@ -441,11 +452,15 @@ impl pallet_timestamp::Config for Runtime { parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; + /// This value increases the priority of `Operational` transactions by adding + /// a "virtual tip" that's equal to the `OperationalFeeMultiplier * final_fee`. + pub const OperationalFeeMultiplier: u8 = 5; } impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = CurrencyAdapter>; type TransactionByteFee = TransactionByteFee; + type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = WeightToFee; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; } @@ -500,6 +515,8 @@ impl pallet_babe::Config for Runtime { pallet_babe::EquivocationHandler; type WeightInfo = (); + + type MaxAuthorities = MaxAuthorities; } parameter_types! { @@ -539,6 +556,7 @@ impl pallet_grandpa::Config for Runtime { >; type WeightInfo = (); + type MaxAuthorities = MaxAuthorities; } parameter_types! { @@ -554,7 +572,9 @@ impl pallet_authorship::Config for Runtime { impl parachains_origin::Config for Runtime {} -impl parachains_configuration::Config for Runtime {} +impl parachains_configuration::Config for Runtime { + type WeightInfo = parachains_configuration::weights::WeightInfo; +} impl parachains_shared::Config for Runtime {} @@ -574,6 +594,7 @@ impl parachains_inclusion::Config for Runtime { impl parachains_paras::Config for Runtime { type Origin = Origin; type Event = Event; + type WeightInfo = parachains_paras::weights::WeightInfo; } parameter_types! { @@ -607,7 +628,7 @@ type LocalOriginConverter = ( ); parameter_types! { - pub const BaseXcmWeight: Weight = 100_000; + pub const BaseXcmWeight: Weight = 1_000_000_000; } /// The XCM router. When we want to send an XCM message, we use this type. It amalgamates all of our @@ -623,6 +644,7 @@ parameter_types! { pub const RococoForTrick: (MultiAssetFilter, MultiLocation) = (Rococo::get(), Parachain(110).into()); pub const RococoForTrack: (MultiAssetFilter, MultiLocation) = (Rococo::get(), Parachain(120).into()); pub const RococoForStatemint: (MultiAssetFilter, MultiLocation) = (Rococo::get(), Parachain(1001).into()); + pub const RococoForCanvas: (MultiAssetFilter, MultiLocation) = (Rococo::get(), Parachain(1002).into()); pub const MaxInstructions: u32 = 100; } pub type TrustedTeleporters = ( @@ -630,6 +652,7 @@ pub type TrustedTeleporters = ( xcm_builder::Case, xcm_builder::Case, xcm_builder::Case, + xcm_builder::Case, ); parameter_types! { @@ -639,6 +662,7 @@ parameter_types! { Parachain(110).into(), Parachain(120).into(), Parachain(1001).into(), + Parachain(1002).into(), ]; } @@ -710,6 +734,7 @@ impl parachains_ump::Config for Runtime { type Event = Event; type UmpSink = crate::parachains_ump::XcmSink, Runtime>; type FirstMessageFactorPercent = FirstMessageFactorPercent; + type ExecuteOverweightOrigin = EnsureRoot; } impl parachains_dmp::Config for Runtime {} @@ -727,6 +752,7 @@ impl parachains_scheduler::Config for Runtime {} impl parachains_initializer::Config for Runtime { type Randomness = pallet_babe::RandomnessFromOneEpochAgo; type ForceOrigin = EnsureRoot; + type WeightInfo = (); } impl paras_sudo_wrapper::Config for Runtime {} @@ -972,6 +998,7 @@ impl slots::Config for Runtime { type Currency = Balances; type Registrar = Registrar; type LeasePeriod = LeasePeriod; + type LeaseOffset = (); type WeightInfo = slots::TestWeightInfo; } @@ -1025,7 +1052,17 @@ parameter_types! { /// The type used to represent the kinds of proxying allowed. #[derive( - Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug, MaxEncodedLen, + Copy, + Clone, + Eq, + PartialEq, + Ord, + PartialOrd, + Encode, + Decode, + RuntimeDebug, + MaxEncodedLen, + TypeInfo, )] pub enum ProxyType { Any, @@ -1042,10 +1079,13 @@ impl InstanceFilter for ProxyType { match self { ProxyType::Any => true, ProxyType::CancelProxy => - matches!(c, Call::Proxy(pallet_proxy::Call::reject_announcement(..))), + matches!(c, Call::Proxy(pallet_proxy::Call::reject_announcement { .. })), ProxyType::Auction => matches!( c, - Call::Auctions(..) | Call::Crowdloan(..) | Call::Registrar(..) | Call::Slots(..) + Call::Auctions { .. } | + Call::Crowdloan { .. } | + Call::Registrar { .. } | + Call::Multisig(..) | Call::Slots { .. } ), } } @@ -1102,6 +1142,24 @@ impl pallet_membership::Config for Runtime { type WeightInfo = (); } +parameter_types! { + // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. + pub const DepositBase: Balance = deposit(1, 88); + // Additional storage item size of 32 bytes. + pub const DepositFactor: Balance = deposit(0, 32); + pub const MaxSignatories: u16 = 100; +} + +impl pallet_multisig::Config for Runtime { + type Event = Event; + type Call = Call; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = MaxSignatories; + type WeightInfo = (); +} + #[cfg(not(feature = "disable-runtime-api"))] sp_api::impl_runtime_apis! { impl sp_api::Core for Runtime { @@ -1120,7 +1178,7 @@ sp_api::impl_runtime_apis! { impl sp_api::Metadata for Runtime { fn metadata() -> OpaqueMetadata { - Runtime::metadata().into() + OpaqueMetadata::new(Runtime::metadata().into()) } } @@ -1276,7 +1334,7 @@ sp_api::impl_runtime_apis! { slot_duration: Babe::slot_duration(), epoch_length: EpochDurationInBlocks::get().into(), c: BABE_GENESIS_EPOCH_CONFIG.c, - genesis_authorities: Babe::authorities(), + genesis_authorities: Babe::authorities().to_vec(), randomness: Babe::randomness(), allowed_slots: BABE_GENESIS_EPOCH_CONFIG.allowed_slots, } @@ -1524,4 +1582,52 @@ sp_api::impl_runtime_apis! { TransactionPayment::query_fee_details(uxt, len) } } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn benchmark_metadata(extra: bool) -> ( + Vec, + Vec, + ) { + use frame_benchmarking::{list_benchmark, Benchmarking, BenchmarkList}; + use frame_support::traits::StorageInfoTrait; + + let mut list = Vec::::new(); + + list_benchmark!(list, extra, runtime_parachains::disputes, ParasDisputes); + + let storage_info = AllPalletsWithSystem::storage_info(); + + return (list, storage_info) + } + + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig, + ) -> Result< + Vec, + sp_runtime::RuntimeString, + > { + use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark, TrackedStorageKey}; + + let mut batches = Vec::::new(); + let whitelist: Vec = vec![ + // Block Number + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), + ]; + let params = (&config, &whitelist); + + add_benchmark!(params, batches, runtime_parachains::disputes, ParasDisputes); + + if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } + Ok(batches) + } + } } diff --git a/runtime/rococo/src/validator_manager.rs b/runtime/rococo/src/validator_manager.rs index a5fd2bb0a92b..763d12c73f5c 100644 --- a/runtime/rococo/src/validator_manager.rs +++ b/runtime/rococo/src/validator_manager.rs @@ -20,7 +20,7 @@ use frame_support::{decl_error, decl_event, decl_module, decl_storage, traits::E use sp_staking::SessionIndex; use sp_std::vec::Vec; -type Session = pallet_session::Module; +type Session = pallet_session::Pallet; /// Configuration for the parachain proposer. pub trait Config: pallet_session::Config { diff --git a/runtime/rococo/src/weights/mod.rs b/runtime/rococo/src/weights/mod.rs new file mode 100644 index 000000000000..bcd0ec248a5f --- /dev/null +++ b/runtime/rococo/src/weights/mod.rs @@ -0,0 +1 @@ +pub mod runtime_parachains_disputes; diff --git a/runtime/rococo/src/weights/runtime_parachains_disputes.rs b/runtime/rococo/src/weights/runtime_parachains_disputes.rs new file mode 100644 index 000000000000..37c0d4545c67 --- /dev/null +++ b/runtime/rococo/src/weights/runtime_parachains_disputes.rs @@ -0,0 +1,52 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_parachains::disputes` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-23, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("rococo-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=rococo-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_parachains::disputes +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./runtime/parachains/src/disputes/weights.rs +// --header=./file_header.txt + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_parachains::disputes`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::disputes::WeightInfo for WeightInfo { + // Storage: ParasDisputes Frozen (r:0 w:1) + fn force_unfreeze() -> Weight { + (2_022_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index b15128a293a2..2c85fc68f430 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -188,6 +188,7 @@ impl pallet_babe::Config for Runtime { type HandleEquivocation = (); type WeightInfo = (); + type MaxAuthorities = MaxAuthorities; } parameter_types! { @@ -222,11 +223,15 @@ impl pallet_balances::Config for Runtime { parameter_types! { pub storage TransactionByteFee: Balance = 10 * MILLICENTS; + /// This value increases the priority of `Operational` transactions by adding + /// a "virtual tip" that's equal to the `OperationalFeeMultiplier * final_fee`. + pub const OperationalFeeMultiplier: u8 = 5; } impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = CurrencyAdapter; type TransactionByteFee = TransactionByteFee; + type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = WeightToFee; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; } @@ -310,9 +315,7 @@ parameter_types! { } impl frame_election_provider_support::onchain::Config for Runtime { - type AccountId = ::AccountId; - type BlockNumber = ::BlockNumber; - type Accuracy = sp_runtime::Perbill; + type Accuracy = runtime_common::elections::OnOnChainAccuracy; type DataProvider = Staking; } @@ -339,6 +342,9 @@ impl pallet_staking::Config for Runtime { frame_election_provider_support::onchain::OnChainSequentialPhragmen; type GenesisElectionProvider = frame_election_provider_support::onchain::OnChainSequentialPhragmen; + // Use the nominator map to iter voter AND no-ops for all SortedListProvider hooks. The migration + // to bags-list is a no-op, but the storage version will be updated. + type SortedListProvider = pallet_staking::UseNominatorsMap; type WeightInfo = (); } @@ -359,6 +365,7 @@ impl pallet_grandpa::Config for Runtime { type HandleEquivocation = (); type WeightInfo = (); + type MaxAuthorities = MaxAuthorities; } impl frame_system::offchain::CreateSignedTransaction for Runtime @@ -450,7 +457,9 @@ impl pallet_sudo::Config for Runtime { type Call = Call; } -impl parachains_configuration::Config for Runtime {} +impl parachains_configuration::Config for Runtime { + type WeightInfo = parachains_configuration::weights::WeightInfo; +} impl parachains_shared::Config for Runtime {} @@ -464,6 +473,7 @@ impl parachains_disputes::Config for Runtime { type Event = Event; type RewardValidators = (); type PunishValidators = (); + type WeightInfo = parachains_disputes::TestWeightInfo; } impl parachains_paras_inherent::Config for Runtime {} @@ -471,6 +481,7 @@ impl parachains_paras_inherent::Config for Runtime {} impl parachains_initializer::Config for Runtime { type Randomness = pallet_babe::RandomnessFromOneEpochAgo; type ForceOrigin = frame_system::EnsureRoot; + type WeightInfo = (); } impl parachains_session_info::Config for Runtime {} @@ -478,6 +489,7 @@ impl parachains_session_info::Config for Runtime {} impl parachains_paras::Config for Runtime { type Origin = Origin; type Event = Event; + type WeightInfo = parachains_paras::weights::WeightInfo; } impl parachains_dmp::Config for Runtime {} @@ -490,6 +502,7 @@ impl parachains_ump::Config for Runtime { type Event = Event; type UmpSink = (); type FirstMessageFactorPercent = FirstMessageFactorPercent; + type ExecuteOverweightOrigin = frame_system::EnsureRoot; } parameter_types! { @@ -591,7 +604,8 @@ pub mod pallet_test_notifier { let id = who .using_encoded(|mut d| <[u8; 32]>::decode(&mut d)) .map_err(|_| Error::::BadAccountFormat)?; - let call = Call::::notification_received(0, Default::default()); + let call = + Call::::notification_received { query_id: 0, response: Default::default() }; let qid = pallet_xcm::Pallet::::new_notify_query( Junction::AccountId32 { network: Any, id }.into(), ::Call::from(call), @@ -721,7 +735,7 @@ sp_api::impl_runtime_apis! { impl sp_api::Metadata for Runtime { fn metadata() -> OpaqueMetadata { - Runtime::metadata().into() + OpaqueMetadata::new(Runtime::metadata().into()) } } @@ -904,7 +918,7 @@ sp_api::impl_runtime_apis! { slot_duration: Babe::slot_duration(), epoch_length: EpochDuration::get(), c: BABE_GENESIS_EPOCH_CONFIG.c, - genesis_authorities: Babe::authorities(), + genesis_authorities: Babe::authorities().to_vec(), randomness: Babe::randomness(), allowed_slots: BABE_GENESIS_EPOCH_CONFIG.allowed_slots, } diff --git a/runtime/test-runtime/src/xcm_config.rs b/runtime/test-runtime/src/xcm_config.rs index 2b22989ea93d..3a3c762c6b03 100644 --- a/runtime/test-runtime/src/xcm_config.rs +++ b/runtime/test-runtime/src/xcm_config.rs @@ -36,7 +36,7 @@ pub type LocalOriginToLocation = ( pub struct DoNothingRouter; impl SendXcm for DoNothingRouter { - fn send_xcm(_dest: MultiLocation, _msg: Xcm<()>) -> SendResult { + fn send_xcm(_dest: impl Into, _msg: Xcm<()>) -> SendResult { Ok(()) } } diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index d692725aa55e..2e5dc963e1ce 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -20,6 +20,7 @@ // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit = "256"] +use frame_support::traits::OnRuntimeUpgrade; use pallet_transaction_payment::CurrencyAdapter; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use primitives::v1::{ @@ -48,9 +49,9 @@ use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, ChildParachainAsNative, ChildParachainConvertsVia, ChildSystemParachainAsSuperuser, - CurrencyAdapter as XcmCurrencyAdapter, FixedWeightBounds, IsChildSystemParachain, IsConcrete, - LocationInverter, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, - TakeWeightCredit, UsingComponents, + CurrencyAdapter as XcmCurrencyAdapter, IsChildSystemParachain, IsConcrete, LocationInverter, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + UsingComponents, WeightInfoBounds, }; use xcm_executor::XcmExecutor; @@ -100,6 +101,9 @@ use constants::{currency::*, fee::*, time::*}; // Weights used in the runtime mod weights; +// Voter bag threshold definitions. +mod voter_bags; + #[cfg(test)] mod tests; @@ -112,13 +116,13 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 9100, + spec_version: 9110, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] apis: version::create_apis_vec![[]], - transaction_version: 5, + transaction_version: 7, }; /// The BABE epoch configuration at genesis. @@ -222,6 +226,8 @@ impl pallet_babe::Config for Runtime { pallet_babe::EquivocationHandler; type WeightInfo = (); + + type MaxAuthorities = MaxAuthorities; } parameter_types! { @@ -256,11 +262,15 @@ impl pallet_balances::Config for Runtime { parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; + /// This value increases the priority of `Operational` transactions by adding + /// a "virtual tip" that's equal to the `OperationalFeeMultiplier * final_fee`. + pub const OperationalFeeMultiplier: u8 = 5; } impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = CurrencyAdapter>; type TransactionByteFee = TransactionByteFee; + type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = WeightToFee; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; } @@ -330,15 +340,15 @@ parameter_types! { pub const SignedDepositByte: Balance = deposit(0, 10) / 1024; // Each good submission will get 1 WND as reward pub SignedRewardBase: Balance = 1 * UNITS; - // fallback: emergency phase. - pub const Fallback: pallet_election_provider_multi_phase::FallbackStrategy = - pallet_election_provider_multi_phase::FallbackStrategy::Nothing; - pub SolutionImprovementThreshold: Perbill = Perbill::from_rational(5u32, 10_000); // miner configs - pub const MinerMaxIterations: u32 = 10; pub OffchainRepeat: BlockNumber = 5; + + /// Whilst `UseNominatorsAndUpdateBagsList` or `UseNominatorsMap` is in use, this can still be a + /// very large value. Once the `BagsList` is in full motion, staking might open its door to many + /// more nominators, and this value should instead be what is a "safe" number (e.g. 22500). + pub const VoterSnapshotPerBlock: u32 = 22_500; } sp_npos_elections::generate_solution_type!( @@ -365,18 +375,33 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type SlashHandler = (); // burn slashes type RewardHandler = (); // nothing to do upon rewards type SolutionImprovementThreshold = SolutionImprovementThreshold; - type MinerMaxIterations = MinerMaxIterations; type MinerMaxWeight = OffchainSolutionWeightLimit; // For now use the one from staking. type MinerMaxLength = OffchainSolutionLengthLimit; type OffchainRepeat = OffchainRepeat; type MinerTxPriority = NposSolutionPriority; type DataProvider = Staking; - type OnChainAccuracy = Perbill; type Solution = NposCompactSolution16; - type Fallback = Fallback; + type Fallback = pallet_election_provider_multi_phase::NoFallback; + type Solver = frame_election_provider_support::SequentialPhragmen< + AccountId, + pallet_election_provider_multi_phase::SolutionAccuracyOf, + runtime_common::elections::OffchainRandomBalancing, + >; type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig; type ForceOrigin = EnsureRoot; - type WeightInfo = weights::pallet_election_provider_multi_phase::WeightInfo; + type WeightInfo = weights::pallet_election_provider_multi_phase::WeightInfo; + type VoterSnapshotPerBlock = VoterSnapshotPerBlock; +} + +parameter_types! { + pub const BagThresholds: &'static [u64] = &voter_bags::THRESHOLDS; +} + +impl pallet_bags_list::Config for Runtime { + type Event = Event; + type VoteWeightProvider = Staking; + type WeightInfo = weights::pallet_bags_list::WeightInfo; + type BagThresholds = BagThresholds; } pallet_staking_reward_curve::build! { @@ -402,6 +427,11 @@ parameter_types! { pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); } +impl frame_election_provider_support::onchain::Config for Runtime { + type Accuracy = runtime_common::elections::OnOnChainAccuracy; + type DataProvider = Staking; +} + impl pallet_staking::Config for Runtime { const MAX_NOMINATIONS: u32 = ::LIMIT as u32; @@ -423,10 +453,10 @@ impl pallet_staking::Config for Runtime { type OffendingValidatorsThreshold = OffendingValidatorsThreshold; type NextNewSession = Session; type ElectionProvider = ElectionProviderMultiPhase; - type GenesisElectionProvider = - frame_election_provider_support::onchain::OnChainSequentialPhragmen< - pallet_election_provider_multi_phase::OnChainConfig, - >; + type GenesisElectionProvider = runtime_common::elections::GenesisElectionOf; + // Use the nominators map to iter voters, but also perform the bags-list migration and keep + // it up-to-date. + type SortedListProvider = runtime_common::elections::UseNominatorsAndUpdateBagsList; type WeightInfo = weights::pallet_staking::WeightInfo; } @@ -456,6 +486,9 @@ impl pallet_authority_discovery::Config for Runtime { parameter_types! { pub const NposSolutionPriority: TransactionPriority = TransactionPriority::max_value() / 2; pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); + pub const MaxKeys: u32 = 10_000; + pub const MaxPeerInHeartbeats: u32 = 10_000; + pub const MaxPeerDataEncodingSize: u32 = 1_000; } impl pallet_im_online::Config for Runtime { @@ -466,6 +499,9 @@ impl pallet_im_online::Config for Runtime { type ReportUnresponsiveness = Offences; type UnsignedPriority = ImOnlineUnsignedPriority; type WeightInfo = weights::pallet_im_online::WeightInfo; + type MaxKeys = MaxKeys; + type MaxPeerInHeartbeats = MaxPeerInHeartbeats; + type MaxPeerDataEncodingSize = MaxPeerDataEncodingSize; } impl pallet_grandpa::Config for Runtime { @@ -489,6 +525,7 @@ impl pallet_grandpa::Config for Runtime { >; type WeightInfo = (); + type MaxAuthorities = MaxAuthorities; } /// Submits a transaction with the node's public and signature type. Adheres to the signed extension @@ -648,7 +685,17 @@ parameter_types! { /// The type used to represent the kinds of proxying allowed. #[derive( - Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug, MaxEncodedLen, + Copy, + Clone, + Eq, + PartialEq, + Ord, + PartialOrd, + Encode, + Decode, + RuntimeDebug, + MaxEncodedLen, + scale_info::TypeInfo, )] pub enum ProxyType { Any, @@ -673,9 +720,9 @@ impl InstanceFilter for ProxyType { Call::System(..) | Call::Babe(..) | Call::Timestamp(..) | - Call::Indices(pallet_indices::Call::claim(..)) | - Call::Indices(pallet_indices::Call::free(..)) | - Call::Indices(pallet_indices::Call::freeze(..)) | + Call::Indices(pallet_indices::Call::claim{..}) | + Call::Indices(pallet_indices::Call::free{..}) | + Call::Indices(pallet_indices::Call::freeze{..}) | // Specifically omitting Indices `transfer`, `force_transfer` // Specifically omitting the entire Balances pallet Call::Authorship(..) | @@ -685,24 +732,24 @@ impl InstanceFilter for ProxyType { Call::ImOnline(..) | Call::Utility(..) | Call::Identity(..) | - Call::Recovery(pallet_recovery::Call::as_recovered(..)) | - Call::Recovery(pallet_recovery::Call::vouch_recovery(..)) | - Call::Recovery(pallet_recovery::Call::claim_recovery(..)) | - Call::Recovery(pallet_recovery::Call::close_recovery(..)) | - Call::Recovery(pallet_recovery::Call::remove_recovery(..)) | - Call::Recovery(pallet_recovery::Call::cancel_recovered(..)) | + Call::Recovery(pallet_recovery::Call::as_recovered{..}) | + Call::Recovery(pallet_recovery::Call::vouch_recovery{..}) | + Call::Recovery(pallet_recovery::Call::claim_recovery{..}) | + Call::Recovery(pallet_recovery::Call::close_recovery{..}) | + Call::Recovery(pallet_recovery::Call::remove_recovery{..}) | + Call::Recovery(pallet_recovery::Call::cancel_recovered{..}) | // Specifically omitting Recovery `create_recovery`, `initiate_recovery` - Call::Vesting(pallet_vesting::Call::vest(..)) | - Call::Vesting(pallet_vesting::Call::vest_other(..)) | + Call::Vesting(pallet_vesting::Call::vest{..}) | + Call::Vesting(pallet_vesting::Call::vest_other{..}) | // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` Call::Scheduler(..) | // Specifically omitting Sudo pallet Call::Proxy(..) | Call::Multisig(..) | - Call::Registrar(paras_registrar::Call::register(..)) | - Call::Registrar(paras_registrar::Call::deregister(..)) | + Call::Registrar(paras_registrar::Call::register{..}) | + Call::Registrar(paras_registrar::Call::deregister{..}) | // Specifically omitting Registrar `swap` - Call::Registrar(paras_registrar::Call::reserve(..)) | + Call::Registrar(paras_registrar::Call::reserve{..}) | Call::Crowdloan(..) | Call::Slots(..) | Call::Auctions(..) // Specifically omitting the entire XCM Pallet @@ -711,7 +758,7 @@ impl InstanceFilter for ProxyType { matches!(c, Call::Staking(..) | Call::Session(..) | Call::Utility(..)) }, ProxyType::SudoBalances => match c { - Call::Sudo(pallet_sudo::Call::sudo(ref x)) => { + Call::Sudo(pallet_sudo::Call::sudo { call: ref x }) => { matches!(x.as_ref(), &Call::Balances(..)) }, Call::Utility(..) => true, @@ -719,10 +766,10 @@ impl InstanceFilter for ProxyType { }, ProxyType::IdentityJudgement => matches!( c, - Call::Identity(pallet_identity::Call::provide_judgement(..)) | Call::Utility(..) + Call::Identity(pallet_identity::Call::provide_judgement { .. }) | Call::Utility(..) ), ProxyType::CancelProxy => { - matches!(c, Call::Proxy(pallet_proxy::Call::reject_announcement(..))) + matches!(c, Call::Proxy(pallet_proxy::Call::reject_announcement { .. })) }, ProxyType::Auction => matches!( c, @@ -758,7 +805,9 @@ impl pallet_proxy::Config for Runtime { impl parachains_origin::Config for Runtime {} -impl parachains_configuration::Config for Runtime {} +impl parachains_configuration::Config for Runtime { + type WeightInfo = weights::runtime_parachains_configuration::WeightInfo; +} impl parachains_shared::Config for Runtime {} @@ -773,6 +822,7 @@ impl parachains_inclusion::Config for Runtime { impl parachains_paras::Config for Runtime { type Origin = Origin; type Event = Event; + type WeightInfo = weights::runtime_parachains_paras::WeightInfo; } parameter_types! { @@ -783,6 +833,7 @@ impl parachains_ump::Config for Runtime { type Event = Event; type UmpSink = crate::parachains_ump::XcmSink, Runtime>; type FirstMessageFactorPercent = FirstMessageFactorPercent; + type ExecuteOverweightOrigin = EnsureRoot; } impl parachains_dmp::Config for Runtime {} @@ -800,6 +851,7 @@ impl parachains_scheduler::Config for Runtime {} impl parachains_initializer::Config for Runtime { type Randomness = pallet_babe::RandomnessFromOneEpochAgo; type ForceOrigin = EnsureRoot; + type WeightInfo = weights::runtime_parachains_initializer::WeightInfo; } impl paras_sudo_wrapper::Config for Runtime {} @@ -828,6 +880,7 @@ impl slots::Config for Runtime { type Currency = Balances; type Registrar = Registrar; type LeasePeriod = LeasePeriod; + type LeaseOffset = (); type WeightInfo = weights::runtime_common_slots::WeightInfo; } @@ -901,10 +954,6 @@ type LocalOriginConverter = ( ChildSystemParachainAsSuperuser, ); -parameter_types! { - pub const BaseXcmWeight: Weight = 10_000_000; -} - /// The XCM router. When we want to send an XCM message, we use this type. It amalgamates all of our /// individual routers. pub type XcmRouter = ( @@ -913,8 +962,9 @@ pub type XcmRouter = ( ); parameter_types! { + pub const Westmint: MultiLocation = Parachain(1000).into(); pub const WestendForWestmint: (MultiAssetFilter, MultiLocation) = - (Wild(AllOf { fun: WildFungible, id: Concrete(WndLocation::get()) }), Parachain(1000).into()); + (Wild(AllOf { fun: WildFungible, id: Concrete(WndLocation::get()) }), Westmint::get()); pub const MaxInstructions: u32 = 100; } pub type TrustedTeleporters = (xcm_builder::Case,); @@ -939,7 +989,7 @@ impl xcm_executor::Config for XcmConfig { type IsTeleporter = TrustedTeleporters; type LocationInverter = LocationInverter; type Barrier = Barrier; - type Weigher = FixedWeightBounds; + type Weigher = WeightInfoBounds, Call, MaxInstructions>; type Trader = UsingComponents>; type ResponseHandler = XcmPallet; type AssetTrap = XcmPallet; @@ -965,7 +1015,7 @@ impl pallet_xcm::Config for Runtime { type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Everything; - type Weigher = FixedWeightBounds; + type Weigher = WeightInfoBounds, Call, MaxInstructions>; type LocationInverter = LocationInverter; type Origin = Origin; type Call = Call; @@ -1027,6 +1077,9 @@ construct_runtime! { // Election pallet. Only works with staking, but placed here to maintain indices. ElectionProviderMultiPhase: pallet_election_provider_multi_phase::{Pallet, Call, Storage, Event, ValidateUnsigned} = 24, + // Provides a semi-sorted list of nominators for staking. + BagsList: pallet_bags_list::{Pallet, Call, Storage, Event} = 25, + // Parachains pallets. Start indices at 40 to leave room. ParachainsOrigin: parachains_origin::{Pallet, Origin} = 41, Configuration: parachains_configuration::{Pallet, Call, Storage, Config} = 42, @@ -1082,11 +1135,30 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPallets, - (), + (StakingBagsListMigrationV8,), >; /// The payload being signed in transactions. pub type SignedPayload = generic::SignedPayload; +// Migration to generate pallet staking's `SortedListProvider` from pre-existing nominators. +pub struct StakingBagsListMigrationV8; + +impl OnRuntimeUpgrade for StakingBagsListMigrationV8 { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + pallet_staking::migrations::v8::migrate::() + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + pallet_staking::migrations::v8::pre_migrate::() + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + pallet_staking::migrations::v8::post_migrate::() + } +} + #[cfg(not(feature = "disable-runtime-api"))] sp_api::impl_runtime_apis! { impl sp_api::Core for Runtime { @@ -1105,7 +1177,7 @@ sp_api::impl_runtime_apis! { impl sp_api::Metadata for Runtime { fn metadata() -> OpaqueMetadata { - Runtime::metadata().into() + OpaqueMetadata::new(Runtime::metadata().into()) } } @@ -1293,7 +1365,7 @@ sp_api::impl_runtime_apis! { slot_duration: Babe::slot_duration(), epoch_length: EpochDuration::get(), c: BABE_GENESIS_EPOCH_CONFIG.c, - genesis_authorities: Babe::authorities(), + genesis_authorities: Babe::authorities().to_vec(), randomness: Babe::randomness(), allowed_slots: BABE_GENESIS_EPOCH_CONFIG.allowed_slots, } @@ -1373,10 +1445,13 @@ sp_api::impl_runtime_apis! { #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade() -> Result<(Weight, Weight), sp_runtime::RuntimeString> { + fn on_runtime_upgrade() -> (Weight, Weight) { log::info!("try-runtime::on_runtime_upgrade westend."); - let weight = Executive::try_runtime_upgrade()?; - Ok((weight, BlockWeights::get().max_block)) + let weight = Executive::try_runtime_upgrade().unwrap(); + (weight, BlockWeights::get().max_block) + } + fn execute_block_no_check(block: Block) -> Weight { + Executive::execute_block_no_check(block) } } @@ -1393,6 +1468,8 @@ sp_api::impl_runtime_apis! { use pallet_offences_benchmarking::Pallet as OffencesBench; use frame_system_benchmarking::Pallet as SystemBench; + type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; + let mut list = Vec::::new(); // Polkadot @@ -1402,7 +1479,12 @@ sp_api::impl_runtime_apis! { list_benchmark!(list, extra, runtime_common::crowdloan, Crowdloan); list_benchmark!(list, extra, runtime_common::paras_registrar, Registrar); list_benchmark!(list, extra, runtime_common::slots, Slots); + list_benchmark!(list, extra, runtime_parachains::configuration, Configuration); + list_benchmark!(list, extra, runtime_parachains::initializer, Initializer); + list_benchmark!(list, extra, runtime_parachains::paras, Paras); + // Substrate + list_benchmark!(list, extra, pallet_bags_list, BagsList); list_benchmark!(list, extra, pallet_balances, Balances); list_benchmark!(list, extra, pallet_election_provider_multi_phase, ElectionProviderMultiPhase); list_benchmark!(list, extra, pallet_identity, Identity); @@ -1419,6 +1501,10 @@ sp_api::impl_runtime_apis! { list_benchmark!(list, extra, pallet_utility, Utility); list_benchmark!(list, extra, pallet_vesting, Vesting); + // XCM Benchmarks + // NOTE: Make sure you point to the individual modules below. + list_benchmark!(list, extra, pallet_xcm_benchmarks::fungible, XcmBalances); + let storage_info = AllPalletsWithSystem::storage_info(); return (list, storage_info) @@ -1441,6 +1527,39 @@ sp_api::impl_runtime_apis! { impl pallet_offences_benchmarking::Config for Runtime {} impl frame_system_benchmarking::Config for Runtime {} + use xcm::latest::MultiAsset; + + impl pallet_xcm_benchmarks::Config for Runtime { + type XcmConfig = XcmConfig; + type AccountIdConverter = LocationConverter; + fn valid_destination() -> Result { + Ok(Westmint::get()) + } + } + + parameter_types! { + pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + Westmint::get(), + MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(WndLocation::get()) }, + )); + } + + impl pallet_xcm_benchmarks::fungible::Config for Runtime { + type TransactAsset = Balances; + + type CheckedAccount = CheckAccount; + type TrustedTeleporter = TrustedTeleporter; + + fn get_multi_asset() -> MultiAsset { + MultiAsset { + id: Concrete(WndLocation::get()), + fun: Fungible(1 * UNITS), + } + } + } + + type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; + let whitelist: Vec = vec![ // Block Number hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), @@ -1454,6 +1573,12 @@ sp_api::impl_runtime_apis! { hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), // Treasury Account hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000").to_vec().into(), + // Dmp DownwardMessageQueueHeads + hex_literal::hex!("63f78c98723ddc9073523ef3beefda0c4d7fefc408aac59dbfe80a72ac8e3ce5").to_vec().into(), + // Dmp DownwardMessageQueues + hex_literal::hex!("63f78c98723ddc9073523ef3beefda0ca95dac46c07a40d91506e7637ec4ba57").to_vec().into(), + // Configuration ActiveConfig + hex_literal::hex!("06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385").to_vec().into(), ]; let mut batches = Vec::::new(); @@ -1466,7 +1591,12 @@ sp_api::impl_runtime_apis! { add_benchmark!(params, batches, runtime_common::crowdloan, Crowdloan); add_benchmark!(params, batches, runtime_common::paras_registrar, Registrar); add_benchmark!(params, batches, runtime_common::slots, Slots); + add_benchmark!(params, batches, runtime_parachains::configuration, Configuration); + add_benchmark!(params, batches, runtime_parachains::initializer, Initializer); + add_benchmark!(params, batches, runtime_parachains::paras, Paras); + // Substrate + add_benchmark!(params, batches, pallet_bags_list, BagsList); add_benchmark!(params, batches, pallet_balances, Balances); add_benchmark!(params, batches, pallet_election_provider_multi_phase, ElectionProviderMultiPhase); add_benchmark!(params, batches, pallet_identity, Identity); @@ -1483,6 +1613,10 @@ sp_api::impl_runtime_apis! { add_benchmark!(params, batches, pallet_utility, Utility); add_benchmark!(params, batches, pallet_vesting, Vesting); + // XCM Benchmarks + // NOTE: Make sure you point to the individual modules below. + add_benchmark!(params, batches, pallet_xcm_benchmarks::fungible, XcmBalances); + if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } Ok(batches) } diff --git a/runtime/westend/src/voter_bags.rs b/runtime/westend/src/voter_bags.rs new file mode 100644 index 000000000000..d88f469f6b1c --- /dev/null +++ b/runtime/westend/src/voter_bags.rs @@ -0,0 +1,234 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Autogenerated voter bag thresholds. +//! +//! Generated on 2021-07-05T14:35:50.538338181+00:00 +//! for the westend runtime. + +/// Existential weight for this runtime. +#[cfg(any(test, feature = "std"))] +#[allow(unused)] +pub const EXISTENTIAL_WEIGHT: u64 = 10_000_000_000; + +/// Constant ratio between bags for this runtime. +#[cfg(any(test, feature = "std"))] +#[allow(unused)] +pub const CONSTANT_RATIO: f64 = 1.1131723507077667; + +/// Upper thresholds delimiting the bag list. +pub const THRESHOLDS: [u64; 200] = [ + 10_000_000_000, + 11_131_723_507, + 12_391_526_824, + 13_793_905_044, + 15_354_993_703, + 17_092_754_435, + 19_027_181_634, + 21_180_532_507, + 23_577_583_160, + 26_245_913_670, + 29_216_225_417, + 32_522_694_326, + 36_203_364_094, + 40_300_583_912, + 44_861_495_728, + 49_938_576_656, + 55_590_242_767, + 61_881_521_217, + 68_884_798_439, + 76_680_653_006, + 85_358_782_760, + 95_019_036_859, + 105_772_564_622, + 117_743_094_401, + 131_068_357_174, + 145_901_671_259, + 162_413_706_368, + 180_794_447_305, + 201_255_379_901, + 224_031_924_337, + 249_386_143_848, + 277_609_759_981, + 309_027_509_097, + 344_000_878_735, + 382_932_266_827, + 426_269_611_626, + 474_511_545_609, + 528_213_132_664, + 587_992_254_562, + 654_536_720_209, + 728_612_179_460, + 811_070_932_564, + 902_861_736_593, + 1_005_040_721_687, + 1_118_783_542_717, + 1_245_398_906_179, + 1_386_343_627_960, + 1_543_239_395_225, + 1_717_891_425_287, + 1_912_309_236_147, + 2_128_729_767_682, + 2_369_643_119_512, + 2_637_821_201_686, + 2_936_349_627_828, + 3_268_663_217_709, + 3_638_585_517_729, + 4_050_372_794_022, + 4_508_763_004_364, + 5_019_030_312_352, + 5_587_045_771_074, + 6_219_344_874_498, + 6_923_202_753_807, + 7_706_717_883_882, + 8_578_905_263_043, + 9_549_800_138_161, + 10_630_573_468_586, + 11_833_660_457_397, + 13_172_903_628_838, + 14_663_712_098_160, + 16_323_238_866_411, + 18_170_578_180_087, + 20_226_985_226_447, + 22_516_120_692_255, + 25_064_322_999_817, + 27_900_911_352_605, + 31_058_523_077_268, + 34_573_489_143_434, + 38_486_252_181_966, + 42_841_831_811_331, + 47_690_342_626_046, + 53_087_570_807_094, + 59_095_615_988_698, + 65_783_605_766_662, + 73_228_491_069_308, + 81_515_931_542_404, + 90_741_281_135_191, + 101_010_685_227_495, + 112_442_301_921_293, + 125_167_661_548_718, + 139_333_180_038_781, + 155_101_843_555_358, + 172_655_083_789_626, + 192_194_865_483_744, + 213_946_010_204_502, + 238_158_783_103_893, + 265_111_772_429_462, + 295_115_094_915_607, + 328_513_963_936_552, + 365_692_661_475_578, + 407_078_959_611_349, + 453_149_042_394_237, + 504_432_984_742_966, + 561_520_851_400_862, + 625_069_486_125_324, + 695_810_069_225_823, + 774_556_530_406_243, + 862_214_913_708_369, + 959_793_802_308_039, + 1_068_415_923_109_985, + 1_189_331_064_661_951, + 1_323_930_457_019_515, + 1_473_762_779_014_021, + 1_640_551_977_100_649, + 1_826_217_100_807_404, + 2_032_894_383_008_501, + 2_262_961_819_074_188, + 2_519_066_527_700_738, + 2_804_155_208_229_882, + 3_121_508_044_894_685, + 3_474_776_448_088_622, + 3_868_025_066_902_796, + 4_305_778_556_320_752, + 4_793_073_637_166_665, + 5_335_517_047_800_242, + 5_939_350_054_341_159, + 6_611_520_261_667_250, + 7_359_761_551_432_161, + 8_192_683_066_856_378, + 9_119_868_268_136_230, + 10_151_985_198_186_376, + 11_300_909_227_415_580, + 12_579_859_689_817_292, + 14_003_551_982_487_792, + 15_588_366_878_604_342, + 17_352_539_001_951_086, + 19_316_366_631_550_092, + 21_502_445_250_375_680, + 23_935_927_525_325_748, + 26_644_812_709_737_600, + 29_660_268_798_266_784, + 33_016_991_140_790_860, + 36_753_601_641_491_664, + 40_913_093_136_236_104, + 45_543_324_061_189_736, + 50_697_569_104_240_168, + 56_435_132_174_936_472, + 62_822_028_745_677_552, + 69_931_745_415_056_768, + 77_846_085_432_775_824, + 86_656_109_914_600_688, + 96_463_185_576_826_656, + 107_380_151_045_315_664, + 119_532_615_158_469_088, + 133_060_402_202_199_856, + 148_119_160_705_543_712, + 164_882_154_307_451_552, + 183_542_255_300_186_560, + 204_314_163_786_713_728, + 227_436_877_985_347_776, + 253_176_444_104_585_088, + 281_829_017_427_734_464, + 313_724_269_827_691_328, + 349_229_182_918_168_832, + 388_752_270_484_770_624, + 432_748_278_778_513_664, + 481_723_418_752_617_984, + 536_241_190_443_833_600, + 596_928_866_512_693_376, + 664_484_709_541_257_600, + 739_686_006_129_409_280, + 823_398_010_228_713_984, + 916_583_898_614_395_264, + 1_020_315_853_041_475_584, + 1_135_787_396_594_579_584, + 1_264_327_126_171_442_688, + 1_407_413_999_103_859_968, + 1_566_694_349_801_462_272, + 1_744_000_832_209_069_824, + 1_941_373_506_026_471_680, + 2_161_083_309_305_266_176, + 2_405_658_187_494_662_656, + 2_677_912_179_572_818_944, + 2_980_977_795_924_034_048, + 3_318_342_060_496_414_208, + 3_693_886_631_935_247_360, + 4_111_932_465_319_354_368, + 4_577_289_528_371_127_808, + 5_095_312_144_166_932_480, + 5_671_960_597_112_134_656, + 6_313_869_711_009_142_784, + 7_028_425_188_266_614_784, + 7_823_848_588_596_424_704, + 8_709_291_924_949_524_480, + 9_694_942_965_096_232_960, + 10_792_142_450_433_898_496, + 12_013_514_580_722_579_456, + 13_373_112_266_084_982_784, + 14_886_578_817_516_689_408, + 16_571_327_936_291_497_984, + 18_446_744_073_709_551_615, +]; diff --git a/runtime/westend/src/weights/mod.rs b/runtime/westend/src/weights/mod.rs index 0dc5bddb0cea..923245b2fc35 100644 --- a/runtime/westend/src/weights/mod.rs +++ b/runtime/westend/src/weights/mod.rs @@ -16,6 +16,7 @@ //! A list of the different weight modules for our runtime. pub mod frame_system; +pub mod pallet_bags_list; pub mod pallet_balances; pub mod pallet_election_provider_multi_phase; pub mod pallet_identity; @@ -33,3 +34,7 @@ pub mod runtime_common_auctions; pub mod runtime_common_crowdloan; pub mod runtime_common_paras_registrar; pub mod runtime_common_slots; +pub mod runtime_parachains_configuration; +pub mod runtime_parachains_initializer; +pub mod runtime_parachains_paras; +pub mod xcm; diff --git a/runtime/westend/src/weights/pallet_bags_list.rs b/runtime/westend/src/weights/pallet_bags_list.rs new file mode 100644 index 000000000000..5ba9cbe83b18 --- /dev/null +++ b/runtime/westend/src/weights/pallet_bags_list.rs @@ -0,0 +1,65 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `pallet_bags_list` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-17, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_bags_list +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `pallet_bags_list`. +pub struct WeightInfo(PhantomData); +impl pallet_bags_list::WeightInfo for WeightInfo { + // Storage: Staking Bonded (r:1 w:0) + // Storage: Staking Ledger (r:1 w:0) + // Storage: BagsList ListNodes (r:4 w:4) + // Storage: BagsList ListBags (r:1 w:1) + fn rebag_non_terminal() -> Weight { + (65_506_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } + // Storage: Staking Bonded (r:1 w:0) + // Storage: Staking Ledger (r:1 w:0) + // Storage: BagsList ListNodes (r:3 w:3) + // Storage: BagsList ListBags (r:2 w:2) + fn rebag_terminal() -> Weight { + (65_008_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } +} diff --git a/runtime/westend/src/weights/pallet_balances.rs b/runtime/westend/src/weights/pallet_balances.rs index 5009fc872040..d09e561c453c 100644 --- a/runtime/westend/src/weights/pallet_balances.rs +++ b/runtime/westend/src/weights/pallet_balances.rs @@ -72,4 +72,10 @@ impl pallet_balances::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: System Account (r:1 w:1) + fn force_unreserve() -> Weight { + (27_766_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } } diff --git a/runtime/westend/src/weights/pallet_election_provider_multi_phase.rs b/runtime/westend/src/weights/pallet_election_provider_multi_phase.rs index a285e77f01ce..cdfa4cbe08a5 100644 --- a/runtime/westend/src/weights/pallet_election_provider_multi_phase.rs +++ b/runtime/westend/src/weights/pallet_election_provider_multi_phase.rs @@ -83,7 +83,7 @@ impl pallet_election_provider_multi_phase::WeightInfo f // Storage: ElectionProviderMultiPhase SnapshotMetadata (r:0 w:1) // Storage: ElectionProviderMultiPhase DesiredTargets (r:0 w:1) // Storage: ElectionProviderMultiPhase Snapshot (r:0 w:1) - fn create_snapshot_internal() -> Weight { + fn create_snapshot_internal(_: u32, _: u32) -> Weight { (8_835_233_000 as Weight).saturating_add(T::DbWeight::get().writes(3 as Weight)) } // Storage: ElectionProviderMultiPhase SignedSubmissionIndices (r:1 w:1) diff --git a/runtime/westend/src/weights/pallet_staking.rs b/runtime/westend/src/weights/pallet_staking.rs index 45b2f6646c34..7392df46e267 100644 --- a/runtime/westend/src/weights/pallet_staking.rs +++ b/runtime/westend/src/weights/pallet_staking.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// Copyright 2017-2021 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -15,8 +15,8 @@ // along with Polkadot. If not, see . //! Autogenerated weights for `pallet_staking` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-07-02, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-17, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 // Executed Command: @@ -33,6 +33,8 @@ // --header=./file_header.txt // --output=./runtime/westend/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] @@ -42,182 +44,369 @@ use sp_std::marker::PhantomData; /// Weight functions for `pallet_staking`. pub struct WeightInfo(PhantomData); impl pallet_staking::WeightInfo for WeightInfo { + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking HistoryDepth (r:1 w:0) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Payee (r:0 w:1) fn bond() -> Weight { - (71_835_000 as Weight) + (67_211_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } + // Storage: Staking Bonded (r:1 w:0) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: BagsList ListNodes (r:3 w:3) + // Storage: BagsList ListBags (r:2 w:2) fn bond_extra() -> Weight { - (54_894_000 as Weight) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) - .saturating_add(T::DbWeight::get().writes(2 as Weight)) + (107_863_000 as Weight) + .saturating_add(T::DbWeight::get().reads(8 as Weight)) + .saturating_add(T::DbWeight::get().writes(7 as Weight)) } + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking Nominators (r:1 w:0) + // Storage: Staking MinNominatorBond (r:1 w:0) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Balances Locks (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: BagsList ListNodes (r:3 w:3) + // Storage: Staking Bonded (r:1 w:0) + // Storage: BagsList ListBags (r:2 w:2) fn unbond() -> Weight { - (59_419_000 as Weight) - .saturating_add(T::DbWeight::get().reads(6 as Weight)) - .saturating_add(T::DbWeight::get().writes(3 as Weight)) + (113_462_000 as Weight) + .saturating_add(T::DbWeight::get().reads(12 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) } - fn withdraw_unbonded_update(s: u32) -> Weight { - (50_384_000 as Weight) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Balances Locks (r:1 w:1) + // Storage: System Account (r:1 w:1) + fn withdraw_unbonded_update(s: u32, ) -> Weight { + (48_161_000 as Weight) // Standard Error: 0 - .saturating_add((26_000 as Weight).saturating_mul(s as Weight)) + .saturating_add((20_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } - fn withdraw_unbonded_kill(s: u32) -> Weight { - (82_905_000 as Weight) - // Standard Error: 1_000 - .saturating_add((2_287_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(8 as Weight)) - .saturating_add(T::DbWeight::get().writes(6 as Weight)) - .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking SlashingSpans (r:1 w:0) + // Storage: Staking Validators (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Payee (r:0 w:1) + fn withdraw_unbonded_kill(_s: u32, ) -> Weight { + (95_012_000 as Weight) + .saturating_add(T::DbWeight::get().reads(13 as Weight)) + .saturating_add(T::DbWeight::get().writes(11 as Weight)) } + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking MinValidatorBond (r:1 w:0) + // Storage: Staking Validators (r:1 w:1) + // Storage: Staking MaxValidatorsCount (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) + // Storage: Staking CounterForValidators (r:1 w:1) fn validate() -> Weight { - (33_672_000 as Weight) - .saturating_add(T::DbWeight::get().reads(6 as Weight)) - .saturating_add(T::DbWeight::get().writes(2 as Weight)) + (65_171_000 as Weight) + .saturating_add(T::DbWeight::get().reads(11 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) } - fn kick(k: u32) -> Weight { - (11_371_000 as Weight) - // Standard Error: 7_000 - .saturating_add((16_959_000 as Weight).saturating_mul(k as Weight)) + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + fn kick(k: u32, ) -> Weight { + (9_070_000 as Weight) + // Standard Error: 12_000 + .saturating_add((15_429_000 as Weight).saturating_mul(k as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(k as Weight))) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(k as Weight))) } - fn nominate(n: u32) -> Weight { - (40_353_000 as Weight) - // Standard Error: 12_000 - .saturating_add((5_341_000 as Weight).saturating_mul(n as Weight)) - .saturating_add(T::DbWeight::get().reads(7 as Weight)) + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking MinNominatorBond (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking MaxNominatorsCount (r:1 w:0) + // Storage: Staking Validators (r:2 w:0) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: Staking Bonded (r:1 w:0) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) + fn nominate(n: u32, ) -> Weight { + (75_755_000 as Weight) + // Standard Error: 10_000 + .saturating_add((5_153_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(12 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(n as Weight))) - .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) } + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking Validators (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) fn chill() -> Weight { - (17_740_000 as Weight).saturating_add(T::DbWeight::get().reads(3 as Weight)) + (64_425_000 as Weight) + .saturating_add(T::DbWeight::get().reads(8 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) } + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking Payee (r:0 w:1) fn set_payee() -> Weight { - (11_624_000 as Weight) + (11_264_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking Ledger (r:2 w:2) fn set_controller() -> Weight { - (25_480_000 as Weight) + (24_783_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } + // Storage: Staking ValidatorCount (r:0 w:1) fn set_validator_count() -> Weight { - (2_082_000 as Weight).saturating_add(T::DbWeight::get().writes(1 as Weight)) + (2_355_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking ForceEra (r:0 w:1) fn force_no_eras() -> Weight { - (2_311_000 as Weight).saturating_add(T::DbWeight::get().writes(1 as Weight)) + (2_566_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking ForceEra (r:0 w:1) fn force_new_era() -> Weight { - (2_282_000 as Weight).saturating_add(T::DbWeight::get().writes(1 as Weight)) + (2_501_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking ForceEra (r:0 w:1) fn force_new_era_always() -> Weight { - (2_230_000 as Weight).saturating_add(T::DbWeight::get().writes(1 as Weight)) + (2_542_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn set_invulnerables(v: u32) -> Weight { - (2_352_000 as Weight) + // Storage: Staking Invulnerables (r:0 w:1) + fn set_invulnerables(v: u32, ) -> Weight { + (2_747_000 as Weight) // Standard Error: 0 - .saturating_add((27_000 as Weight).saturating_mul(v as Weight)) + .saturating_add((53_000 as Weight).saturating_mul(v as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn force_unstake(s: u32) -> Weight { - (58_375_000 as Weight) - // Standard Error: 1_000 - .saturating_add((2_282_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(6 as Weight)) - .saturating_add(T::DbWeight::get().writes(6 as Weight)) + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking SlashingSpans (r:1 w:0) + // Storage: Staking Validators (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Ledger (r:0 w:1) + // Storage: Staking Payee (r:0 w:1) + // Storage: Staking SpanSlash (r:0 w:2) + fn force_unstake(s: u32, ) -> Weight { + (89_294_000 as Weight) + // Standard Error: 3_000 + .saturating_add((2_136_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(11 as Weight)) + .saturating_add(T::DbWeight::get().writes(12 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } - fn cancel_deferred_slash(s: u32) -> Weight { - (3_430_757_000 as Weight) - // Standard Error: 222_000 - .saturating_add((19_760_000 as Weight).saturating_mul(s as Weight)) + // Storage: Staking UnappliedSlashes (r:1 w:1) + fn cancel_deferred_slash(s: u32, ) -> Weight { + (2_804_887_000 as Weight) + // Standard Error: 181_000 + .saturating_add((16_202_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn payout_stakers_dead_controller(n: u32) -> Weight { - (103_686_000 as Weight) - // Standard Error: 17_000 - .saturating_add((47_044_000 as Weight).saturating_mul(n as Weight)) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking HistoryDepth (r:1 w:0) + // Storage: Staking ErasValidatorReward (r:1 w:0) + // Storage: Staking Bonded (r:2 w:0) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Staking ErasStakersClipped (r:1 w:0) + // Storage: Staking ErasRewardPoints (r:1 w:0) + // Storage: Staking ErasValidatorPrefs (r:1 w:0) + // Storage: Staking Payee (r:2 w:0) + // Storage: System Account (r:2 w:2) + fn payout_stakers_dead_controller(n: u32, ) -> Weight { + (108_674_000 as Weight) + // Standard Error: 27_000 + .saturating_add((43_449_000 as Weight).saturating_mul(n as Weight)) .saturating_add(T::DbWeight::get().reads(10 as Weight)) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().writes(2 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(n as Weight))) } - fn payout_stakers_alive_staked(n: u32) -> Weight { - (128_168_000 as Weight) - // Standard Error: 21_000 - .saturating_add((59_293_000 as Weight).saturating_mul(n as Weight)) + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking HistoryDepth (r:1 w:0) + // Storage: Staking ErasValidatorReward (r:1 w:0) + // Storage: Staking Bonded (r:2 w:0) + // Storage: Staking Ledger (r:2 w:2) + // Storage: Staking ErasStakersClipped (r:1 w:0) + // Storage: Staking ErasRewardPoints (r:1 w:0) + // Storage: Staking ErasValidatorPrefs (r:1 w:0) + // Storage: Staking Payee (r:2 w:0) + // Storage: System Account (r:2 w:2) + // Storage: Balances Locks (r:2 w:2) + fn payout_stakers_alive_staked(n: u32, ) -> Weight { + (133_185_000 as Weight) + // Standard Error: 30_000 + .saturating_add((55_519_000 as Weight).saturating_mul(n as Weight)) .saturating_add(T::DbWeight::get().reads(11 as Weight)) .saturating_add(T::DbWeight::get().reads((5 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().writes(3 as Weight)) .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(n as Weight))) } - fn rebond(l: u32) -> Weight { - (46_916_000 as Weight) - // Standard Error: 1_000 - .saturating_add((64_000 as Weight).saturating_mul(l as Weight)) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) - .saturating_add(T::DbWeight::get().writes(3 as Weight)) + // Storage: Staking Ledger (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: BagsList ListNodes (r:3 w:3) + // Storage: Staking Bonded (r:1 w:0) + // Storage: BagsList ListBags (r:2 w:2) + fn rebond(l: u32, ) -> Weight { + (103_089_000 as Weight) + // Standard Error: 4_000 + .saturating_add((73_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(9 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) } - fn set_history_depth(e: u32) -> Weight { + // Storage: Staking CurrentEra (r:1 w:0) + // Storage: Staking HistoryDepth (r:1 w:1) + // Storage: Staking ErasStakersClipped (r:0 w:2) + // Storage: Staking ErasValidatorPrefs (r:0 w:2) + // Storage: Staking ErasValidatorReward (r:0 w:1) + // Storage: Staking ErasRewardPoints (r:0 w:1) + // Storage: Staking ErasStakers (r:0 w:2) + // Storage: Staking ErasTotalStake (r:0 w:1) + // Storage: Staking ErasStartSessionIndex (r:0 w:1) + fn set_history_depth(e: u32, ) -> Weight { (0 as Weight) - // Standard Error: 63_000 - .saturating_add((33_032_000 as Weight).saturating_mul(e as Weight)) + // Standard Error: 64_000 + .saturating_add((31_498_000 as Weight).saturating_mul(e as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) .saturating_add(T::DbWeight::get().writes((7 as Weight).saturating_mul(e as Weight))) } - fn reap_stash(s: u32) -> Weight { - (69_690_000 as Weight) + // Storage: System Account (r:1 w:1) + // Storage: Staking Bonded (r:1 w:1) + // Storage: Staking SlashingSpans (r:1 w:1) + // Storage: Staking Validators (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) + // Storage: Balances Locks (r:1 w:1) + // Storage: Staking Ledger (r:0 w:1) + // Storage: Staking Payee (r:0 w:1) + // Storage: Staking SpanSlash (r:0 w:1) + fn reap_stash(s: u32, ) -> Weight { + (92_220_000 as Weight) // Standard Error: 1_000 - .saturating_add((2_271_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(7 as Weight)) - .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add((2_132_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(11 as Weight)) + .saturating_add(T::DbWeight::get().writes(12 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } - fn new_era(v: u32, n: u32) -> Weight { + // Storage: Staking CounterForNominators (r:1 w:0) + // Storage: Staking CounterForValidators (r:1 w:0) + // Storage: Staking Validators (r:2 w:0) + // Storage: Staking Bonded (r:101 w:0) + // Storage: Staking Ledger (r:101 w:0) + // Storage: Staking SlashingSpans (r:1 w:0) + // Storage: Staking Nominators (r:101 w:0) + // Storage: System BlockWeight (r:1 w:1) + // Storage: Staking ValidatorCount (r:1 w:0) + // Storage: Staking MinimumValidatorCount (r:1 w:0) + // Storage: Staking CurrentEra (r:1 w:1) + // Storage: Staking HistoryDepth (r:1 w:0) + // Storage: Staking ErasStakersClipped (r:0 w:1) + // Storage: Staking ErasValidatorPrefs (r:0 w:1) + // Storage: Staking ErasStakers (r:0 w:1) + // Storage: Staking ErasTotalStake (r:0 w:1) + // Storage: Staking ErasStartSessionIndex (r:0 w:1) + fn new_era(v: u32, n: u32, ) -> Weight { (0 as Weight) - // Standard Error: 787_000 - .saturating_add((310_720_000 as Weight).saturating_mul(v as Weight)) - // Standard Error: 39_000 - .saturating_add((48_687_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 802_000 + .saturating_add((294_926_000 as Weight).saturating_mul(v as Weight)) + // Standard Error: 40_000 + .saturating_add((49_452_000 as Weight).saturating_mul(n as Weight)) .saturating_add(T::DbWeight::get().reads(10 as Weight)) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(v as Weight))) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().writes(4 as Weight)) .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(v as Weight))) } - fn get_npos_voters(v: u32, n: u32, s: u32) -> Weight { + // Storage: Staking CounterForNominators (r:1 w:0) + // Storage: Staking CounterForValidators (r:1 w:0) + // Storage: Staking Validators (r:501 w:0) + // Storage: Staking Bonded (r:1500 w:0) + // Storage: Staking Ledger (r:1500 w:0) + // Storage: Staking SlashingSpans (r:21 w:0) + // Storage: Staking Nominators (r:1001 w:0) + // Storage: System BlockWeight (r:1 w:1) + fn get_npos_voters(v: u32, n: u32, s: u32, ) -> Weight { (0 as Weight) - // Standard Error: 110_000 - .saturating_add((25_641_000 as Weight).saturating_mul(v as Weight)) - // Standard Error: 110_000 - .saturating_add((27_889_000 as Weight).saturating_mul(n as Weight)) - // Standard Error: 3_749_000 - .saturating_add((15_769_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) + // Standard Error: 106_000 + .saturating_add((25_237_000 as Weight).saturating_mul(v as Weight)) + // Standard Error: 106_000 + .saturating_add((31_267_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 3_621_000 + .saturating_add((51_975_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(v as Weight))) .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn get_npos_targets(v: u32) -> Weight { + // Storage: Staking Validators (r:501 w:0) + // Storage: System BlockWeight (r:1 w:1) + fn get_npos_targets(v: u32, ) -> Weight { (0 as Weight) - // Standard Error: 36_000 - .saturating_add((10_960_000 as Weight).saturating_mul(v as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) + // Standard Error: 34_000 + .saturating_add((9_890_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(v as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Staking MinValidatorBond (r:0 w:1) + // Storage: Staking MaxValidatorsCount (r:0 w:1) + // Storage: Staking ChillThreshold (r:0 w:1) + // Storage: Staking MaxNominatorsCount (r:0 w:1) + // Storage: Staking MinNominatorBond (r:0 w:1) fn set_staking_limits() -> Weight { - (5_696_000 as Weight).saturating_add(T::DbWeight::get().writes(5 as Weight)) + (5_641_000 as Weight) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) } + // Storage: Staking Ledger (r:1 w:0) + // Storage: Staking ChillThreshold (r:1 w:0) + // Storage: Staking Nominators (r:1 w:1) + // Storage: Staking MaxNominatorsCount (r:1 w:0) + // Storage: Staking CounterForNominators (r:1 w:1) + // Storage: Staking MinNominatorBond (r:1 w:0) + // Storage: Staking Validators (r:1 w:0) + // Storage: BagsList ListNodes (r:2 w:2) + // Storage: BagsList ListBags (r:1 w:1) + // Storage: BagsList CounterForListNodes (r:1 w:1) fn chill_other() -> Weight { - (41_216_000 as Weight) - .saturating_add(T::DbWeight::get().reads(7 as Weight)) - .saturating_add(T::DbWeight::get().writes(2 as Weight)) + (76_657_000 as Weight) + .saturating_add(T::DbWeight::get().reads(11 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) } } diff --git a/runtime/westend/src/weights/runtime_parachains_configuration.rs b/runtime/westend/src/weights/runtime_parachains_configuration.rs new file mode 100644 index 000000000000..6c1753e7c3b3 --- /dev/null +++ b/runtime/westend/src/weights/runtime_parachains_configuration.rs @@ -0,0 +1,91 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_parachains::configuration` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-17, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_parachains::configuration +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/runtime_parachains_configuration.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_parachains::configuration`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::configuration::WeightInfo for WeightInfo { + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_block_number() -> Weight { + (12_795_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_u32() -> Weight { + (12_758_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_option_u32() -> Weight { + (12_861_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_weight() -> Weight { + (12_854_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Benchmark Override (r:0 w:0) + fn set_hrmp_open_request_ttl() -> Weight { + (2_000_000_000_000 as Weight) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Configuration PendingConfig (r:1 w:1) + // Storage: Configuration ActiveConfig (r:1 w:0) + fn set_config_with_balance() -> Weight { + (12_838_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/westend/src/weights/runtime_parachains_initializer.rs b/runtime/westend/src/weights/runtime_parachains_initializer.rs new file mode 100644 index 000000000000..9877d23b93fa --- /dev/null +++ b/runtime/westend/src/weights/runtime_parachains_initializer.rs @@ -0,0 +1,55 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_parachains::initializer` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-25, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_parachains::initializer +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/runtime_parachains_initializer.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_parachains::initializer`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::initializer::WeightInfo for WeightInfo { + // Storage: System Digest (r:1 w:1) + fn force_approve(d: u32, ) -> Weight { + (6_607_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(d as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/westend/src/weights/runtime_parachains_paras.rs b/runtime/westend/src/weights/runtime_parachains_paras.rs new file mode 100644 index 000000000000..f04f3162a263 --- /dev/null +++ b/runtime/westend/src/weights/runtime_parachains_paras.rs @@ -0,0 +1,106 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Autogenerated weights for `runtime_parachains::paras` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_parachains::paras +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/runtime_parachains_paras.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `runtime_parachains::paras`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::paras::WeightInfo for WeightInfo { + // Storage: Paras CurrentCodeHash (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras PastCodeMeta (r:1 w:1) + // Storage: Paras PastCodePruning (r:1 w:1) + // Storage: Paras PastCodeHash (r:0 w:1) + // Storage: Paras CodeByHash (r:0 w:1) + fn force_set_current_code(c: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } + // Storage: Paras Heads (r:0 w:1) + fn force_set_current_head(s: u32, ) -> Weight { + (17_522_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: Paras FutureCodeUpgrades (r:1 w:1) + // Storage: Paras UpcomingUpgrades (r:1 w:1) + // Storage: Paras UpgradeCooldowns (r:1 w:1) + // Storage: System Digest (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras CodeByHash (r:0 w:1) + // Storage: Paras FutureCodeHash (r:0 w:1) + // Storage: Paras UpgradeRestrictionSignal (r:0 w:1) + fn force_schedule_code_upgrade(c: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + } + // Storage: Paras FutureCodeUpgrades (r:1 w:1) + // Storage: Paras FutureCodeHash (r:1 w:1) + // Storage: Paras CurrentCodeHash (r:1 w:1) + // Storage: System Digest (r:1 w:1) + // Storage: Paras PastCodeMeta (r:1 w:1) + // Storage: Paras PastCodePruning (r:1 w:1) + // Storage: Paras Heads (r:0 w:1) + // Storage: Paras PastCodeHash (r:0 w:1) + // Storage: Paras UpgradeGoAheadSignal (r:0 w:1) + fn force_note_new_head(s: u32, ) -> Weight { + (71_155_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(9 as Weight)) + } + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras ActionsQueue (r:1 w:1) + fn force_queue_action() -> Weight { + (27_230_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/westend/src/weights/xcm/mod.rs b/runtime/westend/src/weights/xcm/mod.rs new file mode 100644 index 000000000000..1b0d7c1ef485 --- /dev/null +++ b/runtime/westend/src/weights/xcm/mod.rs @@ -0,0 +1,193 @@ +mod pallet_xcm_benchmarks_fungible; +mod pallet_xcm_benchmarks_generic; + +use crate::Runtime; +use frame_support::weights::Weight; +use sp_std::prelude::*; +use xcm::{latest::prelude::*, DoubleEncoded}; + +use pallet_xcm_benchmarks_fungible::WeightInfo as XcmBalancesWeight; +use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; + +/// Types of asset supported by the westend runtime. +pub enum AssetTypes { + /// An asset backed by `pallet-balances`. + Balances, + /// Unknown asset. + Unknown, +} + +impl From<&MultiAsset> for AssetTypes { + fn from(asset: &MultiAsset) -> Self { + match asset { + MultiAsset { id: Concrete(MultiLocation { parents: 0, interior: Here }), .. } => + AssetTypes::Balances, + _ => AssetTypes::Unknown, + } + } +} + +trait WeighMultiAssets { + fn weigh_multi_assets(&self, balances_weight: Weight) -> Weight; +} + +// TODO wild case +impl WeighMultiAssets for MultiAssetFilter { + fn weigh_multi_assets(&self, balances_weight: Weight) -> Weight { + match self { + Self::Definite(assets) => assets + .inner() + .into_iter() + .map(From::from) + .map(|t| match t { + AssetTypes::Balances => balances_weight, + AssetTypes::Unknown => Weight::MAX, + }) + .fold(0, |acc, x| acc.saturating_add(x)), + _ => Weight::MAX, + } + } +} + +impl WeighMultiAssets for MultiAssets { + fn weigh_multi_assets(&self, balances_weight: Weight) -> Weight { + self.inner() + .into_iter() + .map(|m| >::from(m)) + .map(|t| match t { + AssetTypes::Balances => balances_weight, + AssetTypes::Unknown => Weight::MAX, + }) + .fold(0, |acc, x| acc.saturating_add(x)) + } +} + +pub struct WestendXcmWeight(core::marker::PhantomData); +impl XcmWeightInfo for WestendXcmWeight { + fn withdraw_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmBalancesWeight::::withdraw_asset()) + } + fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmGeneric::::reserve_asset_deposited()) + } + fn receive_teleported_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmBalancesWeight::::receive_teleported_asset()) + } + fn query_response(_query_id: &u64, _response: &Response, max_weight: &u64) -> Weight { + *max_weight + } + fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { + assets.weigh_multi_assets(XcmBalancesWeight::::transfer_asset()) + } + fn transfer_reserve_asset( + assets: &MultiAssets, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmBalancesWeight::::transfer_reserve_asset()) + } + fn transact( + _origin_type: &OriginKind, + _require_weight_at_most: &u64, + _call: &DoubleEncoded, + ) -> Weight { + XcmGeneric::::transact() + } + fn hrmp_new_channel_open_request( + _sender: &u32, + _max_message_size: &u32, + _max_capacity: &u32, + ) -> Weight { + XcmGeneric::::hrmp_new_channel_open_request() + } + fn hrmp_channel_accepted(_recipient: &u32) -> Weight { + XcmGeneric::::hrmp_channel_accepted() + } + fn hrmp_channel_closing(_initiator: &u32, _sender: &u32, _recipient: &u32) -> Weight { + XcmGeneric::::hrmp_channel_closing() + } + fn clear_origin() -> Weight { + XcmGeneric::::clear_origin() + } + fn descend_origin(who: &InteriorMultiLocation) -> Weight { + XcmGeneric::::descend_origin(who) + } + fn report_error( + _query_id: &QueryId, + _dest: &MultiLocation, + _max_response_weight: &u64, + ) -> Weight { + XcmGeneric::::report_error() + } + fn relayed_from(_who: &Junctions, _message: &Box>) -> Weight { + XcmGeneric::::relayed_from() + } + + fn deposit_asset( + assets: &MultiAssetFilter, + _max_assets: &u32, // TODO use max assets? + _dest: &MultiLocation, + ) -> Weight { + assets.weigh_multi_assets(XcmBalancesWeight::::deposit_asset()) + } + fn deposit_reserve_asset( + assets: &MultiAssetFilter, + _max_assets: &u32, // TODO use max assets? + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmBalancesWeight::::deposit_reserve_asset()) + } + fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets) -> Weight { + Weight::MAX // todo fix + } + fn initiate_reserve_withdraw( + assets: &MultiAssetFilter, + _reserve: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmGeneric::::initiate_reserve_withdraw()) + } + fn initiate_teleport( + assets: &MultiAssetFilter, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmBalancesWeight::::initiate_teleport()) + } + fn query_holding( + _query_id: &u64, + _dest: &MultiLocation, + _assets: &MultiAssetFilter, + _max_response_weight: &u64, + ) -> Weight { + XcmGeneric::::query_holding() + } + fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + XcmGeneric::::buy_execution() + } + fn refund_surplus() -> Weight { + XcmGeneric::::refund_surplus() + } + fn set_error_handler(_xcm: &Xcm) -> Weight { + XcmGeneric::::set_error_handler() + } + fn set_appendix(_xcm: &Xcm) -> Weight { + XcmGeneric::::set_appendix() + } + fn clear_error() -> Weight { + XcmGeneric::::clear_error() + } + fn claim_asset(assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + XcmGeneric::::claim_asset(assets) + } + fn trap(code: &u64) -> Weight { + XcmGeneric::::trap(code) + } + fn subscribe_version(_query_id: &QueryId, _max_response_weight: &u64) -> Weight { + XcmGeneric::::subscribe_version() + } + fn unsubscribe_version() -> Weight { + XcmGeneric::::unsubscribe_version() + } +} diff --git a/runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs new file mode 100644 index 000000000000..869c1bca408f --- /dev/null +++ b/runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -0,0 +1,95 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Autogenerated weights for `pallet_xcm_benchmarks::fungible` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2021-09-17, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_xcm_benchmarks::fungible +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --template=./xcm/pallet-xcm-benchmarks/template.hbs +// --output=./runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs + + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for `pallet_xcm_benchmarks::fungible`. +pub struct WeightInfo(PhantomData); +impl WeightInfo { + // Storage: System Account (r:1 w:1) + pub(crate) fn withdraw_asset() -> Weight { + (39_691_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: System Account (r:2 w:2) + pub(crate) fn transfer_asset() -> Weight { + (62_616_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + // Storage: System Account (r:2 w:2) + // Storage: Dmp DownwardMessageQueueHeads (r:1 w:1) + // Storage: Dmp DownwardMessageQueues (r:1 w:1) + pub(crate) fn transfer_reserve_asset() -> Weight { + (86_642_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + // Storage: Benchmark Override (r:0 w:0) + pub(crate) fn receive_teleported_asset() -> Weight { + (2_000_000_000_000 as Weight) + } + // Storage: System Account (r:1 w:1) + pub(crate) fn deposit_asset() -> Weight { + (49_745_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: System Account (r:1 w:1) + // Storage: Dmp DownwardMessageQueueHeads (r:1 w:1) + // Storage: Dmp DownwardMessageQueues (r:1 w:1) + pub(crate) fn deposit_reserve_asset() -> Weight { + (75_318_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + // Storage: System Account (r:1 w:1) + // Storage: Dmp DownwardMessageQueueHeads (r:1 w:1) + // Storage: Dmp DownwardMessageQueues (r:1 w:1) + pub(crate) fn initiate_teleport() -> Weight { + (75_467_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } +} diff --git a/runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs new file mode 100644 index 000000000000..5c8626f0b22a --- /dev/null +++ b/runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -0,0 +1,73 @@ +// this whole file is temp, and will be replaced in the future TODO + +use frame_support::dispatch::Weight; + +pub struct WeightInfo(sp_std::marker::PhantomData); +impl WeightInfo { + pub fn query_holding() -> Weight { + 1_000_000_000 + } + pub fn buy_execution() -> Weight { + 1_000_000_000 + } + pub fn transact() -> Weight { + 1_000_000_000 + } + pub fn reserve_asset_deposited() -> Weight { + 1_000_000_000 + } + pub fn hrmp_new_channel_open_request() -> Weight { + 1_000_000_000 + } + pub fn hrmp_channel_accepted() -> Weight { + 1_000_000_000 + } + pub fn hrmp_channel_closing() -> Weight { + 1_000_000_000 + } + pub fn relayed_from() -> Weight { + 1_000_000_000 + } + pub fn refund_surplus() -> Weight { + 1_000_000_000 + } + pub fn set_error_handler() -> Weight { + 1_000_000_000 + } + pub fn set_appendix() -> Weight { + 1_000_000_000 + } + pub fn clear_error() -> Weight { + 1_000_000_000 + } + pub fn claim_asset(_assets: &crate::MultiAssets) -> Weight { + 1_000_000_000 + } + pub fn trap(_code: &u64) -> Weight { + 1_000_000_000 + } + + pub fn subscribe_version() -> Weight { + 1_000_000_000 + } + + pub fn unsubscribe_version() -> Weight { + 1_000_000_000 + } + + pub fn clear_origin() -> Weight { + 1_000_000_000 + } + + pub fn descend_origin(_who: &crate::InteriorMultiLocation) -> Weight { + 1_000_000_000 + } + + pub fn initiate_reserve_withdraw() -> Weight { + 1_000_000_000 + } + + pub fn report_error() -> Weight { + 1_000_000_000 + } +} diff --git a/scripts/docker/release.Dockerfile b/scripts/docker/release.Dockerfile deleted file mode 100644 index 912c5fd4ae02..000000000000 --- a/scripts/docker/release.Dockerfile +++ /dev/null @@ -1,50 +0,0 @@ -FROM debian:buster-slim - -# metadata -ARG VCS_REF -ARG BUILD_DATE -ARG POLKADOT_VERSION - -LABEL io.parity.image.authors="devops-team@parity.io" \ - io.parity.image.vendor="Parity Technologies" \ - io.parity.image.title="parity/polkadot" \ - io.parity.image.description="polkadot: a platform for web3" \ - io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/docker/Dockerfile" \ - io.parity.image.revision="${VCS_REF}" \ - io.parity.image.created="${BUILD_DATE}" \ - io.parity.image.documentation="https://github.com/paritytech/polkadot/" - -# show backtraces -ENV RUST_BACKTRACE 1 - -# install tools and dependencies -RUN apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - libssl1.1 \ - ca-certificates \ - curl \ - gnupg && \ - useradd -m -u 1000 -U -s /bin/sh -d /polkadot polkadot && \ - gpg --recv-keys --keyserver hkps://keys.mailvelope.com 9D4B2B6EB8F97156D19669A9FF0812D491B96798 && \ - gpg --export 9D4B2B6EB8F97156D19669A9FF0812D491B96798 > /usr/share/keyrings/parity.gpg && \ - echo 'deb [signed-by=/usr/share/keyrings/parity.gpg] https://releases.parity.io/deb release main' > /etc/apt/sources.list.d/parity.list && \ - apt-get update && \ - apt-get install -y --no-install-recommends polkadot=${POLKADOT_VERSION#?} && \ -# apt cleanup - apt-get autoremove -y && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* ; \ - mkdir -p /data /polkadot/.local/share && \ - chown -R polkadot:polkadot /data && \ - ln -s /data /polkadot/.local/share/polkadot - -USER polkadot - -# check if executable works in this container -RUN /usr/bin/polkadot --version - -EXPOSE 30333 9933 9944 -VOLUME ["/polkadot"] - -ENTRYPOINT ["/usr/bin/polkadot"] - diff --git a/scripts/docker/collator.Dockerfile b/scripts/dockerfiles/collator_injected.Dockerfile similarity index 82% rename from scripts/docker/collator.Dockerfile rename to scripts/dockerfiles/collator_injected.Dockerfile index 9e25c55df55e..12cc32220049 100644 --- a/scripts/docker/collator.Dockerfile +++ b/scripts/dockerfiles/collator_injected.Dockerfile @@ -1,4 +1,5 @@ -FROM debian:buster-slim +# this file copies from scripts/docker/Dockerfile and changes only the binary name +FROM docker.io/library/ubuntu:20.04 # metadata ARG VCS_REF @@ -8,8 +9,8 @@ ARG IMAGE_NAME LABEL io.parity.image.authors="devops-team@parity.io" \ io.parity.image.vendor="Parity Technologies" \ io.parity.image.title="${IMAGE_NAME}" \ - io.parity.image.description="polkadot: a platform for web3" \ - io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/docker/Dockerfile" \ + io.parity.image.description="Injected adder-collator Docker image" \ + io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/docker/collator_injected.Dockerfile" \ io.parity.image.revision="${VCS_REF}" \ io.parity.image.created="${BUILD_DATE}" \ io.parity.image.documentation="https://github.com/paritytech/polkadot/" @@ -21,8 +22,7 @@ ENV RUST_BACKTRACE 1 RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y \ libssl1.1 \ - ca-certificates \ - curl && \ + ca-certificates && \ # apt cleanup apt-get autoremove -y && \ apt-get clean && \ diff --git a/docker/README.md b/scripts/dockerfiles/polkadot/README.md similarity index 100% rename from docker/README.md rename to scripts/dockerfiles/polkadot/README.md diff --git a/docker/build.sh b/scripts/dockerfiles/polkadot/build.sh similarity index 54% rename from docker/build.sh rename to scripts/dockerfiles/polkadot/build.sh index 6456383fcdea..cf100bedbfaa 100755 --- a/docker/build.sh +++ b/scripts/dockerfiles/polkadot/build.sh @@ -8,19 +8,17 @@ PROJECT_ROOT=`git rev-parse --show-toplevel` cd $PROJECT_ROOT # Find the current version from Cargo.toml -VERSION=`grep "^version" ./Cargo.toml | egrep -o "([0-9\.]+)"` +VERSION=`grep "^version" ./cli/Cargo.toml | egrep -o "([0-9\.]+)"` GITUSER=parity GITREPO=polkadot # Build the image echo "Building ${GITUSER}/${GITREPO}:latest docker image, hang on!" -time docker build -f ./docker/Dockerfile --build-arg RUSTC_WRAPPER= --build-arg PROFILE=release -t ${GITUSER}/${GITREPO}:latest . +time docker build -f ./scripts/dockerfiles/polkadot/polkadot_builder.Dockerfile -t ${GITUSER}/${GITREPO}:latest . +docker tag ${GITUSER}/${GITREPO}:latest ${GITUSER}/${GITREPO}:v${VERSION} # Show the list of available images for this repo echo "Image is ready" docker images | grep ${GITREPO} -echo -e "\nIf you just built version ${VERSION}, you may want to update your tag:" -echo " $ docker tag ${GITUSER}/${GITREPO}:$VERSION ${GITUSER}/${GITREPO}:${VERSION}" - popd diff --git a/docker/docker-compose-local.yml b/scripts/dockerfiles/polkadot/docker-compose-local.yml similarity index 51% rename from docker/docker-compose-local.yml rename to scripts/dockerfiles/polkadot/docker-compose-local.yml index 079d73825227..1ff3a1ccaac2 100644 --- a/docker/docker-compose-local.yml +++ b/scripts/dockerfiles/polkadot/docker-compose-local.yml @@ -1,33 +1,39 @@ version: '3' services: node_alice: - build: - context: . ports: - "30333:30333" - "9933:9933" - "9944:9944" - image: chevdor/polkadot:latest + - "9615:9615" + image: parity/polkadot:latest volumes: - "polkadot-data-alice:/data" - command: polkadot --chain=polkadot-local --alice -d /data --node-key 0000000000000000000000000000000000000000000000000000000000000001 + command: | + --chain=polkadot-local + --alice + -d /data + --node-key 0000000000000000000000000000000000000000000000000000000000000001 networks: testing_net: ipv4_address: 172.28.1.1 node_bob: - build: - context: . ports: - - "30344:30344" - - "9935:9935" - - "9945:9945" - image: chevdor/polkadot:latest + - "30344:30333" + - "9935:9933" + - "9945:9944" + - "29615:9615" + image: parity/polkadot:latest volumes: - "polkadot-data-bob:/data" links: - "node_alice:alice" - command: polkadot --chain=polkadot-local --bob -d /data --port 30344 --rpc-port 9935 --ws-port 9945 --bootnodes '/ip4/172.28.1.1/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR' + command: | + --chain=polkadot-local + --bob + -d /data + --bootnodes '/ip4/172.28.1.1/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR' networks: testing_net: ipv4_address: 172.28.1.2 diff --git a/scripts/dockerfiles/polkadot/docker-compose.yml b/scripts/dockerfiles/polkadot/docker-compose.yml new file mode 100644 index 000000000000..978191af88c1 --- /dev/null +++ b/scripts/dockerfiles/polkadot/docker-compose.yml @@ -0,0 +1,23 @@ +version: '3' +services: + polkadot: + ports: + - "127.0.0.1:30333:30333/tcp" + - "127.0.0.1:9933:9933/tcp" + image: parity/polkadot:latest + volumes: + - "polkadot-data:/data" + command: | + --unsafe-rpc-external + --unsafe-ws-external + --rpc-cors all + --prometheus-external + + ports: + - "30333:30333" + - "9933:9933" + - "9944:9944" + - "9615:9615" + +volumes: + polkadot-data: diff --git a/scripts/dockerfiles/polkadot/polkadot_builder.Dockerfile b/scripts/dockerfiles/polkadot/polkadot_builder.Dockerfile new file mode 100644 index 000000000000..6b096244a506 --- /dev/null +++ b/scripts/dockerfiles/polkadot/polkadot_builder.Dockerfile @@ -0,0 +1,36 @@ +# This is the build stage for Polkadot. Here we create the binary in a temporary image. +FROM docker.io/paritytech/ci-linux:production as builder + +WORKDIR /polkadot +COPY . /polkadot + +RUN cargo build --locked --release + +# This is the 2nd stage: a very small image where we copy the Polkadot binary." +FROM docker.io/library/ubuntu:20.04 + +LABEL description="Multistage Docker image for Polkadot: a platform for web3" \ + io.parity.image.type="builder" \ + io.parity.image.authors="chevdor@gmail.com, devops-team@parity.io" \ + io.parity.image.vendor="Parity Technologies" \ + io.parity.image.description="Polkadot: a platform for web3" \ + io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/dockerfiles/polkadot/polkadot_builder.Dockerfile" \ + io.parity.image.documentation="https://github.com/paritytech/polkadot/" + +COPY --from=builder /polkadot/target/release/polkadot /usr/local/bin + +RUN useradd -m -u 1000 -U -s /bin/sh -d /polkadot polkadot && \ + mkdir -p /data /polkadot/.local/share && \ + chown -R polkadot:polkadot /data && \ + ln -s /data /polkadot/.local/share/polkadot && \ +# unclutter and minimize the attack surface + rm -rf /usr/bin /usr/sbin && \ +# check if executable works in this container + /usr/local/bin/polkadot --version + +USER polkadot + +EXPOSE 30333 9933 9944 9615 +VOLUME ["/data"] + +ENTRYPOINT ["/usr/local/bin/polkadot"] diff --git a/scripts/docker/Dockerfile b/scripts/dockerfiles/polkadot_injected_debug.Dockerfile similarity index 86% rename from scripts/docker/Dockerfile rename to scripts/dockerfiles/polkadot_injected_debug.Dockerfile index 9052892c3f63..7ba312bf8b8f 100644 --- a/scripts/docker/Dockerfile +++ b/scripts/dockerfiles/polkadot_injected_debug.Dockerfile @@ -1,4 +1,4 @@ -FROM debian:buster-slim +FROM docker.io/library/ubuntu:20.04 # metadata ARG VCS_REF @@ -8,8 +8,8 @@ ARG IMAGE_NAME LABEL io.parity.image.authors="devops-team@parity.io" \ io.parity.image.vendor="Parity Technologies" \ io.parity.image.title="${IMAGE_NAME}" \ - io.parity.image.description="polkadot: a platform for web3" \ - io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/docker/Dockerfile" \ + io.parity.image.description="Polkadot: a platform for web3" \ + io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/docker/polkadot_injected_debug.Dockerfile" \ io.parity.image.revision="${VCS_REF}" \ io.parity.image.created="${BUILD_DATE}" \ io.parity.image.documentation="https://github.com/paritytech/polkadot/" @@ -21,8 +21,7 @@ ENV RUST_BACKTRACE 1 RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y \ libssl1.1 \ - ca-certificates \ - curl && \ + ca-certificates && \ # apt cleanup apt-get autoremove -y && \ apt-get clean && \ diff --git a/scripts/dockerfiles/polkadot_injected_release.Dockerfile b/scripts/dockerfiles/polkadot_injected_release.Dockerfile new file mode 100644 index 000000000000..c4c8aea182ed --- /dev/null +++ b/scripts/dockerfiles/polkadot_injected_release.Dockerfile @@ -0,0 +1,51 @@ +FROM docker.io/library/ubuntu:20.04 + +# metadata +ARG VCS_REF +ARG BUILD_DATE +ARG POLKADOT_VERSION +ARG POLKADOT_GPGKEY=9D4B2B6EB8F97156D19669A9FF0812D491B96798 +ARG GPG_KEYSERVER="hkps://keys.mailvelope.com" + +LABEL io.parity.image.authors="devops-team@parity.io" \ + io.parity.image.vendor="Parity Technologies" \ + io.parity.image.title="parity/polkadot" \ + io.parity.image.description="Polkadot: a platform for web3. This is the official Parity image with an injected binary." \ + io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/docker/polkadot_injected_release.Dockerfile" \ + io.parity.image.revision="${VCS_REF}" \ + io.parity.image.created="${BUILD_DATE}" \ + io.parity.image.documentation="https://github.com/paritytech/polkadot/" + +# show backtraces +ENV RUST_BACKTRACE 1 + +# install tools and dependencies +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + libssl1.1 \ + ca-certificates \ + gnupg && \ + useradd -m -u 1000 -U -s /bin/sh -d /polkadot polkadot && \ +# add repo's gpg keys and install the published polkadot binary + gpg --recv-keys --keyserver ${GPG_KEYSERVER} ${POLKADOT_GPGKEY} && \ + gpg --export ${POLKADOT_GPGKEY} > /usr/share/keyrings/parity.gpg && \ + echo 'deb [signed-by=/usr/share/keyrings/parity.gpg] https://releases.parity.io/deb release main' > /etc/apt/sources.list.d/parity.list && \ + apt-get update && \ + apt-get install -y --no-install-recommends polkadot=${POLKADOT_VERSION#?} && \ +# apt cleanup + apt-get autoremove -y && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* ; \ + mkdir -p /data /polkadot/.local/share && \ + chown -R polkadot:polkadot /data && \ + ln -s /data /polkadot/.local/share/polkadot + +USER polkadot + +# check if executable works in this container +RUN /usr/bin/polkadot --version + +EXPOSE 30333 9933 9944 +VOLUME ["/polkadot"] + +ENTRYPOINT ["/usr/bin/polkadot"] diff --git a/scripts/docker/staking-miner/staking_miner-builder.Dockerfile b/scripts/dockerfiles/staking-miner/staking-miner_builder.Dockerfile similarity index 84% rename from scripts/docker/staking-miner/staking_miner-builder.Dockerfile rename to scripts/dockerfiles/staking-miner/staking-miner_builder.Dockerfile index 20cf87c24a30..5208dfb65f27 100644 --- a/scripts/docker/staking-miner/staking_miner-builder.Dockerfile +++ b/scripts/dockerfiles/staking-miner/staking-miner_builder.Dockerfile @@ -14,13 +14,13 @@ RUN cargo build --locked --$PROFILE --package staking-miner # ===== SECOND STAGE ====== -FROM debian:buster-slim +FROM docker.io/library/ubuntu:20.04 LABEL description="This is the 2nd stage: a very small image where we copy the binary." LABEL io.parity.image.authors="devops-team@parity.io" \ io.parity.image.vendor="Parity Technologies" \ io.parity.image.title="${IMAGE_NAME}" \ - io.parity.image.description="staking-miner for substrate based chains" \ - io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/docker/staking-miner/staking_miner-builder.Dockerfile" \ + io.parity.image.description="${IMAGE_NAME} for substrate based chains" \ + io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/docker/${IMAGE_NAME}/${IMAGE_NAME}_builder.Dockerfile" \ io.parity.image.revision="${VCS_REF}" \ io.parity.image.created="${BUILD_DATE}" \ io.parity.image.documentation="https://github.com/paritytech/polkadot/" @@ -43,4 +43,4 @@ ENV RUST_LOG="info" # check if the binary works in this container RUN /usr/local/bin/staking-miner --version -ENTRYPOINT [ "/usr/local/bin/staking-miner"] +ENTRYPOINT [ "/usr/local/bin/staking-miner" ] diff --git a/scripts/docker/staking-miner/staking_miner-injected.Dockerfile b/scripts/dockerfiles/staking-miner/staking-miner_injected.Dockerfile similarity index 85% rename from scripts/docker/staking-miner/staking_miner-injected.Dockerfile rename to scripts/dockerfiles/staking-miner/staking-miner_injected.Dockerfile index 41c4f32b93cc..2d98504b2c40 100644 --- a/scripts/docker/staking-miner/staking_miner-injected.Dockerfile +++ b/scripts/dockerfiles/staking-miner/staking-miner_injected.Dockerfile @@ -1,4 +1,4 @@ -FROM debian:buster-slim +FROM docker.io/library/ubuntu:20.04 # metadata ARG VCS_REF @@ -8,8 +8,8 @@ ARG IMAGE_NAME="staking-miner" LABEL io.parity.image.authors="devops-team@parity.io" \ io.parity.image.vendor="Parity Technologies" \ io.parity.image.title="${IMAGE_NAME}" \ - io.parity.image.description="staking-miner for substrate based chains" \ - io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/docker/staking-miner/staking_miner-injected.Dockerfile" \ + io.parity.image.description="${IMAGE_NAME} for substrate based chains" \ + io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/docker/${IMAGE_NAME}/${IMAGE_NAME}_injected.Dockerfile" \ io.parity.image.revision="${VCS_REF}" \ io.parity.image.created="${BUILD_DATE}" \ io.parity.image.documentation="https://github.com/paritytech/polkadot/" @@ -22,6 +22,7 @@ RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y \ libssl1.1 \ ca-certificates && \ +# apt cleanup apt-get autoremove -y && \ apt-get clean && \ find /var/lib/apt/lists/ -type f -not -name lock -delete; \ diff --git a/scripts/github/extrinsic-ordering-filter.sh b/scripts/github/extrinsic-ordering-filter.sh new file mode 100755 index 000000000000..4fd3337f64a6 --- /dev/null +++ b/scripts/github/extrinsic-ordering-filter.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +# This script is used in a Github Workflow. It helps filtering out what is interesting +# when comparing metadata and spot what would require a tx version bump. + +# shellcheck disable=SC2002,SC2086 + +FILE=$1 + +# Higlight indexes that were deleted +function find_deletions() { + echo "\n## Deletions\n" + RES=$(cat "$FILE" | grep -n '\[\-\]' | tr -s " ") + if [ "$RES" ]; then + echo "$RES" | awk '{ printf "%s\\n", $0 }' + else + echo "n/a" + fi +} + +# Highlight indexes that have been deleted +function find_index_changes() { + echo "\n## Index changes\n" + RES=$(cat "$FILE" | grep -E -n -i 'idx:\s*([0-9]+)\s*(->)\s*([0-9]+)' | tr -s " ") + if [ "$RES" ]; then + echo "$RES" | awk '{ printf "%s\\n", $0 }' + else + echo "n/a" + fi +} + +# Highlight values that decreased +function find_decreases() { + echo "\n## Decreases\n" + OUT=$(cat "$FILE" | grep -E -i -o '([0-9]+)\s*(->)\s*([0-9]+)' | awk '$1 > $3 { printf "%s;", $0 }') + IFS=$';' LIST=("$OUT") + unset RES + for line in "${LIST[@]}"; do + RES="$RES\n$(cat "$FILE" | grep -E -i -n \"$line\" | tr -s " ")" + done + + if [ "$RES" ]; then + echo "$RES" | awk '{ printf "%s\\n", $0 }' | sort -u -g | uniq + else + echo "n/a" + fi +} + +echo "\n------------------------------ SUMMARY -------------------------------" +echo "\n⚠️ This filter is here to help spotting changes that should be reviewed carefully." +echo "\n⚠️ It catches only index changes, deletions and value decreases". + +find_deletions "$FILE" +find_index_changes "$FILE" +find_decreases "$FILE" +echo "\n----------------------------------------------------------------------\n" diff --git a/scripts/gitlab/check_no_default_features.sh b/scripts/gitlab/check_no_default_features.sh new file mode 100755 index 000000000000..455e5e72e579 --- /dev/null +++ b/scripts/gitlab/check_no_default_features.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +set -e + +pushd node/service && cargo check --no-default-features && popd +pushd cli && cargo check --no-default-features --features "service" && popd diff --git a/scripts/gitlab/lingua.dic b/scripts/gitlab/lingua.dic index 0dda104ca7ab..a32366d63ee6 100644 --- a/scripts/gitlab/lingua.dic +++ b/scripts/gitlab/lingua.dic @@ -198,6 +198,7 @@ proxy/G proxying PRs PVF/S +p2p README/MS redhat/M register/CD @@ -225,7 +226,9 @@ shareable Simnet/MS spawn/SR spawner +SS58 sr25519 +SSL startup/MS stateful str @@ -235,6 +238,7 @@ substream subsystem/MS subsystems' supermajority +SURI systemwide taskmanager/MS TCP @@ -249,6 +253,7 @@ timestamp/MS transitionary trie/MS trustless/Y +TTL tuple/SM typesystem ubuntu/M @@ -280,6 +285,7 @@ versa version/DMSG versioned VMP/SM +VPS VRF/SM w3f/MS wakeups @@ -290,5 +296,12 @@ Westend/M wildcard/MS WND/S Wococo +WS XCM/S XCMP/M +yeet +yml +decrement +DM +ParaId +functor diff --git a/scripts/gitlab/test_linux_stable.sh b/scripts/gitlab/test_linux_stable.sh index 8ba62ecbbb80..f7b36141af3a 100755 --- a/scripts/gitlab/test_linux_stable.sh +++ b/scripts/gitlab/test_linux_stable.sh @@ -4,4 +4,5 @@ set -e #shellcheck source=../common/lib.sh source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/../common/lib.sh" +time cargo test --release --locked -p polkadot-node-core-dispute-coordinator --features disputes time cargo test --workspace --release --verbose --locked --features=runtime-benchmarks diff --git a/statement-table/Cargo.toml b/statement-table/Cargo.toml index 4c94017dea6d..b6ae92a22c5b 100644 --- a/statement-table/Cargo.toml +++ b/statement-table/Cargo.toml @@ -1,10 +1,10 @@ [package] name = "polkadot-statement-table" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } primitives = { package = "polkadot-primitives", path = "../primitives" } diff --git a/tests/purge_chain_works.rs b/tests/purge_chain_works.rs index d410ff1207c9..2e874827621f 100644 --- a/tests/purge_chain_works.rs +++ b/tests/purge_chain_works.rs @@ -56,7 +56,7 @@ fn purge_chain_works() { .unwrap(); assert!(status.success()); - // Make sure that the `dev` chain folder exists, but the `db` is deleted. - assert!(tmpdir.path().join("chains/dev/").exists()); - assert!(!tmpdir.path().join("chains/dev/db").exists()); + // Make sure that the chain folder exists, but `db/full` is deleted. + assert!(tmpdir.path().join("chains/dev").exists()); + assert!(!tmpdir.path().join("chains/dev/db/full").exists()); } diff --git a/utils/remote-ext-tests/bags-list/Cargo.toml b/utils/remote-ext-tests/bags-list/Cargo.toml new file mode 100644 index 000000000000..6f97eabcf823 --- /dev/null +++ b/utils/remote-ext-tests/bags-list/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "remote-ext-tests-bags-list" +version = "0.9.11" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +polkadot-runtime = { version = "0.9.8", path = "../../../runtime/polkadot" } +kusama-runtime = { version = "0.9.8", path = "../../../runtime/kusama" } + +pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-election-provider-multi-phase = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-bags-list = { git = "https://github.com/paritytech/substrate", branch = "master" } +frame-election-provider-support = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-storage = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master" } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master" } +remote-externalities = { git = "https://github.com/paritytech/substrate", branch = "master" } +tokio = { version = "1", features = ["macros"] } +log = { version = "0.4.14" } +structopt = {version = "0.3.23" } diff --git a/utils/remote-ext-tests/bags-list/README.md b/utils/remote-ext-tests/bags-list/README.md new file mode 100644 index 000000000000..4955e29b3cb2 --- /dev/null +++ b/utils/remote-ext-tests/bags-list/README.md @@ -0,0 +1,3 @@ +# Remote Extension Tests For Pallet Bags List + +Integration tests that use state from live chains via remote externalities. diff --git a/utils/remote-ext-tests/bags-list/src/main.rs b/utils/remote-ext-tests/bags-list/src/main.rs new file mode 100644 index 000000000000..410cb1e80511 --- /dev/null +++ b/utils/remote-ext-tests/bags-list/src/main.rs @@ -0,0 +1,59 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Remote tests. + +use structopt::StructOpt; + +mod voter_bags; + +#[derive(StructOpt)] +enum Runtime { + Kusama, +} + +impl std::str::FromStr for Runtime { + type Err = &'static str; + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "kusama" => Ok(Runtime::Kusama), + _ => Err("wrong Runtime: can be 'polkadot' or 'kusama'."), + } + } +} + +#[derive(StructOpt)] +struct Cli { + #[structopt(long, default_value = "wss://rpc.kusama.io")] + uri: String, + #[structopt(long, short, default_value = "kusama")] + runtime: Runtime, +} + +#[tokio::main] +async fn main() { + let options = Cli::from_args(); + match options.runtime { + Runtime::Kusama => { + use kusama_runtime::{constants::currency::UNITS, Block, Runtime}; + voter_bags::test_voter_bags_migration::( + UNITS as u64, + options.uri.clone(), + ) + .await; + }, + } +} diff --git a/utils/remote-ext-tests/bags-list/src/voter_bags.rs b/utils/remote-ext-tests/bags-list/src/voter_bags.rs new file mode 100644 index 000000000000..4b7d7d6ec88d --- /dev/null +++ b/utils/remote-ext-tests/bags-list/src/voter_bags.rs @@ -0,0 +1,148 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Generic remote tests for the voter bags module. + +use frame_election_provider_support::SortedListProvider; +use frame_support::traits::Get; +use pallet_election_provider_multi_phase as EPM; +use pallet_staking::{BalanceOf, MinNominatorBond, Nominators}; +use remote_externalities::{Builder, Mode, OnlineConfig}; +use sp_runtime::traits::Block as BlockT; +use sp_std::convert::TryInto; +use sp_storage::well_known_keys; + +const LOG_TARGET: &'static str = "remote-ext-tests::bags-list"; + +/// Test voter bags migration. `currency_unit` is the number of planks per the +/// the runtimes `UNITS` (i.e. number of decimal places per DOT, KSM etc) +pub(crate) async fn test_voter_bags_migration< + Runtime: pallet_staking::Config + pallet_bags_list::Config + EPM::Config, + Block: BlockT, +>( + currency_unit: u64, + ws_url: String, +) { + sp_tracing::try_init_simple(); + + let mut ext = Builder::::new() + .mode(Mode::Online(OnlineConfig { + transport: ws_url.to_string().into(), + pallets: vec!["Staking".to_string()], + at: None, + state_snapshot: None, + })) + .inject_hashed_key(well_known_keys::CODE) + .build() + .await + .unwrap(); + + ext.execute_with(|| { + // set the ss58 prefix so addresses printed below are human friendly. + sp_core::crypto::set_default_ss58_version(Runtime::SS58Prefix::get().try_into().unwrap()); + + // get the nominator & validator count prior to migrating; these should be invariant. + let pre_migrate_nominator_count = >::iter().count() as u32; + log::info!(target: LOG_TARGET, "Nominator count: {}", pre_migrate_nominator_count); + + // run the actual migration, + let moved = ::SortedListProvider::regenerate( + pallet_staking::Nominators::::iter().map(|(n, _)| n), + pallet_staking::Pallet::::weight_of_fn(), + ); + log::info!(target: LOG_TARGET, "Moved {} nominators", moved); + + let voter_list_len = + ::SortedListProvider::iter().count() as u32; + let voter_list_count = ::SortedListProvider::count(); + // and confirm it is equal to the length of the `VoterList`. + assert_eq!(pre_migrate_nominator_count, voter_list_len); + assert_eq!(pre_migrate_nominator_count, voter_list_count); + + let min_nominator_bond = >::get(); + log::info!(target: LOG_TARGET, "min nominator bond is {:?}", min_nominator_bond); + + // go through every bag to track the total number of voters within bags + // and log some info about how voters are distributed within the bags. + let mut seen_in_bags = 0; + for vote_weight_thresh in ::BagThresholds::get() { + // threshold in terms of UNITS (e.g. KSM, DOT etc) + let vote_weight_thresh_as_unit = *vote_weight_thresh as f64 / currency_unit as f64; + let pretty_thresh = format!("Threshold: {}.", vote_weight_thresh_as_unit); + + let bag = match pallet_bags_list::Pallet::::list_bags_get(*vote_weight_thresh) + { + Some(bag) => bag, + None => { + log::info!(target: LOG_TARGET, "{} NO VOTERS.", pretty_thresh); + continue + }, + }; + + let voters_in_bag = bag.std_iter().count() as u32; + + // if this bag is below the min nominator bond print out all the members + let vote_weight_as_balance: BalanceOf = + (*vote_weight_thresh).try_into().map_err(|_| "should not fail").unwrap(); + if vote_weight_as_balance <= min_nominator_bond { + for id in bag.std_iter().map(|node| node.std_id().clone()) { + log::trace!( + target: LOG_TARGET, + "{} Account found below min bond: {:?}.", + pretty_thresh, + id + ); + } + } + + // update our overall counter + seen_in_bags += voters_in_bag; + + // percentage of all nominators + let percent_of_voters = percent(voters_in_bag, voter_list_count); + + log::info!( + target: LOG_TARGET, + "{} Nominators: {} [%{:.3}]", + pretty_thresh, + voters_in_bag, + percent_of_voters, + ); + } + + if seen_in_bags != voter_list_count { + log::error!( + target: LOG_TARGET, + "bags list population ({}) not on par whoever is voter_list ({})", + seen_in_bags, + voter_list_count, + ) + } + + // now let's test the process of a snapshot being created.. + EPM::Pallet::::create_snapshot().unwrap(); + + log::info!( + target: LOG_TARGET, + "a snapshot has been created using the new runtime and data, with metadata {:?}", + EPM::Pallet::::snapshot_metadata(), + ); + }); +} + +fn percent(portion: u32, total: u32) -> f64 { + (portion as f64 / total as f64) * 100f64 +} diff --git a/utils/staking-miner/Cargo.toml b/utils/staking-miner/Cargo.toml index 296b07a7b5ff..593d1a1bf2cd 100644 --- a/utils/staking-miner/Cargo.toml +++ b/utils/staking-miner/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "staking-miner" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] edition = "2018" [dependencies] codec = { package = "parity-scale-codec", version = "2.0.0" } -tokio = { version = "1.10", features = ["macros"] } +tokio = { version = "1.12", features = ["macros"] } log = "0.4.11" env_logger = "0.9.0" structopt = "0.3.23" -jsonrpsee-ws-client = { version = "0.3.0", default-features = false, features = ["tokio1"] } +jsonrpsee-ws-client = { version = "0.3.1", default-features = false, features = ["tokio1"] } serde_json = "1.0" serde = "1.0.130" paste = "1.0.5" @@ -22,11 +22,13 @@ sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-version = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-npos-elections = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate", branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", branch = "master" } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master" } +frame-election-provider-support = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-election-provider-multi-phase = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/utils/staking-miner/README.md b/utils/staking-miner/README.md index f5c68a648c45..944f870d6dfc 100644 --- a/utils/staking-miner/README.md +++ b/utils/staking-miner/README.md @@ -30,7 +30,7 @@ There are 2 options to build a staking-miner Docker image: First build the binary as documented [above](#building). You may then inject the binary into a Docker base image usingfrom the root of the Polkadot repository: ``` -docker build -t staking-miner -f scripts/docker/staking-miner/staking_miner-injected.Dockerfile target/release +docker build -t staking-miner -f scripts/docker/staking-miner/staking-miner_injected.Dockerfile target/release ``` ### Building the multi-stage image @@ -39,7 +39,7 @@ Unlike the injected image that requires a Linux pre-built binary, this option do The trade-off however is that it takes a little longer to build and this option is less ideal for CI tasks. You may build the multi-stage image the root of the Polkadot repository with: ``` -docker build -t staking-miner -f scripts/docker/staking-miner/staking_miner-builder.Dockerfile . +docker build -t staking-miner -f scripts/docker/staking-miner/staking-miner_builder.Dockerfile . ``` ### Running diff --git a/utils/staking-miner/src/dry_run.rs b/utils/staking-miner/src/dry_run.rs index 236d63ce4cc1..ffebdb3fadf2 100644 --- a/utils/staking-miner/src/dry_run.rs +++ b/utils/staking-miner/src/dry_run.rs @@ -23,7 +23,7 @@ use codec::Encode; use frame_support::traits::Currency; /// Forcefully create the snapshot. This can be used to compute the election at anytime. -fn force_create_snapshot(ext: &mut Ext) -> Result<(), Error> { +fn force_create_snapshot(ext: &mut Ext) -> Result<(), Error> { ext.execute_with(|| { if >::exists() { log::info!(target: LOG_TARGET, "snapshot already exists."); @@ -112,7 +112,7 @@ macro_rules! dry_run_cmd_for { ($runtime:ident) => { paste::paste! { shared: SharedConfig, config: DryRunConfig, signer: Signer, - ) -> Result<(), Error> { + ) -> Result<(), Error<$crate::[<$runtime _runtime_exports>]::Runtime>> { use $crate::[<$runtime _runtime_exports>]::*; let mut ext = crate::create_election_ext::( shared.uri.clone(), @@ -121,7 +121,8 @@ macro_rules! dry_run_cmd_for { ($runtime:ident) => { paste::paste! { ).await?; force_create_snapshot::(&mut ext)?; - let (raw_solution, witness) = crate::mine_unchecked::(&mut ext, config.iterations, false)?; + let (raw_solution, witness) = crate::mine_with::(&config.solver, &mut ext)?; + let nonce = crate::get_account_info::(client, &signer.account, config.at) .await? .map(|i| i.nonce) @@ -148,7 +149,9 @@ macro_rules! dry_run_cmd_for { ($runtime:ident) => { paste::paste! { }); log::info!(target: LOG_TARGET, "dispatch result is {:?}", dispatch_result); - let outcome = rpc_decode::(client, "system_dryRun", params!{ bytes }).await?; + let outcome = rpc_decode::(client, "system_dryRun", params!{ bytes }) + .await + .map_err::, _>(Into::into)?; log::info!(target: LOG_TARGET, "dry-run outcome is {:?}", outcome); Ok(()) } diff --git a/utils/staking-miner/src/emergency_solution.rs b/utils/staking-miner/src/emergency_solution.rs index ff7464c0c042..d27c23e38601 100644 --- a/utils/staking-miner/src/emergency_solution.rs +++ b/utils/staking-miner/src/emergency_solution.rs @@ -18,20 +18,22 @@ use crate::{prelude::*, Error, SharedConfig}; use codec::Encode; +use frame_election_provider_support::SequentialPhragmen; use std::io::Write; macro_rules! emergency_solution_cmd_for { ($runtime:ident) => { paste::paste! { /// Execute the emergency-solution command. pub(crate) async fn []( shared: SharedConfig, - ) -> Result<(), Error> { + ) -> Result<(), Error<$crate::[<$runtime _runtime_exports>]::Runtime>> { use $crate::[<$runtime _runtime_exports>]::*; let mut ext = crate::create_election_ext::(shared.uri.clone(), None, vec![]).await?; ext.execute_with(|| { assert!(EPM::Pallet::::current_phase().is_emergency()); // NOTE: this internally calls feasibility_check, but we just re-do it here as an easy way // to get a `ReadySolution`. - let (raw_solution, _) = >::mine_solution(50)?; + let (raw_solution, _) = + >::mine_solution::>()?; log::info!(target: LOG_TARGET, "mined solution with {:?}", &raw_solution.score); let ready_solution = EPM::Pallet::::feasibility_check(raw_solution, EPM::ElectionCompute::Signed)?; let encoded_ready = ready_solution.encode(); diff --git a/utils/staking-miner/src/main.rs b/utils/staking-miner/src/main.rs index 1769382e62af..b3f504ff2d07 100644 --- a/utils/staking-miner/src/main.rs +++ b/utils/staking-miner/src/main.rs @@ -38,9 +38,11 @@ mod signer; pub(crate) use prelude::*; pub(crate) use signer::get_account_info; +use frame_election_provider_support::NposSolver; use frame_support::traits::Get; use jsonrpsee_ws_client::{WsClient, WsClientBuilder}; use remote_externalities::{Builder, Mode, OnlineConfig}; +use sp_npos_elections::ExtendedBalance; use sp_runtime::traits::Block as BlockT; use structopt::StructOpt; @@ -79,7 +81,7 @@ macro_rules! construct_runtime_prelude { let crate::signer::Signer { account, pair, .. } = signer; - let local_call = EPMCall::::submit(Box::new(raw_solution), witness); + let local_call = EPMCall::::submit { raw_solution: Box::new(raw_solution), num_signed_submissions: witness }; let call: Call = as std::convert::TryInto>::try_into(local_call) .expect("election provider pallet must exist in the runtime, thus \ inner call can be converted, qed." @@ -193,15 +195,43 @@ macro_rules! any_runtime { } } -#[derive(Debug, thiserror::Error)] -enum Error { +/// Same as [`any_runtime`], but instead of returning a `Result`, this simply returns `()`. Useful +/// for situations where the result is not useful and un-ergonomic to handle. +#[macro_export] +macro_rules! any_runtime_unit { + ($($code:tt)*) => { + unsafe { + match $crate::RUNTIME { + $crate::AnyRuntime::Polkadot => { + #[allow(unused)] + use $crate::polkadot_runtime_exports::*; + let _ = $($code)*; + }, + $crate::AnyRuntime::Kusama => { + #[allow(unused)] + use $crate::kusama_runtime_exports::*; + let _ = $($code)*; + }, + $crate::AnyRuntime::Westend => { + #[allow(unused)] + use $crate::westend_runtime_exports::*; + let _ = $($code)*; + } + } + } + } +} + +#[derive(frame_support::DebugNoBound, thiserror::Error)] +enum Error { Io(#[from] std::io::Error), - Jsonrpsee(#[from] jsonrpsee_ws_client::types::Error), + JsonRpsee(#[from] jsonrpsee_ws_client::types::Error), + RpcHelperError(#[from] rpc_helpers::RpcHelperError), Codec(#[from] codec::Error), Crypto(sp_core::crypto::SecretStringError), RemoteExternalities(&'static str), - PalletMiner(EPM::unsigned::MinerError), - PalletElection(EPM::ElectionError), + PalletMiner(EPM::unsigned::MinerError), + PalletElection(EPM::ElectionError), PalletFeasibility(EPM::FeasibilityError), AccountDoesNotExists, IncorrectPhase, @@ -209,33 +239,33 @@ enum Error { VersionMismatch, } -impl From for Error { - fn from(e: sp_core::crypto::SecretStringError) -> Error { +impl From for Error { + fn from(e: sp_core::crypto::SecretStringError) -> Error { Error::Crypto(e) } } -impl From for Error { - fn from(e: EPM::unsigned::MinerError) -> Error { +impl From> for Error { + fn from(e: EPM::unsigned::MinerError) -> Error { Error::PalletMiner(e) } } -impl From for Error { - fn from(e: EPM::ElectionError) -> Error { +impl From> for Error { + fn from(e: EPM::ElectionError) -> Error { Error::PalletElection(e) } } -impl From for Error { - fn from(e: EPM::FeasibilityError) -> Error { +impl From for Error { + fn from(e: EPM::FeasibilityError) -> Error { Error::PalletFeasibility(e) } } -impl std::fmt::Display for Error { +impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - ::fmt(self, f) + as std::fmt::Debug>::fmt(self, f) } } @@ -249,6 +279,58 @@ enum Command { EmergencySolution, } +#[derive(Debug, Clone, StructOpt)] +enum Solvers { + SeqPhragmen { + #[structopt(long, default_value = "10")] + iterations: usize, + }, + PhragMMS { + #[structopt(long, default_value = "10")] + iterations: usize, + }, +} + +/// Mine a solution with the given `solver`. +fn mine_with( + solver: &Solvers, + ext: &mut Ext, +) -> Result<(EPM::RawSolution>, u32), Error> +where + T: EPM::Config, + T::Solver: NposSolver, +{ + use frame_election_provider_support::{PhragMMS, SequentialPhragmen}; + + match solver { + Solvers::SeqPhragmen { iterations } => { + BalanceIterations::set(*iterations); + mine_unchecked::< + T, + SequentialPhragmen< + ::AccountId, + sp_runtime::Perbill, + Balancing, + >, + >(ext, false) + }, + Solvers::PhragMMS { iterations } => { + BalanceIterations::set(*iterations); + mine_unchecked::< + T, + PhragMMS<::AccountId, sp_runtime::Perbill, Balancing>, + >(ext, false) + }, + } +} + +frame_support::parameter_types! { + /// Number of balancing iterations for a solution algorithm. Set based on the [`Solvers`] CLI + /// config. + pub static BalanceIterations: usize = 10; + pub static Balancing: Option<(usize, ExtendedBalance)> = Some((BalanceIterations::get(), 0)); +} + #[derive(Debug, Clone, StructOpt)] struct MonitorConfig { /// They type of event to listen to. @@ -259,8 +341,8 @@ struct MonitorConfig { #[structopt(long, default_value = "head", possible_values = &["head", "finalized"])] listen: String, - #[structopt(long, short, default_value = "10")] - iterations: usize, + #[structopt(subcommand)] + solver: Solvers, } #[derive(Debug, Clone, StructOpt)] @@ -269,8 +351,8 @@ struct DryRunConfig { #[structopt(long)] at: Option, - #[structopt(long, short, default_value = "10")] - iterations: usize, + #[structopt(subcommand)] + solver: Solvers, } #[derive(Debug, Clone, StructOpt)] @@ -303,19 +385,19 @@ async fn create_election_ext( uri: String, at: Option, additional: Vec, -) -> Result { +) -> Result> { use frame_support::{storage::generator::StorageMap, traits::PalletInfo}; use sp_core::hashing::twox_128; - let mut modules = vec![::PalletInfo::name::>() + let mut pallets = vec![::PalletInfo::name::>() .expect("Pallet always has name; qed.") .to_string()]; - modules.extend(additional); + pallets.extend(additional); Builder::::new() .mode(Mode::Online(OnlineConfig { transport: uri.into(), at, - modules, + pallets, ..Default::default() })) .inject_hashed_prefix(&>::prefix_hash()) @@ -327,13 +409,20 @@ async fn create_election_ext( /// Compute the election at the given block number. It expects to NOT be `Phase::Off`. In other /// words, the snapshot must exists on the given externalities. -fn mine_unchecked( +fn mine_unchecked( ext: &mut Ext, - iterations: usize, do_feasibility: bool, -) -> Result<(EPM::RawSolution>, u32), Error> { +) -> Result<(EPM::RawSolution>, u32), Error> +where + T: EPM::Config, + S: NposSolver< + Error = <::Solver as NposSolver>::Error, + AccountId = <::Solver as NposSolver>::AccountId, + >, +{ ext.execute_with(|| { - let (solution, _) = >::mine_solution(iterations)?; + let (solution, _) = + >::mine_solution::().map_err::, _>(Into::into)?; if do_feasibility { let _ = >::feasibility_check( solution.clone(), @@ -346,7 +435,7 @@ fn mine_unchecked( } #[allow(unused)] -fn mine_dpos(ext: &mut Ext) -> Result<(), Error> { +fn mine_dpos(ext: &mut Ext) -> Result<(), Error> { ext.execute_with(|| { use std::collections::BTreeMap; use EPM::RoundSnapshot; @@ -383,10 +472,10 @@ fn mine_dpos(ext: &mut Ext) -> Result<(), Error> { }) } -pub(crate) async fn check_versions( +pub(crate) async fn check_versions( client: &WsClient, print: bool, -) -> Result<(), Error> { +) -> Result<(), Error> { let linked_version = T::Version::get(); let on_chain_version = rpc_helpers::rpc::( client, @@ -486,7 +575,7 @@ async fn main() { } log::info!(target: LOG_TARGET, "connected to chain {:?}", chain); - let _ = any_runtime! { + any_runtime_unit! { check_versions::(&client, true).await }; @@ -498,9 +587,18 @@ async fn main() { let outcome = any_runtime! { match command.clone() { - Command::Monitor(c) => monitor_cmd(&client, shared, c, signer_account).await, - Command::DryRun(c) => dry_run_cmd(&client, shared, c, signer_account).await, - Command::EmergencySolution => emergency_solution_cmd(shared.clone()).await, + Command::Monitor(c) => monitor_cmd(&client, shared, c, signer_account).await + .map_err(|e| { + log::error!(target: LOG_TARGET, "Monitor error: {:?}", e); + }), + Command::DryRun(c) => dry_run_cmd(&client, shared, c, signer_account).await + .map_err(|e| { + log::error!(target: LOG_TARGET, "DryRun error: {:?}", e); + }), + Command::EmergencySolution => emergency_solution_cmd(shared.clone()).await + .map_err(|e| { + log::error!(target: LOG_TARGET, "EmergencySolution error: {:?}", e); + }), } }; log::info!(target: LOG_TARGET, "round of execution finished. outcome = {:?}", outcome); diff --git a/utils/staking-miner/src/monitor.rs b/utils/staking-miner/src/monitor.rs index d6ea12401d82..396700335dd7 100644 --- a/utils/staking-miner/src/monitor.rs +++ b/utils/staking-miner/src/monitor.rs @@ -30,10 +30,11 @@ use sc_transaction_pool_api::TransactionStatus; async fn ensure_signed_phase( client: &WsClient, at: B::Hash, -) -> Result<(), Error> { +) -> Result<(), Error> { let key = sp_core::storage::StorageKey(EPM::CurrentPhase::::hashed_key().to_vec()); let phase = get_storage::>(client, params! {key, at}) - .await? + .await + .map_err::, _>(Into::into)? .unwrap_or_default(); if phase.is_signed() { @@ -50,7 +51,7 @@ async fn ensure_no_previous_solution< >( ext: &mut Ext, us: &AccountId, -) -> Result<(), Error> { +) -> Result<(), Error> { use EPM::signed::SignedSubmissions; ext.execute_with(|| { if >::get().iter().any(|ss| &ss.who == us) { @@ -68,7 +69,7 @@ macro_rules! monitor_cmd_for { ($runtime:tt) => { paste::paste! { shared: SharedConfig, config: MonitorConfig, signer: Signer, - ) -> Result<(), Error> { + ) -> Result<(), Error<$crate::[<$runtime _runtime_exports>]::Runtime>> { use $crate::[<$runtime _runtime_exports>]::*; let (sub, unsub) = if config.listen == "head" { ("chain_subscribeNewHeads", "chain_unsubscribeNewHeads") @@ -109,7 +110,8 @@ macro_rules! monitor_cmd_for { ($runtime:tt) => { paste::paste! { continue; } - let (raw_solution, witness) = crate::mine_unchecked::(&mut ext, config.iterations, true)?; + let (raw_solution, witness) = crate::mine_with::(&config.solver, &mut ext)?; + log::info!(target: LOG_TARGET, "mined solution with {:?}", &raw_solution.score); let nonce = crate::get_account_info::(client, &signer.account, Some(hash)) @@ -149,8 +151,7 @@ macro_rules! monitor_cmd_for { ($runtime:tt) => { paste::paste! { TransactionStatus::InBlock(hash) => { log::info!(target: LOG_TARGET, "included at {:?}", hash); let key = frame_support::storage::storage_prefix(b"System", b"Events"); - let events =get_storage::< - Vec::Hash>> + let events = get_storage::::Hash>>, >(client, params!{ key, hash }).await?.unwrap_or_default(); log::info!(target: LOG_TARGET, "events at inclusion {:?}", events); } diff --git a/utils/staking-miner/src/rpc_helpers.rs b/utils/staking-miner/src/rpc_helpers.rs index cc086b1235b1..8cb7330bf0de 100644 --- a/utils/staking-miner/src/rpc_helpers.rs +++ b/utils/staking-miner/src/rpc_helpers.rs @@ -20,6 +20,18 @@ use super::*; use jsonrpsee_ws_client::types::traits::Client; pub(crate) use jsonrpsee_ws_client::types::v2::params::JsonRpcParams; +#[derive(frame_support::DebugNoBound, thiserror::Error)] +pub(crate) enum RpcHelperError { + JsonRpsee(#[from] jsonrpsee_ws_client::types::Error), + Codec(#[from] codec::Error), +} + +impl std::fmt::Display for RpcHelperError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + ::fmt(self, f) + } +} + #[macro_export] macro_rules! params { ($($param:expr),*) => { @@ -41,8 +53,11 @@ pub(crate) async fn rpc<'a, Ret: serde::de::DeserializeOwned>( client: &WsClient, method: &'a str, params: JsonRpcParams<'a>, -) -> Result { - client.request::(method, params).await.map_err(Into::into) +) -> Result { + client + .request::(method, params) + .await + .map_err::(Into::into) } /// Make the rpc request, decode the outcome into `Dec`. Don't use for storage, it will fail for @@ -51,57 +66,26 @@ pub(crate) async fn rpc_decode<'a, Dec: codec::Decode>( client: &WsClient, method: &'a str, params: JsonRpcParams<'a>, -) -> Result { - let bytes = rpc::(client, method, params).await?; - ::decode(&mut &*bytes.0).map_err(Into::into) +) -> Result { + let bytes = rpc::(client, method, params) + .await + .map_err::(Into::into)?; + ::decode(&mut &*bytes.0).map_err::(Into::into) } /// Get the storage item. pub(crate) async fn get_storage<'a, T: codec::Decode>( client: &WsClient, params: JsonRpcParams<'a>, -) -> Result, Error> { - let maybe_bytes = rpc::>(client, "state_getStorage", params).await?; +) -> Result, RpcHelperError> { + let maybe_bytes = rpc::>(client, "state_getStorage", params) + .await + .map_err::(Into::into)?; if let Some(bytes) = maybe_bytes { - let decoded = ::decode(&mut &*bytes.0)?; + let decoded = ::decode(&mut &*bytes.0) + .map_err::(Into::into)?; Ok(Some(decoded)) } else { Ok(None) } } - -use codec::{EncodeLike, FullCodec}; -use frame_support::storage::{StorageMap, StorageValue}; -#[allow(unused)] -pub(crate) async fn get_storage_value_frame_v2<'a, V: StorageValue, T: FullCodec, Hash>( - client: &WsClient, - maybe_at: Option, -) -> Result, Error> -where - V::Query: codec::Decode, - Hash: serde::Serialize, -{ - let key = >::hashed_key(); - get_storage::(client, params! { key, maybe_at }).await -} - -#[allow(unused)] -pub(crate) async fn get_storage_map_frame_v2< - 'a, - Hash, - KeyArg: EncodeLike, - K: FullCodec, - T: FullCodec, - M: StorageMap, ->( - client: &WsClient, - key: KeyArg, - maybe_at: Option, -) -> Result, Error> -where - M::Query: codec::Decode, - Hash: serde::Serialize, -{ - let key = >::hashed_key_for(key); - get_storage::(client, params! { key, maybe_at }).await -} diff --git a/utils/staking-miner/src/signer.rs b/utils/staking-miner/src/signer.rs index 8dd2696b3309..bc996ef351de 100644 --- a/utils/staking-miner/src/signer.rs +++ b/utils/staking-miner/src/signer.rs @@ -34,11 +34,11 @@ pub(crate) struct Signer { pub(crate) pair: Pair, } -pub(crate) async fn get_account_info( +pub(crate) async fn get_account_info( client: &WsClient, who: &T::AccountId, maybe_at: Option, -) -> Result>, Error> { +) -> Result>, Error> { rpc_helpers::get_storage::>( client, crate::params! { @@ -47,26 +47,27 @@ pub(crate) async fn get_account_info( }, ) .await + .map_err(Into::into) } /// Read the signer account's URI pub(crate) async fn signer_uri_from_string< T: frame_system::Config< - AccountId = AccountId, - Index = Index, - AccountData = pallet_balances::AccountData, - >, + AccountId = AccountId, + Index = Index, + AccountData = pallet_balances::AccountData, + > + EPM::Config, >( seed: &str, client: &WsClient, -) -> Result { +) -> Result> { let seed = seed.trim(); let pair = Pair::from_string(seed, None)?; let account = T::AccountId::from(pair.public()); let _info = get_account_info::(client, &account, None) .await? - .ok_or(Error::AccountDoesNotExists)?; + .ok_or(Error::::AccountDoesNotExists)?; log::info!( target: LOG_TARGET, "loaded account {:?}, free: {:?}, info: {:?}", diff --git a/utils/voter-bags/Cargo.toml b/utils/voter-bags/Cargo.toml new file mode 100644 index 000000000000..0c48442e6cf3 --- /dev/null +++ b/utils/voter-bags/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "polkadot-voter-bags" +version = "0.9.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +generate-bags = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } +structopt = "0.3.21" + +westend-runtime = { path = "../../runtime/westend" } +kusama-runtime = { path = "../../runtime/kusama" } +polkadot-runtime = { path = "../../runtime/polkadot" } diff --git a/utils/voter-bags/src/main.rs b/utils/voter-bags/src/main.rs new file mode 100644 index 000000000000..3cbb06629f80 --- /dev/null +++ b/utils/voter-bags/src/main.rs @@ -0,0 +1,82 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Make the set of voting bag thresholds to be used in `voter_bags.rs`. +//! +//! Generally speaking this script can be run once per runtime and never +//! touched again. It can be reused to regenerate a wholly different +//! quantity of bags, or if the existential deposit changes, etc. + +use generate_bags::generate_thresholds; +use kusama_runtime::Runtime as KusamaRuntime; +use polkadot_runtime::Runtime as PolkadotRuntime; +use std::path::{Path, PathBuf}; +use structopt::{clap::arg_enum, StructOpt}; +use westend_runtime::Runtime as WestendRuntime; + +arg_enum! { + #[derive(Debug)] + enum Runtime { + Westend, + Kusama, + Polkadot, + } +} + +impl Runtime { + fn generate_thresholds_fn( + &self, + ) -> Box Result<(), std::io::Error>> { + match self { + Runtime::Westend => Box::new(generate_thresholds::), + Runtime::Kusama => Box::new(generate_thresholds::), + Runtime::Polkadot => Box::new(generate_thresholds::), + } + } +} + +#[derive(Debug, StructOpt)] +struct Opt { + /// How many bags to generate. + #[structopt(long, default_value = "200")] + n_bags: usize, + + /// Which runtime to generate. + #[structopt( + long, + case_insensitive = true, + default_value = "Polkadot", + possible_values = &Runtime::variants(), + )] + runtime: Runtime, + + /// Where to write the output. + output: PathBuf, + + /// The total issuance of the native currency. + #[structopt(short, long)] + total_issuance: u128, + + /// The minimum account balance (i.e. existential deposit) for the native currency. + #[structopt(short, long)] + minimum_balance: u128, +} + +fn main() -> Result<(), std::io::Error> { + let Opt { n_bags, output, runtime, total_issuance, minimum_balance } = Opt::from_args(); + + runtime.generate_thresholds_fn()(n_bags, &output, total_issuance, minimum_balance) +} diff --git a/xcm/Cargo.toml b/xcm/Cargo.toml index 12b96a502165..6c4c319170d0 100644 --- a/xcm/Cargo.toml +++ b/xcm/Cargo.toml @@ -1,13 +1,14 @@ [package] name = "xcm" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] description = "The basic XCM datastructures." edition = "2018" [dependencies] impl-trait-for-tuples = "0.2.0" -parity-scale-codec = { version = "2.0.0", default-features = false, features = [ "derive" ] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = [ "derive" ] } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } derivative = {version = "2.2.0", default-features = false, features = [ "use_core" ] } log = { version = "0.4.14", default-features = false } xcm-procedural = { path = "procedural" } @@ -15,6 +16,8 @@ xcm-procedural = { path = "procedural" } [features] default = ["std"] wasm-api = [] +runtime-benchmarks = [] std = [ "parity-scale-codec/std", + "scale-info/std", ] diff --git a/xcm/pallet-xcm-benchmarks/Cargo.toml b/xcm/pallet-xcm-benchmarks/Cargo.toml new file mode 100644 index 000000000000..f310bd0510a4 --- /dev/null +++ b/xcm/pallet-xcm-benchmarks/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "pallet-xcm-benchmarks" +authors = ["Parity Technologies "] +edition = "2018" +version = "0.9.8" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } +frame-support = { version = "4.0.0-dev", default-features = false, branch = "master", git = "https://github.com/paritytech/substrate" } +frame-system = { version = "4.0.0-dev", default-features = false, branch = "master", git = "https://github.com/paritytech/substrate" } +sp-runtime = { version = "4.0.0-dev", default-features = false, branch = "master", git = "https://github.com/paritytech/substrate" } +sp-std = { version = "4.0.0-dev", default-features = false, branch = "master", git = "https://github.com/paritytech/substrate" } +xcm-executor = { path = "../xcm-executor", default-features = false, features = ["runtime-benchmarks"] } +frame-benchmarking = { version = "4.0.0-dev", default-features = false, branch = "master", git = "https://github.com/paritytech/substrate" } +xcm = { path = "..", default-features = false, features = ["runtime-benchmarks"] } +log = "0.4.0" + +[dev-dependencies] +pallet-balances = { version = "4.0.0-dev", branch = "master", git = "https://github.com/paritytech/substrate" } +pallet-assets = { version = "4.0.0-dev", branch = "master", git = "https://github.com/paritytech/substrate" } +sp-core = { version = "4.0.0-dev", branch = "master", git = "https://github.com/paritytech/substrate" } +sp-io = { version = "4.0.0-dev", branch = "master", git = "https://github.com/paritytech/substrate" } +sp-tracing = { version = "4.0.0-dev", branch = "master", git = "https://github.com/paritytech/substrate" } +xcm-builder = { path = "../xcm-builder" } +xcm = { path = ".." } +# temp +pallet-xcm = { path = "../pallet-xcm" } +polkadot-runtime-common = { path = "../../runtime/common" } +# westend-runtime = { path = "../../runtime/westend", features = ["runtime-benchmarks"] } +polkadot-primitives = { path = "../../primitives" } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-benchmarking/std", + "frame-support/std", + "frame-system/std", + "sp-runtime/std", + "sp-std/std" +] diff --git a/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs b/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs new file mode 100644 index 000000000000..b93184e0455d --- /dev/null +++ b/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs @@ -0,0 +1,219 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use super::*; +use crate::{account_and_location, new_executor, worst_case_holding, AssetTransactorOf, XcmCallOf}; +use frame_benchmarking::{ + benchmarks_instance_pallet, impl_benchmark_test_suite, BenchmarkError, BenchmarkResult, +}; +use frame_support::{pallet_prelude::Get, traits::fungible::Inspect}; +use sp_runtime::traits::Zero; +use sp_std::{convert::TryInto, prelude::*, vec}; +use xcm::latest::prelude::*; +use xcm_executor::traits::{Convert, TransactAsset}; + +benchmarks_instance_pallet! { + where_clause { where + < + < + T::TransactAsset + as + Inspect + >::Balance + as + TryInto + >::Error: sp_std::fmt::Debug, + } + + withdraw_asset { + let (sender_account, sender_location) = account_and_location::(1); + let worst_case_holding = worst_case_holding(); + let asset = T::get_multi_asset(); + + >::deposit_asset(&asset, &sender_location).unwrap(); + // check the assets of origin. + assert!(!T::TransactAsset::balance(&sender_account).is_zero()); + + let mut executor = new_executor::(sender_location); + executor.holding = worst_case_holding; + let instruction = Instruction::>::WithdrawAsset(vec![asset.clone()].into()); + let xcm = Xcm(vec![instruction]); + }: { + executor.execute(xcm)?; + } verify { + // check one of the assets of origin. + assert!(T::TransactAsset::balance(&sender_account).is_zero()); + assert!(executor.holding.ensure_contains(&vec![asset].into()).is_ok()); + } + + transfer_asset { + let (sender_account, sender_location) = account_and_location::(1); + let asset = T::get_multi_asset(); + let assets: MultiAssets = vec![ asset.clone() ].into(); + // this xcm doesn't use holding + + let dest_location = T::valid_destination()?; + let dest_account = T::AccountIdConverter::convert(dest_location.clone()).unwrap(); + + >::deposit_asset(&asset, &sender_location).unwrap(); + assert!(T::TransactAsset::balance(&dest_account).is_zero()); + + let mut executor = new_executor::(sender_location); + let instruction = Instruction::TransferAsset { assets, beneficiary: dest_location }; + let xcm = Xcm(vec![instruction]); + }: { + executor.execute(xcm)?; + } verify { + assert!(T::TransactAsset::balance(&sender_account).is_zero()); + assert!(!T::TransactAsset::balance(&dest_account).is_zero()); + } + + transfer_reserve_asset { + let (sender_account, sender_location) = account_and_location::(1); + let dest_location = T::valid_destination()?; + let dest_account = T::AccountIdConverter::convert(dest_location.clone()).unwrap(); + + let asset = T::get_multi_asset(); + >::deposit_asset(&asset, &sender_location).unwrap(); + let assets: MultiAssets = vec![ asset ].into(); + assert!(T::TransactAsset::balance(&dest_account).is_zero()); + + let mut executor = new_executor::(sender_location); + let instruction = Instruction::TransferReserveAsset { + assets, + dest: dest_location, + xcm: Xcm::new() + }; + let xcm = Xcm(vec![instruction]); + }: { + executor.execute(xcm)?; + } verify { + assert!(T::TransactAsset::balance(&sender_account).is_zero()); + assert!(!T::TransactAsset::balance(&dest_account).is_zero()); + // TODO: Check sender queue is not empty. + } + + receive_teleported_asset { + // If there is no trusted teleporter, then we skip this benchmark. + let (trusted_teleporter, teleportable_asset) = T::TrustedTeleporter::get().ok_or( + BenchmarkError::Override( + BenchmarkResult::from_weight(T::BlockWeights::get().max_block) + ) + )?; + + let assets: MultiAssets = vec![ teleportable_asset ].into(); + + let mut executor = new_executor::(trusted_teleporter); + let instruction = Instruction::ReceiveTeleportedAsset(assets.clone()); + let xcm = Xcm(vec![instruction]); + }: { + executor.execute(xcm).map_err(|_| { + BenchmarkError::Override( + BenchmarkResult::from_weight(T::BlockWeights::get().max_block) + ) + })?; + } verify { + assert!(executor.holding.ensure_contains(&assets).is_ok()); + } + + deposit_asset { + let asset = T::get_multi_asset(); + let mut holding = worst_case_holding(); + + // Add our asset to the holding. + holding.subsume(asset.clone()); + + // our dest must have no balance initially. + let dest_location = T::valid_destination()?; + let dest_account = T::AccountIdConverter::convert(dest_location.clone()).unwrap(); + assert!(T::TransactAsset::balance(&dest_account).is_zero()); + + let mut executor = new_executor::(Default::default()); + executor.holding = holding; + let instruction = Instruction::>::DepositAsset { + assets: asset.into(), + max_assets: 1, + beneficiary: dest_location, + }; + let xcm = Xcm(vec![instruction]); + }: { + executor.execute(xcm)?; + } verify { + // dest should have received some asset. + assert!(!T::TransactAsset::balance(&dest_account).is_zero()) + } + + deposit_reserve_asset { + let asset = T::get_multi_asset(); + let mut holding = worst_case_holding(); + + // Add our asset to the holding. + holding.subsume(asset.clone()); + + // our dest must have no balance initially. + let dest_location = T::valid_destination()?; + let dest_account = T::AccountIdConverter::convert(dest_location.clone()).unwrap(); + assert!(T::TransactAsset::balance(&dest_account).is_zero()); + + let mut executor = new_executor::(Default::default()); + executor.holding = holding; + let instruction = Instruction::>::DepositReserveAsset { + assets: asset.into(), + max_assets: 1, + dest: dest_location, + xcm: Xcm::new(), + }; + let xcm = Xcm(vec![instruction]); + }: { + executor.execute(xcm)?; + } verify { + // dest should have received some asset. + assert!(!T::TransactAsset::balance(&dest_account).is_zero()) + } + + initiate_teleport { + let asset = T::get_multi_asset(); + let mut holding = worst_case_holding(); + + // Add our asset to the holding. + holding.subsume(asset.clone()); + + // Checked account starts at zero + assert!(T::CheckedAccount::get().map_or(true, |c| T::TransactAsset::balance(&c).is_zero())); + + let mut executor = new_executor::(Default::default()); + executor.holding = holding; + let instruction = Instruction::>::InitiateTeleport { + assets: asset.into(), + dest: T::valid_destination()?, + xcm: Xcm::new(), + }; + let xcm = Xcm(vec![instruction]); + }: { + executor.execute(xcm)?; + } verify { + if let Some(checked_account) = T::CheckedAccount::get() { + // teleport checked account should have received some asset. + assert!(!T::TransactAsset::balance(&checked_account).is_zero()); + } + } +} + +impl_benchmark_test_suite!( + Pallet, + crate::fungible::mock::new_test_ext(), + crate::fungible::mock::Test +); diff --git a/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs b/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs new file mode 100644 index 000000000000..8666dc6caa4d --- /dev/null +++ b/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs @@ -0,0 +1,180 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! A mock runtime for XCM benchmarking. + +use crate::{fungible as xcm_balances_benchmark, mock::*}; +use frame_support::{parameter_types, traits::Everything}; +use sp_core::H256; +use sp_runtime::{ + testing::Header, + traits::{BlakeTwo256, IdentityLookup}, + BuildStorage, +}; +use xcm::latest::prelude::*; +use xcm_builder::AllowUnpaidExecutionFrom; + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; + +// For testing the pallet, we construct a mock runtime. +frame_support::construct_runtime!( + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + XcmBalancesBenchmark: xcm_balances_benchmark::{Pallet}, + } +); + +parameter_types! { + pub const BlockHashCount: u64 = 250; + pub BlockWeights: frame_system::limits::BlockWeights = + frame_system::limits::BlockWeights::simple_max(1024); +} +impl frame_system::Config for Test { + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Call = Call; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = Event; + type BlockHashCount = BlockHashCount; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); +} + +parameter_types! { + pub const ExistentialDeposit: u64 = 7; +} + +impl pallet_balances::Config for Test { + type MaxLocks = (); + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + type Balance = u64; + type DustRemoval = (); + type Event = Event; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); +} + +parameter_types! { + pub const AssetDeposit: u64 = 100 * ExistentialDeposit::get(); + pub const ApprovalDeposit: u64 = 1 * ExistentialDeposit::get(); + pub const StringLimit: u32 = 50; + pub const MetadataDepositBase: u64 = 10 * ExistentialDeposit::get(); + pub const MetadataDepositPerByte: u64 = 1 * ExistentialDeposit::get(); +} + +pub struct MatchAnyFungible; +impl xcm_executor::traits::MatchesFungible for MatchAnyFungible { + fn matches_fungible(m: &MultiAsset) -> Option { + use sp_runtime::traits::SaturatedConversion; + match m { + MultiAsset { fun: Fungible(amount), .. } => Some((*amount).saturated_into::()), + _ => None, + } + } +} + +// Use balances as the asset transactor. +pub type AssetTransactor = xcm_builder::CurrencyAdapter< + Balances, + MatchAnyFungible, + AccountIdConverter, + u64, + CheckedAccount, +>; + +parameter_types! { + /// Maximum number of instructions in a single XCM fragment. A sanity check against weight + /// calculations getting too crazy. + pub const MaxInstructions: u32 = 100; +} + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type Call = Call; + type XcmSender = DevNull; + type AssetTransactor = AssetTransactor; + type OriginConverter = (); + type IsReserve = (); + type IsTeleporter = (); + type LocationInverter = xcm_builder::LocationInverter; + type Barrier = AllowUnpaidExecutionFrom; + type Weigher = xcm_builder::FixedWeightBounds; + type Trader = xcm_builder::FixedRateOfFungible; + type ResponseHandler = DevNull; + type AssetTrap = (); + type AssetClaims = (); + type SubscriptionService = (); +} + +impl crate::Config for Test { + type XcmConfig = XcmConfig; + type AccountIdConverter = AccountIdConverter; + fn valid_destination() -> Result { + let valid_destination: MultiLocation = + X1(AccountId32 { network: NetworkId::Any, id: [0u8; 32] }).into(); + + Ok(valid_destination) + } +} + +parameter_types! { + pub const CheckedAccount: Option = Some(100); + pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + X1(OnlyChild).into(), + MultiAsset { id: Concrete(Here.into()), fun: Fungible(100) }, + )); +} + +impl xcm_balances_benchmark::Config for Test { + type TransactAsset = Balances; + type CheckedAccount = CheckedAccount; + type TrustedTeleporter = TrustedTeleporter; + + fn get_multi_asset() -> MultiAsset { + let amount = + >::minimum_balance() as u128; + MultiAsset { id: Concrete(Here.into()), fun: Fungible(amount) } + } +} + +pub fn new_test_ext() -> sp_io::TestExternalities { + let t = GenesisConfig { ..Default::default() }.build_storage().unwrap(); + sp_tracing::try_init_simple(); + t.into() +} diff --git a/xcm/pallet-xcm-benchmarks/src/fungible/mod.rs b/xcm/pallet-xcm-benchmarks/src/fungible/mod.rs new file mode 100644 index 000000000000..e5062c310494 --- /dev/null +++ b/xcm/pallet-xcm-benchmarks/src/fungible/mod.rs @@ -0,0 +1,47 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +// Benchmarking for the `AssetTransactor` trait via `Fungible`. + +pub use pallet::*; + +pub mod benchmarking; +#[cfg(test)] +mod mock; + +#[frame_support::pallet] +pub mod pallet { + use frame_support::pallet_prelude::Get; + #[pallet::config] + pub trait Config: frame_system::Config + crate::Config { + /// The type of `fungible` that is being used under the hood. + /// + /// This is useful for testing and checking. + type TransactAsset: frame_support::traits::fungible::Mutate; + + /// The account used to check assets being teleported. + type CheckedAccount: Get>; + + /// A trusted location which we allow teleports from, and the asset we allow to teleport. + type TrustedTeleporter: Get>; + + /// Give me a fungible asset that your asset transactor is going to accept. + fn get_multi_asset() -> xcm::latest::MultiAsset; + } + + #[pallet::pallet] + pub struct Pallet(_); +} diff --git a/xcm/pallet-xcm-benchmarks/src/lib.rs b/xcm/pallet-xcm-benchmarks/src/lib.rs new file mode 100644 index 000000000000..cfbb3a478f67 --- /dev/null +++ b/xcm/pallet-xcm-benchmarks/src/lib.rs @@ -0,0 +1,108 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Pallet that serves no other purpose than benchmarking raw messages [`Xcm`]. + +#![cfg_attr(not(feature = "std"), no_std)] + +use codec::Encode; +use frame_benchmarking::account; +use sp_std::prelude::*; +use xcm::latest::prelude::*; +use xcm_executor::{traits::Convert, Assets}; + +pub mod fungible; + +#[cfg(test)] +mod mock; + +/// A base trait for all individual pallets +pub trait Config: frame_system::Config { + /// The XCM configurations. + /// + /// These might affect the execution of XCM messages, such as defining how the + /// `TransactAsset` is implemented. + type XcmConfig: xcm_executor::Config; + + /// A converter between a multi-location to a sovereign account. + type AccountIdConverter: Convert; + + /// Does any necessary setup to create a valid destination for XCM messages. + /// Returns that destination's multi-location to be used in benchmarks. + fn valid_destination() -> Result; +} + +const SEED: u32 = 0; + +/// The XCM executor to use for doing stuff. +pub type ExecutorOf = xcm_executor::XcmExecutor<::XcmConfig>; +/// The overarching call type. +pub type OverArchingCallOf = ::Call; +/// The asset transactor of our executor +pub type AssetTransactorOf = <::XcmConfig as xcm_executor::Config>::AssetTransactor; +/// The call type of executor's config. Should eventually resolve to the same overarching call type. +pub type XcmCallOf = <::XcmConfig as xcm_executor::Config>::Call; + +/// The worst case number of assets in the holding. +const HOLDING_FUNGIBLES: u32 = 99; +const HOLDING_NON_FUNGIBLES: u32 = 99; + +pub fn worst_case_holding() -> Assets { + let fungibles_amount: u128 = 100; // TODO probably update + (0..HOLDING_FUNGIBLES) + .map(|i| { + MultiAsset { + id: Concrete(GeneralIndex(i as u128).into()), + fun: Fungible(fungibles_amount * i as u128), + } + .into() + }) + .chain(core::iter::once(MultiAsset { id: Concrete(Here.into()), fun: Fungible(u128::MAX) })) + .chain((0..HOLDING_NON_FUNGIBLES).map(|i| MultiAsset { + id: Concrete(GeneralIndex(i as u128).into()), + fun: NonFungible(asset_instance_from(i)), + })) + .collect::>() + .into() +} + +pub fn asset_instance_from(x: u32) -> AssetInstance { + let bytes = x.encode(); + let mut instance = [0u8; 4]; + instance.copy_from_slice(&bytes); + AssetInstance::Array4(instance) +} + +pub fn new_executor(origin: MultiLocation) -> ExecutorOf { + ExecutorOf::::new(origin) +} + +/// Build a multi-location from an account id. +fn account_id_junction(index: u32) -> Junction { + let account: T::AccountId = account("account", index, SEED); + let mut encoded = account.encode(); + encoded.resize(32, 0u8); + let mut id = [0u8; 32]; + id.copy_from_slice(&encoded); + Junction::AccountId32 { network: NetworkId::Any, id } +} + +pub fn account_and_location(index: u32) -> (T::AccountId, MultiLocation) { + let location: MultiLocation = account_id_junction::(index).into(); + let account = T::AccountIdConverter::convert(location.clone()).unwrap(); + + (account, location) +} diff --git a/xcm/pallet-xcm-benchmarks/src/mock.rs b/xcm/pallet-xcm-benchmarks/src/mock.rs new file mode 100644 index 000000000000..d59cf3387268 --- /dev/null +++ b/xcm/pallet-xcm-benchmarks/src/mock.rs @@ -0,0 +1,64 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::*; +use frame_support::{parameter_types, weights::Weight}; +use xcm_executor::traits::FilterAssetLocation; + +// An xcm sender/receiver akin to > /dev/null +pub struct DevNull; +impl xcm::opaque::latest::SendXcm for DevNull { + fn send_xcm(_: impl Into, _: Xcm<()>) -> SendResult { + Ok(()) + } +} + +impl xcm_executor::traits::OnResponse for DevNull { + fn expecting_response(_: &MultiLocation, _: u64) -> bool { + false + } + fn on_response(_: &MultiLocation, _: u64, _: Response, _: Weight) -> Weight { + 0 + } +} + +pub struct AccountIdConverter; +impl xcm_executor::traits::Convert for AccountIdConverter { + fn convert(ml: MultiLocation) -> Result { + match ml { + MultiLocation { parents: 0, interior: X1(Junction::AccountId32 { id, .. }) } => + Ok(::decode(&mut &*id.to_vec()).unwrap()), + _ => Err(ml), + } + } + + fn reverse(acc: u64) -> Result { + Err(acc) + } +} + +parameter_types! { + pub Ancestry: MultiLocation = Junction::Parachain(101).into(); + pub UnitWeightCost: Weight = 10; + pub WeightPrice: (AssetId, u128) = (Concrete(Here.into()), 1_000_000); +} + +pub struct AllAssetLocationsPass; +impl FilterAssetLocation for AllAssetLocationsPass { + fn filter_asset_location(_: &MultiAsset, _: &MultiLocation) -> bool { + true + } +} diff --git a/xcm/pallet-xcm-benchmarks/template.hbs b/xcm/pallet-xcm-benchmarks/template.hbs new file mode 100644 index 000000000000..357fa7456aa0 --- /dev/null +++ b/xcm/pallet-xcm-benchmarks/template.hbs @@ -0,0 +1,66 @@ +// Copyright 2017-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Autogenerated weights for `{{pallet}}` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION {{version}} +//! DATE: {{date}}, STEPS: `{{cmd.steps}}`, REPEAT: {{cmd.repeat}}, LOW RANGE: `{{cmd.lowest_range_values}}`, HIGH RANGE: `{{cmd.highest_range_values}}` +//! EXECUTION: {{cmd.execution}}, WASM-EXECUTION: {{cmd.wasm_execution}}, CHAIN: {{cmd.chain}}, DB CACHE: {{cmd.db_cache}} + +// Executed Command: +{{#each args as |arg|~}} +// {{arg}} +{{/each}} + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for `{{pallet}}`. +pub struct WeightInfo(PhantomData); +impl WeightInfo { + {{~#each benchmarks as |benchmark|}} + {{~#each benchmark.comments as |comment|}} + // {{comment}} + {{~/each}} + pub(crate) fn {{benchmark.name~}} + ( + {{~#each benchmark.components as |c| ~}} + {{~#if (not c.is_used)}}_{{/if}}{{c.name}}: u32, {{/each~}} + ) -> Weight { + ({{underscore benchmark.base_weight}} as Weight) + {{~#each benchmark.component_weight as |cw|}} + // Standard Error: {{underscore cw.error}} + .saturating_add(({{underscore cw.slope}} as Weight).saturating_mul({{cw.name}} as Weight)) + {{~/each}} + {{~#if (ne benchmark.base_reads "0")}} + .saturating_add(T::DbWeight::get().reads({{benchmark.base_reads}} as Weight)) + {{~/if}} + {{~#each benchmark.component_reads as |cr|}} + .saturating_add(T::DbWeight::get().reads(({{cr.slope}} as Weight).saturating_mul({{cr.name}} as Weight))) + {{~/each}} + {{~#if (ne benchmark.base_writes "0")}} + .saturating_add(T::DbWeight::get().writes({{benchmark.base_writes}} as Weight)) + {{~/if}} + {{~#each benchmark.component_writes as |cw|}} + .saturating_add(T::DbWeight::get().writes(({{cw.slope}} as Weight).saturating_mul({{cw.name}} as Weight))) + {{~/each}} + } + {{~/each}} +} diff --git a/xcm/pallet-xcm/Cargo.toml b/xcm/pallet-xcm/Cargo.toml index e8c586ae4908..a9ff97ddc088 100644 --- a/xcm/pallet-xcm/Cargo.toml +++ b/xcm/pallet-xcm/Cargo.toml @@ -2,10 +2,11 @@ authors = ["Parity Technologies "] edition = "2018" name = "pallet-xcm" -version = "0.9.9" +version = "0.9.11" [dependencies] codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ["derive"] } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } serde = { version = "1.0.130", optional = true, features = ["derive"] } log = { version = "0.4.14", default-features = false } @@ -29,6 +30,7 @@ polkadot-parachain = { path = "../../parachain" } default = ["std"] std = [ "codec/std", + "scale-info/std", "serde", "sp-std/std", "sp-core/std", diff --git a/xcm/pallet-xcm/src/lib.rs b/xcm/pallet-xcm/src/lib.rs index 314a929803cd..0252e22cf450 100644 --- a/xcm/pallet-xcm/src/lib.rs +++ b/xcm/pallet-xcm/src/lib.rs @@ -25,6 +25,7 @@ mod tests; use codec::{Decode, Encode, EncodeLike}; use frame_support::traits::{Contains, EnsureOrigin, Get, OriginTrait}; +use scale_info::TypeInfo; use sp_runtime::{ traits::{BadOrigin, Saturating}, RuntimeDebug, @@ -78,7 +79,7 @@ pub mod pallet { /// The overarching event type. type Event: From> + IsType<::Event>; - /// Required origin for sending XCM messages. If successful, the it resolves to `MultiLocation` + /// Required origin for sending XCM messages. If successful, it resolves to `MultiLocation` /// which exists as an interior location within this chain's XCM context. type SendXcmOrigin: EnsureOrigin<::Origin, Success = MultiLocation>; @@ -217,7 +218,7 @@ pub mod pallet { } #[pallet::origin] - #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] + #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] pub enum Origin { /// It comes from somewhere in the XCM space wanting to transact. Xcm(MultiLocation), @@ -264,7 +265,7 @@ pub mod pallet { } /// The status of a query. - #[derive(Clone, Eq, PartialEq, Encode, Decode, RuntimeDebug)] + #[derive(Clone, Eq, PartialEq, Encode, Decode, RuntimeDebug, TypeInfo)] pub enum QueryStatus { /// The query was sent but no response has yet been received. Pending { @@ -290,7 +291,7 @@ pub mod pallet { } } - #[derive(Clone, Encode, Decode, Eq, PartialEq, Ord, PartialOrd)] + #[derive(Clone, Encode, Decode, Eq, PartialEq, Ord, PartialOrd, TypeInfo)] pub enum VersionMigrationStage { MigrateSupportedVersion, MigrateVersionNotifiers, @@ -327,7 +328,7 @@ pub mod pallet { #[pallet::storage] pub(super) type SafeXcmVersion = StorageValue<_, XcmVersion, OptionQuery>; - /// Latest versions that we know various locations support. + /// The Latest versions that we know various locations support. #[pallet::storage] pub(super) type SupportedVersion = StorageDoubleMap< _, @@ -425,7 +426,7 @@ pub mod pallet { weight_used += T::DbWeight::get().read + T::DbWeight::get().write; q.sort_by_key(|i| i.1); while let Some((versioned_dest, _)) = q.pop() { - if let Ok(dest) = versioned_dest.try_into() { + if let Ok(dest) = MultiLocation::try_from(versioned_dest) { if Self::request_version_notify(dest).is_ok() { // TODO: correct weights. weight_used += T::DbWeight::get().read + T::DbWeight::get().write; @@ -457,7 +458,7 @@ pub mod pallet { message: Box>, ) -> DispatchResult { let origin_location = T::SendXcmOrigin::ensure_origin(origin)?; - let interior = + let interior: Junctions = origin_location.clone().try_into().map_err(|_| Error::::InvalidOrigin)?; let dest = MultiLocation::try_from(*dest).map_err(|()| Error::::BadVersion)?; let message: Xcm<()> = (*message).try_into().map_err(|()| Error::::BadVersion)?; @@ -687,7 +688,8 @@ pub mod pallet { location: Box, ) -> DispatchResult { ensure_root(origin)?; - let location = (*location).try_into().map_err(|()| Error::::BadLocation)?; + let location: MultiLocation = + (*location).try_into().map_err(|()| Error::::BadLocation)?; Self::request_version_notify(location).map_err(|e| { match e { XcmError::InvalidLocation => Error::::AlreadySubscribed, @@ -709,7 +711,8 @@ pub mod pallet { location: Box, ) -> DispatchResult { ensure_root(origin)?; - let location = (*location).try_into().map_err(|()| Error::::BadLocation)?; + let location: MultiLocation = + (*location).try_into().map_err(|()| Error::::BadLocation)?; Self::unrequest_version_notify(location).map_err(|e| { match e { XcmError::InvalidLocation => Error::::NoSubscription, @@ -866,7 +869,8 @@ pub mod pallet { } /// Request that `dest` informs us of its version. - pub fn request_version_notify(dest: MultiLocation) -> XcmResult { + pub fn request_version_notify(dest: impl Into) -> XcmResult { + let dest = dest.into(); let versioned_dest = VersionedMultiLocation::from(dest.clone()); let already = VersionNotifiers::::contains_key(XCM_VERSION, &versioned_dest); ensure!(!already, XcmError::InvalidLocation); @@ -886,7 +890,8 @@ pub mod pallet { } /// Request that `dest` ceases informing us of its version. - pub fn unrequest_version_notify(dest: MultiLocation) -> XcmResult { + pub fn unrequest_version_notify(dest: impl Into) -> XcmResult { + let dest = dest.into(); let versioned_dest = LatestVersionedMultiLocation(&dest); let query_id = VersionNotifiers::::take(XCM_VERSION, versioned_dest) .ok_or(XcmError::InvalidLocation)?; @@ -898,10 +903,12 @@ pub mod pallet { /// Relay an XCM `message` from a given `interior` location in this context to a given `dest` /// location. A null `dest` is not handled. pub fn send_xcm( - interior: Junctions, - dest: MultiLocation, + interior: impl Into, + dest: impl Into, mut message: Xcm<()>, ) -> Result<(), SendError> { + let interior = interior.into(); + let dest = dest.into(); if interior != Junctions::Here { message.0.insert(0, DescendOrigin(interior)) }; @@ -915,7 +922,7 @@ pub mod pallet { } fn do_new_query( - responder: MultiLocation, + responder: impl Into, maybe_notify: Option<(u8, u8)>, timeout: T::BlockNumber, ) -> u64 { @@ -924,7 +931,11 @@ pub mod pallet { q.saturating_inc(); Queries::::insert( r, - QueryStatus::Pending { responder: responder.into(), maybe_notify, timeout }, + QueryStatus::Pending { + responder: responder.into().into(), + maybe_notify, + timeout, + }, ); r }) @@ -944,9 +955,10 @@ pub mod pallet { /// value. pub fn report_outcome( message: &mut Xcm<()>, - responder: MultiLocation, + responder: impl Into, timeout: T::BlockNumber, ) -> Result { + let responder = responder.into(); let dest = T::LocationInverter::invert_location(&responder) .map_err(|()| XcmError::MultiLocationNotInvertible)?; let query_id = Self::new_query(responder, timeout); @@ -977,10 +989,11 @@ pub mod pallet { /// may be put in the overweight queue and need to be manually executed. pub fn report_outcome_notify( message: &mut Xcm<()>, - responder: MultiLocation, + responder: impl Into, notify: impl Into<::Call>, timeout: T::BlockNumber, ) -> Result<(), XcmError> { + let responder = responder.into(); let dest = T::LocationInverter::invert_location(&responder) .map_err(|()| XcmError::MultiLocationNotInvertible)?; let notify: ::Call = notify.into(); @@ -992,14 +1005,14 @@ pub mod pallet { } /// Attempt to create a new query ID and register it as a query that is yet to respond. - pub fn new_query(responder: MultiLocation, timeout: T::BlockNumber) -> u64 { + pub fn new_query(responder: impl Into, timeout: T::BlockNumber) -> u64 { Self::do_new_query(responder, None, timeout) } /// Attempt to create a new query ID and register it as a query that is yet to respond, and /// which will call a dispatchable when a response happens. pub fn new_notify_query( - responder: MultiLocation, + responder: impl Into, notify: impl Into<::Call>, timeout: T::BlockNumber, ) -> u64 { @@ -1085,6 +1098,7 @@ pub mod pallet { Ok(()) } } + impl DropAssets for Pallet { fn drop_assets(origin: &MultiLocation, assets: Assets) -> Weight { if assets.is_empty() { @@ -1367,7 +1381,11 @@ where /// this crate's `Origin::Xcm` value. pub struct XcmPassthrough(PhantomData); impl> ConvertOrigin for XcmPassthrough { - fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { + let origin = origin.into(); match kind { OriginKind::Xcm => Ok(crate::Origin::Xcm(origin).into()), _ => Err(origin), diff --git a/xcm/pallet-xcm/src/mock.rs b/xcm/pallet-xcm/src/mock.rs index c841d896acab..7c5a835b7851 100644 --- a/xcm/pallet-xcm/src/mock.rs +++ b/xcm/pallet-xcm/src/mock.rs @@ -93,7 +93,8 @@ pub mod pallet_test_notifier { let id = who .using_encoded(|mut d| <[u8; 32]>::decode(&mut d)) .map_err(|_| Error::::BadAccountFormat)?; - let call = Call::::notification_received(0, Default::default()); + let call = + Call::::notification_received { query_id: 0, response: Default::default() }; let qid = crate::Pallet::::new_notify_query( Junction::AccountId32 { network: Any, id }.into(), ::Call::from(call), @@ -146,15 +147,16 @@ pub(crate) fn take_sent_xcm() -> Vec<(MultiLocation, Xcm<()>)> { /// Sender that never returns error, always sends pub struct TestSendXcm; impl SendXcm for TestSendXcm { - fn send_xcm(dest: MultiLocation, msg: Xcm<()>) -> SendResult { - SENT_XCM.with(|q| q.borrow_mut().push((dest, msg))); + fn send_xcm(dest: impl Into, msg: Xcm<()>) -> SendResult { + SENT_XCM.with(|q| q.borrow_mut().push((dest.into(), msg))); Ok(()) } } /// Sender that returns error if `X8` junction and stops routing pub struct TestSendXcmErrX8; impl SendXcm for TestSendXcmErrX8 { - fn send_xcm(dest: MultiLocation, msg: Xcm<()>) -> SendResult { + fn send_xcm(dest: impl Into, msg: Xcm<()>) -> SendResult { + let dest = dest.into(); if dest.len() == 8 { Err(SendError::Transport("Destination location full")) } else { diff --git a/xcm/pallet-xcm/src/tests.rs b/xcm/pallet-xcm/src/tests.rs index 56f3579cc1e7..5b9a3a177a36 100644 --- a/xcm/pallet-xcm/src/tests.rs +++ b/xcm/pallet-xcm/src/tests.rs @@ -44,7 +44,10 @@ fn report_outcome_notify_works() { assets: (Here, SEND_AMOUNT).into(), beneficiary: sender.clone(), }]); - let call = pallet_test_notifier::Call::notification_received(0, Default::default()); + let call = pallet_test_notifier::Call::notification_received { + query_id: 0, + response: Default::default(), + }; let notify = Call::TestNotifier(call); new_test_ext_with_balances(balances).execute_with(|| { XcmPallet::report_outcome_notify(&mut message, Parachain(PARA_ID).into(), notify, 100) @@ -71,7 +74,7 @@ fn report_outcome_notify_works() { Parachain(PARA_ID).into(), Xcm(vec![QueryResponse { query_id: 0, - response: Response::ExecutionResult(Ok(())), + response: Response::ExecutionResult(None), max_weight: 1_000_000, }]), 1_000_000_000, @@ -83,7 +86,7 @@ fn report_outcome_notify_works() { Event::TestNotifier(pallet_test_notifier::Event::ResponseReceived( Parachain(PARA_ID).into(), 0, - Response::ExecutionResult(Ok(())), + Response::ExecutionResult(None), )), Event::XcmPallet(crate::Event::Notified(0, 4, 2)), ] @@ -125,7 +128,7 @@ fn report_outcome_works() { Parachain(PARA_ID).into(), Xcm(vec![QueryResponse { query_id: 0, - response: Response::ExecutionResult(Ok(())), + response: Response::ExecutionResult(None), max_weight: 0, }]), 1_000_000_000, @@ -133,10 +136,10 @@ fn report_outcome_works() { assert_eq!(r, Outcome::Complete(1_000)); assert_eq!( last_event(), - Event::XcmPallet(crate::Event::ResponseReady(0, Response::ExecutionResult(Ok(())),)) + Event::XcmPallet(crate::Event::ResponseReady(0, Response::ExecutionResult(None),)) ); - let response = Some((Response::ExecutionResult(Ok(())), 1)); + let response = Some((Response::ExecutionResult(None), 1)); assert_eq!(XcmPallet::take_response(0), response); }); } diff --git a/xcm/procedural/Cargo.toml b/xcm/procedural/Cargo.toml index 5c52b5b14f8c..4eb78cdf23da 100644 --- a/xcm/procedural/Cargo.toml +++ b/xcm/procedural/Cargo.toml @@ -9,5 +9,5 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.28" -quote = "1.0.9" -syn = "1.0.75" +quote = "1.0.10" +syn = "1.0.78" diff --git a/xcm/src/double_encoded.rs b/xcm/src/double_encoded.rs index ae21336d13c3..858d97964203 100644 --- a/xcm/src/double_encoded.rs +++ b/xcm/src/double_encoded.rs @@ -20,9 +20,10 @@ use parity_scale_codec::{Decode, DecodeLimit, Encode}; /// Wrapper around the encoded and decoded versions of a value. /// Caches the decoded value once computed. -#[derive(Encode, Decode)] +#[derive(Encode, Decode, scale_info::TypeInfo)] #[codec(encode_bound())] #[codec(decode_bound())] +#[scale_info(bounds(), skip_type_params(T))] pub struct DoubleEncoded { encoded: Vec, #[codec(skip)] diff --git a/xcm/src/lib.rs b/xcm/src/lib.rs index cfa5735559aa..87aad30c79f4 100644 --- a/xcm/src/lib.rs +++ b/xcm/src/lib.rs @@ -30,6 +30,7 @@ use core::{ }; use derivative::Derivative; use parity_scale_codec::{Decode, Encode, Error as CodecError, Input}; +use scale_info::TypeInfo; pub mod v0; pub mod v1; @@ -69,7 +70,7 @@ pub trait IntoVersion: Sized { } /// A single `MultiLocation` value, together with its version code. -#[derive(Derivative, Encode, Decode)] +#[derive(Derivative, Encode, Decode, TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] #[codec(encode_bound())] #[codec(decode_bound())] @@ -123,7 +124,7 @@ impl TryFrom for v1::MultiLocation { } /// A single `Response` value, together with its version code. -#[derive(Derivative, Encode, Decode)] +#[derive(Derivative, Encode, Decode, TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] #[codec(encode_bound())] #[codec(decode_bound())] @@ -199,7 +200,7 @@ impl TryFrom for v2::Response { } /// A single `MultiAsset` value, together with its version code. -#[derive(Derivative, Encode, Decode)] +#[derive(Derivative, Encode, Decode, TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] #[codec(encode_bound())] #[codec(decode_bound())] @@ -253,7 +254,7 @@ impl TryFrom for v1::MultiAsset { } /// A single `MultiAssets` value, together with its version code. -#[derive(Derivative, Encode, Decode)] +#[derive(Derivative, Encode, Decode, TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] #[codec(encode_bound())] #[codec(decode_bound())] @@ -307,10 +308,11 @@ impl TryFrom for v1::MultiAssets { } /// A single XCM message, together with its version code. -#[derive(Derivative, Encode, Decode)] +#[derive(Derivative, Encode, Decode, TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] #[codec(encode_bound())] #[codec(decode_bound())] +#[scale_info(bounds(), skip_type_params(Call))] pub enum VersionedXcm { V0(v0::Xcm), V1(v1::Xcm), @@ -422,7 +424,7 @@ impl WrapVersion for AlwaysV1 { } } -/// `WrapVersion` implementation which attempts to always convert the XCM to version 1 before wrapping it. +/// `WrapVersion` implementation which attempts to always convert the XCM to version 2 before wrapping it. pub struct AlwaysV2; impl WrapVersion for AlwaysV2 { fn wrap_version( @@ -474,3 +476,8 @@ pub mod opaque { /// The basic `VersionedXcm` type which just uses the `Vec` as an encoded call. pub type VersionedXcm = super::VersionedXcm<()>; } + +// A simple trait to get the weight of some object. +pub trait GetWeight { + fn weight(&self) -> latest::Weight; +} diff --git a/xcm/src/v0/junction.rs b/xcm/src/v0/junction.rs index 171327a5f28a..0c559ca5a136 100644 --- a/xcm/src/v0/junction.rs +++ b/xcm/src/v0/junction.rs @@ -18,9 +18,10 @@ use alloc::vec::Vec; use parity_scale_codec::{Decode, Encode}; +use scale_info::TypeInfo; /// A global identifier of an account-bearing consensus system. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, TypeInfo)] pub enum NetworkId { /// Unidentified/any. Any, @@ -33,7 +34,7 @@ pub enum NetworkId { } /// An identifier of a pluralistic body. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, TypeInfo)] pub enum BodyId { /// The only body in its context. Unit, @@ -54,7 +55,7 @@ pub enum BodyId { } /// A part of a pluralistic body. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, TypeInfo)] pub enum BodyPart { /// The body's declaration, under whatever means it decides. Voice, @@ -101,7 +102,7 @@ impl BodyPart { /// A single item in a path to describe the relative location of a consensus system. /// /// Each item assumes a pre-existing location as its context and is defined in terms of it. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, TypeInfo)] pub enum Junction { /// The consensus system of which the context is a member and state-wise super-set. /// diff --git a/xcm/src/v0/mod.rs b/xcm/src/v0/mod.rs index 9ec5150242be..35889d8daab2 100644 --- a/xcm/src/v0/mod.rs +++ b/xcm/src/v0/mod.rs @@ -24,6 +24,7 @@ use core::{ }; use derivative::Derivative; use parity_scale_codec::{self, Decode, Encode}; +use scale_info::TypeInfo; mod junction; mod multi_asset; @@ -58,7 +59,7 @@ pub mod prelude { // the number of items in the vector. /// Basically just the XCM (more general) version of `ParachainDispatchOrigin`. -#[derive(Copy, Clone, Eq, PartialEq, Encode, Decode, Debug)] +#[derive(Copy, Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo)] pub enum OriginKind { /// Origin should just be the native dispatch origin representation for the sender in the /// local runtime framework. For Cumulus/Frame chains this is the `Parachain` or `Relay` origin @@ -81,7 +82,7 @@ pub enum OriginKind { } /// Response data to a query. -#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo)] pub enum Response { /// Some assets. Assets(Vec), @@ -95,10 +96,11 @@ pub enum Response { /// /// This is the inner XCM format and is version-sensitive. Messages are typically passed using the outer /// XCM format, known as `VersionedXcm`. -#[derive(Derivative, Encode, Decode)] +#[derive(Derivative, Encode, Decode, TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] #[codec(encode_bound())] #[codec(decode_bound())] +#[scale_info(bounds(), skip_type_params(Call))] pub enum Xcm { /// Withdraw asset(s) (`assets`) from the ownership of `origin` and place them into `holding`. Execute the /// orders (`effects`). diff --git a/xcm/src/v0/multi_asset.rs b/xcm/src/v0/multi_asset.rs index ee541c3c681f..dac5a6bfeb7e 100644 --- a/xcm/src/v0/multi_asset.rs +++ b/xcm/src/v0/multi_asset.rs @@ -24,6 +24,7 @@ use core::{ result, }; use parity_scale_codec::{self, Decode, Encode}; +use scale_info::TypeInfo; pub use crate::v1::AssetInstance; @@ -82,7 +83,7 @@ pub use crate::v1::AssetInstance; /// - `/AccountId32` for an ERC-20-style single-asset smart-contract on a Frame-based contracts chain. /// - `/AccountKey20` for an ERC-20-style single-asset smart-contract on an Ethereum-like chain. /// -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, TypeInfo)] pub enum MultiAsset { /// No assets. Rarely used. None, diff --git a/xcm/src/v0/multi_location.rs b/xcm/src/v0/multi_location.rs index 6205071690f0..6b7438b93fa0 100644 --- a/xcm/src/v0/multi_location.rs +++ b/xcm/src/v0/multi_location.rs @@ -42,7 +42,7 @@ use parity_scale_codec::{self, Decode, Encode}; /// This specific `MultiLocation` implementation uses a Rust `enum` in order to make pattern matching easier. /// /// The `MultiLocation` value of `Null` simply refers to the interpreting consensus system. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, scale_info::TypeInfo)] pub enum MultiLocation { /// The interpreting consensus system. Null, diff --git a/xcm/src/v0/order.rs b/xcm/src/v0/order.rs index e414cc27a6e2..54117e31f9c5 100644 --- a/xcm/src/v0/order.rs +++ b/xcm/src/v0/order.rs @@ -26,10 +26,11 @@ use derivative::Derivative; use parity_scale_codec::{self, Decode, Encode}; /// An instruction to be executed on some or all of the assets in holding, used by asset-related XCM messages. -#[derive(Derivative, Encode, Decode)] +#[derive(Derivative, Encode, Decode, scale_info::TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] #[codec(encode_bound())] #[codec(decode_bound())] +#[scale_info(bounds(), skip_type_params(Call))] pub enum Order { /// Do nothing. Not generally used. #[codec(index = 0)] diff --git a/xcm/src/v0/traits.rs b/xcm/src/v0/traits.rs index 5c9882f61dbb..3263fda4ac56 100644 --- a/xcm/src/v0/traits.rs +++ b/xcm/src/v0/traits.rs @@ -21,7 +21,7 @@ use parity_scale_codec::{Decode, Encode}; use super::{MultiLocation, Xcm}; -#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug)] +#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, scale_info::TypeInfo)] pub enum Error { Undefined, /// An arithmetic overflow happened. @@ -103,7 +103,7 @@ pub type Result = result::Result<(), Error>; pub type Weight = u64; /// Outcome of an XCM execution. -#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug)] +#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, scale_info::TypeInfo)] pub enum Outcome { /// Execution completed successfully; given weight was used. Complete(Weight), diff --git a/xcm/src/v1/junction.rs b/xcm/src/v1/junction.rs index 06e7308ad411..c4835d60c5b1 100644 --- a/xcm/src/v1/junction.rs +++ b/xcm/src/v1/junction.rs @@ -21,11 +21,12 @@ use crate::v0::Junction as Junction0; use alloc::vec::Vec; use core::convert::TryFrom; use parity_scale_codec::{self, Decode, Encode}; +use scale_info::TypeInfo; /// A single item in a path to describe the relative location of a consensus system. /// /// Each item assumes a pre-existing location as its context and is defined in terms of it. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, TypeInfo)] pub enum Junction { /// An indexed parachain belonging to and operated by the context. /// diff --git a/xcm/src/v1/mod.rs b/xcm/src/v1/mod.rs index 02bbd5f42712..6f96dc739491 100644 --- a/xcm/src/v1/mod.rs +++ b/xcm/src/v1/mod.rs @@ -29,6 +29,7 @@ use core::{ }; use derivative::Derivative; use parity_scale_codec::{self, Decode, Encode}; +use scale_info::TypeInfo; mod junction; mod multiasset; @@ -75,7 +76,7 @@ pub mod prelude { } /// Response data to a query. -#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo)] pub enum Response { /// Some assets. Assets(MultiAssets), @@ -91,10 +92,11 @@ pub enum Response { /// /// This is the inner XCM format and is version-sensitive. Messages are typically passed using the outer /// XCM format, known as `VersionedXcm`. -#[derive(Derivative, Encode, Decode)] +#[derive(Derivative, Encode, Decode, TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] #[codec(encode_bound())] #[codec(decode_bound())] +#[scale_info(bounds(), skip_type_params(Call))] pub enum Xcm { /// Withdraw asset(s) (`assets`) from the ownership of `origin` and place them into `holding`. Execute the /// orders (`effects`). diff --git a/xcm/src/v1/multiasset.rs b/xcm/src/v1/multiasset.rs index a5dfdc84968c..129c5731542f 100644 --- a/xcm/src/v1/multiasset.rs +++ b/xcm/src/v1/multiasset.rs @@ -31,9 +31,10 @@ use core::{ result, }; use parity_scale_codec::{self as codec, Decode, Encode}; +use scale_info::TypeInfo; /// A general identifier for an instance of a non-fungible asset class. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, TypeInfo)] pub enum AssetInstance { /// Undefined - used if the non-fungible asset class has only one instance. Undefined, @@ -95,7 +96,7 @@ impl From> for AssetInstance { } /// Classification of an asset being concrete or abstract. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode, TypeInfo)] pub enum AssetId { Concrete(MultiLocation), Abstract(Vec), @@ -135,7 +136,7 @@ impl AssetId { } /// Classification of whether an asset is fungible or not, along with a mandatory amount or instance. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode, TypeInfo)] pub enum Fungibility { Fungible(#[codec(compact)] u128), NonFungible(AssetInstance), @@ -162,7 +163,7 @@ impl> From for Fungibility { } } -#[derive(Clone, Eq, PartialEq, Debug, Encode, Decode)] +#[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, TypeInfo)] pub struct MultiAsset { pub id: AssetId, pub fun: Fungibility, @@ -266,7 +267,7 @@ impl TryFrom> for MultiAsset { } /// A `Vec` of `MultiAsset`s. There may be no duplicate fungible items in here and when decoding, they must be sorted. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, TypeInfo)] pub struct MultiAssets(Vec); impl Decode for MultiAssets { @@ -422,14 +423,14 @@ impl MultiAssets { } } /// Classification of whether an asset is fungible or not. -#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode)] +#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode, TypeInfo)] pub enum WildFungibility { Fungible, NonFungible, } /// A wildcard representing a set of assets. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode, TypeInfo)] pub enum WildMultiAsset { /// All assets in the holding register, up to `usize` individual assets (different instances of non-fungibles could /// be separate assets). @@ -501,7 +502,7 @@ impl, B: Into> From<(A, B)> for WildMultiAsset /// /// Note: Vectors of wildcards whose encoding is supported in XCM v0 are unsupported /// in this implementation and will result in a decode error. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode, TypeInfo)] pub enum MultiAssetFilter { Definite(MultiAssets), Wild(WildMultiAsset), diff --git a/xcm/src/v1/multilocation.rs b/xcm/src/v1/multilocation.rs index a2a087443b3c..9931ba4a6137 100644 --- a/xcm/src/v1/multilocation.rs +++ b/xcm/src/v1/multilocation.rs @@ -19,6 +19,7 @@ use super::Junction; use core::{convert::TryFrom, mem, result}; use parity_scale_codec::{Decode, Encode}; +use scale_info::TypeInfo; /// A relative path between state-bearing consensus systems. /// @@ -46,7 +47,7 @@ use parity_scale_codec::{Decode, Encode}; /// that a value is strictly an interior location, in those cases, `Junctions` may be used. /// /// The `MultiLocation` value of `Null` simply refers to the interpreting consensus system. -#[derive(Clone, Decode, Encode, Eq, PartialEq, Ord, PartialOrd, Debug)] +#[derive(Clone, Decode, Encode, Eq, PartialEq, Ord, PartialOrd, Debug, TypeInfo)] pub struct MultiLocation { /// The number of parent junctions at the beginning of this `MultiLocation`. pub parents: u8, @@ -98,7 +99,7 @@ impl MultiLocation { MultiLocation { parents, interior: Junctions::Here } } - /// Whether or not the `MultiLocation` has no parents and has a `Here` interior. + /// Whether the `MultiLocation` has no parents and has a `Here` interior. pub const fn is_here(&self) -> bool { self.parents == 0 && self.interior.len() == 0 } @@ -118,7 +119,7 @@ impl MultiLocation { self.parents } - /// Returns boolean indicating whether or not `self` contains only the specified amount of + /// Returns boolean indicating whether `self` contains only the specified amount of /// parents and no interior junctions. pub const fn contains_parents_only(&self, count: u8) -> bool { matches!(self.interior, Junctions::Here) && self.parents == count @@ -337,8 +338,8 @@ impl From for MultiLocation { #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] pub struct ParentThen(Junctions); impl From for MultiLocation { - fn from(x: ParentThen) -> Self { - MultiLocation { parents: 1, interior: x.0 } + fn from(ParentThen(interior): ParentThen) -> Self { + MultiLocation { parents: 1, interior } } } @@ -346,8 +347,8 @@ impl From for MultiLocation { #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)] pub struct Ancestor(u8); impl From for MultiLocation { - fn from(x: Ancestor) -> Self { - MultiLocation { parents: x.0, interior: Junctions::Here } + fn from(Ancestor(parents): Ancestor) -> Self { + MultiLocation { parents, interior: Junctions::Here } } } @@ -355,8 +356,8 @@ impl From for MultiLocation { #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] pub struct AncestorThen(u8, Junctions); impl From for MultiLocation { - fn from(x: AncestorThen) -> Self { - MultiLocation { parents: x.0, interior: x.1 } + fn from(AncestorThen(parents, interior): AncestorThen) -> Self { + MultiLocation { parents, interior } } } @@ -370,7 +371,7 @@ const MAX_JUNCTIONS: usize = 8; /// /// Parent junctions cannot be constructed with this type. Refer to `MultiLocation` for /// instructions on constructing parent junctions. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, TypeInfo)] pub enum Junctions { /// The interpreting consensus system. Here, diff --git a/xcm/src/v1/order.rs b/xcm/src/v1/order.rs index 9b8a7591f183..00ee69458cd0 100644 --- a/xcm/src/v1/order.rs +++ b/xcm/src/v1/order.rs @@ -25,12 +25,14 @@ use core::{ }; use derivative::Derivative; use parity_scale_codec::{self, Decode, Encode}; +use scale_info::TypeInfo; /// An instruction to be executed on some or all of the assets in holding, used by asset-related XCM messages. -#[derive(Derivative, Encode, Decode)] +#[derive(Derivative, Encode, Decode, TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] #[codec(encode_bound())] #[codec(decode_bound())] +#[scale_info(bounds(), skip_type_params(Call))] pub enum Order { /// Do nothing. Not generally used. #[codec(index = 0)] diff --git a/xcm/src/v1/traits.rs b/xcm/src/v1/traits.rs index 892b6afea9f7..d95d9e1eb84a 100644 --- a/xcm/src/v1/traits.rs +++ b/xcm/src/v1/traits.rs @@ -18,10 +18,11 @@ use core::result; use parity_scale_codec::{Decode, Encode}; +use scale_info::TypeInfo; use super::{MultiLocation, Xcm}; -#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug)] +#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)] pub enum Error { Undefined, /// An arithmetic overflow happened. @@ -105,7 +106,7 @@ pub type Result = result::Result<(), Error>; pub type Weight = u64; /// Outcome of an XCM execution. -#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug)] +#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)] pub enum Outcome { /// Execution completed successfully; given weight was used. Complete(Weight), @@ -145,7 +146,12 @@ pub trait ExecuteXcm { /// Execute some XCM `message` from `origin` using no more than `weight_limit` weight. The weight limit is /// a basic hard-limit and the implementation may place further restrictions or requirements on weight and /// other aspects. - fn execute_xcm(origin: MultiLocation, message: Xcm, weight_limit: Weight) -> Outcome { + fn execute_xcm( + origin: impl Into, + message: Xcm, + weight_limit: Weight, + ) -> Outcome { + let origin = origin.into(); log::debug!( target: "xcm::execute_xcm", "origin: {:?}, message: {:?}, weight_limit: {:?}", @@ -161,7 +167,7 @@ pub trait ExecuteXcm { /// Some amount of `weight_credit` may be provided which, depending on the implementation, may allow /// execution without associated payment. fn execute_xcm_in_credit( - origin: MultiLocation, + origin: impl Into, message: Xcm, weight_limit: Weight, weight_credit: Weight, @@ -170,7 +176,7 @@ pub trait ExecuteXcm { impl ExecuteXcm for () { fn execute_xcm_in_credit( - _origin: MultiLocation, + _origin: impl Into, _message: Xcm, _weight_limit: Weight, _weight_credit: Weight, @@ -194,15 +200,16 @@ impl ExecuteXcm for () { /// /// A sender that only passes the message through and does nothing. /// struct Sender1; /// impl SendXcm for Sender1 { -/// fn send_xcm(destination: MultiLocation, message: Xcm<()>) -> Result { -/// return Err(Error::CannotReachDestination(destination, message)) +/// fn send_xcm(destination: impl Into, message: Xcm<()>) -> Result { +/// return Err(Error::CannotReachDestination(destination.into(), message)) /// } /// } /// /// /// A sender that accepts a message that has an X2 junction, otherwise stops the routing. /// struct Sender2; /// impl SendXcm for Sender2 { -/// fn send_xcm(destination: MultiLocation, message: Xcm<()>) -> Result { +/// fn send_xcm(destination: impl Into, message: Xcm<()>) -> Result { +/// let destination = destination.into(); /// if matches!(destination.interior(), Junctions::X2(j1, j2)) /// && destination.parent_count() == 0 /// { @@ -216,7 +223,8 @@ impl ExecuteXcm for () { /// /// A sender that accepts a message from an X1 parent junction, passing through otherwise. /// struct Sender3; /// impl SendXcm for Sender3 { -/// fn send_xcm(destination: MultiLocation, message: Xcm<()>) -> Result { +/// fn send_xcm(destination: impl Into, message: Xcm<()>) -> Result { +/// let destination = destination.into(); /// if matches!(destination.interior(), Junctions::Here) /// && destination.parent_count() == 1 /// { @@ -231,17 +239,16 @@ impl ExecuteXcm for () { /// # fn main() { /// let call: Vec = ().encode(); /// let message = Xcm::Transact { origin_type: OriginKind::Superuser, require_weight_at_most: 0, call: call.into() }; -/// let destination: MultiLocation = Parent.into(); /// /// assert!( /// // Sender2 will block this. -/// <(Sender1, Sender2, Sender3) as SendXcm>::send_xcm(destination.clone(), message.clone()) +/// <(Sender1, Sender2, Sender3) as SendXcm>::send_xcm(Parent, message.clone()) /// .is_err() /// ); /// /// assert!( /// // Sender3 will catch this. -/// <(Sender1, Sender3) as SendXcm>::send_xcm(destination.clone(), message.clone()) +/// <(Sender1, Sender3) as SendXcm>::send_xcm(Parent, message.clone()) /// .is_ok() /// ); /// # } @@ -252,12 +259,12 @@ pub trait SendXcm { /// If it is not a destination which can be reached with this type but possibly could by others, then it *MUST* /// return `CannotReachDestination`. Any other error will cause the tuple implementation to exit early without /// trying other type fields. - fn send_xcm(destination: MultiLocation, message: Xcm<()>) -> Result; + fn send_xcm(destination: impl Into, message: Xcm<()>) -> Result; } #[impl_trait_for_tuples::impl_for_tuples(30)] impl SendXcm for Tuple { - fn send_xcm(destination: MultiLocation, message: Xcm<()>) -> Result { + fn send_xcm(destination: impl Into, message: Xcm<()>) -> Result { for_tuples!( #( // we shadow `destination` and `message` in each expansion for the next one. let (destination, message) = match Tuple::send_xcm(destination, message) { @@ -265,6 +272,6 @@ impl SendXcm for Tuple { o @ _ => return o, }; )* ); - Err(Error::CannotReachDestination(destination, message)) + Err(Error::CannotReachDestination(destination.into(), message)) } } diff --git a/xcm/src/v2/mod.rs b/xcm/src/v2/mod.rs index 533aef468701..60bec66ed963 100644 --- a/xcm/src/v2/mod.rs +++ b/xcm/src/v2/mod.rs @@ -17,7 +17,7 @@ //! Version 1 of the Cross-Consensus Message format data structures. use super::v1::{Order as OldOrder, Response as OldResponse, Xcm as OldXcm}; -use crate::DoubleEncoded; +use crate::{DoubleEncoded, GetWeight}; use alloc::{vec, vec::Vec}; use core::{ convert::{TryFrom, TryInto}, @@ -26,10 +26,13 @@ use core::{ }; use derivative::Derivative; use parity_scale_codec::{self, Decode, Encode}; +use scale_info::TypeInfo; mod traits; -pub use traits::{Error, ExecuteXcm, Outcome, Result, SendError, SendResult, SendXcm}; +pub use traits::{ + Error, ExecuteXcm, Outcome, Result, SendError, SendResult, SendXcm, Weight, XcmWeightInfo, +}; // These parts of XCM v1 have been unchanged in XCM v2, and are re-imported here. pub use super::v1::{ Ancestor, AncestorThen, AssetId, AssetInstance, BodyId, BodyPart, Fungibility, @@ -43,10 +46,11 @@ pub const VERSION: super::Version = 2; /// An identifier for a query. pub type QueryId = u64; -#[derive(Derivative, Default, Encode, Decode)] +#[derive(Derivative, Default, Encode, Decode, TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] #[codec(encode_bound())] #[codec(decode_bound())] +#[scale_info(bounds(), skip_type_params(Call))] pub struct Xcm(pub Vec>); impl Xcm { @@ -127,7 +131,7 @@ pub mod prelude { WeightLimit::{self, *}, WildFungibility::{self, Fungible as WildFungible, NonFungible as WildNonFungible}, WildMultiAsset::{self, *}, - VERSION as XCM_VERSION, + XcmWeightInfo, VERSION as XCM_VERSION, }; } pub use super::{Instruction, Xcm}; @@ -141,14 +145,14 @@ pub mod prelude { } /// Response data to a query. -#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo)] pub enum Response { /// No response. Serves as a neutral default. Null, /// Some assets. Assets(MultiAssets), /// The outcome of an XCM instruction. - ExecutionResult(result::Result<(), (u32, Error)>), + ExecutionResult(Option<(u32, Error)>), /// An XCM version. Version(super::Version), } @@ -160,7 +164,7 @@ impl Default for Response { } /// An optional weight limit. -#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug)] +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo)] pub enum WeightLimit { /// No weight limit imposed. Unlimited, @@ -194,10 +198,11 @@ impl From for Option { /// /// This is the inner XCM format and is version-sensitive. Messages are typically passed using the outer /// XCM format, known as `VersionedXcm`. -#[derive(Derivative, Encode, Decode)] +#[derive(Derivative, Encode, Decode, TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] #[codec(encode_bound())] #[codec(decode_bound())] +#[scale_info(bounds(), skip_type_params(Call))] pub enum Instruction { /// Withdraw asset(s) (`assets`) from the ownership of `origin` and place them into the Holding /// Register. @@ -670,6 +675,54 @@ impl Instruction { } } +// TODO: Automate Generation +impl> GetWeight for Instruction { + fn weight(&self) -> Weight { + use Instruction::*; + match self { + WithdrawAsset(assets) => W::withdraw_asset(assets), + ReserveAssetDeposited(assets) => W::reserve_asset_deposited(assets), + ReceiveTeleportedAsset(assets) => W::receive_teleported_asset(assets), + QueryResponse { query_id, response, max_weight } => + W::query_response(query_id, response, max_weight), + TransferAsset { assets, beneficiary } => W::transfer_asset(assets, beneficiary), + TransferReserveAsset { assets, dest, xcm } => + W::transfer_reserve_asset(&assets, dest, xcm), + Transact { origin_type, require_weight_at_most, call } => + W::transact(origin_type, require_weight_at_most, call), + HrmpNewChannelOpenRequest { sender, max_message_size, max_capacity } => + W::hrmp_new_channel_open_request(sender, max_message_size, max_capacity), + HrmpChannelAccepted { recipient } => W::hrmp_channel_accepted(recipient), + HrmpChannelClosing { initiator, sender, recipient } => + W::hrmp_channel_closing(initiator, sender, recipient), + ClearOrigin => W::clear_origin(), + DescendOrigin(who) => W::descend_origin(who), + ReportError { query_id, dest, max_response_weight } => + W::report_error(query_id, dest, max_response_weight), + DepositAsset { assets, max_assets, beneficiary } => + W::deposit_asset(assets, max_assets, beneficiary), + DepositReserveAsset { assets, max_assets, dest, xcm } => + W::deposit_reserve_asset(assets, max_assets, dest, xcm), + ExchangeAsset { give, receive } => W::exchange_asset(give, receive), + InitiateReserveWithdraw { assets, reserve, xcm } => + W::initiate_reserve_withdraw(assets, reserve, xcm), + InitiateTeleport { assets, dest, xcm } => W::initiate_teleport(assets, dest, xcm), + QueryHolding { query_id, dest, assets, max_response_weight } => + W::query_holding(query_id, dest, assets, max_response_weight), + BuyExecution { fees, weight_limit } => W::buy_execution(fees, weight_limit), + RefundSurplus => W::refund_surplus(), + SetErrorHandler(xcm) => W::set_error_handler(xcm), + SetAppendix(xcm) => W::set_appendix(xcm), + ClearError => W::clear_error(), + ClaimAsset { assets, ticket } => W::claim_asset(assets, ticket), + Trap(code) => W::trap(code), + SubscribeVersion { query_id, max_response_weight } => + W::subscribe_version(query_id, max_response_weight), + UnsubscribeVersion => W::unsubscribe_version(), + } + } +} + pub mod opaque { /// The basic concrete type of `Xcm`, which doesn't make any assumptions about the /// format of a call other than it is pre-encoded. diff --git a/xcm/src/v2/traits.rs b/xcm/src/v2/traits.rs index 0349a7de193f..d1e1381f4de3 100644 --- a/xcm/src/v2/traits.rs +++ b/xcm/src/v2/traits.rs @@ -18,95 +18,96 @@ use core::result; use parity_scale_codec::{Decode, Encode}; +use scale_info::TypeInfo; -use super::{MultiLocation, Xcm}; +use super::*; -#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, Debug)] +#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)] pub enum Error { - Undefined, + // Errors that happen due to instructions being executed. These alone are defined in the + // XCM specification. /// An arithmetic overflow happened. + #[codec(index = 0)] Overflow, - /// The operation is intentionally unsupported. + /// The instruction is intentionally unsupported. + #[codec(index = 1)] Unimplemented, - UnhandledXcmVersion, - /// The implementation does not handle a given XCM. - UnhandledXcmMessage, - /// The implementation does not handle an effect present in an XCM. - UnhandledEffect, - EscalationOfPrivilege, + /// Origin Register does not contain a value value for a reserve transfer notification. + #[codec(index = 2)] UntrustedReserveLocation, + /// Origin Register does not contain a value value for a teleport notification. + #[codec(index = 3)] UntrustedTeleportLocation, - DestinationBufferOverflow, + /// `MultiLocation` value too large to descend further. + #[codec(index = 4)] MultiLocationFull, + /// `MultiLocation` value ascend more parents than known ancestors of local location. + #[codec(index = 5)] MultiLocationNotInvertible, - FailedToDecode, + /// The Origin Register does not contain a valid value for instruction. + #[codec(index = 6)] BadOrigin, - ExceedsMaxMessageSize, - /// An asset transaction (like withdraw or deposit) failed. - /// See implementers of the `TransactAsset` trait for sources. - /// Causes can include type conversion failures between id or balance types. + /// The location parameter is not a valid value for the instruction. + #[codec(index = 7)] + InvalidLocation, + /// The given asset is not handled. + #[codec(index = 8)] + AssetNotFound, + /// An asset transaction (like withdraw or deposit) failed (typically due to type conversions). + #[codec(index = 9)] FailedToTransactAsset(#[codec(skip)] &'static str), - /// Execution of the XCM would potentially result in a greater weight used than the pre-specified - /// weight limit. The amount that is potentially required is the parameter. - WeightLimitReached(Weight), - /// An asset wildcard was passed where it was not expected (e.g. as the asset to withdraw in a - /// `WithdrawAsset` XCM). - Wildcard, - /// The case where an XCM message has specified a optional weight limit and the weight required for - /// processing is too great. - /// - /// Used by: - /// - `Transact` - TooMuchWeightRequired, - /// The fees specified by the XCM message were not found in the holding register. - /// - /// Used by: - /// - `BuyExecution` - NotHoldingFees, - /// The weight of an XCM message is not computable ahead of execution. This generally means at least part - /// of the message is invalid, which could be due to it containing overly nested structures or an invalid - /// nested data segment (e.g. for the call in `Transact`). - WeightNotComputable, - /// The XCM did not pass the barrier condition for execution. The barrier condition differs on different - /// chains and in different circumstances, but generally it means that the conditions surrounding the message - /// were not such that the chain considers the message worth spending time executing. Since most chains - /// lift the barrier to execution on appropriate payment, presentation of an NFT voucher, or based on the - /// message origin, it means that none of those were the case. - Barrier, - /// Indicates that it is not possible for a location to have an asset be withdrawn or transferred from its - /// ownership. This probably means it doesn't own (enough of) it, but may also indicate that it is under a - /// lock, hold, freeze or is otherwise unavailable. + /// An asset cannot be withdrawn, potentially due to lack of ownership, availability or rights. + #[codec(index = 10)] NotWithdrawable, - /// Indicates that the consensus system cannot deposit an asset under the ownership of a particular location. + /// An asset cannot be deposited under the ownership of a particular location. + #[codec(index = 11)] LocationCannotHold, - /// The assets given to purchase weight is are insufficient for the weight desired. - TooExpensive, - /// The given asset is not handled. - AssetNotFound, - /// The given message cannot be translated into a format that the destination can be expected to interpret. + /// Attempt to send a message greater than the maximum supported by the transport protocol. + #[codec(index = 12)] + ExceedsMaxMessageSize, + /// The given message cannot be translated into a format supported by the destination. + #[codec(index = 13)] DestinationUnsupported, - /// `execute_xcm` has been called too many times recursively. - RecursionLimitReached, /// Destination is routable, but there is some issue with the transport mechanism. - /// - /// A human-readable explanation of the specific issue is provided. + #[codec(index = 14)] Transport(#[codec(skip)] &'static str), /// Destination is known to be unroutable. + #[codec(index = 15)] Unroutable, - /// The weight required was not specified when it should have been. - UnknownWeightRequired, - /// An error was intentionally forced. A code is included. - Trap(u64), - /// The given claim could not be recognized/found. + /// Used by `ClaimAsset` when the given claim could not be recognized/found. + #[codec(index = 16)] UnknownClaim, - /// The location given was invalid for some reason specific to the operation at hand. - InvalidLocation, -} + /// Used by `Transact` when the functor cannot be decoded. + #[codec(index = 17)] + FailedToDecode, + /// Used by `Transact` to indicate that the given weight limit could be breached by the functor. + #[codec(index = 18)] + TooMuchWeightRequired, + /// Used by `BuyExecution` when the Holding Register does not contain payable fees. + #[codec(index = 19)] + NotHoldingFees, + /// Used by `BuyExecution` when the fees declared to purchase weight are insufficient. + #[codec(index = 20)] + TooExpensive, + /// Used by the `Trap` instruction to force an error intentionally. Its code is included. + #[codec(index = 21)] + Trap(u64), -impl From<()> for Error { - fn from(_: ()) -> Self { - Self::Undefined - } + // Errors that happen prior to instructions being executed. These fall outside of the XCM spec. + /// XCM version not able to be handled. + UnhandledXcmVersion, + /// Execution of the XCM would potentially result in a greater weight used than weight limit. + WeightLimitReached(Weight), + /// The XCM did not pass the barrier condition for execution. + /// + /// The barrier condition differs on different chains and in different circumstances, but + /// generally it means that the conditions surrounding the message were not such that the chain + /// considers the message worth spending time executing. Since most chains lift the barrier to + /// execution on appropriate payment, presentation of an NFT voucher, or based on the message + /// origin, it means that none of those were the case. + Barrier, + /// The weight of an XCM message is not computable ahead of execution. + WeightNotComputable, } impl From for Error { @@ -126,7 +127,7 @@ pub type Result = result::Result<(), Error>; pub type Weight = u64; /// Outcome of an XCM execution. -#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug)] +#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)] pub enum Outcome { /// Execution completed successfully; given weight was used. Complete(Weight), @@ -166,7 +167,12 @@ pub trait ExecuteXcm { /// Execute some XCM `message` from `origin` using no more than `weight_limit` weight. The weight limit is /// a basic hard-limit and the implementation may place further restrictions or requirements on weight and /// other aspects. - fn execute_xcm(origin: MultiLocation, message: Xcm, weight_limit: Weight) -> Outcome { + fn execute_xcm( + origin: impl Into, + message: Xcm, + weight_limit: Weight, + ) -> Outcome { + let origin = origin.into(); log::debug!( target: "xcm::execute_xcm", "origin: {:?}, message: {:?}, weight_limit: {:?}", @@ -182,7 +188,7 @@ pub trait ExecuteXcm { /// Some amount of `weight_credit` may be provided which, depending on the implementation, may allow /// execution without associated payment. fn execute_xcm_in_credit( - origin: MultiLocation, + origin: impl Into, message: Xcm, weight_limit: Weight, weight_credit: Weight, @@ -191,7 +197,7 @@ pub trait ExecuteXcm { impl ExecuteXcm for () { fn execute_xcm_in_credit( - _origin: MultiLocation, + _origin: impl Into, _message: Xcm, _weight_limit: Weight, _weight_credit: Weight, @@ -201,7 +207,7 @@ impl ExecuteXcm for () { } /// Error result value when attempting to send an XCM message. -#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug)] +#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, scale_info::TypeInfo)] pub enum SendError { /// The message and destination combination was not recognized as being reachable. /// @@ -240,16 +246,16 @@ pub type SendResult = result::Result<(), SendError>; /// /// A sender that only passes the message through and does nothing. /// struct Sender1; /// impl SendXcm for Sender1 { -/// fn send_xcm(destination: MultiLocation, message: Xcm<()>) -> SendResult { -/// return Err(SendError::CannotReachDestination(destination, message)) +/// fn send_xcm(destination: impl Into, message: Xcm<()>) -> SendResult { +/// return Err(SendError::CannotReachDestination(destination.into(), message)) /// } /// } /// /// /// A sender that accepts a message that has an X2 junction, otherwise stops the routing. /// struct Sender2; /// impl SendXcm for Sender2 { -/// fn send_xcm(destination: MultiLocation, message: Xcm<()>) -> SendResult { -/// if let MultiLocation { parents: 0, interior: X2(j1, j2) } = destination { +/// fn send_xcm(destination: impl Into, message: Xcm<()>) -> SendResult { +/// if let MultiLocation { parents: 0, interior: X2(j1, j2) } = destination.into() { /// Ok(()) /// } else { /// Err(SendError::Unroutable) @@ -260,7 +266,8 @@ pub type SendResult = result::Result<(), SendError>; /// /// A sender that accepts a message from a parent, passing through otherwise. /// struct Sender3; /// impl SendXcm for Sender3 { -/// fn send_xcm(destination: MultiLocation, message: Xcm<()>) -> SendResult { +/// fn send_xcm(destination: impl Into, message: Xcm<()>) -> SendResult { +/// let destination = destination.into(); /// match destination { /// MultiLocation { parents: 1, interior: Here } => Ok(()), /// _ => Err(SendError::CannotReachDestination(destination, message)), @@ -276,17 +283,16 @@ pub type SendResult = result::Result<(), SendError>; /// require_weight_at_most: 0, /// call: call.into(), /// }]); -/// let destination = MultiLocation::parent(); /// /// assert!( /// // Sender2 will block this. -/// <(Sender1, Sender2, Sender3) as SendXcm>::send_xcm(destination.clone(), message.clone()) +/// <(Sender1, Sender2, Sender3) as SendXcm>::send_xcm(Parent, message.clone()) /// .is_err() /// ); /// /// assert!( /// // Sender3 will catch this. -/// <(Sender1, Sender3) as SendXcm>::send_xcm(destination.clone(), message.clone()) +/// <(Sender1, Sender3) as SendXcm>::send_xcm(Parent, message.clone()) /// .is_ok() /// ); /// # } @@ -297,12 +303,12 @@ pub trait SendXcm { /// If it is not a destination which can be reached with this type but possibly could by others, then it *MUST* /// return `CannotReachDestination`. Any other error will cause the tuple implementation to exit early without /// trying other type fields. - fn send_xcm(destination: MultiLocation, message: Xcm<()>) -> SendResult; + fn send_xcm(destination: impl Into, message: Xcm<()>) -> SendResult; } #[impl_trait_for_tuples::impl_for_tuples(30)] impl SendXcm for Tuple { - fn send_xcm(destination: MultiLocation, message: Xcm<()>) -> SendResult { + fn send_xcm(destination: impl Into, message: Xcm<()>) -> SendResult { for_tuples!( #( // we shadow `destination` and `message` in each expansion for the next one. let (destination, message) = match Tuple::send_xcm(destination, message) { @@ -310,6 +316,66 @@ impl SendXcm for Tuple { o @ _ => return o, }; )* ); - Err(SendError::CannotReachDestination(destination, message)) + Err(SendError::CannotReachDestination(destination.into(), message)) } } + +/// The info needed to weight an XCM. +// TODO: Automate Generation +pub trait XcmWeightInfo { + fn withdraw_asset(assets: &MultiAssets) -> Weight; + fn reserve_asset_deposited(assets: &MultiAssets) -> Weight; + fn receive_teleported_asset(assets: &MultiAssets) -> Weight; + fn query_response(query_id: &u64, response: &Response, max_weight: &u64) -> Weight; + fn transfer_asset(assets: &MultiAssets, beneficiary: &MultiLocation) -> Weight; + fn transfer_reserve_asset(assets: &MultiAssets, dest: &MultiLocation, xcm: &Xcm<()>) -> Weight; + fn transact( + origin_type: &OriginKind, + require_weight_at_most: &u64, + call: &DoubleEncoded, + ) -> Weight; + fn hrmp_new_channel_open_request( + sender: &u32, + max_message_size: &u32, + max_capacity: &u32, + ) -> Weight; + fn hrmp_channel_accepted(recipient: &u32) -> Weight; + fn hrmp_channel_closing(initiator: &u32, sender: &u32, recipient: &u32) -> Weight; + fn clear_origin() -> Weight; + fn descend_origin(who: &InteriorMultiLocation) -> Weight; + fn report_error(query_id: &QueryId, dest: &MultiLocation, max_response_weight: &u64) -> Weight; + fn relayed_from(who: &Junctions, message: &alloc::boxed::Box>) -> Weight; + fn deposit_asset( + assets: &MultiAssetFilter, + max_assets: &u32, + beneficiary: &MultiLocation, + ) -> Weight; + fn deposit_reserve_asset( + assets: &MultiAssetFilter, + max_assets: &u32, + dest: &MultiLocation, + xcm: &Xcm<()>, + ) -> Weight; + fn exchange_asset(give: &MultiAssetFilter, receive: &MultiAssets) -> Weight; + fn initiate_reserve_withdraw( + assets: &MultiAssetFilter, + reserve: &MultiLocation, + xcm: &Xcm<()>, + ) -> Weight; + fn initiate_teleport(assets: &MultiAssetFilter, dest: &MultiLocation, xcm: &Xcm<()>) -> Weight; + fn query_holding( + query_id: &u64, + dest: &MultiLocation, + assets: &MultiAssetFilter, + max_response_weight: &u64, + ) -> Weight; + fn buy_execution(fees: &MultiAsset, weight_limit: &WeightLimit) -> Weight; + fn refund_surplus() -> Weight; + fn set_error_handler(xcm: &Xcm) -> Weight; + fn set_appendix(xcm: &Xcm) -> Weight; + fn clear_error() -> Weight; + fn claim_asset(assets: &MultiAssets, ticket: &MultiLocation) -> Weight; + fn trap(code: &u64) -> Weight; + fn subscribe_version(query_id: &QueryId, max_response_weight: &u64) -> Weight; + fn unsubscribe_version() -> Weight; +} diff --git a/xcm/xcm-builder/Cargo.toml b/xcm/xcm-builder/Cargo.toml index 5bef78b7d7bd..08f37b515ca7 100644 --- a/xcm/xcm-builder/Cargo.toml +++ b/xcm/xcm-builder/Cargo.toml @@ -3,10 +3,11 @@ authors = ["Parity Technologies "] edition = "2018" name = "xcm-builder" description = "Tools & types for building with XCM and its executor." -version = "0.9.9" +version = "0.9.11" [dependencies] -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } +scale-info = { version = "1.0", default-features = false, features = ["derive"] } xcm = { path = "..", default-features = false } xcm-executor = { path = "../xcm-executor", default-features = false } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -16,6 +17,7 @@ sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +log = { version = "0.4.0", default-features = false } # Polkadot dependencies polkadot-parachain = { path = "../../parachain", default-features = false } @@ -29,7 +31,9 @@ polkadot-runtime-parachains = { path = "../../runtime/parachains" } default = ["std"] runtime-benchmarks = [] std = [ + "log/std", "parity-scale-codec/std", + "scale-info/std", "xcm/std", "xcm-executor/std", "sp-std/std", diff --git a/xcm/xcm-builder/src/currency_adapter.rs b/xcm/xcm-builder/src/currency_adapter.rs index b4af6fcb4ad6..164720e24a9a 100644 --- a/xcm/xcm-builder/src/currency_adapter.rs +++ b/xcm/xcm-builder/src/currency_adapter.rs @@ -142,6 +142,7 @@ impl< } fn deposit_asset(what: &MultiAsset, who: &MultiLocation) -> Result { + log::trace!("xcm::currency_adapter deposit_asset {:?} {:?}", what, who); // Check we handle this asset. let amount: u128 = Matcher::matches_fungible(&what).ok_or(Error::AssetNotFound)?.saturated_into(); diff --git a/xcm/xcm-builder/src/lib.rs b/xcm/xcm-builder/src/lib.rs index e2caff56bf36..72bb8b61c0ff 100644 --- a/xcm/xcm-builder/src/lib.rs +++ b/xcm/xcm-builder/src/lib.rs @@ -57,7 +57,9 @@ pub use fungibles_adapter::{ mod weight; #[allow(deprecated)] pub use weight::FixedRateOfConcreteFungible; -pub use weight::{FixedRateOfFungible, FixedWeightBounds, TakeRevenue, UsingComponents}; +pub use weight::{ + FixedRateOfFungible, FixedWeightBounds, TakeRevenue, UsingComponents, WeightInfoBounds, +}; mod matches_fungible; pub use matches_fungible::{IsAbstract, IsConcrete}; diff --git a/xcm/xcm-builder/src/mock.rs b/xcm/xcm-builder/src/mock.rs index 8f6759582f9a..4efc02b7e191 100644 --- a/xcm/xcm-builder/src/mock.rs +++ b/xcm/xcm-builder/src/mock.rs @@ -53,7 +53,7 @@ pub enum TestOrigin { /// /// Each item contains the amount of weight that it *wants* to consume as the first item, and the actual amount (if /// different from the former) in the second option. -#[derive(Debug, Encode, Decode, Eq, PartialEq, Clone, Copy)] +#[derive(Debug, Encode, Decode, Eq, PartialEq, Clone, Copy, scale_info::TypeInfo)] pub enum TestCall { OnlyRoot(Weight, Option), OnlyParachain(Weight, Option, Option), @@ -109,8 +109,8 @@ pub fn sent_xcm() -> Vec<(MultiLocation, opaque::Xcm)> { } pub struct TestSendXcm; impl SendXcm for TestSendXcm { - fn send_xcm(dest: MultiLocation, msg: opaque::Xcm) -> SendResult { - SENT_XCM.with(|q| q.borrow_mut().push((dest, msg))); + fn send_xcm(dest: impl Into, msg: opaque::Xcm) -> SendResult { + SENT_XCM.with(|q| q.borrow_mut().push((dest.into(), msg))); Ok(()) } } @@ -164,11 +164,11 @@ pub fn to_account(l: MultiLocation) -> Result { pub struct TestOriginConverter; impl ConvertOrigin for TestOriginConverter { fn convert_origin( - origin: MultiLocation, + origin: impl Into, kind: OriginKind, ) -> Result { use OriginKind::*; - match (kind, origin) { + match (kind, origin.into()) { (Superuser, _) => Ok(TestOrigin::Root), (SovereignAccount, l) => Ok(TestOrigin::Signed(to_account(l)?)), (Native, MultiLocation { parents: 0, interior: X1(Parachain(id)) }) => diff --git a/xcm/xcm-builder/src/origin_conversion.rs b/xcm/xcm-builder/src/origin_conversion.rs index b1800de2c6c8..9f33347e378d 100644 --- a/xcm/xcm-builder/src/origin_conversion.rs +++ b/xcm/xcm-builder/src/origin_conversion.rs @@ -32,7 +32,11 @@ impl, Origin: Origi where Origin::AccountId: Clone, { - fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { + let origin = origin.into(); if let OriginKind::SovereignAccount = kind { let location = LocationConverter::convert(origin)?; Ok(Origin::signed(location).into()) @@ -44,7 +48,11 @@ where pub struct ParentAsSuperuser(PhantomData); impl ConvertOrigin for ParentAsSuperuser { - fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { + let origin = origin.into(); if kind == OriginKind::Superuser && origin.contains_parents_only(1) { Ok(Origin::root()) } else { @@ -57,8 +65,11 @@ pub struct ChildSystemParachainAsSuperuser(PhantomData<(ParaId, impl, Origin: OriginTrait> ConvertOrigin for ChildSystemParachainAsSuperuser { - fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { - match (kind, origin) { + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { + match (kind, origin.into()) { ( OriginKind::Superuser, MultiLocation { parents: 0, interior: X1(Junction::Parachain(id)) }, @@ -72,8 +83,11 @@ pub struct SiblingSystemParachainAsSuperuser(PhantomData<(ParaId impl, Origin: OriginTrait> ConvertOrigin for SiblingSystemParachainAsSuperuser { - fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { - match (kind, origin) { + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { + match (kind, origin.into()) { ( OriginKind::Superuser, MultiLocation { parents: 1, interior: X1(Junction::Parachain(id)) }, @@ -87,8 +101,11 @@ pub struct ChildParachainAsNative(PhantomData<(Parachai impl, Origin: From> ConvertOrigin for ChildParachainAsNative { - fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { - match (kind, origin) { + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { + match (kind, origin.into()) { ( OriginKind::Native, MultiLocation { parents: 0, interior: X1(Junction::Parachain(id)) }, @@ -104,8 +121,11 @@ pub struct SiblingParachainAsNative( impl, Origin: From> ConvertOrigin for SiblingParachainAsNative { - fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { - match (kind, origin) { + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { + match (kind, origin.into()) { ( OriginKind::Native, MultiLocation { parents: 1, interior: X1(Junction::Parachain(id)) }, @@ -120,7 +140,11 @@ pub struct RelayChainAsNative(PhantomData<(RelayOrigin, Ori impl, Origin> ConvertOrigin for RelayChainAsNative { - fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { + let origin = origin.into(); if kind == OriginKind::Native && origin.contains_parents_only(1) { Ok(RelayOrigin::get()) } else { @@ -135,8 +159,11 @@ impl, Origin: OriginTrait> ConvertOrigin where Origin::AccountId: From<[u8; 32]>, { - fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { - match (kind, origin) { + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { + match (kind, origin.into()) { ( OriginKind::Native, MultiLocation { parents: 0, interior: X1(Junction::AccountId32 { id, network }) }, @@ -153,8 +180,11 @@ impl, Origin: OriginTrait> ConvertOrigin where Origin::AccountId: From<[u8; 20]>, { - fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { - match (kind, origin) { + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { + match (kind, origin.into()) { ( OriginKind::Native, MultiLocation { parents: 0, interior: X1(Junction::AccountKey20 { key, network }) }, diff --git a/xcm/xcm-builder/src/tests.rs b/xcm/xcm-builder/src/tests.rs index 746d9cbb6ce7..e3e5e24ca1b0 100644 --- a/xcm/xcm-builder/src/tests.rs +++ b/xcm/xcm-builder/src/tests.rs @@ -150,7 +150,6 @@ fn paying_reserve_deposit_should_work() { add_reserve(Parent.into(), (Parent, WildFungible).into()); WeightPrice::set((Parent.into(), 1_000_000_000_000)); - let origin = Parent.into(); let fees = (Parent, 30).into(); let message = Xcm(vec![ ReserveAssetDeposited((Parent, 100).into()), @@ -158,7 +157,7 @@ fn paying_reserve_deposit_should_work() { DepositAsset { assets: All.into(), max_assets: 1, beneficiary: Here.into() }, ]); let weight_limit = 50; - let r = XcmExecutor::::execute_xcm(origin, message, weight_limit); + let r = XcmExecutor::::execute_xcm(Parent, message, weight_limit); assert_eq!(r, Outcome::Complete(30)); assert_eq!(assets(3000), vec![(Parent, 70).into()]); } @@ -171,7 +170,7 @@ fn transfer_should_work() { add_asset(1001, (Here, 1000)); // They want to transfer 100 of them to their sibling parachain #2 let r = XcmExecutor::::execute_xcm( - Parachain(1).into(), + Parachain(1), Xcm(vec![TransferAsset { assets: (Here, 100).into(), beneficiary: X1(AccountIndex64 { index: 3, network: Any }).into(), @@ -434,7 +433,7 @@ fn reserve_transfer_should_work() { // They want to transfer 100 of our native asset from sovereign account of parachain #1 into #2 // and let them know to hand it to account #3. let r = XcmExecutor::::execute_xcm( - Parachain(1).into(), + Parachain(1), Xcm(vec![TransferReserveAsset { assets: (Here, 100).into(), dest: Parachain(2).into(), @@ -482,8 +481,7 @@ fn simple_version_subscriptions_should_work() { let r = XcmExecutor::::execute_xcm(origin, message.clone(), weight_limit); assert_eq!(r, Outcome::Error(XcmError::Barrier)); - let origin = Parent.into(); - let r = XcmExecutor::::execute_xcm(origin, message, weight_limit); + let r = XcmExecutor::::execute_xcm(Parent, message, weight_limit); assert_eq!(r, Outcome::Complete(10)); assert_eq!(SubscriptionRequests::get(), vec![(Parent.into(), Some((42, 5000)))]); @@ -536,8 +534,7 @@ fn simple_version_unsubscriptions_should_work() { let r = XcmExecutor::::execute_xcm(origin, message.clone(), weight_limit); assert_eq!(r, Outcome::Error(XcmError::Barrier)); - let origin = Parent.into(); - let r = XcmExecutor::::execute_xcm(origin, message, weight_limit); + let r = XcmExecutor::::execute_xcm(Parent, message, weight_limit); assert_eq!(r, Outcome::Complete(10)); assert_eq!(SubscriptionRequests::get(), vec![(Parent.into(), None)]); @@ -580,14 +577,13 @@ fn version_unsubscription_instruction_should_work() { fn transacting_should_work() { AllowUnpaidFrom::set(vec![Parent.into()]); - let origin = Parent.into(); let message = Xcm::(vec![Transact { origin_type: OriginKind::Native, require_weight_at_most: 50, call: TestCall::Any(50, None).encode().into(), }]); let weight_limit = 60; - let r = XcmExecutor::::execute_xcm(origin, message, weight_limit); + let r = XcmExecutor::::execute_xcm(Parent, message, weight_limit); assert_eq!(r, Outcome::Complete(60)); } @@ -595,14 +591,13 @@ fn transacting_should_work() { fn transacting_should_respect_max_weight_requirement() { AllowUnpaidFrom::set(vec![Parent.into()]); - let origin = Parent.into(); let message = Xcm::(vec![Transact { origin_type: OriginKind::Native, require_weight_at_most: 40, call: TestCall::Any(50, None).encode().into(), }]); let weight_limit = 60; - let r = XcmExecutor::::execute_xcm(origin, message, weight_limit); + let r = XcmExecutor::::execute_xcm(Parent, message, weight_limit); assert_eq!(r, Outcome::Incomplete(50, XcmError::TooMuchWeightRequired)); } @@ -610,14 +605,13 @@ fn transacting_should_respect_max_weight_requirement() { fn transacting_should_refund_weight() { AllowUnpaidFrom::set(vec![Parent.into()]); - let origin = Parent.into(); let message = Xcm::(vec![Transact { origin_type: OriginKind::Native, require_weight_at_most: 50, call: TestCall::Any(50, Some(30)).encode().into(), }]); let weight_limit = 60; - let r = XcmExecutor::::execute_xcm(origin, message, weight_limit); + let r = XcmExecutor::::execute_xcm(Parent, message, weight_limit); assert_eq!(r, Outcome::Complete(40)); } @@ -651,9 +645,8 @@ fn paid_transacting_should_refund_payment_for_unused_weight() { #[test] fn prepaid_result_of_query_should_get_free_execution() { let query_id = 33; - let origin: MultiLocation = Parent.into(); // We put this in manually here, but normally this would be done at the point of crafting the message. - expect_response(query_id, origin.clone()); + expect_response(query_id, Parent.into()); let the_response = Response::Assets((Parent, 100).into()); let message = Xcm::(vec![QueryResponse { @@ -664,12 +657,12 @@ fn prepaid_result_of_query_should_get_free_execution() { let weight_limit = 10; // First time the response gets through since we're expecting it... - let r = XcmExecutor::::execute_xcm(origin.clone(), message.clone(), weight_limit); + let r = XcmExecutor::::execute_xcm(Parent, message.clone(), weight_limit); assert_eq!(r, Outcome::Complete(10)); assert_eq!(response(query_id).unwrap(), the_response); // Second time it doesn't, since we're not. - let r = XcmExecutor::::execute_xcm(origin.clone(), message.clone(), weight_limit); + let r = XcmExecutor::::execute_xcm(Parent, message.clone(), weight_limit); assert_eq!(r, Outcome::Error(XcmError::Barrier)); } diff --git a/xcm/xcm-builder/src/weight.rs b/xcm/xcm-builder/src/weight.rs index c438ae4edbd4..1e84a42e2ada 100644 --- a/xcm/xcm-builder/src/weight.rs +++ b/xcm/xcm-builder/src/weight.rs @@ -35,29 +35,81 @@ impl, C: Decode + GetDispatchInfo, M: Get> WeightBounds let mut instructions_left = M::get(); Self::weight_with_limit(message, &mut instructions_left) } - fn instr_weight(message: &Instruction) -> Result { - Self::instr_weight_with_limit(message, &mut u32::max_value()) + fn instr_weight(instruction: &Instruction) -> Result { + Self::instr_weight_with_limit(instruction, &mut u32::max_value()) } } impl, C: Decode + GetDispatchInfo, M> FixedWeightBounds { fn weight_with_limit(message: &Xcm, instrs_limit: &mut u32) -> Result { - let mut r = 0; + let mut r: Weight = 0; *instrs_limit = instrs_limit.checked_sub(message.0.len() as u32).ok_or(())?; for m in message.0.iter() { - r += Self::instr_weight_with_limit(m, instrs_limit)?; + r = r.checked_add(Self::instr_weight_with_limit(m, instrs_limit)?).ok_or(())?; } Ok(r) } fn instr_weight_with_limit( - message: &Instruction, + instruction: &Instruction, instrs_limit: &mut u32, ) -> Result { - Ok(T::get().saturating_add(match message { - Transact { require_weight_at_most, .. } => *require_weight_at_most, - SetErrorHandler(xcm) | SetAppendix(xcm) => Self::weight_with_limit(xcm, instrs_limit)?, - _ => 0, - })) + T::get() + .checked_add(match instruction { + Transact { require_weight_at_most, .. } => *require_weight_at_most, + SetErrorHandler(xcm) | SetAppendix(xcm) => + Self::weight_with_limit(xcm, instrs_limit)?, + _ => 0, + }) + .ok_or(()) + } +} + +pub struct WeightInfoBounds(PhantomData<(W, C, M)>); +impl WeightBounds for WeightInfoBounds +where + W: XcmWeightInfo, + C: Decode + GetDispatchInfo, + M: Get, + Instruction: xcm::GetWeight, +{ + fn weight(message: &mut Xcm) -> Result { + let mut instructions_left = M::get(); + Self::weight_with_limit(message, &mut instructions_left) + } + fn instr_weight(instruction: &Instruction) -> Result { + Self::instr_weight_with_limit(instruction, &mut u32::max_value()) + } +} + +impl WeightInfoBounds +where + W: XcmWeightInfo, + C: Decode + GetDispatchInfo, + M: Get, + Instruction: xcm::GetWeight, +{ + fn weight_with_limit(message: &Xcm, instrs_limit: &mut u32) -> Result { + let mut r: Weight = 0; + *instrs_limit = instrs_limit.checked_sub(message.0.len() as u32).ok_or(())?; + for m in message.0.iter() { + r = r.checked_add(Self::instr_weight_with_limit(m, instrs_limit)?).ok_or(())?; + } + Ok(r) + } + fn instr_weight_with_limit( + instruction: &Instruction, + instrs_limit: &mut u32, + ) -> Result { + use xcm::GetWeight; + instruction + .weight() + .checked_add(match instruction { + Transact { require_weight_at_most, .. } => *require_weight_at_most, + SetErrorHandler(xcm) | SetAppendix(xcm) => + Self::weight_with_limit(xcm, instrs_limit)?, + _ => 0, + }) + .ok_or(()) } } diff --git a/xcm/xcm-builder/tests/mock/mod.rs b/xcm/xcm-builder/tests/mock/mod.rs index ee5c77afe587..1f0a5942045c 100644 --- a/xcm/xcm-builder/tests/mock/mod.rs +++ b/xcm/xcm-builder/tests/mock/mod.rs @@ -47,8 +47,8 @@ pub fn sent_xcm() -> Vec<(MultiLocation, opaque::Xcm)> { } pub struct TestSendXcm; impl SendXcm for TestSendXcm { - fn send_xcm(dest: MultiLocation, msg: opaque::Xcm) -> SendResult { - SENT_XCM.with(|q| q.borrow_mut().push((dest, msg))); + fn send_xcm(dest: impl Into, msg: opaque::Xcm) -> SendResult { + SENT_XCM.with(|q| q.borrow_mut().push((dest.into(), msg))); Ok(()) } } @@ -107,7 +107,9 @@ impl pallet_balances::Config for Runtime { impl shared::Config for Runtime {} -impl configuration::Config for Runtime {} +impl configuration::Config for Runtime { + type WeightInfo = configuration::weights::WeightInfo; +} // aims to closely emulate the Kusama XcmConfig parameter_types! { diff --git a/xcm/xcm-executor/Cargo.toml b/xcm/xcm-executor/Cargo.toml index d0b6d71d8fe7..ab2184c81d1d 100644 --- a/xcm/xcm-executor/Cargo.toml +++ b/xcm/xcm-executor/Cargo.toml @@ -3,11 +3,11 @@ authors = ["Parity Technologies "] edition = "2018" name = "xcm-executor" description = "An abstract and configurable XCM message executor." -version = "0.9.9" +version = "0.9.11" [dependencies] impl-trait-for-tuples = "0.2.0" -parity-scale-codec = { version = "2.0.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "2.3.1", default-features = false, features = ["derive"] } xcm = { path = "..", default-features = false } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -16,9 +16,13 @@ sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } log = { version = "0.4.14", default-features = false } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master" , default-features = false, optional = true } [features] default = ["std"] +runtime-benchmarks = [ + "frame-benchmarking", +] std = [ "parity-scale-codec/std", "xcm/std", diff --git a/xcm/xcm-executor/integration-tests/Cargo.toml b/xcm/xcm-executor/integration-tests/Cargo.toml index 7f80eaa366df..5602a1f178e7 100644 --- a/xcm/xcm-executor/integration-tests/Cargo.toml +++ b/xcm/xcm-executor/integration-tests/Cargo.toml @@ -3,7 +3,7 @@ authors = ["Parity Technologies "] edition = "2018" name = "xcm-executor-integration-tests" description = "Integration tests for the XCM Executor" -version = "0.9.9" +version = "0.9.11" [dependencies] frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } diff --git a/xcm/xcm-executor/integration-tests/src/lib.rs b/xcm/xcm-executor/integration-tests/src/lib.rs index 72aa7b15d07b..a6673aca7a92 100644 --- a/xcm/xcm-executor/integration-tests/src/lib.rs +++ b/xcm/xcm-executor/integration-tests/src/lib.rs @@ -44,10 +44,10 @@ fn basic_buy_fees_message_executes() { let execute = construct_extrinsic( &client, - polkadot_test_runtime::Call::Xcm(pallet_xcm::Call::execute( - Box::new(VersionedXcm::from(msg)), - 1_000_000_000, - )), + polkadot_test_runtime::Call::Xcm(pallet_xcm::Call::execute { + message: Box::new(VersionedXcm::from(msg)), + max_weight: 1_000_000_000, + }), sp_keyring::Sr25519Keyring::Alice, 0, ); @@ -88,7 +88,7 @@ fn query_response_fires() { let execute = construct_extrinsic( &client, - polkadot_test_runtime::Call::TestNotifier(pallet_test_notifier::Call::prepare_new_query()), + polkadot_test_runtime::Call::TestNotifier(pallet_test_notifier::Call::prepare_new_query {}), sp_keyring::Sr25519Keyring::Alice, 0, ); @@ -117,14 +117,17 @@ fn query_response_fires() { let mut block_builder = client.init_polkadot_block_builder(); - let response = Response::ExecutionResult(Ok(())); + let response = Response::ExecutionResult(None); let max_weight = 1_000_000; let msg = Xcm(vec![QueryResponse { query_id, response, max_weight }]); let msg = Box::new(VersionedXcm::from(msg)); let execute = construct_extrinsic( &client, - polkadot_test_runtime::Call::Xcm(pallet_xcm::Call::execute(msg, 1_000_000_000)), + polkadot_test_runtime::Call::Xcm(pallet_xcm::Call::execute { + message: msg, + max_weight: 1_000_000_000, + }), sp_keyring::Sr25519Keyring::Alice, 1, ); @@ -145,13 +148,13 @@ fn query_response_fires() { r.event, polkadot_test_runtime::Event::Xcm(pallet_xcm::Event::ResponseReady( q, - Response::ExecutionResult(Ok(())), + Response::ExecutionResult(None), )) if q == query_id, ))); assert_eq!( polkadot_test_runtime::Xcm::query(query_id), Some(QueryStatus::Ready { - response: VersionedResponse::V2(Response::ExecutionResult(Ok(()))), + response: VersionedResponse::V2(Response::ExecutionResult(None)), at: 2u32.into() }), ) @@ -173,7 +176,7 @@ fn query_response_elicits_handler() { let execute = construct_extrinsic( &client, polkadot_test_runtime::Call::TestNotifier( - pallet_test_notifier::Call::prepare_new_notify_query(), + pallet_test_notifier::Call::prepare_new_notify_query {}, ), sp_keyring::Sr25519Keyring::Alice, 0, @@ -203,16 +206,16 @@ fn query_response_elicits_handler() { let mut block_builder = client.init_polkadot_block_builder(); - let response = Response::ExecutionResult(Ok(())); + let response = Response::ExecutionResult(None); let max_weight = 1_000_000; let msg = Xcm(vec![QueryResponse { query_id, response, max_weight }]); let execute = construct_extrinsic( &client, - polkadot_test_runtime::Call::Xcm(pallet_xcm::Call::execute( - Box::new(VersionedXcm::from(msg)), - 1_000_000_000, - )), + polkadot_test_runtime::Call::Xcm(pallet_xcm::Call::execute { + message: Box::new(VersionedXcm::from(msg)), + max_weight: 1_000_000_000, + }), sp_keyring::Sr25519Keyring::Alice, 1, ); @@ -234,7 +237,7 @@ fn query_response_elicits_handler() { TestNotifier(ResponseReceived( MultiLocation { parents: 0, interior: X1(Junction::AccountId32 { .. }) }, q, - Response::ExecutionResult(Ok(())), + Response::ExecutionResult(None), )) if q == query_id, ))); }); diff --git a/xcm/xcm-executor/src/assets.rs b/xcm/xcm-executor/src/assets.rs index c7049a3a6412..93a29d7af880 100644 --- a/xcm/xcm-executor/src/assets.rs +++ b/xcm/xcm-executor/src/assets.rs @@ -211,7 +211,7 @@ impl Assets { /// Returns an error unless all `assets` are contained in `self`. In the case of an error, the first asset in /// `assets` which is not wholly in `self` is returned. - fn ensure_contains(&self, assets: &MultiAssets) -> Result<(), TakeError> { + pub fn ensure_contains(&self, assets: &MultiAssets) -> Result<(), TakeError> { for asset in assets.inner().iter() { match asset { MultiAsset { fun: Fungible(ref amount), ref id } => { diff --git a/xcm/xcm-executor/src/lib.rs b/xcm/xcm-executor/src/lib.rs index 94a936c9eb0e..f252b2e7e3a3 100644 --- a/xcm/xcm-executor/src/lib.rs +++ b/xcm/xcm-executor/src/lib.rs @@ -67,11 +67,12 @@ pub const MAX_RECURSION_LIMIT: u32 = 8; impl ExecuteXcm for XcmExecutor { fn execute_xcm_in_credit( - origin: MultiLocation, + origin: impl Into, mut message: Xcm, weight_limit: Weight, mut weight_credit: Weight, ) -> Outcome { + let origin = origin.into(); log::trace!( target: "xcm::execute_xcm_in_credit", "origin: {:?}, message: {:?}, weight_limit: {:?}, weight_credit: {:?}", @@ -130,9 +131,9 @@ impl ExecuteXcm for XcmExecutor { #[derive(Debug)] pub struct ExecutorError { - index: u32, - xcm_error: XcmError, - weight: u64, + pub index: u32, + pub xcm_error: XcmError, + pub weight: u64, } #[cfg(feature = "runtime-benchmarks")] @@ -149,7 +150,8 @@ impl From for frame_benchmarking::BenchmarkError { } impl XcmExecutor { - pub fn new(origin: MultiLocation) -> Self { + pub fn new(origin: impl Into) -> Self { + let origin = origin.into(); Self { holding: Assets::new(), origin: Some(origin.clone()), @@ -268,7 +270,7 @@ impl XcmExecutor { for asset in assets.inner() { Config::AssetTransactor::beam_asset(asset, origin, &dest)?; } - assets.reanchor(&inv_dest)?; + assets.reanchor(&inv_dest).map_err(|()| XcmError::MultiLocationFull)?; let mut message = vec![ReserveAssetDeposited(assets), ClearOrigin]; message.extend(xcm.0.into_iter()); Config::XcmSender::send_xcm(dest, Xcm(message)).map_err(Into::into) @@ -343,10 +345,7 @@ impl XcmExecutor { ReportError { query_id, dest, max_response_weight: max_weight } => { // Report the given result by sending a QueryResponse XCM to a previously given outcome // destination if one was registered. - let response = Response::ExecutionResult(match self.error { - None => Ok(()), - Some(e) => Err(e), - }); + let response = Response::ExecutionResult(self.error); let message = QueryResponse { query_id, response, max_weight }; Config::XcmSender::send_xcm(dest, Xcm(vec![message]))?; Ok(()) @@ -411,14 +410,16 @@ impl XcmExecutor { Ok(()) }, SetErrorHandler(mut handler) => { - let handler_weight = Config::Weigher::weight(&mut handler)?; + let handler_weight = Config::Weigher::weight(&mut handler) + .map_err(|()| XcmError::WeightNotComputable)?; self.total_surplus.saturating_accrue(self.error_handler_weight); self.error_handler = handler; self.error_handler_weight = handler_weight; Ok(()) }, SetAppendix(mut appendix) => { - let appendix_weight = Config::Weigher::weight(&mut appendix)?; + let appendix_weight = Config::Weigher::weight(&mut appendix) + .map_err(|()| XcmError::WeightNotComputable)?; self.total_surplus.saturating_accrue(self.appendix_weight); self.appendix = appendix; self.appendix_weight = appendix_weight; diff --git a/xcm/xcm-executor/src/traits/conversion.rs b/xcm/xcm-executor/src/traits/conversion.rs index 7d2a2f50ba75..dbfb2d6a5fad 100644 --- a/xcm/xcm-executor/src/traits/conversion.rs +++ b/xcm/xcm-executor/src/traits/conversion.rs @@ -144,9 +144,9 @@ impl Convert, T> for Decoded { /// // A convertor that will bump the para id and pass it to the next one. /// struct BumpParaId; /// impl ConvertOrigin for BumpParaId { -/// fn convert_origin(origin: MultiLocation, _: OriginKind) -> Result { -/// match origin.interior() { -/// Junctions::X1(Junction::Parachain(id)) if origin.parent_count() == 0 => { +/// fn convert_origin(origin: impl Into, _: OriginKind) -> Result { +/// match origin.into() { +/// MultiLocation { parents: 0, interior: Junctions::X1(Junction::Parachain(id)) } => { /// Err(Junctions::X1(Junction::Parachain(id + 1)).into()) /// } /// _ => unreachable!() @@ -156,12 +156,12 @@ impl Convert, T> for Decoded { /// /// struct AcceptPara7; /// impl ConvertOrigin for AcceptPara7 { -/// fn convert_origin(origin: MultiLocation, _: OriginKind) -> Result { -/// match origin.interior() { -/// Junctions::X1(Junction::Parachain(id)) if id == &7 && origin.parent_count() == 0 => { +/// fn convert_origin(origin: impl Into, _: OriginKind) -> Result { +/// match origin.into() { +/// MultiLocation { parents: 0, interior: Junctions::X1(Junction::Parachain(id)) } if id == 7 => { /// Ok(7) /// } -/// _ => Err(origin) +/// o => Err(o) /// } /// } /// } @@ -175,18 +175,25 @@ impl Convert, T> for Decoded { /// ``` pub trait ConvertOrigin { /// Attempt to convert `origin` to the generic `Origin` whilst consuming it. - fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result; + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result; } #[impl_trait_for_tuples::impl_for_tuples(30)] impl ConvertOrigin for Tuple { - fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { for_tuples!( #( let origin = match Tuple::convert_origin(origin, kind) { Err(o) => o, r => return r }; )* ); + let origin = origin.into(); log::trace!( target: "xcm::convert_origin", "could not convert: origin: {:?}, kind: {:?}", diff --git a/xcm/xcm-executor/src/traits/weight.rs b/xcm/xcm-executor/src/traits/weight.rs index 5d3af4f4c141..d3da75e0c29e 100644 --- a/xcm/xcm-executor/src/traits/weight.rs +++ b/xcm/xcm-executor/src/traits/weight.rs @@ -34,7 +34,7 @@ pub trait WeightBounds { /// message. pub trait UniversalWeigher { /// Get the upper limit of weight required for `dest` to execute `message`. - fn weigh(dest: MultiLocation, message: Xcm<()>) -> Result; + fn weigh(dest: impl Into, message: Xcm<()>) -> Result; } /// Charge for weight in order to execute XCM. diff --git a/xcm/xcm-simulator/Cargo.toml b/xcm/xcm-simulator/Cargo.toml index c0219386b823..abfa5560fc0c 100644 --- a/xcm/xcm-simulator/Cargo.toml +++ b/xcm/xcm-simulator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "xcm-simulator" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] description = "Test kit to simulate cross-chain message passing and XCM execution" edition = "2018" diff --git a/xcm/xcm-simulator/example/Cargo.toml b/xcm/xcm-simulator/example/Cargo.toml index 5a8f1ac0b867..17ce84caabcd 100644 --- a/xcm/xcm-simulator/example/Cargo.toml +++ b/xcm/xcm-simulator/example/Cargo.toml @@ -1,12 +1,13 @@ [package] name = "xcm-simulator-example" -version = "0.9.9" +version = "0.9.11" authors = ["Parity Technologies "] description = "Examples of xcm-simulator usage." edition = "2018" [dependencies] codec = { package = "parity-scale-codec", version = "2.0.0" } +scale-info = { version = "1.0", features = ["derive"] } frame-system = { git = "https://github.com/paritytech/substrate", branch = "master" } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/xcm/xcm-simulator/example/src/lib.rs b/xcm/xcm-simulator/example/src/lib.rs index e93393e54d7f..2707c69c7f42 100644 --- a/xcm/xcm-simulator/example/src/lib.rs +++ b/xcm/xcm-simulator/example/src/lib.rs @@ -118,13 +118,14 @@ mod tests { fn dmp() { MockNet::reset(); - let remark = parachain::Call::System( - frame_system::Call::::remark_with_event(vec![1, 2, 3]), - ); + let remark = + parachain::Call::System(frame_system::Call::::remark_with_event { + remark: vec![1, 2, 3], + }); Relay::execute_with(|| { assert_ok!(RelayChainPalletXcm::send_xcm( Here, - Parachain(1).into(), + Parachain(1), Xcm(vec![Transact { origin_type: OriginKind::SovereignAccount, require_weight_at_most: INITIAL_BALANCE as u64, @@ -146,12 +147,12 @@ mod tests { MockNet::reset(); let remark = relay_chain::Call::System( - frame_system::Call::::remark_with_event(vec![1, 2, 3]), + frame_system::Call::::remark_with_event { remark: vec![1, 2, 3] }, ); ParaA::execute_with(|| { assert_ok!(ParachainPalletXcm::send_xcm( Here, - Parent.into(), + Parent, Xcm(vec![Transact { origin_type: OriginKind::SovereignAccount, require_weight_at_most: INITIAL_BALANCE as u64, @@ -172,13 +173,14 @@ mod tests { fn xcmp() { MockNet::reset(); - let remark = parachain::Call::System( - frame_system::Call::::remark_with_event(vec![1, 2, 3]), - ); + let remark = + parachain::Call::System(frame_system::Call::::remark_with_event { + remark: vec![1, 2, 3], + }); ParaA::execute_with(|| { assert_ok!(ParachainPalletXcm::send_xcm( Here, - MultiLocation::new(1, X1(Parachain(2))), + (Parent, Parachain(2)), Xcm(vec![Transact { origin_type: OriginKind::SovereignAccount, require_weight_at_most: INITIAL_BALANCE as u64, @@ -245,7 +247,7 @@ mod tests { }, ]); // Send withdraw and deposit - assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent.into(), message.clone())); + assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent, message.clone())); }); Relay::execute_with(|| { @@ -287,7 +289,7 @@ mod tests { }, ]); // Send withdraw and deposit with query holding - assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent.into(), message.clone(),)); + assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent, message.clone(),)); }); // Check that transfer was executed diff --git a/xcm/xcm-simulator/example/src/parachain.rs b/xcm/xcm-simulator/example/src/parachain.rs index 0d2c74f8ba7c..8d68b498ca21 100644 --- a/xcm/xcm-simulator/example/src/parachain.rs +++ b/xcm/xcm-simulator/example/src/parachain.rs @@ -219,7 +219,7 @@ pub mod mock_msg_queue { let hash = Encode::using_encoded(&xcm, T::Hashing::hash); let (result, event) = match Xcm::::try_from(xcm) { Ok(xcm) => { - let location = MultiLocation::new(1, X1(Parachain(sender.into()))); + let location = (1, Parachain(sender.into())); match T::XcmExecutor::execute_xcm(location, xcm, max_weight) { Outcome::Error(e) => (Err(e.clone()), Event::Fail(Some(hash), e)), Outcome::Complete(w) => (Ok(w), Event::Success(Some(hash))), @@ -275,7 +275,7 @@ pub mod mock_msg_queue { Self::deposit_event(Event::UnsupportedVersion(id)); }, Ok(Ok(x)) => { - let outcome = T::XcmExecutor::execute_xcm(Parent.into(), x.clone(), limit); + let outcome = T::XcmExecutor::execute_xcm(Parent, x.clone(), limit); >::append(x); Self::deposit_event(Event::ExecutedDownward(id, outcome)); }, diff --git a/xcm/xcm-simulator/example/src/relay_chain.rs b/xcm/xcm-simulator/example/src/relay_chain.rs index 3b27d800a510..cc50aec90d18 100644 --- a/xcm/xcm-simulator/example/src/relay_chain.rs +++ b/xcm/xcm-simulator/example/src/relay_chain.rs @@ -88,7 +88,9 @@ impl pallet_balances::Config for Runtime { impl shared::Config for Runtime {} -impl configuration::Config for Runtime {} +impl configuration::Config for Runtime { + type WeightInfo = configuration::weights::WeightInfo; +} parameter_types! { pub const KsmLocation: MultiLocation = Here.into(); @@ -166,6 +168,7 @@ impl ump::Config for Runtime { type Event = Event; type UmpSink = ump::XcmSink, Runtime>; type FirstMessageFactorPercent = FirstMessageFactorPercent; + type ExecuteOverweightOrigin = frame_system::EnsureRoot; } impl origin::Config for Runtime {} diff --git a/xcm/xcm-simulator/src/lib.rs b/xcm/xcm-simulator/src/lib.rs index f932fc50deb8..5e563e153dba 100644 --- a/xcm/xcm-simulator/src/lib.rs +++ b/xcm/xcm-simulator/src/lib.rs @@ -296,9 +296,10 @@ macro_rules! decl_test_network { pub struct ParachainXcmRouter($crate::PhantomData); impl> $crate::SendXcm for ParachainXcmRouter { - fn send_xcm(destination: $crate::MultiLocation, message: $crate::Xcm<()>) -> $crate::SendResult { + fn send_xcm(destination: impl Into<$crate::MultiLocation>, message: $crate::Xcm<()>) -> $crate::SendResult { use $crate::{UmpSink, XcmpMessageHandlerT}; + let destination = destination.into(); match destination.interior() { $crate::Junctions::Here if destination.parent_count() == 1 => { $crate::PARA_MESSAGE_BUS.with( @@ -320,9 +321,10 @@ macro_rules! decl_test_network { /// XCM router for relay chain. pub struct RelayChainXcmRouter; impl $crate::SendXcm for RelayChainXcmRouter { - fn send_xcm(destination: $crate::MultiLocation, message: $crate::Xcm<()>) -> $crate::SendResult { + fn send_xcm(destination: impl Into<$crate::MultiLocation>, message: $crate::Xcm<()>) -> $crate::SendResult { use $crate::DmpMessageHandlerT; + let destination = destination.into(); match destination.interior() { $( $crate::X1($crate::Parachain(id)) if *id == $para_id && destination.parent_count() == 0 => {