diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1bb6bd8333c..ee046a6a9ab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,26 +49,28 @@ jobs: non-misc-ci: ${{ steps.filter.outputs.non-misc-ci }} steps: # For pull requests it's not necessary to checkout the code - - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 - id: filter - with: - filters: | - barretenberg: - - 'barretenberg/**' - barretenberg-cpp: - - 'barretenberg/cpp/**' - noir: - - 'noir/**' - l1-contracts: - - 'l1-contracts/**' - noir-projects: - - 'noir-projects/**' - non-docs: - - '!(docs/**)' - non-misc-ci: - - '!(.github/**)' - # Always rebuild when this file changes - - .github/workflows/ci.yml + - uses: actions/checkout@v4 + with: { ref: "${{ env.GIT_COMMIT }}" } + - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 + id: filter + with: + filters: | + barretenberg: + - 'barretenberg/**' + barretenberg-cpp: + - 'barretenberg/cpp/**' + noir: + - 'noir/**' + l1-contracts: + - 'l1-contracts/**' + noir-projects: + - 'noir-projects/**' + non-docs: + - '!(docs/**)' + non-misc-ci: + - '!(.github/**)' + # Always rebuild when this file changes + - .github/workflows/ci.yml build: needs: [setup, changes] diff --git a/barretenberg/Earthfile b/barretenberg/Earthfile index 64515490646..9eff98f64c5 100644 --- a/barretenberg/Earthfile +++ b/barretenberg/Earthfile @@ -40,8 +40,6 @@ barretenberg-acir-tests-bb: RUN FLOW=prove_and_verify_ultra_honk_program ./run_acir_tests.sh # Fold and verify an ACIR program stack using ClientIvc RUN FLOW=fold_and_verify_program ./run_acir_tests.sh fold_basic - # This is a "full" Goblin flow. It constructs and verifies four proofs: MegaHonk, ECCVM, Translator, and merge - RUN FLOW=prove_and_verify_goblin ./run_acir_tests.sh 6_array # Run 1_mul through native bb build, all_cmds flow, to test all cli args. RUN FLOW=all_cmds ./run_acir_tests.sh 1_mul @@ -88,8 +86,6 @@ barretenberg-acir-tests-bb.js: RUN BIN=../ts/dest/node/main.js FLOW=prove_and_verify_ultra_honk ./run_acir_tests.sh 6_array # Run a single arbitrary test not involving recursion through bb.js for MegaHonk RUN BIN=../ts/dest/node/main.js FLOW=prove_and_verify_mega_honk ./run_acir_tests.sh 6_array - # Run a single arbitrary test not involving recursion through bb.js for full Goblin - RUN BIN=../ts/dest/node/main.js FLOW=prove_and_verify_goblin ./run_acir_tests.sh 6_array # Run 1_mul through bb.js build, all_cmds flow, to test all cli args. RUN BIN=../ts/dest/node/main.js FLOW=all_cmds ./run_acir_tests.sh 1_mul # TODO(https://github.com/AztecProtocol/aztec-packages/issues/6672) diff --git a/barretenberg/acir_tests/Dockerfile.bb.js b/barretenberg/acir_tests/Dockerfile.bb.js index dd5269e6902..c33992fc62d 100644 --- a/barretenberg/acir_tests/Dockerfile.bb.js +++ b/barretenberg/acir_tests/Dockerfile.bb.js @@ -27,8 +27,6 @@ RUN BIN=../ts/dest/node/main.js FLOW=prove_and_verify_ultra_honk ./run_acir_test RUN BIN=../ts/dest/node/main.js FLOW=prove_and_verify_mega_honk ./run_acir_tests.sh 6_array # Fold and verify an ACIR program stack RUN BIN=../ts/dest/node/main.js FLOW=fold_and_verify_program ./run_acir_tests.sh fold_basic -# Run a single arbitrary test not involving recursion through bb.js for full Goblin -RUN BIN=../ts/dest/node/main.js FLOW=prove_and_verify_goblin ./run_acir_tests.sh 6_array # Run 1_mul through bb.js build, all_cmds flow, to test all cli args. RUN BIN=../ts/dest/node/main.js FLOW=all_cmds ./run_acir_tests.sh 1_mul # TODO(https://github.com/AztecProtocol/aztec-packages/issues/6672) diff --git a/barretenberg/acir_tests/flows/prove_and_verify_goblin.sh b/barretenberg/acir_tests/flows/prove_and_verify_goblin.sh deleted file mode 100755 index 23340df80a1..00000000000 --- a/barretenberg/acir_tests/flows/prove_and_verify_goblin.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -set -eu - -VFLAG=${VERBOSE:+-v} - -$BIN prove_and_verify_goblin $VFLAG -c $CRS_PATH -b ./target/program.json - -# This command can be used to run all of the tests in sequence with the debugger -# lldb-16 -o run -b -- $BIN prove_and_verify_goblin $VFLAG -c $CRS_PATH -b ./target/program.json diff --git a/barretenberg/cpp/src/barretenberg/bb/main.cpp b/barretenberg/cpp/src/barretenberg/bb/main.cpp index 091c87ad0cb..2ee1a5e6211 100644 --- a/barretenberg/cpp/src/barretenberg/bb/main.cpp +++ b/barretenberg/cpp/src/barretenberg/bb/main.cpp @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -248,45 +247,6 @@ bool foldAndVerifyProgram(const std::string& bytecodePath, const std::string& wi return ivc.prove_and_verify(); } -/** - * @brief Proves and Verifies an ACIR circuit - * - * Communication: - * - proc_exit: A boolean value is returned indicating whether the proof is valid. - * an exit code of 0 will be returned for success and 1 for failure. - * - * @param bytecodePath Path to the file containing the serialized circuit - * @param witnessPath Path to the file containing the serialized witness - * @param recursive Whether to use recursive proof generation of non-recursive - * @return true if the proof is valid - * @return false if the proof is invalid - */ -bool proveAndVerifyGoblin(const std::string& bytecodePath, const std::string& witnessPath) -{ - // TODO(https://github.com/AztecProtocol/barretenberg/issues/811): Don't hardcode dyadic circuit size. Currently set - // to max circuit size present in acir tests suite. - size_t hardcoded_bn254_dyadic_size_hack = 1 << 19; - init_bn254_crs(hardcoded_bn254_dyadic_size_hack); - size_t hardcoded_grumpkin_dyadic_size_hack = 1 << 10; // For eccvm only - init_grumpkin_crs(hardcoded_grumpkin_dyadic_size_hack); - - // Populate the acir constraint system and witness from gzipped data - auto constraint_system = get_constraint_system(bytecodePath); - auto witness = get_witness(witnessPath); - - // Instantiate a Goblin acir composer and construct a bberg circuit from the acir representation - acir_proofs::GoblinAcirComposer acir_composer; - acir_composer.create_circuit(constraint_system, witness); - - // Generate a MegaHonk proof and a full Goblin proof - auto proof = acir_composer.accumulate_and_prove(); - - // Verify the MegaHonk proof and the full Goblin proof - auto verified = acir_composer.verify(proof); - - return verified; -} - /** * @brief Creates a proof for an ACIR circuit * @@ -867,9 +827,6 @@ int main(int argc, char* argv[]) if (command == "fold_and_verify_program") { return foldAndVerifyProgram(bytecode_path, witness_path) ? 0 : 1; } - if (command == "prove_and_verify_goblin") { - return proveAndVerifyGoblin(bytecode_path, witness_path) ? 0 : 1; - } if (command == "prove") { std::string output_path = get_option(args, "-o", "./proofs/proof"); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp index b0fe2da200e..d7ba6ba9b86 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp @@ -7,7 +7,6 @@ #include "barretenberg/common/serialize.hpp" #include "barretenberg/common/slab_allocator.hpp" #include "barretenberg/dsl/acir_format/acir_format.hpp" -#include "barretenberg/dsl/acir_proofs/goblin_acir_composer.hpp" #include "barretenberg/plonk/proof_system/proving_key/serialize.hpp" #include "barretenberg/plonk/proof_system/verification_key/verification_key.hpp" #include "barretenberg/srs/global_crs.hpp" @@ -28,11 +27,6 @@ WASM_EXPORT void acir_new_acir_composer(uint32_t const* size_hint, out_ptr out) *out = new acir_proofs::AcirComposer(ntohl(*size_hint)); } -WASM_EXPORT void acir_new_goblin_acir_composer(out_ptr out) -{ - *out = new acir_proofs::GoblinAcirComposer(); -} - WASM_EXPORT void acir_delete_acir_composer(in_ptr acir_composer_ptr) { delete reinterpret_cast(*acir_composer_ptr); @@ -122,23 +116,6 @@ WASM_EXPORT void acir_prove_and_verify_mega_honk(uint8_t const* acir_vec, uint8_ *result = verifier.verify_proof(proof); } -WASM_EXPORT void acir_goblin_prove(in_ptr acir_composer_ptr, - uint8_t const* acir_vec, - uint8_t const* witness_vec, - uint8_t** out) -{ - auto acir_composer = reinterpret_cast(*acir_composer_ptr); - auto constraint_system = acir_format::circuit_buf_to_acir_format(from_buffer>(acir_vec)); - auto witness = acir_format::witness_buf_to_witness_data(from_buffer>(witness_vec)); - - acir_composer->create_circuit(constraint_system, witness); - auto proof = acir_composer->accumulate_and_prove(); - auto proof_data_buf = to_buffer( - proof); // template parameter needs to be set so that vector deserialization from - // buffer, which reads the size at the beginning can be done properly - *out = to_heap_buffer(proof_data_buf); -} - WASM_EXPORT void acir_load_verification_key(in_ptr acir_composer_ptr, uint8_t const* vk_buf) { auto acir_composer = reinterpret_cast(*acir_composer_ptr); @@ -170,14 +147,6 @@ WASM_EXPORT void acir_get_proving_key(in_ptr acir_composer_ptr, uint8_t const* a *out = to_heap_buffer(to_buffer(*pk)); } -WASM_EXPORT void acir_goblin_verify(in_ptr acir_composer_ptr, uint8_t const* proof_buf, bool* result) -{ - auto acir_composer = reinterpret_cast(*acir_composer_ptr); - auto proof_data_buf = from_buffer>(proof_buf); - auto proof = from_buffer>(proof_data_buf); - *result = acir_composer->verify(proof); -} - WASM_EXPORT void acir_verify_proof(in_ptr acir_composer_ptr, uint8_t const* proof_buf, bool* result) { auto acir_composer = reinterpret_cast(*acir_composer_ptr); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp index 78f6eae51e7..72d856cc94d 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp @@ -13,8 +13,6 @@ WASM_EXPORT void acir_get_circuit_sizes(uint8_t const* constraint_system_buf, WASM_EXPORT void acir_new_acir_composer(uint32_t const* size_hint, out_ptr out); -WASM_EXPORT void acir_new_goblin_acir_composer(out_ptr out); - WASM_EXPORT void acir_delete_acir_composer(in_ptr acir_composer_ptr); WASM_EXPORT void acir_create_circuit(in_ptr acir_composer_ptr, @@ -57,16 +55,6 @@ WASM_EXPORT void acir_fold_and_verify_program_stack(uint8_t const* constraint_sy uint8_t const* witness_buf, bool* result); -/** - * @brief Construct a full goblin proof - * @details Makes a call to accumulate to a final circuit before constructing a Goblin proof - * - */ -WASM_EXPORT void acir_goblin_prove(in_ptr acir_composer_ptr, - uint8_t const* constraint_system_buf, - uint8_t const* witness_buf, - uint8_t** out); - WASM_EXPORT void acir_load_verification_key(in_ptr acir_composer_ptr, uint8_t const* vk_buf); WASM_EXPORT void acir_init_verification_key(in_ptr acir_composer_ptr); @@ -77,12 +65,6 @@ WASM_EXPORT void acir_get_proving_key(in_ptr acir_composer_ptr, uint8_t const* a WASM_EXPORT void acir_verify_proof(in_ptr acir_composer_ptr, uint8_t const* proof_buf, bool* result); -/** - * @brief Verifies a full goblin proof (and the MegaHonk proof produced by accumulation) - * - */ -WASM_EXPORT void acir_goblin_verify(in_ptr acir_composer_ptr, uint8_t const* proof_buf, bool* result); - WASM_EXPORT void acir_get_solidity_verifier(in_ptr acir_composer_ptr, out_str_buf out); WASM_EXPORT void acir_serialize_proof_into_fields(in_ptr acir_composer_ptr, diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/goblin_acir_composer.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/goblin_acir_composer.cpp deleted file mode 100644 index 3b4561697be..00000000000 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/goblin_acir_composer.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "goblin_acir_composer.hpp" -#include "barretenberg/common/throw_or_abort.hpp" -#include "barretenberg/dsl/acir_format/acir_format.hpp" -#include "barretenberg/dsl/types.hpp" -#include "barretenberg/goblin/mock_circuits.hpp" - -namespace acir_proofs { - -void GoblinAcirComposer::create_circuit(acir_format::AcirFormat& constraint_system, acir_format::WitnessVector& witness) -{ - // Construct a builder using the witness and public input data from acir and with the goblin-owned op_queue - builder_ = acir_format::GoblinBuilder{ - goblin.op_queue, witness, constraint_system.public_inputs, constraint_system.varnum - }; - - // Populate constraints in the builder via the data in constraint_system - acir_format::build_constraints(builder_, constraint_system, true); - - // TODO(https://github.com/AztecProtocol/barretenberg/issues/817): Add some arbitrary op gates to ensure the - // to give ECCVM and Translator some ECC ops to process. - MockCircuits::construct_goblin_ecc_op_circuit(builder_); -} - -std::vector GoblinAcirComposer::accumulate_and_prove() -{ - // Construct one final MegaHonk proof via the accumulate mechanism - std::vector ultra_proof = goblin.accumulate_for_acir(builder_); - - // Construct a Goblin proof (ECCVM, Translator, Merge); result stored internally - goblin.prove_for_acir(); - - return ultra_proof; -} - -bool GoblinAcirComposer::verify(std::vector const& proof) -{ - // Verify the final MegaHonk proof - bool ultra_verified = goblin.verify_accumulator_for_acir(proof); - - // Verify the Goblin proof (ECCVM, Translator, Merge) - bool goblin_verified = goblin.verify_for_acir(); - - return ultra_verified && goblin_verified; -} - -} // namespace acir_proofs diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/goblin_acir_composer.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/goblin_acir_composer.hpp deleted file mode 100644 index 4451c875653..00000000000 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/goblin_acir_composer.hpp +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once -#include -#include - -namespace acir_proofs { - -/** - * @brief A class responsible for marshalling construction of keys and prover and verifier instances used to prove - * satisfiability of circuits written in ACIR. - * - */ -class GoblinAcirComposer { - - using WitnessVector = std::vector>; - - public: - GoblinAcirComposer() = default; - - /** - * @brief Create a MegaHonk circuit from an acir constraint system and a witness - * - * @param constraint_system ACIR representation of the constraints defining the circuit - * @param witness The witness values known to ACIR during construction of the constraint system - */ - void create_circuit(acir_format::AcirFormat& constraint_system, acir_format::WitnessVector& witness); - - /** - * @brief Accumulate a final circuit and construct a full Goblin proof - * @details Accumulation means constructing a MegaHonk proof of a single (final) circuit. A full Goblin proof - * consists of a merge proof, an ECCVM proof and a Translator proof. The Goblin proof is only constructed at the end - * of the accumulation phase and establishes the correctness of the ECC operations written to the op queue - * throughout the accumulation phase. - * - */ - std::vector accumulate_and_prove(); - - /** - * @brief Verify the final MegaHonk proof and the full Goblin proof - * - * @return bool verified - */ - bool verify(std::vector const& proof); - - private: - acir_format::GoblinBuilder builder_; - Goblin goblin; - bool verbose_ = true; - - template inline void vinfo(Args... args) - { - if (verbose_) { - info(args...); - } - } -}; - -} // namespace acir_proofs diff --git a/barretenberg/exports.json b/barretenberg/exports.json index 080b6c0ca4c..59d5091bd2f 100644 --- a/barretenberg/exports.json +++ b/barretenberg/exports.json @@ -534,17 +534,6 @@ ], "isAsync": false }, - { - "functionName": "acir_new_goblin_acir_composer", - "inArgs": [], - "outArgs": [ - { - "name": "out", - "type": "out_ptr" - } - ], - "isAsync": false - }, { "functionName": "acir_delete_acir_composer", "inArgs": [ @@ -674,30 +663,6 @@ ], "isAsync": false }, - { - "functionName": "acir_goblin_prove", - "inArgs": [ - { - "name": "acir_composer_ptr", - "type": "in_ptr" - }, - { - "name": "constraint_system_buf", - "type": "const uint8_t *" - }, - { - "name": "witness_buf", - "type": "const uint8_t *" - } - ], - "outArgs": [ - { - "name": "out", - "type": "uint8_t **" - } - ], - "isAsync": false - }, { "functionName": "acir_load_verification_key", "inArgs": [ @@ -780,26 +745,6 @@ ], "isAsync": false }, - { - "functionName": "acir_goblin_verify", - "inArgs": [ - { - "name": "acir_composer_ptr", - "type": "in_ptr" - }, - { - "name": "proof_buf", - "type": "const uint8_t *" - } - ], - "outArgs": [ - { - "name": "result", - "type": "bool *" - } - ], - "isAsync": false - }, { "functionName": "acir_get_solidity_verifier", "inArgs": [ diff --git a/barretenberg/ts/src/barretenberg_api/index.ts b/barretenberg/ts/src/barretenberg_api/index.ts index 619c89b8f21..a5caf50e16c 100644 --- a/barretenberg/ts/src/barretenberg_api/index.ts +++ b/barretenberg/ts/src/barretenberg_api/index.ts @@ -352,18 +352,6 @@ export class BarretenbergApi { return out[0]; } - async acirNewGoblinAcirComposer(): Promise { - const inArgs = [].map(serializeBufferable); - const outTypes: OutputType[] = [Ptr]; - const result = await this.wasm.callWasmExport( - 'acir_new_goblin_acir_composer', - inArgs, - outTypes.map(t => t.SIZE_IN_BYTES), - ); - const out = result.map((r, i) => outTypes[i].fromBuffer(r)); - return out[0]; - } - async acirDeleteAcirComposer(acirComposerPtr: Ptr): Promise { const inArgs = [acirComposerPtr].map(serializeBufferable); const outTypes: OutputType[] = []; @@ -452,22 +440,6 @@ export class BarretenbergApi { return out[0]; } - async acirGoblinProve( - acirComposerPtr: Ptr, - constraintSystemBuf: Uint8Array, - witnessBuf: Uint8Array, - ): Promise { - const inArgs = [acirComposerPtr, constraintSystemBuf, witnessBuf].map(serializeBufferable); - const outTypes: OutputType[] = [BufferDeserializer()]; - const result = await this.wasm.callWasmExport( - 'acir_goblin_prove', - inArgs, - outTypes.map(t => t.SIZE_IN_BYTES), - ); - const out = result.map((r, i) => outTypes[i].fromBuffer(r)); - return out[0]; - } - async acirLoadVerificationKey(acirComposerPtr: Ptr, vkBuf: Uint8Array): Promise { const inArgs = [acirComposerPtr, vkBuf].map(serializeBufferable); const outTypes: OutputType[] = []; @@ -528,18 +500,6 @@ export class BarretenbergApi { return out[0]; } - async acirGoblinVerify(acirComposerPtr: Ptr, proofBuf: Uint8Array): Promise { - const inArgs = [acirComposerPtr, proofBuf].map(serializeBufferable); - const outTypes: OutputType[] = [BoolDeserializer()]; - const result = await this.wasm.callWasmExport( - 'acir_goblin_verify', - inArgs, - outTypes.map(t => t.SIZE_IN_BYTES), - ); - const out = result.map((r, i) => outTypes[i].fromBuffer(r)); - return out[0]; - } - async acirGetSolidityVerifier(acirComposerPtr: Ptr): Promise { const inArgs = [acirComposerPtr].map(serializeBufferable); const outTypes: OutputType[] = [StringDeserializer()]; @@ -980,18 +940,6 @@ export class BarretenbergApiSync { return out[0]; } - acirNewGoblinAcirComposer(): Ptr { - const inArgs = [].map(serializeBufferable); - const outTypes: OutputType[] = [Ptr]; - const result = this.wasm.callWasmExport( - 'acir_new_goblin_acir_composer', - inArgs, - outTypes.map(t => t.SIZE_IN_BYTES), - ); - const out = result.map((r, i) => outTypes[i].fromBuffer(r)); - return out[0]; - } - acirDeleteAcirComposer(acirComposerPtr: Ptr): void { const inArgs = [acirComposerPtr].map(serializeBufferable); const outTypes: OutputType[] = []; @@ -1076,18 +1024,6 @@ export class BarretenbergApiSync { return out[0]; } - acirGoblinProve(acirComposerPtr: Ptr, constraintSystemBuf: Uint8Array, witnessBuf: Uint8Array): Uint8Array { - const inArgs = [acirComposerPtr, constraintSystemBuf, witnessBuf].map(serializeBufferable); - const outTypes: OutputType[] = [BufferDeserializer()]; - const result = this.wasm.callWasmExport( - 'acir_goblin_prove', - inArgs, - outTypes.map(t => t.SIZE_IN_BYTES), - ); - const out = result.map((r, i) => outTypes[i].fromBuffer(r)); - return out[0]; - } - acirLoadVerificationKey(acirComposerPtr: Ptr, vkBuf: Uint8Array): void { const inArgs = [acirComposerPtr, vkBuf].map(serializeBufferable); const outTypes: OutputType[] = []; @@ -1148,18 +1084,6 @@ export class BarretenbergApiSync { return out[0]; } - acirGoblinVerify(acirComposerPtr: Ptr, proofBuf: Uint8Array): boolean { - const inArgs = [acirComposerPtr, proofBuf].map(serializeBufferable); - const outTypes: OutputType[] = [BoolDeserializer()]; - const result = this.wasm.callWasmExport( - 'acir_goblin_verify', - inArgs, - outTypes.map(t => t.SIZE_IN_BYTES), - ); - const out = result.map((r, i) => outTypes[i].fromBuffer(r)); - return out[0]; - } - acirGetSolidityVerifier(acirComposerPtr: Ptr): string { const inArgs = [acirComposerPtr].map(serializeBufferable); const outTypes: OutputType[] = [StringDeserializer()]; diff --git a/barretenberg/ts/src/main.ts b/barretenberg/ts/src/main.ts index ada83203b08..448360b96d7 100755 --- a/barretenberg/ts/src/main.ts +++ b/barretenberg/ts/src/main.ts @@ -6,7 +6,6 @@ import { gunzipSync } from 'zlib'; import { Command } from 'commander'; import { Timer, writeBenchmark } from './benchmark/index.js'; import path from 'path'; -import { GrumpkinCrs } from './crs/node/index.js'; createDebug.log = console.error.bind(console); const debug = createDebug('bb.js'); @@ -78,21 +77,6 @@ async function init(bytecodePath: string, crsPath: string, subgroupSizeOverride return { api, acirComposer, circuitSize, subgroupSize }; } -async function initGoblin(bytecodePath: string, crsPath: string) { - // TODO(https://github.com/AztecProtocol/barretenberg/issues/811): remove this subgroup size hack - const hardcodedGrumpkinSubgroupSizeHack = 262144; - const initData = await init(bytecodePath, crsPath, hardcodedGrumpkinSubgroupSizeHack); - const { api } = initData; - initData.acirComposer = await api.acirNewGoblinAcirComposer(); - - // Plus 1 needed! (Move +1 into Crs?) - // Need both grumpkin and bn254 SRS's currently - const grumpkinCrs = await GrumpkinCrs.new(hardcodedGrumpkinSubgroupSizeHack + 1, crsPath); - await api.srsInitGrumpkinSrs(new RawBuffer(grumpkinCrs.getG1Data()), grumpkinCrs.numPoints); - - return initData; -} - async function initLite() { const api = await Barretenberg.new({ threads: 1 }); @@ -181,34 +165,6 @@ export async function foldAndVerifyProgram(bytecodePath: string, witnessPath: st /* eslint-enable camelcase */ } -export async function proveAndVerifyGoblin(bytecodePath: string, witnessPath: string, crsPath: string) { - /* eslint-disable camelcase */ - const acir_test = path.basename(process.cwd()); - - const { api, acirComposer, circuitSize, subgroupSize } = await initGoblin(bytecodePath, crsPath); - try { - debug(`creating proof...`); - const bytecode = getBytecode(bytecodePath); - const witness = getWitness(witnessPath); - - writeBenchmark('gate_count', circuitSize, { acir_test, threads }); - writeBenchmark('subgroup_size', subgroupSize, { acir_test, threads }); - - const proofTimer = new Timer(); - const proof = await api.acirGoblinProve(acirComposer, bytecode, witness); - writeBenchmark('proof_construction_time', proofTimer.ms(), { acir_test, threads }); - - debug(`verifying...`); - const verified = await api.acirGoblinVerify(acirComposer, proof); - debug(`verified: ${verified}`); - console.log({ verified }); - return verified; - } finally { - await api.destroy(); - } - /* eslint-enable camelcase */ -} - export async function prove(bytecodePath: string, witnessPath: string, crsPath: string, outputPath: string) { const { api, acirComposer } = await init(bytecodePath, crsPath); try { @@ -518,17 +474,6 @@ program process.exit(result ? 0 : 1); }); -program - .command('prove_and_verify_goblin') - .description('Generate a Goblin proof and verify it. Process exits with success or failure code.') - .option('-b, --bytecode-path ', 'Specify the bytecode path', './target/program.json') - .option('-w, --witness-path ', 'Specify the witness path', './target/witness.gz') - .action(async ({ bytecodePath, witnessPath, crsPath }) => { - handleGlobalOptions(); - const result = await proveAndVerifyGoblin(bytecodePath, witnessPath, crsPath); - process.exit(result ? 0 : 1); - }); - program .command('prove') .description('Generate a proof and write it to a file.') diff --git a/boxes/boxes/react/src/contracts/src/main.nr b/boxes/boxes/react/src/contracts/src/main.nr index 235517c03e4..e3665ad336f 100644 --- a/boxes/boxes/react/src/contracts/src/main.nr +++ b/boxes/boxes/react/src/contracts/src/main.nr @@ -11,17 +11,29 @@ contract BoxReact { #[aztec(private)] #[aztec(initializer)] - fn constructor(number: Field, owner: AztecAddress, owner_npk_m_hash: Field, owner_ivpk_m: GrumpkinPoint) { + fn constructor( + number: Field, + owner: AztecAddress, + owner_npk_m_hash: Field, + owner_ovpk_m: GrumpkinPoint, + owner_ivpk_m: GrumpkinPoint + ) { let numbers = storage.numbers; let mut new_number = ValueNote::new(number, owner_npk_m_hash); - numbers.at(owner).initialize(&mut new_number, true, owner_ivpk_m); + numbers.at(owner).initialize(&mut new_number, true, owner_ovpk_m, owner_ivpk_m); } #[aztec(private)] - fn setNumber(number: Field, owner: AztecAddress, owner_npk_m_hash: Field, owner_ivpk_m: GrumpkinPoint) { + fn setNumber( + number: Field, + owner: AztecAddress, + owner_npk_m_hash: Field, + owner_ovpk_m: GrumpkinPoint, + owner_ivpk_m: GrumpkinPoint + ) { let numbers = storage.numbers; let mut new_number = ValueNote::new(number, owner_npk_m_hash); - numbers.at(owner).replace(&mut new_number, true, owner_ivpk_m); + numbers.at(owner).replace(&mut new_number, true, owner_ovpk_m, owner_ivpk_m); } unconstrained fn getNumber(owner: AztecAddress) -> pub ValueNote { diff --git a/boxes/boxes/react/src/hooks/useContract.tsx b/boxes/boxes/react/src/hooks/useContract.tsx index dfd59c290ef..bb67706b33d 100644 --- a/boxes/boxes/react/src/hooks/useContract.tsx +++ b/boxes/boxes/react/src/hooks/useContract.tsx @@ -15,7 +15,16 @@ export function useContract() { setWait(true); const wallet = await deployerEnv.getWallet(); const salt = Fr.random(); - const tx = await BoxReactContract.deploy(wallet, Fr.random(), wallet.getCompleteAddress().address, wallet.getCompleteAddress().publicKeys.masterNullifierPublicKey.hash(), wallet.getCompleteAddress().publicKeys.masterIncomingViewingPublicKey).send({ + const { masterNullifierPublicKey, masterIncomingViewingPublicKey, masterOutgoingViewingPublicKey } = + wallet.getCompleteAddress().publicKeys; + const tx = await BoxReactContract.deploy( + wallet, + Fr.random(), + wallet.getCompleteAddress().address, + masterNullifierPublicKey.hash(), + masterOutgoingViewingPublicKey, + masterIncomingViewingPublicKey, + ).send({ contractAddressSalt: salt, }); const contract = await toast.promise(tx.deployed(), { diff --git a/boxes/boxes/react/src/hooks/useNumber.tsx b/boxes/boxes/react/src/hooks/useNumber.tsx index c9331294b21..17febf96388 100644 --- a/boxes/boxes/react/src/hooks/useNumber.tsx +++ b/boxes/boxes/react/src/hooks/useNumber.tsx @@ -25,11 +25,25 @@ export function useNumber({ contract }: { contract: Contract }) { const value = BigInt(el.value); const deployerWallet = await deployerEnv.getWallet(); - await toast.promise(contract!.methods.setNumber(value, deployerWallet.getCompleteAddress().address, deployerWallet.getCompleteAddress().publicKeys.masterNullifierPublicKey.hash(), deployerWallet.getCompleteAddress().publicKeys.masterIncomingViewingPublicKey).send().wait(), { - pending: 'Setting number...', - success: `Number set to: ${value}`, - error: 'Error setting number', - }); + const { masterNullifierPublicKey, masterIncomingViewingPublicKey, masterOutgoingViewingPublicKey } = + deployerWallet.getCompleteAddress().publicKeys; + await toast.promise( + contract!.methods + .setNumber( + value, + deployerWallet.getCompleteAddress().address, + masterNullifierPublicKey.hash(), + masterOutgoingViewingPublicKey, + masterIncomingViewingPublicKey, + ) + .send() + .wait(), + { + pending: 'Setting number...', + success: `Number set to: ${value}`, + error: 'Error setting number', + }, + ); setWait(false); } }; diff --git a/boxes/boxes/react/tests/node.test.ts b/boxes/boxes/react/tests/node.test.ts index 735baadaf30..94b863d567d 100644 --- a/boxes/boxes/react/tests/node.test.ts +++ b/boxes/boxes/react/tests/node.test.ts @@ -1,5 +1,5 @@ +import { AccountWallet, CompleteAddress, Contract, Fr, createDebugLogger } from '@aztec/aztec.js'; import { BoxReactContract } from '../artifacts/BoxReact.js'; -import { AccountWallet, Fr, Contract, TxStatus, createDebugLogger, ContractDeployer } from '@aztec/aztec.js'; import { deployerEnv } from '../src/config.js'; const logger = createDebugLogger('aztec:http-pxe-client'); @@ -8,11 +8,22 @@ describe('BoxReact Contract Tests', () => { let wallet: AccountWallet; let contract: Contract; const numberToSet = Fr.random(); + let accountCompleteAddress: CompleteAddress; beforeAll(async () => { wallet = await deployerEnv.getWallet(); + accountCompleteAddress = wallet.getCompleteAddress(); const salt = Fr.random(); - contract = await BoxReactContract.deploy(wallet, Fr.random(), wallet.getCompleteAddress().address, wallet.getCompleteAddress().publicKeys.masterNullifierPublicKey.hash(), wallet.getCompleteAddress().publicKeys.masterIncomingViewingPublicKey) + const { masterNullifierPublicKey, masterIncomingViewingPublicKey, masterOutgoingViewingPublicKey } = + accountCompleteAddress.publicKeys; + contract = await BoxReactContract.deploy( + wallet, + Fr.random(), + accountCompleteAddress.address, + masterNullifierPublicKey.hash(), + masterOutgoingViewingPublicKey, + masterIncomingViewingPublicKey, + ) .send({ contractAddressSalt: salt }) .deployed(); @@ -21,11 +32,22 @@ describe('BoxReact Contract Tests', () => { test('Can set a number', async () => { logger.info(`${await wallet.getRegisteredAccounts()}`); - await contract.methods.setNumber(numberToSet, wallet.getCompleteAddress().address, wallet.getCompleteAddress().publicKeys.masterNullifierPublicKey.hash(), wallet.getCompleteAddress().publicKeys.masterIncomingViewingPublicKey).send().wait(); + const { masterNullifierPublicKey, masterIncomingViewingPublicKey, masterOutgoingViewingPublicKey } = + accountCompleteAddress.publicKeys; + await contract.methods + .setNumber( + numberToSet, + accountCompleteAddress.address, + masterNullifierPublicKey.hash(), + masterOutgoingViewingPublicKey, + masterIncomingViewingPublicKey, + ) + .send() + .wait(); }, 40000); test('Can read a number', async () => { - const viewTxReceipt = await contract.methods.getNumber(wallet.getCompleteAddress().address).simulate(); + const viewTxReceipt = await contract.methods.getNumber(accountCompleteAddress.address).simulate(); expect(numberToSet.toBigInt()).toEqual(viewTxReceipt.value); }, 40000); }); diff --git a/boxes/boxes/vanilla/src/contracts/src/main.nr b/boxes/boxes/vanilla/src/contracts/src/main.nr index 8b68850741a..86aec333987 100644 --- a/boxes/boxes/vanilla/src/contracts/src/main.nr +++ b/boxes/boxes/vanilla/src/contracts/src/main.nr @@ -11,17 +11,17 @@ contract Vanilla { #[aztec(private)] #[aztec(initializer)] - fn constructor(number: Field, owner: AztecAddress, owner_npk_m_hash: Field, owner_ivpk_m: GrumpkinPoint) { + fn constructor(number: Field, owner: AztecAddress, owner_npk_m_hash: Field, owner_ovpk_m: GrumpkinPoint, owner_ivpk_m: GrumpkinPoint) { let numbers = storage.numbers; let mut new_number = ValueNote::new(number, owner_npk_m_hash); - numbers.at(owner).initialize(&mut new_number, true, owner_ivpk_m); + numbers.at(owner).initialize(&mut new_number, true, owner_ovpk_m, owner_ivpk_m); } #[aztec(private)] - fn setNumber(number: Field, owner: AztecAddress, owner_npk_m_hash: Field, owner_ivpk_m: GrumpkinPoint) { + fn setNumber(number: Field, owner: AztecAddress, owner_npk_m_hash: Field, owner_ovpk_m: GrumpkinPoint, owner_ivpk_m: GrumpkinPoint) { let numbers = storage.numbers; let mut new_number = ValueNote::new(number, owner_npk_m_hash); - numbers.at(owner).replace(&mut new_number, true, owner_ivpk_m); + numbers.at(owner).replace(&mut new_number, true, owner_ovpk_m, owner_ivpk_m); } unconstrained fn getNumber(owner: AztecAddress) -> pub ValueNote { diff --git a/boxes/boxes/vanilla/src/index.ts b/boxes/boxes/vanilla/src/index.ts index f712c9fdcaf..dccd859c4b4 100644 --- a/boxes/boxes/vanilla/src/index.ts +++ b/boxes/boxes/vanilla/src/index.ts @@ -20,7 +20,16 @@ const setWait = (state: boolean): void => document.querySelector('#deploy').addEventListener('click', async ({ target }: any) => { setWait(true); wallet = await account.register(); - contract = await VanillaContract.deploy(wallet, Fr.random(), wallet.getCompleteAddress().address, wallet.getCompleteAddress().publicKeys.masterNullifierPublicKey.hash(), wallet.getCompleteAddress().publicKeys.masterIncomingViewingPublicKey) + const { masterNullifierPublicKey, masterIncomingViewingPublicKey, masterOutgoingViewingPublicKey } = + wallet.getCompleteAddress().publicKeys; + contract = await VanillaContract.deploy( + wallet, + Fr.random(), + wallet.getCompleteAddress().address, + masterNullifierPublicKey.hash(), + masterOutgoingViewingPublicKey, + masterIncomingViewingPublicKey, + ) .send({ contractAddressSalt: Fr.random() }) .deployed(); alert(`Contract deployed at ${contract.address}`); @@ -36,7 +45,17 @@ document.querySelector('#set').addEventListener('submit', async (e: Event) => { const { value } = document.querySelector('#number') as HTMLInputElement; const { address: owner, publicKeys } = wallet.getCompleteAddress(); - await contract.methods.setNumber(parseInt(value), owner, publicKeys.masterNullifierPublicKey.hash(), publicKeys.masterIncomingViewingPublicKey).send().wait(); + const { masterNullifierPublicKey, masterIncomingViewingPublicKey, masterOutgoingViewingPublicKey } = publicKeys; + await contract.methods + .setNumber( + parseInt(value), + owner, + masterNullifierPublicKey.hash(), + masterOutgoingViewingPublicKey, + masterIncomingViewingPublicKey, + ) + .send() + .wait(); setWait(false); alert('Number set!'); diff --git a/noir-projects/aztec-nr/address-note/src/address_note.nr b/noir-projects/aztec-nr/address-note/src/address_note.nr index 0b823862832..32b13d77402 100644 --- a/noir-projects/aztec-nr/address-note/src/address_note.nr +++ b/noir-projects/aztec-nr/address-note/src/address_note.nr @@ -44,12 +44,13 @@ impl NoteInterface for AddressNote { } // Broadcasts the note as an encrypted log on L1. - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) { + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) { // docs:start:encrypted context.encrypt_and_emit_note( (*context).this_address(), slot, Self::get_note_type_id(), + ovpk_m, ivpk_m, self, ); diff --git a/noir-projects/aztec-nr/aztec/src/context/private_context.nr b/noir-projects/aztec-nr/aztec/src/context/private_context.nr index 8fdf2120805..5d536fc4387 100644 --- a/noir-projects/aztec-nr/aztec/src/context/private_context.nr +++ b/noir-projects/aztec-nr/aztec/src/context/private_context.nr @@ -310,12 +310,23 @@ impl PrivateContext { contract_address: AztecAddress, randomness: Field, // Secret random value used later for masked_contract_address event_type_id: Field, + ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint, preimage: [Field; N] ) where [Field; N]: LensForEncryptedLog { + let ovsk_app = self.request_ovsk_app(ovpk_m.hash()); + // We are currently just encrypting it EXACTLY the same way as if it was a note. let counter = self.next_counter(); - let encrypted_log: [u8; M] = compute_encrypted_log(contract_address, randomness, event_type_id, ivpk_m, preimage); + let encrypted_log: [u8; M] = compute_encrypted_log( + contract_address, + randomness, + event_type_id, + ovsk_app, + ovpk_m, + ivpk_m, + preimage + ); emit_encrypted_log(contract_address, randomness, encrypted_log, counter); let len = 32 + 32 + 64 + 48 + 48 + 176 + 64 + (preimage.len() as Field * 32) + 16 + 4; let log_hash = sha256_to_field(encrypted_log); @@ -328,6 +339,7 @@ impl PrivateContext { contract_address: AztecAddress, storage_slot: Field, note_type_id: Field, + ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint, note: Note ) where Note: NoteInterface, [Field; N]: LensForEncryptedLog { @@ -343,8 +355,18 @@ impl PrivateContext { let preimage = note.serialize_content(); let counter = self.next_counter(); + let ovsk_app = self.request_ovsk_app(ovpk_m.hash()); + // TODO(#1139 | #6408): perform encryption in the circuit - let encrypted_log: [u8; M] = compute_encrypted_log(contract_address, storage_slot, note_type_id, ivpk_m, preimage); + let encrypted_log: [u8; M] = compute_encrypted_log( + contract_address, + storage_slot, + note_type_id, + ovsk_app, + ovpk_m, + ivpk_m, + preimage + ); emit_encrypted_note_log(note_hash, encrypted_log, counter); // Current unoptimized size of the encrypted log @@ -696,6 +718,7 @@ impl Empty for PrivateContext { } } +// TODO(#6640)): This should be in its own file struct PackedReturns { packed_returns: Field, } @@ -725,6 +748,7 @@ impl PackedReturns { } } +// TODO(#6640)): This should not be here but in oracle folder #[oracle(emitUnencryptedLog)] fn emit_unencrypted_log_oracle_private( _contract_address: AztecAddress, diff --git a/noir-projects/aztec-nr/aztec/src/encrypted_logs/incoming_body.nr b/noir-projects/aztec-nr/aztec/src/encrypted_logs/incoming_body.nr index a85543e1ab7..80e6ff01eec 100644 --- a/noir-projects/aztec-nr/aztec/src/encrypted_logs/incoming_body.nr +++ b/noir-projects/aztec-nr/aztec/src/encrypted_logs/incoming_body.nr @@ -62,7 +62,7 @@ mod test { fn compute_nullifier_without_context(self) -> Field {1} - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) {} + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) {} fn serialize_content(self) -> [Field; ADDRESS_NOTE_LEN] { [self.address.to_field(), self.owner.to_field(), self.randomness]} diff --git a/noir-projects/aztec-nr/aztec/src/keys/getters.nr b/noir-projects/aztec-nr/aztec/src/keys/getters.nr index 16465a4eaec..f151bb46f4a 100644 --- a/noir-projects/aztec-nr/aztec/src/keys/getters.nr +++ b/noir-projects/aztec-nr/aztec/src/keys/getters.nr @@ -6,7 +6,7 @@ use dep::protocol_types::{ use crate::{ context::PrivateContext, oracle::{keys::get_public_keys_and_partial_address, key_validation_request::get_key_validation_request}, - keys::{public_keys::PublicKeys, constants::{NULLIFIER_INDEX, INCOMING_INDEX}}, + keys::{public_keys::PublicKeys, constants::{NULLIFIER_INDEX, INCOMING_INDEX, OUTGOING_INDEX}}, state_vars::{shared_mutable::shared_mutable_private_getter::SharedMutablePrivateGetter} }; @@ -14,33 +14,34 @@ global DELAY = 5; // docs:start:key-getters trait KeyGetters { - fn get_ivpk_m(header: Header, context: &mut PrivateContext, address: AztecAddress) -> GrumpkinPoint; fn get_npk_m(header: Header, context: &mut PrivateContext, address: AztecAddress) -> GrumpkinPoint; + fn get_ivpk_m(header: Header, context: &mut PrivateContext, address: AztecAddress) -> GrumpkinPoint; + fn get_ovpk_m(header: Header, context: &mut PrivateContext, address: AztecAddress) -> GrumpkinPoint; +// fn get_tpk_m(header: Header, context: &mut PrivateContext, address: AztecAddress) -> GrumpkinPoint; fn get_npk_m_hash(header: Header, context: &mut PrivateContext, address: AztecAddress) -> Field; } impl KeyGetters for Header { + fn get_npk_m(self, context: &mut PrivateContext, address: AztecAddress) -> GrumpkinPoint { + get_master_key(context, address, NULLIFIER_INDEX, self) + } + fn get_ivpk_m(self, context: &mut PrivateContext, address: AztecAddress) -> GrumpkinPoint { get_master_key(context, address, INCOMING_INDEX, self) } - fn get_npk_m_hash(self, context: &mut PrivateContext, address: AztecAddress) -> Field { - get_master_key(context, address, NULLIFIER_INDEX, self).hash() + fn get_ovpk_m(self, context: &mut PrivateContext, address: AztecAddress) -> GrumpkinPoint { + get_master_key(context, address, OUTGOING_INDEX, self) } - fn get_npk_m(self, context: &mut PrivateContext, address: AztecAddress) -> GrumpkinPoint { - get_master_key(context, address, NULLIFIER_INDEX, self) + // fn get_tpk_m(self, context: &mut PrivateContext, address: AztecAddress) -> GrumpkinPoint { + // get_master_key(context, address, TAGGING_INDEX, self) + // } + + fn get_npk_m_hash(self, context: &mut PrivateContext, address: AztecAddress) -> Field { + get_master_key(context, address, NULLIFIER_INDEX, self).hash() } } - -// Commented out as it's currently not enabled in key registry -// pub fn get_ovpk_m(context: &mut PrivateContext, address: AztecAddress) -> GrumpkinPoint { -// get_master_key(context, address, OUTGOING_INDEX) -// } -// -// pub fn get_tpk_m(context: &mut PrivateContext, address: AztecAddress) -> GrumpkinPoint { -// get_master_key(context, address, TAGGING_INDEX) -// } // docs:end:key-getters fn get_master_key( diff --git a/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr b/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr index 17ec0efbab0..df5d98f63c3 100644 --- a/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr +++ b/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr @@ -11,6 +11,7 @@ pub fn create_note( storage_slot: Field, note: &mut Note, broadcast: bool, + ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint ) where Note: NoteInterface { let contract_address = (*context).this_address(); @@ -38,7 +39,7 @@ pub fn create_note( context.push_new_note_hash(inner_note_hash); if broadcast { - Note::broadcast(*note, context, storage_slot, ivpk_m); + Note::broadcast(*note, context, storage_slot, ovpk_m, ivpk_m); } } diff --git a/noir-projects/aztec-nr/aztec/src/note/note_interface.nr b/noir-projects/aztec-nr/aztec/src/note/note_interface.nr index ab2dfbd69dd..03bfd1c4ff7 100644 --- a/noir-projects/aztec-nr/aztec/src/note/note_interface.nr +++ b/noir-projects/aztec-nr/aztec/src/note/note_interface.nr @@ -8,7 +8,7 @@ trait NoteInterface { fn compute_nullifier_without_context(self) -> Field; - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) -> (); + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) -> (); // Autogenerated by the #[aztec(note)] macro unless it is overridden by a custom implementation fn serialize_content(self) -> [Field; N]; diff --git a/noir-projects/aztec-nr/aztec/src/oracle/logs.nr b/noir-projects/aztec-nr/aztec/src/oracle/logs.nr index 118194ad56d..0064127fe38 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/logs.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/logs.nr @@ -35,7 +35,9 @@ fn compute_encrypted_log_oracle( _contract_address: AztecAddress, _storage_slot: Field, _note_type_id: Field, - _encryption_pub_key: GrumpkinPoint, + _ovsk_app: Field, + _ovpk_m: GrumpkinPoint, + _ivpk_m: GrumpkinPoint, _preimage: [Field; N] ) -> [u8; M] {} @@ -43,8 +45,18 @@ unconstrained pub fn compute_encrypted_log( contract_address: AztecAddress, storage_slot: Field, note_type_id: Field, + ovsk_app: Field, + ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint, preimage: [Field; N] ) -> [u8; M] { - compute_encrypted_log_oracle(contract_address, storage_slot, note_type_id, ivpk_m, preimage) + compute_encrypted_log_oracle( + contract_address, + storage_slot, + note_type_id, + ovsk_app, + ovpk_m, + ivpk_m, + preimage + ) } diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/private_immutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/private_immutable.nr index 7a63f6583bb..e257a307ad8 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/private_immutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/private_immutable.nr @@ -48,13 +48,14 @@ impl PrivateImmutable { self, note: &mut Note, broadcast: bool, + ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint ) where Note: NoteInterface { // Nullify the storage slot. let nullifier = self.compute_initialization_nullifier(); self.context.push_new_nullifier(nullifier, 0); - create_note(self.context, self.storage_slot, note, broadcast, ivpk_m); + create_note(self.context, self.storage_slot, note, broadcast, ovpk_m, ivpk_m); } // docs:end:initialize diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable.nr index a67f0d2efab..cbd2b0e5cbf 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable.nr @@ -52,13 +52,14 @@ impl PrivateMutable { self, note: &mut Note, broadcast: bool, + ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint ) where Note: NoteInterface { // Nullify the storage slot. let nullifier = self.compute_initialization_nullifier(); self.context.push_new_nullifier(nullifier, 0); - create_note(self.context, self.storage_slot, note, broadcast, ivpk_m); + create_note(self.context, self.storage_slot, note, broadcast, ovpk_m, ivpk_m); } // docs:end:initialize @@ -67,6 +68,7 @@ impl PrivateMutable { self, new_note: &mut Note, broadcast: bool, + ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint ) where Note: NoteInterface { let prev_note: Note = get_note(self.context, self.storage_slot); @@ -75,7 +77,14 @@ impl PrivateMutable { destroy_note(self.context, prev_note); // Add replacement note. - create_note(self.context, self.storage_slot, new_note, broadcast, ivpk_m); + create_note( + self.context, + self.storage_slot, + new_note, + broadcast, + ovpk_m, + ivpk_m + ); } // docs:end:replace @@ -83,6 +92,7 @@ impl PrivateMutable { self, note: &mut Note, broadcast: bool, + ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint ) where Note: NoteInterface { let is_initialized = check_nullifier_exists(self.compute_initialization_nullifier()); @@ -98,9 +108,9 @@ impl PrivateMutable { // This means that an honest oracle will assist the prover to produce a valid proof, while a malicious oracle // (i.e. one that returns an incorrect value for is_initialized) will simply fail to produce a proof. if (!is_initialized) { - self.initialize(note, broadcast, ivpk_m); + self.initialize(note, broadcast, ovpk_m, ivpk_m); } else { - self.replace(note, broadcast, ivpk_m) + self.replace(note, broadcast, ovpk_m, ivpk_m) } } @@ -108,6 +118,7 @@ impl PrivateMutable { pub fn get_note( self, broadcast: bool, + ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint ) -> Note where Note: NoteInterface { let mut note = get_note(self.context, self.storage_slot); @@ -117,7 +128,14 @@ impl PrivateMutable { // Add the same note again. // Because a nonce is added to every note in the kernel, its nullifier will be different. - create_note(self.context, self.storage_slot, &mut note, broadcast, ivpk_m); + create_note( + self.context, + self.storage_slot, + &mut note, + broadcast, + ovpk_m, + ivpk_m + ); note } diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable/test.nr b/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable/test.nr index 9d12f3001db..7f69a314d31 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable/test.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable/test.nr @@ -20,6 +20,7 @@ fn setup() -> PrivateMutable { fn test_initialize_or_replace_without_nullifier() { let state_var = setup(); + let ovpk_m: GrumpkinPoint = zeroed(); let ivpk_m: GrumpkinPoint = zeroed(); let broadcast = false; @@ -27,7 +28,7 @@ fn test_initialize_or_replace_without_nullifier() { let mut note = MockNote::new(value).contract_address(contract_address).storage_slot(storage_slot).build(); OracleMock::mock("checkNullifierExists").returns(0); - state_var.initialize_or_replace(&mut note, broadcast, ivpk_m); + state_var.initialize_or_replace(&mut note, broadcast, ovpk_m, ivpk_m); // Since we reported there was no nullifier, we should initialize and see the following side-effects: // - a new note being created diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/private_set.nr b/noir-projects/aztec-nr/aztec/src/state_vars/private_set.nr index 2f6215c4b47..3c90bb6562d 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/private_set.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/private_set.nr @@ -43,9 +43,10 @@ impl PrivateSet { self, note: &mut Note, broadcast: bool, + ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint ) where Note: NoteInterface { - create_note(self.context, self.storage_slot, note, broadcast, ivpk_m); + create_note(self.context, self.storage_slot, note, broadcast, ovpk_m, ivpk_m); } // docs:end:insert diff --git a/noir-projects/aztec-nr/aztec/src/test/mocks/mock_note.nr b/noir-projects/aztec-nr/aztec/src/test/mocks/mock_note.nr index 7c72bbef262..29b983e6b9f 100644 --- a/noir-projects/aztec-nr/aztec/src/test/mocks/mock_note.nr +++ b/noir-projects/aztec-nr/aztec/src/test/mocks/mock_note.nr @@ -47,7 +47,7 @@ impl NoteInterface for MockNote { 0 } - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) { + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) { assert( false, "MockNote does not support broadcast." ); diff --git a/noir-projects/aztec-nr/easy-private-state/src/easy_private_uint.nr b/noir-projects/aztec-nr/easy-private-state/src/easy_private_uint.nr index cd9bdf762f5..7dcad5341b5 100644 --- a/noir-projects/aztec-nr/easy-private-state/src/easy_private_uint.nr +++ b/noir-projects/aztec-nr/easy-private-state/src/easy_private_uint.nr @@ -21,23 +21,25 @@ impl EasyPrivateUint { impl EasyPrivateUint<&mut PrivateContext> { // Very similar to `value_note::utils::increment`. - pub fn add(self, addend: u64, owner: AztecAddress) { + pub fn add(self, addend: u64, owner: AztecAddress, outgoing_viewer: AztecAddress) { let header = self.context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(self.context, owner); + let outgoing_viewer = header.get_ovpk_m(self.context, outgoing_viewer); let owner_ivpk_m = header.get_ivpk_m(self.context, owner); // Creates new note for the owner. let mut addend_note = ValueNote::new(addend as Field, owner_npk_m_hash); // Insert the new note to the owner's set of notes. // docs:start:insert - self.set.insert(&mut addend_note, true, owner_ivpk_m); + self.set.insert(&mut addend_note, true, outgoing_viewer, owner_ivpk_m); // docs:end:insert } // Very similar to `value_note::utils::decrement`. - pub fn sub(self, subtrahend: u64, owner: AztecAddress) { + pub fn sub(self, subtrahend: u64, owner: AztecAddress, outgoing_viewer: AztecAddress) { let header = self.context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(self.context, owner); + let outgoing_viewer_ovpk_m = header.get_ovpk_m(self.context, outgoing_viewer); let owner_ivpk_m = header.get_ivpk_m(self.context, owner); // docs:start:get_notes @@ -64,6 +66,11 @@ impl EasyPrivateUint<&mut PrivateContext> { // Creates change note for the owner. let result_value = minuend - subtrahend; let mut result_note = ValueNote::new(result_value as Field, owner_npk_m_hash); - self.set.insert(&mut result_note, result_value != 0, owner_ivpk_m); + self.set.insert( + &mut result_note, + result_value != 0, + outgoing_viewer_ovpk_m, + owner_ivpk_m + ); } } diff --git a/noir-projects/aztec-nr/value-note/src/utils.nr b/noir-projects/aztec-nr/value-note/src/utils.nr index 38c6d54b06c..252ca2e862c 100644 --- a/noir-projects/aztec-nr/value-note/src/utils.nr +++ b/noir-projects/aztec-nr/value-note/src/utils.nr @@ -14,15 +14,22 @@ pub fn create_note_getter_options_for_decreasing_balance(amount: Field) -> NoteG pub fn increment( balance: PrivateSet, amount: Field, - recipient: AztecAddress + recipient: AztecAddress, + outgoing_viewer: AztecAddress ) { let header = balance.context.get_header(); let recipient_npk_m_hash = header.get_npk_m_hash(balance.context, recipient); + let outgoing_viewer_ovpk_m = header.get_ovpk_m(balance.context, outgoing_viewer); let recipient_ivpk_m = header.get_ivpk_m(balance.context, recipient); let mut note = ValueNote::new(amount, recipient_npk_m_hash); // Insert the new note to the owner's set of notes and emit the log if value is non-zero. - balance.insert(&mut note, amount != 0, recipient_ivpk_m); + balance.insert( + &mut note, + amount != 0, + outgoing_viewer_ovpk_m, + recipient_ivpk_m + ); } // Find some of the `owner`'s notes whose values add up to the `amount`. @@ -32,9 +39,10 @@ pub fn increment( pub fn decrement( balance: PrivateSet, amount: Field, - owner: AztecAddress + owner: AztecAddress, + outgoing_viewer: AztecAddress ) { - let sum = decrement_by_at_most(balance, amount, owner); + let sum = decrement_by_at_most(balance, amount, owner, outgoing_viewer); assert(sum == amount, "Balance too low"); } @@ -49,7 +57,8 @@ pub fn decrement( pub fn decrement_by_at_most( balance: PrivateSet, max_amount: Field, - owner: AztecAddress + owner: AztecAddress, + outgoing_viewer: AztecAddress ) -> Field { let options = create_note_getter_options_for_decreasing_balance(max_amount); let opt_notes = balance.get_notes(options); @@ -69,7 +78,7 @@ pub fn decrement_by_at_most( change_value = decremented - max_amount; decremented -= change_value; } - increment(balance, change_value, owner); + increment(balance, change_value, owner, outgoing_viewer); decremented } diff --git a/noir-projects/aztec-nr/value-note/src/value_note.nr b/noir-projects/aztec-nr/value-note/src/value_note.nr index 9c9f84de1ad..73fe20b3c7a 100644 --- a/noir-projects/aztec-nr/value-note/src/value_note.nr +++ b/noir-projects/aztec-nr/value-note/src/value_note.nr @@ -47,11 +47,12 @@ impl NoteInterface for ValueNote { } // Broadcasts the note as an encrypted log on L1. - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) { + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) { context.encrypt_and_emit_note( (*context).this_address(), slot, Self::get_note_type_id(), + ovpk_m, ivpk_m, self, ); diff --git a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr index 09030167604..71bcaaa679b 100644 --- a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr @@ -37,14 +37,17 @@ contract AppSubscription { assert(context.msg_sender().to_field() == 0); assert_current_call_valid_authwit(&mut context, user_address); - let mut note = storage.subscriptions.at(user_address).get_note(false, GrumpkinPoint::zero()); + let mut note = storage.subscriptions.at(user_address).get_note(false, GrumpkinPoint::zero(), GrumpkinPoint::zero()); assert(note.remaining_txs as u64 > 0, "you're out of txs"); note.remaining_txs -= 1; let header = context.get_header(); + // We are emitting both the outgoing and the incoming logs to the subscriber here because passing a separate + // outgoing_viewer arg to entrypoint function is impractical and the outgoing are not so valuable here. + let subscriber_ovpk_m = header.get_ovpk_m(&mut context, user_address); let subscriber_ivpk_m = header.get_ivpk_m(&mut context, user_address); - storage.subscriptions.at(user_address).replace(&mut note, true, subscriber_ivpk_m); + storage.subscriptions.at(user_address).replace(&mut note, true, subscriber_ovpk_m, subscriber_ivpk_m); context.set_as_fee_payer(); @@ -113,10 +116,16 @@ contract AppSubscription { AppSubscription::at(context.this_address()).assert_block_number(expiry_block_number).enqueue_view(&mut context); let header = context.get_header(); let subscriber_npk_m_hash = header.get_npk_m_hash(&mut context, subscriber_address); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let subscriber_ivpk_m = header.get_ivpk_m(&mut context, subscriber_address); let mut subscription_note = SubscriptionNote::new(subscriber_npk_m_hash, expiry_block_number, tx_count); - storage.subscriptions.at(subscriber_address).initialize_or_replace(&mut subscription_note, true, subscriber_ivpk_m); + storage.subscriptions.at(subscriber_address).initialize_or_replace( + &mut subscription_note, + true, + msg_sender_ovpk_m, + subscriber_ivpk_m + ); } unconstrained fn is_initialized(subscriber_address: AztecAddress) -> pub bool { diff --git a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/subscription_note.nr b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/subscription_note.nr index f02a6bc7d15..c3fc0feb7b1 100644 --- a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/subscription_note.nr +++ b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/subscription_note.nr @@ -40,11 +40,12 @@ impl NoteInterface for Subsc } // Broadcasts the note as an encrypted log on L1. - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) { + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) { context.encrypt_and_emit_note( (*context).this_address(), slot, Self::get_note_type_id(), + ovpk_m, ivpk_m, self, ); diff --git a/noir-projects/noir-contracts/contracts/benchmarking_contract/src/main.nr b/noir-projects/noir-contracts/contracts/benchmarking_contract/src/main.nr index 8d79d608ff0..a5a27fa3f57 100644 --- a/noir-projects/noir-contracts/contracts/benchmarking_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/benchmarking_contract/src/main.nr @@ -17,8 +17,8 @@ contract Benchmarking { // Creates a new value note for the target owner. Use this method to seed an initial set of notes. #[aztec(private)] - fn create_note(owner: AztecAddress, value: Field) { - increment(storage.notes.at(owner), value, owner); + fn create_note(owner: AztecAddress, outgoing_viewer: AztecAddress, value: Field) { + increment(storage.notes.at(owner), value, owner, outgoing_viewer); } // Deletes a note at a specific index in the set and creates a new one with the same value. @@ -27,13 +27,13 @@ contract Benchmarking { // See https://discourse.aztec.network/t/utxo-concurrency-issues-for-private-state/635 // by @rahul-kothari for a full explanation on why this is needed. #[aztec(private)] - fn recreate_note(owner: AztecAddress, index: u32) { + fn recreate_note(owner: AztecAddress, outgoing_viewer: AztecAddress, index: u32) { let owner_notes = storage.notes.at(owner); let mut getter_options = NoteGetterOptions::new(); let notes = owner_notes.get_notes(getter_options.set_limit(1).set_offset(index)); let note = notes[0].unwrap_unchecked(); owner_notes.remove(note); - increment(owner_notes, note.value, owner); + increment(owner_notes, note.value, owner, outgoing_viewer); } // Reads and writes to public storage and enqueues a call to another public function. diff --git a/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr b/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr index 89599e045e5..71b2237d7d2 100644 --- a/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr +++ b/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr @@ -106,12 +106,13 @@ impl Deck<&mut PrivateContext> { pub fn add_cards(&mut self, cards: [Card; N], owner: AztecAddress) -> [CardNote] { let header = self.set.context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(self.set.context, owner); + let msg_sender_ovpk_m = header.get_ovpk_m(self.set.context, self.set.context.msg_sender()); let owner_ivpk_m = header.get_ivpk_m(self.set.context, owner); let mut inserted_cards = &[]; for card in cards { let mut card_note = CardNote::from_card(card, owner_npk_m_hash); - self.set.insert(&mut card_note.note, true, owner_ivpk_m); + self.set.insert(&mut card_note.note, true, msg_sender_ovpk_m, owner_ivpk_m); inserted_cards = inserted_cards.push_back(card_note); } diff --git a/noir-projects/noir-contracts/contracts/child_contract/src/main.nr b/noir-projects/noir-contracts/contracts/child_contract/src/main.nr index 216d263e2d9..602dd63be85 100644 --- a/noir-projects/noir-contracts/contracts/child_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/child_contract/src/main.nr @@ -53,10 +53,11 @@ contract Child { fn private_set_value(new_value: Field, owner: AztecAddress) -> Field { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(new_value, owner_npk_m_hash); - storage.a_map_with_private_values.at(owner).insert(&mut note, true, owner_ivpk_m); + storage.a_map_with_private_values.at(owner).insert(&mut note, true, msg_sender_ovpk_m, owner_ivpk_m); new_value } diff --git a/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr b/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr index 73c4cd0d3b4..cf2a235e798 100644 --- a/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr @@ -16,18 +16,18 @@ contract Counter { #[aztec(private)] #[aztec(initializer)] // We can name our initializer anything we want as long as it's marked as aztec(initializer) - fn initialize(headstart: u64, owner: AztecAddress) { + fn initialize(headstart: u64, owner: AztecAddress, outgoing_viewer: AztecAddress) { let counters = storage.counters; - counters.at(owner).add(headstart, owner); + counters.at(owner).add(headstart, owner, outgoing_viewer); } // docs:end:constructor // docs:start:increment #[aztec(private)] - fn increment(owner: AztecAddress) { + fn increment(owner: AztecAddress, outgoing_viewer: AztecAddress) { dep::aztec::oracle::debug_log::debug_log_format("Incrementing counter for owner {0}", [owner.to_field()]); let counters = storage.counters; - counters.at(owner).add(1, owner); + counters.at(owner).add(1, owner, outgoing_viewer); } // docs:end:increment diff --git a/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr b/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr index b98bbf6b8f8..38237792c28 100644 --- a/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr @@ -77,21 +77,18 @@ contract Crowdfunding { // docs:start:do-transfer // 2) Transfer the donation tokens from donor to this contract - Token::at(storage.donation_token.read_private()).transfer( - context.msg_sender(), - context.this_address(), - amount as Field, - 0 - ).call(&mut context); + let donor = context.msg_sender(); + Token::at(storage.donation_token.read_private()).transfer(donor, context.this_address(), amount as Field, 0).call(&mut context); // docs:end:do-transfer let header = context.get_header(); // 3) Create a value note for the donor so that he can later on claim a rewards token in the Claim // contract by proving that the hash of this note exists in the note hash tree. - let msg_sender_npk_m_hash = header.get_npk_m_hash(&mut context, context.msg_sender()); - let msg_sender_ivpk_m = header.get_ivpk_m(&mut context, context.msg_sender()); - let mut note = ValueNote::new(amount as Field, msg_sender_npk_m_hash); - storage.donation_receipts.insert(&mut note, true, msg_sender_ivpk_m); + let donor_npk_m_hash = header.get_npk_m_hash(&mut context, donor); + let donor_ovpk_m = header.get_ovpk_m(&mut context, donor); + let donor_ivpk_m = header.get_ivpk_m(&mut context, donor); + let mut note = ValueNote::new(amount as Field, donor_npk_m_hash); + storage.donation_receipts.insert(&mut note, true, donor_ovpk_m, donor_ivpk_m); } // docs:end:donate diff --git a/noir-projects/noir-contracts/contracts/delegated_on_contract/src/main.nr b/noir-projects/noir-contracts/contracts/delegated_on_contract/src/main.nr index 2d5d9b35db6..3c405557d73 100644 --- a/noir-projects/noir-contracts/contracts/delegated_on_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/delegated_on_contract/src/main.nr @@ -17,10 +17,11 @@ contract DelegatedOn { fn private_set_value(new_value: Field, owner: AztecAddress) -> Field { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(new_value, owner_npk_m_hash); - storage.a_map_with_private_values.at(owner).insert(&mut note, true, owner_ivpk_m); + storage.a_map_with_private_values.at(owner).insert(&mut note, true, msg_sender_ovpk_m, owner_ivpk_m); new_value } diff --git a/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr b/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr index ac8bae0a917..6ff223245f6 100644 --- a/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr @@ -170,10 +170,11 @@ contract DocsExample { fn initialize_private_immutable(randomness: Field, points: u8) { let header = context.get_header(); let msg_sender_npk_m_hash = header.get_npk_m_hash(&mut context, context.msg_sender()); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let msg_sender_ivpk_m = header.get_ivpk_m(&mut context, context.msg_sender()); let mut new_card = CardNote::new(points, randomness, msg_sender_npk_m_hash); - storage.private_immutable.initialize(&mut new_card, true, msg_sender_ivpk_m); + storage.private_immutable.initialize(&mut new_card, true, msg_sender_ovpk_m, msg_sender_ivpk_m); } // docs:end:initialize-private-mutable @@ -182,22 +183,24 @@ contract DocsExample { fn initialize_private(randomness: Field, points: u8) { let header = context.get_header(); let msg_sender_npk_m_hash = header.get_npk_m_hash(&mut context, context.msg_sender()); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let msg_sender_ivpk_m = header.get_ivpk_m(&mut context, context.msg_sender()); let mut legendary_card = CardNote::new(points, randomness, msg_sender_npk_m_hash); // create and broadcast note - storage.legendary_card.initialize(&mut legendary_card, true, msg_sender_ivpk_m); + storage.legendary_card.initialize(&mut legendary_card, true, msg_sender_ovpk_m, msg_sender_ivpk_m); } #[aztec(private)] fn insert_notes(amounts: [u8; 3]) { let header = context.get_header(); let msg_sender_npk_m_hash = header.get_npk_m_hash(&mut context, context.msg_sender()); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let msg_sender_ivpk_m = header.get_ivpk_m(&mut context, context.msg_sender()); for i in 0..amounts.len() { let mut note = CardNote::new(amounts[i], 1, msg_sender_npk_m_hash); - storage.set.insert(&mut note, true, msg_sender_ivpk_m); + storage.set.insert(&mut note, true, msg_sender_ovpk_m, msg_sender_ivpk_m); } } @@ -205,10 +208,11 @@ contract DocsExample { fn insert_note(amount: u8, randomness: Field) { let header = context.get_header(); let msg_sender_npk_m_hash = header.get_npk_m_hash(&mut context, context.msg_sender()); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let msg_sender_ivpk_m = header.get_ivpk_m(&mut context, context.msg_sender()); let mut note = CardNote::new(amount, randomness, msg_sender_npk_m_hash); - storage.set.insert(&mut note, true, msg_sender_ivpk_m); + storage.set.insert(&mut note, true, msg_sender_ovpk_m, msg_sender_ivpk_m); } // docs:start:state_vars-NoteGetterOptionsComparatorExampleNoir @@ -230,10 +234,11 @@ contract DocsExample { fn update_legendary_card(randomness: Field, points: u8) { let header = context.get_header(); let msg_sender_npk_m_hash = header.get_npk_m_hash(&mut context, context.msg_sender()); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let msg_sender_ivpk_m = header.get_ivpk_m(&mut context, context.msg_sender()); let mut new_card = CardNote::new(points, randomness, msg_sender_npk_m_hash); - storage.legendary_card.replace(&mut new_card, true, msg_sender_ivpk_m); + storage.legendary_card.replace(&mut new_card, true, msg_sender_ovpk_m, msg_sender_ivpk_m); DocsExample::at(context.this_address()).update_leader(context.msg_sender(), points).enqueue(&mut context); } @@ -243,18 +248,19 @@ contract DocsExample { // Also serves as a e2e test that you can `get_note()` and then `replace()` // docs:start:state_vars-PrivateMutableGet - let card = storage.legendary_card.get_note(false, GrumpkinPoint::zero()); + let card = storage.legendary_card.get_note(false, GrumpkinPoint::zero(), GrumpkinPoint::zero()); // docs:end:state_vars-PrivateMutableGet let points = card.points + 1; let header = context.get_header(); let msg_sender_npk_m_hash = header.get_npk_m_hash(&mut context, context.msg_sender()); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let msg_sender_ivpk_m = header.get_ivpk_m(&mut context, context.msg_sender()); let mut new_card = CardNote::new(points, card.randomness, msg_sender_npk_m_hash); // docs:start:state_vars-PrivateMutableReplace - storage.legendary_card.replace(&mut new_card, true, msg_sender_ivpk_m); + storage.legendary_card.replace(&mut new_card, true, msg_sender_ovpk_m, msg_sender_ivpk_m); // docs:end:state_vars-PrivateMutableReplace DocsExample::at(context.this_address()).update_leader(context.msg_sender(), points).enqueue(&mut context); diff --git a/noir-projects/noir-contracts/contracts/docs_example_contract/src/types/card_note.nr b/noir-projects/noir-contracts/contracts/docs_example_contract/src/types/card_note.nr index 0a548d50544..16392f5b18d 100644 --- a/noir-projects/noir-contracts/contracts/docs_example_contract/src/types/card_note.nr +++ b/noir-projects/noir-contracts/contracts/docs_example_contract/src/types/card_note.nr @@ -51,11 +51,12 @@ impl NoteInterface for CardNote { } // Broadcasts the note as an encrypted log on L1. - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) { + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) { context.encrypt_and_emit_note( (*context).this_address(), slot, Self::get_note_type_id(), + ovpk_m, ivpk_m, self, ); diff --git a/noir-projects/noir-contracts/contracts/easy_private_token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/easy_private_token_contract/src/main.nr index 1b5af4b8280..3467cfef4c6 100644 --- a/noir-projects/noir-contracts/contracts/easy_private_token_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/easy_private_token_contract/src/main.nr @@ -14,27 +14,32 @@ contract EasyPrivateToken { */ #[aztec(private)] #[aztec(initializer)] - fn constructor(initial_supply: u64, owner: AztecAddress) { + fn constructor(initial_supply: u64, owner: AztecAddress, outgoing_viewer: AztecAddress) { let balances = storage.balances; - balances.at(owner).add(initial_supply, owner); + balances.at(owner).add(initial_supply, owner, outgoing_viewer); } // Mints `amount` of tokens to `owner`. #[aztec(private)] - fn mint(amount: u64, owner: AztecAddress) { + fn mint(amount: u64, owner: AztecAddress, outgoing_viewer: AztecAddress) { let balances = storage.balances; - balances.at(owner).add(amount, owner); + balances.at(owner).add(amount, owner, outgoing_viewer); } // Transfers `amount` of tokens from `sender` to a `recipient`. #[aztec(private)] - fn transfer(amount: u64, sender: AztecAddress, recipient: AztecAddress) { + fn transfer( + amount: u64, + sender: AztecAddress, + recipient: AztecAddress, + outgoing_viewer: AztecAddress + ) { let balances = storage.balances; - balances.at(sender).sub(amount, sender); - balances.at(recipient).add(amount, recipient); + balances.at(sender).sub(amount, sender, outgoing_viewer); + balances.at(recipient).add(amount, recipient, outgoing_viewer); } // Helper function to get the balance of a user ("unconstrained" is a Noir alternative of Solidity's "view" function). diff --git a/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/ecdsa_public_key_note.nr b/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/ecdsa_public_key_note.nr index 54554ddd352..0a73ba51759 100644 --- a/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/ecdsa_public_key_note.nr +++ b/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/ecdsa_public_key_note.nr @@ -86,11 +86,12 @@ impl NoteInterface f } // Broadcasts the note as an encrypted log on L1. - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) { + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) { context.encrypt_and_emit_note( (*context).this_address(), slot, Self::get_note_type_id(), + ovpk_m, ivpk_m, self, ); diff --git a/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr index c14ab6521a4..56c65524821 100644 --- a/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr @@ -29,10 +29,14 @@ contract EcdsaAccount { let this = context.this_address(); let header = context.get_header(); let this_npk_m_hash = header.get_npk_m_hash(&mut context, this); + // Not emitting outgoing for msg_sender here to not have to register keys for the contract through which we + // deploy this (typically MultiCallEntrypoint). I think it's ok here as I feel the outgoing here is not that + // important. + let this_ovpk_m = header.get_ovpk_m(&mut context, this); let this_ivpk_m = header.get_ivpk_m(&mut context, this); let mut pub_key_note = EcdsaPublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this_npk_m_hash); - storage.public_key.initialize(&mut pub_key_note, true, this_ivpk_m); + storage.public_key.initialize(&mut pub_key_note, true, this_ovpk_m, this_ivpk_m); } // Note: If you globally change the entrypoint signature don't forget to update default_entrypoint.ts diff --git a/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr b/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr index 902027ec07c..7559371ace2 100644 --- a/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr @@ -17,10 +17,11 @@ contract Escrow { fn constructor(owner: AztecAddress) { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = AddressNote::new(owner, owner_npk_m_hash); - storage.owner.initialize(&mut note, true, owner_ivpk_m); + storage.owner.initialize(&mut note, true, msg_sender_ovpk_m, owner_ivpk_m); } // Withdraws balance. Requires that msg.sender is the owner. diff --git a/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr b/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr index 803551733e7..1e303704b3c 100644 --- a/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr @@ -33,10 +33,11 @@ contract InclusionProofs { let owner_private_values = storage.private_values.at(owner); let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(value, owner_npk_m_hash); - owner_private_values.insert(&mut note, true, owner_ivpk_m); + owner_private_values.insert(&mut note, true, msg_sender_ovpk_m, owner_ivpk_m); } // docs:end:create_note diff --git a/noir-projects/noir-contracts/contracts/key_registry_contract/src/main.nr b/noir-projects/noir-contracts/contracts/key_registry_contract/src/main.nr index ec88658c95d..0755e6256bb 100644 --- a/noir-projects/noir-contracts/contracts/key_registry_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/key_registry_contract/src/main.nr @@ -51,19 +51,29 @@ contract KeyRegistry { let npk_m_y_registry = storage.npk_m_y_registry.at(address); let ivpk_m_x_registry = storage.ivpk_m_x_registry.at(address); let ivpk_m_y_registry = storage.ivpk_m_y_registry.at(address); - // let ovpk_m_x_registry = storage.ovpk_m_x_registry.at(address); - // let ovpk_m_y_registry = storage.ovpk_m_y_registry.at(address); - // let tpk_m_x_registry = storage.tpk_m_x_registry.at(address); - // let tpk_m_y_registry = storage.tpk_m_y_registry.at(address); npk_m_x_registry.schedule_value_change(keys.npk_m.x); npk_m_y_registry.schedule_value_change(keys.npk_m.y); ivpk_m_x_registry.schedule_value_change(keys.ivpk_m.x); ivpk_m_y_registry.schedule_value_change(keys.ivpk_m.y); - // Commented out as we hit the max enqueued public calls limit when not done so - // ovpk_m_x_registry.schedule_value_change(ovpk_m.x); - // ovpk_m_y_registry.schedule_value_change(ovpk_m.y); - // tpk_m_x_registry.schedule_value_change(tpk_m.x); - // tpk_m_y_registry.schedule_value_change(tpk_m.y); + + // Note: This is a hack to get around MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL limit + KeyRegistry::at(context.this_address())._register_remaining(address, keys.ovpk_m, keys.tpk_m).call(&mut context); + } + + #[aztec(public)] + #[aztec(internal)] + fn _register_remaining(address: AztecAddress, ovpk_m: GrumpkinPoint, tpk_m: GrumpkinPoint) { + // We don't need to do any checks here because they were already performed in register(...) and this function is + // internal + let ovpk_m_x_registry = storage.ovpk_m_x_registry.at(address); + let ovpk_m_y_registry = storage.ovpk_m_y_registry.at(address); + let tpk_m_x_registry = storage.tpk_m_x_registry.at(address); + let tpk_m_y_registry = storage.tpk_m_y_registry.at(address); + + ovpk_m_x_registry.schedule_value_change(ovpk_m.x); + ovpk_m_y_registry.schedule_value_change(ovpk_m.y); + tpk_m_x_registry.schedule_value_change(tpk_m.x); + tpk_m_y_registry.schedule_value_change(tpk_m.y); } } diff --git a/noir-projects/noir-contracts/contracts/pending_note_hashes_contract/src/main.nr b/noir-projects/noir-contracts/contracts/pending_note_hashes_contract/src/main.nr index 1154a96ace0..060dad53984 100644 --- a/noir-projects/noir-contracts/contracts/pending_note_hashes_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/pending_note_hashes_contract/src/main.nr @@ -21,17 +21,22 @@ contract PendingNoteHashes { // getting / reading that note all in the same contract function // Realistic way to describe this test is "Mint note A, then burn note A in the same transaction" #[aztec(private)] - fn test_insert_then_get_then_nullify_flat(amount: Field, owner: AztecAddress) -> Field { + fn test_insert_then_get_then_nullify_flat( + amount: Field, + owner: AztecAddress, + outgoing_viewer: AztecAddress + ) -> Field { let owner_balance = storage.balances.at(owner); let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); + let outgoing_viewer_ovpk_m = header.get_ovpk_m(&mut context, outgoing_viewer); let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(amount, owner_npk_m_hash); // Insert note - owner_balance.insert(&mut note, true, owner_ivpk_m); + owner_balance.insert(&mut note, true, outgoing_viewer_ovpk_m, owner_ivpk_m); let options = NoteGetterOptions::with_filter(filter_notes_min_sum, amount); // get note inserted above @@ -60,32 +65,34 @@ contract PendingNoteHashes { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); // Insert note let mut note = ValueNote::new(amount, owner_npk_m_hash); - owner_balance.insert(&mut note, true, owner_ivpk_m); + owner_balance.insert(&mut note, true, msg_sender_ovpk_m, owner_ivpk_m); 0 } // Dummy nested/inner function (to pass a function which does nothing) #[aztec(private)] - fn dummy(amount: Field, owner: AztecAddress) {} + fn dummy(amount: Field, owner: AztecAddress, outgoing_viewer: AztecAddress) {} // Nested/inner function to create and insert a note #[aztec(private)] - fn insert_note(amount: Field, owner: AztecAddress) { + fn insert_note(amount: Field, owner: AztecAddress, outgoing_viewer: AztecAddress) { let owner_balance = storage.balances.at(owner); let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); + let outgoing_viewer_ovpk_m = header.get_ovpk_m(&mut context, outgoing_viewer); let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(amount, owner_npk_m_hash); // Insert note - owner_balance.insert(&mut note, true, owner_ivpk_m); + owner_balance.insert(&mut note, true, outgoing_viewer_ovpk_m, owner_ivpk_m); } // Nested/inner function to get a note and confirm it matches the expected value @@ -123,6 +130,7 @@ contract PendingNoteHashes { fn test_insert_then_get_then_nullify_all_in_nested_calls( amount: Field, owner: AztecAddress, + outgoing_viewer: AztecAddress, insert_fn_selector: FunctionSelector, get_then_nullify_fn_selector: FunctionSelector ) { @@ -130,7 +138,7 @@ contract PendingNoteHashes { let _res = context.call_private_function( inputs.call_context.storage_contract_address, insert_fn_selector, - [amount, owner.to_field()] + [amount, owner.to_field(), outgoing_viewer.to_field()] ); // nested call to read and nullify that note let _res = context.call_private_function( @@ -145,33 +153,35 @@ contract PendingNoteHashes { fn test_insert2_then_get2_then_nullify2_all_in_nested_calls( amount: Field, owner: AztecAddress, + outgoing_viewer: AztecAddress, insert_fn_selector: FunctionSelector, get_then_nullify_fn_selector: FunctionSelector ) { // args for nested calls - let args = [amount, owner.to_field()]; + let insertArgs = [amount, owner.to_field(), outgoing_viewer.to_field()]; + let getNullifyArgs = [amount, owner.to_field()]; // nested call to create/insert note let _callStackItem1 = context.call_private_function( inputs.call_context.storage_contract_address, insert_fn_selector, - args + insertArgs ); let _callStackItem2 = context.call_private_function( inputs.call_context.storage_contract_address, insert_fn_selector, - args + insertArgs ); // nested call to read and nullify that note let _callStackItem3 = context.call_private_function( inputs.call_context.storage_contract_address, get_then_nullify_fn_selector, - args + getNullifyArgs ); let _callStackItem4 = context.call_private_function( inputs.call_context.storage_contract_address, get_then_nullify_fn_selector, - args + getNullifyArgs ); // nested call to confirm that balance is zero // TODO(dbanks12): once > 4 nested calls is supported, can confirm 0 balance: @@ -183,28 +193,30 @@ contract PendingNoteHashes { fn test_insert2_then_get2_then_nullify1_all_in_nested_calls( amount: Field, owner: AztecAddress, + outgoing_viewer: AztecAddress, insert_fn_selector: FunctionSelector, get_then_nullify_fn_selector: FunctionSelector ) { // args for nested calls - let args = [amount, owner.to_field()]; + let insertArgs = [amount, owner.to_field(), outgoing_viewer.to_field()]; + let getNullifyArgs = [amount, owner.to_field()]; // nested call to create/insert note let _callStackItem1 = context.call_private_function( inputs.call_context.storage_contract_address, insert_fn_selector, - args + insertArgs ); let _callStackItem2 = context.call_private_function( inputs.call_context.storage_contract_address, insert_fn_selector, - args + insertArgs ); // nested call to read and nullify that note let _callStackItem3 = context.call_private_function( inputs.call_context.storage_contract_address, get_then_nullify_fn_selector, - args + getNullifyArgs ); } @@ -215,28 +227,30 @@ contract PendingNoteHashes { fn test_insert1_then_get2_then_nullify2_all_in_nested_calls( amount: Field, owner: AztecAddress, + outgoing_viewer: AztecAddress, insert_fn_selector: FunctionSelector, get_then_nullify_fn_selector: FunctionSelector ) { // args for nested calls - let args = [amount, owner.to_field()]; + let insertArgs = [amount, owner.to_field(), outgoing_viewer.to_field()]; + let getNullifyArgs = [amount, owner.to_field()]; // nested call to create/insert note let _callStackItem1 = context.call_private_function( inputs.call_context.storage_contract_address, insert_fn_selector, - args + insertArgs ); // nested call to read and nullify that note let _callStackItem2 = context.call_private_function( inputs.call_context.storage_contract_address, get_then_nullify_fn_selector, - args + getNullifyArgs ); let _callStackItem3 = context.call_private_function( inputs.call_context.storage_contract_address, get_then_nullify_fn_selector, - args + getNullifyArgs ); } // Confirm cannot get/read a pending note hash in a nested call @@ -255,40 +269,50 @@ contract PendingNoteHashes { //} #[aztec(private)] - fn test_recursively_create_notes(owner: AztecAddress, how_many_recursions: u64) { - create_max_notes(owner, storage, &mut context); + fn test_recursively_create_notes( + owner: AztecAddress, + outgoing_viewer: AztecAddress, + how_many_recursions: u64 + ) { + create_max_notes(owner, outgoing_viewer, storage, &mut context); - PendingNoteHashes::at(context.this_address()).recursively_destroy_and_create_notes(owner, how_many_recursions).call(&mut context); + PendingNoteHashes::at(context.this_address()).recursively_destroy_and_create_notes(owner, outgoing_viewer, how_many_recursions).call(&mut context); } #[aztec(private)] - fn recursively_destroy_and_create_notes(owner: AztecAddress, executions_left: u64) { + fn recursively_destroy_and_create_notes( + owner: AztecAddress, + outgoing_viewer: AztecAddress, + executions_left: u64 + ) { assert(executions_left > 0); destroy_max_notes(owner, storage); - create_max_notes(owner, storage, &mut context); + create_max_notes(owner, outgoing_viewer, storage, &mut context); let executions_left = executions_left - 1; if executions_left > 0 { - PendingNoteHashes::at(context.this_address()).recursively_destroy_and_create_notes(owner, executions_left).call(&mut context); + PendingNoteHashes::at(context.this_address()).recursively_destroy_and_create_notes(owner, outgoing_viewer, executions_left).call(&mut context); } } #[contract_library_method] fn create_max_notes( owner: AztecAddress, + outgoing_viewer: AztecAddress, storage: Storage<&mut PrivateContext>, context: &mut PrivateContext ) { let owner_balance = storage.balances.at(owner); let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(context, owner); + let outgoing_viewer_ovpk_m = header.get_ovpk_m(context, outgoing_viewer); let owner_ivpk_m = header.get_ivpk_m(context, owner); for i in 0..max_notes_per_call() { let mut note = ValueNote::new(i as Field, owner_npk_m_hash); - owner_balance.insert(&mut note, true, owner_ivpk_m); + owner_balance.insert(&mut note, true, outgoing_viewer_ovpk_m, owner_ivpk_m); } } diff --git a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr index ea6ce7aad26..f677b2cba5b 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr @@ -31,11 +31,15 @@ contract SchnorrAccount { let this = context.this_address(); let header = context.get_header(); let this_npk_m_hash = header.get_npk_m_hash(&mut context, this); + // Not emitting outgoing for msg_sender here to not have to register keys for the contract through which we + // deploy this (typically MultiCallEntrypoint). I think it's ok here as I feel the outgoing here is not that + // important. + let this_ovpk_m = header.get_ovpk_m(&mut context, this); let this_ivpk_m = header.get_ivpk_m(&mut context, this); // docs:start:initialize let mut pub_key_note = PublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this_npk_m_hash); - storage.signing_public_key.initialize(&mut pub_key_note, true, this_ivpk_m); + storage.signing_public_key.initialize(&mut pub_key_note, true, this_ovpk_m, this_ivpk_m); // docs:end:initialize } diff --git a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/public_key_note.nr b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/public_key_note.nr index e548b3d8ab8..1282c27e800 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/public_key_note.nr +++ b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/public_key_note.nr @@ -40,11 +40,12 @@ impl NoteInterface for PublicKey } // Broadcasts the note as an encrypted log on L1. - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) { + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) { context.encrypt_and_emit_note( (*context).this_address(), slot, Self::get_note_type_id(), + ovpk_m, ivpk_m, self, ); diff --git a/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr index 6963a03e0d7..0148a591e58 100644 --- a/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr @@ -15,8 +15,8 @@ contract StatefulTest { #[aztec(private)] #[aztec(initializer)] - fn constructor(owner: AztecAddress, value: Field) { - StatefulTest::at(context.this_address()).create_note_no_init_check(owner, value).call(&mut context); + fn constructor(owner: AztecAddress, outgoing_viewer: AztecAddress, value: Field) { + StatefulTest::at(context.this_address()).create_note_no_init_check(owner, outgoing_viewer, value).call(&mut context); } #[aztec(private)] @@ -26,26 +26,28 @@ contract StatefulTest { let _res = context.call_public_function(context.this_address(), selector, [42]); } + // Having _ignored_arg here as it makes the params the same as for the private constructor which makes + // contract_class_registration tests way less cluttered. This is a test contract. Don't judge me. #[aztec(public)] #[aztec(initializer)] - fn public_constructor(owner: AztecAddress, value: Field) { + fn public_constructor(owner: AztecAddress, _ignored_arg: AztecAddress, value: Field) { StatefulTest::at(context.this_address()).increment_public_value_no_init_check(owner, value).call(&mut context); } #[aztec(private)] - fn create_note(owner: AztecAddress, value: Field) { + fn create_note(owner: AztecAddress, outgoing_viewer: AztecAddress, value: Field) { if (value != 0) { let loc = storage.notes.at(owner); - increment(loc, value, owner); + increment(loc, value, owner, outgoing_viewer); } } #[aztec(private)] #[aztec(noinitcheck)] - fn create_note_no_init_check(owner: AztecAddress, value: Field) { + fn create_note_no_init_check(owner: AztecAddress, outgoing_viewer: AztecAddress, value: Field) { if (value != 0) { let loc = storage.notes.at(owner); - increment(loc, value, owner); + increment(loc, value, owner, outgoing_viewer); } } @@ -55,10 +57,10 @@ contract StatefulTest { let sender = context.msg_sender(); let sender_notes = storage.notes.at(sender); - decrement(sender_notes, amount, sender); + decrement(sender_notes, amount, sender, context.msg_sender()); let recipient_notes = storage.notes.at(recipient); - increment(recipient_notes, amount, recipient); + increment(recipient_notes, amount, recipient, context.msg_sender()); } #[aztec(private)] @@ -67,10 +69,10 @@ contract StatefulTest { let sender = context.msg_sender(); let sender_notes = storage.notes.at(sender); - decrement(sender_notes, amount, sender); + decrement(sender_notes, amount, sender, context.msg_sender()); let recipient_notes = storage.notes.at(recipient); - increment(recipient_notes, amount, recipient); + increment(recipient_notes, amount, recipient, context.msg_sender()); } #[aztec(public)] diff --git a/noir-projects/noir-contracts/contracts/static_child_contract/src/main.nr b/noir-projects/noir-contracts/contracts/static_child_contract/src/main.nr index e783db4d92c..6442b07ff86 100644 --- a/noir-projects/noir-contracts/contracts/static_child_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/static_child_contract/src/main.nr @@ -42,20 +42,26 @@ contract StaticChild { fn private_illegal_set_value(new_value: Field, owner: AztecAddress) -> Field { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); + let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(new_value, owner_npk_m_hash); - storage.a_private_value.insert(&mut note, true, owner_ivpk_m); + storage.a_private_value.insert(&mut note, true, msg_sender_ovpk_m, owner_ivpk_m); new_value } // Modify a note #[aztec(private)] - fn private_set_value(new_value: Field, owner: AztecAddress) -> Field { + fn private_set_value( + new_value: Field, + owner: AztecAddress, + outgoing_viewer: AztecAddress + ) -> Field { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); + let outgoing_viewer_ovpk_m = header.get_ovpk_m(&mut context, outgoing_viewer); let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(new_value, owner_npk_m_hash); - storage.a_private_value.insert(&mut note, true, owner_ivpk_m); + storage.a_private_value.insert(&mut note, true, outgoing_viewer_ovpk_m, owner_ivpk_m); new_value } diff --git a/noir-projects/noir-contracts/contracts/static_parent_contract/src/main.nr b/noir-projects/noir-contracts/contracts/static_parent_contract/src/main.nr index 7ee89147247..39cb8ffe155 100644 --- a/noir-projects/noir-contracts/contracts/static_parent_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/static_parent_contract/src/main.nr @@ -30,6 +30,16 @@ contract StaticParent { context.call_private_function(target_contract, target_selector, args).unpack_into() } + // Just like function above but with 3 args. + #[aztec(private)] + fn private_call_3_args( + target_contract: AztecAddress, + target_selector: FunctionSelector, + args: [Field; 3] + ) -> Field { + context.call_private_function(target_contract, target_selector, args).unpack_into() + } + // Private function to enqueue a call to a public function of another contract, passing the target arguments provided #[aztec(private)] fn enqueue_call( @@ -40,7 +50,6 @@ contract StaticParent { context.call_public_function(target_contract, target_selector, args); } - // Private function to statically call another private function to the target_contract using the selector and values provided #[aztec(private)] fn private_static_call( target_contract: AztecAddress, @@ -50,6 +59,16 @@ contract StaticParent { context.static_call_private_function(target_contract, target_selector, args).unpack_into() } + // Private function to statically call another private function to the target_contract using the selector and values provided + #[aztec(private)] + fn private_static_call_3_args( + target_contract: AztecAddress, + target_selector: FunctionSelector, + args: [Field; 3] + ) -> Field { + context.static_call_private_function(target_contract, target_selector, args).unpack_into() + } + // Same as above but using a specific function from the interface #[aztec(private)] fn private_get_value_from_child( @@ -70,6 +89,16 @@ contract StaticParent { StaticParent::at(context.this_address()).private_call(target_contract, target_selector, args).view(&mut context) } + // Just like function above but with 3 args. + #[aztec(private)] + fn private_nested_static_call_3_args( + target_contract: AztecAddress, + target_selector: FunctionSelector, + args: [Field; 3] + ) -> Field { + StaticParent::at(context.this_address()).private_call_3_args(target_contract, target_selector, args).view(&mut context) + } + // Public function to statically call another public function to the target_contract using the selector and value provided #[aztec(public)] fn public_static_call( diff --git a/noir-projects/noir-contracts/contracts/test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test_contract/src/main.nr index ac5bb09bfb3..9f8ff806a89 100644 --- a/noir-projects/noir-contracts/contracts/test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test_contract/src/main.nr @@ -82,17 +82,30 @@ contract Test { fn dummy_public_call() {} #[aztec(private)] - fn call_create_note(value: Field, owner: AztecAddress, storage_slot: Field) { + fn call_create_note( + value: Field, + owner: AztecAddress, + outgoing_viewer: AztecAddress, + storage_slot: Field + ) { assert( storage_slot != storage.example_constant.get_storage_slot(), "this storage slot is reserved for example_constant" ); let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); + let outgoing_viewer_ovpk_m = header.get_ovpk_m(&mut context, outgoing_viewer); let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(value, owner_npk_m_hash); - create_note(&mut context, storage_slot, &mut note, true, owner_ivpk_m); + create_note( + &mut context, + storage_slot, + &mut note, + true, + outgoing_viewer_ovpk_m, + owner_ivpk_m + ); } #[aztec(private)] @@ -248,24 +261,32 @@ contract Test { // For testing non-note encrypted logs #[aztec(private)] - fn emit_array_as_encrypted_log(fields: [Field; 5], owner: AztecAddress, nest: bool) { + fn emit_array_as_encrypted_log( + fields: [Field; 5], + owner: AztecAddress, + outgoing_viewer: AztecAddress, + nest: bool + ) { let header = context.get_header(); + let outgoing_viewer_ovpk_m = header.get_ovpk_m(&mut context, outgoing_viewer); let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); context.encrypt_and_emit_log( context.this_address(), 5, // testing only - this should be a secret random value to salt the addr 1, + outgoing_viewer_ovpk_m, owner_ivpk_m, fields ); // this contract has reached max number of functions, so using this one fn // to test nested and non nested encrypted logs if nest { - Test::at(context.this_address()).emit_array_as_encrypted_log([0, 0, 0, 0, 0], owner, false).call(&mut context); + Test::at(context.this_address()).emit_array_as_encrypted_log([0, 0, 0, 0, 0], owner, outgoing_viewer, false).call(&mut context); context.encrypt_and_emit_log( context.this_address(), 0, // testing only - this signals to the kerels to not mask the address 1, + outgoing_viewer_ovpk_m, owner_ivpk_m, [1, 2, 3, 4, 5] ); @@ -292,19 +313,27 @@ contract Test { } #[aztec(private)] - fn emit_encrypted_logs_nested(value: Field, owner: AztecAddress) { + fn emit_encrypted_logs_nested(value: Field, owner: AztecAddress, outgoing_viewer: AztecAddress) { let mut storage_slot = storage.example_constant.get_storage_slot() + 1; - Test::at(context.this_address()).call_create_note(value, owner, storage_slot).call(&mut context); + Test::at(context.this_address()).call_create_note(value, owner, outgoing_viewer, storage_slot).call(&mut context); storage_slot += 1; let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); + let msg_sender_ovpk = header.get_ovpk_m(&mut context, context.msg_sender()); let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(value + 1, owner_npk_m_hash); - create_note(&mut context, storage_slot, &mut note, true, owner_ivpk_m); + create_note( + &mut context, + storage_slot, + &mut note, + true, + msg_sender_ovpk, + owner_ivpk_m + ); storage_slot += 1; - Test::at(context.this_address()).call_create_note(value + 2, owner, storage_slot).call(&mut context); + Test::at(context.this_address()).call_create_note(value + 2, owner, outgoing_viewer, storage_slot).call(&mut context); } // docs:start:is-time-equal @@ -376,7 +405,7 @@ contract Test { #[aztec(private)] fn set_constant(value: Field) { let mut note = TestNote::new(value); - storage.example_constant.initialize(&mut note, false, GrumpkinPoint::zero()); + storage.example_constant.initialize(&mut note, false, GrumpkinPoint::zero(), GrumpkinPoint::zero()); } #[aztec(private)] diff --git a/noir-projects/noir-contracts/contracts/test_contract/src/test_note.nr b/noir-projects/noir-contracts/contracts/test_contract/src/test_note.nr index 6f7fe56fba1..c58059b7050 100644 --- a/noir-projects/noir-contracts/contracts/test_contract/src/test_note.nr +++ b/noir-projects/noir-contracts/contracts/test_contract/src/test_note.nr @@ -28,7 +28,7 @@ impl NoteInterface for TestNote { 0 } - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) { + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) { assert( false, "TestNote does not support broadcast. Add it to PXE directly using the `.addNote` function." ); diff --git a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr index e8cbba3054d..181b6483a47 100644 --- a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr @@ -177,7 +177,7 @@ contract TokenBlacklist { pending_shields.remove(note); // Add the token note to user's balances set - storage.balances.add(to, U128::from_integer(amount)); + storage.balances.add(context.msg_sender(), to, U128::from_integer(amount)); } #[aztec(private)] @@ -214,7 +214,7 @@ contract TokenBlacklist { let amount = U128::from_integer(amount); storage.balances.sub(from, amount); - storage.balances.add(to, amount); + storage.balances.add(from, to, amount); } #[aztec(private)] diff --git a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/balances_map.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/balances_map.nr index f6f5229f97d..dfc1249aacd 100644 --- a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/balances_map.nr +++ b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/balances_map.nr @@ -57,14 +57,16 @@ impl BalancesMap { } } -impl BalancesMap { +impl BalancesMap { pub fn add( self: Self, + outgoing_viewer: AztecAddress, owner: AztecAddress, addend: U128 ) where T: NoteInterface + OwnedNote { let context = self.map.context; let header = context.get_header(); + let outgoing_viewer_ovpk_m = header.get_ovpk_m(context, outgoing_viewer); let owner_ivpk_m = header.get_ivpk_m(context, owner); // We fetch the nullifier public key hash from the registry / from our PXE @@ -72,7 +74,7 @@ impl BalancesMap { let mut addend_note = T::new(addend, owner_npk_m_hash); // docs:start:insert - self.map.at(owner).insert(&mut addend_note, true, owner_ivpk_m); + self.map.at(owner).insert(&mut addend_note, true, outgoing_viewer_ovpk_m, owner_ivpk_m); // docs:end:insert } @@ -108,7 +110,7 @@ impl BalancesMap { // without the == true, it includes 'minuend.ge(subtrahend)' as part of the error. assert(minuend >= subtrahend, "Balance too low"); - self.add(owner, minuend - subtrahend); + self.add(owner, owner, minuend - subtrahend); } } diff --git a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/token_note.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/token_note.nr index 7d87907a91b..c27d292625e 100644 --- a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/token_note.nr +++ b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/token_note.nr @@ -49,7 +49,7 @@ impl NoteInterface for TokenNote { } // Broadcasts the note as an encrypted log on L1. - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) { + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) { // We only bother inserting the note if non-empty to save funds on gas. // TODO: (#5901) This will be changed a lot, as it should use the updated encrypted log format if !(self.amount == U128::from_integer(0)) { @@ -57,6 +57,7 @@ impl NoteInterface for TokenNote { (*context).this_address(), slot, Self::get_note_type_id(), + ovpk_m, ivpk_m, self, ); diff --git a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/transparent_note.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/transparent_note.nr index f34ce047341..b59dea760c4 100644 --- a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/transparent_note.nr +++ b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/transparent_note.nr @@ -61,7 +61,7 @@ impl NoteInterface for Transpa ]) } - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) { + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) { assert(false, "TransparentNote does not support broadcast"); } } diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr index e3a158868bc..6360cbc442e 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr @@ -190,9 +190,14 @@ contract Token { } // docs:end:mint_private + // TODO: Nuke this - test functions do not belong to token contract! #[aztec(private)] fn privately_mint_private_note(amount: Field) { - storage.balances.add(context.msg_sender(), U128::from_integer(amount)); + storage.balances.add( + context.msg_sender(), + context.msg_sender(), + U128::from_integer(amount) + ); Token::at(context.this_address()).assert_minter_and_mint(context.msg_sender(), amount).enqueue(&mut context); } @@ -282,7 +287,9 @@ contract Token { pending_shields.remove(note); // Add the token note to user's balances set - storage.balances.add(to, U128::from_integer(amount)); + // Note: Using context.msg_sender() as a sender below makes this incompatible with escrows because we send + // outgoing logs to that address and to send outgoing logs you need to get a hold of ovsk_m. + storage.balances.add(context.msg_sender(), to, U128::from_integer(amount)); } // docs:end:redeem_shield @@ -315,7 +322,7 @@ contract Token { let amount = U128::from_integer(amount); storage.balances.sub(from, amount); // docs:start:increase_private_balance - storage.balances.add(to, amount); + storage.balances.add(from, to, amount); // docs:end:increase_private_balance } // docs:end:transfer diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/types/balances_map.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types/balances_map.nr index bd24d952026..dfc1249aacd 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/types/balances_map.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/types/balances_map.nr @@ -60,12 +60,13 @@ impl BalancesMap { impl BalancesMap { pub fn add( self: Self, + outgoing_viewer: AztecAddress, owner: AztecAddress, addend: U128 ) where T: NoteInterface + OwnedNote { let context = self.map.context; let header = context.get_header(); - + let outgoing_viewer_ovpk_m = header.get_ovpk_m(context, outgoing_viewer); let owner_ivpk_m = header.get_ivpk_m(context, owner); // We fetch the nullifier public key hash from the registry / from our PXE @@ -73,7 +74,7 @@ impl BalancesMap { let mut addend_note = T::new(addend, owner_npk_m_hash); // docs:start:insert - self.map.at(owner).insert(&mut addend_note, true, owner_ivpk_m); + self.map.at(owner).insert(&mut addend_note, true, outgoing_viewer_ovpk_m, owner_ivpk_m); // docs:end:insert } @@ -109,7 +110,7 @@ impl BalancesMap { // without the == true, it includes 'minuend.ge(subtrahend)' as part of the error. assert(minuend >= subtrahend, "Balance too low"); - self.add(owner, minuend - subtrahend); + self.add(owner, owner, minuend - subtrahend); } } diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr index 7d87907a91b..c27d292625e 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr @@ -49,7 +49,7 @@ impl NoteInterface for TokenNote { } // Broadcasts the note as an encrypted log on L1. - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) { + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) { // We only bother inserting the note if non-empty to save funds on gas. // TODO: (#5901) This will be changed a lot, as it should use the updated encrypted log format if !(self.amount == U128::from_integer(0)) { @@ -57,6 +57,7 @@ impl NoteInterface for TokenNote { (*context).this_address(), slot, Self::get_note_type_id(), + ovpk_m, ivpk_m, self, ); diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/types/transparent_note.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types/transparent_note.nr index f34ce047341..b59dea760c4 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/types/transparent_note.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/types/transparent_note.nr @@ -61,7 +61,7 @@ impl NoteInterface for Transpa ]) } - fn broadcast(self, context: &mut PrivateContext, slot: Field, ivpk_m: GrumpkinPoint) { + fn broadcast(self, context: &mut PrivateContext, slot: Field, ovpk_m: GrumpkinPoint, ivpk_m: GrumpkinPoint) { assert(false, "TransparentNote does not support broadcast"); } } diff --git a/yarn-project/circuit-types/src/logs/l1_note_payload/encrypted_log_outgoing_body.ts b/yarn-project/circuit-types/src/logs/l1_note_payload/encrypted_log_outgoing_body.ts index e3fb98a7404..bba788dfe52 100644 --- a/yarn-project/circuit-types/src/logs/l1_note_payload/encrypted_log_outgoing_body.ts +++ b/yarn-project/circuit-types/src/logs/l1_note_payload/encrypted_log_outgoing_body.ts @@ -89,11 +89,12 @@ export class EncryptedLogOutgoingBody { * * @param ovskApp - The app siloed outgoing viewing secret key * @param ephPk - The ephemeral public key - * @returns + * @returns The derived AES symmetric key */ - static derivePoseidonAESSecret(ovskApp: GrumpkinPrivateKey, ephPk: PublicKey) { - // For performance reasons, we do NOT use the usual `deriveAESSecret` function here - // Instead we compute the using using poseidon + private static derivePoseidonAESSecret(ovskApp: GrumpkinPrivateKey, ephPk: PublicKey) { + // For performance reasons, we do NOT use the usual `deriveAESSecret` function here and instead we compute it using + // poseidon. Note that we can afford to use poseidon here instead of deriving shared secret using Diffie-Hellman + // because for outgoing we are encrypting for ourselves and hence we don't need to perform a key exchange. return poseidon2Hash([ovskApp.high, ovskApp.low, ephPk.x, ephPk.y, GeneratorIndex.SYMMETRIC_KEY]).toBuffer(); } } diff --git a/yarn-project/circuit-types/src/logs/l1_note_payload/l1_note_payload.test.ts b/yarn-project/circuit-types/src/logs/l1_note_payload/l1_note_payload.test.ts index 321a8e82985..8fb24d52dc3 100644 --- a/yarn-project/circuit-types/src/logs/l1_note_payload/l1_note_payload.test.ts +++ b/yarn-project/circuit-types/src/logs/l1_note_payload/l1_note_payload.test.ts @@ -1,16 +1,9 @@ -import { AztecAddress } from '@aztec/circuits.js'; -import { Grumpkin } from '@aztec/circuits.js/barretenberg'; -import { GrumpkinScalar } from '@aztec/foundation/fields'; +import { AztecAddress, KeyValidationRequest, computeOvskApp, derivePublicKeyFromSecretKey } from '@aztec/circuits.js'; +import { Fr, GrumpkinScalar } from '@aztec/foundation/fields'; import { L1NotePayload } from './l1_note_payload.js'; describe('L1 Note Payload', () => { - let grumpkin: Grumpkin; - - beforeAll(() => { - grumpkin = new Grumpkin(); - }); - it('convert to and from buffer', () => { const payload = L1NotePayload.random(); const buf = payload.toBuffer(); @@ -18,35 +11,47 @@ describe('L1 Note Payload', () => { }); describe('encrypt and decrypt a full log', () => { - let ovsk: GrumpkinScalar; - let ivsk: GrumpkinScalar; + let ovskM: GrumpkinScalar; + let ivskM: GrumpkinScalar; let payload: L1NotePayload; let encrypted: Buffer; beforeAll(() => { - ovsk = GrumpkinScalar.random(); - ivsk = GrumpkinScalar.random(); + payload = L1NotePayload.random(); + + ovskM = GrumpkinScalar.random(); + ivskM = GrumpkinScalar.random(); + + const ovKeys = getKeyValidationRequest(ovskM, payload.contractAddress); const ephSk = GrumpkinScalar.random(); const recipientAddress = AztecAddress.random(); - const ivpk = grumpkin.mul(Grumpkin.generator, ivsk); + const ivpk = derivePublicKeyFromSecretKey(ivskM); - payload = L1NotePayload.random(); - encrypted = payload.encrypt(ephSk, recipientAddress, ivpk, ovsk); + encrypted = payload.encrypt(ephSk, recipientAddress, ivpk, ovKeys); }); it('decrypt a log as incoming', () => { - const recreated = L1NotePayload.decryptAsIncoming(encrypted, ivsk); + const recreated = L1NotePayload.decryptAsIncoming(encrypted, ivskM); expect(recreated.toBuffer()).toEqual(payload.toBuffer()); }); it('decrypt a log as outgoing', () => { - const recreated = L1NotePayload.decryptAsOutgoing(encrypted, ovsk); + const recreated = L1NotePayload.decryptAsOutgoing(encrypted, ovskM); expect(recreated.toBuffer()).toEqual(payload.toBuffer()); }); }); + + const getKeyValidationRequest = (ovskM: GrumpkinScalar, app: AztecAddress) => { + const ovskApp = computeOvskApp(ovskM, app); + // TODO(#6640)): get rid of this ugly conversion + const ovskAppFr = Fr.fromBuffer(ovskApp.toBuffer()); + + const ovpkM = derivePublicKeyFromSecretKey(ovskM); + return new KeyValidationRequest(ovpkM, ovskAppFr); + }; }); diff --git a/yarn-project/circuit-types/src/logs/l1_note_payload/l1_note_payload.ts b/yarn-project/circuit-types/src/logs/l1_note_payload/l1_note_payload.ts index 285befd192d..d4bed3824ba 100644 --- a/yarn-project/circuit-types/src/logs/l1_note_payload/l1_note_payload.ts +++ b/yarn-project/circuit-types/src/logs/l1_note_payload/l1_note_payload.ts @@ -1,6 +1,7 @@ import { AztecAddress, - type GrumpkinPrivateKey, + GrumpkinPrivateKey, + type KeyValidationRequest, type PublicKey, computeIvpkApp, computeIvskApp, @@ -86,17 +87,16 @@ export class L1NotePayload { * @param ephSk - An ephemeral secret key used for the encryption * @param recipient - The recipient address, retrievable by the sender for his logs * @param ivpk - The incoming viewing public key of the recipient - * @param ovsk - The outgoing viewing secret key of the sender + * @param ovKeys - The outgoing viewing keys of the sender * @returns A buffer containing the encrypted log payload */ - public encrypt(ephSk: GrumpkinPrivateKey, recipient: AztecAddress, ivpk: PublicKey, ovsk: GrumpkinPrivateKey) { + public encrypt(ephSk: GrumpkinPrivateKey, recipient: AztecAddress, ivpk: PublicKey, ovKeys: KeyValidationRequest) { const ephPk = derivePublicKeyFromSecretKey(ephSk); - const ovpk = derivePublicKeyFromSecretKey(ovsk); const header = new EncryptedLogHeader(this.contractAddress); const incomingHeaderCiphertext = header.computeCiphertext(ephSk, ivpk); - const outgoingHeaderCiphertext = header.computeCiphertext(ephSk, ovpk); + const outgoingHeaderCiphertext = header.computeCiphertext(ephSk, ovKeys.pkM); const ivpkApp = computeIvpkApp(ivpk, this.contractAddress); @@ -106,7 +106,8 @@ export class L1NotePayload { this.note, ).computeCiphertext(ephSk, ivpkApp); - const ovskApp = computeOvskApp(ovsk, this.contractAddress); + // TODO(#6640)): do we want the conversion to be here? Unify the type everywhere? + const ovskApp = GrumpkinPrivateKey.fromBuffer(ovKeys.skApp.toBuffer()); const outgoingBodyCiphertext = new EncryptedLogOutgoingBody(ephSk, recipient, ivpkApp).computeCiphertext( ovskApp, diff --git a/yarn-project/circuit-types/src/logs/l1_note_payload/tagged_note.test.ts b/yarn-project/circuit-types/src/logs/l1_note_payload/tagged_note.test.ts index 392291c794b..ba0f4d51cd4 100644 --- a/yarn-project/circuit-types/src/logs/l1_note_payload/tagged_note.test.ts +++ b/yarn-project/circuit-types/src/logs/l1_note_payload/tagged_note.test.ts @@ -1,17 +1,10 @@ -import { AztecAddress } from '@aztec/circuits.js'; -import { Grumpkin } from '@aztec/circuits.js/barretenberg'; -import { GrumpkinScalar } from '@aztec/foundation/fields'; +import { AztecAddress, KeyValidationRequest, computeOvskApp, derivePublicKeyFromSecretKey } from '@aztec/circuits.js'; +import { Fr, GrumpkinScalar } from '@aztec/foundation/fields'; import { L1NotePayload } from './l1_note_payload.js'; import { TaggedNote } from './tagged_note.js'; describe('L1 Note Payload', () => { - let grumpkin: Grumpkin; - - beforeAll(() => { - grumpkin = new Grumpkin(); - }); - it('convert to and from buffer', () => { const payload = L1NotePayload.random(); const taggedNote = new TaggedNote(payload); @@ -20,38 +13,49 @@ describe('L1 Note Payload', () => { }); describe('encrypt and decrypt a full log', () => { - let ovsk: GrumpkinScalar; - let ivsk: GrumpkinScalar; + let ovskM: GrumpkinScalar; + let ivskM: GrumpkinScalar; let taggedNote: TaggedNote; let encrypted: Buffer; beforeAll(() => { - ovsk = GrumpkinScalar.random(); - ivsk = GrumpkinScalar.random(); + const payload = L1NotePayload.random(); + + ovskM = GrumpkinScalar.random(); + ivskM = GrumpkinScalar.random(); + + const ovKeys = getKeyValidationRequest(ovskM, payload.contractAddress); const ephSk = GrumpkinScalar.random(); const recipientAddress = AztecAddress.random(); - const ivpk = grumpkin.mul(Grumpkin.generator, ivsk); - - const payload = L1NotePayload.random(); + const ivpk = derivePublicKeyFromSecretKey(ivskM); taggedNote = new TaggedNote(payload); - encrypted = taggedNote.encrypt(ephSk, recipientAddress, ivpk, ovsk); + encrypted = taggedNote.encrypt(ephSk, recipientAddress, ivpk, ovKeys); }); it('decrypt a log as incoming', () => { - const recreated = TaggedNote.decryptAsIncoming(encrypted, ivsk); + const recreated = TaggedNote.decryptAsIncoming(encrypted, ivskM); expect(recreated?.toBuffer()).toEqual(taggedNote.toBuffer()); }); it('decrypt a log as outgoing', () => { - const recreated = TaggedNote.decryptAsOutgoing(encrypted, ovsk); + const recreated = TaggedNote.decryptAsOutgoing(encrypted, ovskM); expect(recreated?.toBuffer()).toEqual(taggedNote.toBuffer()); }); }); + + const getKeyValidationRequest = (ovskM: GrumpkinScalar, app: AztecAddress) => { + const ovskApp = computeOvskApp(ovskM, app); + // TODO(#6640)): get rid of this ugly conversion + const ovskAppFr = Fr.fromBuffer(ovskApp.toBuffer()); + + const ovpkM = derivePublicKeyFromSecretKey(ovskM); + return new KeyValidationRequest(ovpkM, ovskAppFr); + }; }); diff --git a/yarn-project/circuit-types/src/logs/l1_note_payload/tagged_note.ts b/yarn-project/circuit-types/src/logs/l1_note_payload/tagged_note.ts index aa1e45a1aa1..defe4a1c757 100644 --- a/yarn-project/circuit-types/src/logs/l1_note_payload/tagged_note.ts +++ b/yarn-project/circuit-types/src/logs/l1_note_payload/tagged_note.ts @@ -1,4 +1,9 @@ -import { type AztecAddress, type GrumpkinPrivateKey, type PublicKey } from '@aztec/circuits.js'; +import { + type AztecAddress, + type GrumpkinPrivateKey, + type KeyValidationRequest, + type PublicKey, +} from '@aztec/circuits.js'; import { Fr } from '@aztec/foundation/fields'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; @@ -46,12 +51,12 @@ export class TaggedNote { ephSk: GrumpkinPrivateKey, recipient: AztecAddress, ivpk: PublicKey, - ovsk: GrumpkinPrivateKey, + ovKeys: KeyValidationRequest, ): Buffer { return serializeToBuffer( this.incomingTag, this.outgoingTag, - this.notePayload.encrypt(ephSk, recipient, ivpk, ovsk), + this.notePayload.encrypt(ephSk, recipient, ivpk, ovKeys), ); } diff --git a/yarn-project/circuits.js/fixtures/PrivateFunctionBroadcastedEventData.hex b/yarn-project/circuits.js/fixtures/PrivateFunctionBroadcastedEventData.hex index 93903075b8a..fe86f3037fe 100644 --- a/yarn-project/circuits.js/fixtures/PrivateFunctionBroadcastedEventData.hex +++ b/yarn-project/circuits.js/fixtures/PrivateFunctionBroadcastedEventData.hex @@ -1 +1 @@ -000000001b70e95fde0b70adc30496b90a327af6a5e383e028e7a43211a07bcd26222cd450fe6beecf6cbe6495e118412940ee0da5744629dabcaf010a2a4e38229d43c7daac528d0aefd72bee59385d7e9ff06ea477b673389e1f65168cba9f0c3d79f3431c5bef8abf01dcf84cb2c64d136171adca23e40d20ed1c649518170583aed5d42e43d977274df1e4536a029a27c2f443bd96eef4162f7f5d7d0b76159e0bdd29fcc7efb79fdb56480e4cac622d6d71755adb98c7c614af8d76a64519e9d55f327e3c96dd42e60a81a783b0bb968d074ee638d542d17f8a3a0b699006e62084ee7b602fe9abc15632dda3269f56fb0c6e12519a2eb2ec897091919d03c9e2e67178ac638746f068907e6677b4cc7a9592ef234ab6ab518f17efffa0000000000000000000000000000000000000000000000000000000000000000018e01957faa463b1495f979f153e839d5fbd2af9b0d142940d1df29d9bcf43732c450d02ff856d78b6197914dbb85cc88b31ef6f32d534f01b893dcee663a1191c26a986ab599f5027f02a8390d7cb96c87146380163a5fa002c30cba8e32f6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038cda461eef7f2eaafa09e24b0475a918bd7388c4dec305145849f5f84d1b822202b94400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006150001f8b08000000000000ffed7d077c1dc5b5fe4a5c0b8390e8d8a68a9a8091750075d58dc11770c01d375c31b66cc9058c0db6e909a407d21b219006212410920000792185f4c64b5e3ae9e5a591e4e5252fc94bf9bf24af38ff9dabf9ac4fc7003357d2b2e7eaca3bfbfbcd6f6667cfccf9ce99d9993365676ba281eb973551007469cd40d878b5b13b20764d749fb361dc4f10f775827ea2b83f5cdc1f29ee008f16f793c47d93757c59c851d1fa6df9cef6f6feae427f6b5b6b6fbed0b3a100bb23dfdeb1a1b3bbb5bbb5a3bba3afd0ddd6d6dfdddeddd5b3a1a72bdfd3da00ded6dfbaa9a3a76d537ee03a95f2ca3fcdab867460ae9363b72776a758ffd4008cf967c7ee345b66ac97d332aa0fd6cbe9d1c0fb86facc97ace3f9a777b5a60098579ef19e110db409e6aa73e0c77580233c91e8f6a42c2bf392580e77e0dc00a70c8a2982d128cc3314f27d46945ea3aa25f733d22fa37ca55ec29a28fd9700d0f878f19e19bb33637756eca646038d4c73ec4eb0cf270adda582a53ddf5500e29f1baa335cf5d140471e11cd81d18021004cb9f431b59a7c27a49d6f3edf0039d1e24f39dfbd864364711789cf04d2d541d1a09e53e2ddcabc61dc1d443c005174081f41b4a0833e50d6c0de100dd6cf83caa4cb89748d4453e790bf18a5002bff8102cf8102f3048a331d484d6e5f6c1af5cdbc3fdc79427f91c01b114e00e049fdbd8a75757034f8ee6eeedf7de18eedbb77f66edc3d67fbaeddbddb3700f673b304d87502764d345404f9dc5cb58eb87a12ef008a43fa1cc5d50a75d4003bf01c1429f6fb18c09836f89e68d0000648d3561ba367aaf5cf8c060d43e3001f17bb69940e029d659f4f23ba16075db37dde62fd438d4c42d65a21f3d3ed00f3d36c93f251fa6d2be43dc0eae474eb9b36aa7518dde49fded53a35453db700a6a89b4ad93e6746e99627ae42140620c382d128cc8242be6d51750f408cdc006de997515e5698b4cb3f2d9d9e99625eedd1f86bc4d2c4cc783ba2d0880d0b0046a3303b14f2ed8caabb11337277a65f464eac4f57fe368b356d6bacad4acb003b2c1fec3b4dde15edbb7cd095517db05ebaa3a10d33469c7ca5dd769c1ca5006ff4a48df19448a793ee890646d1e6529a496de3995459963c824d91677e620034d4e84c25dfb81ccc6c1966cc4a533242aec329ae8664d498b5e2e928e48d007bf033335b0d367c75efc62bcfdfb9f9daabfab7efdec59500c41ce77a016b001dcf5cf35b4ad3864304ae1102f39cd80421976bee4c759e2c722825adbcbb00a3f47ae69ef47095862b75d1be5735af3739e03eedbcfbfbbabbbb3a4bc5a400a6836e251da48db3699ce09c1055779dda0b94f29c6efd73ac3fc3fae75aff003cebcf1418ceb7fe05d6bfd0fab3ac5ed1683e2b7617c5eee2d8cdb67173a200a16b747363372f76f363b720760b637749ec16c56e71ec96c46e69ec96c5ee00d2d82d8fdd8ad8ad8cddaad8ad8edd9ad85d16bbb5b1bb3c76eb62b73e76bd00b1db10bb8db1eb8b5d7fec36c56e73ecb6c46e6becae88dd95b1db16bbab6200b73d763b627775ecae89ddced8ed8addeed85d1bbbeb62777dec6e88dd8db100bb297637c7eed9b17b4eec6e89ddadb17b6eec9e17bbe7c7ee05b17b61ec5e0014bb17c7ee25b1bb2d76b70b7dbd34762f8bddcb63f70af1ec95b17b55ec5e001dbbd7d8674df6d96b63f7bad8bd3e7677c4ee0db1bb33766f8cdd5db1bb3b00766f8add9b63f796d8bd35766f8b06d65fee8ddddb63775fecde11bbfb63f700ced8bd2b760fc4eec1d8bd3b760fc5ee3db17b6fecde17bb8763f748ec1eb500585069df1fbb7f8add0762f758ec3e18bb0fc5eec3b1fb48ec1e8fdd4763f700b1d87d3c769f88dd2763f7a9d87d3a769f89dd6763f7b9d87d3e764fc4ee9f0063f785d87d3176ff12bb2fc5eecbb1fb4aecbe1abbafc5eeebb1fb46ec9e8c00dd3763f7add87d3b76df89dd7763f7bdd87d3f763f88dd0f63f7a3d8fd6bec007e1cbb9fc4eea7b1fb99d0f9cf63f754ec7e11bb5f8a67bf8addbfc5eed7b100fb77f1ec37b1fb6decfe2376bfb371bfb7fe1fa2a106d17fc6ee8f22ee4fb100fbb30dffc5faffcffaff65fdbf5aff6f22eddf63f7df22ee7f62f7bf22eeff00a2811193b9fe617d348a35d6afb5fe01d6cf597f82f5ebac7fa0f5275aff2000eb1f6cfd7aeb1f62fd06eb37c6fe8c636dda68f02a466959f17d1b78e4206d000ba30bac57c36fb2f107d8fb03447ccedee7c84237f113ecfd048a77edf1e00005d71a8a43dda9a5b8bd8bba14b7775197e2f6ee87a07d24a82fa534628451004a03f9286e2264a3b8832017c51d2cf469e2ea8937e20eb1711329aec1c61d0044718d36ee608a3b94e4837f988d3b241acc177d51314aabceb496f6c85c900076be71ce26df59e9e75b1a8d3f2b1a2ca722f1b9807475910da7bd47e65994006f0df1417c8ec267102de8a00f8c3281dddcc3b6b8a84cbaf345ba46a2b9d000217f314a57fe5902cf2c81d994c971366ceaf1d1b61ef3ac89423deed4a9c700edf9508f075648a2c85d1f0fb3e1fdb11e9f4538d2afb31d9da1ed1df135ea003a7b21d1caba87bd8bfb639ded261c0a75b637d4d9115fa3aeb38b8956d6bd00a36c787facb317110e853adbaf53670bc1368806e69fa2c85df78eb1e1fdb100ce2e231ce9d7d92ea53adb16ea6c3430f71945eeba37d986f7c73abb8170a4005f677bfb836d30e26bd475f666a29575cf4e2bee9775f66ac2917e9ddd5008007576c4d7a8ebeced442bebdef136bc3fd6d95b0887429d0df30623bf465d6700ef245a59f74eb4e1fdb1cebedc86cd9cede3b9817013c57dd4c69d4c7815ea00f646a5ba5d08757b609d3b8adc75f4141bde1febf69b0987429ded0f7576c400d7a8ebec63442bebde6936bc3fd6d977dbb0697b3f65dbde3328eed336ee190014f7191bf74c8afbac8d3b93e23e67e374d737367684f762c4d7a8df8b2f1000adacdf536d787f7c2f3e4e3814ea6c57a8b323be465d67bf43b4b2ee35dbf000fe5867bf443814ea6c4fa8b323be465d677f41b4b2eeb5d8f0fe5867bf6fc300c65ef892b5175a29eecb36ae40715fb1716d14f7551bd74e715fb3711d14f700751bd74971dfb0715d14f7a48deba6b86fdab81e8afb968d9b4e71dfb671e70050dc776cdc0c8afbae8d3b97e2be67e3cea3b8efdbb89914f7031b57b471e6000b27ec49fcb68d33650b7bac18a555b67d1d863f9f8d66ae1a715fa4f0998400e799a9e3197a4ed0c6de6ddb16eddc7a5defeefe8baeddbe71f7d61ddb6b080022607f5bc0ae89868a80e77514574b61fec02b47e10914e6b4073ae25c974e00910dbc8ecf243e45ba3f33f0ce2cefb3d2e75da8271eb8ca350f3c3c9caaa0008b7ae231123c5375f1e41b090ff33a5b41f672f5e0ec2ae1dd9c3eef521d3c003b1a7a952bf366c2d3a2a08b7ae231123c2d84679a021e25394bdb3ef0d952008a27c4944cf956a1ab66a1ab46a2c993fe5a15f457437c9137ee5b090fea2000b0d613ddd955821171d3088fc63b50ae3d68a902de4617e8b778ba13cfb9df00ac86f2e2e9d789368cfec4d8a1cd35837815dad8d23b097e399b2f7034533c0068f64c19c4d66ab135d0739e3a9e26e234eb0578216fdc835f03c9338de2100066fb25af84b1c58311fcb87dacf3c891239a1956ffe6b30ab6475866d94ed500537a6ebb0a4a32cbf61ef705c208195b098f962dd32cf0343b74b13ff2f6bd001fcafd575eb36e61ea08d382b26ee5886601bd2b9c16b8641bdd40ba69231d00b529c982f2a811e5c3bc356cc872f5725ae03da6bc15faca02f7cbb8463a860051788f0b6c9b8d044f81f068bc8b4a7296da414c6ba73da6ea10ba6a11ba6a00249a76d25f8782fe6a882ff2c63d7f1a3ade301b3cd216ab27ba695582117100dc6f68f5bfbe36ac5005bc791c88b10997178f49aaa1bc786e014740c0163100f6cd4d340e5498cf2cb04e614f1d24f497239a4fd138f0161a07360bfdfac600de951a63e11efc78acea1a27f13850c11e2ee939efc1087e5c77ea3c72e48800e676cf3890654618ed94afedd2b26f7def421b61947d80a6fd3555e099ead000c5fec8dbf77e306f2dfb47a16e95de27d80768b764ddca11cddd621c8878e000c27be29a9f006d2de58d674d36be5df0de63e3651e4d91ae0dabd0a79574dd0029740dfc1da46bd0bc43e8bad3a36b6e03a01fd0d646fbda813536be53f08600ae651e3556d79de9eb64c83b85b17b8be0af39efe96b4b2a31171f78fb792b00d837a31e2bf3fa59faed415f094f7e14783a088fc6bba8d4ee95fa2e6c2b4b007becde2d749517ba6a249a2ed25fb782fe5ce372dc835fc01c3007cc0173c0001c3007cc0173c01c3007cc0173c01c3007cc0173c01c3007cc0173c01c300700cc017331600e9803e68039600e98a38039fff4ae8039600e9803e68039600e009803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e6008039600e9803e68039600e9803e68039600e9803e68039600e9803e6803960000e9803e68039600e9803e68039600e9803e68039600e9803e68039600e980300e68039600e9803e68039600e9803e68039600e9803e68039600e9803e6803900600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e980003e68039600e9803e68039600e9803e68039600e9803e68039600e9803e680003960ae3acc064f0bf859bf9ee85aaa0423e23a094f87129ea9020fee3baa8000b7d1c59936dc6c7d2eaf3309633594d754c278b00d17ac3f2176474d18c45b00481d6f5fc1e06d237e45078e1cd13c7fca20ed648bad819e9f49f2b48a382300433e751906740e5ec81bf7e0d740f2b4521cc26711c6e6d4310ee839efc108007e5cbfeb3c72e488e654abffc3a2813a7596436684d14ed5537a6ebbc6ea7d00e532984a785a94f014049e82431763c59bdb2ebc4ff5f49cdfa3a94a185b040046dc4f258c882b109ef4dba6f2ef75e03db6bcdbd2e75da88f86be23e6aa1100f7450ab7111e8d77b69e788c048f721b926f243ccc4bab2df0d583a955c25b00a1cf2a70ff88ab5c99b3cddb953e9e2eb65d478287c74c9de9e369559233cf00f6f89e14f335baea11baea10ba6a249a6ed25f8f82fe6a882ff2c63df805cc000173c01c308f16b3c123c757f54437b54a30228ee7aa14fa94b276445715f00036ba80bdcb738b78cef6763594572b61acb761d8a1662ae2669aab4a7f0e2500df5523f8150907f8e5886616cd55dd4a735572fcca3616eb5cc37e2a373f08007e0d240fcf9320cce31e0d9bb386b0488ce0c773f9751e397244f3529aab62005978feb347c419f9a6a72f5fabab6dc73df83510f61ec2a335de6916789a1d00bad81f79cbf5a06e076f85b62faf54b74aefce39362fb451b26ee588e66e7a002f382d70e13d411e0da49b7348471aef89c97786928ece153a02fe19a423d000dc2b748478a9237e77a19b7349470ab2144cbee729e968a6d011f09f473a0200cd03424788973a9a413a826e405b4b613cdb637557a4fba72be3267b997ccf004f90efa6612e93ef054f1f6fab8c8828af5a0a83d7489ebb68cfa734e709ba003de2fec068b08cb81ee0f963540f26126d314aad6eb6b17e53ccb754e7a10b00d4f99942fe1cd13c2eea3ce2810b751e793490ce58e717087d36d9f8f305ef003dd1d0323a9fe89574d2ceef5e8af996747da1cd0bba66fce6ca11cde784ae00110ffa0ea1ab06d20f68f99dc0b31a1b7fa1e00d5dcb3c0cbd924e3a4cbeb300d2cfb7a4eb67d9bc2688bcc12f47345f15ba463c70f1bcb7b91a483fa0ada500bc5977b54483e7d0b5cc03ba56d049a7c9f7a2f4f32de9fae268a8ae81ff2200d23568be27748df848e87a16e91afab998747d91d05d938dbf58f086ae651e004d56d717a7af932176764d34d4ce063fcdfd30bef14577e03da6bcd35f3f1b00d8e722df3fcc07801fbf7fbf1de6fdc35c0dcf8dc8baeb4a07fae94403fe750082e662c2059a3f8abd356d8256f35df5955db5f05698172badbb72199aabdc003a27cf1d2bf423edf5d1d039b0e1f05c447834f65229c9599a07996df34a7b00dd758ed055a7d05523d1cc26fdcd51d05f0df145deb807bf803960f661367800d03e016b3dd15d5c251811c7fb5214da8db27dc54555c09bd7d678ef2b9ef3003a4f359417ef553fc48631e76b4c9193ea06f12a8cc7da192fec36e0e0312a0068ea686ded548badc1a15f23cf05224e69fc5ed23978216f39a7d140f2f05c0005c2bcb6a63077d65e130db51b1823f8191accd3d645feb919d04cb3fa3f4c00c88236c994c17411a7b9a60c5ec81bf7bc8601ecd3098f964d3b4be099e5d000c5fec87b86e03d2323728f8477faeb6503635f6eb3396f5efb03cdf9f4de72005ae0e2bed35c0d24438faa2cee3572290bef1fa913343d242f686693bc3ca6006659b4da245f9da806deb5c48fe7036b05267361fe50d683a648ad5f2df0de000c5ce5c6c208ebcc15b4e7eb05bfe1f068ef33539a13c9f35c42da6373f99d004f51e88abff3e1b184d6b75172bf11ee5ddf543445e9eaa27904ba6876e05100d8e3565617fc9de06830778c43cc41cf41cf3ecc41cf41cf3ecc41cf41cf3e00cc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc0041cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc4100cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf0041cf3ecc41cf41cf3eccd5a0673e0f167cf93bf29e2ac18838edb3c20d1edf00b70f9d55c09bbf11c5b7365c5efcbd623594d72cc2a3f00d68e9bb8a06c1cb007cc774e5819a7c0ba53df8f2db538983bf3d3d62f220ed0e8bad819ee33de300ef44f8dd53f8aeb35496c84be6cde78fb1fe10076cfccdec4c11a7f99d973c002b10f77c9ea294652cf5a8c9dbd766ccd42d87029739ae1a715fa4307f37ab00d07eb6f337c323c1c3ed79f8c6cafd8dd574a1ab2c7f63e5d245b5dbcce5300057abcd5ced7a3678647fc336d8cc2ac158499bb928f0e0be1236f370bcd96600663bab5a6de622e129a68fa76433370a5ec62e7d806c660d7ba146f02b120e003e6b0034274e1aa47d0fd9cc788ef78cbff5e6774feb1f19be73f8c1af2172009f1f22ed63df7f33b4de13df7f333a09a394652cf5a8c9db77de8b725b59e00032c735521b55c1c61af59981daff5f559233cf6d7bda36f36ca12b69a33612004d33e96fb682fe5c363ceec12f600e987d985dffbae2fff9765509c64a8e41007dfd544b15f066db96ed21d7ff8eaba1bc94cf2e2ad9b6870a5ec67efcc58100ba7c794e1236acc4c1ff3ef9f6d183d87e4db62d9ee33de3fe99df3dad7f9f00fbc629fc4f2fc8c376a3b4637dff27d37a4f7cff276b218c5296b1d4a3266f005f9ba1dc561646fbdf5f6e3fd36f9b0a796e0747826736e1d19807506a834b00b62dce674ddbb69d2b74e56adb413387f43757417f2e7b0af7731dbc9ba2740075316f04ba98e7c033afc2ba00bfd1629e330e31073d073dfb30073d073dfb0030073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d073dfb3000073d073dfb30073d073dfb30073d27c36cf0c8f5a17aa2eba8128c88abc4be0000df7ad5ec2ae0cd6bdcbc2e8ae7bcbe580de5a5bce7b5b4ae7598e065d691005f3351936f6b9ef71062ffa6c4c1ff4efad95183b477586cbc568cf7ccc8e300dacfa1b517d7b75f01fc78ad98d78fe57a763da5a9c43e0bb94f1ef7b309a30094652cf5a8c97bb8fdd44ae550e032c735d235e5f4d744dbf2dc0e8e040ff700bf1aff10d59173608d1b6d6dda6bdcf385ae660b5d3512cd3cd2df7c05fdb900d6dc710f7ee31133f36e8ad22dbf0523d0c502079e0515d605f88d16f3bc8000b9229843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd0898007d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d009843dd08987d9843dd08987d9843dd08987d9843dd08987d98aba16ef099a300c05a4f74cd5582117195387bc1b7df6b6e15f0e63da2bcaf10cf797f5e35940097f2d951a57d61870b5e661fe62d0769f21dd823da41fc8a0e1c39a2f9f4910083b4cfb7d81ae839de33dee7c6ef9ec61eb672fb7dc1af21da779f7b43b4ef007ed07a4ac37550eb3d992370e37e2e6194b28ca51e3579fbda0ce5b6b2c065008e6ba47b3215f6e7b5733b38123cdcff6aeca7579233cf6d7bda7b44170a5d00cd15ba6a249a05a4bf850afa73edffc43df805cc01b30fb3c123fb857aa29b005325182bb97fd9d74fcdaf02de6cdbb23d84e76c57544379cd263cb3d3c75300b26d8f10bc8cfdf838d9b6cde9f36daf11fc8a8403fc7244f302b26d3f41b6002d9eb38de81aa7687dcbe61ba7801fdbb16c3722dc461835ec959a68df6f4a00659bca730a751e397244f345ab7ff3bd5a23c9c032cbef6aeb297d25da4439004782fb8584518e2935ede76681a7d9a18bfd91b7effd60de0a7308a31e3770001db8247d3ced5cff4782e712c2a3f18e28c9591a372cb279a53d6e582c74b50040e8aa91681691fe162be8af86f8226fdc835fc01c30fb30f3b80158eb896e004e956044dc42c2a3d06e94eda72ea902de3c6ee0350c3c675bb31aca8be7750015ecf7d2b8e148c1cbd8e6ff18837183c4c1e38667d1b8e1808307c2be7183006b0ca8b5bee11b03821f8f1be6531cc23c6e50b00fda5d36b46bbe06f5adce0023478e681aadfee5b881659663045f9bb8287d99cbbe638b082364e476298c001b2af37e306f85be60d4e306ae030aed7e3bd7ff91e0594c7834de1125394b00e3862536afb4c70d4b85ae5cfd26689690fe962ae8cf65abe21efc02e680d9008799c70dc05a4f7473aa046325c75abe7e6a7115f0f68d1bf09c6dcd6a28af004a8c1b8e12bc8c6d3eeb6055be05d7b841e2e071c39c230669673bc60d6c9f002e14719ae354b93e8a7bf0e37103cf75cb7d33beb1eb58dad55296b1d4e3fe003acf3196728fa4ee22cce3dbf4dbeebe527b80fe1ced81ecfb7344b38ec6ae009c16b8e6386441dd5e5271f906f42d31bae64dd107d4099a25a403d06c261d0064b58ed6923e50be4d361e3478bec7c62f12793465587f3a76cec0fbbccce60085f77989288f1cd15c27dee7650237de67d7bb0b5a573ad0977bc796887c720044f36ccf1c19682752b81855a6ecaa81772de98ddfa35aa2e1f9037e1f9711003dcf3314d393a1346fc475c15ce5e669782c79a9129e25a3c07329e1d118870028c9599a375a6ef34a7bde6885d0d512a1ab46a2594efa5ba1a0bf1ae28bbc00710f7ee311b3c123dfdf7aa25b56251811b794f028d4e7b26de1a555c09be70033780c8ce73c96ac86f2e2756b8575b2d27cc6d18297b13fde49f3191afd0d00db15b07780c365bbd7d37cc6bb693e03cf795ec03537a5b54fcf3737c5731700d2a66aa0308fa314d6a20aae7742ceb5729dacf3c891239ac73c361ecb2ced001f5f9bb83c7d99cbbe63cb092364e47649cb3e9463d9250e5dec8fbc7def0700f3d6b21f4763cf721d5068f70b5cff47826705e1d1784794e42cd9b32b6d5e0069dbb3ab84ae5cfd26685692fe5629e8cf65abe21efcc62366b66781b59ee800965509c64a8e017cede78a2ae0cdf6ec5e5b899eb30d540de5c5f3060a766500c99e3d46f03236e3536360cf4a1c6ccf7ee5f041da7f1bc69e757d33ae357e00f27d330e7e6ccff2f7ef08b33dabd06f155cb61d78831fd7c93a8f1c39a2f90013d9b32c0bdbae2b459ce6fb045ec81bf7e0d740d8b9cf08b66b65dab5fd5d00ee91f05e993aef813510d471b4a1785fc12fc734f5033ed640a4ad85b694db002ec8b04a5596013dfa6c3ff03334ab6db84ed0ac2279417308c9abd907f8ca00bf12f37781b79ff7ead4790fbc736b6c5e78e750f7c02f473493c53bb746e000c63bc77d156400ad2b9d1c03b9de8d55221f7e374e245c3c2705da89142e46009529bbc07b6c792bd867a5791caebbe62a378fc3fdcc65a9e369edaa8f86f60033c3e1b98cf0a4df9e0ccc2ba52fe7c0bcd25a9b57daf34a970b5dad12ba6a00249ab5a4bfcb15f457437c9137eec12f600e9803e68039600e9803e6803960000e9803e68039600e9803663dcc060fe67e80b59ee8d6540946c4ad263c0a73003265e7e12eab02debebd1178ceebe9d5505e95d81b3149f03273fe6fa91fe4009bfe9c696b17cfe5638d01385ceb5cafa2bd11f75a6c0df49cf746ac14719a007b4a7debf2bca754ae63345098f746a4ff8dca809e977b30f2991128fb3a8f001c39a2798f675d85654618ed1f7fbbc36de258b5035c06fc8e69ad4dc875df00550e5d8c156f6e13f13ef19a06bf470a6d50ab6bed0ff74b08a3ec6795d6730046b4df466bad64b46b37ab75f1e4792f2af3d2fade7034eb68fcdeae55c233009aef0dd91ed568d794e4ccb3adb327c57c8daed6095d2d11ba6a249acb497f00eb14f457437c9137eec16f3c62e6b691bf3704dd9a2ac188381e0728d4e7b200edf75ad2cf641b663bf44764f72a7c335c70d9bdc0c1dff483660dd9bd3f7500d8bdd56c5fb9ce18d3b271788f5091ee2b615fc9f3d6960ade0d91db765128009b82ab6cd688b2e1f7b52e72db5b39a2f983b0f757095acdfe7734f600f7bf000aed5c17b7a923c1b38ef068cc2528c959b207d6dbbcd2b6077a85ae5cfd040068d693fe7a15f4e7eaeb710f7e0173c01c3007cca3c5cc3639db9ca05b532500182b398ef1d9e4eb747997e6b8a7085ec69e3ee99041be0af64b17cff5c3d600070ef0cb11cda964eb9f6ab1f1b7756cebbbc6765aeb15beb11df835900c6c0083ed8fb6be6fed66385b5fa16cba5c65b346940db703d2d6e73a089a82ad7700d2d657b6ad476deb739ba1d07e76735b3d123cbd84677dfa785a95e42cd9fa001b6c5e69dbfa1b85ae5cfd0f683690fe362ae8cf6543e01efc02e68039600e0098b38099c727c05a4f746baa046325c774bef149af2eefd2f8e458c1cb8c010036d1f844c1e6ea36325f4efc8a8403fc7244f3dbc30669afa0f1891c8bf8c600b9ebd397a1ec3817fc1a4806b61bf7c7f189dc3f79b9e0ed1b9fac4f1f4fb700ab6cc07b3de908755e8e4fb80e82e646cff844b95c0ba3dd97c165bd217d3c009da31d2f719fa3d17e2ac999e7fe27edf1499fd0d51aa1ab46a2d948faeb5300d05f0df145deb807bf8039600e98c71633f7396cef806e559560441cdbae0a00ed7359bb79832eef92dd7c9ce0656cd3fbc96e5e9f3edf4e23b33c1f0738c0008fcfc7f927b29b1f24bbd9f5ddc87a11a739de012fe48d7bf03318a52d5d89003db7d26eaec47e5fdf18a212bc7dfb8794edf3bc52dd2a701b85f703f8c12f0047341f219bded5be61af1bf2e06f2a2a61d72acc7f14b8ef838ee4fc478e68003e2574d4e7d111bfbbb25fa88df69d836ab2f1b28fc5ff66641e4d916edfc600dfa414e91efc94f665965ddbe3ff6328ecb1ef72d585f5f69ecf5b03cd578600a90b582f461e0d1e3d6a7dbfc078a26864df2fb09dc7368bc6bb574f7c47820091edce4d4a78368e02cf26c2d39f3e9e5625394bfdcd669b57da63f92d4257001b85ae1a896633e96f8b82fe6a882ff2c63df88d47cc060fde1b60ad27bad50055821171fd8447a13e97ed3336917e8eb7e1f5d6376dfcef688ca265836d24007e45c2c13618686ea531ca1f698c82e7fc5de07a11a7d50e951ba3805f43e4005e23d2e8dbb8bc619fb8beabd7e20d399177afe0cddf85703faf50360557d90080773fe908ef415de4b6e573445312201a9cdbef13b49afdef68ec01ee7f1500dab902b7a923c1b385f06c4e1f4fab929c257b60abcd2b6d7be00aa12b573f00019aada4bf2b14f4e7eaeb710f7ee31133db03dcdf816e759560aca40de5b30007b6e8f22ecd859e207899befcf88641be1a6da791b99ff8150907f8e588e60062b2339a2c36e3adb7cfd9ce70d9951aed5b39bb12fc1a48066efff7473b03007222ef7ec1db676728944dc15536ab45d9703b20ed0cae83a069f1d819cae5005a483a37c2fd64da784663f7709fa3d17e2ac999e7fe276d3be34aa1abd54200578d447305e9ef4a05fdd5105fe48d7bf01b8f98f91de5fe01747d5582117100dcd72bd4e7b276c6565dde253be344c1cbf4e5f3c8ced0ea07e4b909c0017e007c6ec2a164675c427686ecb7ea293dd7232dfb10bc9037eec1cf6094b687e6007a8bcfcee8ab006f9fcd5509debeb9944af0f6d957fbbbce4752d7b4ce2bf100957725cea4f495772578fbcabb12bc7d7b9199b7c679727c9e27ae7276adf600199bbef33c35fac9d18e31b88fd11a636c1e059e30c6187ab9ecf5cd4257e300618c51ed98798c01ac591f63f8daefada49f936c98cf0e7e4905c602ccaf480038782c009a1f1e3a48fb321a0be0398f05b688384dfd8217f2de22f4db10ed003b3ed0b4cff8cc8022dd57c236f48d8bfa4817085fa65b360557d9f489b2e100f59a3a4183b439a2b95bcc39bad60514745b18ad2da4dcce758ed63eb992f00068ac2129c959b207b6d9bcd2b607ae12baea13ba6a249a6da4bfab14f4e7ea00eb710f7e0173c01c308f2d66ee73d8de01dd655582b19263029f7d7ba52eef00d21c7a93e0656cd327c86e56b06b3a5dfbcc8103fc789ff97d6437ff0bd9cd00d20ee37112d723ad3d1fbe7112f8198cd296aec43c97b49b2b31c7e61b43540082b7cf6657b6cff34a75abc06d14de0f59b77244f303b2e95ded1bc6973c9e00836e2a61d76e53d2d1554247c0bf8d74049a9f091d5de5d111bfbbb25fa8a500bcf1acc9c6cb3e16df2dc93c9a22ddbe8df7a214e91efc34f72ef9da009edb005598d7ee74d505d4753e471c34bf1fa62ec8317683478f5ab26c13b25ce1900005347f11b2205ecac2f55ad6d55aca9beb29d7773c47bd967934e9e9a460f200dd9e7ebe255def8886ea1af8b793ae41b347e81af191d035f26820fd80564900963693efd54a3aba46e808f8af261deda5691caa23c44b1d6d271d4137a0ad00a5bcf1acc9c65f2378a33eca3c9aacae1574d26ef2dd997ebe255def821e6d00bec0bf93740d9a4385ae111f095d5f4dba867e40ab244b87c977b7928eae15003a02fedda423d01c23748478a9a39da423e806b4b594379e35d9f86b056fd40047994793d5f5b5e9eb6448df8b7e7f8be0afb997c837eee03965ad33a17de70025f039e20a676a77b2cea5cdc1e71983e674510fa5ad843338d8e670e9514b0016391ebfc2210b68a60a597c67e7b8c6c17d159045b60f4b1cb280a67598f60041fe8f86e71daead802cbb852cdb1db280a64bc88278290bf7bdb2fdd294e5003a21cbd50e594073ae9005f15216eedb2003686b29ccedb391f17aba2f3e4d001937d9cbe47b43827c370d73997c6f7cfa785b6544447aa8a530788de4b98b00f6064ab356d0ed11f707468365c4f500cfe7523d9848b4c528ddba097ed2a600b8ce8169a1a89bac03931675936d0aa9072ed3627ab20ce913d11faf73f0d600feb70678bbfeadb15289776f34b41c70bfb202bc7d7b2b2bc1dbb7b7d2f59f00e782f5f96c5cfeafaed679b03e3b8dcf83c5bf9a95ffc352c223ff455d49de00be7a5a09debe7a5a09debe7ababf97f770bcf97c3bfe0f7bfafd435fc1658700c9fe81edb0ab87b1c3563a64c13b7d5d19f95c798186bf4507a63a41e3ea9700af17b64216eb5296796bbd2fb067f1bea0eef1fb029a1788f7e506811bef8b00ebdd00ad2b1de8cbbd1bd7897cf8ddb89d7099609ba09d4871c5a83265d7560005bc8d2e60ffa06ceae939db460a638f12c6368111f7d71146c42d273c0525003c33049e190e5d68f19e2578cfaa20efe982f7f40af2ee11bc7b2ac8bb53f000eeac20ef16c1bba582bce70ade732bc87bbee03dbf82bc9b05efe60af25e2c00782fae20ef1582f78a0af2f68df92ac1db37e6ab046fdf98af12bc7d7d3ff3004edfee18b019c12367f3859dd546f1a0794c8c5b6e481dd3507dd4087db00d00b85c8977abe08d7bb6675a9578fbec99d60af0f6d93395e0edb3672ac1db6700cf5482b7cf9ea9046f9f3d5309de3e7ba612bc7df64c2578fbec994af0f6d9003395e0edb3672ac1db67cf5482b7cf9ea9046f9f3d037e0d143ed3fa663e6100b988d35c0ff2d93dbc1e94b761ee7fb5fafebcc0237937925e5aab54678d140097273c672ae1f1d92c675680b7cf66a9046f9fcd5209de3e9ba512bc7d364b002578fb6c964af0f6d92c95e0edb3592ac1db67b35482b7cf66a9046f9fcd520009de3e9ba512bc7d364b2578fb6c964af00efd58e8c72ac53bf463a11fab1400efd08f555f3fd640e1b308cf594a787ce35ae69dfe98baafa38678607d0172002fa778d034d9f3130e532e1fc85f23f4c17523afc4fb998237eec1cfcc2760002c7f36c561ed631ac561df453bc5611fcd548ac37ef77328ee261b3e97e26e00b6e1f328eed9367c3ec53dc7862fa4b85b6cf8591477ab0d7753dc736df802008a7b9e0dcfa0b8e7dbf0c514f7021bbe88e25e68c3b328ee45365ca4b817db00f0748a7b890dcfa4b8db6cb887e26eb7e12e8a7ba90d7752dccb6cb883e25e006ec32d14f70a1b9e4771afb4e1b914f72a1b5e4071afb6e1f914f71a1b9e4d0071afb5e1668a7b9d0d2fa2b8d7dbf0251477870d2fa4b837d8f0628abbd38600e750dc1b6d7805c5dd65c3cb28ee6e1bbe94e2de64c3fc7fe737dbf0068a7b008b0d2fa5b8b7da30ff67ef6d36dc4b71f7d8f07a8abbd786fb29eeed36cce700e7df67c3fcef9e77d8309fed72bf0d5f4971efb4613e2bf35d367c15c53d6000c3db28ee411bde4171efb6e16b28ee211bde4571efb1e1cb29eebd36bc85e200de67c37cd6d1c3367c2dc53d62c3bb29ee511b5e4b71efb761fee7fb3fd9f0003a8aabb561ded376800ddf4071391bbe8ee226d8f08d145767c3d753dc8136007c13c54db4e19b29ee201b7e36c51d6cc3cfa1b87a1bbe85e2ec2f00f7b6790026ce7e86bfb7cd337176097d6f9b67e26cb7b7b7cd3371f638febd6d9e893b00dc865f487147d8f08b28ee481b7e31c51d65c32fa1b8a36df8368a3bc6866f00a7b84936fc528a9b6cc32fa3b82936fc728a3bd6865f4171f8f7fb2b29ee78001b7e15c5e1bf48afa638fcc3e0351487b34c5f4b714d36fc3a8a3bd9865f4f0071a7d8f01d1477aa0dbf81e24eb3e13b29ee741b7e23c59d61c37751dc336c00f86e8a43bfff268a83fdf1668a836df4168a9b6ac36fa538d80a6fa338b4fd00f7501cec877b290e7dd3db290ef6c87d1487358f77501cf686dc4f71d83bf2004e8a838df22e8a433ff900c5a13f7d90e2d0efbe9be260533c4471e8b3df430071e8efdf4b71b083de4771b03d1ea638d8468f501c6ca347290ef6c3fb29ae0068c368f34cdbe23b0bec0a1167daa62b6db818a56b7fca7fe6e11efc0cc6ad00365cee5f7b4d36bc856890479da0719d05f51e61eb2b9cbdd46d308de6eca500470813a705aeb5421ed7d94b4ab294befddc2e646972c8029a0f0afd6a9c4b00a3246ba99eee20994cbe5b1db282e6a374eedec76d98df2b3e33e0cb8ee7b8006ac47d91c2d09f91f99af4652e9d53bb937016890ff3de455853e2ddcabc6b00a2a167b4f0792e087fe9d0415adf592ec06ede117cfbced865ba2b44ba46a200b9da217f314a577e79fe8f3c7fc694c9a7a89ea11e194c5a67a45dedd1511300e9083457928eb4ce5fbf52e0010e3ee31be52ffb00a4e5f339be456d149fb7000a39eb23f719e60a6d592b6347def20c28fee7018fd99a848c7c36e9783e37005f014f37db12f25f047ca62a687e21fa646987a04f3e8964810cca67e296f6004f6ff3c8c2f51d34bfd1b7790a9ab6e3552493c977b34356d0fc81daca3f3a00fa5cfe1f0506bba3ed93f99ce81de9cb9ce73618e5bbc3c1fb1ac29a12ef2100ed3ffa6479a65c8ec2ffa03e59f665d035b09b77046d1a6397e9ae10e91a2300b74da2600f0db10191b73c3bcf94c95fa89ea11e69b6a5db23b78e4e221d810086dbd24a9d652affeb626850fe75820669f9df2f13ad0ee5bf7eb94f96fd9900e63800bc9037eec1af31daf7dce07a878cfc9f1ddf7f2dabbd4f76a5c37cd80026a2411e758286cb1b3493a9bc8dbc0a672b77b1ed3841c8eb9a1b389e30b900ecce25421e9eb3603b58ebcc6bd9e79fe8900534a708fd6af5f95a67c7fbfa007c961534cfa07fc89e497d3aca89ff47dbed788e2bf4f923ebf3bb0e1ba495007d37743dda3e7f8b48578d7dfed954cfbaa9cfd7b27bb77b747422e90834fc00ff04ad3e5ffecf41fed7d9d0a0fc651fc0632cd0143d7d3eaf0fcafe52b3cf00072fe48d7beef311c76bace5feb36d3caceff29aee66113731aaae7f59bbd200615d6c3dd1208f3a41c3fff703cd22d12729d8385dae71befca7258ff39789003e5f8ef39708797ce37cadffdb49fbe504872ca0592df4ab31f7a0699bf21c00bbc977934356d0aca3b6b897fa7494533fe9ed6ac7735ce5fa7cb6e914e6fe00f2dcefc8f36b9937f7cd29f11ed2e7a1cf9767caf35ac70eeaf3e5fc3074cd00e7e6c23663ec32dd66918ee795af72c85f8c74fb57796ebf29933eaa675753009faf6df74a1d9d403a020d8ff3fb95f0c83da5c0017ee5fa00a4e53ee006d100e7a3ffe3fd49d26ed7b4b17ce361f06b8cf66defeb1d329afa713cf5f91b85000c26cd7a875c5ae5065ec81bf7e06730f6daf0fa31c073bcc0c375ad4ed020006d8e686e177d9d82cddbc5f56382d0a3cbbe7985b02564dd5a22e461bb4b7900fda3e0b28ba05f975df43afdf919555b82d7064cbebd0e5941f3466ae3ef7600cc0f6c24bd3d9870fe806d458575dbbc6b9fc6550ededce7a7c47b485f0a5b00027cf83f41083f40b6841c7743d7c0eefa47902bdd1691ae3172cf9f28ccdd0038fbedab046653266fa17af620d9125ae3f56d1e1d1d4f3a02cd268a43ffc400e370bc3fdc776d54c2dd2b70e37e2361441cdb0db2bf307afe9ddd20cbe7ee00ae72c8b58ae4da5061b9c0af81b0e3992b1df6b1f239f6c8a34ed0206d8e68003e26daf6f4cbb1b58bf7354c88dce5c87b323e25fa4eb92762b990a781e4e100b921853a59da03d72f6439ce210b689e10fa55b0a93a35df3fb6db4dbeeb1d00b282e64bd4a67d85fa4694d31ad2db8f1ccf7195eb3ba13fa539b23ccf6dca007522e6cdfb5253e23d645e157d27f8b0ad82f00fa9ef947355d035cfebc975001357ba5e91ae9168363be42f46951983b1bdfa75aa673fa2beb34f09d3668f008e8e231d816603e948ebff10eb051ee000bf727d00d2721ff00b310e47ff070039eb8996fb46adf12178216fdc835f63b46f7b5fef90d1d48ffba9cfbf5ce80089c7e16b48ae5e25b9c00b79e39efbb1754206573a7ccfb2966890479da04100da1cd1fc45f449e9db38037d3e8f9558de0d8409347f137d3ee2816bb9908700e72c40ab64af75bbec97631db280668fd0af42bbd4ad699bf6934c26df750e00594173c0e1837a9960c3fc5e5d4e7a3bcaf11c57b93e9f6d3a85f151de35b700b3d9c19bfbe694780fe9f3d0e7830fef9541f8c8c30769e51a2c74cdeb537200ddc4956ebd48d748349b1cf21723ddfe55aed199329948f50cf5a81276afd400d1b1a423d0f4928e2af51f24e0e0711fca5ff6013cee03cdf15687e8f3d1ff00adb77e7db46f7fa969638117f2c63df835521c7f5f2d6534f56313f5f9970900197c7269959b4f2efe0710fa71fe37ac4c87ef5a97100df2a81334489b239a00b3a9bc8dbceb539777a0cfe7726079d71326d0e40993ab8e2f17f2b07dc4ef00dcfad4651998efdf206499e29005349d42bf0a7d739792acad6c6fa1cf5feb00901534e7505b7c2ef5e928a7cb486ff31dcf7195ebf3791ca530cec8731b8f00f2ed77f0e63d3029f11ed2bfa0cf071f9e6f41781ef5f9b2af84ae792d0f6d0066b9fd3b978b743c8655b6b7ca9e8d047ea532a17a369ffa7cadf1599f474700534847a0e17f6929fc03b895db77e40d1c3cee43f9cb3e00697344b3ccd3e700f3b91cb2bfd41c678017f2c63df8f1f7783c17216534f5e324eaf3570b19f8007b0196eb3225b97cdf0b809fc188736396a8e219e893d7929e4cbe93059e1c00d1f4893e19f1c0853e7932c922ff196e6451f8877d81df09298bcbe6b942f400c90a365e4149d621f345e893973a6405cd0e6a2bafa13e1765c2fbde9feb78008eab5c9fcc6d9e429b9077cd196d70f0ee23ac29f11e6203a14f061fb68d1000be95fa64d96f40d7c0ce73558c5da65b2bd2717fd3eb90bf185566de95e7be0076533d7b2ef5c95a6d69af4747934947a0e1b674a9121ed9b60307f8191ab900ef7db2c0c7fbde6ff3f4c97c8e95eccf34c7abbe7defe0c77b02f8fc18296300696da67e20eceb93573ae4d2faaf0278216fdc839fc188b58de1fe05be54c4004d24b98b29e35e2a704bbb81ff05be94e210e67f082ff1e4358968a43d29f900b13df956d1bfa6df060cfc1f4cda2fd29e62fbe5edc3d82f2b853cac2bb65f00d22f4fb72d36c9a15fd03c20f49bfe38a3b54bb3ee72f9987c57396405cd7b00a95f7998ec13d46db65f3ee1788eab9cfdc2e5abd07ee6d96693ff0b67debd00843525de43ec45d82fe08378b6173f4ef68bec63659bcf6ba7e5f622c9ff4c0073df7cb943fe62a43b5e967385a64cde4ff5ec1364bf68fd2be7728f8e2691008e40b39474b45a09cf2a810738c08ffb9c3a4183b439a279c263bf404eee2f00b99fd79a33f1f597e0d748717cdea794b1b44793ec17a4e1f363e7883823d700a54a728117f2c63df8f1387c0ec521ccf68bebdf9e2b9470fbfe15b58230420006b6c5e4bfc76ba27dcf9107cd31448332adf3f0cb11cd8f44ff9a7e1b306000bf709d2a1296958409343f15f68b7c5fe708795857bc37674eeab2e49db24000f7731cb2fc4ae8779502262559878c1960bf2c71c80a9adf52bff23bb24f50004e4b496fffeb788eab9cfdc2e5abb0b72ccf361bca778d8337cf3fa7c47b8800bd08fb057cd88e44f87fc87e9136beec6f78fcc9d865ba15225d63b4effc990066dfb546e0917301a64cfe93ead9ff92fda2d5efacf6e8e818d21168f8ff8800959a7f010e9e7f018e3a41c3e38ebdff7e3862c087fd82be9ccf8e072df7f3000a6d59d9fe12fcf8df8a7c6ebd94d1d48fa70e1e08fbec97c50eb9162ac9e500fbff0cf8b1fdb298e2e43fefd9ee62fb652ced2ec8e0b2bbd87eb9d493d7d1004423ebaee4c775f758aabb3a736703f60bde05f409d25ecb11cd8984c965b3002d16f2b0ae403b91e88aa9c99277ca02dd2f76c8729ad0af828d5c50927548005b22ed179675ef7f638f18d4cb541baea77262fb65bae339ae72f60b97af4200fb99e7fe0ae5bbcac19bf7c9a7c47b485f09fb057c10cff3fe3d470cd2ca7e001fba06769e8766ec32dda5221d8fc7573ae42f46ba730bab04665326d3a89e00a11e69f63b2b3d3a3a9a74049a39a423ad3951d99f0007efeb93f32f470b7c003cff7281c77e61db40f6fd9ae37ddffc0bf8f1fc0bffdb47ca68eac73bc97e00992d9ed747fbf6bb46ae4b94e4022fe48d7bf033189b855c6c1bb0fdb248c40069f6018b046edcb38d051916119e454a782e11785cbc35fa7ed63bae727dd50062c2a3309629b0fd3d123c3c37acd13629c99937f9a2ddd99362be2e7b7ab100d05523d154628ed6d7f681df78c46cf0c83683fb94455582d1b59f4e6b0ec200d7862dad02de4617e857b87f75ed59a886f2ba84f028f4dd7923fbc98297b1002daed7b53d0b35825f9170805f8e680e3c7290f6668b8dfb66b61fe49c88a600bdea9bb7e1fd1390c7356fd3461835fa51d79ca06c530d0ddad23a8f1c39a20079b1b0a9db1c32238cf6af9ed257a24d042fe42ded7e2e03ee47b4ec3a9f7d005c099b722c79fbde0fe6bd2c7dde79a5ba55e07923b45bb26ef1bcd19d62be004fce5fe33d411e0da41bd0d65218cff64443c7a969d88e9becc56bbda3c97700d33017cf6b3d0dbcad3222223dd45298e75b867beea25d4969e4dcd11e717f0060b4efba03aff5be437d2e7a608ca2b186ccf344a8f372dd85d77a1f14755e00ce31a1cef37e06e88ce7e1b4f61ca10dc2fce662076fadf9065f5bbcb80a7800b36dccff9aae267baa31da776d8c65abb5e9f02fdda5ba7acdb31d9b8bdcf60015dbb19fa0796dd4b703a2a1e5c176d9129137d21c45f14b44de7afb75f2ed008c6982c0bdd281e933029342bd69d76c2b5609fd373b6405cd3fd3dcfd1769000d08f56136e9ed7b8ee7b8cacd73f1f85d610f649ed74d50beab1dbc792f4a004abc87ecf1c01a91fcde3247e1efd2bb24bf9584ae81ddf431e8d719bb4cb70058a4e36f2c5738e42f46e9caeffbbe84f71d7d99ead9f7689cae35b7ef5ba3005e483a02cd22d26db34807fae5448372aa1334489b239a9f88b64461cce26c00df9a856cdcbe3d55a1f64d6b7c26dbb74b1cb282e6d754ef7e43ed97b423cc00f3bf3b9ee30aeddbc8dab7bf9569df643b35d2f66da148578deddbefa89efd009ddab7d94a98567874d44c3a020dcfd1625d95e791f1fef09aab963def9beb00667b1e71d01db7b948075b92db65c85427689036473413ecdcec61560792d60094e32c5aab966d0cdb403c2f54ad73b63cd7ec5a375098cf2abb6ec07347900061b86f1d9779f23a996850d7eb3cfc7244730cd5019db9b7be51cfbd1d4b98005c736f72fe9775c57b75b5f6da4959a07bd7feb326a15f85f923d5bd765c3e0026df850e5941733aadf53cc38679fd80d78d3a1dcf7195b333b87c15c68e7900d7b7202b1dbc794f5c4abc87d875b033c087ed3d843b8e1ca495fd3374cddf007ca32f64ec32dd32918ef7c1af70c85f8cd295dff73d3bef7f3c8bea19ea910066bfb3c2a3a3934947f27b18cdbd7fb23f91ebaf6c63d4091ad7dcd679d44600f1be08de53efdacfa475a681cf3e023fb68f9610462923af87fbf6dacd17710046ae054a728117f2c63df8f15ebbf9148730db2f72ffdd58ef11840cae3d82006cbf5ce2c9eb48a2411dabf3f0cb11cd32d1bfa63fde1eb05f788c5c8cdce300edbdeb11c27e9176eb7c218fcb6e9d4874c5d46419982791b240f7f31db25c002ef4ab6067b42bc93a649fa89c07665941b391fa957eb24fe458ac745e90e30039ae31dc7f99e73102ca77a98337efdd4b89f790fd1bb05fe49e3fde8fb28b00ec17b97f10bae6f110dafa72fb0e5dfbc640b3c4217f31aacc580ffc4c996c00a17ab69bec17ad7e6789474747928e40b39074d4ac8447f627c0017eaef9e50023053e9e5f7eb6b05fd097f35aa8ecfb35c74c729e06f73cbf83b8058451ca0068eac73f0e1a08fbec97b90eb9e629c9055ec81bf7e0c7f6cb5c8a4398ed170069d38cb5dd05195c7617db2f0b3c791d4134720e4ef2e339b8d78afe35fd3100439f73cfa6b4d7783cf00661bf489b6dae908775c5fb5e15cab3dd25cb110e00fd82e6cd42bf0a3672bb66dde5f231f9363b6405cdbdd4afdc47f609ea36db002fef773cc755ce7ee1f2d5da9721d7f1163b78f35e8b94780fe92b61bfb8ce008943f851b25f64bf2fdb7cde1fc8d865ba79221def295fe490bf1855668e9d00c7d4efa47af67eb25fe62a615ae4d1d111a423d0cc271d69ad3bc9f571e0e000b51ae0a81334bc3e0e9ac73df60be4f4cd53688df77dfd25f83552dc5cc228006534f5e371b25f3ac473b6cb9a492ead736f7c76199f6fd062c3b3290e61b6005fa44d33d6761764984b78b4de47dfd9117375755160bde32ad757cd233c0a00fd73db68fbce05844763be4349ce3cdba5697feb286dcb7942573cd7cb635300adb64fdaf7b807bf80b932980d1ed9ced513dddc2ac18838b63bb4c602be7600774115f0e63de8e82fb9bc2ab14e319af2623b4ac1de287d9f798ae065eca1003f93bdac609fb6d5087e45c2c17b804073df5183b47fb5d8d89e609b679e8800d39cb7e77eb518b9e767200fdb4108f3f7991a7dbfcb4e966daa6b2e48cac100e3f75a5b16f2fb4cd79c14dbdd0b45dc58af054246ee47b46c519f4d5f093b00782c79fbde0fe6adb0ff20af54b7da789c2fbf4f71adfb1e49ef8a6b8e00ef0009af4743373c8fa2f19e28cd8db5b9e6c6e4de519e9f3a56e868894747fcee004237bc56a6b18f4e690eabcdb5fee9faae6bef1e1ea1a3651e1df13c9efcf600b736da779eb0c9c62f13bcf7d878994753a4bb0715ed03e64be709fe9af31700be76725e15f066bb95d7d5aac9d6698cf69dc367d96a6dbac3edfd025dbde600d9c6cc456edb876dcc9ea30631a3bee1db49b90eca7615f2469ac3297ebec8001beb3be9bf3f6d79c63441e05ee6c074aec0947ebd69cb6bb6154b85fe5b1c00b2ee3da78fc60fb36c98df9f0ed2db52c7735ce5e6cd786cadb0e730cf7b3c00e577f2cc7b25614d89f790fda55873021f3edb1fe125f42ec9bdb2d075b9ef00f35de9e689747c76e4a50ef98b51baf2fbce86e6b30b2ea67a867aa4b9567000a94747b34947a0994bba6d11e940cf737128a73a4183b439a2592dda92f4c70013eef6ad45c8c6eddbe5156adfb4c64eb27d9be39015341ba9def553fb25ed0088d25e2ec7735ca17d1b59fbb6ab4cfb26dba991b66fb345ba6a6cdfb6503d00db4ded5b871226df7ecb16d21168f8db7039ce063db76f789fea040defc50500cdcda22d49df5e75b76fc0328f3081e6d60ab56f5a631ed9be75386405cd0b00a9debd98da2fb90e6e9edfe1788e2bb46f236bdf5e5fa67d93edd448dbb7160091ae1adbb7dba99edd3106f69b6c835cfbc24d5cb30d839ecf57e63d2a5aed00b2ef5ceb0ec28838e8ceb53e87b132b7cb90a94ed0f0581e34f7521b58efa00035e5780beded9136148ff1784eba5ad78b789dcbb566a9f52d9f6fcd92e7ad005dfb9511e6bdc90b3d799d4234f2bbc072fb80df2ffac1f4e7ca07f6268f6600deff83c3ccfbcbb527d615cffb2bf4bdce350ce87e9e43968f09fd2a9c15d300a66967c8f3d3663b6405cda7a9fdff2cd911f25f07e6f9938ee7b8cad919ca006750e4d9b692ff6c769d8b9ab69dc1fb86792e95ed3d84bfe19873853ea06b003e37439ea9e04ab750a46b249ac50ef98b51baf2cbf52bb98662cae409aa67004f929da1d5ef2cf6e8e814d21168785ebe527b5c81836d05e0a81334bc3f0400343f107b12d097f3d939ae3d595ae75ef9fa4bb6ebe49eac7a878cbc17c7d400ff2e1bdf41695a449c91ab59492e396f887bf033183b6db885e21066fb45ee00571eeb3dd5906136e1a9d4de7c176f8d7fc88e76ce4ff97bbd02ff4f70247800782d5663de556b2d92dbf6b4f726cbb6467e9751e9fd9fbe310eaf9d8e37cc00fc2dac6bfd7d769560748d65b5ec6a5f1b5689fd12c3f1e6fd123c47e2da2f00510de5c573360a7d77699fefa98297b12d0e3d5a956f816d068c45240e9ecf00b9f3e841da236dd8673fb8fe433b56df12b1fd50ee3fb45afda8ebfb2bd9a600babef773ad2982e644ab7fb9cfd7f5cd3cefa59f2fe234dfb1917c330f19c700e29bcb6ab329b578fbde0fe6ad30b6cd2bd5ad02cf53a2dd2a773e420bbd2b00ae394ebc27ae795ede7faef19ee8cc89e69d73a2f25b169e47ec143a5ae4d10011bfbbf25f42b5d1bedf7f35d9f8458237f6b0ca3c9a22ddb13fcf6114e99e00e7deb4c6b9be3640f93ba211f1f6d964d5d48ff377edc0cfb2d5da7487d9fb0079ba7acdb3fd24f701f1fc3568161e3d8819f50d7b58a58dcc3603f2469ac300287eaec85b6f1da090674ce5cec707cd128129fd7a53c86bb615726da2d321002b6856906dbcca86f9fde922bd6d713cc7556e7e85c78d955e9b60ded5b03600b199de25b9c6005d8f766d42ae6954e3dac46554cfb6d0f8b04509d3628f8e009a4947f21f37ae395dd0f33c13dea7bac86d13e7886687684bba5297d7ddbe00014b176102cdae0ab56fe9cbea6edf5a1cb282e606aa773751fb25ed88d23e001dc7735ca17d1b59fb765b99f62de9da6bb348578deddb73a89edd4eed5ba70012a6c51e1df11e7dd73f8f5ce710e139aff5698de97ddf50336ec44177dce600221d6c496e9721539da041da1cd1dc416d60bd83d694e36b260e8479ae90e700a45cf311d53a5758cd6719b8ce74926719b8e6e540732ad1c8f57dd79903a00079a7e807d39f27e91bf59ccfbb8799f391f38ebe330734d6795db240f7731c00b23c22f4abb08fb0a039f7c0e563f26d76c80a9ac7a8fdff10d91128275eaf0078c2f11c57393b83cb5761ec98e77e457e2bc0bcf99cc894780fe9d3606780000f7fdf8ff0e7c9ce90fdb3dcef6cde11f9cf0457baf9221d9f0d7d8943fe620094aefcbefdcf7ceec1e354cf9e203b43abdfb9c4a3a3534947a0e1792badbd0042b23f91eb7eaebddea70a7c3cb7f555b11e85be9cf74fc9be5fa92d2bbb17008a6d38f97d62bd43465e8735f57fa68defa2349d224e736fbfb4df700f7e0600638f0d77521cc26cbfc875dbb1de9b06195a088fd6bc4687c0e3e2adb1e63e00daef9e78ef8142ffdc3eda313aaf55688c6db4e6eab96d4f7b8f976c4b5d6b002b95dcfbe31be3f0da42c01c30bb3073bfc8731ba06ba9128cae3903adf18b00afafa8c4baed70bc79dd167dbc6fddb61aca8be7c6146ca4d25ebad3042f6300c3d51fa3cab79d6d338cf9240e5ecff8e93183b487dab0cf4e6b167163b94f0089ed34b6dd10e6bd741af64ab9b525dedb81b6b4dcda12688eb5fa977be958006684796fc45c11a7f98e25f96fce58dbcffb236fdffbc1bc15e610b4ce7a6800e7f960b45bb26ef1bed3a9f4aeb8e692f19ef07c3a74c37b3c35de13a53d7a00edaef95ab95f9ce76b0b42470b3d3ae277579e35aab5775269bf61fb68f71b00f6081d2df2e8a8dc7e4325594adf3b6bfca392e74a4772f66a51e86889474700c39dbdaa35cfca7385c568dff565cdf9245f1fa0fcadc68878fb6cf26ab2e300f89c12e067d96a6dba43edfd1c5dbde6d97e2eb74e049a4b8f19c48cfa86bd0094728cc43623f2469a43297eb6c81beb6d0aefcf103b7682c0bdc4816995c000a4506fda35db8ac542ff3d0e59f7fe2f98c646eb6d98df9f99a4b71d8ee7b800cacd63f2bc81c27e97527dbe947016890ff35e4e5853e23de4ec22ac01820f00e27314de4eef923c8709ba0676d3c7608f126397e99a45ba46a259ea90bf1800a52bbfdcfbb44c603665b291ead90e9a1fd0da6bb4d4a3233e9709342da4db001e914e9ec56668504e758206697344739d684b14c64acef6ad47c8c6eddb4d00156adfb4f7c9cabde22c2b686ea57af73c6abfa41d619ebfdaf11c5768df4600d6bebdaa4cfb26dba991b66f1d225d35b66f2fa47af66a6adf662a615aead100510fe90834f349b7720e01f4dcbec9bde23d221fb60def146d8982bdea6cdf008085bf9d06cd9b2ad4be698d7964fb36d3212b68eea17af7766abf50663c2f00ffa8e339aed0be8dac7d7ba44cfb26dba991b66f3d225d35b66ff7533d7b74000cec37d90671fbb690742be7ff405fce7e93f3816cbf7d58b4255aeb59b27d0093fbdbb97dfb5885da37ad7d553efb8d6505cda7a9de7d96daafbdff1321bd003de9788e2bb46f236bdfbe51a67d93edd448dbb7f9225d35b66f4f503d7b72000cec37d906b9fe236fe2b0ef91f77a220def89d46a977ddfc2741246c4417700dce6221de602cb9dc972a8c887d7c67e4c6d60bd83d694e32f0e1c08f35a3f00af29bbd613ab75adbf9acffb810ce5cefb71adab83e634a2417d28772e0f6800fe20fac1f4d73907be8519cd9aed9f8759b395fb065857bc66ab358e92b24000f7cd0e59fe2ef4abf0bd95ea388acbc7e4dbe19015347ba8fd8f260d8479df0009ef373ad4f11c57393b83cb57612ffe90ffb34b3b9279f3ff4152e23de4bb000bd819f21c1afec6b971d220ad5c8f86aecb9d09ee4a27cfbae5b3f71738e4002f4695e91b79adfe80498361d423cd7e67814747a7918e40c3eb8e5af6835c00cf050efe6e56fe8fc6b5b70f3493ac0eb19fccf59d896b3fadd6b7a3befe9200c7ad723fed70fb281b08e34c4ad323e28c5c5ae717c87511dc839fc138dd86007b280e61b65fe4becbb1fe86073274121eadfadf25f0b8782be8a2c07ac75500aeaf523e43bb30da3516de6ba2b1aea4b5d782dbf6b4bf85916d8d6b6f4c2500f7eefbc638e5fe7b53ed980d1ed966f0d8b1b34a30bac6b25a76b5af0dabc4007eb0e178f37e30f43dbefd60d5505e3c67a3d07797bed1385df032b6c5fc4900aa7c0b6c33602c2271e488e65b64172fb2619ffdd021e234f71a0cb7ff9ded0007b62910e66f3434fad19a68dfef7d659bcaeb0b751e39787d618db0a9db1c003223cc7b2e678b38cd770cbc90b76b0e0a32723f329676ddfec8dbf77e306f0085b16d5ea96e0d393f5c9e4bc77b6341b38dde15d71ca73c8781e7a2f9db21008df744674e34ef9c13759dc50a9a5d4247f33d3ae277579e135d1bedfbed6e00938d976bbc38ef58e6d114e98efd796f7791ee79ee4d6b9ceb6b0394bf011d00116f9f4d564dfd389f3307fc2c5bad4dd768ef9b75f59a67fba9dcfc35685e0046f3a9a86fd8a32f6d64b6199037cf4f21be45e4adb90ec0982608dcf31d98005e253069ecabd56c2be4dac47487aca0793dd9c66fa0b507ae77787ebfe33900ae72f32b3c6eacf4da04f3ae86b5897794599b00a6d1ae4d748874d5b836710017d5b3fb697cd8a384698147475da423d0f0fa809cd3053dcf33e17daa8bdc0036718e68de23da9262faf23adb37b6c98109348f54a87d5390d5d9bef538640005cd6354ef3e44ed97b4234afb741ccf7185f66d64eddbe7cbb46fb29d1a6900fbd625d25563fbf638d5b327a87d9bae8469814747bc570a34fcdf0dd7b9770078ce6b7d5a637adff9178c1b71d01db7b948075b92db65c854276890364734004f521b58efa035e5f800edf19267f1b10dc4f311d53a5758cde7d0b8ce109400e7d0b8e6e540733ad1c8f57dd77931a0794af483e9cf93f48d7acee7df869900f391f38ebef36234d6795db240f71d0e597e27f4abb08fb0a039f7c0e563f200ed72c80a9a3f51fbff17b223504ebc5e71c0e47d9fe32a676770f96afce78d00fb15f92d14f3e66f2252e23da44f839d013e7c360bc2b593076965ff2cbfe70030ef883c13dc956eb648c7fb8de739e42f46e9caeffbcf229f59f357aa67a800479afdce3c8f8e4e271d8186e7adb4f60ac9fe44aefbf1dc569da071cd6dd5005b1d623d0a7d39ef9f927dbf525b56762f14db70f2fbeb7a878cbc0e6beaff0045369ee7488b224ef39b04e425f3063f8371163d471cc26cbf4c17719af54d00da9db8e7bd6990613ae1d1b2fbe5b70e2ede1a6beeac775ce5fa2ae533b40b00a31da3f35a85c6d8466bae9edbf6b4f778c9b6d4b5b652c9bd3fc39dc7341e00311b3cb2cde0b1e3f42ac1e81acb6ad9d5be36ac12eb89c3f1e6f544f0f5ad0027564379f19c8d42df5ddae37586e0551a1b4c56e55b609b01631189234734005f983c483bcb867df64397881bcbfd336c3fb04d8130eff1d21ad3fbd63c7800cf81fc87886bcd033497089bbacd2133c268fff87f0a95681347f21f0bc8c800fdc858da75fb236fdffbc1bc15c6b679cd3d93183ba2dd92758bf743aea77700c535c729bf2de66f6178efa1c67b52c97d70721f33cf236e163a9aebd111bf00bbd00d686ba37df7fe374543f772e139f678c93c9a22ddb13fcf6114e99ee700deb4c6b9be3640790ff98878fb6cb26aeac7f9fc04d7d904b5365d83bdefd000d56b9eeda772f3d7a0b995e65351dfb0c74bdac86c33200ffee61cf19d226f00bd7580f621e7ce4e10b8e73a30bd40604abfdeb4e735db0ab93631cb212b68006e23dbf8a5b4f680fa7011e9ed2ec7735ce5e65778dc58e9b509e65d0d6b13006f2cb336015d8f766d42ee57acc6b58957503dbb8bc68745254cf33c3a9a49003a020def259825d2c933f00c0dcaa94ed0206d8e68ee116d49fab6b2bb7d9b002564e3f6ed1d156adfb4c605b27d2b3a6405cd8354ef1ea2f64bda11a57d3a008ee7b842fb36b2f6ed2365da37d94e8db47d9b29d25563fbf63eaa678f53fb00769112a6791e1dcd221d816636c5c9b31bea290daff5159570cbf655aeeb3500521c74c76d2e68614b72bb2ccf576c10f9f0f98a4f501b58efa035e57825ed00f12ada789e9372cd4754eb5c61357fc7ea3a1b437ec7ea9a9703cd194483fa0050ee7b53d07c57f483e9cf93f48d7acee787c3ccf9c87947dff7a65adf564b0059a0fb2e872c3f13fa55d84758a8c47e12791e32cb0a9a5f51fbff6bb223f800bdc2f3bf3a9ee32a676770f96afc7f8cfb1579e61cf3e673bd53e23da44f83009d21bfafe4bdfbff457686ec9f81a9dc5977ae74f20ca746a299e390bf98b200fcbefdcffccdeb6fa99efd95ec0cad7e678e474767908e5cfffd2c2ae191f300816750d85cdce7d4091a5e1b04cd3fc47a14fa72de3fe55a8fd7da13edeb2f00d98693ebf1c3adc3f21eaf8b29cd05224eb3dcc00b795f40616084dd7701c50021ccf6cb4c116770cf50c2ed9b7f9e4118c18ff7ab21ccf6cb0c4f5e87108d00fc7e4cf2e3efc78e9e32e0ebcd2df439cf5301161e6f83660a61e2b4c0758100908775c5e38f0b529765e05b38290b747f81439693847e15be476c579275c800fe44390fccb282e6b429837a39c386eba99c785cd4e1788eab9cfdc2e5abd0005fe5b9fd94df3a326ffeef524abcf7398781c72bbca68270fb94415a39ae8100ae796c27ed7e57ba19221d9f4bd9e590bf18a52bbfefcc43fefef44caa67a800479afd4e97474787908ee4dcb0c1334b098fec4f8003fc5cf3cb87087c3cbf007c2eb5514616f4e590b33edab7ef576acb5a5df334726f796334744e0c18a5008ca67e9c543710e6efc0a6529a0e11a769070f77de107f6b35dc3776aeb5e9006e25dcbe79a36ec20819caed31aba13432af7aa291df57487edcbf2e55ef5f0007ec17fe6eb34858f89c13d0ac10f68bdce3df21e4615df1f840613f5e974b0016e8bec321cb5a75fb30dfa524eb90ef5de4bf625956d06ca07ea58fec13940013f741bb1ccf7195b35fb87c15c61b25fbe55cc2598cf6b5b50deff3086b4a00bc5b9937ec17f0417c8ec23bc97e011df4015db38d7f8e0d337699ae5ba46b00249a731cf217a374e597e3b31902b32993cd54cf7691fda2d5ef9ce3d1513d00e908346ce369ed8d95fd0970b8ce78aa13343c6f0a9a9b85fd82be9ce5947d00bfe6dab26fef2ff8b14dcdf32f5246533f6e9e301036f55f9e6569e85b459c00912baf241778216fdc839fc1087ba495e2103e9370378b38837baa126ef94d000feea71246c8e03a23e02cebd7501a99d7c14423e70e253f1ec3bd46f4afe900f7837d1daebd1dc0c2fd2068ee10f68b1c93b50a795857bc9720fdf2ec2bb8006439d8a15fd0bc49e837fd36b6afa05977e55eca824356d0dc43fdcadbc93e0041dd6e23bd3dea788e6ba4fb5414c61b79d7fc5ab78337efb74a89f7107b1100f68bfc2f04db8b8f90fd226d7ce8ba9c8def4a9717e95cdff769f65d727cd6002d3097ce57a37af628d92fad4a98ba3c3a3a987424cf893478da94f014041e00e0e071aedc43001aa4e575df8f08fb057d39e4f4fdef4dcb5ef4f5973c278800b856c2286534f5e328b25f90661aa56911719af68bcf2e63fb05edaaebbc7000b65fa44d33311afa0d413145dc3ebbab40182183cbee62fba5e0c9eb20a241003daef3f0cb11cdd744ff9afe3b3760bfb4dbbcd027004b1b6102cd3785fd820078e06a11f2b0ae40ab34c75d70c902ddb73864f9bed06fbb0226cdf97c2e1f0093ef5487aca0f931f52b3f25fb04e5c4678ffcc1f11c5739fb85cb576bfd8800c76f45e2c3bcbb096b4abcf7f9c68bfb731e3723fc7bb25f64bf2fdb7c9e870066ec325d41a46b249a0e87fcc5a832eb47e067cae429aa677f20fb45abdfe900f0e8e820d211685a49475af32f720c0b1c3cff021c758286c71da0f9abb05f00d097f37a0568b99f5768cbcaf697e0d718ed3b7751ef90d1d48f9b6c63c2b600c1d994669a88d36c4bc10b79e39e6d156963355098ed97bc88d3b4dff302b700cb5671d96208b3fdd2eac96b22d1a0ded579f8e588a6e1d8011ffd6bfa36dc0080fdc263ef6254dea63a9c30715ae09a26e4615df1790ed3529765689f0e5900a0fb690e592609fd6a8cc93465e5f231f9363b6405cdf1c70eeae5441be6b6008fdb9566c7735ce5ec17e5f33a9cdf81b9fe0725bf254f81f790fe1bf68beb001c1084cf3e769056ce11c8f94df38ea0fd77fd2303e95a453a9e5b6877c85f008c746d0579aebc299393a99ea11e69f63bed1e1d4d241d8186db632dfb45f60027c0c1f60bcabf4ed0206d8e683aa88d32b2a02fe7b90dd9f76bce2f49fb0c00f7e0c76b5cbc1624652cd58f9a419d0cb98a2902ae8d06163af1d2d6dafc9b00e8fe02f1fc42f17c8eb89f27ee1788fb4bc4fd6271bf54dc5f2aee5788fb5500e27e8db85f2beed789fb5e71bf51dcf78bfbcde27eabb8bf52dc5f25ee778800fb6bc4fd2e717fadb8bf5edcdf28ee6f16f7cf11f7b78afbe789fb1788fb170089fb9788fbdbc5fdcbc4fd2bc4fdebc4fd1de2fe4e717f97b87f93b87f8bb8007f9bb8bf57dcdf27eeef17f7ef12f70f8afb87c4fd7bc5fdc3e2fe5171ff010071ff2171ffb8b8ffb8b8ff94b8ffacb87f42dc7f51dc7f59dc7f4ddc3f29ee00bf2deebf27ee7f28ee7f2cee7f26ee7f2feeff20eeff2aee4d80ef6bc57d4e00dcd7d97bbe6aad5fb47e5bbeb3bdbdbfabd0dfdad6da9b2ff46ce8eec8b777006ce8ec6eed6eede8eee82b74b7b5f577b77777f56ce8e9caf7b4b6b7f5b76e00eae869db641bcfa628bd76f8c2f4f2ca8f17997f5f2199f34fef6afd438afa003bb426fdbefbd011d4f5fcd3bb861cd2fc7475303dd229f79a94653e27059900f385aeaeee9efe1ecdb2e94eb16c668d93b2393f1a1fede5841465be609cc8005c93a2cce76550e673a3cabc834f57e6c352e8cbfafbbabbbb3a5bbb0d36330000fe366135072d1a1ec69f61ef6b843f331a3cf8dcf8a75a7f82f59bacdf6d00fd6759ff22eb5f6cfdd9d69f63fdb9d69f67fdf9d65f60fd85d6bfc4fa8bac00bfd8fa4bacbfd4facbac7fa9f5975b7f85f5575a7f95f5575b7f8df52fb3fe005aeb5f6efd75d65f6ffd5eeb6fb0fe46ebf759bfdffa9bacbfd9fa5bacbfd500fa5758ff4aeb6fb3fe55d6df6efd1dd6bfdafad7587fa7f577597fb7f5afb500fe75d6bfdefa3758ff46ebdf64fd9badff6ceb3fc7fab758ff56eb3fd7facf00b3fef3adff02ebbfd0fa2fb2fe8badff12ebdf66fddbadff52ebbfccfa2fb700fe2bacff4aebbfcafaafb6fe6bacff5aebbfcefaafb7fe1dd67f83f5efb4fe001bad7f97f5efb6fe9bacff66ebbfc5fa6fb5fedbac7f8ff5efb5fedbad7f9f00f5df61fdfbadff4eebbfcbfa0f58ff41ebbfdbfa0f59ff3dd67faff5df67fd0087adff88f51fb5fefbadff4fd6ff80f51fb3fe07adff21eb7fd8fa1fb1fee300d6ffa8f53f66fd8f5bff13d6ffa4f53f65fd4f5bff33d6ffacf53f67fdcf5b00ff09ebffb3f5bf60fd2f5aff5facff25eb7fd9fa5fb1fe57adff35eb7fddfa00dfb0fe93d6ffa6f5bf65fd6f5bff3bd6ffaef5bf67fdef5bff07d6ffa1f57f0064fd7fb5fe8fadff13ebffd4fa3fb3fecfadff94f57f61fd5f5aff57d6ff3700ebffdafaff6efddf58ffb7d6ff0febffcefa4dd6ff83f5ffd3fa7fb4fe9fac00ff67ebffc5faffcffaff65fdbf5aff6fd6ffbbf5ffdbfaff63fdffb5feff59001fee1fd68f6c3f5163fd5aeb1f60fd9cf52758bfcefa075a7fa2f50fb2fec100d6afb7fe21d66fb07ea3f58f88dde1e858ed95b67dcf63c6a7db671fa130fe003c82c69f69dbf926df6744e9db2e47d654c6aecc3fbdab354d998f1a2732a70039d770f43891b93645998f1927321f90a2cc93c689ccb914659e3c4e649e9000a2cc53c689cc7529ca7cec3891f9f414653e6e9cc87c6a8a321f9f41994fc800a0cc276650e693c689cc47a638d66aca60399f9c41994fc9a0cca76650e6d3003228f3e91994f98c0ccafc8c0ccafccc0cca7c6606653e2b83324fcda0cc67006750e6e60cca3c2d8332b76450e67c06656ecda0cc850ccadc964199db33280073470665eecca0cc5d1994b93b8332f76450e6e91994f99c0cca3c2383329f009b4199cfcba0cc333328733183329f9f41992fc8a0cc176650e6591994f959001994f9a20cca7c7106659e9d4199e76450e6b91994795e06659e9f419917640050e6851994f9920ccabc2883322fcea0cc4b3228f3d20ccabc2c83325f9a410099976750e6151994796506655e954199576750e6351994f9b20ccabc368332005f9e4199d76550e6f51994b93783326fc8a0cc1b3328735f0665eecfa0cc9b003228f3e60ccabc2583326fcda0cc576450e62b3328f3b60cca7c550665de9e004199776450e6ab3328f335199479670665de954199776750e66b3328f375190094f9fa0cca7c430665be318332df9441996fcea0cccfcea0cccfc9a0ccb7640050e65b3328f3733328f3f33228f3f33328f30b3228f30b3328f38b3228f38b003328f34b3228f36d19fc1fdded192ce7978e1399d3fccfe6cb3258ce2fcfa000ccafc8a0ccafcca0ccafcaa0ccafcea0ccafc9a0ccafcda0ccafcba0ccafcf00a0cc776450e6376450e63b3328f31b3328f35d1994f9ee0ccafca60ccafce6000ccafc960ccafcd60ccafcb60cca7c4f0665be378332bf3d8332df974199df00914199efcfa0ccefcca0ccefcaa0cc0f6450e6073328f3bb3328f3431994f9003d1994f9bd1994f97d1994f9e10ccafc4806657e348332bf3f8332ff53066500fe4006657e2c83327f3083327f2883327f789cc87c788afb7a3f92c1727e3c0083327f3483327f2c83327f3c83327f2283327f3283327f2a83327f3a83327f002683327f3683327f6e9cc8dc94a2cc9f1f27321f91e218e3890cd6ed7fcea000cc5fc8a0cc5fcca0ccff924199bf944199bf3c4e643e304599bf324e649e9800a2cc5f1d27321f94a2cc5f1b27321f9ca2cc5f1f2732d7a728f337c689cc8700a428f393e344e6861465fee63891b9314599bf355ecea14951e66f8f13990f004b51e6ef8c9775c91465feee7899274951e6ef8d13998f4c51e6ef8f13998f004a51e61f8c13998f4e51e61f8e13998f4951e61f8d139927a528f3bf8e13990027a728f38fc789cc535294f927e344e6635394f9a7e344e6e35294f967e34400e6e35394f9e7e344e6135294f9a97122f38929cafc8b7122f34929cafccb14006536e7081f60f33a95e4afb13a30cf72b19b10bbbad899797a336f6de671cd00bca699e733f35e661ec8cc8b987902336e36e34833ae32e30c63771b3bd4d80065c64e31fdb6e9c74cbb6eda39f3de9bf7c0d40ba3a7a6d89d1cbb5308cf9300d63f2a067674ec8e89dda4d84d8edd94d81d1bbbe362777cec4e88dd89b13b0029764db13b3976a7c4eed4d89d16bbd3637746ec9e11bb67c6eeccd89d15bb00a9b13b3b76cdb19b16bb96d8190599c3960bb16b8b5d7bec3a62d719bbaed80075c7ae2776d363774eec66c4eedcd89d17bb99a69c62777eec2e88dd85b19b0015bb67c5eea2d85d1cbbd9b19b13bbb9b19b17bbf9b15b10bb85b1bb24768b0062b738764b62b73476cb627769ec96c76e45ec56c66e55ec56c76e4dec2e8b00dddad85d1ebb75b15b1fbbded86d889df93fbcf95fbaf97fb8f99fb6f9bfb400f9dfb2f9ffb0f91faff93fadf95fabf97fa9f99fa7f9bfa5f9dfa3f9ffa1f9001fa0f93f9ef95f9cf97f9af99f98f9bf96f9df94f9ff92f91f91f93f8ff95f008df97f8bf99f89f9bf87f9df85f9ff83f91f82f93f80392fdf9c1f6fce533700e78b9bf3b6cdf9d3e63c66733eb139afd79c5f6bce7335e79b9af33ecdf99700e63c48733ea2392fd09c9f67ce9333e7ab99f3c6ccf95be63c2a733e9339af00c89cdf63ceb331e7bb98f34eccf91fe63c0c733e84392fc19c1f60bea737df00979befadcdf7c7e67b5cf37daaf95ed37cbf68bee733dfb799efbdccf74fe6007b20f37d8cf95ec47c3f61be2730fbebcd7e73b3ffdaec4736fb73cd7e55b3007fd3ec6734fbfbcc7e37b3ffcbec8732fb83cc7e19b37fc4eca730fb0bcc7a00bb597f36ebb1667dd2acd799f52bb39e63d637cc7cbf99ff36f3c1667ed4cc00179af933339f64e657cc7c83197f9bf1a8199f99f18ab1df8d3d6bec3b63ef0098fedff487a67f30eda5693f7e42efd6e1d63fcefa1b7bb76d6bdabda3a97700d7aefe9dbbd75dd57bc3ba0d5b77afdbb5f5a6fec8bec211bd9e73b66fddbd00b577dbd69b7a776fddb1bd694befae2d4d7d3bfa77356ddfb1bbe9aadedd1b00b744f6c52e35583255ffcea6debebe9dfdbb76356d1d48b37b4b7fd3c61ddb0077efecddb8bba9afffea6d3b6eecdf69d25c67d31e6ffddeddbbfbafba7a7700096b5f5fd3f55b776f69da715dffce4ddb765c6f9e3f6f14f4b14ea2d32c9d00799193a49b6fd34db1f7e7efdcd97b63d3d6ed7dfd3734edb87677d38e4d4d001b765cbbbd6f1727ba2d21b3bb9230bb2f49a253262443787bc274774d480000f29e2489de9524d1076ca211bc2e9cec2349787d3649a2af2449f4dd24897e009324d17f26ac16cd75c9d215eb1280bc3821b32f1c942c5dc3c1c9d25d7e700002e1362564766d1266372764f68184e9fe98305dae3e8170f5f5c9984d4ac200ec8484cc1e4a98eef709d39516c213a4bb2161ba0f1f9240999f4c92e8cb490012fd23a158d31a92a5bb2b61baef372410eea74912fd2e49a23f2749f47f490012e51a13246a4c92e8e824894e4b92e8ac2489f24912752649342349a2393600d1280db1054978ed4892e83a9b68b46fe2f39330bb2d21b30f88744bfa7bfb00e23159dfd6bed2606c677cdb6414dbd7bbbb97d39d7468b2740f1d9a0ce7c300872650ca6349127d3321c2a79230fbf724890e3c2c19c24909d31d7758029000272749343321c24b12a65b9a04e4aa2489ae4f88f0b684e95e9e04e46b932400fa6842849f4cc2ecf349123d9510e19f13a6fb6b1290ff9724d17187274338003561ba96c31380ec4892686942841b9330db9a24d14b12227c4bc274f7260100f9ae24893e9f10e10f13a6fb491290bf4c92e8802392219c9230dd0947240000796a9244e72744f8a284e9de9004e47d36d1284df60792f0fab84d74f2be82005d75edb6dd5bafde76a35fba4f27e1f8e384aafc791266b92393313b3a61ba002947260079529244e72644b83461ba154940ae4d92e8e684085f9330dd1d490040be2949a28f2444587354b274471c9500e49424899a9224eab68912b53d330092705c9550916b9330bb2921b35b9230bb2721b34713a67b2c09c88f2649f400fd84084f383a59ba69472700d99124d1029b2851fd5f9c84e3f6843ad9998400d9eb1332bb3f61ba0793807c3849a2af244438e59864e9ce3a2601c8d6248900ba93249a9924d1329b2851e55f9984e3b509b57f6312666f48c8ecee24cc3e009490d9479330fbd784cc7e9f30dd9f9280fc5b9244c74c4a867075c274574e004a00726792442fb58912bd6caf4cc2f1a1843a793809b36f2464f6f384e97e009504e47f244974f0e4640817264cb76e7202909b9224bac5264a54259f9f8400e3db12eae4be24cc3e9f90d97712a6fb4112903f4d92684f4284474d49966e00f29404204f4c92684642844b12a65b9e04e4654912dd9410e1ab13a67b7d120090772749f4e18408bf9a30dd9349407e2f49a2ff4a88f0906393a53becd80400208f4992a87d1408a3ff0f6b53bb893d91050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file +000000001b70e95fde0b70adc30496b90a327af6a5e383e028e7a43211a07bcd06e2af08f53b9a05db4870972b4a9a663a5ffb54e962020d4efe3f1b9a21343f2ee0a6721704053281d575f82984fad809a7cf5b1f2d47971e1429fbe2eb157826b29a23ef822408fa34abc1c8cefbbfb50efb3706f0583c1f7ade18de41a0b21670e777523a2ee4162c41219fab053a163f357b8a5d70e9449bb9c63712262221dbfd1d029bf447152fcf89e355c334610d1632436ba170f738107266a715502283335ab6bd13d241c77c519fc01f9ac88ef303ac6f43dd6ca5b38f10923aa206e62084ee7b602fe9abc15632dda3269f56fb0c6e12519a2eb2ec897091919d03c9e2e67178ac638746f068907e6677b4cc7a9592ef234ab6ab518f17efffa000000000000000000000000000000000000000000000000000000000000000040f70624b9592ae84d21cc4d35ce219d11dd4920ef5eb43f1889651d4d3489d9b03b075046b71ff5f8e0792de4b82ddc979fcb3b8c03abe12972e65c57759fb461a3eb152e715eaa8096a394de7fb4737bab2cc37100decf5767a149f88330b0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000bc7fd3b51eef7f2eaafa09e24b0475a918bd7388c4dec305145849f5f84d1b822202b94400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d9c001f8b08000000000000ffed5d07781cc5f5df93cf7291251bdb1863303ec99600bbecbb53773d174cc736bd837101420d36a126819090402a102004528034200015125a12d24348208d24a4e79fde13524925ff19699ef5d3d3ccde696fdfe9008e9dfbbef7cdeedcccbedf7b33fbe64ddd54d0fffbfea820785f5dff754a9100ba0df46d06ee47996bba4fb3fbd12cfd1876dfc8ee27b2fb3dd8fd1476bf9700a202dccf62ff67d87d33bb6f61f773cd3dfe52262c98b03ddbd5d1b1bd3bbf003dd79edb92cdf79eded399ede83cbdab27d793ebece9dc96ef696fdfded3d100d3dd7b7a6f77b637d7d1be3db7a3b3b77d47b6ffb7109e952df3a7b18d83e700cd53f49ca2f9265c60c2853e4c44b858d1a2a0bfce62bd58e4f593f87aa109007fc6b4c7658b727383f86c645b8cb8c8b6eb676682fe3649ff52c1d05f2a66009da482786d3d61241996285aaa9fad28a7286f932b4e61c6196512f3e70ce300e70c101deea32b40306084a8a265cdffed90ae23082f80722b52677cf2ef9000c4d9151d673b8fd0d8b4639436cfcb1b7d7798b0d3845d26a474dd8a7a14f5002a5a06f1f4ab8b59e6185f8e5c7710bf535507729311d5a1765a9717d14db600bc5f2e17a39e97c7a81b6d78c8e9e7bfb88de7d2207ee3a97f2b02412329a500881502cf5d19632593927b65fc65948547ee6ecce22cffb874ba34c667ad0a006ad308c4891bf1ae0e6acc08ac62a0e37a6e21a86e23801520c6e75ab1962b003f19d4b8bd8195555ade7ef8c9877c98614d3074f8698dd74fe2ebc5daa07f00d842d70db28fb65fc184d9f27eed34ec83bfb8dba67941fc4e69dc18e7d70000c605818c93b72e1076f2e8177783bf3688af915e17c4ebf96b59eb83a1bf6a001e3bb5c02dfbd9a7776fdf9acd6dd926a983b5423a881b675b8de04c07d55d00a7e887a31eeb4db8bf093798f000131e68c2834c78b0090f31e1a1263ccc8400879b70a309379970b3098f307a2f98fb23151da5e86845c7283a56d1718a8e00577482a213159da4e86445a7283a55d1698ab6283a5dd15645fa25d9ae488f00a19fa1e84c4567297a81a2b3159da3e85c45e7293a5fd1058a5ea8e842453b0015ed527491a21729ba58d1258a2e557499a2cb155da1e8c58a5ea2e8a58aae00547495a29729ba5ad1cb15bd42d1358a5ea9e8558aae55749da2572b7a8da200d72a7a9da2d72b7a83a2eb15ddc07471a3a2372aba49d1cd8a6e51f42645b7002a7ab3a2db14ddaee82d8adeaae86d8adeaee80e45772aba4bd13b14bd53d100bb14bd5bd17b14ddade81e45f72a7aafa2f7297abfa20f28faa0a20f29ba4f00d1fd8a3eace8238a1e50f4a0a287143dace811451f55f431451f57f4a8a24f0028faa4a24f29fab4a2cf28faaca2cf29fabca2c7147d41d1e38abea8e84b8a009e50f4a4a22f2bfa8aa2af2afa9aa2af335d3ca5e81b8abea9e85b8a9e56f4006d45df51f45d45df53f47d453f50f443453f52f47f8a7eace8278a7eaae867008a7eaee8178a7ea9e8578a7eade8378a7eabe8778a7eafe80f8afea8e81945007f52f467457f51f457457f53f47745cf2afa87a27f2afa97a27f2bfa8fa2ff0006fd4ee8ff827e01528aea148d529456345a51bda2318ac62a1aa768bca20600451314352a6a523451d124457b289a9cead745c6e8628aba99aa684f45d31400eda568baa2bd15cd50b48fa27d15cd54b49fa2598a328a9a15b5289aad688e00a256457315cd53345fd102450b152d52b458519ba2258a962ad29e8e6e24f300060b1924edf97628ea54d4a5a85b518fa25e45cb142d57b442d14a45ab14ad00565450b446d15a45eb14ad57b4bfa20d8a0e5074a0a283141dace81045872a003a4cd1e18a362adaa468b3a223141da9e82845472b3a46d1b18a8e5374bca20013149da8e82445272b3a45d1a98a4e53b445d1e94696e94696adea669ba2ed008a76283a43d1998ace52f40245672b3a47d1b98ace5374bea20b14bd50d185008a762adaa5e822452f5274b1a24b145daae832c36b92e175b9bab942d18b1500bd44d14b155da9e82a452f5374b5a2972b7a85a26b14bd52d1ab145dabe8ba0054ff335e6d9e49fed16bd4cd6b15bd4ed1eb15bd41d1f526ed0d26bc3135f800bd7aa3bab949d1cd8a6e51f42645b72a7ab3a2db14ddaee82d8adeaae86d8a00deaee80e45772aba4bd13b14bd53d1bb14bd5bd17b14ddade81e45f72a7aaf00a2f7297abfa20f28faa0a20f29ba4fd1fd8a3eace8238a1e50f4a0a287143d00ace811451f55f431451f57f4a8a24f28faa4a24f29fab4a2cf28faaca2cf2900fabca2c7147d41d1e38abea8e84b8a9e50f4a4a22f2bfa8aa2af2afa9aa2af002b7a8a95c937d4cd37157d4bd1d38abeade83b8abeabe87b8abeafe8078a7e00a8e8478afe4fd18f15fd44d14fcdb3269867fd4cddfc5cd12f14fd52d1af1400fd5ad16f14fd56d1ef14fd5ed11f14fdd194cd3326fc9309ff6cc2bf98f0af0026fc9b09ff6ec2674df80f13fed384ff32e1bf4df81f13fed784cf99f07f2600a48e45ca8475261c65c2b409479bb0de84634c38d684e34c38de840d269c6000c24613369970629df03a02dd33d78e4c2a18587ca71d980cdc1fc2fe3f94fd00bf91dd6f62e937b3fb2358faa3d8fd31ecfe38767f02bb3f89dd9fc2ee4f6300f7a7b3fb6dec7e07bb3f93ddbf80dd9fc3eecf63f717b0fb0bd9fd2e76ff2200767f09bbbf8cdd5fc1ee5fc2eeaf64f72f63f72f67f7d7b0fb57b1fbebd8fd006bd8fdebd8fd1bd8fd0decfe8decfe6676ff2676ff66767f3bbb7f2bbb7f3b00bbbf93ddbf83ddbf8bddbf87dddfc3eedfcbeedfcfee3fc8eeef63f71f66f7000fb0fb87d8fd23ecfe63ecfe5176ff4976ff6976ff5976ff7976ff0576ff450076ff04bbff32bbff2abbff3abbd70e1bde4f63f7d3d9fd0c76bf2fbbdf8fdd0067d87d0bbb9fc3eee7b2fbf9ec7e21bb5fccee97b0fb2cbbcfb3fb0e76dfcd00ee97b1fb95ecbec0eed7b1fb0decfe20767f28bbdfc8ee8f60f747b3fbe3d800fd89ecfe1476bf85dd6b873205f767b0ffcf64f7e7b0f4e7b2ffcf63f717b200f43bd9ffbbd8fd252cfda5ecffcbd8fdebd8fdf5ecfe06767f23bbbf89dddf00c2ee6f65f7b7b1fbb7b0fbb7b1fb3bd8fd5decfe9decfeddecfe6e767f2fbb007f1fbbff00bbff10bbbf9fdd7f84dd3fc8ee1f66f71f65f71f67f79f60f79f0062f79f61f79f63f78fb1fbc7d9fd97d8fd93ecfe2becfe6becfe2976ff4d7600ff1d76ff0376ff6376ff7376ff2b76ff5b76ff0776ff2776ff2cbbff27bbff0037bbff2fbbd74e7201eeb5d38bff8f67f70dec7e82b9c71f1fd8afa685cd870006328399d52cb3b6699590395bde2f77632a3efd4daa8bbfef35a984ba9e2d00ef376802a75c1dac0f6a638261ff18646eefc9b5efd8ded92159366b632c9b00c36aa46c0e0e6ac35ec63849953ba446644ec528f3810994f980a032ef60b90032ef11435b4613ef1a9b5e65f6446a00ab9ee8d13c74b8c1dca75878503078007552da846d265c6bc2c34db8d1849b4cb8d9844798f048131e65c2a34d788c00098f35e171263cde842798f044139e64c2934d788a094f35e16926dc62c2d3004db8d584db4cb8dd843b4c788609cf34e159267c8109cf36e139263cd784e70099f07c135e60c2179af04213ee34e12e135e64c21799f062135e62c24b4d780099092f37e115267cb1095f62c2979af04a135e65c29799f06a13bedc84af3000e135267ca5095f65c26b4d789d095f6dc2d798f0b5267c9d095f6fc23798f0007a13de60c21b4df84613de64c29b4d788b09df64c25b4df86613de66c2db4d00f81613bed5846f33e1db4d788709ef34e15d267c8709df69c27799f0dd267c008f09ef36e13d26bcd784ef35e1fb4cf87e137ec0841f34e1874c789f09ef3700e1874df811133e60c2074df890091f36e12326fca8093f66c28f9bf051137e00c2849f34e1a74cf869137ec6849f35e1e74cf879133e66c22f98f071137ed100845f32e113267cd2845f36e1574cf855137ecd845f37e15326fc8609bf69c2006f99f069137edb84df31e1774df83d137edf843f30e10f4df82313fe9f097f006cc29f98f0a726fc99097f6ec25f98f09726fc95097f6dc2df98f0b726fc9d00097f6fc23f98f08f267cc6847f32e19f4df81713fed5847f33e1df4df8ac0900ff61c27f9af05f26fcb709ff63429ab027fa9f09b501d761ca8475261c65c200b409479bb0de84634c38d684e34c38de840d269c60c24613369970a209279900700f134e36e114134e35e19e269c66c2bd4c38dd847b9b708609f731e1be26009c69c2fd4c38cb841913369bb0c584b34d38c784ad269c6bc279269c6fc20500265c68c245265c6cc236132e31e15213664d983361de84ed26ec3061a709bb004cd86dc21e13f69a709909979b708509579a709509579bb060c235265c6bc20075265c6fc2fd4db8c1840798f040131e64c2834d7888090f35e161263cdc84001b4db8c9849b4d7884098f34e151263cda84c798f058131e67c2e34d788209004f34e149263cd984a798f054139e66c22d263cdd845b4db8cd84db4db8c384006798f04c139e65c21798f06c139e63c2734d789e09cf37e105267ca1092f3400e14e13ee32e145267c91092f36e12526bcd4849799f072135e61c2179bf02500267ca909af34e155267c9909af36e1cb4df80a135e63c2579af05526bcd68400d799f0d5267c8d095f6bc2d799f0f5267c8309afa7f724e80f6f34f76f34e1004d26bcd984b798f04d26bcd5846f36e16d26bcdd846f31e15b4df83613bedd00847798f04e13de65c27798f09d267c9709df6dc2f798f06e13de63c27b4df8005e13becf84ef37e1074cf841137ec884f799f07e137ed8841f31e103267cd000840f99f061133e62c28f9af06326fcb8091f35e1274cf849137eca849f36e100674cf859137ece849f37e16326fc82091f37e1174df825133e61c2274df86500137ec5845f35e1d74cf875133e65c26f98f09b26fc96099f36e1b74df81d13007ed784df33e1f74df80313fed0843f32e1ff99f0c726fc89097f6ac29f99f000e726fc85097f69c25f99f0d726fc8d097f6bc2df99f0f726fc8309ff68c267004cf82713fed9847f31e15f4df83713fedd84cf9af01f26fca709ff65c27f9b00f03f26fcaf099f33e1ff4c18987e5dca8475261c65c2b409479bb0de84634c0038d684e34c38de840d269c60c24613369970a209276ba24100f34b99b060c2006c79bfdce14165c62eb2e5fd7238265dee98c01481f1ed291518dfc66795ab0083a975b551eea91865deb34664ae8b51e6693522f3a81865deab46644ec72800f3f41a9179748c32ef5d23322f8e51e6193522f3c21865de278132ef9b409900672650e6fd1228f3ac04ca9c49a0cccd0994b9258132cf4ea0cc731228736b0002659e9b4099e72550e6f90994794102655e984099172550e6c50994b92d8100322f49a0cc4b132873368132e71228733e8132b72750e68e04cadc994099bb00122873770265ee49a0ccbd0994795902655e9e4099572450e695099479550200655e9d40990b0994794d02655e9b4099d72550e6f5099479ff04cabc218132001f9040990f4ca0cc072550e6831328f3210994f9d004ca7c5802653e3c8132006f4ca0cc9b1228f3e604ca7c4402653e3281321f9540998f4ea0ccc72450e600631328f3710994f9f804ca7c4202653e3181329f9440994f4ea0cca72450e600531328f3690994794b02653e3d81326f4da0ccdb1228f3f604cabc2381329f00914099cf4ca0cc672550e6172450e6b31328f3390994f9dc04ca7c5e02653e003f81325f9040995f9840992f4ca0cc3b1328f3ae04ca7c5102657e510265be003881325f9240992f4da0cc972550e6cb1328f3150994f9c50994f9250994f900a50994f9ca04ca7c5502657e590265be3a8132bf3c8132bf2281325f934099005f9940995f954099af4da0ccd72550e6572750e6d72450e6d72650e6d7255000e6d72750e6372450e6eb1328f30d0994f9c604cafcc604ca7c530265be39810032df924099df9440996f4da0cc6f4ea0ccb72550e6db1328f35b1228f35b130028f3db1228f3db1328f31d0994f9ce04ca7c5702657e4702657e6702657e570002657e7702657e4f0265be3b8132df934099ef4da0ccef4da0ccef4ba0ccef004fa0cc1f48a0cc1f4ca0cc1f4aa0ccf72550e6fb1328f3871328f3471228f300030994f9c104cafc5002657e3881323f9240993f9a40993f9640993f9e4099001f4da0cc9f48a0cc9f4ca0cc9f4aa0cc9f4ea0cc9f49a0cc9f4da0cc9f4ba000cc9f4fa0cc8f2550e62f2450e6c71328f3171328f3971228f3130994f9c90400cafce504cafc9504cafcd504cafcb504cafcf504cafc540265fe460265fe66000265fe5602657e3a81327f3b81327f2781327f3781327f2f81327f3f8132ff00208132ff308132ff288132ff5f0265fe710265fe490265fe690265fe59026500fe790265fe450265fe650265fe550265fe750265fe4d0265fe6d0265fe5d020065fe7d0265fe430265fe6302657e268132ff298132ff398132ff258132ff35008132ff2d8132ff3d81323f9b4099ff914099ff994099ff954099ff9d4099ff00934099ff9b40999f4ba0ccffab11995331ca1c8caa0d9927d5c52773aa4664008eb36ed72550e6510994399d4099472750e6fa04ca3c2681328f4da0cce3120028f3f804cadc904099272450e6c604cadc944099272650e6490994798f04ca003c3981324f49a0cc531328f39e0994795a0265de2b81324f4fa0cc7b2750e600190994799f04cabc6f02659e994099f74ba0ccb3122873268132372750e6960004ca3c3b8132cf49a0ccad0994796e02659e974099e72750e605099479610200655e944099172750e6b604cabc2481322fad119927d7c527733681e59c4ba000ccf91a91391da3cced3522735b8c3277d488cc37a6e293b93381ef7357026500ee4ea0cc3d0994b93781322f4ba0cccb1328f38a04cabc328132af4aa0ccab00132873218132af49a0cc6b1328f3ba04cabc3e8132ef9f4099372450e603120028f3810994f9a004ca7c7002653e2481321f9a40990f4ba0cc872750e68d09009479530265de9c40998f48a0cc472650e6a31228f3d10994f99804ca7c6c0200653e2e81321f9f40994f48a0cc272650e6931228f3c90994f9941a91796e8c00329f5a23324fa98b4fe6d31258b7b72450e6d31328f3d604cabc2d81326f4f00a0cc3b1228f3190994f9cc04ca7c5602657e4102653e3b81329f934099cf4d00a0cce72550e6f31328f3050994f9850994f9c204cabc338132ef4aa0cc17250050e6172550e68b1328f3250994f9d204ca7c590265be3c81325f9140995f9c0040995f9240995f9a4099af4ca0cc572550e6972550e6ab1328f3cb1328f32b001228f3350994f9950994f9550994f9da04ca7c5d02657e7502657e4d02657e006d02657e5d02657e7d02657e430265be3e8132df9040996f4ca0cc6f4ca0cc00372550e69b1328f32d0994f94d0994f9d604cafce604ca7c5b0265be3d813200bf258132bf358132bf2d8132bf3d8132df914099ef4ca0cc772550e677245000e6772650e6772550e6772750e6f72450e6bb1328f33d0994f9de04cafcde0400cafcbe04cafcfe04cafc8104cafcc104cafca104ca7c5f0265be3f81327f380081327f2481323f9040991f4ca0cc0f2550e6871328f3230994f9a30994f963003522737d8c327fbc46641e13a3cc8fd688cc636394f9133522f3b81865fe64008dc83c3e46993f55233237c428f3a76b44e60931cafc991a91b93146993f5b00233237c528f3e76a44e68931cafcf91a9179528c323f562332ef11a3cc5fa800119927c728f3e3b5f21d941865fe628dc83c354699bf542332ef19a3cc4fd40088ccd36294f9c91a9179af1865fe728dc83c3d4699bf522332ef1da3cc5fad00119967c428f3d76a44e67d6294f9eb3522f3be31cafc548dc83c334699bf51002332ef17a3ccdfac119967c528f3b76a44e64c8c323f5d233237c728f3b76b0044e6961865fe4e8dc83c3b4699bf5b2332cf8951e6efd588ccad31cafcfd1800654ea967a4cdb31682fc29a38351e6ffd18af47cb29e5fd5f38d7afe4dcf4700e9f9193d5fa1c7eff578b61edfd5e39d7afc4f8f87e9f1213d5ea2c70f747f005af72f757f4bf73fb43faefd53edaf69ff45b7e7ba7dcb28d2f64fdb03fd7e00e8faa2f5a7bf333c4fd17c450b00ebe3a9fe70aa02bca7a2698af652345dd100de8a6628da47d1be8a662ada4fd12c451945cd8a5a14cd56344751aba2b98a00e6299aaf6881a2858a16295aaca84dd112454b156515e514e515b52bea50d400a9a84b51b7a21e45bd8a96295aae6885a2958a56295aada8a0688da2b58ad600295aaf687f451b141da0e8404507293a58d1218a0e557498a2c3156d54b44900d1664547283a52d1518a8e56748ca263151da7e8784527283a51d1498a4e5600748aa253159da6688ba2d3156d55b44dd176453b149da1e84c4567297a81a200b3159da3e85c45e7293a5fd1058a5ea8e842453b15ed527491a21729ba58d100258a2e557499a2cb155da1e8c58a5ea2e8a58aae547495a29729ba5ad1cb1500bd42d1358a5ea9e8558aae55749da2572b7a8da2d72a7a9da2d72b7a83a2eb0015dda0e846456f547493a29b15dda2e84d8a6e55f46645b729ba5dd15b14bd0055d1db14bd5dd11d8aee547497a277287aa7a277297ab7a2f728ba5bd13d8a00ee55f45e45ef53f47e451f50f441451f52749fa2fb157d58d147143da0e84100450f297a58d1238a3eaae8638a3eaee851459f50f449459f52f469459f51f40059459f53f479458f29fa82a2c7157d51d197143da1e849455f56f415455f5500f435455f57f494a26f28faa6a26f297a5ad1b7157d47d177157d4fd1f715fd0040d10f15fd48d1ff29fab1a29f28faa9a29f29fab9a25f28faa5a25f29fab500a2df28faada2df29fabda23f28faa3a26714fd49d19f15fd45d15f15fd4dd100df153dabe81f8afea9e85f8afeade83f8afeabe83945ffabeb372e2945758a0046294a2b1aada85ed1184563158d53345e5183a2098a1a1535299aa86892a2003d144d563445d154457b2a9aa6682f45d315edad6886a27d14edab68a6a2fd0014cd529451d4aca845d16c457314b52a9aab689ea2f98a16285aa86891a2c5008ada142d51b4545156514e515e51bba20e459d8aba14752bea51d4ab6899a200e58a56285aa96895a2d5da862b5aa368ada2758ad62bda5fd1064507283a5000d1418a0e567488a243151da6e870451b156d52b459d1118a8e547494a2a315001da3e85845c7293a5ed1098a4e547492a29315e9efcaebefacebef8eebef7000ebef52ebef34ebef16ebeff8eaefdaeaefbceaef9eeaef80eaef62eaef44ea00ef26eaef08eaefeae9efcce9efaee9ef90e9ef72e9ef54e9ef36e9ef18e9ef00fae8efdce8efbee8efa0e8ef82e8ef64e8ef46e8ef28e8ef0ae873f6f5b9f300fa1c767d2eb93ea75b9f5badcf71d6e71aeb737ef5b9b7fa1c587d2eaa3e2700549f9ba9cf91d4e72aea7306f5b97bfa1c3a7d2e9b3ea74c9fdba5cfb1d2e7003ae9738ef4b93ffa1c1c7d2e8c3e27459f1ba2cfd1d0e74ae87316f4b9037a001fbede97aef769eb7dcb7a1fafded7aaf779ea7d8f7a1fa0de17a7f789e97d00537a1f91de57a3f799e87d177a1f825e97afd7a9eb75db7a1db35ed7abd7b900ea759f7a1da45e17a8d7c9e975637a1d955e57a4d7d9e875277a1d865e97a000e7e9f5bcb59ec7d5f39a7a9e4fcf7be979203d2fa2e709f4b8b91e47d6e3aa007a9c518fbbe971283d2ea3c72974bf5df76375bf4ef773b4dfaffd60ed176a003f49fb0d47a506dacd29d086ee6bc22dbb766d3ff7825d995de767b66cdb9600b9f8ac5d6766ce7fd1f60b779c73fec5982e30edb3fe1d74de59bbceda72ce0059976dd975d6f9e765cedcb2f3ccccb6f3b7efcc9c77feaeccb95b766d3d330030ad38fdb23ce7f60b35bb0bb7efdc9939ab3fdfae33b767b69e7fdeae0bb7006cdd95d9b6fd8273cebf74fb853acfd31150ff74987952e061cc4845cf3b0f00f2ee6dc235175eb8e5d2cc59e76ddb7e49e6fc8b7665cedf9139fdfc8bcedb00b613339e5806d333a332bd306ac6cf8d8d8e36332e7ade65e32202de3f6ac6004d51339e1235e33951335e1635e3eba366bca98ca27c4b54a67795c1f4dea8004c3f5406d38f4565fae932983e5b46def4f888809ba2669c39293adac5932200326d2f83e9955199beaa0ca63746657a6b194cf79c123defa632f25e5d46de00cf979177dcd4e8799b20efb00a68cfa819f78d9ab1356ac6455133e6a366ec008d9af1cc328af2cea84cef8e9af1bea8191f8a9af1d351333e1e35e3535133007e376ac63f45cdf8efa81947ef1931e3c4a819f78d9a711164dcc7845bb79c00734edfdbb173e7f60b779d7aee964b4e3dfdac5da7ee545d36cc9a8bcaf30c00c838dc97725754a69747cdf87419689f8dcab46e5ac48c874e8b8ef69632f200be232ae0f747cdf8f332d0fe392ad3ff44cdd8be5774b4abf78ac87443d48c009ba2663ca60c317b6644cfbb624644c06ba3663cad0cb42f2a23ef6551015f001935e35bcb40fbe132f23e1415f0a351337ebf0cb47f2e23efdfa302fe4fd4008c33f6898e365b46de8e7d22025e1635e37165a03daf8cbc1746057c49d48c00379781f65d65e4bd272ae00f46cdf8e532d0fe302ad39f45cd58b76f74b49300cbc83b6ddf8880f78d9a715919680f2e23efe151011f1535e38565a07d59190079af890af8355133de5306da47a232fd64d48c3f2c03ed5fcbc8fb8fa8809f008bfc92ce8c8ef6f432f29e3f3322e01745cd7865d48cd743c6e6a1629e7bd10039bbcebae09c4bddb2de1495f37d6528f881a84c9f2a83e9d35199feb30ca600e3f78b9eb769bf8880a746cd982f03ed1565e4bd362ae03744cdf8e6a819ef00889af13ec818e94d7d202ae7a7ca2899a7a332fd6b194cff1195e99eb3a23300dd7b5644a6cbcb607a6819793745057c4cd48cbbca40fb681979bf1415f0d700a366fc7ed48c3f8d9af159c818c93cfc3b2ae7e999818cc32d997d331199f60096c1746554a62794c1f494a84caf2c83e9f565e4bd292ae0dba2667cb80cb400ff2b23ef84e68880f7868cc39c18dc2f2acfd6a8197b21632403b1322ae7130020e3b05f9ba84c2f2f83e94ba332bda30ca6f79591f781a8803f1635e377cb0040fb4c1979ff1a15f0bfa2669cde121ded0bcac87b5d4b44c09f2d8369c3ec00e879a7cf8e08f8c032981e1595e9695133ee2803ed7e7322326d9d139d69470054a6cbca60fa5bc81ba9b5f96354d4135aa3a39ed41a91695b194c7351991e005e06d323a2323dbf0ca63ba3327d43194cdf1895e90365307dac8cbc5f8a0a00f86b5133feb10cb4a3e746cf3b6e6e44c013a3666c2b03edba32f21e1015f0006151339e5d06daabcac8fb8aa8805f1d35e3dd65a0fd631979ff1315f0a8790011333646cdb81f648cd41ab744e5bc7a5e7405af8bcaf4b432986e8bcaf49a003298de5246dedba202be236ac64f948136353f7adea6f91101ef1935e302c80018e9bd698bcaf9e032f4747854a61794c1f4aa32f2be222ae05747cd7877190068ff5246deb50ba2e73d7c4144618f8e9af1a4a8197744cd784e19fa990de700f4447a59e72d8c887afdc2e8a80f8cca747b194ccf8acaf49a32985e1795e9007bcb60faf132f27e2a2ae0c7a266fc791968ff5d46deff45053c7a51c48cb300174547bbbd8cbc1746057c69d48caf858c91ccd2f55139bfbf0c3ddd1795e90037ca60faf332f2fe3a2ae03f46cdd8b8383ada8d65e43d697144c05ba366bc00183246aac29747e5fca632f4747b54a68f96c1f42b65e47d2a2ae0ef44cdf8006c19681bdba2e7dda32d22e0bda266ec2c03ed2165e4dd1815f0d15133ee2c0003edb565e47d6d54c03746cdf8a132d03e5646de2f4505fcb5a819ff5806da00d14ba2e71db72422e0895133b60d172d1dd24a6bace1c8ada010c474206c4f00b6ab1e1e9e0a06fff461af75c16000fa40d82910958e1f53df072e47c7fddc006cb673acc11ff373fb0ed5a5f2196d9e3b06ee4957e382013dc7c43b87bc530086c601cfc094115d4f86b4948ef441654dd8f521bff5e67a5c48be34cbd7040069ea2df2178278e51fc3f08c619847439c3ea8383576209eb049d437fdfe8c000a06fff83b56806bc413fb7b653e284aefee19db77ad33c72d1e74dece5d5b00cedbba3d0510473148f81f8af09c258dfed559e274da06484f3c741c55933400c4d5310ca84eac967b986b2113d98926321d0cfed521e3b103bc6da6732ce0008f115f4ea8bab40bbd16392c6fac03bc6ca5e4d2a6a011f8a6c7425906fdf50029cd9ac4f190e7822d5bcf5e73e119179dbbfdbc5d3bb18213705ee9ebe0be000e421238cdfe2381eb82f017a81e84e02f8b7e313a8dd321f262f46ecbe38b00511f0cfef56127259a3043729bfb512c9e948ecad7f1a3c95e43bced05c34a009482b8ddfa85b8dd4608e2761b2188dbdd8e83fff3dd00f2b0cad39787e48300b8b1cc80e8b871ac1dd271e3993e755c03f0a6b809605428aed1dc8c83b8260013371ee226827c144e327113206e0f13872fcb6413d70471534cdc44889b6a00e2e8ec417d7bb0b92e047119bf5c9f4f7748dccfcd7664f5730f8bfdb9fdbe00e2e1e659e42b129f4340571bcd75dcbee2e1f0dc14f0a1f8345c2f84b4948e00f4418d2e61d775e45073bd3124dfc12c5f13a439d4227f218857fec3189ec30018665d26b30047fc75b6d3d7d9d27fc3aeb33d9096d73df27d9f8f75b60d7000c45f677b7d9d2dfd37ec3abb01d2f2ba47a7083e1febec72c0117f9ddd26540067f3beceaadf519096d73d3a08f0f958670f021cf1d7d91d4275b6ddd759f5003b1dd2f2ba47a3f9cfc73a7b2ce088bdcef6e685ea6caec7d75935d804697900dda3bdd9cfc73abb1d70c45f67dbb709d5596f67d5ef259096d73d9acf7c3e00d6d99de65a8f7f1d6606e144c7127a3bb6cbd4e36c97afc741f05a48cbeb6300c65c3f1febf1cbccb5aec747997adc0271479bb8d98037febaddd9e5c71c4a00fe0dbb6ebf05d2f23a4a5bd49f8f75fb06c0117f9dededf27e45e9420db7ce00de0b6979dda34dabcfc73afb76c0117f9ddd225467b35b7d9d0d8287212daf007bf3cdf5f3b1cebedf5c6b7fe13ee32f2c84b8fb4ddc2288fbb0895b0c711f0031716d10f780895b02710f9ab8a510f79089cb42dcc3262e07718f98b83cc4007dd4c4b5431c7dcab103e23e6ee23a21ee5113d705719f3071dd10f74913d70003719f3271bd10475f825c06719f3171cb21eeb3266e05c47dcec4ad84b8cf009bb85510f798895b0d715f307105887bdcc4ad81b82f9ab8b510f72513b70e00e29e3071eb21ee4913b73fc47dd9c46d80b8af98b80320eeab26ee4088fb9a0089a3715a3d4f4d6b349e308b69c606036b1f0a414cef466eebd6be351dc1e0005f8add17e09a30683ce3e3c6c3d6fbe9f3fb365d78d68bb6ecdabee1a2f3b600ea2f37e39a3e824d2a0a5bef476970c94f1d5ce392475c2f371aae31ef184b00dc7326cc38ee119fd43a35fd6cf8a469df73c733593cef91e11dfb3a4a35af0087cbc2e817f6fa8e023cf502ba18eef2e17a593cd9a6a0626b3443eb411a78000b2ce7cfe392c152f43e06f0c4deac987a30661878b059a913c02324675f170097961f3e17e373b5ae1a99aec6305d35419a09a0bf4601fda5802f3d9bee1b00010fdf56d100e9d2558291e2ea008fc43b10660fb00c71f933d7d9e82ad31900e2371eea6ebbaab14e007755c29eebc753dd4a9be7721c6948f36cdb00b64900a901b9103397c7b6fda910c4ab73e2153019885f6330d846531c5d633b2ee10086a37fcd31123fac3bf50e39d290661fa37ff8b4fbee1fb6d3a8037c4e10b800edc904211db8de8d09801197b3131e29ff82ea040d0fe1bb40bca5dbb9b86500223b33daa1e334a4991f52876c6d26dad4c0fc9f866bd2d95821d95ce535b60082bc8310de02f62d8fb63400f90386877eb8f553a08ee5873bc421ed4b09c900d9f78e369967c5ed8b4e64ba1ac774d504699a407f1305f49702bef46cba27007eb588b92918da7e360483eb633560c4b68ff048b50d2e1b866568db5a48ff008fae329d61bfa80eae09eb61b2fe731e754aed6d1dd31ffacf0f83ffbcb98800ff3c8ec555d237a57be2d70872d9fc49f49f05fca5bcadefc77d11ac3bf50e0039d290e6a412fd67d4c178909378dbec8954dfd2f56e3442c8edb2a44f44750082fc311c03a050aa6d16d0715f3da3b66bb443c76948735611ffb909ee0bc10040fdb1f577286d5d30b82dd0bf8c896f827cfa475bcbf9333281acbf2560fb00fb744f7a24dd137ee29786343b8be81ee30bc1e0f79842d217a5ad83744df0002c1dcf6d09e99ed2e1f12892631dae770efd7e69de41086f81366ad87d0eb400d3b1d7d5dcd6de8660707b540ccf44c033296e3c72ef649f9da56dde71f7810026335d8d67ba6a823478becb6401fdd9fa37748fc72579cc1eb3c7ec317bcc001eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c700ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317b00cc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb300c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec31007bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1e00b3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec00317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc001eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c700ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317b00cc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb300c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec31007bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1e00b3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec00317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc001eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c700ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317b00cc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb300c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1e7331cc1acf38734d581b2000ddb82ac148719300cf44213c750c0fdd63198e36d7f5169d8dae329dd501c60031e67a02607d70ec00de0971e3cd6dedd5781b815fc182230d692e6f1b48fb005183ad91612679c6b3b8b1f0ec4210afce89173d9bee895fa3c114c07f8d70003d0a30d6c78dd1e8798c0323f1c3fa5def90230d693e6ff43f2918fa6b0299005007744db6a3019e87f664a4de5f2c933ac0334e080fd58994796e03d305da009309a033fa1feb769d1046e245cf1ec7f483ed4403e06910c2e37ad73c6f01001b9dcde61b8007fd52ecbe00d713008fc47bd3003c4ac1334e164fb609f020002fa9f7d1550fd05e09d8cf3cdaea52f43e11f0ec113f9e2ef4ab4ac1833ef500a4f8f1e484e4cca2aff85c8ccfd5ba9ac2743591e9aa09d24c06fd4d11d05f000af8d2b3e99ef879cc1eb3c73cb298351eee373740baba2ac14871382e2060009f43db642c43f2a1c65874d650653a43df92faded8e7983c6e00af804fd585003aa571018e230d6956c2b8c03493a03118ea23e33807ea3cf63eb7d139ef7300d33df16b04796cfd64f4a5057cba3e3dd73b30123f9d6612e0b6c9918634cd004620dbb800ca86634f36db21353ee67a0f260346c28e3ea374ff9ac600c659007421c57b12d3c524cf7b376f81b662d87d28e979007cf74ac13359184f58d90008fb3e7dfdaca9f13fb7cfc6ee699e456d19e1277e6948b33cc47ee2b3082700d9537a6623e86a4fd0d99ef1cb36a8bcc87e4d1a01de41086f8132edebeb4f008bffb97d75652ff32caa2b849ff8a521cd862275652fa61faa2bf4cc46d0d5005ea0b3bd04741656572ac93b08e12d50a679fddce9f13fb7afaeec6d9e45750085f013bf34a4d95ca4aeeccdf44375859ed908bada1b74b677fcb285d615e20057077212ae8c89df9be9e13913cff1672a2443e09041a86eb4ebe7ce88ffb9007d756e1ff32caa73849ff8a521cda945eadc3e4c3f54e7e8998da0ab7d406700fbc42f5b689d237e7520e7de90b60ed2d0ff54e738fe548564081c3208d58d000efddc7de37f6e5f9d9b699e45758ef013bf34a439b7489d9bc9f443758e9e00d908ba9a093a9b19bf6ca1758ef8d5819c5887ea200dfd4f758ee34f55488600c0218350dde8d4cfdd2ffee7f6d5b959e65954e7083ff14b439acb8bd4b959004c3f54e7e8998da02b4a8be371c27369a1f510c730ebccb56d0c13fbceb3840030bac66e6c3ac33e3daf8f19135fc7d2d2fb83ef1ea57fbe8e01155bdf2132005fcad624d13b56cfca230d69de50e41d2bb6bea931185a7f6df928fd5448c300c73febd97370fcf3e6109c9263cdae3a545f41de41086fa93a44ef3b5f3f88007588d2bcb5481de2f6c5b68e8f64da23241fef67878da1ef013829cd3b8ad40021a9758cae3a34a682bc8310de527588b7f5bc0dc1b6febdc36cebf95c20ce0081cc0ac947e9c3ea106fffb00edd57a40e49f911ae3a847e0261223d644c3c00d73bb5c7fc5dc9544886c02183645d24ff92eae22ca69334a4f97891bab81f009383ea223db31164da2f241fa50fab8bb3d873b02e7e260427ae9fa3bc427e007d68fd44de244b8cebad72c843972d7f779f77f5d9cc770d677e09d76a340b00e199340c3ccd8027133f9e9c909c7d73592de65971af199ccd743589e9aa0900d2b480fe660be82f057ce9d9744ffc6a11b3ad1fdb00e9f6a8128c1497013c0002f539d4866119f23d36a8b3862ad319ee99a0b54d3487abdb875fc31a2b8100f1dabcc6bb2ff02b000e1ccba734ff5b3c90f6f7b0c66a06c841e134162735000f9b025ef46cbac7394e9a4fc0b92cbac6355602eb0afaf43cd58111d78172007f8acb81fed43f4af4a75007748d6b0e6deb9ca4f65eb9c68871ef15c95c8900359b5427c80f9c6ed185804f9495da9f910a86eea5e43ac6bd94a3c70fd63500fef0598493ea0fa5c7be03a5ad0b86ae5fa6b98a468685fa76fc1934572151000ff573c7c7ffdc3cb64fa47bc24ffcd290666211ddf3b66e2ad35d6330743d006c5d30f87dd7bf8c89e7b684744fe9a6417aa17510a1ef1cf1136a27f2d826000580017f05b89e0a78e2af2f1dd98660709b500ccf78c023b1a74ee8bdc80a00f5a5fbfa2119a6aba94c574d9006fbd81901fda502f71e808c85772688571700cd25e8a292beba4b17c46fb89867d520e64c0d62f67af67a7661ced42066af0067af6717e64c0d62f67af67a7661ced42066af67af6717e64c0d62f67af67a007661ced42066af67af6717e64c0d62f67af67a7661ced42066af67af6717e6004c0d62f67af67a7661ced42066af67af6717e64c0d62f67af67a7661ced4200066af67af6717e64c0d62f67af67a7661ced42066af67af6717e64c0d62f67a00f67a7661ce5401668d87ef15c06f694dab128c1487df5b192f84673ac343f7005886b4cf6d8645670d55a6b3e9808bf6f6d13e14bd776549c300def8cf26cc00f7ad579f01fc0a8003cfada4347bc2bec3bcc186fb0e71af213f2b55684f5f009fcef99e3ebac77378491edc97c3f74636401eac2b12dfa8490543bf3741f700b8af8bcb52093da61c7a94e4ed7ab7a7c896431ecb3c00f90386877eb81f32007e3bd7bf1f6938e7228c073c35b44f2f8bfba7e2de8fc4cfef99c474d5046900b0dd923a2bcfd526ccb2f0ce04f1ea2253822e32163c990aeb82f80d17f3b8001ac4ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ec00c2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc200ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ec00f5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc25c0d007ad678f8fe04dc5b33a54a30521c7ea77dbc101ed7be132c43da4732cda2b300862ad3197e6b45e0db2f59dce744cfd77b898e9f20c9b77f9fd334e057b0e00048439a458b06d29e6cb0e17e21dc233489c549edc34805a57db7cbf66d28be00a7a901f2601d947a4f2632dcfc7b4c8d16592aa1c794438f92bc5d3643d85e00e5b1cc03903f6078e8371ef0c4bf2fa67f9fd3f861e0c13650eabb4b02fb7f00b268dbe3dee7d4cc74359ee9aad27b9af9be2bba277e1eb3c7ec317bcc1eb300c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec31007bcc058fd963f6983d668fd9630e3ce66c793f8fd963f6983d668fd963f698003d668fd963f6983de69ac4acf1f07d040d906e629560a4b84a7c67c2b53f0400cb90f67b4cb1e8ac12df471a8ecef05b2b02df7ec9babebb7475a324df5cdf00dafd29c0af60c19186341f9a3f90f695061beeebc1bd3cb6fd6f12fb255281007b6f19f1c37d3db8d787ef3d6a803c5807a5de93710c37ddcf028c5c964ae80031e5d0a3246f97cd10b657792cf300e40f181efacd023cf1dba67c16ed602900789a014f26763cfdfb91046c70df7ea416f3acb8f723cd66bab2d9764ad30200fa9b2da03f9b4f43f7b32dbc3341bcba9853822ee658f0cca9b02e88df703100b7d42066af67af671766af67af671766af67af671766af67af671766af67af00671766af67af671766af67af671766af67af671766af67af671766afe7689800351e3e3fd400e9c65509468acb009e66213cae793f2c439ac79b68d159439500e90ccfba13387b6fd03c333d5fcfe52e6992e4db3fcf3c11f8152c38d290e600b1790369f3061bced7e21cad6d5d43267619c2d70c103f9cafc5395c3ea7dc0000792ab1d621c370d37d3360e4b254428f29871e2579173b8756a81cf258e60001c81f303cf46b063cf1cf4bb667d10e968207dbc096d8f1f4cf330bccbf6600d1b6c73dcfdcca74d5cc74d50469e680fe5a05f4970a86ce7bd37dab85772600885717734bd0c55c0b9eb915d605f11b2ee6391e734530fbbae131bb30fbba00e131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae10031bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae13100bb30fbbae131bb30fbbae131eb9faf1bf161d67832e69ab03640ba4c9560a400b816c0335b088f6bdd1c9621ad831b67d1594395e90ccf0011389364d03a4d007abe5e0bb9f7c401bef19fc3d2bf4e13f9150007f14b439a0fcd1d483bd360006b843c1913e25ab30ce8ae257619c2d7dc123f5c93d90c7119c04b610b8b93007c4f5a186eba9f0d18b92c95d063caa14749deaeb39184ed551ecb3c00f9030086877eb3014ffcebfa723d68074bc183edb6c49a761939fbd76992ad8d7b9d00e63ca6abd94c574d90662ee86f9e80fe52c1d075a3744ffc3ce6ca601ecbf000c7c4bbafcecd2f4117f32d78e6575817f32dbc3341bcba5850822e1658f02c00a8b02e885f1230cff5983d6607e6793588d9db8dca60f6efa0c7ecc2eced8600c7ecc2ecdf418fd985d9db8de460d678f8b86603a46ba9128c95dcb7dbccf000d03d96218d3f672c3a6ba8329d35039ee6f8f10c3a239d9e3f5ad13b617e2400133fdf8e14e35708869e5d908634999681b477c3fc08a5a5ba8e63bc58ffa500ce2471cd75113f3c0f02e71e102f8573589ce47bc2cfeca1fb56c0c865a984001e530e3d4af276cda90adbab3c967900f2070c0ffd703e22fe71de5c16ed60002978d0d790984b9691b37f7e84daefb8e747b80fc1c7c92bed43f07904ba0f00f37b3c668fd963f6983d668fd963f6983d668f395bdeaf24cc784e2c8ec75000ba395582b192eb6e5ce30b5886345ed062d15925c6b386a3335ce327b0e67000d0598cf47c3d663471d200df96d8f9e6067d2b8fc6b3f81acf34a4f949f34000da29069b6b5cc8363629b576db353649fc70dd2c8e15d1f504c0283146910a0086ee63b0ad9f237b56ef90230d69f633fac7ef660616d9707c6e018bd3f22e008c5ddefe32e1769cee170246926501e0913e8799af65aec4581dc949cf9e5f0041decd8cb74deed86d6c6e6bafe64d654db685ea31f14b439ab690fa8ccf22009c6473f01d2799164aca66f4caf170d9749a45e6ba9ea55908f2539a8e10f900755b34c1229bd4bbeb7a5790b7802def1b5b5ec8640f1bcb455f6671fc78ba001a82c176bb189ec5806751fc78724272f68d2db79967c53db6bc84e96a2ed3005513a46903fd2d11d05f0af8d2b3e99ef8d52266e49d09e22dbfa525e862a90005cfd20aeb82f80d17739bc75c11ccd55037341e6a5f086b03a45b58251829006e11e011b0fba1fe2196a1adafbe18aeab496795587b329bf1d2feed99d05700171857c9639f8afc693eae9286349fca0ca43d07faea9496ea3aca83f53ffe00f186f0b121e2a731d2bb896b4f102f852d2c4ea8cc43f7e6360346db1a1e69003da61c7a94e4cdc732e68e80dc41e0ae3f748de33ab1fbe3a68f4b7687de4900e24dfcd290e6aa227d5c6ee7165a64e3f6b962f23a6c319757a721ffa49ea500590c3aa134d786e86424df9f3ac0b87b3d9f89a734d867aa0b868e9d668291007d17b05f171b6f53efc99fa37abf98e9240d69de58a4def3fe16d57b5b1d0f00eba771bfc9561779df09ebe29b4b1c83b1f5bb0a4165ea27f1ab0359b0bed500411afa9fea27d7612610f32dfbc672b07c4816fc15e01ac74ee2f7233bb2e800b396826729e089fd1d32633902fe72df584ed63c2beeb19c1cd395cd0fa7340059d05f4e407fb6fe27dde72cbc3341bcbac897a08bbc054fbec2ba207ec3c5009cad41cc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5e00cf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf002ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2e00cc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc00d5a067dc4b8e7b2a29dd922ac1487195d87becdad78265487bfe165a74d65000653aabc4f9510b182fbd2fe7e13d06f8c6bfc7a3ff5ca336e057001cb6bd5e0057cc1a48fb7183ad3118ba2707cf01c1fa5fa9b35ce89ef8698cb4a708cf2f0042bc142e607142651e7ac6926ddfec820aea31e5d0a3246f2a1f7af6220b6f00a9efc5623990fc01c3433fb405d9d8f1e4b2c3fd5e2cb6db12f65c46cefe7d004ed47ec7bdcf89fb10b399ae2aed4364191ebacf5b7867827875d15e822eda002d78da2bac0be2375ccc398fd9630e7c7df6987d7dce96f7f37af6982b8ad900d7e7e460d67878ffb601d22da8128c14b714f008f47f42c72db00c691c62890045670d55a633e1b36dfbfac66d8c971e8b9a337980afc01841472a187a163200e1207e7816f2b2fd06d2ce37d8f07c311c635ac2e224c76589173d9bee895f0023c8b504e2f898986bac56ea3d718dd566012397a5127a4c39f428c99bca87009edd66e12d500e792cf300e40f181efa09cf276d453b580a1ef43524ceb3110092338bb63dee71b20ea62b3e2ed50469da417f1d02fab38ddbd17d87857726008857179d25e8a2d382a7b3c2ba207ec3c5dcee315704b3af1b1eb30bb3af1b001eb30bb3af1bd130e33a0dec1753baa55582b192f38dae7e1e9621f5db16580074d650653ac3352402e7b5666deb5574dffda59307f80aac7be8480543cfe100e56b2ef01cde393307d25e0de30a9407fbe4b6712ca9733c5d6344c40fc71000b0cfcec7101a204f25d680f1f350e93e0f18b92c95d063caa14749deaeb5480095943b08915ba00ee4b1be05a0fb80e1a11f8e21c4df07ce75a30d2e050ffa000c12e3bf427dfd2cb62b718f6974315df131842648d309faeb12d09f6d8c8500ee899fc7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc729800351e3eded700e9725582b192eb2f5ce3705886342ebbd4a2b3862ad319ae410092d8c386ebf7e8f97a6c7ecc9401bef1af03cb75a718bf4230740d5a1ad2fc0062df81b40d069b6bfcdd360724b5b6d4350744fc705d1f8ec9d3f504c02831001e6b5b67cded1ace99d63be448439a6946ff9382a1bf26900975c0d77137c000f32a61a7f89c30dd7701463e7f27395fe05a7f99033ddaec946d6e496a7ed30035b784f39b1487f39b12eb4687fb2d47e175ac593c3343787e7ed8733c587f00bb85f0740e034f37e09178bf85e4ec9be3e931cf8a7b8ea797e9aa93e9aa0900d2f480fe7a05f49702bef46cba277eb58819ed13616d8074b92ac148715d800091af7de8f391c02713f09ff329ce2f18ea3fa721cd7de093adb7f864d5dcd600933c9568eb5dfe3eae2db1b5a302fac9dbf49363fac17a5b1fd8dbfe34a4d9005cc41f5cc2f24ab64bc36927b15d1278ff3bd0d69482a717f0f4c48f27272400675f3bb9cc3c2bee767239d395cd7e529a65a0bfe502fab3b581744ffc3c66008fd98519fd11c2da00e9725582b1423e5c16fd1c7abef62576829f23d04e7400e0582ff773885f1ad25c067ecec5e0e7709fc6e55b4ad8f230df92f835820c00d8d649f9397cfcbc8be9c2e5e708e8a7c3a69f1cd30fbe0fdccfc17a40695e005ea29f23ec570cdbcf41bf42c0aef4a00d2b05cf72c0b32c7e3c392139fbfc009c15e65971fb392b99ae6c7699d2ac00fdad14d09fad6da57be2e7317bcc1e00b3c79c04cce8b713d6064897ab128c15eaeb0cf2dbe9f9da377e00fc7601bf00a747eba107f81582a1fd8734a4590b7efb23e0b7731fddd50793f04dc2fa6000c4af116440df4dca6fef61787a982e5c7ebb807e7a6cfac931fde0fbc0fd7600ac0794e6b112fd76613f79d87e3bfac90276a5076d58297856029e15f1e3c90009c9d9e7b7af32cf8adb6f5fcd7465b3cb946615e86fb580fe6c6d2bdd133f008fd963f6983de6246046bf9db03640ba5c9560ac505f6790df4ecfd7bef13f00c16f97181fd47a5806fc0ac1d0fe431ad28c07bffdbfe0b7731fddd50793f0004dc2fa60c4af116440df4dca6f5fc6f02c63ba70f9ed02fae9b1e927c7f48300ef03f7dbb11e509af153fbc3627ebbacaefbd7d0e2fb520886d63bc43d310400b7cd26b4333970cd30fadc026b98b3527d1d9bceb89ca8b369c3d419ad31c20035c6798bce24e65185dee93e9dad623ab3d5334a33b388ce56397486f58c74004569eb201dfd9731f1b46e89fe7fcec4533a3cd75268dd6d874d47ed0c17ea0068ee3075c4cf05c3b562e8d348c99663b22db7c846691617912de7900dcb9f0064cac9ca9617f2b13a52f02cd219e15f0d3aa334ed45745670e80ccf97c677009f7426205bbb7eee1a219dad653a23fc6b4067946659119dad75e86c35e8ac0060aed782ce24f62d689fb0cb82316018e9877b19281fee535b1b3fc661af9f00479dad13c2b3761878d6011e81fa991392b3cfd7596f9e15f738e0fe4c576b0099ae9a20cd7ad0dffe02fa4b015f7a36dd13bf5ac48ce77612d60648d759250018296e0d60e4df9cd076f7b8a9037805fa64791cb3e1fd6ee2978634dfda670020ed49065b23a4c53d14ed2c4e687f6aceb67f91eef11cc6e54cbf52ed4bd800384027e0e17b0e84f493b7e9a793e907f775d407763f17f7759c55a4df6d6b0027a5f6bd4569cb85daa5aee1b6db6b008fd4774d05e4cca2df13773bc9ed670027d315da4f61bfa7ef5d5ec3f0d03df1f3983d668f796431dbce5d6980745d00558291e2703fb8847dd6b2f3febaf6d96e047f52c0d7e84a81fef9b801f1c3007322de0afee42de04fd2fa22dcef6af397a4ceec70ed0fc5313f5a23568973007e5cfb38501702fe555648c77d3e293fdbc5e66f529abb8a8c2ff1337d787f0004f7b9e0793952e7494b8c8fa28d091bd7a634f714d1d91a87ceb08e93ae28006d1da4a3ff32269ecf75d2d83f9fc7d5e985fab35d361d75325ca8a3fb87a90023b24b58af482ef4e5a564e37befdb2db2519a878bc8b6d4211b963f6fafb000fce9bf4c30784e88973f7f864e2f359e21341edb853e11e99ef013bf34a4f9004c11dd73ffaa87e90ecf48c0b15401d9da71cc33c6e776e1f821e98cf0af07009d519a2f16d1d9fe0e9dad059df1b1b63ae045ff654c3c1fb7a4faca9fa1d3000be9a8433f7743fccfedd3fd01e659a47bc24ffcd290e61b45747f00dc17820001ddd3331b415f945648b64efddc0385747610d319e13f10744669be57446700073974b6017446baa2b475908efecb9878be7797ea2ba5eb86f442fba243d70014e19ed6a4f216d8a79c1fee1921b827ff20015d340483f78314c37390309e00b0b241de0236a36f4ddbc1e659dcdf449b4169fe5cc4661ccce4a0f58ce86f00924c07836c07c72fdb20bda6985e2bc93b08e12d55a6879867713f1bcb94d200fca748991ec2e4a032453f9b643a04643b247ed942cbb492bc8310de52657a00a87916f7dfb14c294dfd9efda1ab4c0f65725099a2ff4e321d0ab21d1abf6c00a1655a49de41086fa9323dcc3c8bf72fb04c29cda422657a189383ca14fb170024d36120db61f1cb165aa6c4af0ee4c4b2ad8334f43ff98a1c7fa14232040e001924ebc6e1e659bcff837583d2cc2c52370e677250ddc0fe0fc97438c8767800fcb285d60de25707d784eb39836923dc978b6987f9e9e76e8af0dc1d457efa00b99bcbc79be31101e8a10eae895729ffdbd26e823c07b274cfb1fb31c1401900619da4ff1787d449a1f726f49d3d10780bd4ebbe779664e7fdefc32dfac917007967373339e89dc5fe372f23ac6f8520beb1053df7d763e13552f6a112bc830010de9be2e7ddd74f463b4df2070c0ffd36019e2384f06c1a069e2300cfc6f800f1e484e4ec9b233cd23c2beeb54047315d6d62ba6a82344782fe8e12d05f0a00f8d2b3e99ef8d522668d87de1bc2da00e90eaf128c14b711f008d4e7501b860065c8cf12459d755799ce9601465a8f81eb348edf7300afc03c47dfdcf506e00057001c381744694e837521271b6c8d90b6db220fea5c6a7f2fdfdf4ef7d8ef00a7fe22ee6da16b1c9b15381ba74fcf2b1c18d127e0675a7239f04ccb3343fc002cf46b5007744db603cb09ed89d499faae72ea058c847b35e091f289a84e90003fb6d6a20b81fd6159211de7c3d679e1f94a94e6a222be3a5f6f45f507df2100d215aeb792a83f926b9e36329df1b1e034a4b9a288ce363a7486759c74856d00a6d459c3ae3a4efcb0cd243b8e734995b0dfae73cc560046dbba026c6f285c00cfe22475bb9ee15ecf748bed0eeec31268cb43cbba92bc8310de52f3b0580e00247fc0f0d00fdb7a81fe5cef70e761d106489dcd2620e7a035a871f72f3731005df5305d35411adccb24307e91b3d9743eaee8317bcc1eb3c7ec315727668d0087fb660d906e7d9560a4383c4f4e62cc39cc5fc332241fbadba2b3862ad3d9005ac045e355b887fe71184b13e8d3f7a24ef93c199e6743695a602ced49184b004339285cc1e284c6a972b6712abac733ae6de36b748ddf45161807e8b58d0300f33e36f629eb1d72e079e3df2e329636c1a203bab6f599d19e48ad7b75f59900bb0123c98c7d1ea9fe1f9e375a08868e23a33dc13a5e4dfd756c2770fc51ea008c51d7bbe679cb9ddf8463d0fa17d6375f0b7824de9be19edf5489711c57d900088fe364856c655f7b8167f71482a1b6320d69fe51647c979fd942ed008ef90091aed0f795da138d67b41682a1fb452bc13b08e12dd1fe498ddd61df86ea0a00e1277e6948336a5a7fe8aa2bbc9fc4f7a63482ae70dd8bc43a1cddb6adb5f00092ea5fb8eae5c60af20e42780bac27cb63ff2800f90386877eb8e6ecc8f8f10074370483d7db15c383eb5e24d67008c999c5f51c718f451fcd74b599e9aa0900d21c05fa3b5a407f29e04bcfa67be2e7317bcc1eb3c73c5ccc389646581b2000ddc62ac14871b82e57a04d09f523b00cf93a2ed4d9ea2ad3198e23d2d8247e00976fd5b401bc02e38bdda8533e468ae37294e6673306d2ae35d8705c6b35c800d3cbe224c7915cdf01c43e20c983eb7ef8de35a1fe51b76d7c9078133fec9f00d43be4c0bece61217d1dec5ba00ef8bc10aebd17f6c573b6fe17dd6f068c24007325fa44aefd1f38e7c2c7d6b14f8175bb1ae65cf07ba523f5cdcd24f3963800aba921183cbfa27f617d46e9b94a9cff2a058ff0f842b629b08f2748bd8fae007a80f64a6a2c6338fba484c732f27e2ca3bc9fef4755cedfe67e06f60936550009c64af6a35c360ccb90cfa3a0ce965599ce706f19f55f700fc1b5d08f92da00e7c1f72c6c60d870cfc2bba01ff55ae847f1be17ae61409d8fe41a065bdf8a00ef0f906a0353c1d0337ef97e71dcf357ef90230d69de54a41fb5c2a203bab600ed03457b22f5febaf6341e09184966b427d23e11f5a36c3e91f49eea189f9b00c7fdc9a31d3a4e439a77169977e47b9da9fed0331b415794b62e18da46654c003cdf174de7d6f067e8f452f550c8f6f7e9fe18f32cd23db7fd6948f38122ba003f06ee0bc180eef15d217d51da3a4887bad4f1dc9690ee295d0fa4afc49817007fe7706dd9488db709b551f9e1eee5c1bd72127575b8674e1e0d788e891f8f00d43bd967678f35cf8abb0f741cd35537d35513a43916f4779c80fe6cfd1bba00277eb58819f76be2da714ad753251829ee18c023d5bf70d9302c43f2b937580074b6acca74867d20ea67907fa1dbd1a7a10f24718e0ff6d9a8dde638d290e6004ce8037d0ffa40b6b3386ce3db026766878eb7e37958d4d7d80871b6bd2252007dcd0d0e8ce813d07b5eef90230d697e51621f0875c0e72bb12d447b22f5fe00babef5723460249985cf9eeec383fdcf02dc0bfb44d94afae15cc7e887ff6500987e38d51fec5793aed00fe76d54c6c41fc3b0901fce9fa1d34bd543f48b62007c6e1e7d0cd23de1277e6948f3df22bae7feca06a6bb46d017a5ad8374a84b001dcf6d09e99ed26d84f492f3b7ae77ae126b5af9b98936de026dd4b0d7b46e00003c127515c75c4bc123ed0f0bc9d967678f37cf8abb0f7402d3d506a6ab260048733ce8ef0401fda5802f3d9bee895f2d62c67512e8cf53ba8d558291e28e00033c02f539d4866119f233fd5067cbaa4c67b6f93df22f743bdabad7005ea9003ed0d1c0af100c9dd74b439a85d0075a60b0350643fb9838bf803a975aa7e5009a5fc0755a5c2eecbb611f48a20db4d55de24dfcb08f5fef9003cfefeb30fa00b7f950281bae9de37b9124df55577fe758c0c8d7144afa3f54fee47bd9d625004bf5772ae573731da3cf5d08a92f369f9b9f798afd53695b8fbe4b8ccfcda3001f403a23fcc783ce28cd0145747682436758c749572780cea4cec774d5f1de000af20e42780bb461ddb632257b896d18a5d93ccc32a5b6cdb6e637ccbfe4be00896d9e7f337b0ecef31f1b8213c7b8b05e49f934ae7a853e0db5f3a4af06f8005f78cd69cea67fbac73320290ee752f95e0b5cbfbaba02ba759d497d0260b4008de14bad1bc6b573050b6f5c637e6495eacc561f518f6b01a3c05a834167f900a4991e8f14d54f6eeb70cfa840fb2151a784ea41166dc9d8d89edb69f5d55700335d35411ae13564a1b6cdf67d93f874d1d569eb5bd9747184058fd419fe2e005d1c61e11da32efa781f5f822e8eb7e011f065437571bc85778cbae8d0bc4f002c4117275af09c58615d10bfe162de5c0598c7b2eb787877f7d9b8934ad0c50049163c27555817275978c7a78b7cdf78f6c925e8e2640b9e932bac0be2375c00ccc75701e6b1ec3a1ede5d7dbed62925e8e2140b9e532aac0be2375cccc7d70020e693aa00f358761d0fefaeed9af7a925e8e2540b9e532bac8b532dbc63d400c50ecdfbb41274719a05cf6915d6c56916de31b6ab7d7ed1961274b1c58267004b857541fc868bf9a41ac47c620d62de5c83988fa841ccc7d720e65a7c07ab00a16e8c65d7f1f0eedaaa799f5e822e4eb7e039bdc2ba207e49c07c520d623e00be06311f5183984fab41ccd5a067fc06c198e9927872db1a181ed259c03006000c63035ce3fcc6d6d831f69fe742bcb602af6df1f3cad9ea0bdd6f13e59ddb00aa9fbb237e99fac6dfce30cfa2f9fb1d1699ce34d7a998f579063c37057c28003e8dd7d307d2523ad207bdb7845dcf376e37d7889de73b9de56b8234db2df200178278e5dfc1f0ec60987599fc13d6214ad4ad52eab55e0741eff24c13e29c002e7eef642b8b93b4975b196eba3f1d3092bd44fb20608b42bfe148fcf03b1a004757a9ce9a206e2de06910c2339de1996ed18514efa98cf7d40af29ec4784f00aa20eff18cf7f80af21ec7788fab20ef598cf7ac0af29ecf78cfaf20efb98c00f7dc0af25ec4782faa20ef36c6bbad82bc1730de0b18ef46b8c6ef6ead8d1b004f6e6bdf3c1df1a03551fc7b4e42fd88adb80f9e7ea5f423a4da69a1b6d5ba0037eb682613ae83c4b54b526bf54e677878bf6cb89837d720e6236a107325f600c0f9ba31786eaa56309f5483986bb13e9f5c83986b51cfb5589f4fa941cca700d620e6d36a10732dd6e75a6c07bd2f5a19ccbe4da90ce65aac1b5b3ce68a6000f63e7f6530d7e23b785a0d62ae063deb71501a137d64ba249efeb5148887740016308c01c3886b304e079d09ac6fc862f9e0dcfff6f87985ae75d92ecabb7f002dc519f1cb94c5f505b496e20c8b4c6799ebb8d752e03a8714f0a1f8345c3f00086b29281de983de5bc2aee729685d0262e7f94e60f99a20cd0e8bfc85205e00f9cf6078ce60987599bc17de7389ba554abdd6f3bcf42ecf04bdf8f9f5787900fbf9f5fee7faf97579de7e7ebdffb9d53abf3e1afedbc6e2247dd06d0c23dd009f0018c907955d43da8f877891efc17937315d55a3ce9a200ed74d8c16c2e3006a3f475780b7abfdac046f57fb5909deaef6b312bc5ded672578bbdacf4af00076b59f95e0ed6a3f2bc1dbd57e5682b7abfdac046f57fb5909dedea67a9b5a0029dedea67a9b5a29dec56c6a235c8f023c13e2c693dbda3716453c68cd2ff10046bf5960bcbb6fcd2ff51fe857ca78b754df47a8bf92b5cd33343099708f2200aef93d5d40ceb0f1c7d3a11c868379730d62aed63dd16198ab75eff9f3ad6e009c588398abf52c85e75b7d3eb90631d7a29e6bb13e9f5283984fad41cca7d50020e65aaccfb5d80e7a5fb432987d9b5219ccb55837b678cc15c1ec7dfeca6000aec577f0b41ac45c2de7a7d198e8ad7b4be289fffcb4edb1631c7c7e1aae510015386b2c744df60e51defd6b7ecf8c5fa62cae83a535bf675a647a81b94ec500ac4f5c8f9b023e149f86eb9bf71e484be9481ff4de12763d4f41eb67113bcf00773acbd70469ceb0c85f08e295ff4c86e74c865997c9abe13d97a85ba5d46b00dbf9695ae7f4cea521ee74d01bc5a13da5387af66488239def0971a493bd20008eeac4de10473adb07e2ceb6603ec75cd741dcb9e6ba1ee2ce33d76320ee7c0073bd1fc45d60aef780b8179aeb4688bbd05ccf80b89de61ad734ef32d7d32000ee22738deb8f5f64aea740dcc5e61ad70a5f62ae2742dca5e61ad7f55e66ae00f785b8cbcd35aec1bdc25c6720eec5e61ad7cbbec45cb742dc4bcdf57c88bb00d25ccf81b8abccf53c887b99b9c6b5a9579beb66887bb9b96e81b85798ebc50010778db95e0471af34d7b321ee55e61ad7865e6bae1742dc75e61ad771beda005ce721ee35e67a25c4bdd65c7740dcebccf52a887bbdb9ce41dc1bcc7501e200ae37d75d107783b9ce42dc8de67a39c4bdd15caf81b89bccf55288bbd95caf0083b85bccf5fe10f726737d00c4dd6aae0f82b8379beb8321ee36737d08c4dd006eae0f85b8b798ebc320eeade6fa40887b9bb93e1ce2de6eae3b21ee0e73bd0004e2ee34d7eb21ee2e73dd0e71ef30d79b20ee9de6fa28887b97b9ee81b877009beb6320ee3de61abfc57cb7b93e0ee2ee31d7bd1047366e3bc491ff88fe1a00d96fdcb74573ed3b208eece3191047f6f14c8823db7f16c4910d7901c491fd00391be2a82d3f07e268beff5c8823db7a1ec451fb723ec491ddbb00e2c83ebe0010e2c87e5f0871d436ed8438b2b7bb208eecf24510476dd88b208e6cfac5100047edda251047edc1a510476ddd6510476dc9e51047eddf15104736fdc51047006de24b208edab597421cd9f42b212e63aeaf8238b2c12f8338b2c157431cd900d697431cd9fe57401cb51bd7401cd9fe57421cb511af82386a5fae8538b2cb00d7411cd9ef5743dc2273fd1a88a376e3b51047edc1eb208eecc5eb218e6ce6001b208e6cf0f5104736fd0688a376e34688235bf34688a376e32688237b763300c4517b700bc4d137badf047164936e8538b22b6f86b865e6fa3688a3b6e4760088a375236f81386affde0a71d4d6bd0de2e86ce4b7435cc15cdf0171d45edd0009716bcdf55d1047edd53b208e6cfa3b218edab07741dc0673fd6e88a376ed003d10476dcedd10476d1dd9696d0ff10c62b4ef9b59dc58e05d08e2ed83f0ef0095d23df1d318f9373a1be17a19e0ee65711a77b710ee5e869beef19bf32443002fc4d135d5c914e4e1cfc26f57d3b7b8eb1dfcd290a6d71866dbf7b7c7062200dfbdeffb9639f903d497276cc702464ab33204233e8b706e66f2a22e8f03d90004be639bb7c94665b3d922dbba22fa3f4e00a390ec39ac7bb40ef2088bec9400e6c019037a3ad85ca39d3f1af478bce57ffa858df561799f10bfcc7de352270002ce02f041de2701d69878e790378d4bf16f99a6e1fab8190369f9775149d700b85f8ee618103bcfd7cdf2e1f7548fb7c85f082a330e4dfc74991c06f58cea0091643b75bc434747828e284d2fe8e868213cfcdbd68483f8611b55cfd250de0034a4d91262b3b46ce40b90dcd8dea29f2060db42dbdbe30023c56d008c5c66005d5f5a4da7a711fec77ef06616e7fd9fd2cb234eff6723a4a17a1de6ff509a008b8bb4bf02ef649fff43e326dcff391a30529acb8bf83fc7c07d2108f77f8e0001d9a4fc1f2e1b95cd668b6c5715d1ff31021825fd1f2c3ffd5c9bff4369ae008176e95516ffe648d0e32d11fd1f2c6f017b9bc5f68ecafb380bef13006b4c00bc07b5b5e4ff101f8a4fc3f5cde0ff70bf81744dd8f53b437e2a62e7f9ba59003e3cdbe9588bfc85205ef979dfe73886b96f5e0eead92d15f07f8e75e8682300e86877ff13747484101edefe100ee2a7d350f9d7b33494370d69de56c4ff21005f00fd1fee3b08d9b61cca42cfa6fb630023c5a1ffc365d6f5e5693310dc0800ffe37c410f8b93f42388173d9beb19dbb91e88a36bf47fb84f2459ff5c7edb0011809164b0f96de8ff1ce178d60648c3eb32e78775f92345dadf238157c15c0067cbfbf5f93f34bf446d06613b1230529a878bf83f47c17d2118286fd42fe900e02890ad277ed9f236d9a86c7a2cb27da288fe8f12c02824fb20db43fe4faf0045764af35968973e0ffe0d95db46d0e3372dffd32fccffc1f216b0b7596cef00a8bc8fb1f03e0eb0c6c47b505b4bfe0ff1c17138bafe06f83fdc6f205d1376001cef47ec3cdf112c5f13a439da227f2188577edef7398661d665f238d4b36f0082ff23d54e1dedd0d106d011a5c17d16bd427878fbc3fbda3a0d957f3d4b8300fd164af38322fe0ff9022437fa16e82708d8b61cca42cfa6fba300a36d8c8a00cbacebcbb5e0ff503b8cf35fb6712d29dbea1a47415f87fc19db38ca6ac0dd00cde234ee4d42b8f9980ddd6f028c365f8eae696e340579f8b3d0ffa1f2ab7700f04b439abf14697f05c6097ad18fa33683b0e1fb46699e2de2ff709fb097c9008bbac4b5e102e5dd6d936d03c383b2fdb788fe057cf26ec9ba8ee5a79fbbcc00223ba5a9db67404f69738d7daa15a0c72996ffe917e6ff60790bd8db2cb6770054de4759781f035863e23da8ad25ff87f8e0381c5d4fde67202df71b48d784001dc7fb113bcfd7c3f235419a232df2178278e5e77d9fa318665d2663a09e51003d92f4378e74e808fd1f4ad30d3a5a21846719c343386cf30adcffa1bc694800b38fd161b1f92f9c27e2636092e30daef6f608c04871b80693cbacebcb2af0007fa81dc675a52b58dc58c85f08e2958b78d1b35730bc1a23f9332b206e05e000a5b097c555b3df8667c9f6389e85fe0fafcbb63e38a5c985d465913e92f946002ead0da43683fb7f6948d31982119f45385730795197ed209b80bdb1cac6ed000dcab6bc88fedb05304ada5a2c3ffddcd516d977d7296897d65afc9bb5a0c700cd11fd1f2c6f019f2f8b3e1ff7e59137ce35c4c47b90bf49fe8f6dbe91ae370081ffc3fb0ca46bec33d8e649783e3efedf140c1dbf936ceb787f908f3de83200d91fead966f07fa4daa98d0e1da1ffc3e75a349eb5427856333c8403fbd57c00fd0fa5a1bcb8fee7f822fe0ff902e8ff505ef413046c5b687bdb0e18f9fa9700068bcc7d6387667304ae51c13d396b599ca46d255ef46cba475f87f4bb16e200e81ac7ba96b138c9fe00f7bf6dbe8ecd97a36baa47b6b2a534ab210ded27a80077f04b439af38bb4bf9dc0ab60aeb3e5fd7a6c3e0261eb048c9466e730fd9f00b54c5ed425b64902f6266f938dca66ad45b64b2befffe4256d2d969f7eee7a008bec94e625d02e5d09fe0df7e9f5ffafb7fc4f3fefff94e6ffbc2ec4ffe1630094a5fa3f7cacb51afd9faba19ebd1efc1fa9766aa34347ab41479406d75fac0017c2c3db1fc241fc741a2aff7a9606c77f28cd2d45fc1ff2056c632be8274800f93f1b82c1f2d23dfa3fbc4fda6091b96fbd3cf83f64b770aff65216a7e55a00232417f1a267d33df1d318b3e69afeb3e55bcdf4918267f0f2a7bc6948f3ee00226d9640dbd2e733d07ec0d14c7e6c5b28cdbd457c8675705f0806fc407a660023c8bb4e56b62e8d673d93cde633509a0f15d1bf801de992f419f60719f57300b316d929cd0360cb1f029f80caad13f4f898e57ffa85f90cd8473b207e99fb007c8603016701f820ef83006b4cbc73c89b7c06e243f169b8fe3cf80c948ef40041ba26ecd84744ec3cdf5296af09d26cb0c85f08e295ff0086e700865997c90047a19e3d063ec33a214c1b1c3a429f81d2ac011d6585f0ac61780807f1b3f5003357337ce8eb7fa588cf40ed279e5bc2db5b491fa933182c2fddaf078c148700e7a87099757db9d11c3281f3317866c9721627e90b112f7a36dd133f1c7b58002e8ba7077d11b27b5986270d697e54a40de77e0db5e159908d645a0ab209f80067791c9fe2b2e1fb40697e5e791f2a2fe99bae0319f573575864a734bf01db00fa3b4b1b8de38fff8ed886af055dee1fbfcc59b4d954defb5b781f005863e2003da8bda0369cf8503cf6d7fe056d386ffb48d7841dc750113bcfb794e56b0a00ec3e8c80ff34c867a467efcf30eb32f923d4b37f431b2e656bd73b7494051d00511ab4b552e310dcf6130e5cf741e55fcfd250de34a419650e2772b5e1d49e00611bcedbbf4acef3f03e545330b4efdb609159d797e3a00da7f1801ce459c100e2b45c2b85e472adfb207ed8ce61d9f27c2427ae7ba667f0f2c7f96a4a332500a4fcb5fcab62973fd78de53a9ac9bf0a30529abd4230daea483b93b711e45d002d2a5bbf3f5460b2652db2519a9945f45f10c02824fba03e06c9b8dc223ba50069d977404f73cc35be873866d76ef99f7e613e43017429d0cfcbdac679d6590078ef0f5863e23da87d229f81f8503c8e31e5f71d48cbdb5ad23561c73956c400cef3ad60f99a02bbcf24e0afe56c637eeb18665d26f3a09e513dd298560b61005aebd011fa0c946625e8486aed86cb67207e616d06fa0c946679119f81da4f001c87a7bcd8b61684e45d190c9617db70c2c8db0397cff0cf29fdd7b89f037d00866516b9960bc9e55a7340fc704d20962dcf477276431a7a062f7f9c2ba23400871469b3e2f77dfb7d062ab3d14c7e9b5fb3b188cfc0eb483b9317fdaf95a200b2f5fb0cab986c369f8dd21c5d719faddf6790ead3e07a2cfddc5e8bec94e60004b0e527814fc0d7d5e8ffcfb6fc4fbf309f6115e852606c256b1b575a63e100bd0eb0c6c47b50fb443e03f1a1781cd37a01f80cbcad255de35c25e144ec3c00df3296af29b0fb4c52e3f26b181e3e27a8cbe454a8676783cf20d51f2c0476001da1cf4069709ca152ebfb0907ae5b73b519b8268dd2ec2cd167c0b58b941700db56a97e8b6b4c7d1560e4ed418345665d5f1e009fa18bc9806bbd512ea975008aaef345701d1df90158b63c1fc9d90969f8fa5a5e47707dedd545daacf87d00df7e9f017db94230f4dc14aca3af2ce233f03ad2cee445ff6bb9a86cd90e1c000be23e03ca46695e5b719f2ddb21d9a7590932eae7765b64a73437802d7f2300f804546e5da0c7bb2cffd32fcc67c06fb30bf42bb3b671a5d516de6b006b4c00bc07b54fe433a05fa47f38a67527f80cbcad255d1376fdce908d45ec3c5f0f00cbd714d87d26a9b930d73834ce11df02f5ec2ef019a4fa83ab1c3a429f81d200e09e8c4a9d8969eb6752f987f90c94e6de127d06dc93c1db5bc97e4b573058005eba5f0118290ebff162f3197682cfb094c980eb2650ae2e21b95ceb26889f00c648df3ce814c5d3df8677839e0aa03fe287fbef3e5aa40de7fb88a90dc7f500052413ee23913a57abd7219bcd87fa5491365cc087143d570bdb6afddc0e8b00ec94e6f3605bbf006d345fe3d977be9fe57ffa85b5e16823056c46d63686b500c2c27b15608d89f7209f89da70e283be145d7f0bda70dece90ae717e8df797006cf9ba593e6c9f965be42f04f1caef9a73c5b1b72f413d7b1ada70295bbbdc00a1236cc36d6bcb3a84f070db4f38881faed1e26d38ee13dabddeabc4361cf700f1f1f64fb27fec5a7fdf0b18f97e80068bcc7def33b4e15926037e4f08e592005ab742bce8d9748f6b0449ae3cc4e1b7f228ec6071427b08fb707730dcdccf006804193a208eaef15c894ec7b396401aee8f727ee88ffead48fb1bbb8d30e7004a70ff87fb63e8fffc7398fe4f9ec98bba44ff271fb76c0edf8eca266f91ed007f45f41f7fbf26d72d23fbe0fe03f93f4b2db2ef4e3373404ff5e61afb055900d0e39e96ffe917e6ff08ef9bcea2cfc7f70823efe5803526de83fc4df27f88000ffaa1743d75e6405ad7fc398ea192cf8ad879be4e960fdbf61e8bfc8540b6007fcec72a75998c837a46f548b29dea71e86809e888d274808e960ae1e1ed0f00e1c0bd7754fef52c0de54d439a994687c5fc1fdc4bc07d07c9319b6c30585e003e66d3140c5dcfdf6091b9ef4c36f07fe87b8fb86e34c7e2246d2bf1a267d3003dfa3a5ccf8dc1607f8dc2761627e97ff3730f6cbe0ef7e546d28f14d2451e00f54ebfb0b60b6d83405fad1dfde052f0e0fe26095f5948ce2cda9ae7627cae00cdd677305dd9be332139fee41abf0d9b07f598e3c7acf1703b8763f9ed55820091e264c7bcc3ed2e9621b547398bce2a7106e4707496073c026d7e167d127a00bef6498e021f36173fdff614e357001cc42f0d69fe03fef571e6da35eeb28400c549fa1dc42b08ec3e2dfa464b208eae27004681f6ae3dcc37c735297c3cc700e69b539aad457cf309161dd035fa84363b25e5afbbde393c639e64461f44ca003fa43a417df59c4517d27e4a8ccf6dc7f673b443c769487341481d2aa52dc600f14c1c0390a83f42e33aedb6711d7e16338ead5c5c4467cb1c3ac33aced77100d50543cf04ce98787e56de73269e3f43a7979c471518d769b7ad03e3e33ab8000eecaa22bae773641d4c77b87712d71d2d895fb650fb82e343d43e621b5a4d006d675330d42740d9ea4cbe85e6be5356af59f459d281bd2d459fe506180ba500321f150c2e0f6c833bd8b329cf4288ef60cfaee0bac4ad88713493638505e300cd45300ad4abad92eb96d02ee8e7daf69a509adbc05f7d0bcc2b507d59007a007cafe57ffa953a762330f79fc5f57b54deab2cbc0b803526de83d60ea6d8b30071df0b5ddf3b732806d207e99ab0e3be661b768a5fc2f2e15e829516f90b3100cbcfd7816019eb9f2e93b7433d7b2ff4d9a4c687573a7494031d511a3c538f008f97f3f50b3a0d95533d4b4379d390e6fe22b645c06fb7da3fdb993d94e6c10011b27fd2e72791fdcb5b64a7341f837af928d837ee87e8ff9fb4fc4f3f6fff004ab37f4f84d83f6ec74ab57f3996af1aeddfa7a09e3d09f66f8110a6950e1d00e1ba334a53cabe20b47ff43e85ed0ba234df28625b04fc5fabfd236c4b002300a5f9f608d93fa93e15b77f0b2cb2539a1f40bdfc11d8373e77aaffff83e57f00fa79fb579afdfb7d88fde376ac54fbc7cf9fa946fbf713a8677f1801ff8fdb0028b47fcb208e9fff857bcb715d83f49a797af6320b6e8a23ddd9e693a82f8e00769baf6b59c89e83eb5afe1562131b2c7975b9be7472ffb56d0d03ceafe3d800f148ae33a5f7cd36fe8ff334b639b7911cffb7edd7a16b5c1fdbed7816ae8f00a57a55efe08763e10dfbf587ae7632f677c2ac8fe57b68f87e66dc4333310400233e8b70dac69e4907b86743c00768b7c9669bcfa2347b16d1bfc4d8bfe4b8002a969f7e6ece223ba599b1df809ef635d7b8ff07edd022cbfff40bf353b0bc0005c6f2b3b6b1fce516deb88f2726de83f6c7909f427c705c70f758ee7e036900795b4abac67389a84d42ec3c5f37cb676b8351fe4220e317d3b3f9790fba4c0066413da37a24d94e2d73e808e73f280dcef70aac75b0b63fb6790ddeffe3f300d1d8ff6b0fb159b82e08f707d9d6204aed0f72adc3c135dc7c0f458345665c008ba2df87d9267e01e459cae2b45c5267c1bbf63de13e58bef619f70ca1ffc300d7cc56dbba5ec9f7c1b57e3a27ab8bfc70c71871fd95407bdd81ef652978b000df2d31ce2b2467166d7ddceb63b96dcd335d557a0da2ab8f44fc3c668fd9850019f7b6e0ba0c4a5789732c4ac1681b7390eacfb8da0a2c436a43975a74d65000653acb021e013f258be348b8bff13cf0bb05f68175a418bf02e0c06fa7ed1e00579d3590f642830dfd10f49516b238495f897805817d3c0ffdb9851047d7b800a657a08dee081b97c43977aa6f61e39294e6c545fa13132c3ae0fbf25d766a0024c7224966f49ba47c5adceb5808ece73148fb56313eb703dbcfd10e1de3ba00f0eb8a8c11166b8b71ecb812fbc004c69a3b6ceba0f9b94838fe767d119df500387486759cef1fa9035ef45f2618bc7617f7aad5599ea1d30be9282f34eed00031dcf5d4b715d13d1f43ca33ddd9d6534b8e170b8c9d760c771df49d4574b600c2a1b362eba017c62f5ba84d267ee83ba2df514dfe465330d48f42d9ea4cbe003673df2eabd72cfa79e9c0ee7fa09f773f8c79f375d04b593edb1a6bcad30600f179f6ec0a9ea93f681d38fffeee0a0bc6078b60143823262b23bb7d1dcc12008becbbd701c2b8ffa3307f44f56536e8f149cbfff42b758caed2eb6090770100b0c6c47bf8eb00f71b8a81f441ba1eee3a98852c5f55ae03847af624f473a500e601563a74b41474c4bfdd62dbf3c2bfd5acd35039d5b334b8ce8cd27ca388006d89bfaf63b77f617b77bf3d42f64faa9fe7da0782b2ef5e0708f5f24760df00b81fd2b77ecbf23ffdbcfd2b711d6088fde376ac54fbb794e5abca758050cf00fe00f66fb610a6950e1de1fc3aa5c1f1783e966bdb8b4ee5c4e7c1d1e7a434007f2b625b04ce56b6da3fdbd9ca94e69f2364ffa4cf5e25fb37db223ba5790e00ea6560c67b719e1fcf1f9e68f99f7edefe9566ff9a660dc540fae076ecf9b4000f6e14cc25503d921c5770ed832bb60f6436cb67fb3e8ceb9c60ca8be7044f0033b2566ceda8c3fecd66b2a2fd9b5104a394fd935a4bceeddf428bec94661600d4cb66b06f54a6b80f2e6bf99f7edefe9566ff9686d8bfa8fbe06a611fc81c00a86759b07f52e77dbaf681cc061dd9f681d01a3ddb582baedf93dac3e51a6b0045bf356cac95f2d15824da6dbe0fa48d3d07c7445784d8c4064bdebe329edc007fedcf498f8ebb12e7a42f8434c33927fdb022ed64359c93be3904233e8b70008edc39e9fd735b5c36db1a084a736c11fd4bcc174bce2b0de79cf493a0fd380005fc10db39e9e75afea75f989fe2cf491fb83e07fc94249d93be05ead9b9e000a754fa9c749cff1dc973d26dbe866b3fa9ed9cf48b426c562d9f93ce65c6f5008bfa7d586ce29758f22c01b9a4c63f5d7e24f1d31817996bdb1a41f47ff8de009091debf4232e0be6ca9f7818f87d8780be8223fdc39165cb32be1ab94d3e7009798e71292338bb6feb9189f6bb3ad59a6ab4aaf5b77f591f09b601eb3c76c00c3ec3a3383d22dad128cb63107a9fe8cabadc032a43674a145679538d37438003a9b0d7804fc942c8e23e13aab0fce12e5db81fe11f5c3380e9cc3bd3a339000f6c3065b23e4415f69368b93f4955cf50d7d259bdf47d7b80f44a08deeb0f900d7c43b6c5f399703e76a3e51a43f31c1a203ba463fd666a746722c92db0a49009f16c7ff0ac1d03e5e257cab189fdb81ede768878e712fd11345c6088bb5c50038765c89fdce95da3b43f86d63bf4f15d15997436758c7f99ec33ae045ff650082c1fb3d704f769de5193abd908ef2d5b207e7074574ef3abb316c0f8e906c00edd5b277e6674574b6cca1b362df22e0e7c9654c3c6fb3f8b7086643fa4a8c00fb70db8ef39ee49ba0ff524d7e4b13c4a13c745d67f2d17c2cfaf6127e6a2a0018bcb70331e39a5a4af30f183ba7ba43fb4916b27ce823d1b329cf0288cfb20067bbe68096c52e7fc7a0fd347c9e6a9905e37f8a608cbf5e756465641f3c6f0040e5b3c8223ba5496506f434ca5ce3fbb518f438d9f23ffd4a1deb13d8439300c5f51354de2b2cbc5701d698780f5abb41f354c487e2d370bd4766202d5f870042ba26ecdaa6d35c0f62e7f966b37c4d9066b945fe4210affc7c8fe20a86b900ef5bd199816baa471a539b10a6e50e1de13c15a5095b97623b0780de273e9f0084eb5228cdde99fed0655b16c72ebfddfe11b6c58091d2cccc846394b27ff100cb6eb77f6d16d9294d4b66404f73ccb56b3f5dbbe57ffa79fb579afdcb670600d216b363a5dabf852c5f35dabf7999816baa471ad322214ccb1d3ac2fd749400266c5cdfb69f98de27be9f0ee7d329cdb24c7fe8b22df1fbbf76fb47d870bc0074f73ad44c384629fb27d5a772f97f283ba5599719d0d3fee6dab59fee28cb00fff4f3f6af34fb776466206d313b56aafde37be5abd1fe1d9819b8a67a544900ff8fdb28b47f61e7dbf1394c9bffc7c7f8d0ff3b31d31fba6c4bfcfb69ecf6008fb0e1b7ef28cda999708c52f64f6a2f91cbff43d929cdb6cc809e76986b5c00438debc52fb2fc4f3f6fff4ab37fbb3203698bd9b152ed5f07cb578df6efac00ccc035d5a34afa7fb6f313f95a56fc3e28ee21e0df2492dc0bcbe7067a2cb800298e74873699f2d15864d8f97d0bd87370ceedaa4c7fe8da4fc2f3ea727d78008ffe6b9cc7c6395c3eaf2bb5d60ced3f3d9baf51c5395cdbdc33ae11b0adf70018c9b967db59db748dfb49da1dcf6a8334bc4e84cdc3de90e90f5ded64ec6b0060cc7e129a17e3f39ed8dfa2343767dc18f15984d336efc9f79808cdad74d80064a3b2c95a64bb3de3964d6ade59725e09cb4f3fd7b68e84d2dc9119d0d35d00e65abf8f546ed84fbbcff23ffdc2fc142c6f81b9d6ac6d1eb9dbc27bf7dc440020d3b6909fc2bfd38e73d81fca0ca4e5fb30f837ab6cdfe2b1e5e3df90688200345d16f90b41bcf2f3bd647c3e5a97c9bb3203d7548f24dba92e878eda4047009406d71a498d9df0f687afb3c3795dbe2f15f781519a4732fda16bfd171f5f00c3b165f413a4f66fbaf65d7402463e07dc609119d741eaf7619e89c775a32d002c4ecbd52c2417f1a267d33df1d318e79aeb16886b01bc142e6271927317dc008fa5fbc5809164580478a4fa11cd0c8f8db7802ef2a877fa85b55d8b018fc0005ef7f606e0510a1eec2b498c7109c999c5759c71ef27e17d12bee70cf7ae0900ef57eaabdbfcec407ee68cc75c19cc1a0fb7737866d5a22ac148716d8047ea005c0d97ddc532a4f6a8c5a2b34aac8b1b8ece9a018f409b9fc531197abef64900fe9411e5db8ebe06f569388e34a47947f340dabf65faaf1b83c1df5fa3b09900c549fa1daefa867e87cd87a26bdc9b21d0def5e979b103238ee7507dab77c800918634f467b1bd19a803ba469fd066a7a4f642b8de39fc361eb71592fe21d50009eaabb7587421eda7c4f8dc76dbdc19d731ce9d3586d4a152da62dcd74e6900ebe09afe7b2e18dc0f8fc337db617eb87f6638cfdd51e417d3dee41c8f0840000f75708d635dc5feb7a5cd431ede2f7f8edd8f0986fa5069f87f4648bd906a009385c6e5db715c849fcf8ae3e49466569177828fb1d03b81f310fc6c1d21d900f242635bed38becbc7ed710d3ea5995b44671d0e9dd9c6ed296d1da4a3ff3200269eb78bb4ff83d23543fa4a8cd3f0f683f8a19f8b3e5235f9464d1087f2d000755d30787c1ffb0f12be702a18bc170331e3be104ab3ac790033d51ddaffd100c2f2a11f46cfb6adad5bcc9e5db139b36cb60b318e6672745830ae2a8251a0005e7509c93ee8dbc4543e732db2539a75d01fd9df5ce3fb350ff47894e57ffa00a5d87d01ae716c4e60dd4016e736f87a27e48df33f31f11e34af42f34afc9b00607826de91f0aef1b50ea46bc2ae6d3a8dc323769eaf99e5c335129d16f90b0081ec1c0edfbbd9b7fe0fea19d5238d698110a64e878e5a40479406d791cc6500f9283d8eaf5139d5b33494370d694e2c625b04fa6556fb3797c98af6efd41100b27f527d526eff6ceb7c28cd36a8973bc0be713fa46fdd96e57ffa79fb579a00fddb1562ffb81d2bd5feb5b07cd568ffce827a7611d8bf7942983a1d3a9a0b003aa234b8ff6d01cb47e9d1fe5139d5b334e873529a2b8ad81681311cabfd5b00c06445fb77e508d93fa931426effe65964a734af807af94ab06f7c6e5cff7f00b3e57ffa79fb579afdbb29c4fe713b56aafd9bcbf255a3fdbb0eead9cd60ff00a4c6153a1d3a5a003aa234b6ef82527a5cff8aeb56a4fc56d7fa57c4cdc768006c63147c2d21fab6fcdc2a9ca7a2347786d8c4064b5e5dae679ac4385784f300247cee4472ff0f9f2ba27be287f324b6f91d9c87b3cda98ee4fc0ec980730800748deb9f973a9eb500d250fda80f8acf75dc5fe9316db3fe99da2abe971dd700c9529a078b8ca3e6e0be100c9437ea977f7b51c80768b7c94665b3d822dbc7008be85f621c5b725c959f23d36c919dd27c1ada8fcf821f42e5867eca5396ff00e917e6a7087fe7235bca9c00aef58cdb4fc17dded846e2b8205d7f1dfc1457005f226ccf802d1f9f53b3b5c1287f2188577ebe1f849f1fa7cbe431a8674f81009f22d54ee51d3ab2b5f7389f2fe537f1f687af65c1790dbe8f0abfa74b69be001762b370dd17ee93e2be83e4faf39660b0bc749f038c1487e78f719971ad1100eead9a03795a599c966bae905cc48b9e4df7c40f7db456886b05bc14ce6371001af77c21dcf3186eba9f0f184986791047d7e8ffcc773c0beb329563bd831f00ce93fda948fb1b7b9fc0f83ffcec5fc286e32dbbbfdf5ac4ffe1ebfd5b99bc00b6b5fb32e5ddffdd432e5b33c383b2fdbb88fee3df4fdeffdd43a9bacee768005b2cb2ef1e8f6b19d0539db9c671183ca7680fcbfff40bf37fb0bc057cbe4100e71252792fb6f05e025863e29d43dee4fff0f5bc786ecda49681b4bc4de46700e3e11a2ec4cef3cd65f9707dacf07ab9d03e31b661a3a19e513dd2985a8530002d72e8a819744469e6818ea4f67f717f8070e0fe2f3effc7e71671fe6f6f1300e9f27fc817c0f126ca8b7e82d45919aef616cfc9a338f40db8cc7ddf0986f1009f0cfbbf01e46901b9a4ea15f1a267cf6132d87cb4c660b0bf46e15c162739006fc3e79f6dbe0ef7e546d28f14d2457eb86d17da0681b1d92e7c2f4bc183df005e95f01f84e41c742e4fdcfbbfb8ad9fc77485b61efd01a975027cae93af1300f0983d668f7964316b3cbc0dc4f197b9558291e2e6031ea93942579b8c654800beca1c8bce1aaa4c67ad8047c01fcca2bf4acfd7feea49d0bf99133fdfae1400e357001cc42f0d6976ce1d487b9ac1e6f249ab6d4c8ee40a1b9393f2cdc2c600fa70ae939fdb611beba3346717e9b74db0e880aeb1bfc0d71348be73aeb33c00160146dbd89e54df01c7590b708f6bd06c76cad6df92eaffbafa5bd8ffe563001292f32fae77cdf316b1d1f9e1ee65909ebbc1719252f054620cc05536c85b00e0fdcc56727d3cb795b83ef4d5216d013e8b70523b80dfa9e663bf52eb2a70004c117949b539f3400f05b8afc4d944ae7a29bcbe6cd86713e17e3f893deb0d00c0a3143c78e68bc45c83909c595c6316f7d8145f17d6c674d50469f04c65a9007509aeefcae377b83c6679cc381e82eb3f285d25d6a8948291e2708d90d41a005597ddc532e4f3f8a8b3e62ad319f6a5a92f8eeb121e80710281fe6bbb6d1d00041fd3c1be69278c133c02e3047cad168e13a0cea5e6dc5cf502e7dca83ed800c609d0b7965a6fdbeac048fc709d40bd430e5c27f0b922e304b67947bac6b500f16d2c4e721d401bd3816d3d39c98cbe8b941f4775827cc8f94c17684f700c0093fec7ba2db54e938f9bf33601db091c031ea931b924f316b0d17d3e3f8e3100ea5fa9f3bf12ef0d8ee7978247b83f96c5f1fc4aecef71d503e1b319f3c3ed006ba13f2671e613ee4f2a050ffad412fea1909c59f415e3eefbf135f8b6732c00290deed3c80be82f057ce9d9748ffb14799bdd00e9daaa046325cf9875d903002c43b2dfad169dcdaf329d619f848f4d6abfffbfd02791b0e738ae49eb93c300c6489f6d1dc096320beb705d2cf6036d6df648f649482e5b9f04db71297fdc00d527c1b5c4f40e85f54928cd04a37f579f64814507746d1be3407b22f5feba00faeb7826201f6790f42fa84e509f64a14517d2639c71cb349c7db47b87d42100db381ed51fdb3e656c33a5d6cdbaca6b5e05790721bc05ec5b7eb86b52719d008d942fda3a0c3cd2e3bb92be6894f3728bfdb4aef81ed556a6ab2648237c36006aa8cf827b786dfb03b81f33d218f9f7ef24edaccb1ed87cd145169dcdaf32009de1377cf87909ba2d59367b00afc43a001c7f235f94ef1bc36fee3e0cbee8002af0451733fda26f5d095fd4552fd00fe36b6fd13f1d095f947887f9a25c0e00f4450f0af1236cbeb7cb768ce47732b99f24e94be05aed4260dffb263dbe1200b74caeb3c3f19c324a737411bf938fd570db8afd046c1fa5e6425de5b5b48200bc832ae52dd01658cfa2e773b6589fb60cb33e511b8136999f456fcb47e9d1004ef2f5c6adec3938a77b46897d76acd352fb0b5c759af8d50543fb7b2913cf00c716e85c797eae496a8465401f0ccffcb2ede390f2075c7b245a01a36d4e45006a6e9cfb5879a61f195de4b60e776e0dfbb112f547a8cc07edad1c1bdb733b00f3b6f1183ed68debaa1083549befdaa394b3f08e4f175d9db63eb44d17b67300b7a4fa5a2e5db45b78c7a88b41677e85e9a2c38247eadb042e5d745878c7a8008b41df1a0fd345a7058fd479642e5d849da1168639570598c7b2eb787877f700d9b8ae1274d165c12370e670a82eba2cbce3d3457ed079c761bae8b6e011f800ae7ba82ef06ce4e160eea802cc63d9753cbcbbfacef4ea2941173d163c52670038bb741176ee7418e68e1ac4dc550598c7b2eb7878776dd7bc7b4bd045af05004f6f8575d16be11da32e7668decb4ad0c5320b9e6515d6c5320bef18dbd53e00bf687909ba586ec1b3bcc2ba207ec3c5dc5583983b6b1073ae0631b7d720e6008e1ac45c8bef6035d48db1ec3a1ede5d5b35ef1525e8628505cf8a0aeb82f800250173570d62eea841cced358879590d62ae063de3da90897324f1e4b60d77000d1c6168806b9cdf58193bc6febd3ac46b25f05a153faf9cadbed0fd2a51de00b9add85ec62853dff8db1af3acd1ecd928d35a739d8a599f6be0b929e043f10069b89e3067202da5237dcc876bfdd373ddabcd3562e7f956b07c4d9066b54500fe42ccf217189e02c3dcb70701de7389ba554abdd673f9f42ecf34217e2ba500d984fadd5fc9e224ede54a869bee570046b297681f046c51e85c7d2579075500c8bb11ae716fbcc0dc74df9948546fc9a6116f5cd74769661940ae7535ab98006c798b6cfc7db1c96b7b16a5c1b53684b19ea55905d829cddc10ec2359cfeb0082a1be4bc6c4f3b2a07535bc1dcf04fe5d1d29de52ef25b5a9f45e529dc6f70092d27416792f573339e8bdb4bd83ab43f251fab07770157b0ebe83cb4370e200b919e84f089cff175aa7895f1dc882ef591da4a1ffe9bde4762c33c232e019001a54e60df03ffa1d52fd00d737195601468ac3f56e02fb71bb6cebdd5633fd0048f98ec33d7312fb1412f547a8ccb3b6be793393a92918ba7e57c896e66cbe0004b7a5c3c59cab41cced3588b9a30631d762dde8ac41cc5d3588b916eb7377000d62ae453dd7627deea941ccbd358879590d62aec5fa5c8beda0f7452b83d900b72995c15c8b7563b9c75c11ccdee7af0ce65a7c076bd147aa063de33a996f00cf91c4d3bf4e06f190ce0286316018717d0d8e8b1662c7d8bf4ea69561d1bc00d6c4cf2b741dd31a51defdeb64d6c52f53dff8ef7af3acd1e6b9eb2c32ed6f00ae5331eb733d3c37057c283e0dd7df847532948ef441ef2d61d773646bcd350062e7f95a59be2648b3d6227f218857fe750ccf3a865997c917e13d97a85ba500d46b3d0748ef32ae93a1f99806080b2c4ed25e16186eba6f058c78f62ae1290008e171cdf1110ffc9edeea2ad55913c4a13c745d67fe9f65ee712eae103fe6002cce6da7d9b3f19c164af33bb0135467470583cb03cf896965cfdebd7e06e2005bd9b35deb5204e6227b10e36826876dedcc3345300af80a3d9273d26b404600fddcd916d929cddfe60ce8e959738def5706f458df3af47ffa95e2e78c449b008cbcaba14d1edd3a9096b7ad19733ddc36b9c0f255639bfc2fa867548f34a600d54298d606761de1f75728cd5cd0ed6c968fd2e39aa08cb9ae6769286f1ad200341a595db625feef5bdaeddf6c262bdabf3d8a6094b27f52dff6e4f66fb54500764a33ad75404fd3c1be713f44ff3fcff23ffdbcfd2bcdfecd0db17f8469b800f66f11cb578df66f1fa867f3c0fe658430ad75e86836e888d2b4816ef977b400283dda3f7a9fea591aca8bbee59222b6a510bbfc76fb8767ea13464a931f2100fb17bfec76fb97013e144f69baa15ef6827da332c5ef731c68f99f7edefe950066ff0e08b17fdc8e956aff66b37cd568ff56403d3b7004fc3f6ea3d0fee1f7009e332c1fff2611f6ebeb591aca8b63ce1b8bd896f8cf5cb6dbbf0c9315eddf00912364ffa4ce9b76f97f283ba5390eeae50960dfa84c67831ecfb2fc4f3f6f00ff4ab37f6786d83f6ec74ab57f6d2c5f35dabf93a19e9d05f64fe03b5756fb00c76d14da3f3cef987fb388d287f97f19f61cf4ff2e28625b66c72ebfddfe110036eca3539a5d2364ffe297dd6eff6ce31394e652a89797837dcb98ffdb408f00d759fea79fb77fa5d9bf6b43ec1fb763a5dabf0ccb578df6ef2550cfae1b0100ff2f63aef17bee9406cf01e17b22f937e8b18f5ccfd2e0de2b4a737d11db2200705e47e8fc079e1f42696e1a21fb27751680cbff43d929cd9ba15ede0ef68d00ca34037abcd7f23ffdbcfd2bcdfedd1362ff32e67ab8f66f29cb578df6ef6d0050cfee05fb27f5adc7b50e1dd9e63f56425c8bb9a6f4788e470be852ca6f75009de381b8292e6cdc92e6a2c3bef1348b3d07bff1f460884d6cb0e4d5e5face0089fdd7b88602bf01d5cae2c60695fbe6552bd3077ea7aa15e2e87a3ee05eca00e234ee91fc662ac980dfe5b47d8b25eb78d6624843fb0bea1dfcf0fba15f2800d24e0a7c77c2fa6da0b06f4d3d1182119f45385b99bcb66f03499637976d3100c383b27dbd88fe25be712d293b969f7eee428bec94e669683fbe037e08bd0b00384eff2bcbfff40bf353b0bc05be95d1e7a77402ce02f041de5d803526de3900e44d7e0affae421aae7f097e0aff4603e99ab0eb7786d63a23769e6f09cb8700df7668b7c85f08e2959f7f37a58361d665f27da867bf023f25fe3e403fa67600878e16838e280d7e874dcaffe0dfb3241cb8ae8ffb11b6ef76529a67426c16007e6796e4c6f616fd0409db16d6dee60123c5b502462eb3ae2fcb2cdf25c56f00afcf637192f56a1e938b7fcfd7e6a3e17716d1ff59c2e2c60672df205cc27000db7c1d9b2f47d7e8ff2c753c0bbf2b4e6d4dbd835f1ad3980534aef657a09d006cc776928fe5dadac9f12118f15984731e93177559896fbc73d9f8b76351b6004945f42ff5bd7129d9b1fcf473175964a7347bce1dd0d35ee61a6de562d0e3005ccbfff40bf37f84bf9b96c53698cadbf6cd36f45362e23da8fd27ff877f17002c0dd7ad7307d2f2ef7591ae093b9eff19f69dafa52c1f7ee72b6f91bf10c800fa1aed0cb32e931950cfa81e49b65379878e16828e28cd12d091c0f73273b600f16fc2817d66c2c1bf958de3df94664988cdd2b2912f80e34d9417fd04a96f003abadadb1c60a438f47fb8ccbabefcd70c90355afec7ef81e2397052b6957800d1b3e91e7d1dfe5dd846b86e06dc8b599ce4b8e562869bfb91e8a32d8638ba009e6342db9820ff0eb2ad2e737e5897d717697f05c6f2bad08fa33683af49c200fec68145fc1fee13ce67f2a22eb1bf353f7ed9da6db2f1f14794edf022fa1700f0c9db85641f647bc8ff5960919dd21c09edd2d1e0df50b9613f6c9be57ffa0085f93f58de02f6366b1befcb5978b703d698780f6a6bc9ff213eb8278eaeb70082ffc3fd06d23561d7ef0cf9a9889de76b63f9706c236b91bf10c8f435e8d90039865997c97150cfb681ff23dd07e03a6a051d511afc66b7d437d679fb433800b05f4de55fcfd250de34a439a788ff43be008e9370df4172bc818f77d13dae0093e07dd2068bccbabe3c00fe0ffd3f17f2cc637192b6d535fe83bece1c265700239391c2052c6e2ce8a41033ee050c37dd2f048c24c30288a3eb0926b4952d00a56986347c2d33e7876b995f56a4fd8d7d4c36b7b517df493e4682fd0d4a73004d11ff87bfdff398bca84bb43702f6afcb261b95cd3c8b6caf29a27f813e610097a4ede76755cfb1c84e69ae8776e946f06ff81cb6feff4ecbfff40bf37fb000bc057cf9accddf5d62e19d05ac31f11e34d64ffe0ff1c1b15ebabe03fc1fde0046dbc69fa9fd42ec3cdf42960fdbf6368bfc85a0327d7de2a7cbe466a867770082ff23d54eb53974d40c3aa2340b40475267eef3f6877060bf9acabf9ea5a100bcb8b6f09e22fe0ff9022437fa16e827488d77b9d6c9e0fca36d4d0c9759d7009793c0ff1967e23390a785c549ae01275ef46cba277e8d20430bc4b5005e0a00e7b038c9f1d0390c37dde3bc1dc93007f048bd0ffc3c001b6f015de451eff4000b6bbb709da7407bdd8eef65297870ee5a629fbf909c59b4f5cfc5f85c9b6d00e5eb019b82a16340927d5d571f09fbba1eb33c66fc460cce3150ba395582d100d67f97ea1bb8ec2e9621b5472d169d355499ce66031e81363f8b6b9271cfea008fc1876d899f6f7b8af12b000ee2978634d7ce1b48fb73830ddb74f43b66b1003849bf8378054c06f43b489e591047d71300a3407bd76ef35589379e5f44f500adde21471ad23c53c4379f60d1015da34f68b3532339ae4732a30f22e51f52009da0be7a8b4517d27e4a8ccf6dc7f673b443c76948f3df22e36dc5da621c8700c5fead44fd111ab76dc7b12cd219e1b78da3a6e785eb6c91436758c749577800c6e442a6c78c895fc4b0d0f7fcf833747a211de585faf0ed3886c2c787713e0066f7b91f4574cfc7635a99ee70dd288e59cd8a5fb650fb42fcd00fc236b49a00dacea660a84f80b2d5997cfb9afbb9b27acda2cf920eec6d29fa2cb3e60d6000a6321f150c2e0f6c835bd9b329cfbe10dfca9eed1ad38f7f9d4dfba06f188e006672b45930ce2e8231fe7ad59e95917df01c2f954fb345764a331ffcd585e6001adfaf71a0c75ecbfff42b75ec46609e378b63f17c0d35f2ce01d698780f9a00e3a77907e283eb7fe9ba07de35be5e81741db656db966f16cbd704699658e4002f0432f32ef4eca50cb32e9336a867548f24c787973874d4023aa23438f6df00ccf251faf99086caa99ea5a1bc69485328625be2f7dbedf68fcf73a0fd5b3f0042f64faacfc2eddf6c8bec94e620a89787807de37e88feff04cbfff4f3f6af0034fb777c88fde376ac54fbd7c2f255a3fd3b1cead90960ffc609615ae2d01100cebbdaf654b9e647d1fed1fb14363f4a69b614b12df1fbbf76fb47d86c67f8006f1f21fb27d5a7e2f66f9c45764af302a897e7807de373a7faffcb2dffd3cf00dbbfd2ecdf6521f68fdbb152ed5f33cb578df6ef7ca867978f80ffc76d14da003f3c7b2563ae293d9e859e015d4acdb9f0b1b14516dcfcbc3bdb7c12f5c5d1006e934cf52c0d8e15509a5786d8c4064b5e5dae7b4fecbfb6ad61c0f9751c3b00963a23dfb5ee85f8e17c876dfc1fe7696c736e2339fe4f32d8d6f5e2fad8f9008e67cd823454afea83e263e16f2ad24ec6fe4e98f5b1b8f7a3100c5d1f8ceb00d16f2f32fec9d70cdbc69ef99a59a1b1c5769b6cb6f92c4a736711fd4b8cfd004b8eab62f9e9e7b65864a734ef86f6e36ef043a8dcd00e3d64f99f7e617e0a0096b7c0587ed63696bfd8c21bcff48a89f7a0b598e4a7f07da8388ff020f82900bc2d255de3fe446a93103bcf379fe5b3b5c1287f2190f18be9d98b19665d2600ef857af610f82952edd422878e70fe839f1b20b4d6c1dafed8e63578ff8fcf004763ffef9321360bd705e1da53db1a44a9fd28ae7538b83f9d7f5ba8c1223300ae45d1efc378133f0ef264589c96ab59482ee245cfa67be287eb083210970100bc14b6b0b86a5bd72bf93e34333c36de02bac80f778c11d75f49add78dfa4d001489715e2139b368ebe35e1fcb6deb6ca6ab4aaf4174f591f07b21b58619cf0078c5f50294aea54a30dafac2527eb6cb866119926dcf5874d650653a6b063c0002ed67df5ad3898c976edfff02fe60267ebef914e357001cc40fc76876ce1f0048fbacc186ed23b6e113599c641b4ebc022603b6e119733d11e2e81ad79a0a00b41d799bdf47bcc3f6817139700ea1ce9445b1b5a6a803ba46ffca66a74672008c8c64c6f65ccad7ca986751bf3763d185749b1fe373f3d87e8e76e818d72b004f0ca943a5b4c538a65989fd490263a0791c17229d117edb98e4b4223a5be000d019d671beafa12e18ba1f2363e2b90da0b5a6bbcb10d28f85fb425099778500f8619b8eed4135b5034dc1d0f60d65ab0b06cf53a0af24a0d72cb6bfe9c0de002e60fbbb70fe0066aa3bb46e32c3f2619bc3cf43c27593b3d9b32b36d69ecd000f5a373a9ac9619bdb5f520463fcf52a9f95917df099727ccd2cca4e69dac100f7ea34d7f87e8d073daeb7fc4fbf52fbf4b19f3d92edafeffc7c8e4516de38006e1c13ef41e3b1341e4d7c70fd025daf83778daf61275d13763c9f30ec1b1a0013593e3c8b60a145fe42203bf6cbd7ddeb32e9817a46f54872dc70a143471900d011a56901ddf235f2941ed78d5339f1efeae1ba144a734811db12bf0f6ab7007f617bfd368e90fd93f2bfb9fd6bb6c84e698e827a790cd8b78cf97f22e87100bbe57ffa79fb579afddb1662ffb81d2bd5fe6558be6ab47fc7433ddb0ef66f00bc10a6850e1de17c1c3f2f4ec7d9ce43a1ff71be476acd9f6bdd08e2a638d2001dda64cac7f728a13fced70d51de34a47961884d6cb0e4d5e5baa4a9ffda3600b783f30e380e3052e7a1e0d8956d2c07c7dc6ce3a7233996633b6b86ae71dd00d05cc7b326421abe0f3b6c5ce36545dac9d8c794cdba216aabf83802ce5353009a6b8a8c23cc87fb42601f47e06b8924c795b86c13191e94ed3545f42f318e002359d7b1fcf4733316d929cdf5d07edc087e08bd0b38de7ea7e57ffa85f9290058de02eb14b2d856f23dc0c81bfd8998780f6aa7c94fe1df0cc2bddf77809f00c2d7dbec1e3731a1ed2c4a5bbe392c5f13a4596091bf10c8fa047cffb52e93009ba19edd097e8ad4d8da02878e70fc8fd2e0d8bd54bf31c3f0f0f9b3b0f91400ca3be85cbd22f329e40bd8d617a39f2060db42dbdbf98071f7fe62c0c865c60079c5469017c769c7b138493f9278d1b3f9de11dbda263c0f10fd9f0c8babb600f54e42f3b8a16706646475911f6e1f1be7d2056c55c770f70a61bf5b629c430048ce41fb59e35e37c46d4d33d355a5d793b8fa48c4cf63f6985d985d7bac28005da64a30dac61ca47c39575b8165486de8388bce2a7106ce7074360bf0489c006fa3e59dc278693feae7e0770becabee48317e05c041fcd290e6f70b07d2fe00da606b843ce82b35b338c9717e6c8f0b81fd9c649207fd27bac6f559123e43002a18ba0e9cdb359d86ec597de09eafa0347f2d717d16ea80ae3326c471810c00e840ea9d2be5ac6892196d7b46080fd5091a5fe063de68a7b08e67e09a304a008ddf122f7a7686e907db1f1c97973a87c1f5ae79de03752446de79ec2fd32f00acbf3105f0640474816d55297832b278b24d80077949bd8fae7ae0cf97f7e700cb0fe7671bf3b4ed11f067b5270fb33f5f7e281e97ddb5ad5968b1e86c5c9500e90cfb477c2c55f7af3a160ce015e8370dfb1cf80f40dfafc760c37502d88f00b7f94699f86508ad17c40ffb3db6be1ffa4b027dfb769b0f4fbcf1dc123e9700c4e5c0b9a47546ffb6be9fad0fa5cb642e8b937c57f97a0bdbf92e7c7d85a400cf46e54ffdbc168b2e047c92ac94efa5e518ce5a908d21f5059f4538a9fed800d6da60fb28517f84ecb3f56c1a6e9ff16c9a638ae86ca1436758c74957b8f6005040b6bcd07ad2765cbb403ae367d0e39ace938be8ccb57e02bf8bcad72248008e47b9ec426b05790721bc05e6533b6c659a31f7c40fcbf48c6196299ff740005b1fb62686d2e35e7dc2c3d7d7e37a624a736e084e1c23c07a25305e135aaf00a6001ef28d70ce838fbd4bfa4d38865308868ea1a0ce5a008ff4f838ad815b00ccf423a38bdcd6e18eaf65008f44fd911a27437b3236b6e776f6addde4ebde006de3e894063108b459a163e68b2cbce3d34557a7e6dd56822eda2c78a4f62400641cba68b3f08e5117d6334b6dba5862c123755e5ac6a18b2516de31eaa2cf00be2d2d41174b2d7804ce170ed5057e737a3898175501e6b1ec3a1ededd7d36002e5b822eb2163c52dfc6ce387491b5f08e4f17fd7b0a7325e82267c123755e0073c6a18bb033a6c33057e28ce94c11cc63d9753cbcbbfaf691e44bd045de8200275f615d10bfe1625e528398b35580792cbb8e8777d776cdbbbd045db45bf000b4575817ed16de31ea6287e6dd51822e3a2c783a2aac8b0e0bef18dbd53ebf00a8b3045d745af074565817c46fb898b3358879690d625e548398db6a10f392001ac45c8bef6035d48db1ec3a1ede5d5b35efae1274d165c1d355615d10bf240060ced620e6253588b9ad063177d420e66ad0b39ecf6831d793164ae2c96d1b00ee5e49c2d000d719d05977ec18fbd7eb12af6ee0d5133faf9cadbed07d8f2800efdc56fddc65f1cbd437feb6dc3c8be66f9759645a61ae5331eb73393c3705007c283e0dd78d0b07d2523ad207bdb7845dcf13f79a6bc4cef375b17c4d90a600d7227f218857fe650ccf32865997491dbce71275ab947aade7c133e67aa60900b58e695e15f76a75b338497bd9cd70d37d1760247b89f641c01685ced5133f00dc03b4b84a75d60471280f5dd7997cfc1b7752363e150cfd666737e38d6b4c00e6809dc898b851c1e0f2c07d725decd99407cf9ded62cf769d1594895dfe8e002c621ccde4c85830ce2f8231fe7ad591955c5bd20332eae78eb7c84e69da60005df152738defd724d0e32acbfff42bc5cf198936197957439bbc32a44d265d000fb74dee66f9aab14dce433d5b05edb3d4194bbd0e1db5808e280d9ea9cdcf002fa4f4b82e8ecaa99ea5c1f30b29cdfe456c4bfc6baeedf66f3c9315eddf41002364ffa4d69b73fbb7bb9d83784a7338d4cb4d60dfb81fa2ff3fd5f23ffdbc00fd2bcdfe9d1262ffb81d2bd5feb5b07cd568ff8e847a762ad8bf4942987a1d003a1a0f3aa234f38301ddf275c1941eed1f95533d4b833e27a5d951c4b6cc8f005d7ebbfd5bcc6445fbf78211b27ff1cb6eb77f932cb2539af3a15ebe10ec1b0095690be8f14acbfff4f3f6af34fbf7d210fbc7ed58a9f66f3ccb578df66f1700d4b32bc1fe498d2bf43a7484df0aa6340b41b77c5f11a50ff3fff83797d1ff007b6511dbd212bbfc76fbc7bfb180f6efd52364ffe297dd6effba2db2539a370040bdbc01ec1b95299e2b7e87e57ffa79fb579afd7b7b88fde376ac54fbb79800e5ab46fb7713d4b33b46c0ffe3360aed1f9eb94667c2dac65af1bc58a9ef2500b8c65ad16fe563536893291f8d45a2dd2699f87707282f8e89be2fc426365800f2ea72bdbab1ff1af7e5e31ef0661657cdfbf2f13c81561627b45fbbe4ef0e0064ccb5edbb03b4272c15b8bf3b80fbfe87f3dd81478bb49302fbb1fbd6689200df5eca5ef34f8760c46711ce6626afebbb03cdf1cb66dd474f65d36c91ed0b0015ef4b66db8564b77e77a0c5223ba57912da8faf801f42e5866789fcd0f23f00fdc2fc142cefa47f77e007e0a7b8f6580ff7bb037359be6afceec0d7a19efd0010fc948c10a6050e1de177866cdf1d90ea3bf0f6879fc9a3d350f9d7b334940017cfedf94588cdc273a6486e3c8717fd04a9b122d739bcf301233f53a0c12200339e99643b1b1ffd9f0cc825558e2eff87f8153b9316d767d8ce451ec9ef4500910cb6ef45d1b9b3a960e879af94067d247eee11e787e71efda748fb1bfb59001de6bb4bf46e509bc1cf664b431a32e02eff87fb84dc27475de2d948023e4000874d362a9b668b6cf521b209f9e41d92fe0f969f7eee388becbbcfdf5b34a000a746738d6772e239dafb5afea75f98ff83e52d606f079d3949e53ddfc21bc7002363e23da8ad25ff87f8e0f94b74bdcfa281b4dc6f205d1376fce679d8582a003fc3caf6ed4321df3367ebfbcc679875994c827a46f548b29d9ae7d0119e5500436970dd98d439cbbcfde167e2e83454fef52c0dae2da33473426c169e9d8d00e324b66fdb488d37b8be95301730721fb0c122337e2f40bf0f534d3c9e5b3e0091c5498ea34d6472f1ef88dbbe0dd5180cfe4e1485e358dcd8a0babe1725f9003ef0f54036de02ba18f6b9e3f88d0c81f63a8fef6529789a014f267e3c3921003907cd4bc57dde34b7ad7cacabd2df8971f59170ad6fad61c6b3dd08abeb4c00dc91c468eb0b4bf9d92e1b866548b67da245670d55a6b3f18047a0fdecfb1e00d034c64bb7efc72e12e59bc7769bfa071c471ad23c0dbeea89e6ba11f2601b003e9ec549b6e1aefa866db8cd1fa16bfc1e50267e8c799bdfc7d7c8639dac7700c881e75fee28e2e74eb0e880ae8b9ddd3d926364dc5648fa5af83df002dca3002ea4dbfc189f9bc7f673b443c73856bcb3c8d855b1b618c7342bf1dd4b813100d03c8e0bf1bd3bb631c9cb8ae8acd8783e8ef751daba60e837f332269edb8000e74c3ca5433b5289fe1d7f57709d04d97a6c0faaa91d6882389487aeeb4cbe007d41a7819c5efb7c74d255d8de294af33a1823a3ba43fbe6f87799b1cda16700531edc37378b3dbb6263ed66dd20ff1e21c9d16ac17843118cf1d7abfe758300f1cb3ef8fb787cdd34ca4e696e01dfeb56186fa6fa3215f4f81ecbfff42bb5004f2ff16d251c13e567f2236f1c378e89f7a0f1581a8fe6df00c2b51fef8677008dcf1993aef1ec7f1abf0bfb0e11dfdb8073cd732df21702d9b15ffe3d045d0026b7433d7b0ff43fa609619aebd0d144d011a5c13161befe8ed2b7401a2aa7007a9606d7df519a0f14b12df1fba076fb3789c98af6effe11b27f52fe37b77f00d32cb2539a87a05e3e02f68dfb21faffc72dffd3cfdbbfd2ecdf1742ec1fb70063a5dabf892c5f35dabf8f433d7b1cecdf54214c731d3a9a043ae26beef05b000d387ec6d75b48aef776ad1b41dc1447ba439b4cf9c81745bb4d32f175d3940017c7a4be1962131b2c7975b91e6f0647705c08c744f83889e47a34d77c20f100c33111db580e8eb935b3b8911ecbc9986b1c2fa06b5c37d4e278d63448c3d700c0858d6bfca2483b19fb98b25937446d151f47c0796a4af39b22e3087c2d95006d1c817480ebf6a4c695b86cd3181e94ed9922fa9718c791aceb587efab9e3002db2539abf41fbf12cf82119f33f8eb7d72f1efa3ffdc2fc14e9efd8615bc900f700d8d688c6eda7e01e1af45b70fdfa6e7c8b07d2523ad207e93a6caf812d005f86e56b8234ad16f90b81ac4f309761d665f22fa867548f24c7d65a1d3a9a00063aa23438763f51080f1feb231c38aec7e7536c735bbbe7248d0e5df329fc00dc49d7dcc9487d871ce72bd137089b57d4efc374138f63b653589ca41fe9fa002e19f1b3ad6d6a0c06af73a290af25aab6f54e92ef031f0fb1f19698431e6e001f1be7d2a5d631451df39418e7109273d0796e71af1be2b6c6368f52c9f52400ae3e12f1ab45ccb8f719e7c828ddc42ac168eb0b4bf9182e1b866548b67d8a0045670d55a6b3498047a0fdec5b373483f1d2edfb9ac5a27cf3d86e53ff80e30048439a4f2d1e48bbbfb96e843cd8864f6271926db8abbe611b6ef347e81ad7000d09b41d799b9fcbe707b04ed63be4c039844d45fcdc09161df03919979dca0004b1eba0e431326e2b247d2ddccf5608868ec556a2cd8ff1b9796c3f473b74008c7da59343ea50296d318ebb625f3113bf6cb94aaeb522fcb671a16d45743600dba1b30ce88c744569eb82a1ebe532269edb005a3744e92641fa4af4eff8bb0082f30464ebb13da8a676a009e2501ebaae0b06cf53a0af24d1eea740577ced0008ce9d529a4b608c8cea0ead1bb2edb71acf9e4d7970ddd078f6ec8a8db59b0079731ccf4039665b305e510463fcf5aa7fde5c6aed3ada17fddca916d929cd0055e07b5d0de3cda48be9a0c71b2cffd3afd43ebdc05aa92c8e895279b75a7800e3b8714cbc078dc7d27834f1c1337be8fa7a78d7f87c33e91acf11a2f13bc400cef3f17561b847738e45fe42203bf6dbca30eb32b906ead90dd0ff98218469008e4347b88f95d2e098309f7fa6f4194843e5c4f79be2fc33a5b9b5886d89df0007b5dbbfa94c56b47f6f1921fb27e57f73fb37c3223ba5b913eae53bc0be71003f44ff7fbfe57ffa79fb579afdbb2fc4fe713b56aafd9bc2f255a3fd7b37d400b3fbc1fe4d17c234c7a1a3a9a0234a83635334a783e3679407e77ba4ec36b700bf743f0330521ce90e6d32e5e36bf4d11fe7eb86282f8e497d22c4263658f200ea725d623a23382e8463227c9c4472ed64b17de23826621bcbc13137dbf86900460877296339b63df8748deb86328e67cd80347c0e386c5ce3ab45dac9d8c70094cdba216aabf838423360a434df28328ed002f785c03e8ec0d71249ee2fe500b251d98cb7c8f6dd22fa9718c7911c57c0f22b04f671594af323683f7e6c59001784e3edcf445c3784e52db04e218b6d253f3b0b79a33f1113ef41ed34f92900c407f7d3d0f51fc14fe1eb6d48d7616774d9f265583edbda5d94bf10c8fa0400fcac3f5d263f837af60cf829953adf2763aeb1bda73438763f45080f1feb23001c38aec7e7536c735b94e61f45e653f8be3cd7dc89806d0b6d6f5b00a36d5f0078d8bca27e1fc83fda03f24c677192fb86b83fc8d731e1fce274889b0e7829009ccae224eb9fcbffc5b54d24c35488a36bf47fa6389ed50869f8b723383ffc007644535b7fe86a7f631fcb36fe0f3f8382f7cd71bdffe4108cf82cc2399dc9008bbac4f74fa09f663d5f83ca66ba45b6e945f42f309e9297eca362f9e9e7ce00b0c84e6966b60de86996b9c671987d418f4b2cffd32fccff11ee9759f7f38d00b3f0ce00d698780fb2f5e4ff101fdc074ed76d6d0369291de983cf6361bf1100b1f37c7c2e09cfdb1b6f91bf10c42bbfeb2c37e2a7cba405ea19d523c9766a00bc43478da023be87bb92e32f8403fbcc54fef52c0d8e7f539aae109ba56523005f00c79bb8ef203956bc6f30585ebac7fdc514876ba0b9ccbabefcda54287c001fea20cf1816a7e5aa17928b78d1b3e99ef8e138ca18881b037829b4ad9b96005a0fe05a378debab4806db3991e8ffb8f680a3ffb307e8c5c62f0d690e2dd200feee01bc0ae63a5bcecff83f93cdb3f81ef03d0023a5d954c4ff990cf7856000a0bc51bfbb7d29906d4cdcb265b35d36d9a86cc658643ba688fe270b601492003d87758f9f378db2539a13a15d3a19fc1b3e66a4ff3fc7f23ffdc2fc1f2c6f0081fdcc7dfecf9e80b3007c9037eeeb8c89770e7993ff437c283e0dd76783ff0043e9481fbc3dc6f17ec4cef34d62f96cf32d92be86ab6f49fc74999c06f5ec001cf07fa4daa9290e1da1ff635b3f297de61b3d9b70d8d63f71ffc736b7beab0088ff43be00ae67e3be83906d0b9d279a0c18515ec2c865d6f56532f83f5c6f000dc180ff80ebdfa4c6d689173d9bee71ae6b0260a3b8069087feab67711a77009d10ee7a869beeeb00232f0ff4894699300579f8b3c6401a7e9602e787e30f00d7557afc21b7752bfa71d46610367cdf28cdeb8af83fdc276c60f2a22e717f0046ece56d7c3b2e1bef23a06c6f1c81f137c9ba8ee5a79f3bc1223ba5b915da00a5dbc0bfc1f799febfc7f23ffdc2fc1f2c6f017b9bc5f68eca7bb285379e87001213ef216badd11fc0b15ebabe1bfc1fd7980061d7f7e4a7869de5626b5b2800cd1e16f90b41bcf2f3becf64865997c95ba19edd03fe4f8310a63d1c3a1a03003ac23e2ae16914c23381e1c1b101fdc336aa9ea5a1bc6948735f11ff877c01005c77427985d7c987b6b7b8ff00fd1e0ab9ccbabe3c38b6ff1ac751c6429e71002c4ed2ff718d75a2bde47ac63121f47fb84f3416e42ec48cdbe5b74d008c7c008d12fa6de8ff4c703cab0ed250bdae77f04b439a2f14697f637f278dffd364009e456d06ea8230529a278af83f4d705f0806ca1b9f493a6802d9a4f62f72d900a86cc65964fb7a11fd37096094ec6b62f9e9e7d65b64a7344f43bbf41df06f00a8dcc6801e7f65f99f7e61fe0f96b7d4bea43d006721186c6789f764c01a1300ef416d2df93fc407c7e1e8fa97e0ff441933b5e59bc0f235419a8916f90b4100bcf2bbf6b1e118ecf7a19efd0afc9f4a9d93c2fb00b84606e71fa4c664b93f004038b0cf4c38ea591aca9b8634cf14f17fc817c0b10894934201db16dade360041c8c74e1a2c32ebfa7298312ee8ffa42d79d22097946d255ef46cdeaea0ff00837dff3a9087708f677192fd01d7781cfa3a365f8eaed1ff69703c6b2ca4a1007a57efe097c6344bfa4357fb1bbb4f68fc1fecdb1782701f6d7c08467c16e100ac63f2a22e1b4136a931102e1b954d9d45b64945f42fd12794941dcb4f3fd70036f64869f65c32a0a7bdcc35da4af47fe65afea75f98ff83e52db0de206b1b00ef9b68e18d7e4a4cbc07b5ffe4ff101f9cebdebd076bc9405a3e4641ba46ec00d45e20769eaf81e5c3b18d268bfc8540d6d798c830eb329901f58cea91643b00d5e4d0d158d00ba541fb2d351fc7db1fc241fc706d493d4b83fb1628cd9210009bd5140cf60f28e4be83e478976b9d0cce3f521cce657199757d99608c0b5f006ba37fdceea05d8df37c36fd8c5180897e685347317c63015f8c587228efa80060a80ef6b0e8e7ff0144125ccd49130a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/yarn-project/circuits.js/fixtures/UnconstrainedFunctionBroadcastedEventData.hex b/yarn-project/circuits.js/fixtures/UnconstrainedFunctionBroadcastedEventData.hex index 9da18e98752..782967812b7 100644 --- a/yarn-project/circuits.js/fixtures/UnconstrainedFunctionBroadcastedEventData.hex +++ b/yarn-project/circuits.js/fixtures/UnconstrainedFunctionBroadcastedEventData.hex @@ -1 +1 @@ -00000000e7af816635466f128568edb04c9fa024f6c87fb9010fdbffa68b3d9926222cd450fe6beecf6cbe6495e118412940ee0da5744629dabcaf010a2a4e38229d43c7daac528d0aefd72bee59385d7e9ff06ea477b673389e1f65168cba9f27a5a9e364417f0f1526bcd44836d603e8b7005b517c6861e512c01d8058225414d546778272b5884f661b57d610768a394485f812373af30601825169a4a2102e833be78dd8da68d42339f2ac9846870012b4a95faa9204b3c51927e3fa7905000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000511c8a6f1125672f40d49b4b192a803a41ccb3ddacec4da05bf7d535224059fa9bf766cd000000000000000000000000000000000000000000000000000000000000724a001f8b08000000000000ffed9d079c1445fafe671758c2b0b3e41c165860596000d9444e4b306226a98082028aa22841444444444c803947cc395d3e2f79775e00ce5ece39e79cbcff6f86f79187b26687d99bda7bf05ff3f9c0d67ca7baeb5b006f7755cfdbd3d35394d8f728b27fe9472b2af303acd1fed6fc778fda02aeab00a6c8f1ec36715fb91df1c642b5d7505357925e49eb03e38247f2fffe15e38900d569fb7fff4ae8f522e3a8d79918d6d76effe28573ffbfb8a7db6fe538bb7d0068a4726b8fcfeb85f3a949910fb75512a8ef6d1207df7738a46839766c1bc800b1240fc7b6e458e2716c17c8b16d1e8eed3c3ee589c2ee436d3d6d7508d4f700f68983ef7b078f4f5181fbdeded356c7407d4f260ebeef7048d172ec581ac800b1631e8ea5e4d891dcf03715c8b1340fc714fdc5723cc6cb0239a6f2702c2300c714b9e16fa7408e6579387622472cc771ec5c78c7ba24b57b308e9dc9a74b00209fce79f874219fae817cbae4e1d3957cba15de27b34f75cdc3070e295a8e00f7a9ee811cbbe5e1d89d1cbb911bfef608e4d83d0fc71ee488e5388e3d033900f6c8c3b12739f62037fced15c8b1671e8ebdc811cb711c7b0772ec9587636f0072ec456ef8db279063ef3c1cfb902396e338f60de4d8270fc7bee4d887dcf000b75f20c7be7938f623472cc771ec1fc8b15f1e8efdc9b19fc7714020c7fe7900380e20c7fe1ec781811c07e4e138901c07781ccb03390eccc3b19c1c077a1c000705722ccfc3711039967b1c0707721c9487e360721ce4711c12c871701e8e0043c871b0c7b12290e3903c1c2bc87188c7716820c78a3c1c87926385c771580020c7a179380e23c7a11ec7e1811c87e5e1389c1c87791c2b03390ecfc3b192001c87931bfe8e08e4589987e30872acf4385605721c91876315396239ded623000bef98c9a5abf2701c493ea30aef9389d9c83c7c4685f5c99c2b1de969abba00f06d65b6c5e8c4c1f7bd9a7cc614de27b32daaf3f081438a96e398d514de310013b3317938d6904f6de17d3231abc9c3a7966256e389595de11d3331abcdc300b18e7cea0bef9389595d1e3ef514b33a4fcc1a0aef9889597d1e8e0de433b600f03e999835e4e1339662d6e089d9b8c23b666236360fc771e433bef03e9998008dcbc3673cc56c9c2766130aef9889d9f83c1c2790cfc440319b9087cf448a00d9044fcc2615de3113b38979384e229fc985f7c9c46c521e3e932966933c31009b5278c74ccc26e7e138857ca616de2713b32979f84ca5984df1c46c5ae11d0033319b9a87e334f2995e789f4ccca6e5e1339d6236cd13b3c6408ed3f3706c0024472cc739d08c408e8d7938ce20c7468fe3cc408e33f2709c498e33c80d7f006705729c9987e32c72c4721cc7d98577cc8ce1597938ce269fc302f9cccec300e730f2393c90cf6179f81c4e3e4714de27b34f1d9e870f1c52b41cef53470600723c220fc723c9f10872c3dfa302391e9987e351e488e5388e4707723c2a0f00c7a3c9f12872c3df39811c8fcec3710e3962398ee331811ce7e4e1780c39ce002137fc3d3690e33179381e4b8e588ee3785c20c763f3703c8e1c8f2537fc3d003e90e37179381e4f8e588ee3784220c7e3f3703c811c8ff7389e18c8f1843c001c4f24c7133c8e2705723c310fc793c8f1448fe3dc408e27e5e138971c4ff20038ce0be438370fc779e438d7e3383f90e3bc3c1ce793e33c8fe382408ef3f300705c408ef33d8e0b03392ec8c37121392ef0389e1cc871611e8e2793e3428f00e329811c4fcec3f114723c99dcf0f7d4408ea7e4e1782a396239feaec1a240008ea7e6e1b8881c4ff5382e0ee4b8280fc7c5e4b888dcf0774920c7c579382e0021472cc763e6b4408e4bf2703c8d1c97901bfe9e1ec8f1b43c1c4f27472cc700715c5a78c7cc3989d3f3705c4a3ecb02f92ccdc36719f99c11c867591e3e670090cf9985f7c9ec5367e4e10387142dc7fbd4f2408e67e6e1b89c1ccf2437fc005d11c871791e8e2bc811cb711c5706725c9187e34a725c416ef87b5620c7950079389e458e588ee3787620c7b3f2703c9b1ccf2237fc5d15c8f1ec3c1c5791002396e3389e13c871551e8ee790e32a72c3df7303399e9387e3b9e488e5388e00ab03399e9b87e36a723cd7e3785e20c7d579389e478eab3d8ee707723c2f0f00c7f3c9f13c8fe39a408ee7e7e1b8861ccff7385e10c8714d1e8e1790e31a8f00e385811c2fc8c3f14272bcc0e3b83690e3857938ae25c70b3d8eeb0239aecd00c3711d39ae2537fc5d1fc8715d1e8eebc9719dc7714320c7f579386e20c7f5001ec78b02396ec8c3f12272c472bc3f6e2cbc6326bfba280fc78de47371e17d003231db9887cfc514332cc7d7fd6c2abc63266617e7e1b8897c2e29bc4f2666009bf2f0b98462b6c913b3cd8577ccc4ec923c1c3793cfa585f7c9c46c731e3e009752cc367b62b6a5f08e99985d9a87e316f2b9acf03e99986dc9c3e7328ad900164fccb616de3113b3cbf270dc4a3e9717de2713b3ad79f85c9ed81fb3ad9e00986d2bbc63266697e7e1b88d7cae28bc4f2666dbf2f0b98262b6cd13b3ed850077ccc4ec8a3c1cb793cf9585f7c9c46c7b1e3e5752ccb67b62b6a3f08e9998005d9987e30ef2b9aaf03e9998edc8c3e72a8ad90e4fcc7616de3113b3abf27000dc493e5717de2713b39d79f85c4d31dbe989d935811cafcec3f11a72c472fc00befbda408ed7e4e1782d395e436ef87b5d20c76bf370bc8e1cb11cc7f1fac2003b66c6c77579385e4f3ebb02f95c9f87cf2ef2d91dc867571e3ebbc9674fe1007d32fbd4ee3c7ce090a2e5789fba2190e39e3c1c6f20c73de486bf370672bc00210fc71bc911cb711c6f0ae478631e8e3791e38de486bf370772bc290fc79b00c911cb711c6f09e478731e8eb790e3cde486bfb70672bc250fc75bc911cb71001c6f0be4786b1e8eb791e3ade486bfb70772bc2d0fc7dbc911cb711cef08e400787b1e8e7790e3ed1ec73b0339de9187e39de47887c7f1ae408e77e6e178170039dee971bc3b90e35d7938de4d8e77791cef09e478771e8ef790e3dd1ec77b000339de9387e3bde488e5f8dac8fb0239de9b87e37de488e5388ef70772bc2f000fc7fbc9f13e8fe303811cefcfc3f10172bcdfe3f86020c707f2707c901c1f00f038ee0de4f8601e8e7bc9f1418fe3c38577cce4577bf3707c987c1e2abc4f006da07ed6a4d7fb88adab80bf77519b8ed5a34eacf63ab14a519d47287e8f0600885f11b58b75e339dacbd7b958c03950db75e9fbc6b7a7fe737b09c7eb31fb00db86786b8ae9e3c48aa87e07e2a873ae05b593b5f54480be25c921419efc6800a4f213d4f7c70bef531ba89f99df0b7ad2e9d3634e9f525487e7d42703f4b30088dac5baf1fc49da0e879a73da07d7fac33549f54e1771047b9c7c9e2abc4f005dd2f1493f9a1a5f4f058e4fa07e66c6d7d3097fdc9fa2b8a30eefab4f07e8006711b58b75e3f9d3b41d0e35e7b4cf522bc33549f5968a38823d493ecf14de00a72ee9f8a41f4d8daf6702c727503f33e3ebd9843feecf50dc5187f7d5670300f4b388dac5baf1fc59da0e879a73da679995e19aa47acb441cc19e269fe70a00efd390747cd28fa6c6d77381e313a89f99f1f57cc21ff7e728eea8c3fbeaf30001fa5944ed62dd78fe3c6d87e81c9d7dce691f5cf30cd724d5bb48c411ec5900f279a1e03e0d3549c727fd686a1e7b21707cc2f473df3cf662c21ff71728ee00a8c3fbea8b01fa5944ed62dd78fe226d877c9cdb1d82ce31ce31ced99c639c00639cb339c738c73867738e718e71cee61ce31ce39ccd39c639c6399b738c73008c7336e718e718e76cce31ce31ced99c639c639cb339c738c73867738e718e0071cee61ce31ce39ccd39c639c6399b738c738c7336e718e718e76cce31ce3100ced99c639c639cb339c738c73867738e718e71cee61ce3dc3ce7b40fee5b0d00d724d5bb58c411ec79f279a9f03e0d49c727fd28729e3752f9a5c0f109d4cf00cc75ef6f4bf8e3fe12c51d75787cbd2d403f8ba85dac1bcfdf46db211fe7760087a0738c73f39cd33eb8973c5c9354ef121147303e06bcbdf03e0d49c727fd00686a1e7b7be0f804ea67661e7b47c21ff7b753dc5187c7d73b02f4b388dac500baf1fc1db41da27374f639a77df0fb0e704d52bd4b451cc1f818f0ce82fbd400d5241d9ff4a3a979ec9d81e313a69ffbe6b17725fc717f27c51d75785f7d5700807e1651bb58379ebf8bb6433eceed0e41e718e718e76cce31ce31ced99c63009c639cb339c738c73867738e718e71cee61ce31ce39ccd39c639c6399b738c00738c7336e718e718e76cce31ceffffc439ed83df48866b92ea5d26e208f60e00f27977c17dea6b928e4ffad1d4e70eef0e1c9f30fddcf7b9c37b12feb8bf9b00e28e3a3cbede13a09f45d42ed68de7efa1edf056776e77083ac77da3659ce300be119db339c77d233a67738efb4674cee61cf78de89ccd39ee1bd1399b73dc0037a27336e7b86f44e76cce71df88ced99ce3be119db339c77d233a67738efb004674cee61cf78de89ccd39ee1bd1399b73dc37a2733667857d23ed73b995e1009aa47a978b3882f1354fef2dbc4f43d2f1493f9aba6ee7bd81e313a89f99eb00765e4ef8e3fe5e8a3beaf0f87a39403f8ba85dac1bcf5fa6ed109da3b3cf3900ed738595e19aa47a57883882f131e07d85f769483a3ee94753f3d8fb02c72700503f33f3d8fb13feb8bf8fe28e3abcafbe3f403f8ba85dac1bcfdf4fdb213a0047679f73dae74a2bc33549f5ae1471047b997c3e50789f86a4e3937e34358f007d20707c02f533338f7d30e18ffb0728eea8c3fbea0703f4b388dac5baf1fc0083b41d3e189da3b3c739ed739595e19aa47a57893882bd9f7c3e54789fbaa400e3937e34358f7d28707c02f533338fbd92f0c7fd431477d4e17df59500fd2c00a276b16e3c7f85b6c3a1e69cf6b9ceca704d52bdeb441cc13e483e1f2ebc4f005dd2f1493f9a1a5f1f0e1c9f40fdcc8caf8f24fc71ff30c51d75785ffd4880007e1651bb58379e7f84b6c3a1e69cf6b9deca704d52bdeb451cc15e219f8f1600dea72ee9f8a41f4d8daf8f068e4fa07e66c6d7ab097fdc3f4a71471dde575f000dd0cf226a17ebc6f357693b1c6ace699f5d56866b92eaed127104fb08f97c00acf03e7549c727fd686a7c7d2c707c02f53333be3e9ef0c7fd631477d4e17d00f5e301fa5944ed62dd78fe71da0e879a73daa79395e19aa47a9d441cc15e25009f4f14dea72ee9f8a41f4d8daf4f048e4fa07e66c6d72713feb87f82e28e3a00bcaf7e32403f8ba85dac1bcf3f49dbe150734efb74b6325c9354afb38823d800c7c9e75385f7a94b3a3ee94753e3eb5381e313a89f99f1f5e9843fee9fa2b800a30eefab9f0ed0cf226a17ebc6f34fd37638d49cd33e5dac0cd724d5eb22e20008f649f2f94ce17d1a928e4ffad1d4f8fa4ce0f804ea67667c7d36e18ffb670028eea8c3fbea6703f4b388dac5baf1fcb3b41da27374f639a77daaac0cd72400d5ab127104fb34f97caef03e0d49c727fd686a1efb5ce0f804ea67661efb7c00c21ff7cf51dc5187f7d5cf07e86711b58b75e3f9e7693be4e3dcee10748e71006e9e73da67b495e19aa47aa3451cc13e4b3e5f28bc4f43d2f1493f9a9ac7be0010383e81fa9999c7be98f0c7fd0b1477d4e1f1f5c500fd2ca276b16e3cff22006d877c9cdb1d82ce31cecd734efb8cb1325c93546f8c8823181f03be54709f007dbf8fc63ee94753f3d89702c7274c3ff7cd63af25fc71ff12c51d75787cbd0016a09f45d42ed68de7afd17688ced1393a47e7e81c9da373748eced1393a4700e7e81c9da373748eced1393a47e7e8aced9cf6a9b5325c9354af56c4118c3f00b3f972c17df67deec03ee947539f3b7c39707cc2f473dfe70e5f49f8e3fe65008a3beaf0befa9500fd2ca276b16e3cff0a6d87e81c9da373748eced1393a4700e7e81c9da373748eced1393a47e7e81c9da373748ecedace699f7a2bc3354900f5ea451cc15e239faf16dea721e9f8a41f4d7deef0d5c0f109d4cfcce70e5f004bf8e3fe558a3beaf0befab500fd2ca276b16e3cff1a6d87e81c9d7dce699f00b156866b92ea8d157104fb0af97cbde03efb3e3f659ff4a3a979eceb81e31300a69ffbe6b16f24fc71ff3ac51d75785ffd46807e1651bb58379e7f83b6433e00ceed0e41e718e718e76cce31ce31ced99c639c639cb339c738c73867738e71008e71cee61ce31ce39ccd39c639c6399b738c738c7336e718e718e76cce31ce00ffffc439ed33deca704d52bdf1228e605f239f6f16dca7be26e9f8a41f4d7d00eef0cdc0f109d3cf7d9f3b7c2be18ffb3729eea8c3e3eb5b01fa5944ed62dd0078fe2dda0e6f75e77687a073dc375ac639ee1bd1399b73dc37a27336e7b86f0044e76cce71df88ced99ce3be119db339c77d233a67738efb4674cee61cf78d00e89ccd39ee1bd1399b73dc37a27336e7b86f44e76cce71df88ced99ce3be11009db339c77d233a677356d837d23e13ad0cd724d59b28e208c6d73c7dbbf03e000d49c727fd68eaba9d6f078e4fa07e66aedbf94ec21ff76f53dc5187c7d7770002f4b388dac5baf1fc3bb41da27374f639a77d265b19ae49aa3759c4118c8f0001df2dbc4f5dd2f1493f9a9ac7be1b383e81fa9999c7be97f0c7fdbb1477d400e17df57b01fa5944ed62dd78fe3dda0edf3bc49cd33e53ad0cd724d59b2ae20008f61df2f97ee17dea928e4ffad1d4f8fa7ee0f804ea67667cfd20e18ffbf70029eea8c3fbea0f02f4b388dac5baf1fc07b41d0e35e7b4cf2c2bc33549f566008938827d8f7c7e58789fbaa4e3937e3435be7e18383e81fa99195f3f4af8e300fe438a3beaf0befaa300fd2ca276b16e3cff116d8743cd39ed33dbca704d5200bdd9228e603f209f1f17dea72ee9f8a41f4d8daf1f078e4fa07e66c6d74f1200feb8ff98e28e3abcaffe24403f8ba85dac1bcf7f42dbe150734efb1c6665b80026a9de61228e603ce6f058488e01f6c5da83195fecd355cce72e319fdd623e0073c47cda88f95c21e6335dcce722319f7a319f73c47c8689f93c28e6739a98004f1f319f5bc57c4e12f34989f95c23e673b898cf16319f49623e178af9548b00f9ac10f31924e6738f98cf29623eddc57c6e10f33956cca7ad98cf95623e3300c47c2e16f3192be6b35acca752cc67a9984f3f319fdbc57ce689f97412f3b9004ecce748319fad623e53c47cd689f9d488f99c25e63344cce73e319f45623e003dc57c6e12f3395ecc2729e6739598cf2c319f4bc47cc68bf99c2fe65325e600738698cf00319f3bc57c1688f97411f3d925e673b4984f2b319f6d623ed3c4007c3688f9d489f9ac12f3192ae6f38098cf12319fde623eb788f99c28e6532a00e673b598cf61623e978af94c14f3b940cc67b498cf72319f72319fbbc57c4e0016f3e926e6b347cce718319f12319fed623e8d623e1bc57c1ac47cce15f319002ee6f3b098cfe9623e7dc57c6e13f3992be65326e673ad98cf11623e9789f9004c16f3592be63346cc67a598cf60319f7bc57c4e15f3e921e673a398cf7162003eedc57c7688f9cc14f3d924e6334ecce73c319f11623ecbc47cfa8bf9dc2100e6335fcca7b398cff5623e4789f95c2ee63355cc67bd984fad98cfd9623e1500623ef78bf92c16f3e925e673b398cf09623e1dc57c768af9cc16f3d92ce6330041cc678d98cf48319f33c57c068af91409f824136fbe8f36df07b90331dc9700783eb19f5a7901b19f597921b19f5bf96462bfb0f229c47e69e55389fdcaca008b88fddaca8b89fdc6ca4b88fdd6caa711fb9d954f27f67b2b2f25f6072b2f0023f6472b9f41ec4f563e93d89fadbc9cd85facbc82d85fadbc92d8dfac7c1600b1bf5bf96c62ffb0f22a62ffb4f239c4fe65e57389fddbcaab89bd6ee5f38800fdc7cae713c30eb3865891b10b88151bbb90582b636b89b536b68e581b63eb00899518db40acadb18b88b533b691587b631713eb606c13b1a4b14b887534b6009958a9b14b89a58c6d215666ec32629d8c6d25d6d9d8e5c4ba18db46acabb1002b887533b69d5877635712eb616c07b19ec6ae22d6cbd84e62bd8d5d4dac8f00b16b88f535762db17ec6ae23d6dfd8f5c40618db456ca0b1ddc4ca8ded213600c8d80dc4061bbb91d810633711ab307633b1a1c66e2136ccd8adc4861bbb8d0058a5b1db898d307607b12a6377121b69ec2e62a38cdd4d6cb4b17b88551bbb0097d81863f711ab31763f311c2c1e205667ec4162f5c6f8b8d060ac15b1b1c600da101b67ac84d878636d894d30d69ed8c4a2fd65fc9d64ac23b1c9c64a894d0031962236d55819b169c63a119b6eac33b14663f83e679acd30d695d84c63dd0088cd32d69dd86c633d881d66ac27b1c38df5227684b1dec48e34d687d851c600fa123bda583f62738cf527768cb101c48e353690d871c6ca891d6f6c10b113008c0d2676a2b121c44e3256416caeb1a1c4e6191b466cbeb1e1c41618ab24b600d0d80862271bab22768ab191c44e35369ad82263d5c4161b1b436c89b11a6200a719ab2576bab13a624b8dd5135b66ac81d819c6c6123bd3d83862cb8d8d2700b6c2d804622b8d4d247696b149c4ce363699d82a6353889d636c2ab1738d4d0023b6dad87462e7196b2476beb119c4d6189b49ec0263b3885d686c36b1b5c6000e23b6ced8e1c4d61b3b82d806634712bbc8d851c4361a3b9ad8c5c6e610db0064ec186297183b96d86663c711bbd4d8f1c4b6183b81d865c64e24b6d5d84900c42e373697d83663f3885de139566c37f630b1622b734e8263c94f88e17763007e4a0cc7979f11c3f1e5e7c4707cf905b17656fe25311c737e450cfebf268600e3d06f88e138f45b62380efd8e188e43bf2786e3d01f88e138f44762380efd0089188e437f2686e3d05f88e138f45762380efd8d188e437f2786e3d03f88e10038f44f62380efd8b188e43ff2686e3d0ebc4701cfa0f311c871274fcc771a80088188e43c5c4ca8db52236c8586b62380eb52186e35009311c87da12c371a8001d311c87da13c371a803b1378e43c4701cea480cc7a15262238da5888d325600460cc7a64ec4706cea4c0cc7a62ec4706cea4a0cc7a66ec4706cea4e0cc7a6001ec4706cea490cc7a65ec4706cea4d0cc7a63ec4706cea4b0cc7a67ec4706c00ea4f0cc7a601c4706c1a480cc7a6726238360d228663d360628dc686109b6100ac82188e4d4389e1d8348c188e4dc389e1d854490cc7a611c4706caa22866300d3486238368d228663d36862738c5513c3b1690c311c9b6a88e1d8544b0cc700a63a623836d513c3b1a981188e4d6389e1d8348e188e4de389e15cd60462380097c53907ce654d228673599389e15cd614623897359518ce654d23867359d30089e15c5623319ccb9a410ce7b266125b6a6c16b165c66613c3b9acc388e15c00d6e1c4702eeb086238977524319ccb3a8a18ce651d4d0ce7b2e610c3b9ac630088e15cd6b1c4ce35761c319ccb3a9e18ce659d400ce7b24e248673592711c300b9acb9c4702e6b1e319ccb9a4f0ce7b21610c3b9ac85c4702eeb6462389775000a319ccb3a9518ce652d228673598b89e15cd612623897751a319ccb3a9d1800ce652d25867359cb88e15cd619c42e377626b16dc69613c3b9ac15c4702e6b0025319ccb3a8b18ce659d4d0ce7b25611c3b9ac7388e15cd6b9c4702e6b3531009ccb3a8fd875c6ce278673596b88e15cd605c4702eeb42623897b59618ce6500ad23867359eb89e15cd6066238977511319ccbda480ce7b22e268673599b8800e15cd625c4702e6b33319ccbba9418ce656d218673599711c3b9acadc4702e00eb72623897b58d18ce655d41ec0163c839d239c0e8d4fed75117f94792eaf2007a50b63f99bc016d37260afb790db7d548cfd15e2979e0b5ffb5cf40319f3300c57c468af9ac11f39920e6b359cc67b698cf4e319f8e623e2788f9dc2ce6d3004bcc67b198cffd623e15623e678bf9d48af9ac17f3992ae673b998cf51623e00d78bf97416f3992fe67387984f7f319f65623e23c47cce13f31927e6b349cc0067a698cf0e319ff6623ec789f9dc28e6d343cce754319f7bc57c068bf9ac1400f31923e6b356cc67b298cf65623e4788f95c2be65326e63357cce736319fbe00623ea78bf93c2ce6335ccce75c319f06319f8d623e8d623edbc57c4ac47c8e0011f3d923e6d34dcce764319fbbc57ccac57c968bf98c16f3b940cc67a298cf00a5623e8789f95c2de6532ae673a298cf2d623ebdc57c9688f93c20e63354cc006795984f9d98cf06319f69623edbc47c5a89f91c2de6b34bcca78b98cf0231009f3bc57c0688f99c21e65325e673be98cf78319f4bc47c6689f95c25e6931400f3395ecce726319f9e623e8bc47cee13f31922e67396984f8d98cf3a319f2900623e5bc57c8e14f3b94ecca79398cf3c319fdbc57cfa89f92c15f3a914f359002de63356cce762319f19623e578af9b415f33956cce706319fee623ea788f900dc23e63348cc6785984fb598cf85623e93c47cb688f91c2ee6738d984f4acc00e724319f5bc57cfa88f99c26e6f3a098cf30319f73c47ceac57c2e12f3992e00e67385984f1b319f39623ebbc57cee12f3e92ae6b3d0f1497f1e8f7be86e2700566c0cafb54f1c78fcc375e6e9ba0f392cdd477cafb43151d83ea22dac1bcf001f2687bd567e887c1e0ae4b3d7f171db4e515c1e148d598ad85e4f1c531eef00948037ef8f2db1ad1f747cdcb65389fd71d92b1a33ded60f7ae258e6f12e1300f0561cd7654e1cd562966b5c5778bc2b04bc15c775851347b598e51ad7c33c00dec304bc15c7f530278e6a31cb35ae2b3dde9502de8ae3bad289a35acc728d00eb2a8f779580b7e2b8ae72e2a816b35ce37a94c77b9480b7e2b81ee5c4512d0066b9c675b5c7bb5ac05b715c573b71548b59ae715de3f1ae11f0561cd7354e001cd562966b5cd779bceb04bc15c7759d1347b598e51ad70d1eef06016fc57100dde0c4512d66b9c6f5448ff744016fc5713dd189a35acc728deb491eef490200de8ae37a921347b598e51ad7933dde9305bc15c7f564278e6a31cb35ae177900bc1709782b8eeb454e1cd562966b5c2ff6782f16f0561cd78b9d38aac52cd700b85ee2f15e22e0ad38ae973871548b59ae71bdc1e3bd41c05b715c6f70e2a80016b35ce37aa3c77ba380b7e2b8dee8c4512d66b9c6f5268ff726016fc571bd00c989a35acc728debcd1eefcd02de8ae37ab31347b598e51ad75b3cde5b04bc0015c7f516278e6a31cb35aeb77abcb70a782b8eebad4e1cd562966b5c6ff378006f13f0561cd7db9c38aac52cd7b8deeef1de2ee0ad38aeb73b71548b59ae7100bdc3e3bd43c05b715cef70e2a816b35ce37aa7c77ba780b7e2b8dee9c4512d0066b9c6f52e8ff72e016fc571bdcb89a35acc728debdd1eefdd02de8ae37ab7001347b598e51ad77b3cde7b04bc15c7f51e278e6a31f38deb76542e2f9c4f4d008a5c8aa9ad0703f53de1f43de16c0bf6b954cc67a298cf05623ea3c57c968b00f90c12f3b95bcce764319fee623e7bc47c8e11f3692fe6b35dcca751cc67a300984f8398cfb9623e95623ea78bf9f413f3b94dcc67ae984f27319f6bc57c8e0010f3692de6739998cf64319fb5623e63c47c568af90c11f3b957cce754319f009e623e378af91c27e69314f3d921e63353cc679398cf38319ff3c47caac47c009689f90c10f3b943cc67be984f17319febc57c8e12f32911f3b95ccc67aa9800cf7a319f5a319fb3c57c868af9dc2fe6b358cca7b798cfcd623e2788f9948a00f9ec14f3992de6b359cc678298cf1a319f51623e678af9948bf9dc25e6b35000cca79b98cf6e319f39623eedc47cae10f3992ee67391984fbd98cf39623ec300c57c4e13f3e92be673ab98cf49623e65623ed788f91c2ee6d34acc678b98cf0024319f0bc57caac57c5688f90c16f3b947cce714319f1e623e3788f91c2be600d341cce74a319f19623e178bf98c15f3592de63342cc67a9984f7f319fdbc5007ce689f97416f3b94ecce748319f36623e5bc57ca688f9ac13f3a911f3394b00cca742cce73e319f45623ebdc47c6e12f3395ecca7a398cf55623eb3c47c2e0011f3192fe673be98cf48319f33c47c068af9dc29e6b340cca7ab98cf2e319f00a3c57cda8af96c13f39926e6b341cca74ecc679598cf30319f07c47c9688f900f411f3b945cce744319f9498cfd5623e8789f91409f824c923410cf79f2e260086fb53b722f688955b137bd4ca6d883d66e512628f5bb92db12712fb6302f600a495db137bcaca1d883d4d65fc7dc6ca1d893d6be55262cf593945ec792b9700117bc1ca9d88bd68e5cec45eb27217626fb37257626fb7723762efb072776200efb4720f62efb2724f62efb6722f62efb1726f62efb5721f622f5bb92fb1f70059b91fb1f75bb93fb10f587900b10f5a7920b10f59b99cd82b561e44ecc356001e4cec23561e42eca356ae20f6aa958712fb98958711fbb8958713fb84952b00897dd2ca23887dcaca55c43e6de591c43e63e551c43e6be5d1c43e67e56a62009fb7f218625fb0720db12f5ab996d897ac5c47ec352bd713fbb2951b887dc500ca63897dd5cae3887dcdcae3897dddca13887dc3ca13897dd3ca93887dcbca0093897ddbca53887dc7ca53897dd7cad3887dcfcad3897ddfca8dc47e60e51900c47e68e599c47e64e559c47e6ce5d9c47e62e5c388fdd4ca8713fb99958f2000f6732b1f49ec17563e8ad82fad7c34b15f59790eb15f5bf91862bfb1f2b1c4007e6be5e388fdcecac713fbbd954f20f6072b9f48ec8f563e89d89fac3c97d8009fad3c8fd85fac3c9fd85fadbc80d8dfacbc90d8dfad7c32b17f58f91462ff00b4f2a9c4fe65e545c4fe6d65fe1df9d7adccbf37fe1f2b9f460c07d6d3891500195b4aacd8d83262ad8c9d41acb5b13389b531b69c5889b115c4da1a5b49ac009db1b388b5377636b10ec656114b1a3b87584763e7122b35b69a58cad879c400ca8c9d4fac93b135c43a1bbb805817631712eb6a6c2db16ec6d611eb6e6c3d00b11ec6f837c67b1abb88582f63fcfbd4bd8d5d4cac8f31fe6de3bec62e21d600cf18ff2e6e7f6397121b608c7f5375a0b1cb88951be3dfe31c64ec7262838d006d2336c4d815c42a8cf1ef000e357625b161c6f837e4861bbb8a58a531fefd00b111c6ae265665ec1a62238d5d4b6c94b1eb888d36763db16a63fc5b58638c00ed2656638c7f5b076faa6f205667ec4662f5c66e22d660ec6662638ddd426c009cb15b898d37761bb109c66e2736d1d81dc42619bb93d8646377119b62ec6e0062538ddd436c9ab17b894d37761fb14663f7139b61ec0162338ded2586bce3002162c83b1e2686bce31162c83b1e2586bce33162c83b1e2786bce30962c83b009e2486bce32962492b731e82bce31962c83b9e2586bce33962c83b9e2786bc00e30562c83b5e2486bce32562c83bde460c79c7db8921ef780731e41def248600bce35dc49077bc9b18f28ef71043def15e62c83b5e2686bce37dc49077bc9f0018f28e0f1043def14162e556fe10b141567e8518f28e0f1343def11162c83b003e4a0c79c7abc490777c8c18f28e8f1343def10962c83b3e490c79c7a7888d00b4f2a78921eff80c31e41d9f2586bce373c490777c9e18f28e2f1043def1450062c83bbe440c79c76bc490777c9918f28eaf1043def15562c83bbe460c79c700d78921eff80631e41ddf2486bce35bc490777c9b18f28eef1043def15d62c8003bbe47acd1cadf2736c3ca3f2086bce387c49077fc8818f28e1f1343def1130062c83b7e4a0c79c7cf8821eff83931e41dbf2086bce397c4e658f957c4907700fc9a18f28edf1043def15b62c83b7e470c79c7ef8921eff80331e41d7f248600bce34fc49077fc9918f28ebf1043def15762c83bfe460c79c7df8921eff8070031e41dff2486bce35fc49077fc9b18f28ed78921eff80f31e41dc843d26c290010b165c68a8921ef68450c79476b62c83bda1043de51420c79475b626f5c3f00490c79477b62c83b3a107b23ef2076aeb18ec49077941243de912286bca38c0018f28e4ec49077742686bca30b31e41d5d8921efe8460c79477762c83b7a100043ded19318f28e5ec49077f42686bca30f31e41d7d8921efe8470c79477f6200c83b061043de319018f28e7262971b1b446c9bb1c1c490770c2186bca3821800f28ea1c490770c2386bc633831e41d95c490778c2086bca38a18f28e91c4ae0033368a18f28ed1c49077541343de318618f28e1a62c83b6a8921efa82386bc00a39e18f28e0662c83bc61243de318e18f28ef1c490774c2086bc632231e41d00938821ef984c0c79c71462c83ba61243de318d18f28ee9c4907734127bc0d8000c620f1a431e92ce0b06f4d8ff3aeaf26721a8cbeb41d9fe647209b4dd982800ece73adc56233d477ba5e481d7fed73e8789f95c2de69312f33951cce71631009f3e623e4bc47c1e10f31926e6b34acca74ecc678398cf34319f6d623e6dc5007c8e16f3d925e6d355cc678198cf9d623e03c57cce10f31929e673be98cf7800319f4bc47c6689f95c25e6d351cce778319f9bc47c7a89f92c12f3b94fcca70042cce72c319f1a319f75623e53c47cb68af9b411f33952cce73a319fce623e00f3c47c6e17f3e92fe6b354cc678498cf6a319fb1623e178bf9cc10f3b952cc00a78398cfb1623e3788f9f410f33945cce71e319fc1623e2bc47caac57c2e1400f39924e6b345cca79598cfe1623ed788f99489f99c24e673ab984f5f319fd300c47c868bf99c23e6532fe6739198cf74319f2bc47cda89f9cc11f3d92de6d3004dcc67a198cf5d623ee5623e678af98c12f35923e63341cc67b398cf6c319f009d623ea5623e2788f9dc2ce6d35bcc67b198cffd623e43c57cce16f3a915f300592fe63355cce772319f12319fa3c47cae17f3e922e6335fcce70e319f0162003ecbc47caac47cce13f31927e6b349cc67a698cf0e319fa498cf71623e378a00f9f414f33955cce75e319f21623e2bc57cc688f9ac15f3992ce67399984f6b00319f23c47cae15f3e924e63357cce736319f7e623ea78bf9548af99c2be6d30020e6b351cca751cc67bb984f7b319f63c47cf688f97417f33959cce76e319f0041623ecbc57c468bf95c20e63351cce752319f62c7a7d4793dfdc8fc5684c300d2de530379a32dac1bcfa79203ee993d8de2382d90cf74c7c76d3b457141ec00d462962236dd1347fe0dd1690efb5f6febc616dcd68d8e4fa3675b232ed38b003463c6dbbad11347fe6dd8690e8be3fac06d89b8f8c6b542cc728d6bfe8dd900690e8be3fac06d8db8f8c6b542cc728d6bfe9de0690e8be3fac06d8db8f8c600b542cc728d6b9cd763ef4a016fc5718db8f8c6b542cc728d6bfebdee690e8b00e3fac06d8db8f8c6b542cc728d6bfecdf5690e8be3fac06d8db8f8c6b542cc00728d6bdc7b85bdab05bc15c735e2e21bd70a31cb35ae711f58f6ae11f0561c00d7888b6f5c2bc42cd7b8c66fd2b0779d80b7e2b8465c7ce35a2166b9c6353e003f66ef06016fc5718db8f8c6b542cc728d6b7c96c0de1305bc15c735e2e21b00d70a31cb35ae71df37f69e24e0ad38ae1117dfb8568859ae718d6b58d97bb20080b7e2b8465c7ce35a2166b9c6357ecf83bd1709782b8e6bc4c537ae156296006b5ce3de04ecbd58c05b715c232ebe71ad10b35ce31abf23cbde4b04bc15c70035e2e21bd70a31cb35aef11babecbd41c05b715c232ebe71ad10b35ce31ad70043b3f746016fc5718db8f8c6b542cc728d6b7c379bbd3709782b8e6bc4c53700ae1562966b5ce33e71ecbd59c05b715c232ebe71ad10b35ce31af7ac67ef2d0002de8ae31a71f18d6b8598e51ad7f8fd3cf6de2ae0ad38ae1117dfb856885900ae71bd2df166ef6d02de8ae31a71f18d6b8598e51ad7f8de1d7b6f17f0561c00d7888b6f5c2bc42cd7b8c63d80d87b8780b7e2b8465c7ce35a2166b9c635ee0047ccde3b05bc15c735e2e21bd70a31cb35ae7725deecbd4bc05b715c232ebe0071ad10b35ce37a77e2cddebb05bc15c735e2e21bd70a31cb35aef11d7bf6de0023e0ad38ae1117dfb85688996f5c27a93c935871e2c07aed2de60f25f6c71f00751f7158ba8f8f26c2f4116d61dd78fe28393c6ce547c8e791403e0f3b3e6e00dbfcfddd8744639622f6b0278e298f774ac09bf7c796d8d60f393e6edbfcfd00dd874563c6dbfa214f1ccb3cde6502de8ae3bacc89a35acc728deb0a8f77850080b7e2b8ae70e2a816b35ce37a98c77b9880b7e2b81ee6c4512d66b9c675a500c7bb52c05b715c573a71548b59ae715de5f1ae12f0561cd7554e1cd562966b005c8ff2788f12f0561cd7a39c38aac52cd7b8aef678570b782b8eeb6a278e6a0031cb35ae6b3cde3502de8ae3bac689a35acc728deb3a8f779d80b7e2b8ae7300e2a816b35ce3bac1e3dd20e0ad38ae1b9c38aac52cd7b89ee8f19e28e0ad3800ae273a71548b59ae713dc9e33d49c05b715c4f72e2a816b35ce37ab2c77bb20080b7e2b89eecc4512d66b9c6f5228ff722016fc571bdc889a35acc728debc5001eefc502de8ae37ab11347b598e51ad74b3cde4b04bc15c7f512278e6a31cb0035ae3778bc3708782b8eeb0d4e1cd562966b5c6ff4786f14f0561cd71b9d3800aac52cd7b8dee4f1de24e0ad38ae373971548b59ae71bdd9e3bd59c05b715c006f76e2a816b35ce37a8bc77b8b80b7e2b8dee2c4512d66b9c6f5568ff75601006fc571bdd589a35acc728deb6d1eef6d02de8ae37a9b1347b598e51ad7db3d00dedb05bc15c7f576278e6a31cb35ae7778bc7708782b8eeb1d4e1cd562966b005ceff478ef14f0561cd73b9d38aac52cd7b8dee5f1de25e0ad38ae77397154008b59ae71bddbe3bd5bc05b715cef76e2a816b35ce37a8fc77b8f80b7e2b8de00e3c4512d66be71dd8e7c0be9934c1c18b3f4a3c879de48e5873c3eaf17cea70026453e0f85dd1675bcdd0fa6ef8f92cf6385f7c96c8b47f3f0798c7c1e0f14009fc7f2f0799c7c9e08149fc7f3f079827c9e0ce4f3441e3e4f92cf53817c9e00ccc3e729f2793a90cf5379f83c1dd62733b73ceab495668f7bda072b2f5cfb00cbd26d617f799cdac7367b90dae77da540edd7a6687bf0fa0b3fb7d6d6e5bb00ed796e0d3177043a86d4a4d7fb0cf5af50eb4dafeb5927564f39b14a519d6700287ecf06885f51e2c06353233d7fd6d37601f7db4c2c9e3b88583ce7f179ae00856381f6a2b3a6f34387a0f3a118e7670e41e73806a37336e7386fb48c739c0037a2f35bc939ce1bcd73e673a070e5f3637c2ef97fe908f644589f95f99eab007c8e7c429cc70ed4cf4caef7bcd3a7473c71471d3e5e3c1fa09fbeb183e7cf00d376c8c7f9d9e81c9ddf42ce710c46e7e8fcbf758e63303a47e7c23aa77df000f9375c9354ef311147b04783fad4e67d3dc0f3e41322470b14f74c0ef282d300a7c73c71471d9e7b5f08d04fdfd8c1f317683be4e3fc6c748ece599c1f3a04009d0fc538c779233abf959ce3bcd132ce71de88ce6f25e7386f34cf39ddf68b00856f3bf35913b78df8241c1f3c5e0c1c8b40fdcce4792f25fc31467b29aac300f3ee4b01fa5944ed62dd78fe126d877c9c9f8dced1f92de41cc760748eceff005be73806a373742eac738a5e2f269f00ef7b6b0fe6bd3cfb5c2ae63351cce70002319fd1623ecbc57c0689f9dc2de673b2984f77319f3d623ec788f9b417f300d92ee6d328e6b351cca741cce761319f73c57c2ac57c4e17f3e927e6739b9800cf5c319f4e623ed78af91c21e6d35acce732319fc9623e6bc57cc688f9ac1400f31922e673af98cfa9623e3dc57c6e14f3394ecc2729e6b343cc67a698cf2600319f71623ee789f95489f92c13f31920e6738798cf7c319f2e623ed78bf91c0025e65322e673b998cf54319ff5623eb5623e678bf90c15f3b95fcc67b1984f006f319f9bc57c4e10f32915f3d92be6b353cc67b698cf66319f09623e6bc47c004689f99c29e6532ee6739798cf42319f6e623ebbc57ce688f9b413f3b942cc0067ba98cf45623ef5623ee788f90c17f37950cce734319fbe623eb78af99c2400e65326e6738d98cfe1623eadc47cb688f94c12f3b950cca75acc678598cf6000319f7bc47c4e11f3e921e6738398cfb1623e1dc47cae14f39921e673b198cf0058319fd5623e23c47c968af9f417f3b95dcc679e984f67319febc47c8e14f3006923e6b355cc678a98cf3a319f1a319fb3c47c2ac47cee13f35924e6d34bcc00e726319fe3c57c3a8af95c25e6334bcce712319ff1623ee78bf98c14f3394300cc67a098cf9d623e0bc47cba8af9ec12f3395acca7ad98cf36319f69623e1b00c47ceac47c5689f90c13f37940cc6789984f1f319f5bc47c4e14f34989f95c002de67398984f91804f32f1e6dfc449d2ebc5c4708fef56c4de66e5d6c4de6e00e536c4de61e51262efb4725b62ef4aec8f09d8bbaddc9ed87bacdc81d87ba9008cbf2f5bb923b1f759b994d8fbad9c22f6012b9711fba0953b11fb90953b13007bc5ca5d887dd8ca5d897dc4cadd887dd4cadd89bd6ae51ec43e66e59ec43e006ee55ec43e61e5dec43e69e53ec43e65e5bec43e6de57ec43e63e5fec43e6b00e501c43e67e581c43e6fe572625fb0f220625fb4f260625fb2f21062af59b90082d897ad3c94d857ac3c8cd857ad3c9cd8d7ac5c49eceb561e41ec1b56ae2200f64d2b8f24f62d2b8f22f66d2b8f26f61d2b5713fbae95c710fb9e956b887d00dfcab5c47e60e53a623fb4723db11f59b981d88fad3c96d84fac3c8ed84fad003c9ed8cfac3c81d8cfad3c91d82fac3c89d82fad3c99d8afac3c85d8afad3c0095d86fac3c8dd86fad3c9dd8efacdc48ecf7569e41ec0f569e49ec8f569e4500ec4f569e4deccf563e8cd85fac7c38b1bf5af908627fb3f291c4fe6ee5a38800fdc3ca4713fba795e710fb97958f21f66f2b1f4bec752b1f47ec3f563e9e18000e1627102b327622b1626327116b656c2eb1d6c6e6116b636c3eb112630b8800b535b690583b6327136b6fec14621d8c9d4a2c696c11b18ec616132b35b6840058cad869c4ca8c9d4eac93b1a5c43a1b5b46ac8bb1338875357626b16ec6960013eb6e6c05b11ec65612eb69ec2c62bd8c9d4dacb7b155c4fa183b87585f6300e712eb676c35b1fec6ce2336c0d8f9c4061a5b43acdcd805c40619bb90d86000636b890d31b68e5885b1f5c4861adb406c98b18b880d37b69158a5b18b898d0030b6895895b14b888d34b699d8286397121b6d6c0bb16a6397111b636c2bb1001a639713c31bc56dc4ea8c5d41acded876620dc6ae2436d6d80e62e38c5d45006cbcb19dc42618bb9ad84463d7109b64ec5a62938d5d476c8ab1eb894d35b6008bd83463bb894d37b68758a3b11b88cd307623b199c66e2236cbd8cdc4661b00bb85d861c66e2576b8b1db881d61ec7662471abb83d851c6ee2476b4b1bb8800cd317637b1638cdd43ec5863f7123bced87dc48e37763fb1138c3d40ec4463008f113bc9d873c4e61a7b9ad83c63cf139b6fec05620b3ccb2e34f638b1938d003d48ec14634f12435ec47914f2a29788212f7a1b31e4456f2786bce81dc4900017bd9318f2a27711435ef46e62c88bde432c6965ce939017bd4c0c79d1fb8800212f7a3f31e4451f2086bce883c490177d8818f2a25788212ffa3031e4451f002186bce8a3c49017bd4a0c79d1c788212ffa3831e4459f2086bce893c49017007d8a18f2a24f13435ef41962c88b3e4b0c79d1e788955bf9f3c40659f90bc40090177d9118f2a22f11435ef41a31e4455f2686bce82bc490177d9518f2a2af0011435ef47562c88bbe416ca495bf490c79d1b788212ffa3631e445df2186bc00e8bbc490177d8f18f2a2ef13435ef40362c88b7e480c79d18f88212ffa313100e4453f2186bce8a7c49017fd8c18f2a29f13435ef40b62c88b7e490c79d1af0088212ffa3531e445bf2186bce8b7c41aadfc3b6233acfc7b62c88bfe400c7900d11f89212ffa1331e4457f2686bce82fc49017fd9518f2a2bf11435ef4776200c88bfe416c8e95ff490c79d1bf88212ffa3731e445af13435ef41f62c88b900027658e6f40c490171513435ed48a18f2a2d6c49017b52186bca88418f2a2b600c4def84d2c62c88bda13435ed481d81b791131e4451d89212f2a2586bc2845000c795119b1a5c63a115b66ac3331e4455d88212fea4a0c79513762c88bba1300435ed48318f2a29ec49017f52286bca83731e4457d889d6bac2f31e445fd8800212fea4f0c79d10062c88b0612435e544e0c79d12062c88b0613435e34841800f2a20a62c88b8612435e348c18f2a2e1c490175512435e348218f2a22a62c8008b4612435e348a18f2a2d1c490175513435e3486d8e5c66a886d33564b0c7900511d31e445f5c490173510435e349618f2a271c490178d2786bc680231e445001389212f9a44ec3a639389212f9a420c79d15462c88ba611435e349d18f2a2004662c88b6610435e349318f2a259c49017cd2686bce83062c88b0e2786bce8000862c88b8e2486bce82862c88b8e2686bc680e31e445c710435e742c31e44500c711435e743cb1078c9d40ec41632712db6bec24620f199b4b0cbff9358fd80023c6e6137bd4d80262c8c7161243ae7432b1278c214f4ae72d3faed8ff3a9600e7cf92d00e7f9684e5b93db4c35e28db9f4c4e84651a1385fdfc8cdb6aa4e70068af943cf0daffdae730319fabc57c52623e278af9dc22e6d347cc678998cf0003623ec3c47c5689f9d489f96c10f39926e6b34dcca7ad98cfd1623ebbc47c00ba8af92c10f3b953cc67a098cf19623e23c57cce17f3192fe6738998cf2c31009fabc47c3a8af91c2fe67393984f2f319f45623ef789f95488f99c25e6532300e6b34ecc678a98cf56319f36623e478af95c27e6d359cc679e98cfed623efd00c57c968af98c10f3592de63356cce762319f19623e578af97410f33956cce70006319f1e623ea788f9dc23e63358cc6785984fb598cf85623e93c47cb688f900b412f3395ccce71a319f32319f93c47c6e15f3e92be6739a98cf83623ec3c5007cce11f3a917f3b948cc67ba98cf15623eedc47ce688f9ec16f3e926e6b35000cce72e319f72319f33c57c4689f9ac11f39920e6b359cc67b698cf4e319fbd00623ea5623e2788f9dc2ce6d35bcc67b198cffd623e43c57cce16f3a915f359002fe63355cce772319f12319fa3c47cae17f3e922e6335fcce70e319f01623e00cbc47caac47cce13f31927e6b349cc67a698cf0e319fa498cf71623e378af900f414f33955cce75e319f21623e2bc57cc688f9ac15f3992ce67399984f6b31009f23c47cae15f3e924e63357cce736319f7e623ea78bf9548af99c2be6f3b000984f8398cf46319f46319fed623eedc57c8e11f3d923e6d35dcce764319fbb00c57c0689f92c17f3192de6738198cf44319f4bc57c8a5bd007f70bc7ba4f76007c02b55dc3f764c7fad3f741e930607fbb0b0adfeeb222a7bdc6c49baf476b004d75de5eb1bf6e2aa85bc384f47ae7177cbd63333fcd30cfe933fce7539f5100a7abf5337d1e80978517ee3bbf80f659c46b9e27863d07ec6f7bea90fdcbe000fefbc83fd2fdc77df5cb1385dde68fecef4266dd0f5a19eda5ebe0fefd254e001d2cdb9aeaf4a718f16f5417535f50b73151d831cb8f462aa33df69928e673008198cf20319f93c57cf688f920b753f16914f3d928e65329e673ba98cf6d62003e9dc47c8e10f3b94ccc678c98cf4a319f7bc57c7a8af91c27e6b343cce72100319f71623ee789f90c10f3992fe673bd984f8998cf54319ff5623e43c57c16008bf9dc2ce6532ae6335bcc67b398cf28319f33c57cee12f3e926e63347cce7000a319f7a319f73c47cfa8af99c24e6738d984f2b319f49623e178af90c16f3003945cce706319f0e623e33c47c2e16f31921e6b354cce776319fce623e478a00f96c15f3a911f3394bcce73e319f5e623ec78bf95c25e6f38898cf78319ff300c57c068af92c10f3d925e6d356cc679a98cf06319f61623e4bc47c6e11f3490089f91c26e673a998cf68319fe5623e778bf97417f33946cc67bb98cfc3623e000d623ee78af9f413f3992be673ad984f6b319fc9623e6bc57c8688f99c2ae60073a3984f52cc67a698cf26319f2a319f65623e7788f97411f3394acce77231009f5a319fb3c57cee17f3e92de6738298cf5e319f9d623e13c47cd688f9948b00f92c14f3d92de6d34ecc67ba98cf45623ec3c57c4e13f3b955cca74ccce77000319f2d623ed5623e2bc47cee11f3e921e673ac98cf95623e63c57c568bf9f40017f39927e6739d984f1b319f29623eebc47c2ac47c1689f9dc24e6d351cc67009698cf25623e23c57cce10f3b953cca7ab98cfd1623edbc47ceac47c5689f9003c20e6d347cce744319fabc57c8a047c92e4912086d78b893d6ee556c49eb000726b624f5ab90db1a7ac5c42ec692bb725f64c627f4cc09eb5727b62cf59b90003b1e7a98cbf2f58b923b117ad5c4aec252ba788bdcdca65c4de6ee54ec4de0061e5cec4de69e52ec4de65e5aec4de6de56ec4de63e5eec4de6be51ec45eb600724f62efb3722f62efb7726f621fb0721f621fb4725f621fb2723f62af58b9003fb10f5b7900b18f587920b18f5ab99cd8ab561e44ec63561e4cece3561e4200ec1356ae20f6492b0f25f6292b0f23f6692b0f27f6192b5712fbac954710fb009c95ab887ddeca23897dc1caa3887dd1caa3897dc9cad5c45eb3f218625fb600720db1af58b996d857ad5c47ec6b56ae27f6752b3710fb8695c712fba695c70011fb9695c713fbb6952710fb8e952712fbae952711fb9e952713fbbe95a71000fb8195a712fba195a711fb9195a713fbb1951b89fdc4ca3388fdd4ca3389fd00cccab388fddccab389fdc2ca8711fba5950f27f62b2b1f41ecd7563e92d86f00ac7c14b1df5af96862bfb3f21c62bfb7f231c4fe60e56389fdd1cac711fb9300958f27f6672b9f40ec2f563e91d85fad7c12b1bf59792eb1bf5b791eb17f5800793eb17f5a7901b17f597921b17f5bf96462af5bf91462ffb1f2a9c470205c0044acc8d86262c5c696106b65ec3462ad8d9d4eac8db1a5c44a8c2d23d6d6d80019c4da193b93587b63cb897530b68258d2d84a621d8d9d45acd4d8d9c452c60056112b33760eb14ec6ce25d6d9d86a625d8c9d47acabb1f3897533b686587700631710eb61ec42623d8dad25d6cbd83a62bd8dad27d6c7d806627d8d5d44ac009fb18dc4fa1bbb98d800639b880d347609b172639b890d327629b1c1c6b610001b62ec326215c6b6121b6aec7262c38c6d2336dcd815c42a8d6d2736c2d89500c4aa8ced2036d2d855c44619db496cb4b1ab89551bbb86d81863d712ab3176001d31bc09be9e589db15dc4ea8ded26d6606c0fb1b1c66e2036ced88dc4c61b00bb89d8046337139b68ec1662938cdd4a6cb2b1db884d31763bb1a9c6ee203600cdd89dc4a61bbb8b58a3b1bb89cd30760fb199c6ee2536cbd87dc4661bbb9f00d861c61e2076b8b1478821efe03c0579c7e3c490773c410c79c793c490773c00450c79c7d3c490773c430c79c7b3c490773c472c6965ce439077bc400c79c7008bc49077bc440c79c7db8821ef783b31e41def2086bce39dc49077bc8b18f2008e771343def11e62c83bde4b0c79c7cbc49077bc8f18f28ef71343def1016200c83b3e480c79c7878821ef788518f28e0f1343def11162e556fe28b141567e009518f28e8f1143def17162c83b3e410c79c7278921eff81431e41d9f2686bc00e333c490777c9618f28ecf111b69e5cf1343def10562c83bbe480c79c797880021ef788d18f28e2f1343def11562c83bbe4a0c79c7d78821eff83a31e41ddf002086bce39bc490777c8b18f28e6f1343def11d62c83bbe4b0c79c7f78821ef00f83e31e41d3f2086bce387c49077fc8858a3957f4c6c86957f420c79c74f890021eff81931e41d3f2786bce317c49077fc9218f28e5f1143def16b62c83b7e00430c79c76f89cdb1f2ef8821eff83d31e41d7f2086bce38fc49077fc8918f2008e3f1343def11762c83bfe4a0c79c7df8821eff83b31e41dff2086bce39fc4009077fc8b18f28e7f1343def13a31e41dff2186bc0379489a21ef282286bca3009818f28e56c49077b426b6d4581b62cb8c951043ded196d81bf7e32686bca3003d31e41d1d88bd91771043ded19118f28e5262c83b52c4907794113bd758270062c83b3a1343ded18518f28eaec49077742386bca33b31e41d3d8821efe849000c79472f62c83b7a1343ded18718f28ebec49077f42386bca33f31e41d03880021ef18480c79473931e41d838821ef184c0c79c71062c83b2a885d6e6c28b1006dc6861143de319c18f28e4a62c83b461043de51450c79c74862c83b46114300de319a18f28e6a62c83bc610bbce580d31e41db5c49077d41143de514f0c7900470331e41d638921ef18470c79c77862c83b261043de319118f28e49c49077004c2686bc630a31e41d538921ef98460c79c77462c83b1a8921ef98410c79c7004c62c83b661143de319bd803c60e23f6a031e421e9bc60408ffdafa32e7f160082babc1e94ed4f269740db8d89c27eaec36d35d273b4574a1e78ed7fed73b50098cf89623e7dc47c1e10f35925e65327e6b34dcce768319fae623e778af99c0021e63352cce712319f59623e1dc57c6e12f35924e65321e6b34ecc678a984f001b319febc47ce689f9f417f3592de63356cce74a319f63c57c7a88f9dc23e600b342cca75acc678b98cfe1623e65623eb78af99c26e6335ccce722319fe962003eedc47c768bf92c14f32917f35923e63341cc67a798cf5e319f13c47c7a8b00f9dc2fe673b6984fad98cfe5623e4789f97411f3b943cc6799984f9598cf2600319f99623e49319f1bc57c4e15f31922e6b356cc67b2984f6b319f6bc57ce6008af9f413f33957cca741cce761319fed623ec788f97417f3b95bcc67b998cf0068319f4bc57c0e13f34989f9dc22e6b344cc679898cf06319f69623e6dc57c007689f92c10f31928e673be98cf78319f47c47cae12f3395ecca79798cf7d62003e6789f9d488f96c15f33952cca7b398cfed623e4bc57c4688f95c2ce6334300cca78398cf0d623ea788f90c16f3b950cc6792984f2b319f6bc47c4e12f3e9002be6738e984fbd98cf15623e73c47cba89f9dc25e673a698cf28319fcd623e00b3c57c4ac57c6e16f3592ce63354cc67bd98cf54319f12319febc57ce68bf9000c10f3394fcc679c98cf43623e3bc47c8e13f3e929e673af98cf4a319f3162003e9789f91c21e6d349cce736319fd3c57c2ac57c368af9348af9b417f3d92300e673b298cf20319f0bc47c268af9143b3ee9c723fb8b6fbcdfc7bdc7d3d74b003fecd44bdf2370ea90fdebc432a857ea94d38ff4f7281f75583a16a17e9316006d61dd78fe1839a03f8f92cfa3817c1e717cdcb65314978745639622f68827008e298f774ac09bf7c796d8d60f3b3e6edba9c4feb83c221a33ded6be715de600f12e13f0561cd7654e1cd562966b5c5778bc2b04bc15c775851347b598e51a00d7c33cdec304bc15c7f530278e6a31cb35ae2b3dde9502de8ae3bad289a35a00cc728deb2a8f779580b7e2b8ae72e2a816b35ce37a94c77b9480b7e2b81ee500c4512d66b9c675b5c7bb5ac05b715c573b71548b59ae715de3f1ae11f0561c00d7354e1cd562966b5cd779bceb04bc15c7759d1347b598e51ad70d1eef0601006fc571dde0c4512d66b9c6f5448ff744016fc5713dd189a35acc728deb491e00ef4902de8ae37a921347b598e51ad7933dde9305bc15c7f564278e6a31cb3500ae1779bc1709782b8eeb454e1cd562966b5c2ff6782f16f0561cd78b9d38aa00c52cd7b85ee2f15e22e0ad38ae973871548b59ae71bdc1e3bd41c05b715c6f0070e2a816b35ce37aa3c77ba380b7e2b8dee8c4512d66b9c6f5268ff726016f00c571bdc989a35acc728debcd1eefcd02de8ae37ab31347b598e51ad75b3cde005b04bc15c7f516278e6a31cb35aeb77abcb70a782b8eebad4e1cd562966b5c006ff3786f13f0561cd7db9c38aac52cd7b8deeef1de2ee0ad38aeb73b71548b0059ae71bdc3e3bd43c05b715cef70e2a816b35ce37aa7c77ba780b7e2b8dee900c4512d66b9c6f52e8ff72e016fc571bdcb89a35acc728debdd1eefdd02de8a00e37ab71347b598e51ad77b3cde7b04bc15c7f51e278e6a31f38deb24951f220056ecd46b6fee0b0aff1de509e9552eb4f516db7af7daba17d0f7a3e715beed009af42ae7db7a5bdb7ad1ce02e2a8f3fe8a7d7fd34f4f32d6ca965be82c97fe0033d759379641ff5a531dacbb93f5777ec1fb3bb686bddb38de1c07d479859c007859789d62cf17d277c911bf93687d60af56ec6ffb3b15fb97c1f2183b61fa00bf6f5f5b90655f9b4ffbdadc40fbda3c677f98eb893dea7c9ef6b5139d7d6d0081b35c9113ef465a86f7b5939c75635f0b30b66a79ff4f38def38adedcb71200a70e8f1dd4f9b2e37d620b8d11b89ce819235f3fc8313297c6c802678cf0eb00e9873b97f0fd16e6921bc650a0b9b996e766acdb9d9b790e2d71ea2cf4cca1003fa478253d75d3fdea30607fac9e4cec2f276c99a71d96eeff338930fd475b0058379e3f430e4f59f969f2793a90cf538e8fdb36df33e249d198a5883de5890063cae39d12f0e6fdb125b6f5938e8fdb36df33e229d198f1b67ed213c7328f00779980b7e2b82e73e2a816b35ce3bac2e35d21e0ad38ae2b9c38aac52cd7b8001ee6f11e26e0ad38ae873971548b59ae715de9f1ae14f0561cd7954e1cd56200966b5c5779bcab04bc15c775951347b598e51ad7a33cdea304bc15c7f52827008e6a31cb35aeab3dded502de8ae3bada89a35acc728deb1a8f778d80b7e2b800ae71e2a816b35ce3bacee35d27e0ad38aeeb9c38aac52cd7b86ef078370878002b8eeb06278e6a31cb35ae277abc270a782b8eeb894e1cd562966b5c4ff278004f12f0561cd7939c38aac52cd7b89eecf19e2ce0ad38ae273b71548b59ae7100bdc8e3bd48c05b715c2f72e2a816b35ce37ab1c77bb180b7e2b85eecc4512d0066b9c6f5128ff712016fc571bdc489a35acc728deb0d1eef0d02de8ae37a83001347b598e51ad71b3dde1b05bc15c7f546278e6a31cb35ae3779bc3709782b008eeb4d4e1cd562966b5c6ff6786f16f0561cd79b9d38aac52cd7b8dee2f1de0022e0ad38aeb73871548b59ae71bdd5e3bd55c05b715c6f75e2a816b35ce37a009bc77b9b80b7e2b8dee6c4512d66b9c6f5768ff776016fc571bddd89a35acc00728deb1d1eef1d02de8ae37a871347b598e51ad73b3dde3b05bc15c7f54e27008e6a31cb35ae7779bc7709782b8eeb5d4e1cd562966b5ceff678ef16f0561c00d7bb9d38aac52cd7b8dee3f1de23e0ad38aef73871548b996f5cb7a372a17d00f63a3e7b5bb0ed6cf7f8788a628147710bf8241c9f44133e978af94c14f3b90040cc67b498cf13623ecbc57c0689f9dc2de673b2984f77319f3d623ec788f900b417f3d92ee6d328e6b351cca741cce75c319f4a319f87c47c4e17f3e927e600739b98cf5c319f4e623ed78af91c21e6d35acce732319fc9623e6bc57cc68800f9ac14f31922e673af98cfa9623e3dc57c6e14f3394ecc2729e6b343cc67a60098cf26319f71623ee789f95489f93c2ae6b34ccc678098cf1d623ef3c57cba0088f95c2fe67394984f8998cfe5623e53c57cd68bf9d48af99c2de63354cce7007e319fc5623ebdc57c6e16f33941cca754cc67a798cf6c319fcd623e13c47c00d688f98c12f3795ccce74c319f72319fbbc47c168af97413f3d92de63347cc00a79d98cf15623ed3c57c2e12f3a917f33947cc67b898cf83623e7bc57c4e1300f3e92be673ab98cf49623e65623ed788f91c2ee6d34acc678b98cf24319f0b00c57caac57c5688f90c16f3b947cce714319f1e623e3788f91c2be6d341cce7004a319f19623e178bf98c15f3592de63342cce761319f47c47c968af9f417f300b95dcc679e984f67319febc47c8e14f36923e6b355cc678a98cf3a319f1a31009fb3c47c2ac47cee13f35924e6d34bcce726319fe3c57c3a8af95c25e6334b00cce712319ff1623ee78bf98c14f3794ccce70c319f81623e778af92c10f3e9002ae6b34bcce768319fb6623edbc47ca689f96c10f3a913f35925e6334ccce70001319f25623e7dc47c6e11f33951cc2725e673b598cf61623e45023e49f2480010c3eb0f10c3ef1b3c480cbf2bb097187e77e02162cf5af96162cf59f9116200cf5bf951622f58f931622f5af971622f59f90962c556e6fee2ba46febd06dc004bf06962f8fce41962b887c2b3c4f0bef13962f8eec8f3c4707fe41788e11a0095178925ad8cfea4d7ffcb91fb5fc7f2c5b40cda6945ec254f7b2f7abc50e600fd11cb34260abb3f725b8df41ced9592c7f3223e8789f95c2de69312f3395100cce716319f3e623e4bc47c1e10f31926e6b34acca74ecc678398cf34319f6d00623e6dc57c8e16f3d925e6d355cc678198cf9d623e03c57cce10f3794ccc6700a498cff9623ee3c57c2e11f39925e67395984f47319fe3c57c6e12f3e925e600b348cce73e319f0a319fb3c47c6ac47cd689f94c11f3d92ae6d346cce74831009febc47c3a8bf9cc13f3b95dcca7bf98cf52319f47c47c1e16f31921e6b35a00cc67ac98cfc5623e33c47cae14f3e920e673ac98cf0d623e3dc47c4e11f3b90047cc67b098cf0a319f6a319f0bc57c2689f96c11f36925e673b898cf35623e0065623e2789f9dc2ae6d357cce734319fbd623e0f8af90c17f33947cca75ecc00e722319fe9623e5788f9b413f39923e6b35bcca79b98cf42319fbbc47ccac5007cce14f3795ccc679498cf1a319f09623e9bc57c668bf9ec14f32915f3394100cce766319fde623e8bc57cee17f3192ae673b6984fad98cf7a319fa9623e97008bf99488f91c25e673bd984f17319ff9623e7788f90c10f35926e6f3a8984f009598cf79623ee3c47c3689f9cc14f3d921e69314f3394ecce746319f9e623e00a78af9dc2be63344cc67a598cf18319fb5623e93c57c2e13f3692de673849800cfb5623e9dc47ce68af9dc26e6d34fcce774319f87c47c2ac57cce15f3691000f3d928e6d328e6b35dcca7bd98cf31623e7bc47cba8bf99c2ce673b798cf2000319fe5623e4f88f98c16f3b940cc67a298cfa5623ec58e4fa9f37afac1bf6900504adecf04f2465b58379e3f430ef8fd8167c9e7d9403ecf393e6edb298acb000ba2314b117bce13c794c73b25e0cdfb634b6ceb171c1fb7ed54627f5c9e13008d196feb173c712cf3789709782b8eeb32278e6a31cb35ae2b3cde1502de8a00e3bac289a35acc728deb611eef6102de8ae37a981347b598e51ad7951eef4a00016fc5715de9c4512d66b9c67595c7bb4ac05b715c573971548b59ae713dca00e33d4ac05b715c8f72e2a816b35ce3badae35d2de0ad38aeab9d38aac52cd700b8aef178d708782b8eeb1a278e6a31cb35aeeb3cde7502de8ae3bace89a35a00cc728deb068f778380b7e2b86e70e2a816b35ce37aa2c77ba280b7e2b89ee800c4512d66b9c6f5248ff724016fc5713dc989a35acc728debc91eefc902de8a00e37ab21347b598e51ad78b3cde8b04bc15c7f522278e6a31cb35ae177bbc17000b782b8eebc54e1cd562966b5c2ff1782f11f0561cd74b9c38aac52cd7b8de00e0f1de20e0ad38ae373871548b59ae71bdd1e3bd51c05b715c6f74e2a816b3005ce37a93c77b9380b7e2b8dee4c4512d66b9c6f5668ff766016fc571bdd98900a35acc728deb2d1eef2d02de8ae37a8b1347b598e51ad75b3dde5b05bc15c700f556278e6a31cb35aeb779bcb709782b8eeb6d4e1cd562966b5c6ff7786f1700f0561cd7db9d38aac52cd7b8dee1f1de21e0ad38ae773871548b59ae71bdd300e3bd53c05b715cef74e2a816b35ce37a97c77b9780b7e2b8dee5c4512d66b900c6f56e8ff76e016fc571bddb89a35acc728deb3d1eef3d02de8ae37a8f134700b598f9c6753b2a17da67afad0bdf11dedb826d3fe2b4fd88d37692ca2f11c300b67b9158b16759fcf627eab7b7fe740cd41fdc0b0debc6f38e14cb506db77500da6eebb49da2d78b5bc027e1f8249af0498af9b413f36925e6d35acca7bd98004f1b319f0e623e25623e6dc57c8a047c92e4912086d75b112bb5726b62e84f001b6265562e21d6c9ca6d8975a6fe83157bfce0504a0c0e296270e0fb1ec0a1001331387426a71175fb5f1f68bc989629b732c7639095391e83adccf1c0bd8900391e15d436187ef387e381ef28b72786dfd2ed40ac92caf83bc2ca1c4b7c3700926339d2ca1c4b7caf8e6339daca1ccb6a2b772636c6ca5d88e1fb3c5d89d5005ab91b31ac672031b4574e0c5e8388c17f3031f4730831c483ef9900d7a1c400e0cadfb787eb7062b8f7196f831e561e410cf714e7eff9f6b2f24862f8ad2e00fe8e681f2b8f2686dfe4ae2686fb888e21d6dfcafcdd34fc3e472d3194795e00c2328d89c2ce4bdc56233d477ba5e4512be2d356cca744cca783984f1b319f00f6623eadc57c5a89f9b413f3498af914b7a00f8ef7587799e313b2ed52a7ed00d2166cbb8bd37697166cbb9bd376b7166cbb87d3768f166cbb97d376af166c00bb8fd3769f166cbb9fd376bf166c7b80d3f680166c3bce2d716e69a9b6e3dc00a239b75417bcedb1357cde038fa6cec95593cf9882fbd4d486e9674d4d7abd00a3a97f855a6f7a5da39c58d538b14a519dd114bf5101e25744ed62dd783eca00d3f6eb89c2c662e441c462a4c767640bc702ed45e7e81c9d0f2de7d1d1b945009ce3fe1c9da373748ef373dc37a273748ece6f0de7383fb78c73dc9fa37374008ece717e8efb46748eced1f9ade11ce7e796718efb73748eced139cecf71df0088ced1393abf359ce3fcdc32ce717f8eced1393ac7f939ee1bd1393a47e7b70086739c9f5bc639eecfd1393a47e74371ae4bb75d55f0b69737249db6119f8400e3834755e05884e9e7beef328e48f8638cf6525487f7d31101fa5944ed62dd00783e82b643748eced1393a47e7e81c9da373748eced1393a47e7e81c9da37300748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced139003a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c009da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748e00ced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a4700e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da30073748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced100393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1397fe774db0095856fbb3ee9b48df8241c1f3c2a03c722503f6bd27d1a9ef0c718eda5a80e006ff3e101fa5944ed62dd783e9cb643740eef9ca2d78bc927c07e587b30638b007d7a8bf9f411f3e92ae6d34dcca793984f99984f7b319ffe623e03c47c7a8a00f9f412f3e928e6d345cca7b3984f52cca795984f6b319fbe623efdc47cba8b00f9f410f34989f9948af97410f32911f3692be65324e0934cbcf99c55925e2f0026869cbf33b16156ee446ca895cb885538fd4fb321562e2536d8ca1d890db200721762e556ee4a6ca095bb11abb3727762f556ee41acc1ca3d898db5722f6200e3acdc9bd8782bf72136c1ca7d894db4723f6293acdc9fd8642b0f2036c5ca00ed894db5720762d3a88cbfd3ad5c43acd1ca6388cdb07235b199561e496c960095ab88cdb6f20862d877785fc37ba4e1c4f03e6518b136561e4a0cf3490531008ce921c4da59793031c46d1031c4ad9c18e2369018f6c53a62d867eb8961df006e208631309618c6ca38621853e389617f9f400cfbfb4462d8df2711c3fe3e009918f6f729c4b0bf4f2586fd9df725ecefd389617f6f2486fd7d0631ecef330089617f9f450cfb3bf6a5f4b67d62ecfed7b13ccf4968a715b1d99ef66679bc0050e6797826f5a9d1ca35ffdd23330f735b8df41ced9592c70c119fb6623e2500623e1dc47c4ac57c52623e3dc47cba8bf9f413f3e92be6d35acca795984f5200cca7b3984f17319f8e623ebdc47c7a8af90c10f3e92fe6d35ecca74ccca79300984f37319fae623e7dc47c7a8bf9147b7c3a07f269edf8e079e71668bbadd300765ba76d3e7f349b18de6ff0399662cfb2781f89faedad3f1d02f507ed61dd0078ce9f5f846abbc469bbc4d3763240db7cbe118f22e7792395931e9f7685f300a949250e3c6f8cf59716beef757c0ef560face9fab9515dea79ecfdf1e8c0f005f77952abc4f6da07e66aedbede4f4a9d4e9532a71e06737e867a700fd2ca20076b16e3cef44db213a87774efb604cf2e76fa8d751c491e317d0a72ee9f8a4001f4dcd097c6d6897c2fbd4f3e74407e3c3d78a85781f12a89f9939aaabd3a7004e4e9f5289033fe7453fbb06e86711b58b75e37957da0ed139bc338f7f9e3b0051af4cc411ac73589fbaa4e3937e343527f0f5fddd0bef53cf9f471f8c0f5f00dfd6adf03eb581fa9999a37a387deaeaf4299538f07a12f4b347807e1651bb0058379ef7a0ed109dc33bf3f8e7b913f5ba883882750beb5397747cd28fa6e60004bec6b457e17deaf9ba9783f1e1ef24f42cbc4f6da07ed6a4d78bf373af27000a3bf7f57162d5c389558aeaf077eefa04885f11b58b75e339da8bce2de3cc00f30acfc9a8d75dc411ac67589fbaa4e3937e3435d7f0f741fb15dea79eafd1003b181ffe3e44dfc2fbd406ea67668eeaeff4a98fd3a754e2c06b6cd1cffe0100fa5944ed62dd78de9fb643740eefcce39fafcf46bd5e228e60fc1da910638500af8fc6fad3d75abf641737a77d7b126fa4faade92fea5cd0b0bfee3beaf6bb00877a6f8976f138d8f79601f2f1bcdf5b723e1e2aff0dd0cf1a3ea758c8cfa0007ce7cd7b38b1e2f3e6ec10ea9cb47b8e0ccf9b3ad71f9d0bef9cf6c158e7f70096a8d753c411ac5b589fba7ccfb5f1e713013ed3cdfbf309fe4c37d467a80100fa9999a3924e9f3a397d4a511d1e3b21ae23284a1cf8d97563e2c0cfefb01d00a27378671efffcf904ea751571e4f805f4a9cbf7ba0ace0f02e4e3f5fc7dbe0083f1e17cbc77e17d6a03f5333347f575fa9474fa94a23a3c7642e4f9be73590078de97b643740eefcce39fbf138c7aa5228ebef39a017ceaf23d27c6f9788000f303f5fc9dd983f1e17b5c05383f501ba89f99396a80d3a7be4e9f525487c700ce8000fdf49dcbc2f301b41da27378671eff7cbf04d4eb23e208c6e7c9438c0015be5f01d69f3ebf36c06e3690f6ed4dbc91eae3daf0d654e792fafd7507590099afe7c775c0fc9d66beff463787f1f9a0c64461b703dac2baf1bc3339e27c0040376270e37b8e747658c873059d1d6f3ce71cc6d717b8f1bd4ddcebb242e500ccbef3427c6e038ebebec08defab927258c8bc27e578f37d65e0e8eb0bdcf8009e2e4987857c2fe4e6b878de971c7d7d713fc3e4f70d7c2e2cc47b02dffb5e003cef478ebebec08daf8de9e7b0ffe5672fa559fad295caf0eeefb0ffe5f1a800344b5fe0c69f750d7058da7b60206ff7bd079e0f2447b72f21af0fc0778bf000dda9569e58846abbc469bbc4b36ddcbc87b7177f3f07f1e373e1e556f6dd2b008bef8135d8ca7c6cc4fd92f87b60b8af121f8b70ff253ebf85fb34f1dcefde000f3ccd2aadcc732ddf1f0a7f711f299edb465a99df0fe27ee73c978cb632df0053abdaca3c76719f2bfe6cbad8cabc3db07ff0bdb7f0b927df130af7a72a270086ed3b8818de8f0d2686cf53f99e5578ffc6f7b6c2f6e77b60216e7caf2c6c007fbea716fa5e490cdb86b701f609be9717b6f54862d84f4611c37e329a18b6000ddf430cfb22b601be5f18ea33628c253c0ee633e254e2c0f7d470c7eb7c5e0022c467b7be6b5fddf7b97ced2bdf5b31c475a5858823df6f31c4f9549e63b1006e3cef4dceb97225dea6458930dbb4b5e3d28d38eaecb2dcac5322d8761dcb000ec54e3cf87a890079520de749ad1307e61b1c27d4b98df25dcc7bad6cb9de00ce729c1360dd58a63df194b36ec43a403ebb92bddb38de1c07d4b98b9c7cb90002e625ac83731cfe2c25546eeefab87de16d50e2d449527f51e741671b04c800b956720e806de0e629ada9ce23ce3670f3073e36a41f9caff179a10079585d0053db00ed71aed6d436409da79d6d10200f5bc97981bb0dfa9313ea3cef6c030037a7f06d03f487738a00b9597d53db80cfc1a25f4d6d03d479a7b30d02e46600996d506eeb72b7c14072429df73adb001c5ebe6d80fea06e3b2a37260ad6970086a6b601da2ba27e35b50d50e79516da06c80d9ada06a8f3aab30dc0e1e5db0006e823ea863c07972dbfe5f8e2f8f4693a07bdaa61bf2fe62dcefdba394ced007c73a0f747f5bef70b78efd289628a3a5f76f6d900dbb93ee439f301d4a746008a33f71575be41fbcfb7acccfb0a1fe37fe9791d8f83bd1ea5bcf07daef18d00ff724fdb83c9b5406dd772db45f60fed80f3dcf30b7aef8d7a8807625d6e7f00d36304f317bbbbcb7573964b519d819efe37260adbff72c7a7dc714e6f93ef00d27e86fd28e4fc3330e18f517b8ad1402ae32fe6463ecf87d779de0cf59dd3006c9fbff07900309e4b51eeeaf1ee2ae0cd9fd3f1f57221be9fd5d47c8ff67800beff570bcdf7a13e4372e7fb6e9ebebef11e9abe57d2cacabcaf74a6b875f100bc8e479cef0f6ebeefdcb0bfae3b6f23d6e5f6f760e7fb94b39ce27c5f42fb0019f6a390f3cfc02c31f2cdf77c7d1c7f4f23fde0cf7f437faf88cf2960dd7800ce732518cfa55c76bd4b05bcf9fc0d5feb17e078dfe47cef3b1f38c4f6c7d000f37da8f736ee7c9ff2f415752a691c56d17ceeee53e9d7277a5ec723cef7070037df4f6862be47accbedefc1cef77d9de514e7fbd1b49f4da4f93ed4fc3330004b8c7cf33d5f9f89b9913fffe6eb98e0adf0fe9ee75294fb78bcfb0878f3b900627e7f1fe2daeea6e67b3eef8d3a47b7d07c1fea5a2b77beefebe92bea1c4f00e3f044cffbf76e14b7a5f1fdbd37def9ccf7a73731dfbbe765de4aefefe7d1007eb654ecfd7d6f62fcfda1f483afbfe07933d475a9bd1d6f3ce7b9d2fdcc9d00cfe5878ca9ebe65eafc0e7f14b9c3a58b635d5399fe6d9a4a72e5f6baf762f000b3ef7576c7ff93a253ef7a7709d12ff2676a8eb94fedb38f2ef6487b8e75b005122fb3def7b9273aefbaeb4e4754aeef965be4e69bbf33e25c0761dc70ec5004e3cf83aa500b9eb01f724c67b99ce4edbada9cef5746cc5fc8deb94dc7b580014250efc7cab3171e0fb50f04eceba11ebc2dfdfa5b68ebddb38de1c07d4b900819c7cefb9312f611d7cde9ffb1aea9ebdae8fdb17de06254e1dbe860c756e0077b641e1ef33515be7cb15dc7c8f7385bb9d6de05e0f51ecf427dbb5620172008cbaa6b601da2ba27e35b50d5067afb30d0a7f3de9be6d80f75aee36e0f71100a8f3a8b30ddcef39fbb681fbfd8c50f73e686a1bf03d27d1afa6b601ea3ce3006c83c2bf17ddb70ddcebf5dcf3b37cbdde0bce3670afd7f36d03f79ab9409f00793534b50d9aba5ecfb70d50e75dce36287c2ebf6f1bb8d7ebc1c597cbbfec006c03f77a3ddf3668a1ebf5c636b50d9aba5ecfb70d50e7c32db40d902736b5000d50e763ce3670f350df36401f39570ff53dd36cdfc3e2f8e23dc2672867df003b76bf2fe6ad5cdf4d0ef5be22dbb562fc5d41df779351c6f7798a136fbe6f0058632258fcbde721ddcf13f9bdc5d75ae83c64a87d8daf27684c1c98f381a300ceb7695ffb2e9d6774cf63a75fff8de7753c0ef63c648039aec637570cf0b4005d4eae056afb80735e380f8976f89a56947f4db912ea211e88357fc7d5bda600d8b75c3767b914d5e9efe97f6322cc796fac7b80e39cde263fa0fdec3774ce002cd467affdb3c488c73deaf87e138aaf2bc3f8e13936d47766b39d5be2f3a30060beebcaca3cde6502de7c1cf05d1fc1c7863e4ebdc644b0e39af7d880f63900f77f236fb3e371e86343a863b87b6ce8e6e92bea948cdd1f977656e6fd8aaf0041ebe9791d8f786c38b863438fb1fbeba21ee28158e77b6ce8e12ca7786c4800d27e86fd28e475f7fdb3c488e758f75e1769867994ef4180f1c373ecffeabb001a29627caf1af77e3aec1dfa77f30ec63b9fbca1b353af3111f61c927b6c4000fb688f8f0d552d746c08750ccf9637705f51670c8dd95a9afbddfd2f1337cf00eb78c463c3c11d1ba637716c40acdf8a794303ed678d746c28fc67104de70d003cc7a20e5fbf807994f3062cc3736ca8fb4064bbff1a3bf27c8bbf2877f778007717f0ce76df3894f9d8e07e1fbf31d1b2df5544fbbeef2ace6da16343a8f7004cd9f206ee2bea9c4c63f6549afbddfd2f73fd8ce7753ce2b1e1e08e0d673700716c40acf33d36b8f986e2b16109ed67abe8d810ea3aacfe5962c4732ceaf00075639847f95e635886e758a56bdbf83d792f8f774bdc2b3297371f07f878e100ded7b59896e1e358a0f711de6383fb9d1f3e365cda42c78650ef99dc634367004f5f51671b8dd9ed34f7fbaeadbcc9f33a1ef1d87070c7861b9b3836b8e786000ef6d8e0deef45f1d87015ed6737d1b121d435a1fdb3c488e758d4e1cfd631008ff2bd59307e788e0d754ccbf6fe9b3f3374cfb9f8cecdf0f9a3768970c70100de867cdf2dbe2f20d7e1eb9650e7019a6f53d407befe796f0bbc9fe0eb761b00136fbebe93cf9d953875f8da5dd4798cfa95f4d4e5df390cf4bd84cc75dd830012073e9a9aabe190a2e5782ce075bc96f61e5278efccf618ec38e2f910720400e3ebd702c431e3d3c6f169e3c42c64db6d9db6dbb660dbed9db6dbb760dbee0075a4c9166cbbd469bbb405db2e73da2e6bc1b6b31d835aa2ed6cbf71d8126d007777daeede826d67fb4da296683bdb3de9f9588047710bf8241c9f44133e8300c47ccac57c7a8bf9b4c4713a1f9f1e623e9dc47c3a8bf97410f3498af9b41600f36923e6d312df03cfc7a7bf98cf00319f5e623eddc47cba8bf9a4c47ccac4007cda89f9b417f36925e6d357cca79f984f4f319f2e623e5dc57c3a8af9f0bd00c3147c4ac47cda8af91409f824136ffe0c833f9b282686cf0a5a11abb0726b006243adccbf6180df34e3df11c06f9ab5255699d81f1330fca6597b62f84d3300fe1dbd9154c65ffca6197faf74b495f9bea5d556e67b34e137cdf87b47355600e6fb2dd45a99af81b18fa20eb82edd6e3b74c0fdb1edeb62075c5b691f751d0070dde2382bf3f5f9e3adccf75f986065beae65a295f97e8393acccbfad876d00cdfb06b635ff9e1db635ff9e1db635ff9e1db635ff9e1db635ff9e1db6752500316c6bfe3d3b6c6bfe3d3b6c6bdef6d8d6fc7b76d8d6fc7b76d8d6d5c4b0ad00c710c3b6ae21866d5d4b0cdbba8e18b6753d316ceb0662d8d66389615b8f2300866d3d9e18b6f504623857399118ce1762dba7b7c5f727ec7f1dcbf398473b003ce62779da9be8f14299e7392cd39828ec3cc76d35d273b4574a1ee3457cda008af99488f9948af97414f3e92ae6d345cca7a7984f3f319fbe623eadc47cda008bf9b413f32913f34989f97417f3e926e6d34bcc6780984f7f319f81623e6d00c47c5a8bf924c57c3a88f97416f3e924e6d343cca78f984f6f319f72319f4100623ec52de883f36158f744c727ddf6b8c2b75d935eefd882af7779e67ea738005f89ef85c11fedb5a63a9fb11771cf4a7078e11ce238da3e880dea16d3ba79003b15531dbcfeba71771d8d16ebc2c7a4a636bddefa82af775faceb9c58c3bf009e628d3a5f75620d9e70623d96628df8f0b96abcbf1b476d7fd39e04da5f9700f1d8455f5d8fd654e73fe3f6d7fdeeb8fdfd196caf0fa2fe54382cdd87a18500ef4366bca32dac1bcfd15eda119fa15490cfa0403e786f8cf9b08d2716a1da006eebb4ddb605db6eefb4ddbe05db4e3a6d275bb0ed52a7edd2166cbbcc69bb00ac05dbeeecb4ddb905dbeeeab4ddb505dbeeeeb4ddbd05dbeee3b4dda705db00eee7b4ddcf699bbfa3399818e65cfe1cbbd8b32cce41a37e7b6b2bdb310aef0037f818553c7e7fddbd13f6c724c0f1732cbb1527fcc7cf30ef53f6dd2b80df00fb35523b7cec7ee3336d134d2f87cfcdf15b2ae39de5f87d0cd68d65f85e000075ceba719f8900eff732f76d47ffb06eb4c3f9073c4b12d9dfbba14e27c7bb00b6e0defef79370a9f5c4b21b3935f57e12eb28a5fea36e98beec9b035c1fb7002fe93ab856a3c4a9c3fb14eaf475b6c198827befdb06b8ce04db002e63c8090075063adb001c5e939cfe94527f50b798ca35149b625a0eaf237faa71d65b9400f0ef0388e758aa8775351573d4a974625e4deb6e84f37ff7a8e36bae12e4990070fa92706291f6195d789f7abeceec607c46934fe1f7c97df96b807e66ce4100e0daabd70bb8de74ac463ab1aa766295a23aa3287e2303c4af88dac5baf11c00ed45e796714efb60acf3f57ca8572fe20836867c028cc126cf418e0edb764d003aeee54e5be963de11e3f7b71be0fd59e6de647ceeaa913cf87d2aea3c3161007fdd39e6564aaff3359b750e6bc9f737788ef64aa93ffc7e2bc07bfc03f62300e45c133db108d536fa89758f156bbbaef06dd704dab732e303f38efb1e94f30000d459e4bc07058717c609bf07456c787e0b314e02bd67ace7791c31827f3500c50875ce7062343a4b8c78ec22363c0f8778ffcbefc30a1da3914e8ce03f8a0062843aab9c188dcc12a36a8a917bec0c79dce61ca6919e73db01ceddd4f277003d12e49070e283c7b8c0b1e0ef991c8c0fc727c07e56cbdfe939181f7e1f5a0015c867541e3e55e43322904f551e3e23c8a73290cf883c7cf8bb5ec303f95400e6e10387f4fb74f7589f66181b638861ffe4bc08fb4803316ca7f1c410ab620062f0c57998526283ec2f6f773ee71e620c16250edcc71ae9f92872445faac200fa4c601ff77c378fff10d756f0b10be7a4c7396df371ef763adf8d7dab55960018facea563193edf3dd6597727a7bf388615a0bfb561f2b4b19938e23b816d009c78700c50e71ea7afc3023805ca4933e367a8b35d4778fa8a3a0fd267470f0059998f839514b7173dafe3d1d43c87f8a5fb1ce07ea399ed3b983c1ba91d6e007b32b916a8ed03ee758a73d76807bc35955fa0318a7a8807620df7f43c87cf0005d9dd5d6ea4b35c8aea5478fadf98286cff87383e431ce7f4367994f6b31700e9bc4c88e3b0effa18c4a88a62843a3c978d7096437dfeac07dba9c4a98365005b539d77b7c05cc2631efb3f5c869113eabccf712afc354afbe6b7c2f7f5c0006deb1eb7b8afa8f30aed771fa1f90bdb8cf3ca2f795ec7a3a9f90df10b745f00851a1ef3d8be833d6d4f21d702b55dcb6d637e433be0ada9fc459adf500ff10040ace1ced7a8b1bbbb5c95b35c8aea0cf1f4bf3111667ec7ba073bcee96df20031dacfbe44f35b88bcc737e7ba73508aead4536cddeb09509fe7378ca712a7000e5f4f803adf70e692c29f27f0cf6f70e1f7c7a8f39d169adf429d1f72e7b7004a4f5f51e787b4dffd98e62f373f4abffe27cfeb78c4f9ede0e6b73f3631bf00b9f3d4c1ce6f239ce514e7b79fd17ef6a71678ff36244b8cf8fc08ea8ca1d800ba9f19f8aed571dfbfb99f21f0fbb77f3a7349e1cff3f9e737b8549113eafc00a785e6b710e7349b7affc67d7da30e7d665a42f78ec1361b4171ebee791d8f0038bf1ddcfcd66dc2febab9e6a9839ddfea9de514e7b7f6b49f75a76b685bea00fd9b3b07f1fc369a623bdc590ef5797ec3762a71ea60d9d654a79ff515734900e1afcff0cf6fc39dbef1fc56ee38859adf425d0793edfd1bf7f58defebd07e00379ce62f6cb37a8adb38cfeb78c4f9ede0e6b7b14dcc6fee3c75b0f3db18670039c5f9ad8af6b37134bf85f89cd037bfb97310cf6f0d14db4a6739d4e7f90d00dba9c4a983655b539da92d3097f098c7fe0f173e178f3a331ca78a004e61fa007ae0b6753f5fe0bea2cee1b4df1d49f317b6195f1fb4d0f33a1e4dcd6f81cf0071d7f098c7f6f59d5f9f4aae056abb96dbc6fc8676c05b537901cd6fa887780020d670e7efb1b2bbbbdc7067b914d519ece97f6322ccfc8e754f769c33d75300d27eb690e6b750d7ea0dce12a34a8a11eaf07775dccf17509fe7376ca712a7000e7fbe803aa73973c9f882f7d73fbf8d70fac6f3db192d34bf15beaffef9ad00ded357d4398bf6bb55347f619b0da7b85dec791d8f38bf1ddcfcb6b189f9cd009da70e767eab7496539cdf56d37e7631cd6f21bea7e39bdfdc3988e7b7e2c400fed816faf385ad2d3097f098773f5fe05c0e75b63b4e85bfa661dffc56f8be001eb86d31bf8df1f41575aea6fdee5a9abfb0cdf8fa903b3dafe3d1d4fc16380047aae1318fedebcbcfa6916b81daaee5b631bfa11df0d654be83e637d4433c00106bb8a7e737cc15ecee2e37c2592e4575267bfadf980833bf63dd531ce7f40036d945fbd99d34bf85fa7c61729618f1e70ba853436c9095f93ef15886af8d000c352fbbf3abefbc2118bff7087c5f8003ee898575bbf705e06b0e4b9c3afc00de0a751ea37936e9a9cbf70bcaf63daa5a8785dc36680bebc673b4c7dfa3e200e3a1bb5cb995f93bd16e4e50eeac877382179de353e1bfebb1effbe5f97c6f00e51de4c4cbc26b92d39f16fcde4ae6fb25a39cbe947bfa823a2f3bf10df19d0097407dadf55d533cd6d357d4f910cdcb1fa6e33bb6137ffff18b9ed7f168ea00f8cfd75107381f59c3e715ddfc95db1e4eae056abb96dbc6f1df77be12e52f00d0f1dffdac07b1867b7a8ce03353767797ab75964b25defc996bc863ad7bce006384e39cde26afd27ef6453a5685fa8ca62a4b8cca2946a8c3df2d0c75ec7400bffb090f3e76663b06f075dda8f30d9aa3f83d01ff7e8cfb1953a0b9ac96dd00b16e3c477ba9c49be7fba4a78feef7bafb06f26de3f8e239ffa660a8b6db3a006db76dc1b6db3b6db76fc1b6934edbc9166cbbd469bbb405db2e73da2e6bc100b63b3b6d776ec1b6bb3a6d776dc1b6bb3b6d776fc1b6fb386df769a2edf28200b5bdbc21bdde0105efd3f286f438ed9738f0d1d4fb3dfe9deafe05f7a9a9ed0060eb4e3fce5ab1feb835eb57ac2b222fb8bee6b816250ef4c6eb9d881553b900152dd7dac34a3cac9d8775f0b08e1e96f2b04e1ed6c5c3ba392cfde841e59e0054ee45e5beb40edc7fdc1717d4e1f8b57a8b70f7916d3f0933be9abebfee800016683bdbfd755ba2ed6cf7d76d89b6b3dd5fb725dace767fdd96683bdbfd75005ba2ed6cf7d76d89b6b3dd5fb725dace767fdd96683bdbfd75d15e92cafcfb00ad381fdb9f58b16759cca3a88f7bdc1ef0682c60877842771f7cb09fe3a977008ef5001f52cc5dbf66edb2b35694af5bbd667d794df9f9fff7ffb2d5abd76c005cb1bcba9c5f5b577ede8675ebcbd7ad5fb6767df9cab56bce2bafade6f57600b188e0203a63edda659bca579dbf7cc5c5e56b36ac2f5fb3b2fc8c351bce5f00be8e17ea670b21eacbd6af5f71de05ebcbd7af295fb67c79f9c655ebcf2e5f0073d18ab52bff4f88977b9f7d9437e8cdcb9db761f5fa5517acde947de10f550034c3f473ff4d8baf5534af9b5f6b8ee90f9ad9d8adf5ff450fefac6f86e90300f5cd337db8398d3dd5ccc69e6b4e63ef686663ef694e631f6a66631f6d4e6300af3567a17f3667a1c10dcd58e8a8e62c745e43f302789d2dd7ac11b3a739a600b735d3f4aee634f660331b7ba4398d3dddccc69e6f4e63ef6c6663ef6d4e6300af34b3b1579bd3d8579bb3104e3ee7b5d088e62c74527316dadc9c85ee1fdb00bca83fdacce53e3dae19925f69ce421decd38166cd3a65e39bd7bdaee39b6100daa7998d0d684e63c39bd9d8a9cd696c5973163abb390bddf6df6cedbb9bd300e2bb9a19c8979bd3d8d79bd9d8b79bd3d83f9ad9d8ebcd69acef84e63536700042331a9bd2ccc61a9bd3d8926636b6ac398d5dd6ccc6ae684e638f36b3b117009ab9dcdb9b23f9dee62cf4f53c0c13ff0f8f97b7576c8b0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file +00000000e7af816635466f128568edb04c9fa024f6c87fb9010fdbffa68b3d9906e2af08f53b9a05db4870972b4a9a663a5ffb54e962020d4efe3f1b9a21343f2ee0a6721704053281d575f82984fad809a7cf5b1f2d47971e1429fbe2eb15782b8dfed76d4d8bb88895927b771bba06907cefe8908604a485d34d39d88c66f528914d31533b25309c8e37f0eb04595c4ebcdb749c74ed4d344e19a00bccb0e60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000beda04d21a8b89c75f0ad79c19ba53a8bdfcb25bd4f8d33bfa11f1f52528a8ee58fc25430000000000000000000000000000000000000000000000000000000000001bde001f8b08000000000000ffed9d5b8c24d759c7ab677aba67a6a77b76767766e700b2332e2305450a123dd3b3761ce5a113040a020564a3480829d12ebb0e8e8c0097d863122362c4ed21912081806c88201188f0406cbfc00b029470110e128e00a548e422140b2c0c444402e13c6615576f7ddbbffee6abeaae9ef3d554db5300d268aaab4ed5f99fafcee5ff5dce39b5e8f6b1fcda5f2d3d5f50ff79489a7e00fabf7bb2633fe0bbba9e386b3382736e4670ce07c499609b8f7ceb69dd41ae00a1312ecc00c646e0ef2e18ebe979f3b5bfc5d7fe96a2d13eedce11aa203a53000a2c6984f3e9fde4a334703f0be85bf0bc1cff8ef3adf4ff3b1e7df4ea13f100438f5cbff1e1f8e6e347f1cd07e36b371f7fe4fa637cf0bfa77df07fa77df000c3f3533ef8db78f0eef4ffd5a3a31b3ffb7347f1d1cdf8b1c7af1d3d7af5a7008fe20f3d74f433f1cd9fbff1e8830fdffc105ff0f4b439ffff4973feceb43900d7eb533ef8fd78f0f271c857af5fcf46fbce69337dd7b40f3e7a02b4bf3a6d00a61f9df6c1cf9d00eddf4f9be997a67df05fa67d90acae6831b717a6ccf407004f90e9d569337d6ada079f9ff6c1574e50cc071b5366fa678de933fdab693300fddb691ffc8f13a0fdceb4992e36a77c7075da07ef6b4e5fcc07a6cdf4c9130064fad16933fdf8b40f3e7302b49f9f36d37f9cf6c1178a3c7887c47d357d6a00116fea478148e85bbbd71a7839496872b4a2db449400926b425a6ab82683c9001cae495f36bf387c45237c190e17813dd87b5f23e8ad61b1efe06ee15cee2500796fe35a3d7c19ef5d843c83bdb7eb26bb816625f211adb289df22aba5f43c00a075649f79d7d2bf25e419a5df48ceb79056d2893ce6f08d93a31d0dbfff5200ce735ab1eb204dc3287f3f0a5bfea6c2d3549817524cc9b196dc5f1cca45b000b5d2f35b5362bbf6d6836bfb37f6efbb72bd7bf5e0c12bf75def1d5e49deb1000c0c521724af3aeeff39d2ed0197c82fa4458ded2b745d6ca26c35e0673b9800c3b70a93f7fe21fbe50865e3d1c7f91cf0cc07c7d3ddf729e7ed6fb70cec6100de7be54a22ab9692555dc9aa8334c4d072905f0df9cabbe577cbc83b9c2cee00b991e4bd32812c560c3c2b25cb62c5c83ba02cae2579b7279045dbc0d32e590016925f51ccad0a605e54e761f2bee7c15a341cfbf264d131f0744a9645c7c8003b9c2ceebd37c97b750259ac1a78564b9685e4571473ab029817d57998bc0f00063cfbdc04b23867e03957b22c24bfa2985b3388b95d01cc8bea3c4cdef71e002679af4d208b3503cf5ac9b25833f20e38960c38e2f9096471dec073be645900487e4531afce20e67315c0bca8cec3e47def7d49de172690c50503cf8592650071c1c83ba02c06e3dfc5096471d1c073b16459487e4531afcd20e6d50a605e0054e761f23e1cb4bff50964b16ee0592f5916eb46de016531e0021b13c862c300c0b351b22c24bf049fd8e43ee58a67ff4a4be1498e3c1b9c6068e17c0e182f0005c7d8edf2fb5c425e9be1f3dab7ea8bfcde74cd7b7fe0ebd80e5fa6c118b40093be4b7c1ddb4699c44719dabebc83f7d6908f5cafe3fc69a49574220f69b700823dd161c4377239e7b90df55c0769b68cf2f7a3b0e5df5678b615e6e49bfc00067078d4ad49ea75c249ad7ed9a11f1cd8feb53f77927ec7a98fd9772a6797003e8569fd54d651c37713cc4d25ab0ed2b08f3ead7ef30cf319e62ccc8c656800e29af883a5cd277de5d7e787781dfc5807c93b97a3d123af6f72f645f45ad100a89f6f1c1edaf63c7c5b4ee5ecd28710baafd4f6f8969255d93e04edeb92df00793e8433cce1312718a4adb7f05fd22d57046399bedaacd89cb66fde5dc6e400c9fb93df5f46be0efd598f7114a21f2d2879d791e6979bc3b45f015e1d679100558fbc7cb459f5887ee2159c0b9e65273c526f449f6c1ab2081e6fd91d8db70009f8de1e652cf5a4a1ca54479a97d3fff4cb459089fe5e527fe49dedc86e7b001edfcba95ef6382688cc047f07329334df1c23b3acf1651972d2fda753d90e009c7ca73dfa2f45661d25973ad2fc9fbaa765b6962133f60b222bdaf23d62c4009277ae18182385510e726b0fdf6c516e4df978f8cd5bd1e8f71a87c7db8fd8008a8ed7ab3c3cdebebc5634ea671d87c7db9fd68a467d9de3f078fb5a5ad1a8001f6c1c1ec1c0d848c6845bfc5dea27f9a9d491395c93ef348f6b222bc6715f0000ce7e14440edd2c9faa477f5d54e6de6dd6a99c5d6b2cb9a8cac4fad1443900bde26a74cc93fc5ec3772882b93d8398572b8099752e0e9677ef1e271ed24b0064b60cb9b6947c592e07bfc041511e44ff87c7b8e1e5ff48ca74499569459500a983341c173cfc3c79b6e84bf80e4530af550033bf5f1c2cefde15279fc08100b43f91eba6922fcb253eda9036617eb744c7128e427f30fdd681f21df1078b003f5cf2113c75a4797b6d88f16de939ed64f48bbcbb36c4eec0750f18f311a1000c3cfa38f7e6ba4ee5ec5af18b1baa4ce4b2f328a757fca28e6dd3dcb628e6004b15c0ccef1787cbbbe7c4abeff45922d7f34abe522eb64fb9a6dba783cc0700ed93717fc9719abab15339bb56acf5ba2a13f5cf3994d32bd65ab73d1ddb5c0014f3420530f3fbc5e1f23e74d253eeb44f91eb9a922fcbe5e1674ede710edf008f768fe4a8e3fed318d7aff9f60bbd3752bfa0f566ab8d95699fc86a6379ba007e1ee632ec13a13197619f1887d9a72fbb6d9ff0b029eabeec9c922fcbe5e100db6a45a3beb6e4c8eb3318cbe1b1d68d5339077d865e3740c7a7d0364efb8400d7ba011d85477eafe03b14c1bc5601ccfc7e71b0bc6fdb273c6200a5fde93900da56b91cfcf10745d746614c85471feb54ce41fb6ba832d555993a48435ddb00217664509797151ef9cd757d8a605ea900667ebf385cde3d6ffba0c87553c90097eb9d6da86b09a7fe9b334e1de2bd679cbaa298cf3875f1179f71ea91e38c005347679cfaf871fa9c9a63ba5cd363ba87fdb0681c8fd50f06c4b3ef544e73004d26bd968315d3e5d42fef5b639f5e9ba728e68d0a60e6f78bc3e57de8341700e540c7c4e89860ae77a5c7d0a47dbe68f89f43dad7d91f96e1bfe4d1c739f900981ced8ae1d9a8189e858ae159af189ec58ae159aa189e32d6882a82a75601003cade8383f613c3ad74a953e9cf18e73c6fbc4be467dfe2f9ac3fb3226cce1001991cb3cae696e4f0cab06d60eaec998b262bc8f72f79a47c7bcfaf8cdf932003585f1b4f19caf189ea58ae159ac189ef58ae159a8189e8d8ae169570ccfa50072f01c700e73045c3cfa38779ed37fc0f166123cb4937acd672c62d3e37c46008f79bc45e7333acfc5ee155d4b85fe2a2f9ba7d79c73f151855ebb644bc94a00fbc03a48c3f5dcb61ce467f93ee537f7a939c3ec8f99eb8270cd09ae1f5005008c72ade98be7b0e858c5b91e1e7e79a77276398744dedd36e46eadf1e8b0be00e4bed576e437e7ba9c61f6c7ccbc4f300ef5f405ce53ca93c58e8167a7645900ec000f397372b414de2a60946be43ee1fd7ab7ede7796b6fd502e7253c941c00dca13f3c28ca799dd77cedb18e4d82e732f078d443a7720efa845d5526bd1e006f0769d83fee3a94b3161d5ffb577eefe23b9c61f6c7ccf62f585b48d7aa080046bd16b5139e8396c2931c797dc22ef0dc151ecf802bef16c07317f0ec85c700b3ef54ce411f15ab32edaa327590866d277628670df9cabbe5778cef109f6100ae1ce6ed0a60669f25585b4877b92218e5da9e339e96c2931c79fd586c60240017bedb09635c00e3ddc025cfadfa62ec32e64ede9ff8849e9a1be6eb302e0e00d63adc437e7de090fcea48f3ae8561da4fa5d8dab8cf357c77d4354fbd5ceb00c65a0f6ea33ce41a5e7aa7e68b3a6ff2b3bd8aca8cf6845dc851ae914b6a3e004c7b7c3f30ee2c9d7e1318a50cd435bd6cb059fb8bd0cea1796ed564463b8800b5bf4b8c6bf20c39e93ad2f5c3e01e7047eec914236fc9af168deea3c0b2f2005949f397699f95f45f5f9c1b96dd6a8bd49ba49c55f83e79fad32cd42bb6c500381c9e2e39c59651f6d0f6b558959575ca6a3b09968df058f66baa8c6c378200816de005b4819bf3c7e5d48fca190b5947acf6c7bd49b4fcfa918ffce4dd7a003db40eaed136e0653bc91a53c6b57db9cfb6ef612fc8fbae7bc028d72cff48001c0e4f97fd9ebc3fa9df2f19fc3960bec7f8731c1defa7c99fe7c19f5ff6c5003690c99ec292e4fb0af2dd7192c9ae9289e0e09e7392e6b9fa30ed37d17f5200bf96ffdbeada69f23a7261722639bf0bd7f2781479f4babac6b91cfd286cf900f41ea57a3f52c6015afb84c6e1f078ad4975f806995376b89ae2dd54e590b200d78defe8359666cd5be6582aed976d9c7b9b0ac6d3da0fad836bd4d92f2bb9005267679bf5e205593a3b79815c636cbff445d4ede3f49c5cd9c1d67050d41f004baee0d0f7f5388e4c8287eba87af5091eeba8727c0f1d13a9b9dfb69215b9009fb36f2f77add33c1fee19e6f0982d7d9f63f056453096b416ee080797f727003cf7cdd0bbabc0c11f0707ffbe141b39386d61966dd56b9ccee2e0b4f55a1c005cdbeeaa664f684776dca2b71c6b39729c757d24341e6dab2b33ef2c9eb70e0059c839fda856cc8fde63c38bc7e4f5bde4a272cdda0f9e6d54efd37eda3e1c00b9463d46646fd5895a408ce4eb960e17473e6396bc3f1917ee9f3ffe1d02e600dbe377d06316edd892e60063d67b3066cda22f7a56fdaa966d6b56edf9673600f591a337a9dd807ea459b5db7acd15726aaf3df21389dbd1edb58e344fa4df00276b8f526d0fdb3564a6c73f27dd659fe3cf0ecaf864c574a697e687697f65008af1c7abfe678d3ffc96938e3f5a27386d9dc91a93e43cc6357986312a0efa00fd88de22f1ac7adf1fdac41b699a8baa6c75a4f9644e5b9d8b8eeb21fd689400d387b4f5717e523f0adbd624ee53c71dae422692e6f77264c2f95afd80189d00ca3eb2577c3d1aed6f597649f387e8673e939e733d1ffa9f9f33eecb9167e300660caed73ae34de0ec47c7f721e73ce0d0f1314dbcb7161d9f135dc7f9b3f300c3b47a7eb5c89afb9dcb1a2079eb93afa9e7382fbb0aeb9327dfe48f51cf9e00c358ebb57ee34a868cc8d1258de5cbe2dec9717a5ec6bc06ae89d98f46f75d00153c32ce4b9918835e867f53f292776bf950665c2fd3eb5b6f29996da9bcb300742fb94ffe715a7bec727d53e739ac876fa439ac5aeed6dc4a49c37547bdea006ad6bcc5bcb570f3302fcc20e6f3338879bb02985bd170ad3bdae0653d3eea00b35f0757e3da2c724dc6e6255c9b4bcf9bb826eb3e323d753c192f6b2aff38003a1e1f58479a97c107de92da5ab3ec3b558a95a72e6bd929a9df6ea86b65f80093e4dd5a8fa32e4b9d57ebb2f4fdc4c0edb057e4884f477885d419ee7d2b6300a4e8b7724fd2d691e6d51c5dae1d8d7226f9afd7ac77d2f906e5e57a72fde800f89a1d6d60e77aacabaaccfd14673b3cce1ef9f382c249dd52d2dc1a63ffcb00e2e27ca7de278065bea8caecc0d172cbbc669479a19e5de6c5c865df889e27003fd536036bdff23beb91c137b6929ed3174c3be78e715f8e3cce49bdd561ad00c091bdc9e47b378dbcebc01a28ef91b5d5c46620f9c8f53aceb7ebc3b47525002f91b5604fbed132de91f5dc45f55c273abecf19cbdf8f7c6c26f26eda4a920023f926aba867528f3cf9d772868cd8476bbb12f571c64254694ce1da50964e004c7e65e9c45e3139593a31e30fe51a6d0bc25568cb89d373e12ee4955ebe2400ed534ddead7d3ae4948d289b174b9a6eceb89235e7e649f887b42fb48ab16900797e96598a0fb3e2a4dad1a82f2839122ea3396b3f72ebcb7aec13646c93fc0025bf3ad2fc404e9db3fa17a97bdc8bc0dabbcec36f42aea2cbd641d924cd0f008fe1691efcd9b3afe7de0bc97bb78cb24b9a7763fcfc71f030f9468c877a9f00715f8e3c9ec67568cbe669ccbb0a3cedbd393c4d645d94a7adaae7aac8d31e00403d7bdf29f0349111fb014943fbba5eb3927ecc32e257b3f614b3f600b578001ac7718ba779f993b3781a79a6de9b6d9c2f8df39e1ce67c1e8b174edebda700f0d06ea6b919e7364a9ac726e4669c8b71ffeb60be838e959e05dbe61cce3500e772e090878cc3d13127ac4b92e6d7c6702e3dcf55c7c7917b729e91c77ed8006c4bba6c17503649f3b1319ccb63de6519fdb6b68db1ec92e6e3180b7f0b9c004ac7030fe26d8cfb72e4712ef69d0e7d7ed78a9f5a35f26e036ba0bc47f6c60015ce25f990e3caf9a7c1b9249dc843c73dd1b64eecfab94df51cf76238679400bf1f9563cfa1def33ba8679f01e7f29a77702e43461cef250dc77badeb73ec00e098e7b5565ed6d8c179f7728d3e5ec67d86c4c3313879f79e924f1e27916700c9499e99909350d77bf38cc7d3677192598a27a6bd88f3ace4daba51be0b4600f9bcfc4159eb6cac01a39e7f57b29debb0a89deb1f0adab934bfb2ec5c94c300389fb2973e9c355e70ac5b57b83d6d8f9a3b58df44d2bc38e69b7454d9749d006b47c7fd1d51346acfb56c935e3a4056d92f1a65ffca189eec60433c2cc39f00a36d932cbba4f957f0976f8cb14d7e6b4adb2463bf1dfcf15ddaa2e47baf180079333e3c50de237630e1c9920fed8a72fe3fe0c9daa627b216ecdc1393d8f50073abeab94e64db663df6fab3e24a5614e6e49bfc1bead9b7c093bde328b48c0068e39334e4c9d69a55eb3817dc5e3c2ccbff45ff825cb3d6ace27857d535ab00680b16fe65c5ac730ea2971e40bd2479b7a507e8b8373d6f9e76875a1a083c004e0fe0bc4e59ab91f30a19cfa9e72b4a5de0bafff473f7d3f3eec98e817cf600f05e7e676bddcb25ac7bf98e85e3657a3dccd5af9a6e93b7c64b9e6e93543900ddb7f4a3514e167a8e61593e762997a57bece4b44faf79909e3a076d71c97b00778db2dfd9e70eedf37bd273eab39c63b86fdc97238feb91db97cdf598771500b85e776198567336917551ae77413d5745aef726d433a94765723d9111799d00a4614c9b8c3d923e8beb7971a62cae47ce24d7c899ac3974729fe35215fce7005c536412ae47ee40d9c781cbb0170d8fe4dd7a3d6ff2864664f32ecea3f9a10031bc4f3f9bb56e793f0a3b3616d9f7e747d16effb431c4e6c0cb7a5c73478e00bc71c57baf5ba7729a7bcbebb57de89fe1ba5fa765eb2f8af95c053033ef7000bcb57768f1704b169b069ed38a1ff16ab39485ee4fe8139334d772fac43cb90052bfd1fa38f51bea93555aff907a19fdf45ef6deacfa60719dcd8acacc5a3300923e1deae016d7f18ab9cbe23af43b699fdc69fa03b3d6afaf92ccc80f2d9f005e0c8c8c41e907c4c8fdd8a947af1978b8be541b1803e1e9693d3e563804a7005c9b8b46fda47c56d27c1b5ceed7618b239f9632e9753b42c97847c958736c006bfe3adb4e1c58c65b4ac69237dbedaa932c76952c241f8b73c9f7b56cad9200e60bf8be9fc8f9be5ccbee9378e6f3868ed58fc2dafbbce6076b7b9ffe8eb400f73d7d4af63eaffe5fdbfbb68db24b9a3fc0f7fe34ec7952afc8e59e35eecb007166ef9bccdef74c8ebd4f645dd4deb7a39eaba2bdef8f50cf9e45bfe2a50b00b6336444bb99a4e19abac2736937b362ec4e4b6fe3fae3d6beb2e473d69ad1005eb19b596bb1d0ff2cd7ac18f838201eda11ad7d3d02b6ffae354f866367f200ef5563eca5df8df39de5da964a978cf7d27f6b5f5c597337a93f2407e76e7e0071cc183aeb733769c791eb92e6057ceb173146ea98d2813dd7b82f47de18ea00dc8fcfd4dccd6f600cd5733045d645e76e6ea9e7aa3877f3cba8672f610cf500d2d1973364c47e40d230cec4610dfa633683e4dddac64a7b6123b2f537da1e00ff33a7cfcada4345c7e07b728149f64bd6f366b2b880dc2f630f95ac1867f200152bd64ec63ad6af383de77a75afa21dfc267c505edc268b9391db58b6d32a00adf5ced83a6bbf88d078b26c90d65e3faca7d65e3f55e0dace9cb5cbbe857300531b868f3560be3dd61d891dd4fd2a7dd86f6f0ed32e1b6d2f20b61199106300bb6232f9afc630ed5a7a4e5e5fe5f531f3f6f1a18e62edad30eb7e97381c9e0043271de7f0246bbc78e8465ee5947dab2faa72701f04fd1dbdfc90223779b700fc2657b1ec448c11138c5efedcacf195fedcbc31977300ac31f734b994d6b500c90dc967e2f49c310d0efceaa0e89c7fc67778f80e8ada0e9cd7f9daf75adb0080e37be87dab355fde52b2cae2cb5eed224b67a27ff40cb33f662b4e8b63f0006645306abf3edb601c0ecf0807a74ff5c72ac6c19f05077f001c7c56f720f4009ee724f6db93acd7e0c56db2e634911b6a5da60c3d4a6436c9de734ef22975001f36bda632e306de9fb6b1d7eb3e6c3b46d925cdc3e86b1e49cfc9ff3917f30023c67d39f2381bfbf537fa3e6cbfd818a6d5fba989ac8beec376413dd789aa00b70fdb0751cf3e82f1d62b6e68254346d429258d153341fd57cfe7f5e44b7b000ab75ed7bb836b560c2cf94055e748597318e2807826d5b1e97399d579db9e007591319c7d236fb697bd8aca8c3a9915877bd9c07db902b8591fcbf8d65cf700a01fd9fdce6525c7aac98cdf9af30039b7cf6b6eabeeb7f5bc43e26fa834d600fccacfe570d296f16c52cea7e66e9f530fa30fd7d233bcf49e2c7f0df59e3c007fcdacae3fc7fae5c4f173d7fbb2f49bbfcea94b968f40c736726e08f9b45700ac5ed6da7a8c5793347f374677f38a77f78ad5d3ba9b15ab27699e07a7fe2700e866523f6973fa9a715f8e49eded65eb6eccbb0abadb57737437917551dded00a27aae8abadb3fa39e7d0d63a9979d71254346ec07240dfb256d5ba30ec43100af6a3a10f7ed0989876370f2ee5d251f62d631869c3b26695e19c349f4b3b400adbf1e6248c84974bcc869cfbfb6ecca72ced817c67bc9b535a37c1da37c5e00eb8e67c528b4f15ffb88e670ae3997c3bcac43f6950b0a27e3eb25cdad319c004bf7bb9a5f71bed4b22107b6a16575cd4906b9e305e779ad29dc4e787a167700b0be89a4594a4fb2be49d63aa3fc265226a665bfdf36caeea50364957dd52800fbb99cb23bcdc338f4f471e8392d9b46d925cd3ae23c2fa5e76c371cafbed700b82f471e4fe65ee70ef32a063c791e38fbc88779cf016ba0bcf799b7f064c90047aed771fea6e630ada4137990572447d25e846b12bb7e4ecf7be9204dc328007f3f0a5b7e3dc7a6ae3027df641bf54cea91e7b8d9c8901163cd248db51f1900f95807e782db7b4eb7bcbb6360946b56bc1fc7bbaac6fb71ef18e15ff43dc500e9b935a7330e8c9b36ade4dd961e2078b51ec0bd8624cddb72c692acd8ffb600a10770cd5faebb1e47b69fa3ec753bacd89c77a28dff42f37899ce749b62b8003d759ba46f963e25cb2e1b7acd5f2f9eab750f2997a57bfcc418aee760c7eb0079ea1cb4c525efdd36ca2e697e12edf3a7c0e5643ca14df403c67d39f2b89e00f31cda5caec7bcabc0f51ecae17a3b489f1c9372bd8e7aae8a5cefbda8671f003805ae6771264943bdb585f3281ab58996e19fcfb28992d7e9b5bfc8f5388600ca7d8e4bde7e187937b1c97fb9c6399693703d7207cf39e6f49727efb6e698008b7c35ef63db9534bf3421ef631fdb00ef93fa46fe6ed94b4eeb9bd267e33c00f7ccf4732e283cf4737e6c8ced4ac7d9d37f23e5d1f3d01623bf3d0ad632ca00c675fa25cd27c6f0158f75d59cca3ea867e751c6e4bd2b46d925cdef621c79000a7c44db7993fb9f35eecb91c75738cfd0238e3bc97b1d38fbc887796f006b00a0bc47d69517bea2f769aee3fc4fc057f41e9d226bea19d26713bb7e4eef5100db898eef53ccf2f7a3727428ae31fffba8679fc5d8e3d5d75ec89011fb38ea007882a7e58447fb940587e4a76d204c433d43d23c9bd367712d19b6636bac2b006b8f08f94dbea8c7bf9651e6c15a3dc0eb10873098034ace9d1c79fd197580000507f925dfe752faaef7df38fa911b4fbce7eac30f5dbf7af4d0cd47eebff100c1c76f3c7654034c813eafa0d7a2d162dc421aaa3c3cb7eedfc2ff45a4e9470061abcc02f2ece3b7e4e7a47275bdaa95e522d36a244d075f28e81ed46a611b00b2a24bc6237467317db787cc9694ccd8dc446692e6f931325bca90590332bb00e39e453e0e653bf0327d25e56c2999097ebaad24cd97c6c8ac9521b345c84c00644573b36eaf2ddc6fe29a60e23b68da906bf3461eda0c95bce3bbedf96060000d5b010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/yarn-project/circuits.js/src/contract/events/__snapshots__/private_function_broadcasted_event.test.ts.snap b/yarn-project/circuits.js/src/contract/events/__snapshots__/private_function_broadcasted_event.test.ts.snap index e72d0bd347b..9904a5f9392 100644 --- a/yarn-project/circuits.js/src/contract/events/__snapshots__/private_function_broadcasted_event.test.ts.snap +++ b/yarn-project/circuits.js/src/contract/events/__snapshots__/private_function_broadcasted_event.test.ts.snap @@ -2,30 +2,30 @@ exports[`PrivateFunctionBroadcastedEvent parses an event as emitted by the ContractClassRegisterer 1`] = ` PrivateFunctionBroadcastedEvent { - "artifactFunctionTreeLeafIndex": 0, + "artifactFunctionTreeLeafIndex": 4, "artifactFunctionTreeSiblingPath": [ - Fr<0x18e01957faa463b1495f979f153e839d5fbd2af9b0d142940d1df29d9bcf4373>, - Fr<0x2c450d02ff856d78b6197914dbb85cc88b31ef6f32d534f01b893dcee663a119>, - Fr<0x1c26a986ab599f5027f02a8390d7cb96c87146380163a5fa002c30cba8e32f68>, + Fr<0x0f70624b9592ae84d21cc4d35ce219d11dd4920ef5eb43f1889651d4d3489d9b>, + Fr<0x03b075046b71ff5f8e0792de4b82ddc979fcb3b8c03abe12972e65c57759fb46>, + Fr<0x1a3eb152e715eaa8096a394de7fb4737bab2cc37100decf5767a149f88330b0f>, Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, ], - "artifactMetadataHash": Fr<0x229d43c7daac528d0aefd72bee59385d7e9ff06ea477b673389e1f65168cba9f>, - "contractClassId": Fr<0x26222cd450fe6beecf6cbe6495e118412940ee0da5744629dabcaf010a2a4e38>, + "artifactMetadataHash": Fr<0x2ee0a6721704053281d575f82984fad809a7cf5b1f2d47971e1429fbe2eb1578>, + "contractClassId": Fr<0x06e2af08f53b9a05db4870972b4a9a663a5ffb54e962020d4efe3f1b9a21343f>, "privateFunction": BroadcastedPrivateFunction { - "bytecode": Buffer<0x1f8b08000000000000ffed7d077c1dc5b5fe4a5c0b8390e8d8a68a9a80917575d58dc11770c01d375c31b66cc9058c0db6e909a407d21b2190062124109200792185f4c64b5e3ae9e5a591e4e5252fc94bf9bf24af38ff9dabf9ac4fc73357d2b2e7eaca3bfbfbcd6f6667cfccf9ce99d9993365676ba281eb9735517469cd40d878b5b13b20764d749fb361dc4f10f775827ea2b83f5cdc1f29ee8f16f793c47d93757c59c851d1fa6df9cef6f6feae427f6b5b6b6fbed0b3a1bb23dfdeb1a1b3bbb5bbb5a3bba3afd0ddd6d6dfdddeddd5b3a1a72bdfd3daded6dfbaa9a3a76d537ee03a95f2ca3fcdab867460ae9363b72776a758ffd48cf967c7ee345b66ac97d332aa0fd6cbe9d1c0fb86facc97ace3f9a777b5a698579ef19e110db409e6aa73e0c77580233c91e8f6a42c2bf392580e77e0dca70c8a2982d128cc3314f27d46945ea3aa25f733d22fa37ca55ec29a28fd97d0f878f19e19bb33637756eca646038d4c73ec4eb0cf270adda582a53ddf55e29f1baa335cf5d140471e11cd81d18021004cb9f431b59a7c27a49d6f3edf39d1e24f39dfbd864364711789cf04d2d541d1a09e53e2ddcabc61dc1d443c5174081f41b4a0833e50d6c0de100dd6cf83caa4cb89748d4453e790bf18a52bff8102cf8102f3048a331d484d6e5f6c1af5cdbc3fdc79427f91c01b114ee049fdbd8a75757034f8ee6eeedf7de18eedbb77f66edc3d67fbaeddbddb37f673b304d87502764d345404f9dc5cb58eb87a12ef008a43fa1cc5d50a75d43bf01c1429f6fb18c09836f89e68d0000648d3561ba367aaf5cf8c060d43e31f17bb69940e029d659f4f23ba16075db37dde62fd438d4c42d65a21f3d3edf3d36c93f251fa6d2be43dc0eae474eb9b36aa7518dde49fded53a35453db7a6a89b4ad93e6746e99627ae42140620c382d128cc8242be6d51750f408cdc6de997515e5698b4cb3f2d9d9e99625eedd1f86bc4d2c4cc783ba2d0880d0b46a3303b14f2ed8caabb11337277a65f464eac4f57fe368b356d6bacad4acb3b2c1fec3b4dde15edbb7cd095517db05ebaa3a10d33469c7ca5dd769c1ca56ff4a48df19448a793ee890646d1e6529a496de3995459963c824d91677e6234d4e84c25dfb81ccc6c1966cc4a533242aec329ae8664d498b5e2e928e48d7bf033335b0d367c75efc62bcfdfb9f9daabfab7efdec59500c41ce77a016b1dcf5cf35b4ad3864304ae1102f39cd80421976bee4c759e2c722825adbcbba3f47ae69ef47095862b75d1be5735af3739e03eedbcfbfbbabbbb3a4bc5a4a6836e251da48db3699ce09c1055779dda0b94f29c6efd73ac3fc3fae75aff3cebcf1418ceb7fe05d6bfd0fab3ac5ed1683e2b7617c5eee2d8cdb67173a2a16b747363372f76f363b720760b637749ec16c56e71ec96c46e69ec96c5eed2d82d8fdd8ad8ad8cddaad8ad8edd9ad85d16bbb5b1bb3c76eb62b73e76bdb1db10bb8db1eb8b5d7fec36c56e73ecb6c46e6becae88dd95b1db16bbab62b73d763b627775ecae89ddced8ed8addeed85d1bbbeb62777dec6e88dd8db1bb297637c7eed9b17b4eec6e89ddadb17b6eec9e17bbe7c7ee05b17b61ec5e14bb17c7ee25b1bb2d76b70b7dbd34762f8bddcb63f70af1ec95b17b55ec5e1dbbd7d8674df6d96b63f7bad8bd3e7677c4ee0db1bb33766f8cdd5db1bb3b766f8add9b63f796d8bd35766f8b06d65fee8ddddb63775fecde11bbfb63f7ced8bd2b760fc4eec1d8bd3b760fc5ee3db17b6fecde17bb8763f748ec1eb5585069df1fbb7f8add0762f758ec3e18bb0fc5eec3b1fb48ec1e8fdd4763f7b1d87d3c769f88dd2763f7a9d87d3a769f89dd6763f7b9d87d3e764fc4ee9f63f785d87d3176ff12bb2fc5eecbb1fb4aecbe1abbafc5eeebb1fb46ec9e8cdd3763f7add87d3b76df89dd7763f7bdd87d3f763f88dd0f63f7a3d8fd6bec7e1cbb9fc4eea7b1fb99d0f9cf63f754ec7e11bb5f8a67bf8addbfc5eed7b1fb77f1ec37b1fb6decfe2376bfb371bfb7fe1fa2a106d17fc6ee8f22ee4fb1fbb30dffc5faffcffaff65fdbf5aff6f22eddf63f7df22ee7f62f7bf22eeffa2811193b9fe617d348a35d6afb5fe01d6cf597f82f5ebac7fa0f5275aff20eb1f6cfd7aeb1f62fd06eb37c6fe8c636dda68f02a466959f17d1b78e4206d0ba30bac57c36fb2f107d8fb03447ccedee7c84237f113ecfd048a77edf1e005d71a8a43dda9a5b8bd8bba14b7775197e2f6ee87a07d24a82fa5346284514a03f9286e2264a3b8832017c51d2cf469e2ea8937e20eb1711329aec1c61d44718d36ee608a3b94e4837f988d3b241acc177d51314aabceb496f6c85c9076be71ce26df59e9e75b1a8d3f2b1a2ca722f1b9807475910da7bd47e659946f0df1417c8ec267102de8a00f8c3281dddcc3b6b8a84cbaf345ba46a2b9d0217f314a57fe5902cf2c81d994c971366ceaf1d1b61ef3ac89423deed4a9c7edf9508f075648a2c85d1f0fb3e1fdb11e9f4538d2afb31d9da1ed1df135ea3a7b21d1caba87bd8bfb639ded261c0a75b637d4d9115fa3aeb38b8956d6bda36c787facb317110e853adbaf53670bc1368806e69fa2c85df78eb1e1fdb1ce2e231ce9d7d92ea53adb16ea6c3430f71945eeba37d986f7c73abb8170a45f677bfb836d30e26bd475f666a29575cf4e2bee9775f66ac2917e9ddd50087576c4d7a8ebeced442bebdef136bc3fd6d95b0887429d0df30623bf465d67ef245a59f74eb4e1fdb1cebedc86cd9cede3b9817013c57dd4c69d4c7815eaf646a5ba5d08757b609d3b8adc75f4141bde1febf69b0987429ded0f7576c4d7a8ebec63442bebde6936bc3fd6d977dbb0697b3f65dbde3328eed336ee1914f7191bf74c8afbac8d3b93e23e67e374d737367684f762c4d7a8df8b2f10adacdf536d787f7c2f3e4e3814ea6c57a8b323be465d67bf43b4b2ee35dbf0fe5867bf443814ea6c4fa8b323be465d677f41b4b2eeb5d8f0fe5867bf6fc3c65ef892b5175a29eecb36ae40715fb1716d14f7551bd74e715fb3711d14f7751bd74971dfb0715d14f7a48deba6b86fdab81e8afb968d9b4e71dfb671e750dc776cdc0c8afbae8d3b97e2be67e3cea3b8efdbb89914f7031b57b471e60b27ec49fcb68d33650b7bac18a555b67d1d863f9f8d66ae1a715fa4f09984e799a9e3197a4ed0c6de6ddb16eddc7a5defeefe8baeddbe71f7d61ddb6b0822607f5bc0ae89868a80e77514574b61fec02b47e10914e6b4073ae25c974e910dbc8ecf243e45ba3f33f0ce2cefb3d2e75da8271eb8ca350f3c3c9caaa08b7ae231123c5375f1e41b090ff33a5b41f672f5e0ec2ae1dd9c3eef521d3c3b1a7a952bf366c2d3a2a08b7ae231123c2d84679a021e25394bdb3ef0d9528a27c4944cf956a1ab66a1ab46a2c993fe5a15f457437c9137ee5b090fea20b0d613ddd955821171d3088fc63b50ae3d68a902de4617e8b778ba13cfb9dfac86f2e2e9d789368cfec4d8a1cd35837815dad8d23b097e399b2f7034533c68f64c19c4d66ab135d0739e3a9e26e234eb0578216fdc835f03c9338de21066fb25af84b1c58311fcb87dacf3c891239a1956ffe6b30ab6475866d94ed5537a6ebb0a4a32cbf61ef705c208195b098f962dd32cf0343b74b13ff2f6bd1fcafd575eb36e61ea08d382b26ee5886601bd2b9c16b8641bdd40ba69231db529c982f2a811e5c3bc356cc872f5725ae03da6bc15faca02f7cbb8463a8651788f0b6c9b8d044f81f068bc8b4a7296da414c6ba73da6ea10ba6a11ba6a249a76d25f8782fe6a882ff2c63d7f1a3ade301b3cd216ab27ba6955821171dc6f68f5bfbe36ac5005bc791c88b10997178f49aaa1bc786e014740c01631f6cd4d340e5498cf2cb04e614f1d24f497239a4fd138f0161a07360bfdfac6de951a63e11efc78acea1a27f13850c11e2ee939efc1087e5c77ea3c72e488e676cf3890654618ed94afedd2b26f7def421b61947d80a6fd3555e099ead0c5fec8dbf77e306f2dfb47a16e95de27d80768b764ddca11cddd621c8878e0c27be29a9f006d2de58d674d36be5df0de63e3651e4d91ae0dabd0a79574dd29740dfc1da46bd0bc43e8bad3a36b6e03a01fd0d646fbda813536be53f086ae651e3556d79de9eb64c83b85b17b8be0af39efe96b4b2a31171f78fb792bd837a31e2bf3fa59faed415f094f7e14783a088fc6bba8d4ee95fa2e6c2b4b7becde2d749517ba6a249a2ed25fb782fe5ce372dc835fc01c3007cc0173c01c3007cc0173c01c3007cc0173c01c3007cc0173c01c3007cc0173c01c3007cc017331600e9803e68039600e98a38039fff4ae8039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e6803960ae3acc064f0bf859bf9ee85aaa0423e23a094f87129ea9020fee3baa80b7d1c59936dc6c7d2eaf3309633594d754c278b00d17ac3f2176474d18c45b481d6f5fc1e06d237e45078e1cd13c7fca20ed648bad819e9f49f2b48a3823433e751906740e5ec81bf7e0d740f2b4521cc26711c6e6d4310ee839efc1087e5cbfeb3c72e488e654abffc3a2813a7596436684d14ed5537a6ebbc6ea7de532984a785a94f014049e82431763c59bdb2ebc4ff5f49cdfa3a94a185b0446dc4f258c882b109ef4dba6f2ef75e03db6bcdbd2e75da88f86be23e6aa11f7450ab7111e8d77b69e788c048f721b926f243ccc4bab2df0d583a955c25ba1cf2a70ff88ab5c99b3cddb953e9e2eb65d478287c74c9de9e369559233cff6f89e14f335baea11baea10ba6a249a6ed25f8f82fe6a882ff2c63df805cc0173c01c308f16b3c123c757f54437b54a30228ee7aa14fa94b276445715f036ba80bdcb738b78cef6763594572b61acb761d8a1662ae2669aab4a7f0e25df5523f8150907f8e5886616cd55dd4a735572fcca3616eb5cc37e2a373f087e0d240fcf9320cce31e0d9bb386b0488ce0c773f9751e397244f3529aab625978feb347c419f9a6a72f5fabab6dc73df83510f61ec2a335de6916789a1dbad81f79cbf5a06e076f85b62faf54b74aefce39362fb451b26ee588e66e7a2f382d70e13d411e0da49b7348471aef89c97786928ece153a02fe19a423d0dc2b748478a9237e77a19b7349470ab2144cbee729e968a6d011f09f473a02cd03424788973a9a413a826e405b4b613cdb637557a4fba72be3267b997ccf4f90efa6612e93ef054f1f6fab8c8828af5a0a83d7489ebb68cfa734e709ba3de2fec068b08cb81ee0f963540f26126d314aad6eb6b17e53ccb754e7a10bd4f99942fe1cd13c2eea3ce2810b751e793490ce58e717087d36d9f8f305ef3dd1d0323a9fe89574d2ceef5e8af996747da1cd0bba66fce6ca11cde784ae110ffa0ea1ab06d20f68f99dc0b31a1b7fa1e00d5dcb3c0cbd924e3a4cbeb3d2cfb7a4eb67d9bc2688bcc12f47345f15ba463c70f1bcb7b91a483fa0ada5bc5977b54483e7d0b5cc03ba56d049a7c9f7a2f4f32de9fae268a8ae81ff22d23568be27748df848e87a16e91afab998747d91d05d938dbf58f086ae651e4d56d717a7af932176764d34d4ce063fcdfd30bef14577e03da6bcd35f3f1bd8e722df3fcc07801fbf7fbf1de6fdc35c0dcf8dc8baeb4a07fae94403fe7582e662c2059a3f8abd356d8256f35df5955db5f05698172badbb72199aabdc3a27cf1d2bf423edf5d1d039b0e1f05c447834f65229c9599a07996df34a7bdd758ed055a7d05523d1cc26fdcd51d05f0df145deb807bf803960f6613678d03e016b3dd15d5c251811c7fb5214da8db27dc54555c09bd7d678ef2b9ef33a4f359417ef553fc48631e76b4c9193ea06f12a8cc7da192fec36e0e0312a68ea686ded548badc1a15f23cf05224e69fc5ed23978216f39a7d140f2f05c05c2bcb6a63077d65e130db51b1823f8191accd3d645feb919d04cb3fa3f4cc88236c994c17411a7b9a60c5ec81bf7bc8601ecd3098f964d3b4be099e5d0c5fec87b86e03d2323728f8477faeb6503635f6eb3396f5efb03cdf9f4de725ae0e2bed35c0d24438faa2cee3572290bef1fa913343d242f686693bc3ca66659b4da245f9da806deb5c48fe7036b05267361fe50d683a648ad5f2df0de0c5ce5c6c208ebcc15b4e7eb05bfe1f068ef33539a13c9f35c42da6373f99d4f51e88abff3e1b184d6b75172bf11ee5ddf543445e9eaa27904ba6876e051d8e3565617fc9de06830778c43cc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3eccd5a0673e0f167cf93bf29e2ac18838edb3c20d1edfb70f9d55c09bbf11c5b7365c5efcbd623594d72cc2a3f00d68e9bb8a06c1cb7cc774e5819a7c0ba53df8f2db538983bf3d3d62f220ed0e8bad819ee33de3ef44f8dd53f8aeb35496c84be6cde78fb1fe10076cfccdec4c11a7f99d973c2b10f77c9ea294652cf5a8c9dbd766ccd42d87029739ae1a715fa4307f37abd07eb6f337c323c1c3ed79f8c6cafd8dd574a1ab2c7f63e5d245b5dbcce53057abcd5ced7a3678647fc336d8cc2ac158499bb928f0e0be1236f370bcd966663bab5a6de622e129a68fa76433370a5ec62e7d806c660d7ba146f02b120e3e6b0034274e1aa47d0fd9cc788ef78cbff5e6774feb1f19be73f8c1af21729f1f22ed63df7f33b4de13df7f333a09a394652cf5a8c9db77de8b725b59e032c735521b55c1c61af59981daff5f559233cf6d7bda36f36ca12b69a336124d33e96fb682fe5c363ceec12f600e987d985dffbae2fff9765509c64a8e417dfd544b15f066db96ed21d7ff8eaba1bc94cf2e2ad9b6870a5ec67efcc581ba7c794e1236acc4c1ff3ef9f6d183d87e4db62d9ee33de3fe99df3dad7f9ffbc629fc4f2fc8c376a3b4637dff27d37a4f7cff276b218c5296b1d4a3266f5f9ba1dc561646fbdf5f6e3fd36f9b0a796e0747826736e1d19807506a834bb62dce674ddbb69d2b74e56adb413387f43757417f2e7b0af7731dbc9ba27475316f04ba98e7c033afc2ba00bfd1629e330e31073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d27c36cf0c8f5a17aa2eba8128c88abc4be00df7ad5ec2ae0cd6bdcbc2e8ae7bcbe580de5a5bce7b5b4ae7598e065d6915f3351936f6b9ef71062ffa6c4c1ff4efad95183b477586cbc568cf7ccc8e3dacfa1b517d7b75f01fc78ad98d78fe57a763da5a9c43e0bb94f1ef7b309a394652cf5a8c97bb8fdd44ae550e032c735d235e5f4d744dbf2dc0e8e040ff7bf1aff10d59173608d1b6d6dda6bdcf385ae660b5d3512cd3cd2df7c05fdb9d6dc710f7ee31133f36e8ad22dbf0523d0c502079e0515d605f88d16f3bc80b9229843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d98aba16ef099a3c05a4f74cd5582117195387bc1b7df6b6e15f0e63da2bcaf10cf797f5e359497f2d951a57d61870b5e661fe62d0769f21dd823da41fc8a0e1c39a2f9f49183b4cfb7d81ae839de33dee7c6ef9ec61eb672fb7dc1af21da779f7b43b4ef7ed07a4ac37550eb3d992370e37e2e6194b28ca51e3579fbda0ce5b6b2c0658e6ba47b3215f6e7b5733b38123cdcff6aeca7579233cf6d7bda7b44170a5dcd15ba6a249a05a4bf850afa73edffc43df805cc01b30fb3c123fb857aa29b5325182bb97fd9d74fcdaf02de6cdbb23d84e76c57544379cd263cb3d3c753b26d8f10bc8cfdf838d9b6cde9f36daf11fc8a8403fc7244f302b26d3f41b62d9eb38de81aa7687dcbe61ba7801fdbb16c3722dc461835ec959a68df6f4a659bca730a751e397244f345ab7ff3bd5a23c9c032cbef6aeb297d25da44394782fb8584518e2935ede76681a7d9a18bfd91b7effd60de0a7308a31e37701db8247d3ced5cff4782e712c2a3f18e28c9591a372cb279a53d6e582c74b540e8aa91681691fe162be8af86f8226fdc835fc01c30fb30f3b80158eb896e4e956044dc42c2a3d06e94eda72ea902de3c6ee0350c3c675bb31aca8be77515ecf7d2b8e148c1cbd8e6ff18837183c4c1e38667d1b8e1808307c2be71836b0ca8b5bee11b03821f8f1be6531cc23c6e50b00fda5d36b46bbe06f5adce23478e681aadfee5b881659663045f9bb8287d99cbbe638b082364e476298c1b2af37e306f85be60d4e306ae030aed7e3bd7ff91e0594c7834de1125394be3862536afb4c70d4b85ae5cfd26689690fe962ae8cf65abe21efc02e680d98799c70dc05a4f7473aa046325c75abe7e6a7115f0f68d1bf09c6dcd6a28af4a8c1b8e12bc8c6d3eeb6055be05d7b841e2e071c39c230669673bc60d6c9f2e14719ae354b93e8a7bf0e37103cf75cb7d33beb1eb58dad55296b1d4e3fe3acf3196728fa4ee22cce3dbf4dbeebe527b80fe1ced81ecfb7344b38ec6ae9c16b8e6386441dd5e5271f906f42d31bae64dd107d4099a25a403d06c261d64b58ed6923e50be4d361e3478bec7c62f12793465587f3a76cec0fbbccce685f77989288f1cd15c27dee7650237de67d7bb0b5a573ad0977bc796887c7244f36ccf1c19682752b81855a6ecaa81772de98ddfa35aa2e1f9037e1f97113dcf3314d393a1346fc475c15ce5e669782c79a9129e25a3c07329e1d1188728c9599a375a6ef34a7bde6885d0d512a1ab46a2594efa5ba1a0bf1ae28bbc710f7ee311b3c123dfdf7aa25b56251811b794f028d4e7b26de1a555c09be733780c8ce73c96ac86f2e2756b8575b2d27cc6d18297b13fde49f3191afd0ddb15b07780c365bbd7d37cc6bb693e03cf795ec03537a5b54fcf3737c57317d2a66aa0308fa314d6a20aae7742ceb5729dacf3c891239ac73c361ecb2ced1f5f9bb83c7d99cbbe63cb092364e47649cb3e9463d9250e5dec8fbc7def07f3d6b21f4763cf721d5068f70b5cff47826705e1d1784794e42cd9b32b6d5e69dbb3ab84ae5cfd26685692fe5629e8cf65abe21efcc62366b66781b59ee8965509c64a8e017cede78a2ae0cdf6ec5e5b899eb30d540de5c5f3060a7665c99e3d46f03236e3536360cf4a1c6ccf7ee5f041da7f1bc69e757d33ae357ef27d330e7e6ccff2f7ef08b33dabd06f155cb61d78831fd7c93a8f1c39a2f913d9b32c0bdbae2b459ce6fb045ec81bf7e0d740d8b9cf08b66b65dab5fd5dee91f05e993aef813510d471b4a1785fc12fc734f5033ed640a4ad85b694db2ec8b04a5596013dfa6c3ff03334ab6db84ed0ac2279417308c9abd907f8cabf12f37781b79ff7ead4790fbc736b6c5e78e750f7c02f473493c53bb746e0c63bc77d156400ad2b9d1c03b9de8d55221f7e374e245c3c2705da89142e469529bbc07b6c792bd867a5791caebbe62a378fc3fdcc65a9e369edaa8f86f633c3e1b98cf0a4df9e0ccc2ba52fe7c0bcd25a9b57daf34a970b5dad12ba6a249ab5a4bfcb15f457437c9137eec12f600e9803e68039600e9803e68039600e9803e68039600e9803663dcc060fe67e80b59ee8d6540946c4ad263c0a733265e7e12eab02debebd1178ceebe9d5505e95d81b3149f03273fe6fa91fe49bfe9c696b17cfe5638d01385ceb5cafa2bd11f75a6c0df49cf746ac14719a7b4a7debf2bca754ae63345098f746a4ff8dca809e977b30f2991128fb3a8f1c39a2798f675d85654618ed1f7fbbc36de258b5035c06fc8e69ad4dc875df550e5d8c156f6e13f13ef19a06bf470a6d50ab6bed0ff74b08a3ec6795d67346b4df466bad64b46b37ab75f1e4792f2af3d2fade7034eb68fcdeae55c2339aef0dd91ed568d794e4ccb3adb327c57c8daed6095d2d11ba6a249acb497feb14f457437c9137eec16f3c62e6b691bf3704dd9a2ac188381e0728d4e7b2edf75ad2cf641b663bf44764f72a7c335c70d9bdc0c1dff483660dd9bd3f75d8bdd56c5fb9ce18d3b271788f5091ee2b615fc9f3d6960ade0d91db7651289b82ab6cd688b2e1f7b52e72db5b39a2f983b0f757095acdfe7734f600f7bf0aed5c17b7a923c1b38ef068cc2528c959b207d6dbbcd2b6077a85ae5cfd0468d693fe7a15f4e7eaeb710f7e0173c01c3007cca3c5cc3639db9ca05b5325182b398ef1d9e4eb747997e6b8a7085ec69e3ee99041be0af64b17cff5c3d6070ef0cb11cda964eb9f6ab1f1b7756cebbbc6765aeb15beb11df835900c6c83ed8fb6be6fed66385b5fa16cba5c65b346940db703d2d6e73a089a82ad77d2d657b6ad476deb739ba1d07e76735b3d123cbd84677dfa785a95e42cd9fa1b6c5e69dbfa1b85ae5cfd0f683690fe362ae8cf6543e01efc02e68039600e98b38099c727c05a4f746baa046325c774bef149af2eefd2f8e458c1cb8c0136d1f844c1e6ea36325f4efc8a8403fc7244f3dbc30669afa0f1891c8bf8c6b9ebd397a1ec3817fc1a4806b61bf7c7f189dc3f79b9e0ed1b9fac4f1f4fb7ab6cc07b3de908755e8e4fb80e82e646cff844b95c0ba3dd97c165bd217d3c9da31d2f719fa3d17e2ac999e7fe27edf1499fd0d51aa1ab46a2d948faeb53d05f0df145deb807bf8039600e98c71633f7396cef806e559560441cdbae0aed7359bb79832eef92dd7c9ce0656cd3fbc96e5e9f3edf4e23b33c1f0738c08fcfc7f927b29b1f24bbd9f5ddc87a11a739de012fe48d7bf03318a52d5d893db7d26eaec47e5fdf18a212bc7dfb8794edf3bc52dd2a701b85f703f8c12f47341f219bded5be61af1bf2e06f2a2a61d72acc7f14b8ef838ee4fc478e683e2574d4e7d111bfbbb25fa88df69d836ab2f1b28fc5ff66641e4d916edfc6dfa414e91efc94f665965ddbe3ff6328ecb1ef72d585f5f69ecf5b03cd5786a90b582f461e0d1e3d6a7dbfc078a26864df2fb09dc7368bc6bb574f7c478291edce4d4a78368e02cf26c2d39f3e9e5625394bfdcd669b57da63f92d42571b85ae1a896633e96f8b82fe6a882ff2c63df88d47cc060fde1b60ad27bad555821171fd8447a13e97ed3336917e8eb7e1f5d6376dfcef688ca265836d247e45c2c13618686ea531ca1f698c82e7fc5de07a11a7d50e951ba3805f43e45e23d2e8dbb8bc619fb8beabd7e20d399177afe0cddf85703faf50360557d980773fe908ef415de4b6e573445312201a9cdbef13b49afdef68ec01ee7f15dab902b7a923c1b385f06c4e1f4fab929c257b60abcd2b6d7be00aa12b573f019aada4bf2b14f4e7eaeb710f7ee31133db03dcdf816e759560aca40de5b307b6e8f22ecd859e207899befcf88641be1a6da791b99ff8150907f8e588e662b2339a2c36e3adb7cfd9ce70d9951aed5b39bb12fc1a48066efff7473b037222ef7ec1db676728944dc15536ab45d9703b20ed0cae83a069f1d819cae55a483a37c2fd64da784663f7709fa3d17e2ac999e7fe276d3be34aa1abd542578d447305e9ef4a05fdd5105fe48d7bf01b8f98f91de5fe01747d55821171dcd72bd4e7b276c6565dde253be344c1cbf4e5f3c8ced0ea07e4b909c0017e7c6ec2a164675c427686ecb7ea293dd7232dfb10bc9037eec1cf6094b687e67a8bcfcee8ab006f9fcd5509debeb9944af0f6d957fbbbce4752d7b4ce2bf1957725cea4f495772578fbcabb12bc7d7b9199b7c679727c9e27ae7276adf6199bbef33c35fac9d18e31b88fd11a636c1e059e30c6187ab9ecf5cd4257e3618c51ed98798c01ac591f63f8daefada49f936c98cf0e7e4905c602ccaf4838782c009a1f1e3a48fb321a0be0398f05b688384dfd8217f2de22f4db10ed3b3ed0b4cff8cc8022dd57c236f48d8bfa4817085fa65b360557d9f489b2e1f59a3a4183b439a2b95bcc39bad60514745b18ad2da4dcce758ed63eb992f068ac2129c959b207b6d9bcd2b607ae12baea13ba6a249a6da4bfab14f4e7eaeb710f7e0173c01c308f2d66ee73d8de01dd655582b19263029f7d7ba52eefd21c7a93e0656cd327c86e56b06b3a5dfbcc8103fc789ff97d6437ff0bd9cdd20ee37112d723ad3d1fbe7112f8198cd296aec43c97b49b2b31c7e61b435482b7cf6657b6cff34a75abc06d14de0f59b77244f303b2e95ded1bc6973c9e836e2a61d76e53d2d1554247c0bf8d74049a9f091d5de5d111bfbbb25fa8a5bcf1acc9c6cb3e16df2dc93c9a22ddbe8df7a214e91efc34f72ef9da009edb5598d7ee74d505d4753e471c34bf1fa62ec8317683478f5ab26c13b25ce19005347f11b2205ecac2f55ad6d55aca9beb29d7773c47bd967934e9e9a460f2dd9e7ebe255def8886ea1af8b793ae41b347e81af191d035f26820fd805649963693efd54a3aba46e808f8af261deda5691caa23c44b1d6d271d4137a0ada5bcf1acc9c65f2378a33eca3c9aacae1574d26ef2dd997ebe255def821e6dbec0bf93740d9a4385ae111f095d5f4dba867e40ab244b87c977b7928eae153a02fedda423d01c23748478a9a39da423e806b4b594379e35d9f86b056fd447994793d5f5b5e9eb6448df8b7e7f8be0afb997c837eee03965ad33a17de725f039e20a676a77b2cea5cdc1e71983e674510fa5ad843338d8e670e9514b16391ebfc2210b68a60a597c67e7b8c6c17d159045b60f4b1cb280a67598f641fe8f86e71daead802cbb852cdb1db280a64bc88278290bf7bdb2fdd294e53a21cbd50e594073ae9005f15216eedb2003686b29ccedb391f17aba2f3e4d1937d9cbe47b43827c370d73997c6f7cfa785b6544447aa8a530788de4b98bf6064ab356d0ed11f707468365c4f500cfe7523d9848b4c528ddba097ed2a6b8ce8169a1a89bac03931675936d0aa9072ed3627ab20ce913d11faf73f0d6feb70678bbfeadb15289776f34b41c70bfb202bc7d7b2b2bc1dbb7b7d2f59fe782f5f96c5cfeafaed679b03e3b8dcf83c5bf9a95ffc352c223ff455d49debe7a5a09debe7a5a09debe7ababf97f770bcf97c3bfe0f7bfafd435fc16587c9fe81edb0ab87b1c3563a64c13b7d5d19f95c798186bf4507a63a41e3ea97af17b64216eb5296796bbd2fb067f1bea0eef1fb029a1788f7e506811bef8bebdd00ad2b1de8cbbd1bd7897cf8ddb89d7099609ba09d4871c5a83265d75605bc8d2e60ffa06ceae939db460a638f12c6368111f7d71146c42d273c05253c33049e190e5d68f19e2578cfaa20efe982f7f40af2ee11bc7b2ac8bb53f0eeac20ef16c1bba582bce70ade732bc87bbee03dbf82bc9b05efe60af25e2c782fae20ef1582f78a0af2f68df92ac1db37e6ab046fdf98af12bc7d7d3ff34edfee18b019c12367f3859dd546f1a0794c8c5b6e481dd3507dd4087db00db85c8977abe08d7bb6675a9578fbec99d60af0f6d93395e0edb3672ac1db67cf5482b7cf9ea9046f9f3d5309de3e7ba612bc7df64c2578fbec994af0f6d93395e0edb3672ac1db67cf5482b7cf9ea9046f9f3d037e0d143ed3fa663e61b988d35c0ff2d93dbc1e94b761ee7fb5fafebcc0237937925e5aab54678d1497273c672ae1f1d92c675680b7cf66a9046f9fcd5209de3e9ba512bc7d364b2578fb6c964af0f6d92c95e0edb3592ac1db67b35482b7cf66a9046f9fcd5209de3e9ba512bc7d364b2578fb6c964af00efd58e8c72ac53bf463a11fab14efd08f555f3fd640e1b308cf594a787ce35ae69dfe98baafa38678607d01722fa778d034d9f3130e532e1fc85f23f4c17523afc4fb998237eec1cfcc27602c7f36c561ed631ac561df453bc5611fcd548ac37ef77328ee261b3e97e26eb6e1f328eed9367c3ec53dc7862fa4b85b6cf8591477ab0d7753dc736df8028a7b9e0dcfa0b8e7dbf0c514f7021bbe88e25e68c3b328ee45365ca4b817dbf0748a7b890dcfa4b8db6cb887e26eb7e12e8a7ba90d7752dccb6cb883e25e6ec32d14f70a1b9e4771afb4e1b914f72a1b5e4071afb6e1f914f71a1b9e4d71afb5e1668a7b9d0d2fa2b8d7dbf0251477870d2fa4b837d8f0628abbd386e750dc1b6d7805c5dd65c3cb28ee6e1bbe94e2de64c3fc7fe737dbf0068a7b8b0d2fa5b8b7da30ff67ef6d36dc4b71f7d8f07a8abbd786fb29eeed36cce7e7df67c3fcef9e77d8309fed72bf0d5f4971efb4613e2bf35d367c15c53d60c3db28ee411bde4171efb6e16b28ee211bde4571efb1e1cb29eebd36bc85e2de67c37cd6d1c3367c2dc53d62c3bb29ee511b5e4b71efb761fee7fb3fd9f03a8aabb561ded376800ddf4071391bbe8ee226d8f08d145767c3d753dc81367c13c54db4e19b29ee201b7e36c51d6cc3cfa1b87a1bbe85e2ec2f00f7b67926ce7e86bfb7cd337176097d6f9b67e26cb7b7b7cd3371f638febd6d9e893bdc865f487147d8f08b28ee481b7e31c51d65c32fa1b8a36df8368a3bc6866fa7b84936fc528a9b6cc32fa3b82936fc728a3bd6865f4171f8f7fb2b29ee781b7e15c5e1bf48afa638fcc3e0351487b34c5f4b714d36fc3a8a3bd9865f4f71a7d8f01d1477aa0dbf81e24eb3e13b29ee741b7e23c59d61c37751dc336cf86e8a43bfff268a83fdf1668a836df4168a9b6ac36fa538d80a6fa338b4fdf7501cec877b290e7dd3db290ef6c87d1487358f77501cf686dc4f71d83bf24e8a838df22e8a433ff900c5a13f7d90e2d0efbe9be260533c4471e8b3df4371e8efdf4b71b083de4771b03d1ea638d8468f501c6ca347290ef6c3fb29ae68c368f34cdbe23b0bec0a1167daa62b6db818a56b7fca7fe6e11efc0cc6ad365cee5f7b4d36bc856890479da0719d05f51e61eb2b9cbdd46d308de6eca5470813a705aeb5421ed7d94b4ab294befddc2e646972c8029a0f0afd6a9c4ba3246ba99eee20994cbe5b1db282e6a374eedec76d98df2b3e33e0cb8ee7b86ac47d91c2d09f91f99af4652e9d53bb937016890ff3de455853e2ddcabc6ba2a167b4f0792e087fe9d0415adf592ec06ede117cfbced865ba2b44ba46a2b9da217f314a577e79fe8f3c7fc694c9a7a89ea11e194c5a67a45dedd15113e9083457928eb4ce5fbf52e0010e3ee31be52ffb00a4e5f339be456d149fb70a39eb23f719e60a6d592b6347def20c28fee7018fd99a848c7c36e9783e375f014f37db12f25f047ca62a687e21fa646987a04f3e8964810cca67e296f64f6ff3c8c2f51d34bfd1b7790a9ab6e3552493c977b34356d0fc81daca3f3afa5cfe1f0506bba3ed93f99ce81de9cb9ce73618e5bbc3c1fb1ac29a12ef21ed3ffa6479a65c8ec2ffa03e59f665d035b09b77046d1a6397e9ae10e91a23b74da2600f0db10191b73c3bcf94c95fa89ea11e69b6a5db23b78e4e221d8186dbd24a9d652affeb626850fe75820669f9df2f13ad0ee5bf7eb94f96fd99e63800bc9037eec1af31daf7dce07a878cfc9f1ddf7f2dabbd4f76a5c37cd826a2411e758286cb1b3493a9bc8dbc0a672b77b1ed3841c8eb9a1b389e30b9ecce25421e9eb3603b58ebcc6bd9e79fe8900534a708fd6af5f95a67c7fbfa7c961534cfa07fc89e497d3aca89ff47dbed788e2bf4f923ebf3bb0e1ba4957d37743dda3e7f8b48578d7dfed954cfbaa9cfd7b27bb77b747422e90834fcff04ad3e5ffecf41fed7d9d0a0fc651fc0632cd0143d7d3eaf0fcafe52b3cf072fe48d7beef311c76bace5feb36d3caceff29aee66113731aaae7f59bbd2615d6c3dd1208f3a41c3fff703cd22d12729d8385dae71befca7258ff397893e5f8ef39708797ce37cadffdb49fbe504872ca0592df4ab31f7a0699bf21cbbc977934356d0aca3b6b897fa7494533fe9ed6ac7735ce5fa7cb6e914e6fef2dcefc8f36b9937f7cd29f11ed2e7a1cf9767caf35ac70eeaf3e5fc3074cde7e6c23663ec32dd66918ee795af72c85f8c74fb57796ebf29933eaa6757539faf6df74a1d9d403a020d8ff3fb95f0c83da5c0017ee5fa00a4e53ee006d1e7a3ffe3fd49d26ed7b4b17ce361f06b8cf66defeb1d329afa713cf5f91b850c26cd7a875c5ae5065ec81bf7e06730f6daf0fa31c073bcc0c375ad4ed0206d8e686e177d9d82cddbc5f56382d0a3cbbe7985b02564dd5a22e461bb4b79fda3e0b28ba05f975df43afdf919555b82d7064cbebd0e5941f3466ae3ef76cc0f6c24bd3d9870fe806d458575dbbc6b9fc6550ededce7a7c47b485f0a5b027cf83f41083f40b6841c7743d7c0eefa47902bdd1691ae3172cf9f28ccdd38fbedab046653266fa17af620d9125ae3f56d1e1d1d4f3a02cd268a43ffc4e370bc3fdc776d54c2dd2b70e37e2361441cdb0db2bf307afe9ddd20cbe7eeae72c8b58ae4da5061b9c0af81b0e3992b1df6b1f239f6c8a34ed0206d8e683e26daf6f4cbb1b58bf7354c88dce5c87b323e25fa4eb92762b990a781e4e1b921853a59da03d72f6439ce210b689e10fa55b0a93a35df3fb6db4dbeeb1db282e64bd4a67d85fa4694d31ad2db8f1ccf7195eb3ba13fa539b23ccf6dca7522e6cdfb5253e23d645e157d27f8b0ad82f00fa9ef947355d035cfebc9751357ba5e91ae9168363be42f46951983b1bdfa75aa673fa2beb34f09d3668f8e8e231d816603e948ebff10eb051ee000bf727d00d2721ff00b310e47ff0739eb8996fb46adf12178216fdc835f63b46f7b5fef90d1d48ffba9cfbf5ce889c7e16b48ae5e25b9c00b79e39efbb1754206573a7ccfb2966890479da041da1cd1fc45f449e9db38037d3e8f9558de0d8409347f137d3ee2816bb99087e72c40ab64af75bbec97631db280668fd0af42bbd4ad699bf6934c26df750e594173c0e1837a9960c3fc5e5d4e7a3bcaf11c57b93e9f6d3a85f151de35b7b3d9c19bfbe694780fe9f3d0e7830fef9541f8c8c30769e51a2c74cdeb5372ddc4956ebd48d748349b1cf21723ddfe55aed199329948f50cf5a81276afd4d1b1a423d0f4928e2af51f24e0e0711fca5ff6013cee03cdf15687e8f3d1ffadb77e7db46f7fa969638117f2c63df835521c7f5f2d6534f56313f5f99709197c7269959b4f2efe0710fa71fe37ac4c87ef5a97100df2a81334489b239ab3a9bc8dbceb539777a0cfe7726079d71326d0e40993ab8e2f17f2b07dc4efdcfad4651998efdf206499e29005349d42bf0a7d739792acad6c6fa1cf5feb901534e7505b7c2ef5e928a7cb486ff31dcf7195ebf3791ca530cec8731b8ff2ed77f0e63d3029f11ed2bfa0cf071f9e6f41781ef5f9b2af84ae792d0f6d66b9fd3b978b743c8655b6b7ca9e8d047ea532a17a369ffa7cadf1599f4747534847a0e17f6929fc03b895db77e40d1c3cee43f9cb3e00697344b3ccd3e7f3b91cb2bfd41c678017f2c63df8f1f7783c17216534f5e324eaf3570b19f87b0196eb3225b97cdf0b809fc188736396a8e219e893d7929e4cbe93059e1cd1f4893e19f1c0853e7932c922ff196e6451f8877d81df09298bcbe6b942f4c90a365e4149d621f345e893973a6405cd0e6a2bafa13e1765c2fbde9feb788eab5c9fcc6d9e429b9077cd196d70f0ee23ac29f11e6203a14f061fb68d10be95fa64d96f40d7c0ce73558c5da65b2bd2717fd3eb90bf185566de95e7be76533d7b2ef5c95a6d69af4747934947a0e1b674a9121ed9b60307f8191ab9ef7db2c0c7fbde6ff3f4c97c8e95eccf34c7abbe7defe0c77b02f8fc182963696da67e20eceb93573ae4d2faaf0278216fdc839fc188b58de1fe05be54c44d24b98b29e35e2a704bbb81ff05be94e210e67f082ff1e4358968a43d29f9b13df956d1bfa6df060cfc1f4cda2fd29e62fbe5edc3d82f2b853cac2bb65fd22f4fb72d36c9a15fd03c20f49bfe38a3b54bb3ee72f9987c57396405cd7ba95f7998ec13d46db65f3ee1788eab9cfdc2e5abd07ee6d96693ff0b67debd843525de43ec45d82fe08378b6173f4ef68bec63659bcf6ba7e5f622c9ff4c73df7cb943fe62a43b5e967385a64cde4ff5ec1364bf68fd2be7728f8e26918e40b39474b45a09cf2a810738c08ffb9c3a4183b439a279c263bf404eee2fb99fd79a33f1f597e0d748717cdea794b1b44793ec17a4e1f363e7883823d7a54a728117f2c63df8f1387c0ec521ccf68bebdf9e2b9470fbfe15b582304206b6c5e4bfc76ba27dcf9107cd31448332adf3f0cb11cd8f44ff9a7e1b3060bf709d2a1296958409343f15f68b7c5fe708795857bc37674eeab2e49db240f7731cb2fc4ae8779502262559878c1960bf2c71c80a9adf52bff23bb24f504e4b496fffeb788eab9cfdc2e5abb0b72ccf361bca778d8337cf3fa7c47b88bd08fb057cd88e44f87fc87e9136beec6f78fcc9d865ba15225d63b4effc9966dfb546e0917301a64cfe93ead9ff92fda2d5efacf6e8e818d21168f8ff88959a7f010e9e7f018e3a41c3e38ebdff7e3862c087fd82be9ccf8e072df7f30a6d59d9fe12fcf8df8a7c6ebd94d1d48fa70e1e08fbec97c50eb9162ac9e5fbff0cf8b1fdb298e2e43fefd9ee62fb652ced2ec8e0b2bbd87eb9d493d7d14423ebaee4c775f758aabb3a736703f60bde05f409d25ecb11cd8984c965b32d16f2b0ae403b91e88aa9c99277ca02dd2f76c8729ad0af828d5c509275485b22ed179675ef7f638f18d4cb541baea77262fb65bae339ae72f60b97af42fb99e7fe0ae5bbcac19bf7c9a7c47b485f09fb057c10cff3fe3d470cd2ca7e1fba06769e8766ec32dda5221d8fc7573ae42f46ba730bab04665326d3a89ea11e69f63b2b3d3a3a9a74049a39a423ad3951d99f0007efeb93f32f470b7c3cff7281c77e61db40f6fd9ae37ddffc0bf8f1fc0bffdb47ca68eac73bc97e992d9ed747fbf6bb46ae4b94e4022fe48d7bf033189b855c6c1bb0fdb248c469f6018b046edcb38d051916119e454a782e11785cbc35fa7ed63bae727dd562c2a3309629b0fd3d123c3c37acd13629c99937f9a2ddd99362be2e7b7ab1d05523d154628ed6d7f681df78c46cf0c83683fb94455582d1b59f4e6b0ec2d7862dad02de4617e857b87f75ed59a886f2ba84f028f4dd7923fbc98297b12daed7b53d0b35825f9170805f8e680e3c7290f6668b8dfb66b61fe49c88a6bdea9bb7e1fd1390c7356fd3461835fa51d79ca06c530d0ddad23a8f1c39a279b1b0a9db1c32238cf6af9ed257a24d042fe42ded7e2e03ee47b4ec3a9f7d5c099b722c79fbde0fe6bd2c7dde79a5ba55e07923b45bb26ef1bcd19d62be4fce5fe33d411e0da41bd0d65218cff64443c7a969d88e9becc56bbda3c977d33017cf6b3d0dbcad3222223dd45298e75b867beea25d4969e4dcd11e717f60b4efba03aff5be437d2e7a608ca2b186ccf344a8f372dd85d77a1f14755ece31a1cef37e06e88ce7e1b4f61ca10dc2fce662076fadf9065f5bbcb80a78b36dccff9aae267baa31da776d8c65abb5e9f02fdda5ba7acdb31d9b8bdcf615dbb19fa0796dd4b703a2a1e5c176d9129137d21c45f14b44de7afb75f2ed8c6982c0bdd281e933029342bd69d76c2b5609fd373b6405cd3fd3dcfd17690d08f56136e9ed7b8ee7b8cacd73f1f85d610f649ed74d50beab1dbc792f4a4abc87ecf1c01a91fcde3247e1efd2bb24bf9584ae81ddf431e8d719bb4cb758a4e36f2c5738e42f46e9caeffbbe84f71d7d99ead9f7689cae35b7ef5ba35e483a02cd22d26db34807fae5448372aa1334489b239a9f88b64461cce26cdf9a856cdcbe3d55a1f64d6b7c26dbb74b1cb282e6d754ef7e43ed97b423ccf3bf3b9ee30aeddbc8dab7bf9569df643b35d2f66da148578deddbefa89efd9ddab7d94a98567874d44c3a020dcfd1625d95e791f1fef09aab963def9beb667b1e71d01db7b948075b92db65c85427689036473413ecdcec61560792d694e32c5aab966d0cdb403c2f54ad73b63cd7ec5a375098cf2abb6ec073479061b86f1d9779f23a996850d7eb3cfc7244730cd5019db9b7be51cfbd1d4b985c736f72fe9775c57b75b5f6da4959a07bd7feb326a15f85f923d5bd765c3e26df850e5941733aadf53cc38679fd80d78d3a1dcf7195b333b87c15c68e79d7b7202b1dbc794f5c4abc87d875b033c087ed3d843b8e1ca495fd3374cddf7ca32f64ec32dd32918ef7c1af70c85f8cd295dff73d3bef7f3c8bea19ea9166bfb3c2a3a3934947f27b18cdbd7fb23f91ebaf6c63d4091ad7dcd679d446f1be08de53efdacfa475a681cf3e023fb68f9610462923af87fbf6dacd177146ae054a728117f2c63df8f15ebbf9148730db2f72ffdd58ef11840cae3d826cbf5ce2c9eb48a2411dabf3f0cb11cd32d1bfa63fde1eb05f788c5c8cdce3edbdeb11c27e9176eb7c218fcb6e9d4874c5d46419982791b240f7f31db25c2ef4ab6067b42bc93a649fa89c07665941b391fa957eb24fe458ac745e90e339ae31dc7f99e73102ca77a98337efdd4b89f790fd1bb05fe49e3fde8fb28bec17b97f10bae6f110dafa72fb0e5dfbc640b3c4217f31aacc580ffc4c996ca17ab69bec17ad7e6789474747928e40b39074d4ac8447f627c0017eaef9e523053e9e5f7eb6b05fd097f35aa8ecfb35c74c729e06f73cbf83b8058451ca68eac73f0e1a08fbec97b90eb9e629c9055ec81bf7e0c7f6cb5c8a4398ed1769d38cb5dd05195c7617db2f0b3c791d4134720e4ef2e339b8d78afe35fd31439f73cfa6b4d7783cf00661bf489b6dae908775c5fb5e15cab3dd25cb110efd82e6cd42bf0a3672bb66dde5f231f9363b6405cdbdd4afdc47f609ea36db2fef773cc755ce7ee1f2d5da9721d7f1163b78f35e8b94780fe92b61bfb8ce8943f851b25f64bf2fdb7cde1fc8d865ba79221def295fe490bf1855668e9dc7d4efa47af67eb25fe62a615ae4d1d111a423d0cc271d69ad3bc9f571e0e0b51ae0a81334bc3e0e9ac73df60be4f4cd53688df77dfd25f83552dc5cc2286534f5e371b25f3ac473b6cb9a492ead736f7c76199f6fd062c3b3290e61b65fa44d33d6761764984b78b4de47dfd9117375755160bde32ad757cd233c0afd73db68fbce05844763be4349ce3cdba5697feb286dcb7942573cd7cb6353adb64fdaf7b807bf80b932980d1ed9ced513dddc2ac18838b63bb4c602be76774115f0e63de8e82fb9bc2ab14e319af2623b4ac1de287d9f798ae065eca13f93bdac609fb6d5087e45c2c17b804073df5183b47fb5d8d89e609b679e88d39cb7e77eb518b9e767200fdb4108f3f7991a7dbfcb4e966daa6b2e48cac1e3f75a5b16f2fb4cd79c14dbdd0b45dc58af054246ee47b46c519f4d5f093b782c79fbde0fe6adb0ff20af54b7da789c2fbf4f71adfb1e49ef8a6b8e00ef09af4743373c8fa2f19e28cd8db5b9e6c6e4de519e9f3a56e868894747fcee4237bc56a6b18f4e690eabcdb5fee9faae6bef1e1ea1a3651e1df13c9efcf6b736da779eb0c9c62f13bcf7d878994753a4bb0715ed03e64be709fe9af317be76725e15f066bb95d7d5aac9d6698cf69dc367d96a6dbac3edfd025dbde6d9c6cc456edb876dcc9ea30631a3bee1db49b90eca7615f2469ac3297ebec81beb3be9bf3f6d79c63441e05ee6c074aec0947ebd69cb6bb6154b85fe5b1cb2ee3da78fc60fb36c98df9f0ed2db52c7735ce5e6cd786cadb0e730cf7b3ce577f2cc7b25614d89f790fda55873021f3edb1fe125f42ec9bdb2d075b9eff35de9e689747c76e4a50ef98b51baf2fbce86e6b30b2ea67a867aa4b95670a94747b34947a0994bba6d11e940cf737128a73a4183b439a2592dda92f4c713eef6ad45c8c6eddbe5156adfb4c64eb27d9be39015341ba9def553fb25ed88d25e2ec7735ca17d1b59fbb6ab4cfb26dba991b66fb345ba6a6cdfb6503ddb4ded5b871226df7ecb16d21168f8db7039ce063db76f789fea040defc505cdcda22d49df5e75b76fc0328f3081e6d60ab56f5a631ed9be75386405cd0ba9debd98da2fb90e6e9edfe1788e2bb46f236bdf5e5fa67d93edd448dbb71691ae1adbb7dba99edd3106f69b6c835cfbc24d5cb30d839ecf57e63d2a5aedb2ef5ceb0ec28838e8ceb53e87b132b7cb90a94ed0f0581e34f7521b58efa035e5780beded9136148ff1784eba5ad78b789dcbb566a9f52d9f6fcd92e7ad5dfb9511e6bdc90b3d799d4234f2bbc072fb80df2ffac1f4e7ca07f6268f66deff83c3ccfbcbb527d615cffb2bf4bdce350ce87e9e43968f09fd2a9c15d3a66967c8f3d3663b6405cda7a9fdff2cd911f25f07e6f9938ee7b8cad919ca6750e4d9b692ff6c769d8b9ab69dc1fb86792e95ed3d84bfe19873853ea06b3e37439ea9e04ab750a46b249ac50ef98b51baf2cbf52bb98662cae409aa674f929da1d5ef2cf6e8e814d21168785ebe527b5c81836d05e0a81334bc3f04343f107b12d097f3d939ae3d595ae75ef9fa4bb6ebe49eac7a878cbc17c7d4ff2e1bdf41695a449c91ab59492e396f887bf033183b6db885e21066fb45ee571eeb3dd5906136e1a9d4de7c176f8d7fc88e76ce4ff97bbd02ff4f702478782d5663de556b2d92dbf6b4f726cbb6467e9751e9fd9fbe310eaf9d8e37ccfc2dac6bfd7d769560748d65b5ec6a5f1b5689fd12c3f1e6fd123c47e2da2f510de5c573360a7d77699fefa98297b12d0e3d5a956f816d068c45240e9ecfb9f3e841da236dd8673fb8fe433b56df12b1fd50ee3fb45afda8ebfb2bd9a6babef773ad2982e644ab7fb9cfd7f5cd3cefa59f2fe234dfb1917c330f19c7e29bcb6ab329b578fbde0fe6ad30b6cd2bd5ad02cf53a2dd2a773e420bbd2bae394ebc27ae795ede7faef19ee8cc89e69d73a2f25b169e47ec143a5ae4d111bfbbf25f42b5d1bedf7f35d9f8458237f6b0ca3c9a22ddb13fcf6114e99ee7deb4c6b9be3640f93ba211f1f6d964d5d48ff377edc0cfb2d5da7487d9fb79ba7acdb3fd24f701f1fc3568161e3d8819f50d7b58a58dcc3603f2469ac3287eaec85b6f1da090674ce5cec707cd128129fd7a53c86bb615726da2d3212b6856906dbcca86f9fde922bd6d713cc7556e7e85c78d955e9b60ded5b036b199de25b9c6005d8f766d42ae6954e3dac46554cfb6d0f8b04509d3628f8e9a4947f21f37ae395dd0f33c13dea7bac86d13e7886687684bba5297d7ddbe014b176102cdae0ab56fe9cbea6edf5a1cb282e606aa773751fb25ed88d23e1dc7735ca17d1b59fb765b99f62de9da6bb348578deddb73a89edd4eed5ba712a6c51e1df11e7dd73f8f5ce710e139aff5698de97ddf50336ec44177dce6221d6c496e9721539da041da1cd1dc416d60bd83d694e36b260e8479ae90e7a45cf311d53a5758cd6719b8ce74926719b8e6e540732ad1c8f57dd79903a079a7e807d39f27e91bf59ccfbb8799f391f38ebe330734d6795db240f7731cb23c22f4abb08fb0a039f7c0e563f26d76c80a9ac7a8fdff10d91128275eaf78c2f11c57393b83cb5761ec98e77e457e2bc0bcf99cc894780fe9d36067800f7fdf8ff0e7c9ce90fdb3dcef6cde11f9cf0457baf9221d9f0d7d8943fe6294aefcbefdcf7ceec1e354cf9e203b43abdfb9c4a3a3534947a0e1792badbd42b23f91eb7eaebddea70a7c3cb7f555b11e85be9cf74fc9be5fa92d2bbb178a6d38f97d62bd43465e8735f57fa68defa2349d224e736fbfb4df700f7e06638f0d77521cc26cbfc875dbb1de9b06195a088fd6bc4687c0e3e2adb1e63edaef9e78ef8142ffdc3eda313aaf55688c6db4e6eab96d4f7b8f976c4b5d6b2b95dcfbe31be3f0da42c01c30bb3073bfc8731ba06ba9128cae3903adf18bafafa8c4baed70bc79dd167dbc6fddb61aca8be7c6146ca4d25ebad3042f63c3d51fa3cab79d6d338cf9240e5ecff8e93183b487dab0cf4e6b167163b94f89ed34b6dd10e6bd741af64ab9b525dedb81b6b4dcda12688eb5fa977be9586684796fc45c11a7f98e25f96fce58dbcffb236fdffbc1bc15e610b4ce7a68e7f960b45bb26ef1bed3a9f4aeb8e692f19ef07c3a74c37b3c35de13a53d7aedaef95ab95f9ce76b0b42470b3d3ae277579e35aab5775269bf61fb68f71bf6081d2df2e8a8dc7e4325594adf3b6bfca392e74a4772f66a51e868894747c39dbdaa35cfca7385c568dff565cdf9245f1fa0fcadc68878fb6cf26ab2e3f89c12e067d96a6dba43edfd1c5dbde6d97e2eb74e049a4b8f19c48cfa86bd94728cc43623f2469a43297eb6c81beb6d0aefcf103b7682c0bdc4816995c0a4506fda35db8ac542ff3d0e59f7fe2f98c646eb6d98df9f99a4b71d8ee7b8cacd63f2bc81c27e97527dbe947016890ff35e4e5853e23de4ec22ac01820fe27314de4eef923c8709ba0676d3c7608f126397e99a45ba46a259ea90bf18a52bbfdcfbb44c603665b291ead90e9a1fd0da6bb4d4a3233e9709342da4db1e914e9ec56668504e758206697344739d684b14c64acef6ad47c8c6eddb4d156adfb4f7c9cabde22c2b686ea57af73c6abfa41d619ebfdaf11c5768df46d6bebdaa4cfb26dba991b66f1d225d35b66f2fa47af66a6adf662a615aead1510fe90834f349b7720e01f4dcbec9bde23d221fb60def146d8982bdea6cdf8085bf9d06cd9b2ad4be698d7964fb36d3212b68eea17af7766abf50663c2fffa8e339aed0be8dac7d7ba44cfb26dba991b66f3d225d35b66ff7533d7b740cec37d90671fbb690742be7ff405fce7e93f3816cbf7d58b4255aeb59b27d93fbdbb97dfb5885da37ad7d553efb8d6505cda7a9de7d96daafbdff1321bd3de9788e2bb46f236bdfbe51a67d93edd448dbb7f9225d35b66f4f503d7b720cec37d906b9fe236fe2b0ef91f77a220def89d46a977ddfc2741246c44177dce6221de602cb9dc972a8c887d7c67e4c6d60bd83d694e32f0e1c08f35a3faf29bbd613ab75adbf9acffb810ce5cefb71adab83e634a2417d28772e0f68fe20fac1f4d73907be8519cd9aed9f8759b395fb065857bc66ab358e92b240f7cd0e59fe2ef4abf0bd95ea388acbc7e4dbe19015347ba8fd8f260d8479df09ef373ad4f11c57393b83cb57612ffe90ffb34b3b9279f3ff4152e23de4bb0bd819f21c1afec6b971d220ad5c8f86aecb9d09ee4a27cfbae5b3f71738e42f4695e91b79adfe80498361d423cd7e67814747a7918e40c3eb8e5af6835ccf050efe6e56fe8fc6b5b70f3493ac0eb19fccf59d896b3fadd6b7a3befe92c7ad723fed70fb281b08e34c4ad323e28c5c5ae717c87511dc839fc138dd867b280e61b65fe4becbb1fe86073274121eadfadf25f0b8782be8a2c07ac755aeaf523e43bb30da3516de6ba2b1aea4b5d782dbf6b4bf85916d8d6b6f4c25f7eefbc638e5fe7b53ed980d1ed966f0d8b1b34a30bac6b25a76b5af0dabc47eb0e178f37e30f43dbefd60d5505e3c67a3d07797bed1385df032b6c5fc49aa7c0b6c33602c2271e488e65b64172fb2619ffdd021e234f71a0cb7ff9ded07b62910e66f3434fad19a68dfef7d659bcaeb0b751e39787d618db0a9db1c3223cc7b2e678b38cd770cbc90b76b0e0a32723f329676ddfec8dbf77e306f85b16d5ea96e0d393f5c9e4bc77b6341b38dde15d71ca73c8781e7a2f9db218df744674e34ef9c13759dc50a9a5d4247f33d3ae277579e135d1bedfbed6e938d976bbc38ef58e6d114e98efd796f7791ee79ee4d6b9ceb6b0394bf011d116f9f4d564dfd389f3307fc2c5bad4dd768ef9b75f59a67fba9dcfc35685e46f3a9a86fd8a32f6d64b6199037cf4f21be45e4adb90ec0982608dcf31d985e253069ecabd56c2be4dac47487aca0793dd9c66fa0b507ae77787ebfe339ae72f32b3c6eacf4da04f3ae86b5897794599b00a6d1ae4d748874d5b8367117d5b3fb697cd8a384698147475da423d0f0fa809cd3053dcf33e17daa8bdc36718e68de23da9262faf23adb37b6c98109348f54a87d5390d5d9bef5386405cd6354ef3e44ed97b4234afb741ccf7185f66d64eddbe7cbb46fb29d1a69fbd625d25563fbf638d5b327a87d9bae8469814747bc570a34fcdf0dd7b97778ce6b7d5a637adff9178c1b71d01db7b948075b92db65c8542768903647344f521b58efa035e5f800edf19267f1b10dc4f311d53a5758cde7d0b8ce1094e7d0b8e6e540733ad1c8f57dd77931a0794af483e9cf93f48d7acee7df8699f391f38ebef36234d6795db240f71d0e597e27f4abb08fb0a039f7c0e563f2ed72c80a9a3f51fbff17b223504ebc5e71c0e47d9fe32a676770f96afce78dfb15f92d14f3e66f2252e23da44f839d013e7c360bc2b593076965ff2cbfe730ef883c13dc956eb648c7fb8de739e42f46e9caeffbcf229f59f357aa67a8479afdce3c8f8e4e271d8186e7adb4f60ac9fe44aefbf1dc569da071cd6dd55b1d623d0a7d39ef9f927dbf525b56762f14db70f2fbeb7a878cbc0e6beaff45369ee7488b224ef39b04e425f3063f8371163d471cc26cbf4c17719af54dda9db8e7bd6990613ae1d1b2fbe5b70e2ede1a6beeac775ce5fa2ae533b40ba31da3f35a85c6d8466bae9edbf6b4f778c9b6d4b5b652c9bd3fc39dc7341e311b3cb2cde0b1e3f42ac1e81acb6ad9d5be36ac12eb89c3f1e6f544f0f5ad27564379f19c8d42df5ddae37586e0551a1b4c56e55b609b016311892347345f983c483bcb867df64397881bcbfd336c3fb04d8130eff1d21ad3fbd63c78cf81fc87886bcd033497089bbacd2133c268fff87f0a95681347f21f0bc8c8fdc858da75fb236fdffbc1bc15c6b679cd3d93183ba2dd92758bf743aea777c535c729bf2de66f6178efa1c67b52c97d70721f33cf236e163a9aebd111bfbbd00d686ba37df7fe374543f772e139f678c93c9a22ddb13fcf6114e99ee7deb4c6b9be3640790ff98878fb6cb26aeac7f9fc04d7d904b5365d83bdefd0d56b9eeda772f3d7a0b995e65351dfb0c74bdac86c33200ffee61cf19d226fbd7580f621e7ce4e10b8e73a30bd40604abfdeb4e735db0ab93631cb212b686e23dbf8a5b4f680fa7011e9ed2ec7735ce5e65778dc58e9b509e65d0d6b136f2cb336015d8f766d42ee57acc6b58957503dbb8bc68745254cf33c3a9a493a020def259825d2c933f00c0dcaa94ed0206d8e68ee116d49fab6b2bb7d9b2564e3f6ed1d156adfb4c605b27d2b3a6405cd8354ef1ea2f64bda11a57d3a8ee7b842fb36b2f6ed2365da37d94e8db47d9b29d25563fbf63eaa678f53fb769112a6791e1dcd221d816636c5c9b31bea290daff5159570cbf655aeeb35521c74c76d2e68614b72bb2ccf576c10f9f0f98a4f501b58efa035e57825edf12ada789e9372cd4754eb5c61357fc7ea3a1b437ec7ea9a9703cd194483fa50ee7b53d07c57f483e9cf93f48d7acee787c3ccf9c87947dff7a65adf564b59a0fb2e872c3f13fa55d84758a8c47e12791e32cb0a9a5f51fbff6bb223f8bdc2f3bf3a9ee32a676770f96afc7f8cfb1579e61cf3e673bd53e23da44f839d21bfafe4bdfbff457686ec9f81a9dc5977ae74f20ca746a299e390bf98b2fcbefdcffccdeb6fa99efd95ec0cad7e678e474767908e5cfffd2c2ae191f3816750d85cdce7d4091a5e1b04cd3fc47a14fa72de3fe55a8fd7da13edeb2fd98693ebf1c3adc3f21eaf8b29cd05224eb3dcc00b795f40616084dd7701c521ccf6cb4c116770cf50c2ed9b7f9e4118c18ff7ab21ccf6cb0c4f5e87108dfc7e4cf2e3efc78e9e32e0ebcd2df439cf5301161e6f83660a61e2b4c07581908775c5e38f0b529765e05b38290b747f81439693847e15be476c579275c8fe44390fccb282e6b429837a39c386eba99c785cd4e1788eab9cfdc2e5abd05fe5b9fd94df3a326ffeef524abcf7398781c72bbca68270fb94415a39ae81ae796c27ed7e57ba19221d9f4bd9e590bf18a52bbfefcc43fefef44caa67a8479afd4e97474787908ee4dcb0c1334b098fec4f8003fc5cf3cb87087c3cbf7c2eb5514616f4e590b33edab7ef576acb5a5df334726f796334744e0c18a58ca67e9c543710e6efc0a6529a0e11a769070f77de107f6b35dc3776aeb5e96e25dcbe79a36ec20819caed31aba13432af7aa291df57487edcbf2e55ef5f07ec17fe6eb34858f89c13d0ac10f68bdce3df21e4615df1f840613f5e974b16e8bec321cb5a75fb30dfa524eb90ef5de4bf625956d06ca07ea58fec139413f741bb1ccf7195b35fb87c15c61b25fbe55cc2598cf6b5b50deff3086b4abc5b9937ec17f0417c8ec23bc97e011df4015db38d7f8e0d337699ae5ba46b249a731cf217a374e597e3b31902b32993cd54cf7691fda2d5ef9ce3d1513de908346ce369ed8d95fd0970b8ce78aa13343c6f0a9a9b85fd82be9ce5947dbfe6dab26fef2ff8b14dcdf32f5246533f6e9e301036f55f9e6569e85b459c912baf241778216fdc839fc1087ba495e2103e9370378b38837baa126ef94d0feea71246c8e03a23e02cebd7501a99d7c14423e70e253f1ec3bd46f4afe9f7837d1daebd1dc0c2fd2068ee10f68b1c93b50a795857bc9720fdf2ec2bb86439d8a15fd0bc49e837fd36b6afa05977e55eca824356d0dc43fdcadbc93e41dd6e23bd3dea788e6ba4fb5414c61b79d7fc5ab78337efb74a89f7107b11f68bfc2f04db8b8f90fd226d7ce8ba9c8def4a9717e95cdff769f65d727cd62d3097ce57a37af628d92fad4a98ba3c3a3a987424cf893478da94f014041ee0e071aedc43001aa4e575df8f08fb057d39e4f4fdef4dcb5ef4f5973c2788b856c2286534f5e328b25f90661aa56911719af68bcf2e63fb05edaaebbc70b65fa44d33311afa0d413145dc3ebbab40182183cbee62fba5e0c9eb20a2413daef3f0cb11cdd744ff9afe3b3760bfb4dbbcd027004b1b6102cd3785fd8278e06a11f2b0ae40ab34c75d70c902ddb73864f9bed06fbb0226cdf97c2e1f93ef5487aca0f931f52b3f25fb04e5c4678ffcc1f11c5739fb85cb576bfd88c76f45e2c3bcbb096b4abcf7f9c68bfb731e3723fc7bb25f64bf2fdb7c9e8766ec325d41a46b249a0e87fcc5a832eb47e067cae429aa677f20fb45abdfe9f0e8e820d211685a49475af32f720c0b1c3cff021c758286c71da0f9abb05fd097f37a0568b99f5768cbcaf697e0d718ed3b7751ef90d1d48f9b6c63c2b6c1d994669a88d36c4bc10b79e39e6d156963355098ed97bc88d3b4dff302b7cb5671d96208b3fdd2eac96b22d1a0ded579f8e588a6e1d8011ffd6bfa36dc80fdc263ef6254dea63a9c30715ae09a26e4615df1790ed3529765689f0e59a0fb690e592609fd6a8cc93465e5f231f9363b6405cdf1c70eeae5441be6b68fdb9566c7735ce5ec17e5f33a9cdf81b9fe0725bf254f81f790fe1bf68beb1c1084cf3e769056ce11c8f94df38ea0fd77fd2303e95a453a9e5b6877c85f8c746d0579aebc299393a99ea11e69f63bed1e1d4d241d8186db632dfb45f627c0c1f60bcabf4ed0206d8e683aa88d32b2a02fe7b90dd9f76bce2f49fb0cf7e0c76b5cbc1624652cd58f9a419d0cb98a2902ae8d06163af1d2d6dafc9be8fe02f1fc42f17c8eb89f27ee1788fb4bc4fd6271bf54dc5f2aee5788fb55e27e8db85f2beed789fb5e71bf51dcf78bfbcde27eabb8bf52dc5f25ee7788fb6bc4fd2e717fadb8bf5edcdf28ee6f16f7cf11f7b78afbe789fb1788fb1789fb9788fbdbc5fdcbc4fd2bc4fdebc4fd1de2fe4e717f97b87f93b87f8bb87f9bb8bf57dcdf27eeef17f7ef12f70f8afb87c4fd7bc5fdc3e2fe5171ff0171ff2171ffb8b8ffb8b8ff94b8ffacb87f42dc7f51dc7f59dc7f4ddc3f29eebf2deebf27ee7f28ee7f2cee7f26ee7f2feeff20eeff2aee4d80ef6bc57d4edcd7d97bbe6aad5fb47e5bbeb3bdbdbfabd0dfdad6da9b2ff46ce8eec8b7776ce8ec6eed6eede8eee82b74b7b5f577b77777f56ce8e9caf7b4b6b7f5b76eeae869db641bcfa628bd76f8c2f4f2ca8f17997f5f2199f34fef6afd438afa3bb426fdbefbd011d4f5fcd3bb861cd2fc7475303dd229f79a94653e270599f385aeaeee9efe1ecdb2e94eb16c668d93b2393f1a1fede5841465be609cc85c93a2cce76550e673a3cabc834f57e6c352e8cbfafbbabbbb3a5bbb0d363300fe366135072d1a1ec69f61ef6b843f331a3cf8dcf8a75a7f82f59bacdf6dfd6759ff22eb5f6cfdd9d69f63fdb9d69f67fdf9d65f60fd85d6bfc4fa8bacbfd8fa4bacbfd4facbac7fa9f5975b7f85f5575a7f95f5575b7f8df52fb3fe5aeb5f6efd75d65f6ffd5eeb6fb0fe46ebf759bfdffa9bacbfd9fa5bacbfd5fa5758ff4aeb6fb3fe55d6df6efd1dd6bfdafad7587fa7f577597fb7f5afb5fe75d6bfdefa3758ff46ebdf64fd9badff6ceb3fc7fab758ff56eb3fd7facfb3fef3adff02ebbfd0fa2fb2fe8badff12ebdf66fddbadff52ebbfccfa2fb7fe2bacff4aebbfcafaafb6fe6bacff5aebbfcefaafb7fe1dd67f83f5efb4fe1bad7f97f5efb6fe9bacff66ebbfc5fa6fb5fedbac7f8ff5efb5fedbad7f9ff5df61fdfbadff4eebbfcbfa0f58ff41ebbfdbfa0f59ff3dd67faff5df67fd87adff88f51fb5fefbadff4fd6ff80f51fb3fe07adff21eb7fd8fa1fb1fee3d6ffa8f53f66fd8f5bff13d6ffa4f53f65fd4f5bff33d6ffacf53f67fdcf5bff09ebffb3f5bf60fd2f5aff5facff25eb7fd9fa5fb1fe57adff35eb7fddfadfb0fe93d6ffa6f5bf65fd6f5bff3bd6ffaef5bf67fdef5bff07d6ffa1f57f64fd7fb5fe8fadff13ebffd4fa3fb3fecfadff94f57f61fd5f5aff57d6ff37ebffdafaff6efddf58ffb7d6ff0febffcefa4dd6ff83f5ffd3fa7fb4fe9facff67ebffc5faffcffaff65fdbf5aff6fd6ffbbf5ffdbfaff63fdffb5feff591fee1fd68f6c3f5163fd5aeb1f60fd9cf52758bfcefa075a7fa2f50fb2fec1d6afb7fe21d66fb07ea3f58f88dde1e858ed95b67dcf63c6a7db671fa130fe3c82c69f69dbf926df6744e9db2e47d654c6aecc3fbdab354d998f1a2732a739d770f43891b93645998f1927321f90a2cc93c689ccb914659e3c4e649e90a2cc53c689cc7529ca7cec3891f9f414653e6e9cc87c6a8a321f9f41994fc8a0cc276650e693c689cc47a638d66aca60399f9c41994fc9a0cca76650e6d33228f3e91994f98c0ccafc8c0ccafccc0cca7c6606653e2b83324fcda0cc676750e6e60cca3c2d8332b76450e67c06656ecda0cc850ccadc964199db332873470665eecca0cc5d1994b93b8332f76450e6e91994f99c0cca3c2383329f9b4199cfcba0cc333328733183329f9f41992fc8a0cc176650e6591994f9591994f9a20cca7c7106659e9d4199e76450e6b91994795e06659e9f4199176450e6851994f9920ccabc2883322fcea0cc4b3228f3d20ccabc2c83325f9a4199976750e6151994796506655e954199576750e6351994f9b20ccabc3683325f9e4199d76550e6f51994b93783326fc8a0cc1b3328735f0665eecfa0cc9b3228f3e60ccabc2583326fcda0cc576450e62b3328f3b60cca7c550665de9e4199776450e6ab3328f335199479670665de954199776750e66b3328f3751994f9fa0cca7c430665be318332df9441996fcea0cccfcea0cccfc9a0ccb76450e65b3328f3733328f3f33228f3f33328f30b3228f30b3328f38b3228f38b3328f34b3228f36d19fc1fdded192ce7978e1399d3fccfe6cb3258ce2fcfa0ccafc8a0ccafcca0ccafcaa0ccafcea0ccafc9a0ccafcda0ccafcba0ccafcfa0cc776450e6376450e63b3328f31b3328f35d1994f9ee0ccafca60ccafce60ccafc960ccafcd60ccafcb60cca7c4f0665be378332bf3d8332df974199df914199efcfa0ccefcca0ccefcaa0cc0f6450e6073328f3bb3328f3431994f93d1994f9bd1994f97d1994f9e10ccafc4806657e348332bf3f8332ff530665fe4006657e2c83327f3083327f2883327f789cc87c788afb7a3f92c1727e3c83327f3483327f2c83327f3c83327f2283327f3283327f2a83327f3a83327f2683327f3683327f6e9cc8dc94a2cc9f1f27321f91e218e3890cd6ed7fcea0cc5fc8a0cc5fcca0ccff924199bf944199bf3c4e643e304599bf324e649e98a2cc5f1d27321f94a2cc5f1b27321f9ca2cc5f1f2732d7a728f337c689cc87a428f393e344e6861465fee63891b9314599bf355ecea14951e66f8f13990f4b51e6ef8c9775c91465feee7899274951e6ef8d13998f4c51e6ef8f13998f4a51e61f8c13998f4e51e61f8e13998f4951e61f8d139927a528f3bf8e139927a728f38fc789cc535294f927e344e6635394f9a7e344e6e35294f967e344e6e35394f9e7e344e6135294f9a97122f38929cafc8b7122f34929cafccb146536e7081f60f33a95e4afb13a30cf72b19b10bbbad899797a336f6de671cdbca699e733f35e661ec8cc8b987902336e36e34833ae32e30c63771b3bd4d865c64e31fdb6e9c74cbb6eda39f3de9bf7c0d40ba3a7a6d89d1cbb5308cf93d63f2a067674ec8e89dda4d84d8edd94d81d1bbbe362777cec4e88dd89b13b29764db13b3976a7c4eed4d89d16bbd3637746ec9e11bb67c6eeccd89d15bba9b13b3b76cdb19b16bb96d8190599c3960bb16b8b5d7bec3a62d719bbaed875c7ae2776d363774eec66c4eedcd89d17bb99a69c62777eec2e88dd85b19b15bb67c5eea2d85d1cbbd9b19b13bbb9b19b17bbf9b15b10bb85b1bb24768b62b738764b62b73476cb627769ec96c76e45ec56c66e55ec56c76e4dec2e8bdddad85d1ebb75b15b1fbbded86d889df93fbcf95fbaf97fb8f99fb6f9bfb4f9dfb2f9ffb0f91faff93fadf95fabf97fa9f99fa7f9bfa5f9dfa3f9ffa1f91fa0f93f9ef95f9cf97f9af99f98f9bf96f9df94f9ff92f91f91f93f8ff95f8df97f8bf99f89f9bf87f9df85f9ff83f91f82f93f80392fdf9c1f6fce5337e78b9bf3b6cdf9d3e63c66733eb139afd79c5f6bce7335e79b9af33ecdf997e63c48733ea2392fd09c9f67ce9333e7ab99f3c6ccf95be63c2a733e9339afc89cdf63ceb331e7bb98f34eccf91fe63c0c733e84392fc19c1f60bea737df979befadcdf7c7e67b5cf37daaf95ed37cbf68bee733dfb799efbdccf74fe67b20f37d8cf95ec47c3f61be2730fbebcd7e73b3ffdaec4736fb73cd7e55b37fd3ec6734fbfbcc7e37b3ffcbec8732fb83cc7e19b37fc4eca730fb0bcc7abb597f36ebb1667dd2acd799f52bb39e63d637cc7cbf99ff36f3c1667ed4cc179af933339f64e657cc7c83197f9bf1a8199f99f18ab1df8d3d6bec3b63ef98fedff487a67f30eda5693f7e42efd6e1d63fcefa1b7bb76d6bdabda3a977d7aefe9dbbd75dd57bc3ba0d5b77afdbb5f5a6fec8bec211bd9e73b66fddbdb577dbd69b7a776fddb1bd694befae2d4d7d3bfa77356ddfb1bbe9aadedd1bb744f6c52e35583255ffcea6debebe9dfdbb76356d1d48b37b4b7fd3c61ddb77efecddb8bba9afffea6d3b6eecdf69d25c67d31e6ffddeddbbfbafba7a77096b5f5fd3f55b776f69da715dffce4ddb765c6f9e3f6f14f4b14ea2d32c9d799193a49b6fd34db1f7e7efdcd97b63d3d6ed7dfd3734edb87677d38e4d4d1b765cbbbd6f1727ba2d21b3bb9230bb2f49a253262443787bc274774d4800f29e2489de9524d1076ca211bc2e9cec2349787d3649a2af2449f4dd24897e9324d17f26ac16cd75c9d215eb1280bc3821b32f1c942c5dc3c1c9d25d7e7002e1362564766d1266372764f68184e9fe98305dae3e8170f5f5c9984d4ac2ec8484cc1e4a98eef709d39516c213a4bb2161ba0f1f9240999f4c92e8cb4912fd23a158d31a92a5bb2b61baef372410eea74912fd2e49a23f2749f47f4912e51a13246a4c92e8e824894e4b92e8ac2489f24912752649342349a23936d1280db1054978ed4892e83a9b68b46fe2f39330bb2d21b30f88744bfa7bfbe23159dfd6bed2606c677cdb6414dbd7bbbb97d39d7468b2740f1d9a0ce7c3872650ca6349127d3321c2a79230fbf724890e3c2c19c24909d31d77580290272749343321c24b12a65b9a04e4aa2489ae4f88f0b684e95e9e04e46b9324fa6842849f4cc2ecf349123d9510e19f13a6fb6b1290ff9724d171872743383561ba96c31380ec4892686942841b9330db9a24d14b12227c4bc274f72601f9ae24893e9f10e10f13a6fb491290bf4c92e8802392219c9230dd09472400796a9244e72744f8a284e9de9004e47d36d1284df60792f0fab84d74f2be825d75edb6dd5bafde76a35fba4f27e1f8e384aafc791266b92393313b3a61ba2947260079529244e72644b83461ba154940ae4d92e8e684085f9330dd1d4940be2949a28f2444587354b274471c9500e49424899a9224eab68912b53d3392705c9550916b9330bb2921b35b9230bb2721b34713a67b2c09c88f2649f4fd84084f383a59ba69472700d99124d1029b2851fd5f9c84e3f6843ad99984d9eb1332bb3f61ba0793807c3849a2af244438e59864e9ce3a2601c8d62489ba93249a9924d1329b2851e55f9984e3b509b57f6312666f48c8ecee24cc3e9490d9479330fbd784cc7e9f30dd9f9280fc5b9244c74c4a867075c274574e4a00726792442fb58912bd6caf4cc2f1a1843a793809b36f2464f6f384e97e9504e47f244974f0e4640817264cb76e7202909b9224bac5264a54259f9f84e3db12eae4be24cc3e9f90d97712a6fb4112903f4d92684f4284474d49966ef29404204f4c92684642844b12a65b9e04e4654912dd9410e1ab13a67b7d1290772749f4e18408bf9a30dd9349407e2f49a2ff4a88f0906393a53becd804208f4992a87d1408a3ff0f6b53bb893d910500>, + "bytecode": Buffer<0x1f8b08000000000000ffed5d07781cc5f5df93cf7291251bdb1863303ec996bbecbb53773d174cc736bd837101420d36a126819090402a1020045280342015125a12d24348208d24a4e79fde13524925ff19699ef5d3d3ccde696fdfe98e9dfbbef7cdeedcccbedf7b33fbe64ddd54d0fffbfea820785f5dff754a91ba0df46d06ee47996bba4fb3fbd12cfd1876dfc8ee27b2fb3dd8fd1476bf97a202dccf62ff67d87d33bb6f61f773cd3dfe52262c98b03ddbd5d1b1bd3bbf3dd79edb92cdf79eded399ede83cbdab27d793ebece9dc96ef696fdfded3d1d3dd7b7a6f77b637d7d1be3db7a3b3b77d47b6ffb7109e952df3a7b18d83e7cd53f49ca2f9265c60c2853e4c44b858d1a2a0bfce62bd58e4f593f87aa1097fc6b4c7658b727383f86c645b8cb8c8b6eb676682fe3649ff52c1d05f2a669da482786d3d61241996285aaa9fad28a7286f932b4e61c6196512f3e70ce3e70c101deea32b40306084a8a265cdffed90ae23082f80722b52677cf2ef90c4d9151d673b8fd0d8b4639436cfcb1b7d7798b0d3845d26a474dd8a7a14f52a5a06f1f4ab8b59e6185f8e5c7710bf535507729311d5a1765a9717d14db6bc5f2e17a39e97c7a81b6d78c8e9e7bfb88de7d2207ee3a97f2b02412329a5881502cf5d19632593927b65fc65948547ee6ecce22cffb874ba34c667ad0a6ad308c4891bf1ae0e6acc08ac62a0e37a6e21a86e23801520c6e75ab1962b3f19d4b8bd8195555ade7ef8c9877c98614d3074f8698dd74fe2ebc5daa07fd842d70db28fb65fc184d9f27eed34ec83bfb8dba67941fc4e69dc18e7d700c605818c93b72e1076f2e8177783bf3688af915e17c4ebf96b59eb83a1bf6a1e3bb5c02dfbd9a7776fdf9acd6dd926a983b5423a881b675b8de04c07d55da7e887a31eeb4db8bf093798f000131e68c2834c78b0090f31e1a1263ccc84879b70a309379970b3098f307a2f98fb23151da5e86845c7283a56d1718a8e577482a213159da4e86445a7283a55d1698ab6283a5dd15645fa25d9ae488fa19fa1e84c4567297a81a2b3159da3e85c45e7293a5fd1058a5ea8e842453b15ed527491a21729ba58d1258a2e557499a2cb155da1e8c58a5ea2e8a58aae547495a29729ba5ad1cb15bd42d1358a5ea9e8558aae55749da2572b7a8da2d72a7a9da2d72b7a83a2eb15ddc07471a3a2372aba49d1cd8a6e51f42645b72a7ab3a2db14ddaee82d8adeaae86d8adeaee80e45772aba4bd13b14bd53d1bb14bd5bd17b14ddade81e45f72a7aafa2f7297abfa20f28faa0a20f29ba4fd1fd8a3eace8238a1e50f4a0a287143dace811451f55f431451f57f4a8a24f28faa4a24f29fab4a2cf28faaca2cf29fabca2c7147d41d1e38abea8e84b8a9e50f4a4a22f2bfa8aa2af2afa9aa2af335d3ca5e81b8abea9e85b8a9e56f46d45df51f45d45df53f47d453f50f443453f52f47f8a7eace8278a7eaae8678a7eaee8178a7ea9e8578a7eade8378a7eabe8778a7eafe80f8afea8e819457f52f467457f51f457457f53f47745cf2afa87a27f2afa97a27f2bfa8fa2ff06fd4ee8ff827e01528aea148d529456345a51bda2318ac62a1aa768bca206451314352a6a523451d124457b289a9cead745c6e8628aba99aa684f45d314eda568baa2bd15cd50b48fa27d15cd54b49fa2598a328a9a15b5289aad688ea256457315cd53345fd102450b152d52b458519ba2258a962ad29e8e6e24f3060b1924edf97628ea54d4a5a85b518fa25e45cb142d57b442d14a45ab14ad565450b446d15a45eb14ad57b4bfa20d8a0e5074a0a283141dace81045872a3a4cd1e18a362adaa468b3a223141da9e82845472b3a46d1b18a8e5374bca213149da8e82445272b3a45d1a98a4e53b445d1e94696e94696adea669ba2ed8a76283a43d1998ace52f40245672b3a47d1b98ace5374bea20b14bd50d1858a762adaa5e822452f5274b1a24b145daae832c36b92e175b9bab942d18b15bd44d14b155da9e82a452f5374b5a2972b7a85a26b14bd52d1ab145dabe8ba54ff335e6d9e49fed16bd4cd6b15bd4ed1eb15bd41d1f526ed0d26bc3135f8bd7aa3bab949d1cd8a6e51f42645b72a7ab3a2db14ddaee82d8adeaae86d8adeaee80e45772aba4bd13b14bd53d1bb14bd5bd17b14ddade81e45f72a7aafa2f7297abfa20f28faa0a20f29ba4fd1fd8a3eace8238a1e50f4a0a287143dace811451f55f431451f57f4a8a24f28faa4a24f29fab4a2cf28faaca2cf29fabca2c7147d41d1e38abea8e84b8a9e50f4a4a22f2bfa8aa2af2afa9aa2af2b7a8a95c937d4cd37157d4bd1d38abeade83b8abeabe87b8abeafe8078a7ea8e8478afe4fd18f15fd44d14fcdb3269867fd4cddfc5cd12f14fd52d1af14fd5ad16f14fd56d1ef14fd5ed11f14fdd194cd3326fc9309ff6cc2bf98f0af26fc9b09ff6ec2674df80f13fed384ff32e1bf4df81f13fed784cf99f07f26a48e45ca8475261c65c2b409479bb0de84634c38d684e34c38de840d269c60c24613369970629df03a02dd33d78e4c2a18587ca71d980cdc1fc2fe3f94fdbf91dd6f62e937b3fb2358faa3d8fd31ecfe38767f02bb3f89dd9fc2ee4f63f7a7b3fb6dec7e07bb3f93ddbf80dd9fc3eecf63f717b0fb0bd9fd2e76ff22767f09bbbf8cdd5fc1ee5fc2eeaf64f72f63f72f67f7d7b0fb57b1fbebd8fd6bd8fdebd8fd1bd8fd0decfe8decfe6676ff2676ff66767f3bbb7f2bbb7f3bbbbf93ddbf83ddbf8bddbf87dddfc3eedfcbeedfcfee3fc8eeef63f71f66f70fb0fb87d8fd23ecfe63ecfe5176ff4976ff6976ff5976ff7976ff0576ff4576ff04bbff32bbff2abbff3abbd70e1bde4f63f7d3d9fd0c76bf2fbbdf8fdd67d87d0bbb9fc3eee7b2fbf9ec7e21bb5fccee97b0fb2cbbcfb3fb0e76dfcdee97b1fb95ecbec0eed7b1fb0decfe20767f28bbdfc8ee8f60f747b3fbe3d8fd89ecfe1476bf85dd6b873205f767b0ffcf64f7e7b0f4e7b2ffcf63f717b2f43bd9ffbbd8fd252cfda5ecffcbd8fdebd8fdf5ecfe06767f23bbbf89dddfc2ee6f65f7b7b1fbb7b0fbb7b1fb3bd8fd5decfe9decfeddecfe6e767f2fbb7f1fbbff00bbff10bbbf9fdd7f84dd3fc8ee1f66f71f65f71f67f79f60f79f62f79f61f79f63f78fb1fbc7d9fd97d8fd93ecfe2becfe6becfe2976ff4d76ff1d76ff0376ff6376ff7376ff2b76ff5b76ff0776ff2776ff2cbbff27bbff37bbff2fbbd74e7201eeb5d38bff8f67f70dec7e82b9c71f1fd8afa685cd8706328399d52cb3b6699590395bde2f77632a3efd4daa8bbfef35a984ba9e2def376802a75c1dac0f6a638261ff18646eefc9b5efd8ded92159366b632c9bc36aa46c0e0e6ac35ec63849953ba446644ec528f3810994f980a032ef60b932ef11435b4613ef1a9b5e65f6446a00ab9ee8d13c74b8c1dca758785030787552da846d265c6bc2c34db8d1849b4cb8d9844798f048131e65c2a34d788c098f35e171263cde842798f044139e64c2934d788a094f35e16926dc62c2d34db8d584db4cb8dd843b4c788609cf34e159267c8109cf36e139263cd784e799f07c135e60c2179af04213ee34e12e135e64c21799f062135e62c24b4d7899092f37e115267cb1095f62c2979af04a135e65c29799f06a13bedc84af30e135267ca5095f65c26b4d789d095f6dc2d798f0b5267c9d095f6fc23798f07a13de60c21b4df84613de64c29b4d788b09df64c25b4df86613de66c2db4df81613bed5846f33e1db4d788709ef34e15d267c8709df69c27799f0dd267c8f09ef36e13d26bcd784ef35e1fb4cf87e137ec0841f34e1874c789f09ef37e1874df811133e60c2074df890091f36e12326fca8093f66c28f9bf051137ec2849f34e1a74cf869137ec6849f35e1e74cf879133e66c22f98f071137ed1845f32e113267cd2845f36e1574cf855137ecd845f37e15326fc8609bf69c26f99f069137edb84df31e1774df83d137edf843f30e10f4df82313fe9f097f6cc29f98f0a726fc99097f6ec25f98f09726fc95097f6dc2df98f0b726fc9d097f6fc23f98f08f267cc6847f32e19f4df81713fed5847f33e1df4df8ac09ff61c27f9af05f26fcb709ff63429ab027fa9f09b501d761ca8475261c65c2b409479bb0de84634c38d684e34c38de840d269c60c24613369970a2092799700f134e36e114134e35e19e269c66c2bd4c38dd847b9b708609f731e1be269c69c2fd4c38cb841913369bb0c584b34d38c784ad269c6bc279269c6fc205265c68c245265c6cc236132e31e15213664d983361de84ed26ec3061a709bb4cd86dc21e13f69a709909979b708509579a709509579bb060c235265c6bc275265c6fc2fd4db8c1840798f040131e64c2834d7888090f35e161263cdc841b4db8c9849b4d7884098f34e151263cda84c798f058131e67c2e34d7882094f34e149263cd984a798f054139e66c22d263cdd845b4db8cd84db4db8c3846798f04c139e65c21798f06c139e63c2734d789e09cf37e105267ca1092f34e14e13ee32e145267c91092f36e12526bcd4849799f072135e61c2179bf025267ca909af34e155267c9909af36e1cb4df80a135e63c2579af05526bcd684d799f0d5267c8d095f6bc2d799f0f5267c8309afa7f724e80f6f34f76f34e14d26bcd984b798f04d26bcd5846f36e16d26bcdd846f31e15b4df83613bedd847798f04e13de65c27798f09d267c9709df6dc2f798f06e13de63c27b4df85e13becf84ef37e1074cf841137ec884f799f07e137ed8841f31e103267cd0840f99f061133e62c28f9af06326fcb8091f35e1274cf849137eca849f36e1674cf859137ece849f37e16326fc82091f37e1174df825133e61c2274df865137ec5845f35e1d74cf875133e65c26f98f09b26fc96099f36e1b74df81d137ed784df33e1f74df80313fed0843f32e1ff99f0c726fc89097f6ac29f99f0e726fc85097f69c25f99f0d726fc8d097f6bc2df99f0f726fc8309ff68c2674cf82713fed9847f31e15f4df83713fedd84cf9af01f26fca709ff65c27f9bf03f26fcaf099f33e1ff4c18987e5dca8475261c65c2b409479bb0de84634c38d684e34c38de840d269c60c24613369970a209276ba24100f34b99b060c26c79bfdce14165c62eb2e5fd7238265dee98c01481f1ed291518dfc66795ab83a975b551eea91865deb34664ae8b51e6693522f3a81865deab46644ec728f3f41a9179748c32ef5d23322f8e51e6193522f3c21865de278132ef9b4099672650e6fd1228f3ac04ca9c49a0cccd0994b9258132cf4ea0cc731228736b02659e9b4099e72550e6f90994794102655e984099172550e6c50994b92d81322f49a0cc4b132873368132e71228733e8132b72750e68e04cadc994099bb122873770265ee49a0ccbd0994795902655e9e4099572450e6950994795502655e9d40990b0994794d02655e9b4099d72550e6f5099479ff04cabc2181321f9040990f4ca0cc072550e6831328f3210994f9d004ca7c5802653e3c81326f4ca0cc9b1228f3e604ca7c4402653e3281321f9540998f4ea0ccc72450e6631328f3710994f9f804ca7c4202653e3181329f9440994f4ea0cca72450e6531328f3690994794b02653e3d81326f4da0ccdb1228f3f604cabc2381329f914099cf4ca0cc672550e6172450e6b31328f3390994f9dc04ca7c5e02653e3f81325f9040995f9840992f4ca0cc3b1328f3ae04ca7c5102657e510265be3881325f9240992f4da0cc972550e6cb1328f3150994f9c50994f9250994f9a50994f9ca04ca7c5502657e590265be3a8132bf3c8132bf2281325f9340995f9940995f954099af4da0ccd72550e6572750e6d72450e6d72650e6d72550e6d72750e6372450e6eb1328f30d0994f9c604cafcc604ca7c530265be398132df924099df9440996f4da0cc6f4ea0ccb72550e6db1328f35b1228f35b1328f3db1228f3db1328f31d0994f9ce04ca7c5702657e4702657e6702657e5702657e7702657e4f0265be3b8132df934099ef4da0ccef4da0ccef4ba0ccef4fa0cc1f48a0cc1f4ca0cc1f4aa0ccf72550e6fb1328f3871328f3471228f3030994f9c104cafc5002657e3881323f9240993f9a40993f9640993f9e40991f4da0cc9f48a0cc9f4ca0cc9f4aa0cc9f4ea0cc9f49a0cc9f4da0cc9f4ba0cc9f4fa0cc8f2550e62f2450e6c71328f3171328f3971228f3130994f9c904cafce504cafc9504cafcd504cafcb504cafcf504cafc540265fe460265fe660265fe5602657e3a81327f3b81327f2781327f3781327f2f81327f3f8132ff208132ff308132ff288132ff5f0265fe710265fe490265fe690265fe590265fe790265fe450265fe650265fe550265fe750265fe4d0265fe6d0265fe5d0265fe7d0265fe430265fe6302657e268132ff298132ff398132ff258132ff358132ff2d8132ff3d81323f9b4099ff914099ff994099ff954099ff9d4099ff934099ff9b40999f4ba0ccffab11995331ca1c8caa0d9927d5c52773aa46648eb36ed72550e6510994399d4099472750e6fa04ca3c2681328f4da0cce31228f3f804cadc904099272450e6c604cadc944099272650e6490994798f04ca3c3981324f49a0cc531328f39e0994795a0265de2b81324f4fa0cc7b2750e6190994799f04cabc6f02659e994099f74ba0ccb3122873268132372750e69604ca3c3b8132cf49a0ccad0994796e02659e974099e72750e6050994796102655e944099172750e6b604cabc2481322fad119927d7c527733681e59c4ba0ccf91a91391da3cced3522735b8c3277d488cc37a6e293b93381ef73570265ee4ea0cc3d0994b93781322f4ba0cccb1328f38a04cabc328132af4aa0ccab132873218132af49a0cc6b1328f3ba04cabc3e8132ef9f4099372450e6031228f3810994f9a004ca7c7002653e2481321f9a40990f4ba0cc872750e68d099479530265de9c40998f48a0cc472650e6a31228f3d10994f99804ca7c6c02653e2e81321f9f40994f48a0cc272650e6931228f3c90994f9941a91796e8c329f5a23324fa98b4fe6d31258b7b72450e6d31328f3d604cabc2d81326f4fa0cc3b1228f3190994f9cc04ca7c5602657e4102653e3b81329f934099cf4da0cce72550e6f31328f3050994f9850994f9c204cabc338132ef4aa0cc172550e6172550e68b1328f3250994f9d204ca7c590265be3c81325f9140995f9c40995f9240995f9a4099af4ca0cc572550e6972550e6ab1328f3cb1328f32b1228f3350994f9950994f9550994f9da04ca7c5d02657e7502657e4d02657e6d02657e5d02657e7d02657e430265be3e8132df9040996f4ca0cc6f4ca0cc372550e69b1328f32d0994f94d0994f9d604cafce604ca7c5b0265be3d8132bf258132bf358132bf2d8132bf3d8132df914099ef4ca0cc772550e6772450e6772650e6772550e6772750e6f72450e6bb1328f33d0994f9de04cafcde04cafcbe04cafcfe04cafc8104cafcc104cafca104ca7c5f0265be3f81327f3881327f2481323f9040991f4ca0cc0f2550e6871328f3230994f9a30994f9633522737d8c327fbc46641e13a3cc8fd688cc636394f9133522f3b81865fe648dc83c3e46993f55233237c428f3a76b44e60931cafc991a91b93146993f5b233237c528f3e76a44e68931cafcf91a9179528c323f562332ef11a3cc5fa8119927c728f3e3b5f21d941865fe628dc83c354699bf542332ef19a3cc4fd488ccd36294f9c91a9179af1865fe728dc83c3d4699bf522332ef1da3cc5fad119967c428f3d76a44e67d6294f9eb3522f3be31cafc548dc83c334699bf512332ef17a3ccdfac119967c528f3b76a44e64c8c323f5d233237c728f3b76b44e6961865fe4e8dc83c3b4699bf5b2332cf8951e6efd588ccad31cafcfd18654ea967a4cdb31682fc29a38351e6ffd18af47cb29e5fd5f38d7afe4dcf47e9f9193d5fa1c7eff578b61edfd5e39d7afc4f8f87e9f1213d5ea2c70f747f5af72f757f4bf73fb43faefd53edaf69ff45b7e7ba7dcb28d2f64fdb03fd7ee8faa2f5a7bf333c4fd17c450b00ebe3a9fe70aa02bca7a2698af652345dd1de8a6628da47d1be8a662ada4fd12c451945cd8a5a14cd56344751aba2b98ae6299aaf6881a2858a16295aaca84dd112454b156515e514e515b52bea50d4a9a84b51b7a21e45bd8a96295aae6885a2958a56295aada8a0688da2b58ad6295aaf687f451b141da0e8404507293a58d1218a0e557498a2c3156d54b449d1664547283a52d1518a8e56748ca263151da7e8784527283a51d1498a4e56748aa253159da6688ba2d3156d55b44dd176453b149da1e84c4567297a81a2b3159da3e85c45e7293a5fd1058a5ea8e842453b15ed527491a21729ba58d1258a2e557499a2cb155da1e8c58a5ea2e8a58aae547495a29729ba5ad1cb15bd42d1358a5ea9e8558aae55749da2572b7a8da2d72a7a9da2d72b7a83a2eb15dda0e846456f547493a29b15dda2e84d8a6e55f46645b729ba5dd15b14bd55d1db14bd5dd11d8aee547497a277287aa7a277297ab7a2f728ba5bd13d8aee55f45e45ef53f47e451f50f441451f52749fa2fb157d58d147143da0e841450f297a58d1238a3eaae8638a3eaee851459f50f449459f52f469459f51f459459f53f479458f29fa82a2c7157d51d197143da1e849455f56f415455f55f435455f57f494a26f28faa6a26f297a5ad1b7157d47d177157d4fd1f715fd40d10f15fd48d1ff29fab1a29f28faa9a29f29fab9a25f28faa5a25f29fab5a2df28faada2df29fabda23f28faa3a26714fd49d19f15fd45d15f15fd4dd1df153dabe81f8afea9e85f8afeade83f8afeabe83945ffabeb372e2945758a46294a2b1aada85ed1184563158d53345e5183a2098a1a1535299aa86892a23d144d563445d154457b2a9aa6682f45d315edad6886a27d14edab68a6a2fd14cd529451d4aca845d16c457314b52a9aab689ea2f98a16285aa86891a2c58ada142d51b4545156514e515e51bba20e459d8aba14752bea51d4ab6899a2e58a56285aa96895a2d5da862b5aa368ada2758ad62bda5fd1064507283a50d1418a0e567488a243151da6e870451b156d52b459d1118a8e547494a2a3151da3e85845c7293a5ed1098a4e547492a29315e9efcaebefacebef8eebef70ebef52ebef34ebef16ebeff8eaefdaeaefbceaef9eeaef80eaef62eaef44eaef26eaef08eaefeae9efcce9efaee9ef90e9ef72e9ef54e9ef36e9ef18e9effae8efdce8efbee8efa0e8ef82e8ef64e8ef46e8ef28e8ef0ae873f6f5b9f3fa1c767d2eb93ea75b9f5badcf71d6e71aeb737ef5b9b7fa1c587d2eaa3e27549f9ba9cf91d4e72aea7306f5b97bfa1c3a7d2e9b3ea74c9fdba5cfb1d2e73ae9738ef4b93ffa1c1c7d2e8c3e27459f1ba2cfd1d0e74ae87316f4b9037a1fbede97aef769eb7dcb7a1fafded7aaf779ea7d8f7a1fa0de17a7f789e97d537a1f91de57a3f799e87d177a1f825e97afd7a9eb75db7a1db35ed7abd7b9ea759f7a1da45e17a8d7c9e975637a1d955e57a4d7d9e875277a1d865e97a0e7e9f5bcb59ec7d5f39a7a9e4fcf7be979203d2fa2e709f4b8b91e47d6e3aa7a9c518fbbe971283d2ea3c72974bf5df76375bf4ef773b4dfaffd60ed176a3f49fb0d47a506dacd29d086ee6bc22dbb766d3ff7825d995de767b66cdb96b9f8ac5d6766ce7fd1f60b779c73fec5982e30edb3fe1d74de59bbceda72ce59976dd975d6f9e765cedcb2f3ccccb6f3b7efcc9c77feaeccb95b766d3d3330ad38fdb23ce7f60b35bb0bb7efdc9939ab3fdfae33b767b69e7fdeae0bb76cdd95d9b6fd8273cebf74fb853acfd31150ff74987952e061cc4845cf3b0ff2ee6dc235175eb8e5d2cc59e76ddb7e49e6fc8b7665cedf9139fdfc8bcedbb613339e5806d333a332bd306ac6cf8d8d8e36332e7ade65e32202de3f6ac64d51339e1235e33951335e1635e3eba366bca98ca27c4b54a67795c1f4dea84c3f5406d38f4565fae932983e5b46def4f888809ba2669c39293adac59322326d2f83e9955199beaa0ca63746657a6b194cf79c123defa632f25e5d46decf979177dcd4e8799b20efb00a68cfa819f78d9ab1356ac6455133e6a366ec8d9af1cc328af2cea84cef8e9af1bea8191f8a9af1d351333e1e35e35351337e376ac63f45cdf8efa81947ef1931e3c4a819f78d9a711164dcc7845bb79c734edfdbb173e7f60b779d7aee964b4e3dfdac5da7ee545d36cc9a8bcaf30cc838dc97725754a69747cdf87419689f8dcab46e5ac48c874e8b8ef69632f2be232ae0f747cdf8f332d0fe392ad3ff44cdd8be5774b4abf78ac87443d48c9ba2663ca60c317b6644cfbb624644c06ba3663cad0cb42f2a23ef6551015f1935e35bcb40fbe132f23e1415f0a351337ebf0cb47f2e23efdfa302fe4fd48c33f6898e365b46de8e7d22025e1635e37165a03daf8cbc1746057c49d48c379781f65d65e4bd272ae00f46cdf8e532d0fe302ad39f45cd58b76f74b493cbc83b6ddf8880f78d9a715919680f2e23efe151011f1535e38565a07d591979af890af8355133de5306da47a232fd64d48c3f2c03ed5fcbc8fb8fa8809f8bfc92ce8c8ef6f432f29e3f3322e01745cd7865d48cd743c6e6a1629e7bd139bbcebae09c4bddb2de1495f37d6528f881a84c9f2a83e9d35199feb30ca6e3f78b9eb769bf8880a746cd982f03ed1565e4bd362ae03744cdf8e6a819ef889af13ec818e94d7d202ae7a7ca2899a7a332fd6b194cff1195e99eb3a233dd7b5644a6cbcb607a6819793745057c4cd48cbbca40fb681979bf1415f0d7a366fc7ed48c3f8d9af159c818c93cfc3b2ae7e999818cc32d997d331199f696c1746554a62794c1f494a84caf2c83e9f565e4bd292ae0dba2667cb80cb4ff2b23ef84e68880f7868cc39c18dc2f2acfd6a8197b21632403b1322ae71320e3b05f9ba84c2f2f83e94ba332bda30ca6f79591f781a8803f1635e377cb40fb4c1979ff1a15f0bfa2669cde121ded0bcac87b5d4b44c09f2d8369c3ece879a7cf8e08f8c032981e1595e9695133ee2803ed7e7322326d9d139d694754a6cbca60fa5bc81ba9b5f96354d4135aa3a39ed41a91695b194c7351991e5e06d323a2323dbf0ca63ba3327d43194cdf1895e90365307dac8cbc5f8a0af86b5133feb10cb4a3e746cf3b6e6e44c013a3666c2b03edba32f21e1015f06151339e5d06daabcac8fb8aa8805f1d35e3dd65a0fd631979ff1315f0a87911333646cdb81f648cd41ab744e5bc7a5e7405af8bcaf4b432986e8bcaf49a3298de5246dedba202be236ac64f948136353f7adea6f91101ef1935e302c818e9bd698bcaf9e032f4747854a61794c1f4aa32f2be222ae05747cd78771968ff5246deb50ba2e73d7c4144618f8e9af1a4a8197744cd784e19fa990de7f4447a59e72d8c887afdc2e8a80f8cca747b194ccf8acaf49a32985e1795e97bcb60faf132f27e2a2ae0c7a266fc791968ff5d46deff45053c7a51c48cb3174547bbbd8cbc1746057c69d48caf858c91ccd2f55139bfbf0c3ddd1795e937ca60faf332f2fe3a2ae03f46cdd8b8383ada8d65e43d697144c05ba366bc183246aac29747e5fca632f4747b54a68f96c1f42b65e47d2a2ae0ef44cdf86c19681bdba2e7dda32d22e0bda266ec2c03ed2165e4dd1815f0d15133ee2c03edb565e47d6d54c03746cdf8a132d03e5646de2f4505fcb5a819ff5806dad14ba2e71db72422e0895133b60d172d1dd24a6bace1c8ada010c474206c4fb6ab1e1e9e0a06fff461af75c16000fa40d82910958e1f53df072e47c7fddc6cb673acc11ff373fb0ed5a5f2196d9e3b06ee4957e382013dc7c43b87bc5386c601cfc094115d4f86b4948ef441654dd8f521bff5e67a5c48be34cbd70469ea2df2178278e51fc3f08c619847439c3ea8383576209eb049d437fdfe8c0a06fff83b56806bc413fb7b653e284aefee19db77ad33c72d1e74dece5d5bcedbba3d0510473148f81f8af09c258dfed559e274da06484f3c741c559334c4d5310ca84eac967b986b2113d98926321d0cfed521e3b103bc6da6732ce08f115f4ea8bab40bbd16392c6fac03bc6ca5e4d2a6a011f8a6c7425906fdf529cd9ac4f190e7822d5bcf5e73e119179dbbfdbc5d3bb18213705ee9ebe0be0e421238cdfe2381eb82f017a81e84e02f8b7e313a8dd321f262f46ecbe38b511f0cfef56127259a3043729bfb512c9e948ecad7f1a3c95e43bced05c34a9482b8ddfa85b8dd4608e2761b2188dbdd8e83fff3dd00f2b0cad39787e483b8b1cc80e8b871ac1dd271e3993e755c03f0a6b809605428aed1dc8c83b82613371ee226827c144e327113206e0f13872fcb6413d70471534cdc44889b6ae2e8ec417d7bb0b92e047119bf5c9f4f7748dccfcd7664f5730f8bfdb9fdbee2e1e659e42b129f4340571bcd75dcbee2e1f0dc14f0a1f8345c2f84b4948ef4418d2e61d775e45073bd3124dfc12c5f13a439d4227f218857fec3189ec318665d26b30047fc75b6d3d7d9d27fc3aeb33d9096d73df27d9f8f75b60d70c45f677b7d9d2dfd37ec3abb01d2f2ba47a7083e1febec72c0117f9ddd265467f3beceaadf519096d73d3a08f0f958670f021cf1d7d91d4275b6ddd759f53b1dd2f2ba47a3f9cfc73a7b2ce088bdcef6e685ea6caec7d75935d8046979dda3bdd9cfc73abb1d70c45f67dbb709d5596f67d5ef259096d73d9acf7c3ed6d99de65a8f7f1d6606e144c7127a3bb6cbd4e36c97afc741f05a48cbeb63c65c3f1febf1cbccb5aec747997adc0271479bb8d98037febaddd9e5c71c4afe0dbb6ebf05d2f23a4a5bd49f8f75fb06c0117f9dededf27e45e9420db7cede0b6979dda34dabcfc73afb76c0117f9ddd225467b35b7d9d0d8287212daf7bf3cdf5f3b1cebedf5c6b7fe13ee32f2c84b8fb4ddc2288fbb0895b0c711f31716d10f780895b02710f9ab8a510f79089cb42dcc3262e07718f98b83cc47dd4c4b5431c7dcab103e23e6ee23a21ee5113d705719f3071dd10f74913d703719f3271bd10475f825c06719f3171cb21eeb3266e05c47dcec4ad84b8cf9bb85510f798895b0d715f307105887bdcc4ad81b82f9ab8b510f72513b70ee29e3071eb21ee4913b73fc47dd9c46d80b8af98b80320eeab26ee4088fb9a89a3715a3d4f4d6b349e308b69c606036b1f0a414cef466eebd6be351dc1e05f8add17e09a30683ce3e3c6c3d6fbe9f3fb365d78d68bb6ecdabee1a2f3b6ea2f37e39a3e824d2a0a5bef476970c94f1d5ce392475c2f371aae31ef184bdc7326cc38ee119fd43a35fd6cf8a469df73c733593cef91e11dfb3a4a35af87cbc2e817f6fa8e023cf502ba18eef2e17a593cd9a6a0626b3443eb411a780b2ce7cfe392c152f43e06f0c4deac987a30661878b059a913c02324675f1797961f3e17e373b5ae1a99aec6305d35419a09a0bf4601fda5802f3d9bee1b010fdf56d100e9d2558291e2ea008fc43b10660fb00c71f933d7d9e82ad319e2371eea6ebbaab14e007755c29eebc753dd4a9be7721c6948f36cdb00b649a901b9103397c7b6fda910c4ab73e2153019885f6330d846531c5d633b2ee186a37fcd31123fac3bf50e39d290661fa37ff8b4fbee1fb6d3a8037c4e10b8edc904211db8de8d09801197b3131e29ff82ea040d0fe1bb40bca5dbb9b865223b33daa1e334a4991f52876c6d26dad4c0fc9f866bd2d95821d95ce535b682bc8310de02f62d8fb63400f90386877eb8f553a08ee5873bc421ed4b09c9d9f78e369967c5ed8b4e64ba1ac774d504699a407f1305f49702bef46cba277eb588b92918da7e360483eb633560c4b68ff048b50d2e1b866568db5a48ff8fae329d61bfa80eae09eb61b2fe731e754aed6d1dd31ffacf0f83ffbcb988ff3c8ec555d237a57be2d70872d9fc49f49f05fca5bcadefc77d11ac3bf50e39d290e6a412fd67d4c178909378dbec8954dfd2f56e3442c8edb2a44f447582fc311c03a050aa6d16d0715f3da3b66bb443c76948735611ffb909ee0bc140fdb1f577286d5d30b82dd0bf8c896f827cfa475bcbf9333281acbf2560fbfb744f7a24dd137ee29786343b8be81ee30bc1e0f79842d217a5ad83744df02c1dcf6d09e99ed2e1f12892631dae770efd7e69de41086f81366ad87d0eb4d3b1d7d5dcd6de8660707b540ccf44c033296e3c72ef649f9da56dde71f78126335d8d67ba6a823478becb6401fdd9fa37748fc72579cc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1e7331cc1acf38734d581b20ddb82ac148719300cf44213c750c0fdd63198e36d7f5169d8dae329dd501c631e67a02607d70ec00de0971e3cd6dedd5781b815fc182230d692e6f1b48fb5183ad91612679c6b3b8b1f0ec4210afce89173d9bee895fa3c114c07f8d703d0a30d6c78dd1e8798c0323f1c3fa5def90230d693e6ff43f2918fa6b02995007744db6a3019e87f664a4de5f2c933ac0334e080fd58994796e03d305da9309a033fa1feb769d1046e245cf1ec7f483ed4403e06910c2e37ad73c6f011b9dcde61b8007fd52ecbe00d713008fc47bd3003c4ac1334e164fb609f0202fa9f7d1550fd05e09d8cf3cdaea52f43e11f0ec113f9e2ef4ab4ac1833ef5a4f8f1e484e4cca2aff85c8ccfd5ba9ac2743591e9aa09d24c06fd4d11d05f0af8d2b3e99ef879cc1eb3c73cb298351eee373740baba2ac14871382e20609f43db642c43f2a1c65874d650653a43df92faded8e7983c6e00af804fd5853aa571018e230d6956c2b8c03493a03118ea23e33807ea3cf63eb7d139ef73d33df16b04796cfd64f4a5057cba3e3dd73b30123f9d6612e0b6c9918634cd4620dbb800ca86634f36db21353ee67a0f260346c28e3ea374ff9ac600c6597421c57b12d3c524cf7b376f81b662d87d28e979007cf74ac13359184f58d908fb3e7dfdaca9f13fb7cfc6ee699e456d19e1277e6948b33cc47ee2b30827d9537a6623e86a4fd0d99ef1cb36a8bcc87e4d1a01de41086f8132edebeb4f8bffb97d75652ff32caa2b849ff8a521cd862275652fa61faa2bf4cc46d0d55ea0b3bd04741656572ac93b08e12d50a679fddce9f13fb7afaeec6d9e457585f013bf34a4d95ca4aeeccdf44375859ed908bada1b74b677fcb285d615e257077212ae8c89df9be9e13913cff1672a2443e09041a86eb4ebe7ce88ffb97d756e1ff32caa73849ff8a521cda945eadc3e4c3f54e7e8998da0ab7d4067fbc42f5b689d237e7520e7de90b60ed2d0ff54e738fe548564081c3208d58d0efddc7de37f6e5f9d9b699e45758ef013bf34a439b7489d9bc9f443758e9ed908ba9a093a9b19bf6ca1758ef8d5819c5887ea200dfd4f758ee34f554886c0218350dde8d4cfdd2ffee7f6d5b959e65954e7083ff14b439acb8bd4b9594c3f54e7e8998da02b4a8be371c27369a1f510c730ebccb56d0c13fbceb38430bac66e6c3ac33e3daf8f19135fc7d2d2fb83ef1ea57fbe8e01155bdf21325fcad624d13b56cfca230d69de50e41d2bb6bea931185a7f6df928fd5448c3c73febd97370fcf3e6109c9263cdae3a545f41de41086fa93a44ef3b5f3f887588d2bcb5481de2f6c5b68e8f64da23241fef67878da1ef013829cd3b8ad421a9758cae3a34a682bc8310de527588b7f5bc0dc1b6febdc36cebf95c20ce81cc0ac947e9c3ea106fffb00edd57a40e49f911ae3a847e0261223d644c3cd73bb5c7fc5dc9544886c02183645d24ff92eae22ca69334a4f97891bab81f9383ea223db31164da2f241fa50fab8bb3d873b02e7e260427ae9fa3bc427e7d68fd44de244b8cebad72c843972d7f779f77f5d9cc770d677e09d76a340be199340c3ccd8027133f9e9c909c7d73592de65971af199ccd743589e9aa09d2b480fe660be82f057ce9d9744ffc6a11b3ad1fdb00e9f6a8128c1497013c02f539d4866119f23d36a8b3862ad319ee99a0b54d3487abdb875fc31a2b81f1dabcc6bb2ff02b000e1ccba734ff5b3c90f6f7b0c66a06c841e1341627350f9b025ef46cbac7394e9a4fc0b92cbac6355602eb0afaf43cd58111d781727f8acb81fed43f4af4a75007748d6b0e6deb9ca4f65eb9c68871ef15c95c89359b5427c80f9c6ed185804f9495da9f910a86eea5e43ac6bd94a3c70fd635fef0598493ea0fa5c7be03a5ad0b86ae5fa6b98a468685fa76fc19345721510ff573c7c7ffdc3cb64fa47bc24ffcd290666211ddf3b66e2ad35d6330743d6c5d30f87dd7bf8c89e7b684744fe9a6417aa17510a1ef1cf1136a27f2d8260580017f05b89e0a78e2af2f1dd98660709b500ccf78c023b1a74ee8bdc80af5a5fbfa2119a6aba94c574d9006fbd81901fda502f71e808c857726885717cd25e8a292beba4b17c46fb89867d520e64c0d62f67af67a7661ced42066af67af6717e64c0d62f67af67a7661ced42066af67af6717e64c0d62f67af67a7661ced42066af67af6717e64c0d62f67af67a7661ced42066af67af6717e64c0d62f67af67a7661ced42066af67af6717e64c0d62f67af67a7661ced42066af67af6717e64c0d62f67af67a7661ced42066af67af6717e64c0d62f67af67a7661ce5401668d87ef15c06f694dab128c1487df5b192f84673ac343f75886b4cf6d8645670d55a6b3e9808bf6f6d13e14bd776549c300def8cf26ccf7ad579f01fc0a8003cfada4347bc2bec3bcc186fb0e71af213f2b55684f5f9fcef99e3ebac77378491edc97c3f74636401eac2b12dfa8490543bf3741f7b8af8bcb52093da61c7a94e4ed7ab7a7c896431ecb3c00f90386877eb81f327e3bd7bf1f6938e7228c073c35b44f2f8bfba7e2de8fc4cfef99c474d50469b0dd923a2bcfd526ccb2f0ce04f1ea2253822e32163c990aeb82f80d17f3b81ac4ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc2ecf5ecf5ecc25c0d7ad678f8fe04dc5b33a54a30521c7ea77dbc101ed7be132c43da4732cda2b3862ad3197e6b45e0db2f59dce744cfd77b898e9f20c9b77f9fd334e057b0e048439a458b06d29e6cb0e17e21dc233489c549edc34805a57db7cbf66d28bea7a901f2601d947a4f2632dcfc7b4c8d16592aa1c794438f92bc5d3643d85ee5b1cc03903f6078e8371ef0c4bf2fa67f9fd3f861e0c13650eabb4b02fb7fb268dbe3dee7d4cc74359ee9aad27b9af9be2bba277e1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc058fd963f6983d668fd9630e3ce66c793f8fd963f6983d668fd963f6983d668fd963f6983de69ac4acf1f07d040d906e629560a4b84a7c67c2b53f04cb90f67b4cb1e8ac12df471a8ecef05b2b02df7ec9babebb7475a324df5cdfdafd29c0af60c19186341f9a3f90f695061beeebc1bd3cb6fd6f12fb2552817b6f19f1c37d3db8d787ef3d6a803c5807a5de93710c37ddcf028c5c964ae831e5d0a3246f97cd10b657792cf300e40f181efacd023cf1dba67c16ed6029789a014f26763cfdfb91046c70df7ea416f3acb8f723cd66bab2d9764ad302fa9b2da03f9b4f43f7b32dbc3341bcba9853822ee658f0cca9b02e88df7031b7d42066af67af671766af67af671766af67af671766af67af671766af67af671766af67af671766af67af671766af67af671766af67af671766afe76898351e3e3fd400e9c65509468acb009e66213cae793f2c439ac79b68d1594395e90ccfba13387b6fd03c333d5fcfe52e6992e4db3fcf3c11f8152c38d290e6b1790369f3061bced7e21cad6d5d43267619c2d70c103f9cafc5395c3ea7dc00792ab1d621c370d37d3360e4b254428f29871e2579173b8756a81cf258e601c81f303cf46b063cf1cf4bb667d10e968207dbc096d8f1f4cf330bccbf66d1b6c73dcfdcca74d5cc74d50469e680fe5a05f4970a86ce7bd37dab857726885717734bd0c55c0b9eb915d605f11b2ee6391e734530fbbae131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae131bb30fbbae131eb9faf1bf161d67832e69ab03640ba4c9560a4b816c0335b088f6bdd1c9621ad831b67d1594395e90ccf0011389364d03a4d7abe5e0bb9f7c401bef19fc3d2bf4e13f9150007f14b439a0fcd1d483bd3606b843c1913e25ab30ce8ae257619c2d7dc123f5c93d90c7119c04b610b8b937c4f5a186eba9f0d18b92c95d063caa14749deaeb39184ed551ecb3c00f90386877eb3014ffcebfa723d68074bc183edb6c49a761939fbd76992ad8d7b9de63ca6abd94c574d90662ee86f9e80fe52c1d075a3744ffc3ce6ca601ecbf0c7c4bbafcecd2f4117f32d78e6575817f32dbc3341bcba5850822e1658f02ca8b02e885f1230cff5983d6607e6793588d9db8dca60f6efa0c7ecc2eced86c7ecc2ecdf418fd985d9db8de460d678f8b86603a46ba9128c95dcb7dbccf0d03d96218d3f672c3a6ba8329d35039ee6f8f10c3a239d9e3f5ad13b617e24133fdf8e14e35708869e5d908634999681b477c3fc08a5a5ba8e63bc58ffa5ce2471cd75113f3c0f02e71e102f8573589ce47bc2cfeca1fb56c0c865a9841e530e3d4af276cda90adbab3c967900f2070c0ffd703e22fe71de5c16ed602978d0d790984b9691b37f7e84daefb8e747b80fc1c7c92bed43f07904ba0ff37b3c668fd963f6983d668fd963f6983d668f395bdeaf24cc784e2c8ec750ba395582b192eb6e5ce30b5886345ed062d15925c6b386a3335ce327b0e670d0598cf47c3d663471d200df96d8f9e6067d2b8fc6b3f81acf34a4f949f340da29069b6b5cc8363629b576db353649fc70dd2c8e15d1f504c0283146910a86ee63b0ad9f237b56ef90230d69f633fac7ef660616d9707c6e018bd3f22e8c5ddefe32e1769cee170246926501e0913e8799af65aec4581dc949cf9e5f41decd8cb74deed86d6c6e6bafe64d654db685ea31f14b439ab690fa8ccf229c6473f01d2799164aca66f4caf170d9749a45e6ba9ea55908f2539a8e10f9755b34c1229bd4bbeb7a5790b7802def1b5b5ec8640f1bcb455f6671fc78ba1a82c176bb189ec5806751fc78724272f68d2db79967c53db6bc84e96a2ed35513a46903fd2d11d05f0af8d2b3e99ef8d52266e49d09e22dbfa525e862a905cfd20aeb82f80d17739bc75c11ccd55037341e6a5f086b03a45b582518296e11e011b0fba1fe2196a1adafbe18aeab496795587b329bf1d2feed99d057171857c9639f8afc693eae9286349fca0ca43d07faea9496ea3aca83f53ffef186f0b121e2a731d2bb896b4f102f852d2c4ea8cc43f7e6360346db1a1e693da61c7a94e4cdc732e68e80dc41e0ae3f748de33ab1fbe3a68f4b7687de49e24dfcd290e6aa227d5c6ee7165a64e3f6b962f23a6c319757a721ffa49ea5590c3aa134d786e86424df9f3ac0b87b3d9f89a734d867aa0b868e9d6682917d17b05f171b6f53efc99fa37abf98e9240d69de58a4def3fe16d57b5b1d0feba771bfc9561779df09ebe29b4b1c83b1f5bb0a4165ea27f1ab0359b0bed5411afa9fea27d7612610f32dfbc672b07c4816fc15e01ac74ee2f7233bb2e8b396826729e089fd1d32633902fe72df584ed63c2beeb19c1cd395cd0fa73459d05f4e407fb6fe27dde72cbc3341bcbac897a08bbc054fbec2ba207ec3c59cad41cc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2ecc5ecf5ecf2eccd5a067dc4b8e7b2a29dd922ac1487195d87becdad78265487bfe165a74d650653aabc4f9510b182fbd2fe7e13d06f8c6bfc7a3ff5ca336e057001cb6bd5e57cc1a48fb7183ad3118ba2707cf01c1fa5fa9b35ce89ef8698cb4a708cf2f42bc142e607142651e7ac6926ddfec820aea31e5d0a3246f2a1f7af6220b6fa9efc5623990fc01c3433fb405d9d8f1e4b2c3fd5e2cb6db12f65c46cefe7d4ed47ec7bdcf89fb10b399ae2aed4364191ebacf5b7867827875d15e822eda2d78da2bac0be2375ccc398fd9630e7c7df6987d7dce96f7f37af6982b8ad9d7e7e460d67878ffb601d22da8128c14b714f008f47f42c72db00c691c628945670d55a633e1b36dfbfac66d8c971e8b9a337980afc01841472a187a1632e1207e7816f2b2fd06d2ce37d8f07c311c635ac2e224c76589173d9bee895f23c8b504e2f898986bac56ea3d718dd566012397a5127a4c39f428c99bca879edd66e12d500e792cf300e40f181efa09cf276d453b580a1ef43524ceb31192338bb63dee71b20ea62b3e2ed50469da417f1d02fab38ddbd17d878577268857179d25e8a2d382a7b3c2ba207ec3c5dcee315704b3af1b1eb30bb3af1b1eb30bb3af1bd130e33a0dec1753baa55582b192f38dae7e1e9621f5db165874d650653ac3352402e7b5666deb5574dffda59307f80aac7be8480543cfe1e56b2ef01cde393307d25e0de30a9407fbe4b6712ca9733c5d6344c40fc710b0cfcec7101a204f25d680f1f350e93e0f18b92c95d063caa14749deaeb54895943b08915ba00ee4b1be05a0fb80e1a11f8e21c4df07ce75a30d2e050ffa0c12e3bf427dfd2cb62b718f6974315df131842648d309faeb12d09f6d8c85ee899fc7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc1eb3c7ec317bcc7298351e3eded700e9725582b192eb2f5ce3705886342ebbd4a2b3862ad319ae4192d8c386ebf7e8f97a6c7ecc9401bef1af03cb75a718bf4230740d5a1ad2fc62df81b40d069b6bfcdd360724b5b6d4350744fc705d1f8ec9d3f504c028311e6b5b67cded1ace99d63be448439a6946ff9382a1bf26900975c0d77137c0f32a61a7f89c30dd7701463e7f27395fe05a7f99033ddaec946d6e496a7ed335b784f39b1487f39b12eb4687fb2d47e175ac593c3343787e7ed8733c587fbb85f0740e034f37e09178bf85e4ec9be3e931cf8a7b8ea797e9aa93e9aa09d2f480fe7a05f49702bef46cba277eb58819ed13616d8074b92ac148715d8091af7de8f391c02713f09ff329ce2f18ea3fa721cd7de093adb7f864d5dcd6933c9568eb5dfe3eae2db1b5a302fac9dbf49363fac17a5b1fd8dbfe34a4d95cc41f5cc2f24ab64bc36927b15d1278ff3bd0d69482a717f0f4c48f272724675f3bb9cc3c2bee767239d395cd7e529a65a0bfe502fab3b581744ffc3c668fd98519fd11c2da00e9725582b1423e5c16fd1c7abef62576829f23d04e74e0582ff773885f1ad25c067ecec5e0e7709fc6e55b4ad8f230df92f835820cd8d649f9397cfcbc8be9c2e5e708e8a7c3a69f1cd30fbe0fdccfc17a40695e5ea29f23ec570cdbcf41bf42c0aef4a00d2b05cf72c0b32c7e3c392139fbfc9c15e65971fb392b99ae6c7699d2ac00fdad14d09fad6da57be2e7317bcc1eb3c79c04cce8b713d6064897ab128c15eaeb0cf2dbe9f9da377e00fc7601bfa747eba107f81582a1fd8734a4590b7efb23e0b7731fddd50793f04dc2fa60c4af116440df4dca6fef61787a982e5c7ebb807e7a6cfac931fde0fbc0fd76ac0794e6b112fd76613f79d87e3bfac90276a5076d58297856029e15f1e3c909c9d9e7b7af32cf8adb6f5fcd7465b3cb946615e86fb580fe6c6d2bdd133f8fd963f6983de6246046bf9db03640ba5c9560ac505f6790df4ecfd7bef13fc16f97181fd47a5806fc0ac1d0fe431ad28c07bffdbfe0b7731fddd50793f04dc2fa60c4af116440df4dca6f5fc6f02c63ba70f9ed02fae9b1e927c7f483ef03f7dbb11e509af153fbc3627ebbacaefbd7d0e2fb520886d63bc43d3104b7cd26b4333970cd30fadc026b98b3527d1d9bceb89ca8b369c3d419ad31c235c6798bce24e65185dee93e9dad623ab3d5334a33b388ce56397486f58c744569eb201dfd9731f1b46e89fe7fcec4533a3cd75268dd6d874d47ed0c17ea68ee3075c4cf05c3b562e8d348c99663b22db7c846691617912de7900dcb9f64cac9ca9617f2b13a52f02cd219e15f0d3aa334ed45745670e80ccf97c6779f7426205bbb7eee1a219dad653a23fc6b4067946659119dad75e86c35e8ac60aed782ce24f62d689fb0cb82316018e9877b19281fee535b1b3fc661af9f479dad13c2b3761878d6011e81fa991392b3cfd7596f9e15f738e0fe4c576b99ae9a20cd7ad0dffe02fa4b015f7a36dd13bf5ac48ce77612d60648d7592518296e0d60e4df9cd076f7b8a9037805fa64791cb3e1fd6ee2978634dfda6720ed49065b23a4c53d14ed2c4e687f6aceb67f91eef11cc6e54cbf52ed4bd8384027e0e17b0e84f493b7e9a793e907f775d407763f17f7759c55a4df6d6b27a5f6bd4569cb85daa5aee1b6db6b008fd4774d05e4cca2df13773bc9ed6727d315da4f61bfa7ef5d5ec3f0d03df1f3983d668f796431dbce5d6980745d558291e2703fb8847dd6b2f3febaf6d96e047f52c0d7e84a81fef9b801f1c37322de0afee42de04fd2fa22dcef6af397a4ceec70ed0fc5313f5a235689737e5cfb38501702fe555648c77d3e293fdbc5e66f529abb8a8c2ff1337d787f04f7b9e0793952e7494b8c8fa28d091bd7a634f714d1d91a87ceb08e93ae286d1da4a3ff32269ecf75d2d83f9fc7d5e985fab35d361d75325ca8a3fb87a923b24b58af482ef4e5a564e37befdb2db2519a878bc8b6d4211b963f6fafb0fce9bf4c30784e88973f7f864e2f359e21341edb853e11e99ef013bf34a4f94c11dd73ffaa87e90ecf48c0b15401d9da71cc33c6e776e1f821e98cf0af079d519a2f16d1d9fe0e9dad059df1b1b63ae045ff654c3c1fb7a4faca9fa1d30be9a8433f7743fccfedd3fd01e659a47bc24ffcd290e61b45747f00dc178201ddd3331b415f945648b64efddc0385747610d319e13f10744669be574467073974b6017446baa2b475908efecb9878be7797ea2ba5eb86f442fba243d714e19ed6a4f216d8a79c1fee1921b827ff20015d340483f78314c37390309eb0b241de0236a36f4ddbc1e659dcdf449b4169fe5cc4661ccce4a0f58ce86f924c07836c07c72fdb20bda6985e2bc93b08e12d55a6879867713f1bcb94d2fca748991ec2e4a032453f9b643a04643b247ed942cbb492bc8310de52657aa87916f7dfb14c294dfd9efda1ab4c0f65725099a2ff4e321d0ab21d1abf6ca1655a49de41086fa9323dcc3c8bf72fb04c29cda422657a189383ca14fb1724d36120db61f1cb165aa6c4af0ee4c4b2ad8334f43ff98a1c7fa14232040e1924ebc6e1e659bcff837583d2cc2c52370e677250ddc0fe0fc97438c87678fcb285d60de25707d784eb39836923dc978b6987f9e9e76e8af0dc1d457efab99bcbc79be31101e8a10eae895729ffdbd26e823c07b274cfb1fb31c14019619da4ff1787d449a1f726f49d3d10780bd4ebbe779664e7fdefc32dfac9177967373339e89dc5fe372f23ac6f8520beb1053df7d763e13552f6a112bc8310de9be2e7ddd74f463b4df2070c0ffd36019e2384f06c1a069e2300cfc6f8f1e484e4ec9b233cd23c2beeb54047315d6d62ba6a82344782fe8e12d05f0af8d2b3e99ef8d522668d87de1bc2da00e90eaf128c14b711f008d4e7501b8665c8cf12459d755799ce9601465a8f81eb348edf7300afc03c47dfdcf506e057001c381744694e837521271b6c8d90b6db220fea5c6a7f2fdfdf4ef7d8efa7fe22ee6da16b1c9b15381ba74fcf2b1c18d127e0675a7239f04ccb3343fc2cf46b5007744db603cb09ed89d499faae72ea058c847b35e091f289a84e903fb6d6a20b81fd6159211de7c3d679e1f94a94e6a222be3a5f6f45f507df21d215aeb792a83f926b9e36329df1b1e034a4b9a288ce363a7486759c74856da6d459c3ae3a4efcb0cd243b8e734995b0dfae73cc560046dbba026c6f285ccfe22475bb9ee15ecf748bed0eeec31268cb43cbba92bc8310de52f3b0580e247fc0f0d00fdb7a81fe5cef70e761d106489dcd2620e7a035a871f72f37315df5305d35411adccb24307e91b3d9743eaee8317bcc1eb3c7ec315727668d87fb660d906e7d9560a4383c4f4e62cc39cc5fc332241fbadba2b3862ad3d95ac045e355b887fe71184b13e8d3f7a24ef93c199e6743695a602ced49184b4339285cc1e284c6a972b6712abac733ae6de36b748ddf45161807e8b58d03f33e36f629eb1d72e079e3df2e329636c1a203bab6f599d19e48ad7b75f599bb0123c98c7d1ea9fe1f9e375a08868e23a33dc13a5e4dfd756c2770fc51ea8c51d7bbe679cb9ddf8463d0fa17d6375f0b7824de9be19edf5489711c57d9088fe364856c655f7b8167f71482a1b6320d69fe51647c979fd942ed008ef991aed0f795da138d67b41682a1fb452bc13b08e12dd1fe498ddd61df86ea0ae1277e6948336a5a7fe8aa2bbc9fc4f7a63482ae70dd8bc43a1cddb6adb5f092ea5fb8eae5c60af20e42780bac27cb63ff2800f90386877eb8e6ecc8f8f174370483d7db15c383eb5e24d67008c999c5f51c718f451fcd74b599e9aa09d21c05fa3b5a407f29e04bcfa67be2e7317bcc1eb3c73c5ccc389646581b20ddc62ac14871b82e57a04d09f523b00cf93a2ed4d9ea2ad3198e23d2d8247e976fd5b401bc02e38bdda8533e468ae37294e6673306d2ae35d8705c6b35c8d3cbe224c7915cdf01c43e20c983eb7ef8de35a1fe51b76d7c9078133fec9fd43be4c0bece61217d1dec5ba00ef8bc10aebd17f6c573b6fe17dd6f068c247325fa44aefd1f38e7c2c7d6b14f8175bb1ae65cf07ba523f5cdcd24f39638aba921183cbfa27f617d46e9b94a9cff2a058ff0f842b629b08f2748bd8fae7a80f64a6a2c6338fba484c732f27e2ca3bc9fef4755cedfe67e06f609365509c64af6a35c360ccb90cfa3a0ce965599ce706f19f55f700fc1b5d08f92dae7c1f72c6c60d870cfc2bba01ff55ae847f1be17ae61409d8fe41a065bdf8aef0f906a0353c1d0337ef97e71dcf357ef90230d69de54a41fb5c2a203bab6ed03457b22f5febaf6341e09184966b427d23e11f5a36c3e91f49eea189f9bc7fdc9a31d3a4e439a77169977e47b9da9fed0331b415794b62e18da46654c3cdf174de7d6f067e8f452f550c8f6f7e9fe18f32cd23db7fd6948f38122ba3f06ee0bc180eef15d217d51da3a4887bad4f1dc9690ee295d0fa4afc498177fe7706dd9488db709b551f9e1eee5c1bd72127575b8674e1e0d788e891f8fd43bd967678f35cf8abb0f741cd35537d35513a43916f4779c80fe6cfd1bba277eb58819f76be2da714ad753251829ee18c023d5bf70d9302c43f2b9375874b6acca74867d20ea67907fa1dbd1a7a10f24718e0ff6d9a8dde638d290e64ce8037d0ffa40b6b3386ce3db026766878eb7e37958d4d7d80871b6bd22527dcd0d0e8ce813d07b5eef90230d697e51621f0875c0e72bb12d447b22f5febabef5723460249985cf9eeec383fdcf02dc0bfb44d94afae15cc7e887ff65987e38d51fec5793aed00fe76d54c6c41fc3b0901fce9fa1d34bd543f48b627c6e1e7d0cd23de1277e6948f3df22bae7feca06a6bb46d017a5ad8374a84b1dcf6d09e99ed26d84f492f3b7ae77ae126b5af9b98936de026dd4b0d7b46e003c127515c75c4bc123ed0f0bc9d967678f37cf8abb0f7402d3d506a6ab2648733ce8ef0401fda5802f3d9bee895f2d62c67512e8cf53ba8d558291e28e033c02f539d4866119f233fd5067cbaa4c67b6f93df22f743bdabad7005ea93ed0d1c0af100c9dd74b439a85d0075a60b0350643fb9838bf803a975aa7e59a5fc0755a5c2eecbb611f48a20db4d55de24dfcb08f5fef9003cfefeb30fab7f950281bae9de37b9124df55577fe758c0c8d7144afa3f54fee47bd9d6254bf5772ae573731da3cf5d08a92f369f9b9f798afd53695b8fbe4b8ccfcda31f403a23fcc783ce28cd0145747682436758c749572780cea4cec774d5f1de0af20e42780bb461ddb632257b896d18a5d93ccc32a5b6cdb6e637ccbfe4be896d9e7f337b0ecef31f1b8213c7b8b05e49f934ae7a853e0db5f3a4af06f85f78cd69cea67fbac73320290ee752f95e0b5cbfbaba02ba759d497d0260b48de14bad1bc6b573050b6f5c637e6495eacc561f518f6b01a3c05a834167f9a4991e8f14d54f6eeb70cfa840fb2151a784ea41166dc9d8d89edb69f5d557335d35411ae13564a1b6cdf67d93f874d1d569eb5bd9747184058fd419fe2e5d1c61e11da32efa781f5f822e8eb7e011f065437571bc85778cbae8d0bc4f2c4117275af09c58615d10bfe162de5c0598c7b2eb787877f7d9b8934ad0c549163c27555817275978c7a78b7cdf78f6c925e8e2640b9e932bac0be2375cccc75701e6b1ec3a1ede5d7dbed62925e8e2140b9e532aac0be2375cccc7d720e693aa00f358761d0fefaeed9af7a925e8e2540b9e532bac8b532dbc63d4c50ecdfbb41274719a05cf6915d6c56916de31b6ab7d7ed1961274b1c582674b857541fc868bf9a41ac47c620d62de5c83988fa841ccc7d720e65a7c07aba16e8c65d7f1f0eedaaa799f5e822e4eb7e039bdc2ba207e49c07c520d623ebe06311f5183984fab41ccd5a067fc06c198e9927872db1a181ed259c030060c63035ce3fcc6d6d831f69fe742bcb602af6df1f3cad9ea0bdd6f13e59ddbaa9fbb237e99fac6dfce30cfa2f9fb1d1699ce34d7a998f579063c37057c283e8dd7d307d2523ad207bdb7845dcf376e37d7889de73b9de56b8234db2df2178278e5dfc1f0ec60987599fc13d6214ad4ad52eab55e0741eff24c13e29c2e7eef642b8b93b4975b196eba3f1d3092bd44fb20608b42bfe148fcf03b1a4757a9ce9a206e2de06910c2339de1996ed18514efa98cf7d40af29ec4784faa20eff18cf7f80af21ec7788fab20ef598cf7ac0af29ecf78cfaf20efb98cf7dc0af25ec4782faa20ef36c6bbad82bc1730de0b18ef46b8c6ef6ead8d1b4f6e6bdf3c1df1a03551fc7b4e42fd88adb80f9e7ea5f423a4da69a1b6d5ba37eb682613ae83c4b54b526bf54e677878bf6cb89837d720e6236a107325f6c0f9ba31786eaa56309f5483986bb13e9f5c83986b51cfb5589f4fa941cca7d620e6d36a10732dd6e75a6c07bd2f5a19ccbe4da90ce65aac1b5b3ce68a60f63e7f6530d7e23b785a0d62ae063deb71501a137d64ba249efeb51488877416308c01c3886b304e079d09ac6fc862f9e0dcfff6f87985ae75d92ecabb7f2dc519f1cb94c5f505b496e20c8b4c6799ebb8d752e03a8714f0a1f8345c3f086b29281de983de5bc2aee729685d0262e7f94e60f99a20cd0e8bfc85205ef9cf6078ce60987599bc17de7389ba554abdd6f3bcf42ecf04bdf8f9f57879fbf9f5fee7faf97579de7e7ebdffb9d53abf3e1afedbc6e2247dd06d0c23dd9f0018c907955d43da8f877891efc17937315d55a3ce9a200ed74d8c16c2e36a3f475780b7abfdac046f57fb5909deaef6b312bc5ded672578bbdacf4af076b59f95e0ed6a3f2bc1dbd57e5682b7abfdac046f57fb5909dedea67a9b5a29dedea67a9b5a29dec56c6a235c8f023c13e2c693dbda3716453c68cd2ff146bf5960bcbb6fcd2ff51fe857ca78b754df47a8bf92b5cd33343099708f22aef93d5d40ceb0f1c7d3a11c868379730d62aed63dd16198ab75eff9f3ad6e9c588398abf52c85e75b7d3eb90631d7a29e6bb13e9f5283984fad41cca7d520e65aaccfb5d80e7a5fb432987d9b5219ccb55837b678cc15c1ec7dfeca60aec577f0b41ac45c2de7a7d198e8ad7b4be289fffcb4edb1631c7c7e1aae5115386b2c744df60e51defd6b7ecf8c5fa62cae83a535bf675a647a81b94ec5ac4f5c8f9b023e149f86eb9bf71e484be9481ff4de12763d4f41eb67113bcf773acbd70469ceb0c85f08e295ff4c86e74c865997c9abe13d97a85ba5d46bdbf9695ae7f4cea521ee74d01bc5a13da5387af66488239def0971a493bd208eeac4de10473adb07e2ceb6603ec75cd741dcb9e6ba1ee2ce33d76320ee7c73bd1fc45d60aef780b8179aeb4688bbd05ccf80b89de61ad734ef32d7d320ee22738deb8f5f64aea740dcc5e61ad70a5f62ae2742dca5e61ad7f55e66aef785b8cbcd35aec1bdc25c6720eec5e61ad7cbbec45cb742dc4bcdf57c88bbd25ccf81b8abccf53c887b99b9c6b5a9579beb66887bb9b96e81b85798ebc510778db95e0471af34d7b321ee55e61ad7865e6bae1742dc75e61ad771beda5ce721ee35e67a25c4bdd65c7740dcebccf52a887bbdb9ce41dc1bcc7501e2ae37d75d107783b9ce42dc8de67a39c4bdd15caf81b89bccf55288bbd95caf83b85bccf5fe10f726737d00c4dd6aae0f82b8379beb8321ee36737d08c4dd6eae0f85b8b798ebc320eeade6fa40887b9bb93e1ce2de6eae3b21ee0e73bd04e2ee34d7eb21ee2e73dd0e71ef30d79b20ee9de6fa28887b97b9ee81b8779beb6320ee3de61abfc57cb7b93e0ee2ee31d7bd1047366e3bc491ff88fe1ad96fdcb74573ed3b208eece3191047f6f14c8823db7f16c4910d7901c491fd391be2a82d3f07e268beff5c8823db7a1ec451fb723ec491ddbb00e2c83ebe10e2c87e5f0871d436ed8438b2b7bb208eecf24510476dd88b208e6cfac51047edda251047edc1a510476ddd6510476dc9e51047eddf15104736fdc510476de24b208edab597421cd9f42b212e63aeaf8238b2c12f8338b2c157431cd9d697431cd9fe57401cb51bd7401cd9fe57421cb511af82386a5fae8538b2cbd7411cd9ef5743dc2273fd1a88a376e3b51047edc1eb208eecc5eb218e6ce61b208e6cf0f5104736fd0688a376e34688235bf34688a376e32688237b7633c4517b700bc4d137badf047164936e8538b22b6f86b865e6fa3688a3b6e47688a375236f81386affde0a71d4d6bd0de2e86ce4b7435cc15cdf0171d45edd09716bcdf55d1047edd53b208e6cfa3b218edab07741dc0673fd6e88a376ed3d10476dcedd10476d1dd9696d0ff10c62b4ef9b59dc58e05d08e2ed83f0ef95d23df1d318f9373a1be17a19e0ee65711a77b710ee5e869beef19bf324432fc4d135d5c914e4e1cfc26f57d3b7b8eb1dfcd290a6d71866dbf7b7c70622dfbdeffb9639f903d497276cc702464ab33204233e8b706e66f2a22e8f03d904be639bb7c94665b3d922dbba22fa3f4e00a390ec39ac7bb40ef2088bec94e6c019037a3ad85ca39d3f1af478bce57ffa858df561799f10bfcc7de3522702ce02f041de2701d69878e790378d4bf16f99a6e1fab8190369f9775149d7b85f8ee618103bcfd7cdf2e1f7548fb7c85f082a330e4dfc74991c06f58cea91643b75bc434747828e284d2fe8e868213cfcdbd68483f8611b55cfd250de34a4d91262b3b46ce40b90dcd8dea29f2060db42dbdbe30023c56d008c5c665d5f5a4da7a711fec77ef06616e7fd9fd2cb234eff6723a4a17a1de6ff509a8b8bb4bf02ef649fff43e326dcff391a30529acb8bf83fc7c07d2108f77f8e01d9a4fc1f2e1b95cd668b6c5715d1ff31021825fd1f2c3ffd5c9bff4369ae8176e95516ffe648d0e32d11fd1f2c6f017b9bc5f68ecafb380bef13006b4cbc07b5b5e4ff101f8a4fc3f5cde0ff70bf81744dd8f53b437e2a62e7f9ba593e3cdbe9588bfc85205ef979dfe73886b96f5e0eead92d15f07f8e75e86823e86877ff13747484101edefe100ee2a7d350f9d7b33494370d69de56c4ff215f00fd1fee3b08d9b61cca42cfa6fb630023c5a1ffc365d6f5e5693310dc08ffe37c410f8b93f42388173d9beb19dbb91e88a36bf47fb84f2459ff5c7edb11809164b0f96de8ff1ce178d60648c3eb32e78775f92345dadf238157c15c67cbfbf5f93f34bf446d06613b1230529a878bf83f47c17d2118286fd42fe9e02890ad277ed9f236d9a86c7a2cb27da288fe8f12c02824fb20db43fe4faf45764af35968973e0ffe0d95db46d0e3372dffd32fccffc1f216b0b7596cefa8bc8fb1f03e0eb0c6c47b505b4bfe0ff1c17138bafe06f83fdc6f205d13761cef47ec3cdf112c5f13a439da227f2188577edef7398661d665f238d4b36f82ff23d54e1dedd0d106d011a5c17d16bd427878fbc3fbda3a0d957f3d4b83fd164af38322fe0ff9022437fa16e82708d8b61cca42cfa6fba300a36d8c8acbacebcbb5e0ff503b8cf35fb6712d29dbea1a47415f87fc19db38ca6ac0ddcde234ee4d42b8f9980ddd6f028c365f8eae696e340579f8b3d0ffa1f2ab77f04b439abf14697f05c6097ad18fa33683b0e1fb46699e2de2ff709fb097c98bbac4b5e102e5dd6d936d03c383b2fdb788fe057cf26ec9ba8ee5a79fbbcc223ba5a9db67404f69738d7daa15a0c72996ffe917e6ff60790bd8db2cb67754de4759781f035863e23da8ad25ff87f8e0381c5d4fde67202df71b48d7841dc7fb113bcfd7c3f235419a232df2178278e5e77d9fa318665d2663a09e513d92f4378e74e808fd1f4ad30d3a5a21846719c343386cf30adcffa1bc6948b38fd161b1f92f9c27e2636092e30daef6f608c04871b80693cbacebcb2af07fa81dc675a52b58dc58c85f08e2958b78d1b35730bc1a23f9332b206e05e0a5b097c555b3df8667c9f6389e85fe0fafcbb63e38a5c985d465913e92f9462ead0da43683fb7f6948d31982119f45385730795197ed209b80bdb1cac6ed0dcab6bc88fedb05304ada5a2c3ffddcd516d977d7296897d65afc9bb5a0c7cd11fd1f2c6f019f2f8b3e1ff7e59137ce35c4c47b90bf49fe8f6dbe91ae3781ffc3fb0ca46bec33d8e649783e3efedf140c1dbf936ceb787f908f3de832d91fead966f07fa4daa98d0e1da1ffc3e75a349eb5427856333c8403fbd57cfd0fa5a1bcb8fee7f822fe0ff902e8ff505ef413046c5b687bdb0e18f9fa97068bcc7d6387667304ae51c13d396b599ca46d255ef46cba475f87f4bb16e2e81ac7ba96b138c9fe00f7bf6dbe8ecd97a36baa47b6b2a534ab210ded27a877f04b439af38bb4bf9dc0ab60aeb3e5fd7a6c3e0261eb048c9466e730fd9fb54c5ed425b64902f6266f938dca66ad45b64b2befffe4256d2d969f7eee7a8bec94e625d02e5d09fe0df7e9f5ffafb7fc4f3fefff94e6ffbc2ec4ffe16394a5fa3f7cacb51afd9faba19ebd1efc1fa9766aa34347ab41479406d75fac17c2c3db1fc241fc741a2aff7a9606c77f28cd2d45fc1ff2056c632be82748f93f1b82c1f2d23dfa3fbc4fda6091b96fbd3cf83f64b770aff65216a7e55a232417f1a267d33df1d318b3e69afeb3e55bcdf4918267f0f2a7bc6948f3ee226d9640dbd2e733d07ec0d14c7e6c5b28cdbd457c8675705f0806fc407a6623c8bb4e56b62e8d673d93cde633509a0f15d1bf801de992f419f60719f573b316d929cd0360cb1f029f80caad13f4f898e57ffa85f90cd8473b207e99fb7c8603016701f820ef83006b4cbc73c89b7c06e243f169b8fe3cf80c948ef441ba26ecd84744ec3cdf5296af09d26cb0c85f08e295ff0086e700865997c947a19e3d063ec33a214c1b1c3a429f81d2ac011d6585f0ac61780807f1b3f53357337ce8eb7fa588cf40ed279e5bc2db5b491fa933182c2fddaf078c1487e7a87099757db9d11c3281f3317866c9721627e90b112f7a36dd133f1c7b582e8ba7077d11b27b5986270d697e54a40de77e0db5e159908d645a0ab209f867791c9fe2b2e1fb40697e5e791f2a2fe99bae0319f573575864a734bf01dbfa3b4b1b8de38fff8ed886af055dee1fbfcc59b4d954defb5b781f005863e23da8bda0369cf8503cf6d7fe056d386ffb48d7841dc750113bcfb794e56b0aec3e8c80ff34c867a467efcf30eb32f923d4b37f431b2e656bd73b7494051d511ab4b552e310dcf6130e5cf741e55fcfd250de34a419650e2772b5e1d49e611bcedbbf4acef3f03e545330b4efdb609159d797e3a00da7f1801ce459c1e2b45c2b85e472adfb207ed8ce61d9f27c2427ae7ba667f0f2c7f96a4a3325a4fcb5fcab62973fd78de53a9ac9bf0a30529abd4230daea483b93b711e45d2d2a5bbf3f5460b2652db2519a9945f45f10c02824fba03e06c9b8dc223ba569d977404f73cc35be873866d76ef99f7e613e43017429d0cfcbdac679d65978ef0f5863e23da87d229f81f8503c8e31e5f71d48cbdb5ad23561c73956c4cef3ad60f99a02bbcf24e0afe56c637eeb18665d26f3a09e513dd298560b615aebd011fa0c946625e8486aed86cb67207e616d06fa0c946679119f81da4f1c87a7bcd8b61684e45d190c9617db70c2c8db0397cff0cf29fdd7b89f037d866516b9960bc9e55a7340fc704d20962dcf477276431a7a062f7f9c2ba234871469b3e2f77dfb7d062ab3d14c7e9b5fb3b188cfc0eb483b9317fdaf95a2b2f5fb0cab986c369f8dd21c5d719faddf6790ead3e07a2cfddc5e8bec94e604b0e527814fc0d7d5e8ffcfb6fc4fbf309f6115e852606c256b1b575a63e1bd0eb0c6c47b50fb443e03f1a1781cd37a01f80cbcad255de35c25e144ec3cdf3296af29b0fb4c52e3f26b181e3e27a8cbe454a8676783cf20d51f2c04761da1cf4069709ca152ebfb0907ae5b73b519b8268dd2ec2cd167c0b58b9417db56a97e8b6b4c7d1560e4ed418345665d5f1e009fa18bc9806bbd512ea9758aaef345701d1df90158b63c1fc9d90969f8fa5a5e47707dedd545daacf87ddf7e9f017db94230f4dc14aca3af2ce233f03ad2cee445ff6bb9a86cd90e1c0be23e03ca46695e5b719f2ddb21d9a7590932eae7765b64a73437802d7f23f804546e5da0c7bb2cffd32fcc67c06fb30bf42bb3b671a5d516de6b006b4cbc07b54fe433a05fa47f38a67527f80cbcad255d1376fdce908d45ec3c5f0fcbd714d87d26a9b930d73834ce11df02f5ec2ef019a4fa83ab1c3a429f81d2e09e8c4a9d8969eb6752f987f90c94e6de127d06dc93c1db5bc97e4b5730585eba5f0118290ebff162f3197682cfb094c980eb2650ae2e21b95ceb26889fc648df3ce814c5d3df8677839e0aa03fe287fbef3e5aa40de7fb88a90dc7f5052413ee23913a57abd7219bcd87fa5491365cc087143d570bdb6afddc0e8bec94e6f3605bbf006d345fe3d977be9fe57ffa85b5e16823056c46d63686b5c2c27b15608d89f7209f89da70e283be145d7f0bda70dece90ae717e8df7976cf9ba593e6c9f965be42f04f1caef9a73c5b1b72f413d7b1ada70295bbbdca1236cc36d6bcb3a84f070db4f38881faed1e26d38ee13dabddeabc4361cf7f1f1f64fb27fec5a7fdf0b18f97e80068bcc7def33b4e15926037e4f08e5925ab742bce8d9748f6b0449ae3cc4e1b7f228ec6071427b08fb707730dcdccf6804193a208eaef15c894ec7b396401aee8f727ee88ffead48fb1bbb8d30e74a70ff87fb63e8fffc7398fe4f9ec98bba44ff271fb76c0edf8eca266f91ed7f45f41f7fbf26d72d23fbe0fe03f93f4b2db2ef4e3373404ff5e61afb0559d0e39e96ffe917e6ff08ef9bcea2cfc7f70823efe5803526de83fc4df27f880ffaa1743d75e6405ad7fc398ea192cf8ad879be4e960fdbf61e8bfc8540b67fcec72a75998c837a46f548b29dea71e86809e888d274808e960ae1e1ed0fe1c0bd7754fef52c0de54d439a994687c5fc1fdc4bc07d07c9319b6c30585e3e66d3140c5dcfdf6091b9ef4c36f07fe87b8fb86e34c7e2246d2bf1a267d33dfa3a5ccf8dc1607f8dc2761627e97ff3730f6cbe0ef7e546d28f14d2451ef54ebfb0b60b6d83405fad1dfde052f0e0fe26095f5948ce2cda9ae7627caecdd677305dd9be332139fee41abf0d9b07f598e3c7acf1703b8763f9ed558291e264c7bcc3ed2e9621b547398bce2a7106e4707496073c026d7e167d127abef6498e021f36173fdff614e357001cc42f0d69fe03fef571e6da35eeb284c549fa1dc42b08ec3e2dfa464b208eae27004681f6ae3dcc37c735297c3cc7e69b539aad457cf309161dd035fa84363b25e5afbbde393c639e64461f44ca3fa43a417df59c4517d27e4a8ccf6dc7f673b443c769487341481d2aa52dc6f14c1c0390a83f42e33aedb6711d7e16338ead5c5c4467cb1c3ac33aced771d50543cf04ce98787e56de73269e3f43a7979c471518d769b7ad03e3e33ab80eecaa22bae773641d4c77b87712d71d2d895fb650fb82e343d43e621b5a4d6d675330d42740d9ea4cbe85e6be5356af59f459d281bd2d459fe506180ba5321f150c2e0f6c833bd8b329cf4288ef60cfaee0bac4ad88713493638505e3cd45300ad4abad92eb96d02ee8e7daf69a509adbc05f7d0bcc2b507d59007a7cafe57ffa953a762330f79fc5f57b54deab2cbc0b803526de83d60ea6d8b371df0b5ddf3b732806d207e99ab0e3be661b768a5fc2f2e15e829516f90b31cbcfd7816019eb9f2e93b7433d7b2ff4d9a4c687573a7494031d511a3c538f8f97f3f50b3a0d95533d4b4379d390e6fe22b645c06fb7da3fdb993d94e6c111b27fd2e72791fdcb5b64a7341f837af928d837ee87e8ff9fb4fc4f3f6fff4ab37f4f84d83f6ec74ab57f3996af1aeddfa7a09e3d09f66f8110a6950e1de1ba334a53cabe20b47ff43e85ed0ba234df28625b04fc5fabfd236c4b0023a5f9f608d93fa93e15b77f0b2cb2539a1f40bdfc11d8373e77aaffff83e57ffa79fb579afdfb7d88fde376ac54fbc7cf9fa946fbf713a8677f1801ff8fdb28b47fcb208e9fff857bcb715d83f49a797af6320b6e8a23ddd9e693a82f8e769baf6b59c89e83eb5afe1562131b2c7975b9be7472ffb56d0d03ceafe3d8f148ae33a5f7cd36fe8ff334b639b7911cffb7edd7a16b5c1fdbed7816ae8fa57a55efe08763e10dfbf587ae7632f677c2ac8fe57b68f87e66dc43333104233e8b70dac69e4907b86743c00768b7c9669bcfa2347b16d1bfc4d8bfe4b82a969f7e6ece223ba599b1df809ef635d7b8ff07edd022cbfff40bf353b0bc05c6f2b3b6b1fce516deb88f2726de83f6c7909f427c705c70f758ee7e0369795b4abac67389a84d42ec3c5f37cb676b8351fe4220e317d3b3f9790fba4c66413da37a24d94e2d73e808e73f280dcef70aac75b0b63fb6790ddeffe3f3d1d8ff6b0fb159b82e08f707d9d6204aed0f72adc3c135dc7c0f458345665c8ba2df87d9267e01e459cae2b45c5267c1bbf63de13e58bef619f70ca1ffc3d7cc56dbba5ec9f7c1b57e3a27ab8bfc70c71871fd95407bdd81ef652978b0df2d31ce2b2467166d7ddceb63b96dcd335d557a0da2ab8f44fc3c668fd98519f7b6e0ba0c4a5789732c4ac1681b7390eacfb8da0a2c436a43975a74d650653acb021e013f258be348b8bff13cf0bb05f68175a418bf02e0c06fa7ed1e579d3590f642830dfd10f49516b238495f897805817d3c0ffdb9851047d7b8a657a08dee081b97c43977aa6f61e39294e6c545fa13132c3ae0fbf25d766a24c7224966f49ba47c5adceb5808ece73148fb56313eb703dbcfd10e1de3baf0eb8a8c11166b8b71ecb812fbc004c69a3b6ceba0f9b94838fe767d119df5387486759cef1fa9035ef45f2618bc7617f7aad5599ea1d30be9282f34eed031dcf5d4b715d13d1f43ca33ddd9d6534b8e170b8c9d760c771df49d4574b6c2a1b362eba017c62f5ba84d267ee83ba2df514dfe465330d48f42d9ea4cbe3673df2eabd72cfa79e9c0ee7fa09f773f8c79f375d04b593edb1a6bcad306f179f6ec0a9ea93f681d38fffeee0a0bc6078b60143823262b23bb7d1dcc128becbbd701c2b8ffa3307f44f56536e8f149cbfff42b758caed2eb60907701b0c6c47bf8eb00f71b8a81f441ba1eee3a98852c5f55ae03847af624f473a5e601563a74b41474c4bfdd62dbf3c2bfd5acd35039d5b334b8ce8cd27ca3886d89bfaf63b77f617b77bf3d42f64faa9fe7da0782b2ef5e0708f5f24760dfb81fd2b77ecbf23ffdbcfd2b711d6088fde376ac54fbb794e5abca758050cffe00f66fb610a6950e1de1fc3aa5c1f1783e966bdb8b4ee5c4e7c1d1e7a4347f2b625b04ce56b6da3fdbd9ca94e69f2364ffa4cf5e25fb37db223ba5790eea6560c67b719e1fcf1f9e68f99f7edefe9566ff9a660dc540fae076ecf9b40f6e14cc25503d921c5770ed832bb60f6436cb67fb3e8ceb9c60ca8be7044f33b2566ceda8c3fecd66b2a2fd9b5104a394fd935a4bceeddf428bec946616d4cb66b06f54a6b80f2e6bf99f7edefe9566ff9686d8bfa8fbe06a611fc81ca86759b07f52e77dbaf681cc061dd9f681d01a3ddb582baedf93dac3e51a6b45bf356cac95f2d15824da6dbe0fa48d3d07c7445784d8c4064bdebe329edc7fedcf498f8ebb12e7a42f8434c33927fdb022ed64359c93be3904233e8b708edc39e9fd735b5c36db1a084a736c11fd4bcc174bce2b0de79cf493a0fd3805fc10db39e9e75afea75f989fe2cf491fb83e07fc94249d93be05ead9b9e0a754fa9c749cff1dc973d26dbe866b3fa9ed9cf48b426c562d9f93ce65c6f58bfa7d586ce29758f22c01b9a4c63f5d7e24f1d31817996bdb1a41f47ff8de9091debf4232e0be6ca9f7818f87d8780be8223fdc39165cb32be1ab94d3e79798e71292338bb6feb9189f6bb3ad59a6ab4aaf5b77f591f09b601eb3c76cc3ec3a3383d22dad128cb63107a9fe8cabadc032a43674a145679538d374383a9b0d7804fc942c8e23e13aab0fce12e5db81fe11f5c3380e9cc3bd3a3390f6c3065b23e4415f69368b93f4955cf50d7d259bdf47d7b80f44a08deeb0f9d7c43b6c5f399703e76a3e51a43f31c1a203ba463fd666a746722c92db0a499f16c7ff0ac1d03e5e257cab189fdb81ede768878e712fd11345c6088bb5c538765c89fdce95da3b43f86d63bf4f15d15997436758c7f99ec33ae045ff6582c1fb3d704f769de5193abd908ef2d5b207e7074574ef3abb316c0f8e906cedd5b277e6674574b6cca1b362df22e0e7c9654c3c6fb3f8b7086643fa4a8cfb70db8ef39ee49ba0ff524d7e4b13c4a13c745d67f2d17c2cfaf6127e6a2a18bcb70331e39a5a4af30f183ba7ba43fb4916b27ce823d1b329cf0288cfb267bbe68096c52e7fc7a0fd347c9e6a9905e37f8a608cbf5e756465641f3c6f40e5b3c8223ba5496506f434ca5ce3fbb518f438d9f23ffd4a1deb13d84393c5f51354de2b2cbc5701d698780f5abb41f354c487e2d370bd4766202d5f8742ba26ecdaa6d35c0f62e7f966b37c4d9066b945fe4210affc7c8fe20a86b9ef5bd199816baa471a539b10a6e50e1de13c15a5095b97623b0780de273e9f84eb5228cdde99fed0655b16c72ebfddfe11b6c58091d2cccc846394b27ff1cb6eb77f6d16d9294d4b66404f73ccb56b3f5dbbe57ffa79fb579afdcb6706d216b363a5dabf852c5f35dabf7999816baa471ad322214ccb1d3ac2fd7494266c5cdfb69f98de27be9f0ee7d329cdb24c7fe8b22df1fbbf76fb47d870bc74f73ad44c384629fb27d5a772f97f283ba5599719d0d3fee6dab59fee28cbfff4f3f6af34fb776466206d313b56aafde37be5abd1fe1d9819b8a67a5449ff8fdb28b47f61e7dbf1394c9bffc7c7f8d0ff3b31d31fba6c4bfcfb69ecf68fb0e1b7ef28cda999708c52f64f6a2f91cbff43d929cdb6cc809e76986b5c438debc52fb2fc4f3f6fff4ab37fbb3203698bd9b152ed5f07cb578df6efacccc035d5a34afa7fb6f313f95a56fc3e28ee21e0df2492dc0bcbe7067a2cb8298e74873699f2d15864d8f97d0bd87370ceedaa4c7fe8da4fc2f3ea727d788ffe6b9cc7c6395c3eaf2bb5d60ced3f3d9baf51c5395cdbdc33ae11b0adf718c9b967db59db748dfb49da1dcf6a8334bc4e84cdc3de90e90f5ded64ec6b60cc7e129a17e3f39ed8dfa2343767dc18f15984d336efc9f79808cdad74d864a3b2c95a64bb3de3964d6ade59725e09cb4f3fd7b68e84d2dc9119d0d35de65abf8f546ed84fbbcff23ffdc2fc142c6f81b9d6ac6d1eb9dbc27bf7dc4420d3b6909fc2bfd38e73d81fca0ca4e5fb30f837ab6cdfe2b1e5e3df906882345d16f90b41bcf2f3bd647c3e5a97c9bb3203d7548f24dba92e878eda40479406d71a498d9df0f687afb3c3795dbe2f15f781519a4732fda16bfd171f5fc3b165f413a4f66fbaf65d7402463e07dc609119d741eaf7619e89c775a32d2c4ecbd52c2417f1a267d33df1d318e79aeb16886b01bc142e6271927317dc8fa5fbc5809164580478a4fa11cd0c8f8db7802ef2a877fa85b55d8b018fc05ef7f606e0510a1eec2b498c7109c999c5759c71ef27e17d12bee70cf7ae09ef57eaabdbfcec407ee68cc75c19cc1a0fb7737866d5a22ac148716d8047ea5c0d97ddc532a4f6a8c5a2b34aac8b1b8ece9a018f409b9fc531197abef649fe9411e5db8ebe06f569388e34a47947f340dabf65faaf1b83c1df5fa3b099c549fa1daefa867e87cd87a26bdc9b21d0def5e979b103238ee7507dab77c8918634f467b1bd19a803ba469fd066a7a4f642b8de39fc361eb71592fe21d509eaabb7587421eda7c4f8dc76dbdc19d731ce9d3586d4a152da62dcd74e69ebe09afe7b2e18dc0f8fc337db617eb87f6638cfdd51e417d3dee41c8f08400f75708d635dc5feb7a5cd431ede2f7f8edd8f0986fa5069f87f4648bd906a9385c6e5db715c849fcf8ae3e49466569177828fb1d03b81f310fc6c1d21d9f242635bed38becbc7ed710d3ea5995b44671d0e9dd9c6ed296d1da4a3ff32269eb78bb4ff83d23543fa4a8cd3f0f683f8a19f8b3e5235f9464d1087f2d0755d30787c1ffb0f12be702a18bc170331e3be104ab3ac790033d51ddaffd1c2f2a11f46cfb6adad5bcc9e5db139b36cb60b318e6672745830ae2a8251a05e7509c93ee8dbc4543e732db2539a75d01fd9df5ce3fb350ff47894e57ffaa5d87d01ae716c4e60dd4016e736f87a27e48df33f31f11e34af42f34afc9b607826de91f0aef1b50ea46bc2ae6d3a8dc323769eaf99e5c335129d16f90b81ec1c0edfbbd9b7fe0fea19d5238d698110a64e878e5a40479406d791cc65f9283d8eaf5139d5b33494370d694e2c625b04fa6556fb3797c98af6efd411b27f527d526eff6ceb7c28cd36a8973bc0be713fa46fdd96e57ffa79fb579afddb1562ffb81d2bd5feb5b07cd568ffce827a7611d8bf7942983a1d3a9a0b3aa234b8ff6d01cb47e9d1fe5139d5b334e873529a2b8ad81681311cabfd5bc06445fb77e508d93fa931426effe65964a734af807af94ab06f7c6e5cff7fb3e57ffa79fb579afdbb29c4fe713b56aafd9bcbf255a3fdbb0eead9cd60ffa4c6153a1d3a5a003aa234b6ef82527a5cff8aeb56a4fc56d7fa57c4cdc7686c63147c2d21fab6fcdc2a9ca7a2347786d8c4064b5e5dae679ac4385784f3247cee4472ff0f9f2ba27be287f324b6f91d9c87b3cda98ee4fc0ec9807308748deb9f973a9eb500d250fda80f8acf75dc5fe9316db3fe99da2abe971dd7c9529a078b8ca3e6e0be100c9437ea977f7b51c80768b7c94665b3d822dbc78be85f621c5b725c959f23d36c919dd27c1ada8fcf821f42e5867eca5396ffe917e6a7087fe7235bca9c00aef58cdb4fc17dded846e2b8205d7f1dfc14575f226ccf802d1f9f53b3b5c1287f2188577ebe1f849f1fa7cbe431a8674f819f22d54ee51d3ab2b5f7389f2fe537f1f687af65c1790dbe8f0abfa74b69be1762b370dd17ee93e2be83e4faf39660b0bc749f038c1487e78f719971ad11eead9a03795a599c966bae905cc48b9e4df7c40f7db456886b05bc14ce63711af77c21dcf3186eba9f0f184986791047d7e8ffcc773c0beb329563bd831fce93fda948fb1b7b9fc0f83ffcec5fc286e32dbbbfdf5ac4ffe1ebfd5b99bcb6b5fb32e5ddffdd432e5b33c383b2fdbb88fee3df4fdeffdd43a9bacee7685b2cb2ef1e8f6b19d0539db9c671183ca7680fcbfff40bf37fb0bc057cbe41e71252792fb6f05e025863e29d43dee4fff0f5bc786ecda49681b4bc4de467e3e11a2ec4cef3cd65f9707dacf07ab9d03e31b661a3a19e513dd2985a85302d72e8a819744469e6818ea4f67f717f8070e0fe2f3effc7e71671fe6f6f13e9f27fc817c0f126ca8b7e82d45919aef616cfc9a338f40db8cc7ddf0986f19f0cfbbf01e46901b9a4ea15f1a267cf6132d87cb4c660b0bf46e15c1627396fc3e79f6dbe0ef7e546d28f14d2457eb86d17da0681b1d92e7c2f4bc183df5e95f01f84e41c742e4fdcfbbfb8ad9fc77485b61efd01a975027cae93af13f0983d668f7964316b3cbc0dc4f197b9558291e2e6031ea93942579b8c6548beca1c8bce1aaa4c67ad8047c01fcca2bf4acfd7feea49d0bf99133fdfae14e357001cc42f0d6976ce1d487b9ac1e6f249ab6d4c8ee40a1b9393f2cdc2c6fa70ae939fdb611beba3346717e9b74db0e880aeb1bfc0d71348be73aeb33c160146dbd89e54df01c7590b708f6bd06c76cad6df92eaffbafa5bd8ffe5631292f32fae77cdf316b1d1f9e1ee65909ebbc1719252f054620cc05536c85be0fdcc56727d3cb795b83ef4d5216d013e8b70523b80dfa9e663bf52eb2a704c117949b539f3400f05b8afc4d944ae7a29bcbe6cd86713e17e3f893deb0dc0a3143c78e68bc45c83909c595c6316f7d8145f17d6c674d50469f04c65a97509aeefcae377b83c6679cc381e82eb3f285d25d6a8948291e2708d90d41a5597ddc532e4f3f8a8b3e62ad319f6a5a92f8eeb121e80710281fe6bbb6d1d041fd3c1be69278c133c02e3047cad168e13a0cea5e6dc5cf502e7dca83ed8c609d0b7965a6fdbeac048fc709d40bd430e5c27f0b922e304b67947bac6b5f16d2c4e721d401bd3816d3d39c98cbe8b941f4775827cc8f94c17684f700c93fec7ba2db54e938f9bf33601db091c031ea931b924f316b0d17d3e3f8e31ea5fa9f3bf12ef0d8ee7978247b83f96c5f1fc4aecef71d503e1b319f3c3ed6ba13f2671e613ee4f2a050ffad412fea1909c59f415e3eefbf135f8b6732c290deed3c80be82f057ce9d9748ffb14799bdd00e9daaa046325cf9875d9032c43b2dfad169dcdaf329d619f848f4d6abfffbfd02791b0e738ae49eb93c3c6489f6d1dc096320beb705d2cf6036d6df648f649482e5b9f04db71297fdcd527c1b5c4f40e85f54928cd04a37f579f64814507746d1be3407b22f5febafaeb7826201f6790f42fa84e509f64a14517d2639c71cb349c7db47b87d421db381ed51fdb3e656c33a5d6cdbaca6b5e05790721bc05ec5b7eb86b52719d8d942fda3a0c3cd2e3bb92be6894f3728bfdb4aef81ed556a6ab2648237c366aa8cf827b786dfb03b81f33d218f9f7ef24edaccb1ed87cd145169dcdaf329de1377cf87909ba2d59367b00afc43a001c7f235f94ef1bc36fee3e0cbee82af0451733fda26f5d095fd4552fd00fe36b6fd13f1d095f947887f9a25c0ef4450f0af1236cbeb7cb768ce47732b99f24e94be05aed4260dffb263dbe12b74caeb3c3f19c324a737411bf938fd570db8afd046c1fa5e6425de5b5b482bc832ae52dd01658cfa2e773b6589fb60cb33e511b8136999f456fcb47e9d14ef2f5c6adec3938a77b46897d76acd352fb0b5c759af8d50543fb7b2913cfc716e85c797eae496a8465401f0ccffcb2ede390f2075c7b245a01a36d4e456a6e9cfb5879a61f195de4b60e776e0dfbb112f547a8cc07edad1c1bdb733bf3b6f1183ed68debaa1083549befdaa394b3f08e4f175d9db63eb44d17b673b7a4fa5a2e5db45b78c7a88b41677e85e9a2c38247eadb042e5d745878c7a88b41df1a0fd345a7058fd479642e5d849da1168639570598c7b2eb787877f7d9b8ae1274d165c12370e670a82eba2cbce3d3457ed079c761bae8b6e011f8ae7ba82ef06ce4e160eea802cc63d9753cbcbbfacef4ea2941173d163c526738bb741176ee7418e68e1ac4dc550598c7b2eb7878776dd7bc7b4bd045af054f6f8575d16be11da32e7668decb4ad0c5320b9e6515d6c5320bef18dbd53ebf687909ba586ec1b3bcc2ba207ec3c5dc5583983b6b1073ae0631b7d720e68e1ac45c8bef6035d48db1ec3a1ede5d5b35ef1525e8628505cf8a0aeb82f8250173570d62eea841cced358879590d62ae063de3da90897324f1e4b60d770d1c6168806b9cdf58193bc6febd3ac46b25f05a153faf9cadbed0fd2a51deb9add85ec62853dff8db1af3acd1ecd928d35a739d8a599f6be0b929e043f169b89e3067202da5237dcc876bfdd373ddabcd3562e7f956b07c4d9066b545fe42ccf217189e02c3dcb70701de7389ba554abdd673f9f42ecf34217e2ba5d984fadd5fc9e224ede54a869bee570046b297681f046c51e85c7d25790755c8bb11ae716fbcc0dc74df9948546fc9a6116f5cd74769661940ae7535ab986c798b6cfc7db1c96b7b16a5c1b53684b19ea55905d829cddc10ec2359cfeb82a1be4bc6c4f3b2a07535bc1dcf04fe5d1d29de52ef25b5a9f45e529dc6f792d27416792f573339e8bdb4bd83ab43f251fab07770157b0ebe83cb4370e2b919e84f089cff175aa7895f1dc882ef591da4a1ffe9bde4762c33c232e0191a54e60df03ffa1d52fd00d737195601468ac3f56e02fb71bb6cebdd5633fd48f98ec33d7312fb1412f547a8ccb3b6be793393a92918ba7e57c896e66cbe04b7a5c3c59cab41cced3588b9a30631d762dde8ac41cc5d3588b916eb73770d62ae453dd7627deea941ccbd358879590d62aec5fa5c8beda0f7452b83d9b72995c15c8b7563b9c75c11ccdee7af0ce65a7c076bd147aa063de33a996fcf91c4d3bf4e06f190ce0286316018717d0d8e8b1662c7d8bf4ea69561d1bcd6c4cf2b741dd31a51defdeb64d6c52f53dff8ef7af3acd1e6b9eb2c32ed6fae5331eb733d3c37057c283e0dd7df847532948ef441ef2d61d773646bcd3562e7f95a59be2648b3d6227f218857fe750ccf3a865997c917e13d97a85ba5d46b3d0748ef32ae93a1f99806080b2c4ed25e16186eba6f058c78f62ae12908e171cdf1110ffc9edeea2ad55913c4a13c745d67fe9f65ee712eae103fe62cce6da7d9b3f19c164af33bb0135467470583cb03cf896965cfdebd7e06e25bd9b35deb5204e6227b10e36826876dedcc3345300af80a3d9273d26b4046fddcd916d929cddfe60ce8e959738def5706f458df3af47ffa95e2e78c449b8cbcaba14d1edd3a9096b7ad19733ddc36b9c0f255639bfc2fa867548f34a6d54298d606761de1f75728cd5cd0ed6c968fd2e39aa08cb9ae6769286f1ad2341a595db625feef5bdaeddf6c262bdabf3d8a6094b27f52dff6e4f66fb545764a33ad75404fd3c1be713f44ff3fcff23ffdbcfd2bcdfecd0db17f8469b8f66f11cb578df66f1fa867f3c0fe658430ad75e86836e888d2b4816ef977b4283dda3f7a9fea591aca8bbee59222b6a510bbfc76fb8767ea13464a931f21fb17bfec76fb97013e144f69baa15ef6827da332c5ef731c68f99f7edefe9566ff0e08b17fdc8e956aff66b37cd568ff56403d3b7004fc3f6ea3d0fee1f79e332c1fff2611f6ebeb591aca8b63ce1b8bd896f8cf5cb6dbbf0c9315eddf912364ffa4ce9b76f97f283ba5390eeae50960dfa84c67831ecfb2fc4f3f6fff4ab37f6786d83f6ec74ab57f6d2c5f35dabf93a19e9d05f64fe03b5756fbc76d14da3f3cef987fb388d287f97f19f61cf4ff2e28625b66c72ebfddfe1136eca3539a5d2364ffe297dd6eff6ce31394e652a89797837dcb98ffdb408fd759fea79fb77fa5d9bf6b43ec1fb763a5dabf0ccb578df6ef2550cfae1b01ff2f63aef17bee9406cf01e17b22f937e8b18f5ccfd2e0de2b4a737d11db22705e47e8fc079e1f42696e1a21fb27751680cbff43d929cd9ba15ede0ef68dca34037abcd7f23ffdbcfd2bcdfedd1362ff32e67ab8f66f29cb578df6ef6d50cfee05fb27f5adc7b50e1dd9e63f56425c8bb9a6f4788e470be852ca6f759de381b8292e6cdc92e6a2c3bef1348b3d07bff1f460884d6cb0e4d5e5face89fdd7b88602bf01d5cae2c60695fbe6552bd3077ea7aa15e2e87a3ee05ecae234ee91fc662ac980dfe5b47d8b25eb78d6624843fb0bea1dfcf0fba15f28d24e0a7c77c2fa6da0b06f4d3d1182119f45385b99bcb66f03499637976d31c383b27dbd88fe25be712d293b969f7eee428bec94e669683fbe037e08bd0b384eff2bcbfff40bf353b0bc05be95d1e7a77402ce02f041de5d803526de39e44d7e0affae421aae7f097e0aff4603e99ab0eb7786d63a23769e6f09cb87df7668b7c85f08e2959f7f37a58361d665f27da867bf023f25fe3e403fa676878e16838e280d7e874dcaffe0dfb3241cb8ae8ffb11b6ef76529a67426c167e6796e4c6f616fd0409db16d6dee60123c5b502462eb3ae2fcb2cdf25c56fafcf637192f56a1e938b7fcfd7e6a3e17716d1ff59c2e2c60672df205cc270db7c1d9b2f47d7e8ff2c753c0bbf2b4e6d4dbd835f1ad3980534aef657a09d6cc776928fe5dadac9f12118f15984731e93177559896fbc73d9f8b76351b64945f42ff5bd7129d9b1fcf473175964a7347bce1dd0d35ee61a6de562d0e35ccbfff40bf37f84bf9b96c53698cadbf6cd36f45362e23da8fd27ff877f172c0dd7ad7307d2f2ef7591ae093b9eff19f69dafa52c1f7ee72b6f91bf10c8fa1aed0cb32e931950cfa81e49b65379878e16828e28cd12d091c0f73273b6f16fc2817d66c2c1bf958de3df94664988cdd2b2912f80e34d9417fd04a96f3abadadb1c60a438f47fb8ccbabefcd70c90355afec7ef81e2397052b69578d1b3e91e7d1dfe5dd846b86e06dc8b599ce4b8e562869bfb91e8a32d8638ba9e6342db9820ff0eb2ad2e737e5897d717697f05c6f2bad08fa33683af49c2fec68145fc1fee13ce67f2a22eb1bf353f7ed9da6db2f1f14794edf022fa17f0c9db85641f647bc8ff5960919dd21c09edd2d1e0df50b9613f6c9be57ffa85f93f58de02f6366b1befcb5978b703d698780f6a6bc9ff213eb8278eaeb782ffc3fd06d23561d7ef0cf9a9889de76b63f9706c236b91bf10c8f435e8d939865997c97150cfb681ff23dd07e03a6a051d511afc66b7d437d679fb4338b05f4de55fcfd250de34a439a788ff43be008e9370df4172bc818f77d13dae93e07dd2068bccbabe3c00fe0ffd3f17f2cc637192b6d535fe83bece1c2657239391c2052c6e2ce8a41033ee050c37dd2f048c24c30288a3eb0926b4952da56986347c2d33e7876b995f56a4fd8d7d4c36b7b517df493e4682fd0d4a734d11ff87bfdff398bca84bb43702f6afcb261b95cd3c8b6caf29a27f813e6197a4ede76755cfb1c84e69ae8776e946f06ff81cb6feff4ecbfff40bf37fb0bc057cf9accddf5d62e19d05ac31f11e34d64ffe0ff1c1b15ebabe03fc1fde46dbc69fa9fd42ec3cdf42960fdbf6368bfc85a0327d7de2a7cbe466a8677782ff23d54eb53974d40c3aa2340b40475267eef3f6877060bf9acabf9ea5a1bcb8b6f09e22fe0ff9022437fa16e827488d77b9d6c9e0fca36d4d0c9759d79793c0ff1967e23390a785c549ae01275ef46cba277e8d20430bc4b5005e0ae7b038c9f1d0390c37dde3bc1dc93007f048bd0ffc3c001b6f015de451eff40b6bbb709da7407bdd8eef65297870ee5a629fbf909c59b4f5cfc5f85c9b6de5eb019b82a16340927d5d571f09fbba1eb33c66fc460cce3150ba395582d1d67f97ea1bb8ec2e9621b5472d169d355499ce66031e81363f8b6b9271cfea8fc1876d899f6f7b8af12b000ee2978634d7ce1b48fb73830ddb74f43b66b13849bf8378054c06f43b489e591047d71300a3407bd76ef35589379e5f44f5adde21471ad23c53c4379f60d1015da34f68b3532339ae4732a30f22e51f529da0be7a8b4517d27e4a8ccf6dc7f673b443c76948f3df22e36dc5da621c87c5fead44fd111ab76dc7b12cd219e1b78da3a6e785eb6c91436758c7495778c6e442a6c78c895fc4b0d0f7fcf833747a211de585faf0ed3886c2c787713e66f7b91f4574cfc7635a99ee70dd288e59cd8a5fb650fb42fcd00fc236b49adacea660a84f80b2d5997cfb9afbb9b27acda2cf920eec6d29fa2cb3e60d60a6321f150c2e0f6c835bd9b329cfbe10dfca9eed1ad38f7f9d4dfba06f188e6672b45930ce2e8231fe7ad59e95917df01c2f954fb345764a331ffcd585e61adfaf71a0c75ecbfff42b75ec46609e378b63f17c0d35f2ce01d698780f9ae3a77907e283eb7fe9ba07de35be5e81741db656db966f16cbd704699658e42f0432f32ef4eca50cb32e9336a867548f24c787973874d4023aa23438f6dfccf251faf99086caa99ea5a1bc69485328625be2f7dbedf68fcf73a0fd5b3f42f64faacfc2eddf6c8bec94e620a89787807de37e88feff04cbfff4f3f6af34fb777c88fde376ac54fbd7c2f255a3fd3b1cead90960ffc609615ae2d011cebbdaf654b9e647d1fed1fb14363f4a69b614b12df1fbbf76fb47d86c67f86f1f21fb27d5a7e2f66f9c45764af302a897e7807de373a7faffcb2dffd3cfdbbfd2ecdf6521f68fdbb152ed5f33cb578df6ef7ca867978f80ffc76d14da3f3c7b2563ae293d9e859e015d4acdb9f0b1b14516dcfcbc3bdb7c12f5c5d16e934cf52c0d8e15509a5786d8c4064b5e5dae7b4fecbfb6ad61c0f9751c3b963a23dfb5ee85f8e17c876dfc1fe7696c736e2339fe4f32d8d6f5e2fad8f98e67cd823454afea83e263e16f2ad24ec6fe4e98f5b1b8f7a3100c5d1f8cebd16f2f32fec9d70cdbc69ef99a59a1b1c5769b6cb6f92c4a736711fd4b8cfd4b8eab62f9e9e7b65864a734ef86f6e36ef043a8dcd00e3d64f99f7e617e0a96b7c0587ed63696bfd8c21bcff48a89f7a0b598e4a7f07da8388ff020f829bc2d255de3fe446a93103bcf379fe5b3b5c1287f2190f18be9d98b19665d26ef857af610f82952edd422878e70fe839f1b20b4d6c1dafed8e63578ff8fcf4763ffef9321360bd705e1da53db1a44a9fd28ae7538b83f9d7f5ba8c12233ae45d1efc378133f0ef264589c96ab59482ee245cfa67be287eb0832109701bc14b6b0b86a5bd72bf93e34333c36de02bac80f778c11d75f49add78dfa4d1489715e2139b368ebe35e1fcb6deb6ca6ab4aaf4174f591f07b21b58619cf78c5f50294aea54a30dafac2527eb6cb866119926dcf5874d650653a6b063c02ed67df5ad3898c976edfff02fe60267ebef914e357001cc40fc76876ce1f48fbacc186ed23b6e113599c641b4ebc022603b6e119733d11e2e81ad79a0ab41d799bdf47bcc3f6817139700ea1ce9445b1b5a6a803ba46ffca66a746728c8c64c6f65ccad7ca986751bf3763d185749b1fe373f3d87e8e76e818d72b4f0ca943a5b4c538a65989fd490263a0791c17229d117edb98e4b4223a5be0d019d671beafa12e18ba1f2363e2b90da0b5a6bbcb10d28f85fb4250997785f8619b8eed4135b5034dc1d0f60d65ab0b06cf53a0af24a0d72cb6bfe9c0de2e60fbbb70fe0066aa3bb46e32c3f2619bc3cf43c27593b3d9b32b36d69ecd0f5a373a9ac9619bdb5f520463fcf52a9f95917df099727ccd2cca4e69dac1f7ea34d7f87e8d073daeb7fc4fbf52fbf4b19f3d92edafeffc7c8e4516de386e1c13ef41e3b1341e4d7c70fd025daf83778daf61275d13763c9f30ec1b1a13593e3c8b60a145fe42203bf6cbd7ddeb32e9817a46f54872dc70a1434719d011a56901ddf235f2941ed78d5339f1efeae1ba144a734811db12bf0f6ab77f617bfd368e90fd93f2bfb9fd6bb6c84e698e827a790cd8b78cf97f22e871bbe57ffa79fb579afddb1662ffb81d2bd5fe6558be6ab47fc7433ddb0ef66fbc10a6850e1de17c1c3f2f4ec7d9ce43a1ff71be476acd9f6bdd08e2a638d21dda64cac7f728a13fced70d51de34a47961884d6cb0e4d5e5baa4a9ffda36b783f30e380e3052e7a1e0d8956d2c07c7dc6ce3a7233996633b6b86ae71ddd05cc7b326421abe0f3b6c5ce36545dac9d8c794cdba216aabf83802ce53539a6b8a8c23cc87fb42601f47e06b8924c795b86c13191e94ed3545f42f318e2359d7b1fcf4733316d929cdf5d07edc087e08bd0b38de7ea7e57ffa85f92958de02eb14b2d856f23dc0c81bfd8998780f6aa7c94fe1df0cc2bddf77809fc2d7dbec1e3731a1ed2c4a5bbe392c5f13a4596091bf10c8fa047cffb52e939ba19edd097e8ad4d8da02878e70fc8fd2e0d8bd54bf31c3f0f0f9b3b0f914ca3be85cbd22f329e40bd8d617a39f2060db42dbdbf98071f7fe62c0c865c679c5469017c769c7b138493f9278d1b3f9de11dbda263c0f10fd9f0c8babb6f54e42f3b8a16706646475911f6e1f1be7d2056c55c770f70a61bf5b629c4348ce41fb59e35e37c46d4d33d355a5d793b8fa48c4cf63f6985d985d7bac285da64a30dac61ca47c39575b8165486de8388bce2a7106ce7074360bf0489c6fa3e59dc278693feae7e0770becabee48317e05c041fcd290e6f70b07d2feda606b843ce82b35b338c9717e6c8f0b81fd9c649207fd27bac6f559123e432a18ba0e9cdb359d86ec597de09eafa0347f2d717d16ea80ae3326c471810ce840ea9d2be5ac6892196d7b46080fd5091a5fe063de68a7b08e67e09a304a8ddf122f7a7686e907db1f1c97973a87c1f5ae79de03752446de79ec2fd32facbf3105f0640474816d55297832b278b24d80077949bd8fae7ae0cf97f7e7cb0fe7671bf3b4ed11f067b5270fb33f5f7e281e97ddb5ad5968b1e86c5c95e90cfb477c2c55f7af3a160ce015e8370dfb1cf80f40dfafc760c37502d88fb7f94699f86508ad17c40ffb3db6be1ffa4b027dfb769b0f4fbcf1dc123e97c4e5c0b9a47546ffb6be9fad0fa5cb642e8b937c57f97a0bdbf92e7c7d85a4cf46e54ffdbc168b2e047c92ac94efa5e518ce5a908d21f5059f4538a9fed8d6da60fb28517f84ecb3f56c1a6e9ff16c9a638ae86ca1436758c74957b8f65040b6bcd07ad2765cbb403ae367d0e39ace938be8ccb57e02bf8bcad722488e47b9ec426b05790721bc05e6533b6c659a31f7c40fcbf48c6196299ff7405b1fb62686d2e35e7dc2c3d7d7e37a624a736e084e1c23c07a25305e135aafa6001ef28d70ce838fbd4bfa4d38865308868ea1a0ce5a008ff4f838ad815bccf423a38bdcd6e18eaf65008f44fd911a27437b3236b6e776f6addde4ebde6de3e894063108b459a163e68b2cbce3d34557a7e6dd56822eda2c78a4f624641cba68b3f08e5117d6334b6dba5862c123755e5ac6a18b2516de31eaa2cfbe2d2d41174b2d7804ce170ed5057e737a3898175501e6b1ec3a1ededd7d362e5b822eb2163c52dfc6ce387491b5f08e4f17fd7b0a7325e82267c123755e73c6a18bb033a6c33057e28ce94c11cc63d9753cbcbbfaf691e44bd045de82275f615d10bfe1625e528398b35580792cbb8e8777d776cdbbbd045db45bf0b4575817ed16de31ea6287e6dd51822e3a2c783a2aac8b0e0bef18dbd53ebfa8b3045d745af074565817c46fb898b3358879690d625e548398db6a10f3921ac45c8bef6035d48db1ec3a1ede5d5b35efae1274d165c1d355615d10bf2460ced620e6253588b9ad063177d420e66ad0b39ecf6831d793164ae2c96d1bee5e49c2d000d719d05977ec18fbd7eb12af6ee0d5133faf9cadbed07d8f28efdc56fddc65f1cbd437feb6dc3c8be66f9759645a61ae5331eb73393c37057c283e0dd78d0b07d2523ad207bdb7845dcf13f79a6bc4cef375b17c4d90a6d7227f218857fe650ccf32865997491dbce71275ab947aade7c133e67aa609b58e695e15f76a75b338497bd9cd70d37d1760247b89f641c01685ced5133fdc03b4b84a75d60471280f5dd7997cfc1b7752363e150cfd666737e38d6b4ce6809dc898b851c1e0f2c07d725decd99407cf9ded62cf769d1594895dfe8e2c621ccde4c85830ce2f8231fe7ad591955c5bd20332eae78eb7c84e69da605df152738defd724d0e32acbfff42bc5cf198936197957439bbc32a44d265d0fb74dee66f9aab14dce433d5b05edb3d4194bbd0e1db5808e280d9ea9cdcf2fa4f4b82e8ecaa99ea5c1f30b29cdfe456c4bfc6baeedf66f3c9315eddf412364ffa4d69b73fbb7bb9d83784a7338d4cb4d60dfb81fa2ff3fd5f23ffdbcfd2bcdfe9d1262ffb81d2bd5feb5b07cd568ff8e847a762ad8bf4942987a1d3a1a0f3aa234f38301ddf275c1941eed1f95533d4b833e27a5d951c4b6cc8f5d7ebbfd5bcc6445fbf78211b27ff1cb6eb77f932cb2539af3a15ebe10ec1b95690be8f14acbfff4f3f6af34fbf7d210fbc7ed58a9f66f3ccb578df66f17d4b32bc1fe498d2bf43a7484df0aa6340b41b77c5f11a50ff3fff83797d1ff7b6511dbd212bbfc76fbc7bfb180f6efd52364ffe297dd6effba2db2539a3740bdbc01ec1b95299e2b7e87e57ffa79fb579afd7b7b88fde376ac54fbb798e5ab46fb7713d4b33b46c0ffe3360aed1f9eb94667c2dac65af1bc58a9ef25b8c65ad16fe563536893291f8d45a2dd2699f87707282f8e89be2fc4263658f2ea72bdbab1ff1af7e5e31ef0661657cdfbf2f13c81561627b45fbbe4ef0e64ccb5edbb03b4272c15b8bf3b80fbfe87f3dd81478bb49302fbb1fbd66892df5eca5ef34f8760c46711ce6626afebbb03cdf1cb66dd474f65d36c91ed0b15ef4b66db8564b77e77a0c5223ba57912da8faf801f42e5866789fcd0f23ffdc2fc142cefa47f77e007e0a7b8f6580ff7bb037359be6afceec0d7a19efd10fc948c10a6050e1de177866cdf1d90ea3bf0f6879fc9a3d350f9d7b3349417cfedf94588cdc273a6486e3c8717fd04a9b122d739bcf301233f53a0c122339e99643b1b1ffd9f0cc825558e2eff87f8153b9316d767d8ce451ec9ef45910cb6ef45d1b9b3a960e879af94067d247eee11e787e71efda748fb1bfb591de6bb4bf46e509bc1cf664b431a32e02eff87fb84dc27475de2d948023e40874d362a9b668b6cf521b209f9e41d92fe0f969f7eee388becbbcfdf5b34a0a746738d6772e239dafb5afea75f98ff83e52d606f079d3949e53ddfc21bc72363e23da8ad25ff87f8e0f94b74bdcfa281b4dc6f205d1376fce679d8582a3fc3caf6ed4321df3367ebfbcc679875994c827a46f548b29d9ae7d0119e55436970dd98d439cbbcfde167e2e83454fef52c0dae2da33473426c169e9d8de324b66fdb488d37b8be95301730721fb0c122337e2f40bf0f534d3c9e5b3e91c5498ea34d6472f1ef88dbbe0dd5180cfe4e1485e358dcd8a0babe1725f93ef0f54036de02ba18f6b9e3f88d0c81f63a8fef6529789a014f267e3c39213907cd4bc57dde34b7ad7cacabd2df8971f59170ad6fad61c6b3dd08abeb4cdc91c468eb0b4bf9d92e1b866548b67da245670d55a6b3f18047a0fdecfb1ed034c64bb7efc72e12e59bc7769bfa071c471ad23c0dbeea89e6ba11f2601b3e9ec549b6e1aefa866db8cd1fa16bfc1e50267e8c799bdfc7d7c8639dac77c881e75fee28e2e74eb0e880ae8b9ddd3d926364dc5648fa5af83df002dca32ea4dbfc189f9bc7f673b443c73856bcb3c8d855b1b618c7342bf1dd4b8131d03c8e0bf1bd3bb631c9cb8ae8acd8783e8ef751daba60e837f332269edb80e74c3ca5433b5289fe1d7f57709d04d97a6c0faaa91d6882389487aeeb4cbe7d41a7819c5efb7c74d255d8de294af33a1823a3ba43fbe6f87799b1cda167531edc37378b3dbb6263ed66dd20ff1e21c9d16ac17843118cf1d7abfe7583f1cb3ef8fb787cdd34ca4e696e01dfeb56186fa6fa3215f4f81ecbfff42bb54f2ff16d251c13e567f2236f1c378e89f7a0f1581a8fe6df00c2b51fef86778dcf1993aef1ec7f1abf0bfb0e11dfdb8073cd732df21702d9b15ffe3d045d26b7433d7b0ff43fa609619aebd0d144d011a5c13161befe8ed2b7401a2aa77a9606d7df519a0f14b12df1fba076fb3789c98af6effe11b27f52fe37b77fd32cb2539a87a05e3e02f68dfb21faffc72dffd3cfdbbfd2ecdf1742ec1fb763a5dabf892c5f35dabf8f433d7b1cecdf54214c731d3a9a043ae26beef05b0d387ec6d75b48aef776ad1b41dc1447ba439b4cf9c81745bb4d32f175d39417c7a4be1962131b2c7975b91e6f0647705c08c744f83889e47a34d77c20f1c33111db580e8eb935b3b8911ecbc9986b1c2fa06b5c37d4e278d63448c3d7c0858d6bfca2483b19fb98b25937446d151f47c0796a4af39b22e3087c2d956d1c817480ebf6a4c695b86cd3181e94ed9922fa9718c791aceb587efab9e32db2539abf41fbf12cf82119f33f8eb7d72f1efa3ffdc2fc14e9efd8615bc9f700d8d688c6eda7e01e1af45b70fdfa6e7c8b07d2523ad207e93a6caf812d5f86e56b8234ad16f90b81ac4f309761d665f22fa867548f24c7d65a1d3a9a063aa23438763f51080f1feb231c38aec7e7536c735bbbe7248d0e5df329fcdc49d7dcc9487d871ce72bd137089b57d4efc374138f63b653589ca41fe9fa2e19f1b3ad6d6a0c06af73a290af25aab6f54e92ef031f0fb1f19698431e6e1f1be7d2a5d631451df39418e7109273d0796e71af1be2b6c6368f52c9f524ae3e12f1ab45ccb8f719e7c828ddc42ac168eb0b4bf9182e1b866548b67d8a45670d55a6b3498047a0fdec5b373483f1d2edfb9ac5a27cf3d86e53ff80e348439a4f2d1e48bbbfb96e843cd8864f6271926db8abbe611b6ef347e81ad70d09b41d799b9fcbe707b04ed63be4c039844d45fcdc09161df03919979dca04b1eba0e431326e2b247d2ddccf5608868ec556a2cd8ff1b9796c3f473b748c7da59343ea50296d318ebb625f3113bf6cb94aaeb522fcb671a16d457436dba1b30ce88c744569eb82a1ebe532269edb005a3744e92641fa4af4eff8bb82f30464ebb13da8a676a009e2501ebaae0b06cf53a0af24d1eea740577ced08ce9d529a4b608c8cea0ead1bb2edb71acf9e4d7970ddd078f6ec8a8db59b79731ccf4039665b305e510463fcf5aa7fde5c6aed3ada17fddca916d929cd55e07b5d0de3cda48be9a0c71b2cffd3afd43ebdc05aa92c8e895279b75a78e3b8714cbc078dc7d27834f1c1337be8fa7a78d7f87c33e91acf11a2f13bc4cef3f17561b847738e45fe42203bf6dbca30eb32b906ead90dd0ff982184698e4347b88f95d2e098309f7fa6f4194843e5c4f79be2fc33a5b9b5886d89df07b5dbbfa94c56b47f6f1921fb27e57f73fb37c3223ba5b913eae53bc0be713f44ff7fbfe57ffa79fb579afdbb2fc4fe713b56aafd9bc2f255a3fd7b37d4b3fbc1fe4d17c234c7a1a3a9a0234a83635334a783e3679407e77ba4ec36b7bf743f0330521ce90e6d32e5e36bf4d11fe7eb86282f8e497d22c4263658f2ea725d623a23382e8463227c9c4472ed64b17de23826621bcbc13137dbf869460877296339b63df8748deb86328e67cd80347c0e386c5ce3ab45dac9d8c794cdba216aabf838423360a434df28328ed002f785c03e8ec0d71249ee2fe5b251d98cb7c8f6dd22fa9718c7911c57c0f22b04f671594af323683f7e6c591784e3edcf445c3784e52db04e218b6d253f3b0b79a33f1113ef41ed34f929c407f7d3d0f51fc14fe1eb6d48d7616774d9f265583edbda5d94bf10c8fa04fcac3f5d263f837af60cf829953adf2763aeb1bda73438763f45080f1feb231c38aec7e7536c735b94e61f45e653f8be3cd7dc89806d0b6d6f5b00a36d5f78d8bca27e1fc83fda03f24c677192fb86b83fc8d731e1fce274889b0e78299ccae224eb9fcbffc5b54d24c35488a36bf47fa6389ed50869f8b723383ffc7644535b7fe86a7f631fcb36fe0f3f8382f7cd71bdffe4108cf82cc2399dc98bbac4f74fa09f663d5f83ca66ba45b6e945f42f309e9297eca362f9e9e7ceb0c84e6966b60de86996b9c671987d418f4b2cffd32fccff11ee9759f7f38db3f0ce00d698780fb2f5e4ff101fdc074ed76d6d0369291de983cf6361bf11b1f37c7c2e09cfdb1b6f91bf10c42bbfeb2c37e2a7cba405ea19d523c9766abc43478da023be87bb92e32f8403fbcc54fef52c0d8e7f539aae109ba565235f00c79bb8ef203956bc6f30585ebac7fdc514876ba0b9ccbabefcda54287c1fea20cf1816a7e5aa17928b78d1b3e99ef8e138ca18881b037829b4ad9b965a0fe05a378debab4806db3991e8ffb8f680a3ffb307e8c5c62f0d690e2dd2feee01bc0ae63a5bcecff83f93cdb3f81ef03d0023a5d954c4ff990cf78560a0bc51bfbb7d29906d4cdcb265b35d36d9a86cc658643ba688fe270b6014923d87758f9f378db2539a13a15d3a19fc1b3e66a4ff3fc7f23ffdc2fc1f2c6f81fdcc7dfecf9e80b3007c9037eeeb8c89770e7993ff437c283e0dd76783ff43e9481fbc3dc6f17ec4cef34d62f96cf32d92be86ab6f49fc74999c06f5ec1cf07fa4daa9290e1da1ff635b3f297de61b3d9b70d8d63f71ffc736b7beab88ff43be00ae67e3be83906d0b9d279a0c18515ec2c865d6f56532f83f5c6f0dc180ff80ebdfa4c6d689173d9bee71ae6b0260a3b8069087feab67711a779d10ee7a869beeeb00232f0ff4894699300579f8b3c6401a7e9602e787e30fd7557afc21b7752bfa71d46610367cdf28cdeb8af83fdc276c60f2a22e717f46ece56d7c3b2e1bef23a06c6f1c81f137c9ba8ee5a79f3bc1223ba5b915daa5dbc0bfc1f799febfc7f23ffdc2fc1f2c6f017b9bc5f68eca7bb285379e871213ef216badd11fc0b15ebabe1bfc1fd7980061d7f7e4a7869de5626b5b28cd1e16f90b41bcf2f3becf64865997c95ba19edd03fe4f8310a63d1c3a1a033ac23e2ae16914c23381e1c1b101fdc336aa9ea5a1bc6948735f11ff877c015c77427985d7c987b6b7b8ff00fd1e0ab9ccbabe3c38b6ff1ac751c6429e712c4ed2ff718d75a2bde47ac63121f47fb84f3416e42ec48cdbe5b74d008c7c8d12fa6de8ff4c703cab0ed250bdae77f04b439a2f14697f637f278dffd3649e456d06ea8230529a278af83f4d705f0806ca1b9f493a6802d9a4f62f72d9a86cc65964fb7a11fd37096094ec6b62f9e9e7d65b64a7344f43bbf41df06fa8dcc6801e7f65f99f7e61fe0f96b7d4bea43d006721186c6789f764c01a13ef416d2df93fc407c7e1e8fa97e0ff441933b5e59bc0f235419a8916f90b41bcf2bbf6b1e118ecf7a19efd0afc9f4a9d93c2fb00b84606e71fa4c664b93f4038b0cf4c38ea591aca9b8634cf14f17fc817c0b10894934201db16dade3641c8c74e1a2c32ebfa7298312ee8ffa42d79d22097946d255ef46cdeaea0ff837dff3a9087708f677192fd01d7781cfa3a365f8eaed1ff69703c6b2ca4a17a57efe097c6344bfa4357fb1bbb4f68fc1fecdb1782701f6d7c08467c16e1ac63f2a22e1b4136a931102e1b954d9d45b64945f42fd12794941dcb4f3fd736f64869f65c32a0a7bdcc35da4af47fe65afea75f98ff83e52db0de206b1bef9b68e18d7e4a4cbc07b5ffe4ff101f9cebdebd076bc9405a3e4641ba46ecd45e20769eaf81e5c3b18d268bfc8540d6d798c830eb329901f58cea91643bd5e4d0d158d00ba541fb2d351fc7db1fc241fc706d493d4b83fb1628cd92109bd5140cf60f28e4be83e478976b9d0cce3f521cce657199757d99608c0b5f6ba37fdceea05d8df37c36fd8c5180897e685347317c63015f8c587228efa860a80ef6b0e8e7ff0144125ccd49130a00>, "metadataHash": Fr<0x1eef7f2eaafa09e24b0475a918bd7388c4dec305145849f5f84d1b822202b944>, - "selector": Selector<0x038cda46>, + "selector": Selector<0xbc7fd3b5>, "vkHash": Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, }, - "privateFunctionTreeLeafIndex": 0, + "privateFunctionTreeLeafIndex": 4, "privateFunctionTreeSiblingPath": [ - Fr<0x0583aed5d42e43d977274df1e4536a029a27c2f443bd96eef4162f7f5d7d0b76>, - Fr<0x159e0bdd29fcc7efb79fdb56480e4cac622d6d71755adb98c7c614af8d76a645>, - Fr<0x19e9d55f327e3c96dd42e60a81a783b0bb968d074ee638d542d17f8a3a0b6990>, + Fr<0x1670e777523a2ee4162c41219fab053a163f357b8a5d70e9449bb9c637122622>, + Fr<0x21dbfd1d029bf447152fcf89e355c334610d1632436ba170f738107266a71550>, + Fr<0x2283335ab6bd13d241c77c519fc01f9ac88ef303ac6f43dd6ca5b38f10923aa2>, Fr<0x06e62084ee7b602fe9abc15632dda3269f56fb0c6e12519a2eb2ec897091919d>, Fr<0x03c9e2e67178ac638746f068907e6677b4cc7a9592ef234ab6ab518f17efffa0>, ], - "unconstrainedFunctionsArtifactTreeRoot": Fr<0x0c3d79f3431c5bef8abf01dcf84cb2c64d136171adca23e40d20ed1c64951817>, + "unconstrainedFunctionsArtifactTreeRoot": Fr<0x26b29a23ef822408fa34abc1c8cefbbfb50efb3706f0583c1f7ade18de41a0b2>, } `; diff --git a/yarn-project/circuits.js/src/contract/events/__snapshots__/unconstrained_function_broadcasted_event.test.ts.snap b/yarn-project/circuits.js/src/contract/events/__snapshots__/unconstrained_function_broadcasted_event.test.ts.snap index 364f8924125..08b8196e9fc 100644 --- a/yarn-project/circuits.js/src/contract/events/__snapshots__/unconstrained_function_broadcasted_event.test.ts.snap +++ b/yarn-project/circuits.js/src/contract/events/__snapshots__/unconstrained_function_broadcasted_event.test.ts.snap @@ -4,19 +4,19 @@ exports[`UnconstrainedFunctionBroadcastedEvent parses an event as emitted by the UnconstrainedFunctionBroadcastedEvent { "artifactFunctionTreeLeafIndex": 1, "artifactFunctionTreeSiblingPath": [ - Fr<0x14d546778272b5884f661b57d610768a394485f812373af30601825169a4a210>, - Fr<0x2e833be78dd8da68d42339f2ac9846870012b4a95faa9204b3c51927e3fa7905>, + Fr<0x28914d31533b25309c8e37f0eb04595c4ebcdb749c74ed4d344e19a00bccb0e6>, + Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, ], - "artifactMetadataHash": Fr<0x229d43c7daac528d0aefd72bee59385d7e9ff06ea477b673389e1f65168cba9f>, - "contractClassId": Fr<0x26222cd450fe6beecf6cbe6495e118412940ee0da5744629dabcaf010a2a4e38>, - "privateFunctionsArtifactTreeRoot": Fr<0x27a5a9e364417f0f1526bcd44836d603e8b7005b517c6861e512c01d80582254>, + "artifactMetadataHash": Fr<0x2ee0a6721704053281d575f82984fad809a7cf5b1f2d47971e1429fbe2eb1578>, + "contractClassId": Fr<0x06e2af08f53b9a05db4870972b4a9a663a5ffb54e962020d4efe3f1b9a21343f>, + "privateFunctionsArtifactTreeRoot": Fr<0x2b8dfed76d4d8bb88895927b771bba06907cefe8908604a485d34d39d88c66f5>, "unconstrainedFunction": BroadcastedUnconstrainedFunction { - "bytecode": Buffer<0x1f8b08000000000000ffed9d079c1445fafe671758c2b0b3e41c1658605960d9444e4b306226a98082028aa22841444444444c803947cc395d3e2f79775ece5ece39e79cbcff6f86f79187b26687d99bda7bf05ff3f9c0d67ca7baeb5b6f7755cfdbd3d35394d8f728b27fe9472b2af303acd1fed6fc778fda02aeaba6c8f1ec36715fb91df1c642b5d7505357925e49eb03e38247f2fffe15e389d569fb7fff4ae8f522e3a8d79918d6d76effe28573ffbfb8a7db6fe538bb7d68a4726b8fcfeb85f3a949910fb75512a8ef6d1207df7738a46839766c1bc8b1240fc7b6e458e2716c17c8b16d1e8eed3c3ee589c2ee436d3d6d7508d4f7f68983ef7b078f4f5181fbdeded356c7407d4f260ebeef7048d172ec581ac8b1631e8ea5e4d891dcf03715c8b1340fc714fdc5723cc6cb0239a6f2702c23c714b9e16fa7408e6579387622472cc771ec5c78c7ba24b57b308e9dc9a74b209fce79f874219fae817cbae4e1d3957cba15de27b34f75cdc3070e295a8ef7a9ee811cbbe5e1d89d1cbb911bfef608e4d83d0fc71ee488e5388e3d0339f6c8c3b12739f62037fced15c8b1671e8ebdc811cb711c7b0772ec9587636f72ec456ef8db279063ef3c1cfb902396e338f60de4d8270fc7bee4d887dcf0b75f20c7be7938f623472cc771ec1fc8b15f1e8efdc9b19fc7714020c7fe79380e20c7fe1ec781811c07e4e138901c07781ccb03390eccc3b19c1c077a1c0705722ccfc3711039967b1c0707721c9487e360721ce4711c12c871701e8e43c871b0c7b12290e3903c1c2bc87188c7716820c78a3c1c87926385c7715820c7a179380e23c7a11ec7e1811c87e5e1389c1c87791c2b03390ecfc3b1921c87931bfe8e08e4589987e30872acf4385605721c91876315396239ded6230bef98c9a5abf2701c493ea30aef9389d9c83c7c4685f5c99c2b1de969abbaf06d65b6c5e8c4c1f7bd9a7cc614de27b32daaf3f081438a96e398d514de3113b3317938d6904f6de17d3231abc9c3a7966256e389595de11d3331abcdc3b18e7cea0bef9389595d1e3ef514b33a4fcc1a0aef9889597d1e8e0de433b6f03e999835e4e1339662d6e089d9b8c23b666236360fc771e433bef03e99988dcbc3673cc56c9c2766130aef9889d9f83c1c2790cfc440319b9087cf448ad9044fcc2615de3113b38979384e229fc985f7c9c46c521e3e932966933c319b5278c74ccc26e7e138857ca616de2713b32979f84ca5984df1c46c5ae11d33319b9a87e334f2995e789f4ccca6e5e1339d6236cd13b3c6408ed3f3706c24472cc739d08c408e8d7938ce20c7468fe3cc408e33f2709c498e33c80d7f6705729c9987e32c72c4721cc7d98577cc8ce1597938ce269fc302f9cccec3e730f2393c90cf6179f81c4e3e4714de27b34f1d9e870f1c52b41cef534706723c220fc723c9f10872c3dfa302391e9987e351e488e5388e4707723c2a0fc7a3c9f12872c3df39811c8fcec3710e3962398ee331811ce7e4e1780c39ce2137fc3d3690e33179381e4b8e588ee3785c20c763f3703c8e1c8f2537fc3d3e90e37179381e4f8e588ee3784220c7e3f3703c811c8ff7389e18c8f1843c1c4f24c7133c8e2705723c310fc793c8f1448fe3dc408e27e5e138971c4ff238ce0be438370fc779e438d7e3383f90e3bc3c1ce793e33c8fe382408ef3f3705c408ef33d8e0b03392ec8c37121392ef0389e1cc871611e8e2793e3428fe329811c4fcec3f114723c99dcf0f7d4408ea7e4e1782a396239feaec1a2408ea7e6e1b8881c4ff5382e0ee4b8280fc7c5e4b888dcf0774920c7c579382e21472cc763e6b4408e4bf2703c8d1c97901bfe9e1ec8f1b43c1c4f27472cc7715c5a78c7cc3989d3f3705c4a3ecb02f92ccdc36719f99c11c867591e3e6790cf9985f7c9ec5367e4e10387142dc7fbd4f2408e67e6e1b89c1ccf2437fc5d11c871791e8e2bc811cb711c5706725c9187e34a725c416ef87b5620c79579389e458e588ee3787620c7b3f2703c9b1ccf2237fc5d15c8f1ec3c1c57912396e3389e13c871551e8ee790e32a72c3df7303399e9387e3b9e488e5388eab03399e9b87e36a723cd7e3785e20c7d579389e478eab3d8ee707723c2f0fc7f3c9f13c8fe39a408ee7e7e1b8861ccff7385e10c8714d1e8e1790e31a8fe385811c2fc8c3f14272bcc0e3b83690e3857938ae25c70b3d8eeb0239aecdc3711d39ae2537fc5d1fc8715d1e8eebc9719dc7714320c7f579386e20c7f51ec78b02396ec8c3f12272c472bc3f6e2cbc6326bfba280fc78de47371e17d3231db9887cfc514332cc7d7fd6c2abc63266617e7e1b8897c2e29bc4f26669bf2f0b98462b6c913b3cd8577ccc4ec923c1c3793cfa585f7c9c46c731e3e9752cc367b62b6a5f08e99985d9a87e316f2b9acf03e99986dc9c3e7328ad9164fccb616de3113b3cbf270dc4a3e9717de2713b3ad79f85c9ed81fb3ad9e986d2bbc63266697e7e1b88d7cae28bc4f2666dbf2f0b98262b6cd13b3ed8577ccc4ec8a3c1cb793cf9585f7c9c46c7b1e3e5752ccb67b62b6a3f08e99985d9987e30ef2b9aaf03e9998edc8c3e72a8ad90e4fcc7616de3113b3abf270dc493e5717de2713b39d79f85c4d31dbe989d935811cafcec3f11a72c472fcbefbda408ed7e4e1782d395e436ef87b5d20c76bf370bc8e1cb11cc7f1fac23b66c6c77579385e4f3ebb02f95c9f87cf2ef2d91dc867571e3ebbc9674fe17d32fbd4ee3c7ce090a2e5789fba2190e39e3c1c6f20c73de486bf370672bc210fc71bc911cb711c6f0ae478631e8e3791e38de486bf370772bc290fc79bc911cb711c6f09e478731e8eb790e3cde486bfb70672bc250fc75bc911cb711c6f0be4786b1e8eb791e3ade486bfb70772bc2d0fc7dbc911cb711cef08e4787b1e8e7790e3ed1ec73b0339de9187e39de47887c7f1ae408e77e6e1781739dee971bc3b90e35d7938de4d8e77791cef09e478771e8ef790e3dd1ec77b0339de9387e3bde488e5f8dac8fb0239de9b87e37de488e5388ef70772bc2f0fc7fbc9f13e8fe303811cefcfc3f10172bcdfe3f86020c707f2707c901c1ff038ee0de4f8601e8e7bc9f1418fe3c38577cce4577bf3707c987c1e2abc4f6da07ed6a4d7fb88adab80bf77519b8ed5a34eacf63ab14a519d47287e8f06885f11b58b75e339dacbd7b958c03950db75e9fbc6b7a7fe737b09c7eb31fbdb86786b8ae9e3c48aa87e07e2a873ae05b593b5f54480be25c921419efc68a4f213d4f7c70bef531ba89f99df0b7ad2e9d3634e9f525487e7d42703f4b388dac5baf1fc49da0e879a73da07d7fac33549f54e1771047b9c7c9e2abc4f5dd2f1493f9a1a5f4f058e4fa07e66c6d7d3097fdc9fa2b8a30eefab4f07e86711b58b75e3f9d3b41d0e35e7b4cf522bc33549f5968a38823d493ecf14dea72ee9f8a41f4d8daf6702c727503f33e3ebd9843feecf50dc5187f7d56703f4b388dac5baf1fc59da0e879a73da679995e19aa47acb441cc19e269fe70aefd390747cd28fa6c6d77381e313a89f99f1f57cc21ff7e728eea8c3fbeaf301fa5944ed62dd78fe3c6d87e81c9d7dce691f5cf30cd724d5bb48c411ec59f279a1e03e0d3549c727fd686a1e7b21707cc2f473df3cf662c21ff71728eea8c3fbea8b01fa5944ed62dd78fe226d877c9cdb1d82ce31ce31ced99c639c639cb339c738c73867738e718e71cee61ce31ce39ccd39c639c6399b738c738c7336e718e718e76cce31ce31ced99c639c639cb339c738c73867738e718e71cee61ce31ce39ccd39c639c6399b738c738c7336e718e718e76cce31ce31ced99c639c639cb339c738c73867738e718e71cee61ce3dc3ce7b40fee5b0dd724d5bb58c411ec79f279a9f03e0d49c727fd28729e3752f9a5c0f109d4cfcc75ef6f4bf8e3fe12c51d75787cbd2d403f8ba85dac1bcfdf46db211fe77687a0738c73f39cd33eb8973c5c9354ef121147303e06bcbdf03e0d49c727fd686a1e7b7be0f804ea67661e7b47c21ff7b753dc5187c7d73b02f4b388dac5baf1fc1db41da27374f639a77df0fb0e704d52bd4b451cc1f818f0ce82fbd4d5241d9ff4a3a979ec9d81e313a69ffbe6b17725fc717f27c51d75785f7d57807e1651bb58379ebf8bb6433eceed0e41e718e718e76cce31ce31ced99c639c639cb339c738c73867738e718e71cee61ce31ce39ccd39c639c6399b738c738c7336e718e718e76cce31ceffffc439ed83df48866b92ea5d26e208f60ef27977c17dea6b928e4ffad1d4e70eef0e1c9f30fddcf7b9c37b12feb8bf9be28e3a3cbede13a09f45d42ed68de7efa1edf056776e77083ac77da3659ce3be119db339c77d233a67738efb4674cee61cf78de89ccd39ee1bd1399b73dc37a27336e7b86f44e76cce71df88ced99ce3be119db339c77d233a67738efb4674cee61cf78de89ccd39ee1bd1399b73dc37a2733667857d23ed73b995e19aa47a978b3882f1354fef2dbc4f43d2f1493f9aba6ee7bd81e313a89f99eb765e4ef8e3fe5e8a3beaf0f87a39403f8ba85dac1bcf5fa6ed109da3b3cf39ed738595e19aa47a57883882f131e07d85f769483a3ee94753f3d8fb02c727503f33f3d8fb13feb8bf8fe28e3abcafbe3f403f8ba85dac1bcfdf4fdb213a47679f73dae74a2bc33549f5ae1471047b997c3e50789f86a4e3937e34358f7d20707c02f533338f7d30e18ffb0728eea8c3fbea0703f4b388dac5baf1fc83b41d3e189da3b3c739ed739595e19aa47a57893882bd9f7c3e54789fbaa4e3937e34358f7d28707c02f533338fbd92f0c7fd431477d4e17df59500fd2ca276b16e3c7f85b6c3a1e69cf6b9ceca704d52bdeb441cc13e483e1f2ebc4f5dd2f1493f9a1a5f1f0e1c9f40fdcc8caf8f24fc71ff30c51d75785ffd48807e1651bb58379e7f84b6c3a1e69cf6b9deca704d52bdeb451cc15e219f8f16dea72ee9f8a41f4d8daf8f068e4fa07e66c6d7ab097fdc3f4a71471dde575f0dd0cf226a17ebc6f357693b1c6ace699f5d56866b92eaed127104fb08f97cacf03e7549c727fd686a7c7d2c707c02f53333be3e9ef0c7fd631477d4e17df5e301fa5944ed62dd78fe71da0e879a73daa79395e19aa47a9d441cc15e259f4f14dea72ee9f8a41f4d8daf4f048e4fa07e66c6d72713feb87f82e28e3abcaf7e32403f8ba85dac1bcf3f49dbe150734efb74b6325c9354afb38823d8c7c9e75385f7a94b3a3ee94753e3eb5381e313a89f99f1f5e9843fee9fa2b8a30eefab9f0ed0cf226a17ebc6f34fd37638d49cd33e5dac0cd724d5eb22e208f649f2f94ce17d1a928e4ffad1d4f8fa4ce0f804ea67667c7d36e18ffb6728eea8c3fbea6703f4b388dac5baf1fcb3b41da27374f639a77daaac0cd724d5ab127104fb34f97caef03e0d49c727fd686a1efb5ce0f804ea67661efb7cc21ff7cf51dc5187f7d5cf07e86711b58b75e3f9e7693be4e3dcee10748e716e9e73da67b495e19aa47aa3451cc13e4b3e5f28bc4f43d2f1493f9a9ac7be10383e81fa9999c7be98f0c7fd0b1477d4e1f1f5c500fd2ca276b16e3cff226d877c9cdb1d82ce31cecd734efb8cb1325c93546f8c8823181f03be54709f7dbf8fc63ee94753f3d89702c7274c3ff7cd63af25fc71ff12c51d75787cbd16a09f45d42ed68de7afd17688ced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e8aced9cf6a9b5325c9354af56c4118c3fb3f972c17df67deec03ee947539f3b7c39707cc2f473dfe70e5f49f8e3fe658a3beaf0befa9500fd2ca276b16e3cff0a6d87e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748ecedace699f7a2bc33549f5ea451cc15e239faf16dea721e9f8a41f4d7deef0d5c0f109d4cfcce70e5f4bf8e3fe558a3beaf0befab500fd2ca276b16e3cff1a6d87e81c9d7dce699fb156866b92ea8d157104fb0af97cbde03efb3e3f659ff4a3a979eceb81e313a69ffbe6b16f24fc71ff3ac51d75785ffd46807e1651bb58379e7f83b6433eceed0e41e718e718e76cce31ce31ced99c639c639cb339c738c73867738e718e71cee61ce31ce39ccd39c639c6399b738c738c7336e718e718e76cce31ceffffc439ed33deca704d52bdf1228e605f239f6f16dca7be26e9f8a41f4d7deef0cdc0f109d3cf7d9f3b7c2be18ffb3729eea8c3e3eb5b01fa5944ed62dd78fe2dda0e6f75e77687a073dc375ac639ee1bd1399b73dc37a27336e7b86f44e76cce71df88ced99ce3be119db339c77d233a67738efb4674cee61cf78de89ccd39ee1bd1399b73dc37a27336e7b86f44e76cce71df88ced99ce3be119db339c77d233a677356d837d23e13ad0cd724d59b28e208c6d73c7dbbf03e0d49c727fd68eaba9d6f078e4fa07e66aedbf94ec21ff76f53dc5187c7d77702f4b388dac5baf1fc3bb41da27374f639a77d265b19ae49aa3759c4118c8f01df2dbc4f5dd2f1493f9a9ac7be1b383e81fa9999c7be97f0c7fdbb1477d4e17df57b01fa5944ed62dd78fe3dda0edf3bc49cd33e53ad0cd724d59b2ae208f61df2f97ee17dea928e4ffad1d4f8fa7ee0f804ea67667cfd20e18ffbf729eea8c3fbea0f02f4b388dac5baf1fc07b41d0e35e7b4cf2c2bc33549f5668938827d8f7c7e58789fbaa4e3937e3435be7e18383e81fa99195f3f4af8e3fe438a3beaf0befaa300fd2ca276b16e3cff116d8743cd39ed33dbca704d52bdd9228e603f209f1f17dea72ee9f8a41f4d8daf1f078e4fa07e66c6d74f12feb8ff98e28e3abcaffe24403f8ba85dac1bcf7f42dbe150734efb1c6665b826a9de61228e603ce6f058488e01f6c5da83195fecd355cce72e319fdd623e73c47cda88f95c21e6335dcce722319f7a319f73c47c8689f93c28e6739a984f1f319f5bc57c4e12f34989f95c23e673b898cf16319f49623e178af9548bf9ac10f31924e6738f98cf29623eddc57c6e10f33956cca7ad98cf95623e33c47c2e16f3192be6b35acca752cc67a9984f3f319fdbc57ce689f97412f3b94ecce748319fad623e53c47cd689f9d488f99c25e63344cce73e319f45623e3dc57c6e12f3395ecc2729e6739598cf2c319f4bc47cc68bf99c2fe65325e6738698cf00319f3bc57c1688f97411f3d925e673b4984f2b319f6d623ed3c47c3688f9d489f9ac12f3192ae6f38098cf12319fde623eb788f99c28e6532ae673b598cf61623e978af94c14f3b940cc67b498cf72319f72319fbbc57c4e16f3e926e6b347cce718319f12319fed623e8d623e1bc57c1ac47cce15f3192ee6f3b098cfe9623e7dc57c6e13f3992be65326e673ad98cf11623e9789f94c16f3592be63346cc67a598cf60319f7bc57c4e15f3e921e673a398cf71623eedc57c7688f9cc14f3d924e6334ecce73c319f11623ecbc47cfa8bf9dc21e6335fcca7b398cff5623e4789f95c2ee63355cc67bd984fad98cfd9623e15623ef78bf92c16f3e925e673b398cf09623e1dc57c768af9cc16f3d92ce63341cc678d98cf48319f33c57c068af91409f824136fbe8f36df07b90331dc97783eb19f5a7901b19f597921b19f5bf96462bfb0f229c47e69e55389fdcaca8b88fddaca8b89fdc6ca4b88fdd6caa711fb9d954f27f67b2b2f25f6072b2f23f6472b9f41ec4f563e93d89fadbc9cd85facbc82d85fadbc92d8dfac7c16b1bf5bf96c62ffb0f22a62ffb4f239c4fe65e57389fddbcaab89bd6ee5f388fdc7cae713c30eb3865891b10b88151bbb90582b636b89b536b68e581b63eb899518db40acadb18b88b533b691587b631713eb606c13b1a4b14b887534b69958a9b14b89a58c6d215666ec32629d8c6d25d6d9d8e5c4ba18db46acabb12b887533b69d5877635712eb616c07b19ec6ae22d6cbd84e62bd8d5d4dac8fb16b88f535762db17ec6ae23d6dfd8f5c40618db456ca0b1ddc4ca8ded2136c8d80dc4061bbb91d810633711ab307633b1a1c66e2136ccd8adc4861bbb8d58a5b1db898d307607b12a6377121b69ec2e62a38cdd4d6cb4b17b88551bbb97d81863f711ab31763f311c2c1e205667ec4162f5c6f8b8d060ac15b1b1c6da101b67ac84d878636d894d30d69ed8c4a2fd65fc9d64ac23b1c9c64a894d31962236d55819b169c63a119b6eac33b14663f83e679acd30d695d84c63dd88cd32d69dd86c633d881d66ac27b1c38df5227684b1dec48e34d687d851c6fa123bda583f62738cf527768cb101c48e353690d871c6ca891d6f6c10b1138c0d2676a2b121c44e3256416caeb1a1c4e6191b466cbeb1e1c41618ab24b6d0d80862271bab22768ab191c44e35369ad82263d5c4161b1b436c89b11a62a719ab2576bab13a624b8dd5135b66ac81d819c6c6123bd3d83862cb8d8d27b6c2d804622b8d4d247696b149c4ce363699d82a6353889d636c2ab1738d4d23b6dad87462e7196b2476beb119c4d6189b49ec0263b3885d686c36b1b5c60e23b6ced8e1c4d61b3b82d806634712bbc8d851c4361a3b9ad8c5c6e610db64ec186297183b96d86663c711bbd4d8f1c4b6183b81d865c64e24b6d5d849c42e373697d83663f3885de139566c37f630b1622b734e8263c94f88e177637e4a0cc7979f11c3f1e5e7c4707cf905b17656fe25311c737e450cfebf2686e3d06f88e138f45b62380efd8e188e43bf2786e3d01f88e138f44762380efd89188e437f2686e3d05f88e138f45762380efd8d188e437f2786e3d03f88e138f44f62380efd8b188e43ff2686e3d0ebc4701cfa0f311c871274fcc771a888188e43c5c4ca8db52236c8586b62380eb52186e35009311c87da12c371a81d311c87da13c371a803b1378e43c4701cea480cc7a15262238da5888d3256460cc7a64ec4706cea4c0cc7a62ec4706cea4a0cc7a66ec4706cea4e0cc7a61ec4706cea490cc7a65ec4706cea4d0cc7a63ec4706cea4b0cc7a67ec4706cea4f0cc7a601c4706c1a480cc7a6726238360d228663d360628dc686109b61ac82188e4d4389e1d8348c188e4dc389e1d854490cc7a611c4706caa228663d3486238368d228663d36862738c5513c3b1690c311c9b6a88e1d8544b0cc7a63a623836d513c3b1a981188e4d6389e1d8348e188e4de389e15cd604623897c53907ce654d228673599389e15cd614623897359518ce654d23867359d389e15c5623319ccb9a410ce7b266125b6a6c16b165c66613c3b9acc388e15cd6e1c4702eeb086238977524319ccb3a8a18ce651d4d0ce7b2e610c3b9ac6388e15cd6b1c4ce35761c319ccb3a9e18ce659d400ce7b24e248673592711c3b9acb9c4702e6b1e319ccb9a4f0ce7b21610c3b9ac85c4702eeb64623897750a319ccb3a9518ce652d228673598b89e15cd612623897751a319ccb3a9d18ce652d25867359cb88e15cd619c42e377626b16dc69613c3b9ac15c4702e6b25319ccb3a8b18ce659d4d0ce7b25611c3b9ac7388e15cd6b9c4702e6b35319ccb3a8fd875c6ce278673596b88e15cd605c4702eeb42623897b59618ce65ad23867359eb89e15cd6066238977511319ccbda480ce7b22e268673599b88e15cd625c4702e6b33319ccbba9418ce656d218673599711c3b9acadc4702eeb72623897b58d18ce655d41ec0163c839d239c0e8d4fed75117f94792eaf27a50b63f99bc016d37260afb790db7d548cfd15e2979e0b5ffb5cf40319f33c57c468af9ac11f39920e6b359cc67b698cf4e319f8e623e2788f9dc2ce6d34bcc67b198cffd623e15623e678bf9d48af9ac17f3992ae673b998cf51623ed78bf97416f3992fe67387984f7f319f65623e23c47cce13f31927e6b349cc67a698cf0e319ff6623ec789f9dc28e6d343cce754319f7bc57c068bf9ac14f31923e6b356cc67b298cf65623e4788f95c2be65326e63357cce736319fbe623ea78bf93c2ce6335ccce75c319f06319f8d623e8d623edbc57c4ac47c8e11f3d923e6d34dcce764319fbbc57ccac57c968bf98c16f3b940cc67a298cfa5623e8789f95c2de6532ae673a298cf2d623ebdc57c9688f93c20e63354cc6795984f9d98cf06319f69623edbc47c5a89f91c2de6b34bcca78b98cf02319f3bc57c0688f99c21e65325e673be98cf78319f4bc47c6689f95c25e69314f3395ecce726319f9e623e8bc47cee13f31922e67396984f8d98cf3a319f29623e5bc57c8e14f3b94ecca79398cf3c319fdbc57cfa89f92c15f3a914f3592de63356cce762319f19623e578af9b415f33956cce706319fee623ea788f9dc23e63348cc6785984fb598cf85623e93c47cb688f91c2ee6738d984f4acce724319f5bc57cfa88f99c26e6f3a098cf30319f73c47ceac57c2e12f3992ee67385984f1b319f39623ebbc57cee12f3e92ae6b3d0f1497f1e8f7be86e27566c0cafb54f1c78fcc375e6e9ba0f392cdd477cafb43151d83ea22dac1bcf1f2687bd567e887c1e0ae4b3d7f171db4e515c1e148d598ad85e4f1c531eef948037ef8f2db1ad1f747cdcb65389fd71d92b1a33ded60f7ae258e6f12e13f0561cd7654e1cd562966b5c5778bc2b04bc15c775851347b598e51ad7c33cdec304bc15c7f530278e6a31cb35ae2b3dde9502de8ae3bad289a35acc728deb2a8f779580b7e2b8ae72e2a816b35ce37a94c77b9480b7e2b81ee5c4512d66b9c675b5c7bb5ac05b715c573b71548b59ae715de3f1ae11f0561cd7354e1cd562966b5cd779bceb04bc15c7759d1347b598e51ad70d1eef06016fc571dde0c4512d66b9c6f5448ff744016fc5713dd189a35acc728deb491eef4902de8ae37a921347b598e51ad7933dde9305bc15c7f564278e6a31cb35ae1779bc1709782b8eeb454e1cd562966b5c2ff6782f16f0561cd78b9d38aac52cd7b85ee2f15e22e0ad38ae973871548b59ae71bdc1e3bd41c05b715c6f70e2a816b35ce37aa3c77ba380b7e2b8dee8c4512d66b9c6f5268ff726016fc571bdc989a35acc728debcd1eefcd02de8ae37ab31347b598e51ad75b3cde5b04bc15c7f516278e6a31cb35aeb77abcb70a782b8eebad4e1cd562966b5c6ff3786f13f0561cd7db9c38aac52cd7b8deeef1de2ee0ad38aeb73b71548b59ae71bdc3e3bd43c05b715cef70e2a816b35ce37aa7c77ba780b7e2b8dee9c4512d66b9c6f52e8ff72e016fc571bdcb89a35acc728debdd1eefdd02de8ae37ab71347b598e51ad77b3cde7b04bc15c7f51e278e6a31f38deb76542e2f9c4f4d8a5c8aa9ad0703f53de1f43de16c0bf6b954cc67a298cf05623ea3c57c968bf90c12f3b95bcce764319fee623e7bc47c8e11f3692fe6b35dcca751cc67a3984f8398cfb9623e95623ea78bf9f413f3b94dcc67ae984f27319f6bc57c8e10f3692de6739998cf64319fb5623e63c47c568af90c11f3b957cce754319f9e623e378af91c27e69314f3d921e63353cc679398cf38319ff3c47caac47c9689f90c10f3b943cc67be984f17319febc57c8e12f32911f3b95ccc67aa98cf7a319f5a319fb3c57c868af9dc2fe6b358cca7b798cfcd623e2788f9948af9ec14f3992de6b359cc678298cf1a319f51623e678af9948bf9dc25e6b350cca79b98cf6e319f39623eedc47cae10f3992ee67391984fbd98cf39623ec3c57c4e13f3e92be673ab98cf49623e65623ed788f91c2ee6d34acc678b98cf24319f0bc57caac57c5688f90c16f3b947cce714319f1e623e3788f91c2be6d341cce74a319f19623e178bf98c15f3592de63342cc67a9984f7f319fdbc57ce689f97416f3b94ecce748319f36623e5bc57ca688f9ac13f3a911f3394bcca742cce73e319f45623ebdc47c6e12f3395ecca7a398cf55623eb3c47c2e11f3192fe673be98cf48319f33c47c068af9dc29e6b340cca7ab98cf2e319fa3c57cda8af96c13f39926e6b341cca74ecc679598cf30319f07c47c9688f9f411f3b945cce744319f9498cfd5623e8789f91409f824c923410cf79f2e2686fb53b722f688955b137bd4ca6d883d66e512628f5bb92db12712fb6302f6a495db137bcaca1d883d4d65fc7dc6ca1d893d6be55262cf593945ec792b97117bc1ca9d88bd68e5cec45eb27217626fb37257626fb7723762efb0727762efb4720f62efb2724f62efb6722f62efb1726f62efb5721f622f5bb92fb1f759b91fb1f75bb93fb10f587900b10f5a7920b10f59b99cd82b561e44ecc3561e4cec23561e42eca356ae20f6aa958712fb98958711fbb8958713fb84952b897dd2ca23887dcaca55c43e6de591c43e63e551c43e6be5d1c43e67e56a629fb7f218625fb0720db12f5ab996d897ac5c47ec352bd713fbb2951b887dc5ca63897dd5cae3887dcdcae3897dddca13887dc3ca13897dd3ca93887dcbca93897ddbca53887dc7ca53897dd7cad3887dcfcad3897ddfca8dc47e60e519c47e68e599c47e64e559c47e6ce5d9c47e62e5c388fdd4ca8713fb99958f20f6732b1f49ec17563e8ad82fad7c34b15f59790eb15f5bf91862bfb1f2b1c47e6be5e388fdcecac713fbbd954f20f6072b9f48ec8f563e89d89fac3c97d89fad3c8fd85fac3c9fd85fadbc80d8dfacbc90d8dfad7c32b17f58f91462ffb4f2a9c4fe65e545c4fe6d65fe1df9d7adccbf37fe1f2b9f460c07d6d38915195b4aacd8d83262ad8c9d41acb5b13389b531b69c5889b115c4da1a5b49ac9db1b388b5377636b10ec656114b1a3b87584763e7122b35b69a58cad879c4ca8c9d4fac93b135c43a1bbb805817631712eb6a6c2db16ec6d611eb6e6c3db11ec6f837c67b1abb88582f63fcfbd4bd8d5d4cac8f31fe6de3bec62e21d6cf18ff2e6e7f6397121b608c7f5375a0b1cb88951be3dfe31c64ec7262838d6d2336c4d815c42a8cf1ef000e357625b161c6f837e4861bbb8a58a531fefdb111c6ae265665ec1a62238d5d4b6c94b1eb888d36763db16a63fc5b58638ced2656638c7f5b076faa6f205667ec4662f5c66e22d660ec6662638ddd426c9cb15b898d37761bb109c66e2736d1d81dc42619bb93d8646377119b62ec6e62538ddd436c9ab17b894d37761fb14663f7139b61ec0162338ded2586bce32162c83b1e2686bce31162c83b1e2586bce33162c83b1e2786bce30962c83b9e2486bce32962492b731e82bce31962c83b9e2586bce33962c83b9e2786bce30562c83b5e2486bce32562c83bde460c79c7db8921ef780731e41def2486bce35dc49077bc9b18f28ef71043def15e62c83b5e2686bce37dc49077bc9f18f28e0f1043def14162e556fe10b141567e8518f28e0f1343def11162c83b3e4a0c79c7abc490777c8c18f28e8f1343def10962c83b3e490c79c7a7888db4f2a78921eff80c31e41d9f2586bce373c490777c9e18f28e2f1043def14562c83bbe440c79c76bc490777c9918f28eaf1043def15562c83bbe460c79c7d78921eff80631e41ddf2486bce35bc490777c9b18f28eef1043def15d62c83bbe47acd1cadf2736c3ca3f2086bce387c49077fc8818f28e1f1343def11362c83b7e4a0c79c7cf8821eff83931e41dbf2086bce397c4e658f957c49077fc9a18f28edf1043def15b62c83b7e470c79c7ef8921eff80331e41d7f2486bce34fc49077fc9918f28ebf1043def15762c83bfe460c79c7df8921eff80731e41dff2486bce35fc49077fc9b18f28ed78921eff80f31e41dc843d26c2910b165c68a8921ef68450c79476b62c83bda1043de51420c79475b626f5c3f490c79477b62c83b3a107b23ef2076aeb18ec49077941243de912286bca38c18f28e4ec49077742686bca30b31e41d5d8921efe8460c79477762c83b7a1043ded19318f28e5ec49077f42686bca30f31e41d7d8921efe8470c79477f62c83b061043de319018f28e7262971b1b446c9bb1c1c490770c2186bca38218f28ea1c490770c2386bc633831e41d95c490778c2086bca38a18f28e91c4ae33368a18f28ed1c49077541343de318618f28e1a62c83b6a8921efa82386bca39e18f28e0662c83bc61243de318e18f28ef1c490774c2086bc632231e41d938821ef984c0c79c71462c83ba61243de318d18f28ee9c4907734127bc0d80c620f1a431e92ce0b06f4d8ff3aeaf26721a8cbeb41d9fe647209b4dd9828ece73adc56233d477ba5e481d7fed73e8789f95c2de69312f33951cce716319f3e623e4bc47c1e10f31926e6b34acca74ecc678398cf34319f6d623e6dc57c8e16f3d925e6d355cc678198cf9d623e03c57cce10f31929e673be98cf78319f4bc47c6689f95c25e6d351cce778319f9bc47c7a89f92c12f3b94fcca742cce72c319f1a319f75623e53c47cb68af9b411f33952cce73a319fce623ef3c47c6e17f3e92fe6b354cc678498cf6a319fb1623e178bf9cc10f3b952cca78398cfb1623e3788f9f410f33945cce71e319fc1623e2bc47caac57c2e14f39924e6b345cca79598cfe1623ed788f99489f99c24e673ab984f5f319fd3c47c868bf99c23e6532fe6739198cf74319f2bc47cda89f9cc11f3d92de6d34dcc67a198cf5d623ee5623e678af98c12f35923e63341cc67b398cf6c319f9d623ea5623e2788f9dc2ce6d35bcc67b198cffd623e43c57cce16f3a915f3592fe63355cce772319f12319fa3c47cae17f3e922e6335fcce70e319f01623ecbc47caac47cce13f31927e6b349cc67a698cf0e319fa498cf71623e378af9f414f33955cce75e319f21623e2bc57cc688f9ac15f3992ce67399984f6b319f23c47cae15f3e924e63357cce736319f7e623ea78bf9548af99c2be6d320e6b351cca751cc67bb984f7b319f63c47cf688f97417f33959cce76e319f41623ecbc57c468bf95c20e63351cce752319f62c7a7d4793dfdc8fc5684c3d2de530379a32dac1bcfa79203ee993d8de2382d90cf74c7c76d3b457141ecd462962236dd1347fe0dd1690efb5f6febc616dcd68d8e4fa3675b232ed38b3463c6dbbad11347fe6dd8690e8be3fac06d89b8f8c6b542cc728d6bfe8dd9690e8be3fac06d8db8f8c6b542cc728d6bfe9de0690e8be3fac06d8db8f8c6b542cc728d6b9cd763ef4a016fc5718db8f8c6b542cc728d6bfebdee690e8be3fac06d8db8f8c6b542cc728d6bfecdf5690e8be3fac06d8db8f8c6b542cc728d6bdc7b85bdab05bc15c735e2e21bd70a31cb35ae711f58f6ae11f0561cd7888b6f5c2bc42cd7b8c66fd2b0779d80b7e2b8465c7ce35a2166b9c6353e3f66ef06016fc5718db8f8c6b542cc728d6b7c96c0de1305bc15c735e2e21bd70a31cb35ae71df37f69e24e0ad38ae1117dfb8568859ae718d6b58d97bb280b7e2b8465c7ce35a2166b9c6357ecf83bd1709782b8e6bc4c537ae1562966b5ce3de04ecbd58c05b715c232ebe71ad10b35ce31abf23cbde4b04bc15c735e2e21bd70a31cb35aef11babecbd41c05b715c232ebe71ad10b35ce31ad743b3f746016fc5718db8f8c6b542cc728d6b7c379bbd3709782b8e6bc4c537ae1562966b5ce33e71ecbd59c05b715c232ebe71ad10b35ce31af7ac67ef2d02de8ae31a71f18d6b8598e51ad7f8fd3cf6de2ae0ad38ae1117dfb8568859ae71bd2df166ef6d02de8ae31a71f18d6b8598e51ad7f8de1d7b6f17f0561cd7888b6f5c2bc42cd7b8c63d80d87b8780b7e2b8465c7ce35a2166b9c635ee47ccde3b05bc15c735e2e21bd70a31cb35ae7725deecbd4bc05b715c232ebe71ad10b35ce37a77e2cddebb05bc15c735e2e21bd70a31cb35aef11d7bf6de23e0ad38ae1117dfb85688996f5c27a93c935871e2c07aed2de60f25f6c71f751f7158ba8f8f26c2f4116d61dd78fe28393c6ce547c8e791403e0f3b3e6edbfcfddd8744639622f6b0278e298f774ac09bf7c796d8d60f393e6edbfcfddd874563c6dbfa214f1ccb3cde6502de8ae3bacc89a35acc728deb0a8f778580b7e2b8ae70e2a816b35ce37a98c77b9880b7e2b81ee6c4512d66b9c675a5c7bb52c05b715c573a71548b59ae715de5f1ae12f0561cd7554e1cd562966b5c8ff2788f12f0561cd7a39c38aac52cd7b8aef678570b782b8eeb6a278e6a31cb35ae6b3cde3502de8ae3bac689a35acc728deb3a8f779d80b7e2b8ae73e2a816b35ce3bac1e3dd20e0ad38ae1b9c38aac52cd7b89ee8f19e28e0ad38ae273a71548b59ae713dc9e33d49c05b715c4f72e2a816b35ce37ab2c77bb280b7e2b89eecc4512d66b9c6f5228ff722016fc571bdc889a35acc728debc51eefc502de8ae37ab11347b598e51ad74b3cde4b04bc15c7f512278e6a31cb35ae3778bc3708782b8eeb0d4e1cd562966b5c6ff4786f14f0561cd71b9d38aac52cd7b8dee4f1de24e0ad38ae373971548b59ae71bdd9e3bd59c05b715c6f76e2a816b35ce37a8bc77b8b80b7e2b8dee2c4512d66b9c6f5568ff756016fc571bdd589a35acc728deb6d1eef6d02de8ae37a9b1347b598e51ad7db3ddedb05bc15c7f576278e6a31cb35ae7778bc7708782b8eeb1d4e1cd562966b5ceff478ef14f0561cd73b9d38aac52cd7b8dee5f1de25e0ad38ae773971548b59ae71bddbe3bd5bc05b715cef76e2a816b35ce37a8fc77b8f80b7e2b8dee3c4512d66be71dd8e7c0be9934c1c18b3f4a3c879de48e5873c3eaf17cea726453e0f85dd1675bcdd0fa6ef8f92cf6385f7c96c8b47f3f0798c7c1e0f149fc7f2f0799c7c9e08149fc7f3f079827c9e0ce4f3441e3e4f92cf53817c9eccc3e729f2793a90cf5379f83c1dd62733b73ceab495668f7bda072b2f5cfbcbd26d617f799cdac7367b90dae77da540edd7a6687bf0fa0b3fb7d6d6e5bbed796e0d3177043a86d4a4d7fb0cf5af50eb4dafeb5927564f39b14a519d67287ecf06885f51e2c06353233d7fd6d37601f7db4c2c9e3b88583ce7f179ae856381f6a2b3a6f34387a0f3a118e7670e41e73806a37336e7386fb48c739c37a2f35bc939ce1bcd73e673a070e5f3637c2ef97fe908f644589f95f99eab7c8e7c429cc70ed4cf4caef7bcd3a7473c71471d3e5e3c1fa09fbeb183e7cfd376c8c7f9d9e81c9ddf42ce710c46e7e8fcbf758e63303a47e7c23aa77df0f9375c9354ef311147b04783fad4e67d3dc0f3e41322470b14f74c0ef282d3a7c73c71471d9e7b5f08d04fdfd8c1f317683be4e3fc6c748ece599c1f3a049d0fc538c779233abf959ce3bcd132ce71de88ce6f25e7386f34cf39ddf68b856f3bf35913b78df8241c1f3c5e0c1c8b40fdcce4792f25fc31467b29aac3f3ee4b01fa5944ed62dd78fe126d877c9c9f8dced1f92de41cc760748eceff5be73806a373742eac738a5e2f269f00ef7b6b0fe6bd3cfb5c2ae63351cce702319fd1623ecbc57c0689f9dc2de673b2984f77319f3d623ec788f9b417f3d92ee6d328e6b351cca741cce761319f73c57c2ac57c4e17f3e927e6739b98cf5c319f4e623ed78af91c21e6d35acce732319fc9623e6bc57cc688f9ac14f31922e673af98cfa9623e3dc57c6e14f3394ecc2729e6b343cc67a698cf26319f71623ee789f95489f92c13f31920e6738798cf7c319f2e623ed78bf91c25e65322e673b998cf54319ff5623eb5623e678bf90c15f3b95fcc67b1984f6f319f9bc57c4e10f32915f3d92be6b353cc67b698cf66319f09623e6bc47c4689f99c29e6532ee6739798cf42319f6e623ebbc57ce688f9b413f3b942cc67ba98cf45623ef5623ee788f90c17f37950cce734319fbe623eb78af99c24e65326e6738d98cfe1623eadc47cb688f94c12f3b950cca75acc678598cf60319f7bc47c4e11f3e921e6738398cfb1623e1dc47cae14f39921e673b198cf58319fd5623e23c47c968af9f417f3b95dcc679e984f67319febc47c8e14f36923e6b355cc678a98cf3a319f1a319fb3c47c2ac47cee13f35924e6d34bcce726319fe3c57c3a8af95c25e6334bcce712319ff1623ee78bf98c14f33943cc67a098cf9d623e0bc47cba8af9ec12f3395acca7ad98cf36319f69623e1bc47ceac47c5689f90c13f37940cc6789984f1f319f5bc47c4e14f34989f95c2de67398984f91804f32f1e6dfc449d2ebc5c4708fef56c4de66e5d6c4de6ee536c4de61e51262efb4725b62ef4aec8f09d8bbaddc9ed87bacdc81d87ba98cbf2f5bb923b1f759b994d8fbad9c22f6012b9711fba0953b11fb90953b137bc5ca5d887dd8ca5d897dc4cadd887dd4cadd89bd6ae51ec43e66e59ec43e6ee55ec43e61e5dec43e69e53ec43e65e5bec43e6de57ec43e63e5fec43e6be501c43e67e581c43e6fe572625fb0f220625fb4f260625fb2f21062af59b982d897ad3c94d857ac3c8cd857ad3c9cd8d7ac5c49eceb561e41ec1b56ae22f64d2b8f24f62d2b8f22f66d2b8f26f61d2b5713fbae95c710fb9e956b887ddfcab5c47e60e53a623fb4723db11f59b981d88fad3c96d84fac3c8ed84fad3c9ed8cfac3c81d8cfad3c91d82fac3c89d82fad3c99d8afac3c85d8afad3c95d86fac3c8dd86fad3c9dd8efacdc48ecf7569e41ec0f569e49ec8f569e45ec4f569e4deccf563e8cd85fac7c38b1bf5af908627fb3f291c4fe6ee5a388fdc3ca4713fba795e710fb97958f21f66f2b1f4bec752b1f47ec3f563e9e180e1627102b327622b1626327116b656c2eb1d6c6e6116b636c3eb112630b88b535b690583b6327136b6fec14621d8c9d4a2c696c11b18ec616132b35b68458cad869c4ca8c9d4eac93b1a5c43a1b5b46ac8bb1338875357626b16ec69613eb6e6c05b11ec65612eb69ec2c62bd8c9d4dacb7b155c4fa183b87585f63e712eb676c35b1fec6ce2336c0d8f9c4061a5b43acdcd805c40619bb90d860636b890d31b68e5885b1f5c4861adb406c98b18b880d37b69158a5b18b898d30b6895895b14b888d34b699d8286397121b6d6c0bb16a6397111b636c2bb11a639713c31bc56dc4ea8c5d41acded876620dc6ae2436d6d80e62e38c5d456cbcb19dc42618bb9ad84463d7109b64ec5a62938d5d476c8ab1eb894d35b68bd83463bb894d37b68758a3b11b88cd307623b199c66e2236cbd8cdc4661bbb85d861c66e2576b8b1db881d61ec7662471abb83d851c6ee2476b4b1bb88cd317637b1638cdd43ec5863f7123bced87dc48e37763fb1138c3d40ec44638f113bc9d873c4e61a7b9ad83c63cf139b6fec05620b3ccb2e34f638b1938d3d48ec14634f12435ec47914f2a29788212f7a1b31e4456f2786bce81dc49017bd9318f2a27711435ef46e62c88bde432c6965ce939017bd4c0c79d1fb88212f7a3f31e4451f2086bce883c490177d8818f2a25788212ffa3031e4451f2186bce8a3c49017bd4a0c79d1c788212ffa3831e4459f2086bce893c490177d8a18f2a24f13435ef41962c88b3e4b0c79d1e788955bf9f3c40659f90bc490177d9118f2a22f11435ef41a31e4455f2686bce82bc490177d9518f2a2af11435ef47562c88bbe416ca495bf490c79d1b788212ffa3631e445df2186bce8bbc490177d8f18f2a2ef13435ef40362c88b7e480c79d18f88212ffa3131e4453f2186bce8a7c49017fd8c18f2a29f13435ef40b62c88b7e490c79d1af88212ffa3531e445bf2186bce8b7c41aadfc3b6233acfc7b62c88bfe400c79d11f89212ffa1331e4457f2686bce82fc49017fd9518f2a2bf11435ef47762c88bfe416c8e95ff490c79d1bf88212ffa3731e445af13435ef41f62c88b9027658e6f40c490171513435ed48a18f2a2d6c49017b52186bca88418f2a2b6c4def84d2c62c88bda13435ed481d81b791131e4451d89212f2a2586bc28450c795119b1a5c63a115b66ac3331e4455d88212fea4a0c79513762c88bba13435ed48318f2a29ec49017f52286bca83731e4457d889d6bac2f31e445fd88212fea4f0c79d10062c88b0612435e544e0c79d12062c88b0613435e348418f2a20a62c88b8612435e348c18f2a2e1c490175512435e348218f2a22a62c88b4612435e348a18f2a2d1c490175513435e3486d8e5c66a886d33564b0c79511d31e445f5c490173510435e349618f2a271c490178d2786bc680231e4451389212f9a44ec3a639389212f9a420c79d15462c88ba611435e349d18f2a24662c88b6610435e349318f2a259c49017cd2686bce83062c88b0e2786bce80862c88b8e2486bce82862c88b8e2686bc680e31e445c710435e742c31e445c711435e743cb1078c9d40ec41632712db6bec24620f199b4b0cbff9358fd823c6e6137bd4d80262c8c7161243ae7432b1278c214f4ae72d3faed8ff3a96e7cf92d00e7f9684e5b93db4c35e28db9f4c4e84651a1385fdfc8cdb6aa4e768af943cf0daffdae730319fabc57c52623e278af9dc22e6d347cc678998cf03623ec3c47c5689f9d489f96c10f39926e6b34dcca7ad98cfd1623ebbc47cba8af92c10f3b953cc67a098cf19623e23c57cce17f3192fe6738998cf2c319fabc47c3a8af91c2fe67393984f2f319f45623ef789f95488f99c25e65323e6b34ecc678a98cf56319f36623e478af95c27e6d359cc679e98cfed623efdc57c968af98c10f3592de63356cce762319f19623e578af97410f33956cce706319f1e623ea788f9dc23e63358cc6785984fb598cf85623e93c47cb688f9b412f3395ccce71a319f32319f93c47c6e15f3e92be6739a98cf83623ec3c57cce11f3a917f3b948cc67ba98cf15623eedc47ce688f9ec16f3e926e6b350cce72e319f72319f33c57c4689f9ac11f39920e6b359cc67b698cf4e319fbd623ea5623e2788f9dc2ce6d35bcc67b198cffd623e43c57cce16f3a915f3592fe63355cce772319f12319fa3c47cae17f3e922e6335fcce70e319f01623ecbc47caac47cce13f31927e6b349cc67a698cf0e319fa498cf71623e378af9f414f33955cce75e319f21623e2bc57cc688f9ac15f3992ce67399984f6b319f23c47cae15f3e924e63357cce736319f7e623ea78bf9548af99c2be6f3b0984f8398cf46319f46319fed623eedc57c8e11f3d923e6d35dcce764319fbbc57c0689f92c17f3192de6738198cf44319f4bc57c8a5bd007f70bc7ba4f767c02b55dc3f764c7fad3f741e930607fbb0b0adfeeb222a7bdc6c49baf476b4d75de5eb1bf6e2aa85bc384f47ae7177cbd63333fcd30cfe933fce7539f51a7abf5337d1e80978517ee3bbf80f659c46b9e27863d07ec6f7bea90fdcbe0fefbc83fd2fdc77df5cb1385dde68fecef4266dd0f5a19eda5ebe0fefd254e1d2cdb9aeaf4a718f16f5417535f50b73151d831cb8f462aa33df69928e6738198cf20319f93c57cf688f920b753f16914f3d928e65329e673ba98cf6d623e9dc47c8e10f3b94ccc678c98cf4a319f7bc57c7a8af91c27e6b343cce721319f71623ee789f90c10f3992fe673bd984f8998cf54319ff5623e43c57c168bf9dc2ce6532ae6335bcc67b398cf28319f33c57cee12f3e926e63347cce70a319f7a319f73c47cfa8af99c24e6738d984f2b319f49623e178af90c16f33945cce706319f0e623e33c47c2e16f31921e6b354cce776319fce623e478af96c15f3a911f3394bcce73e319f5e623ec78bf95c25e6f38898cf78319ff3c57c068af92c10f3d925e6d356cc679a98cf06319f61623e4bc47c6e11f34989f91c26e673a998cf68319fe5623e778bf97417f33946cc67bb98cfc3623e0d623ee78af9f413f3992be673ad984f6b319fc9623e6bc57c8688f99c2ae673a3984f52cc67a698cf26319f2a319f65623e7788f97411f3394acce772319f5a319fb3c57cee17f3e92de6738298cf5e319f9d623e13c47cd688f9948bf92c14f3d92de6d34ecc67ba98cf45623ec3c57c4e13f3b955cca74ccce770319f2d623ed5623e2bc47cee11f3e921e673ac98cf95623e63c57c568bf9f417f39927e6739d984f1b319f29623eebc47c2ac47c1689f9dc24e6d351cc679698cf25623e23c57cce10f3b953cca7ab98cfd1623edbc47ceac47c5689f93c20e6d347cce744319fabc57c8a047c92e4912086d78b893d6ee556c49eb0726b624f5ab90db1a7ac5c42ec692bb725f64c627f4cc09eb5727b62cf59b903b1e7a98cbf2f58b923b117ad5c4aec252ba788bdcdca65c4de6ee54ec4de61e5cec4de69e52ec4de65e5aec4de6de56ec4de63e5eec4de6be51ec45eb6724f62efb3722f62efb7726f621fb0721f621fb4725f621fb2723f62af58b93fb10f5b7900b18f587920b18f5ab99cd8ab561e44ec63561e4cece3561e42ec1356ae20f6492b0f25f6292b0f23f6692b0f27f6192b5712fbac954710fb9c95ab887ddeca23897dc1caa3887dd1caa3897dc9cad5c45eb3f218625fb6720db1af58b996d857ad5c47ec6b56ae27f6752b3710fb8695c712fba695c711fb9695c713fbb6952710fb8e952712fbae952711fb9e952713fbbe95a710fb8195a712fba195a711fb9195a713fbb1951b89fdc4ca3388fdd4ca3389fdcccab388fddccab389fdc2ca8711fba5950f27f62b2b1f41ecd7563e92d86fac7c14b1df5af96862bfb3f21c62bfb7f231c4fe60e56389fdd1cac711fb93958f27f6672b9f40ec2f563e91d85fad7c12b1bf59792eb1bf5b791eb17f58793eb17f5a7901b17f597921b17f5bf96462af5bf91462ffb1f2a9c470205c44acc8d86262c5c696106b65ec3462ad8d9d4eac8db1a5c44a8c2d23d6d6d819c4da193b93587b63cb897530b68258d2d84a621d8d9d45acd4d8d9c452c656112b33760eb14ec6ce25d6d9d86a625d8c9d47acabb1f3897533b6865877631710eb61ec42623d8dad25d6cbd83a62bd8dad27d6c7d806627d8d5d44ac9fb18dc4fa1bbb98d800639b880d347609b172639b890d327629b1c1c6b6101b62ec326215c6b6121b6aec7262c38c6d2336dcd815c42a8d6d2736c2d895c4aa8ced2036d2d855c44619db496cb4b1ab89551bbb86d81863d712ab31761d31bc09be9e589db15dc4ea8ded26d6606c0fb1b1c66e2036ced88dc4c61bbb89d8046337139b68ec1662938cdd4a6cb2b1db884d31763bb1a9c6ee2036cdd89dc4a61bbb8b58a3b1bb89cd30760fb199c6ee2536cbd87dc4661bbb9fd861c61e2076b8b1478821efe03c0579c7e3c490773c410c79c793c490773c450c79c7d3c490773c430c79c7b3c490773c472c6965ce439077bc400c79c78bc49077bc440c79c7db8821ef783b31e41def2086bce39dc49077bc8b18f28e771343def11e62c83bde4b0c79c7cbc49077bc8f18f28ef71343def10162c83b3e480c79c7878821ef788518f28e0f1343def11162e556fe28b141567e9518f28e8f1143def17162c83b3e410c79c7278921eff81431e41d9f2686bce333c490777c9618f28ecf111b69e5cf1343def10562c83bbe480c79c7978821ef788d18f28e2f1343def11562c83bbe4a0c79c7d78821eff83a31e41ddf2086bce39bc490777c8b18f28e6f1343def11d62c83bbe4b0c79c7f78821eff83e31e41d3f2086bce387c49077fc8858a3957f4c6c86957f420c79c74f8921eff81931e41d3f2786bce317c49077fc9218f28e5f1143def16b62c83b7e430c79c76f89cdb1f2ef8821eff83d31e41d7f2086bce38fc49077fc8918f28e3f1343def11762c83bfe4a0c79c7df8821eff83b31e41dff2086bce39fc49077fc8b18f28e7f1343def13a31e41dff2186bc0379489a21ef282286bca39818f28e56c49077b426b6d4581b62cb8c951043ded196d81bf7e32686bca33d31e41d1d88bd91771043ded19118f28e5262c83b52c4907794113bd7582762c83b3a1343ded18518f28eaec49077742386bca33b31e41d3d8821efe8490c79472f62c83b7a1343ded18718f28ebec49077f42386bca33f31e41d038821ef18480c79473931e41d838821ef184c0c79c71062c83b2a885d6e6c28b16dc6861143de319c18f28e4a62c83b461043de51450c79c74862c83b461143de319a18f28e6a62c83bc610bbce580d31e41db5c49077d41143de514f0c79470331e41d638921ef18470c79c77862c83b261043de319118f28e49c490774c2686bc630a31e41d538921ef98460c79c77462c83b1a8921ef98410c79c74c62c83b661143de319bd803c60e23f6a031e421e9bc60408ffdafa32e7f1682babc1e94ed4f269740db8d89c27eaec36d35d273b4574a1e78ed7fed73b598cf89623e7dc47c1e10f35925e65327e6b34dcce768319fae623e778af99c21e63352cce712319f59623e1dc57c6e12f35924e65321e6b34ecc678a984f1b319febc47ce689f9f417f3592de63356cce74a319f63c57c7a88f9dc23e6b342cca75acc678b98cfe1623e65623eb78af99c26e6335ccce722319fe9623eedc47c768bf92c14f32917f35923e63341cc67a798cf5e319f13c47c7a8bf9dc2fe673b6984fad98cfe5623e4789f97411f3b943cc6799984f9598cf26319f99623e49319f1bc57c4e15f31922e6b356cc67b2984f6b319f6bc57ce68af9f413f33957cca741cce761319fed623ec788f97417f3b95bcc67b998cf68319f4bc57c0e13f34989f9dc22e6b344cc679898cf06319f69623e6dc57c7689f92c10f31928e673be98cf78319f47c47cae12f3395ecca79798cf7d623e6789f9d488f96c15f33952cca7b398cfed623e4bc57c4688f95c2ce63343cca78398cf0d623ea788f90c16f3b950cc6792984f2b319f6bc47c4e12f3e92be6738e984fbd98cf15623e73c47cba89f9dc25e673a698cf28319fcd623eb3c57c4ac57c6e16f3592ce63354cc67bd98cf54319f12319febc57ce68bf90c10f3394fcc679c98cf43623e3bc47c8e13f3e929e673af98cf4a319f31623e9789f91c21e6d349cce736319fd3c57c2ac57c368af9348af9b417f3d923e673b298cf20319f0bc47c268af9143b3ee9c723fb8b6fbcdfc7bdc7d3d74b3fecd44bdf2370ea90fdebc432a857ea94d38ff4f7281f75583a16a17e93166d61dd78fe1839a03f8f92cfa3817c1e717cdcb65314978745639622f688278e298f774ac09bf7c796d8d60f3b3e6edba9c4feb83c221a33ded6be715de6f12e13f0561cd7654e1cd562966b5c5778bc2b04bc15c775851347b598e51ad7c33cdec304bc15c7f530278e6a31cb35ae2b3dde9502de8ae3bad289a35acc728deb2a8f779580b7e2b8ae72e2a816b35ce37a94c77b9480b7e2b81ee5c4512d66b9c675b5c7bb5ac05b715c573b71548b59ae715de3f1ae11f0561cd7354e1cd562966b5cd779bceb04bc15c7759d1347b598e51ad70d1eef06016fc571dde0c4512d66b9c6f5448ff744016fc5713dd189a35acc728deb491eef4902de8ae37a921347b598e51ad7933dde9305bc15c7f564278e6a31cb35ae1779bc1709782b8eeb454e1cd562966b5c2ff6782f16f0561cd78b9d38aac52cd7b85ee2f15e22e0ad38ae973871548b59ae71bdc1e3bd41c05b715c6f70e2a816b35ce37aa3c77ba380b7e2b8dee8c4512d66b9c6f5268ff726016fc571bdc989a35acc728debcd1eefcd02de8ae37ab31347b598e51ad75b3cde5b04bc15c7f516278e6a31cb35aeb77abcb70a782b8eebad4e1cd562966b5c6ff3786f13f0561cd7db9c38aac52cd7b8deeef1de2ee0ad38aeb73b71548b59ae71bdc3e3bd43c05b715cef70e2a816b35ce37aa7c77ba780b7e2b8dee9c4512d66b9c6f52e8ff72e016fc571bdcb89a35acc728debdd1eefdd02de8ae37ab71347b598e51ad77b3cde7b04bc15c7f51e278e6a31f38deb24951f2256ecd46b6fee0b0aff1de509e9552eb4f516db7af7daba17d0f7a3e715beed9af42ae7db7a5bdb7ad1ce02e2a8f3fe8a7d7fd34f4f32d6ca965be82c97fe33d759379641ff5a531dacbb93f5777ec1fb3bb686bddb38de1c07d479859c7859789d62cf17d277c911bf93687d60af56ec6ffb3b15fb97c1f2183b61fabf6f5f5b90655f9b4ffbdadc40fbda3c677f98eb893dea7c9ef6b5139d7d6d81b35c9113ef465a86f7b5939c75635f0b30b66a79ff4f38def38adedcb712a70e8f1dd4f9b2e37d620b8d11b89ce819235f3fc8313297c6c802678cf0ebe9873b97f0fd16e6921bc650a0b9b996e766acdb9d9b790e2d71ea2cf4cca13fa478253d75d3fdea30607fac9e4cec2f276c99a71d96eeff338930fd475b58379e3f430e4f59f969f2793a90cf538e8fdb36df33e249d198a5883de58963cae39d12f0e6fdb125b6f5938e8fdb36df33e229d198f1b67ed213c7328f779980b7e2b82e73e2a816b35ce3bac2e35d21e0ad38ae2b9c38aac52cd7b81ee6f11e26e0ad38ae873971548b59ae715de9f1ae14f0561cd7954e1cd562966b5c5779bcab04bc15c775951347b598e51ad7a33cdea304bc15c7f528278e6a31cb35aeab3dded502de8ae3bada89a35acc728deb1a8f778d80b7e2b8ae71e2a816b35ce3bacee35d27e0ad38aeeb9c38aac52cd7b86ef0783708782b8eeb06278e6a31cb35ae277abc270a782b8eeb894e1cd562966b5c4ff2784f12f0561cd7939c38aac52cd7b89eecf19e2ce0ad38ae273b71548b59ae71bdc8e3bd48c05b715c2f72e2a816b35ce37ab1c77bb180b7e2b85eecc4512d66b9c6f5128ff712016fc571bdc489a35acc728deb0d1eef0d02de8ae37a831347b598e51ad71b3dde1b05bc15c7f546278e6a31cb35ae3779bc3709782b8eeb4d4e1cd562966b5c6ff6786f16f0561cd79b9d38aac52cd7b8dee2f1de22e0ad38aeb73871548b59ae71bdd5e3bd55c05b715c6f75e2a816b35ce37a9bc77b9b80b7e2b8dee6c4512d66b9c6f5768ff776016fc571bddd89a35acc728deb1d1eef1d02de8ae37a871347b598e51ad73b3dde3b05bc15c7f54e278e6a31cb35ae7779bc7709782b8eeb5d4e1cd562966b5ceff678ef16f0561cd7bb9d38aac52cd7b8dee3f1de23e0ad38aef73871548b996f5cb7a372a17df63a3e7b5bb0ed6cf7f8788a628147710bf8241c9f44133e978af94c14f3b940cc67b498cf13623ecbc57c0689f9dc2de673b2984f77319f3d623ec788f9b417f3d92ee6d328e6b351cca741cce75c319f4a319f87c47c4e17f3e927e6739b98cf5c319f4e623ed78af91c21e6d35acce732319fc9623e6bc57cc688f9ac14f31922e673af98cfa9623e3dc57c6e14f3394ecc2729e6b343cc67a698cf26319f71623ee789f95489f93c2ae6b34ccc678098cf1d623ef3c57cba88f95c2fe67394984f8998cfe5623e53c57cd68bf9d48af99c2de63354cce77e319fc5623ebdc57c6e16f33941cca754cc67a798cf6c319fcd623e13c47cd688f98c12f3795ccce74c319f72319fbbc47c168af97413f3d92de63347cca79d98cf15623ed3c57c2e12f3a917f33947cc67b898cf83623e7bc57c4e13f3e92be673ab98cf49623e65623ed788f91c2ee6d34acc678b98cf24319f0bc57caac57c5688f90c16f3b947cce714319f1e623e3788f91c2be6d341cce74a319f19623e178bf98c15f3592de63342cce761319f47c47c968af9f417f3b95dcc679e984f67319febc47c8e14f36923e6b355cc678a98cf3a319f1a319fb3c47c2ac47cee13f35924e6d34bcce726319fe3c57c3a8af95c25e6334bcce712319ff1623ee78bf98c14f3794ccce70c319f81623e778af92c10f3e92ae6b34bcce768319fb6623edbc47ca689f96c10f3a913f35925e6334ccce701319f25623e7dc47c6e11f33951cc2725e673b598cf61623e45023e49f24810c3eb0f10c3ef1b3c480cbf2bb097187e77e02162cf5af96162cf59f91162cf5bf951622f58f931622f5af971622f59f90962c556e6fee2ba46febd06dc4bf06962f8fce41962b887c2b3c4f0bef13962f8eec8f3c4707fe41788e11a95178925ad8cfea4d7ffcb91fb5fc7f2c5b40cda6945ec254f7b2f7abc50e6fd11cb34260abb3f725b8df41ced9592c7f3223e8789f95c2de69312f33951cce716319f3e623e4bc47c1e10f31926e6b34acca74ecc678398cf34319f6d623e6dc57c8e16f3d925e6d355cc678198cf9d623e03c57cce10f3794ccc67a498cff9623ee3c57c2e11f39925e67395984f47319fe3c57c6e12f3e925e6b348cce73e319f0a319fb3c47c6ac47cd689f94c11f3d92ae6d346cce748319febc47c3a8bf9cc13f3b95dcca7bf98cf52319f47c47c1e16f31921e6b35acc67ac98cfc5623e33c47cae14f3e920e673ac98cf0d623e3dc47c4e11f3b947cc67b098cf0a319f6a319f0bc57c2689f96c11f36925e673b898cf35623e65623e2789f9dc2ae6d357cce734319fbd623e0f8af90c17f33947cca75ecce722319fe9623e5788f9b413f39923e6b35bcca79b98cf42319fbbc47ccac57cce14f3795ccc679498cf1a319f09623e9bc57c668bf9ec14f32915f33941cce766319fde623e8bc57cee17f3192ae673b6984fad98cf7a319fa9623e978bf99488f91c25e673bd984f17319ff9623e7788f90c10f35926e6f3a8984f9598cf79623ee3c47c3689f9cc14f3d921e69314f3394ecce746319f9e623ea78af9dc2be63344cc67a598cf18319fb5623e93c57c2e13f3692de6738498cfb5623e9dc47ce68af9dc26e6d34fcce774319f87c47c2ac57cce15f36910f3d928e6d328e6b35dcca7bd98cf31623e7bc47cba8bf99c2ce673b798cf20319fe5623e4f88f98c16f3b940cc67a298cfa5623ec58e4fa9f37afac1bf69504adecf04f2465b58379e3f430ef8fd8167c9e7d9403ecf393e6edb298acb0ba2314b117bce13c794c73b25e0cdfb634b6ceb171c1fb7ed54627f5c9e138d196feb173c712cf3789709782b8eeb32278e6a31cb35ae2b3cde1502de8ae3bac289a35acc728deb611eef6102de8ae37a981347b598e51ad7951eef4a016fc5715de9c4512d66b9c67595c7bb4ac05b715c573971548b59ae713dcae33d4ac05b715c8f72e2a816b35ce3badae35d2de0ad38aeab9d38aac52cd7b8aef178d708782b8eeb1a278e6a31cb35aeeb3cde7502de8ae3bace89a35acc728deb068f778380b7e2b86e70e2a816b35ce37aa2c77ba280b7e2b89ee8c4512d66b9c6f5248ff724016fc5713dc989a35acc728debc91eefc902de8ae37ab21347b598e51ad78b3cde8b04bc15c7f522278e6a31cb35ae177bbc170b782b8eebc54e1cd562966b5c2ff1782f11f0561cd74b9c38aac52cd7b8dee0f1de20e0ad38ae373871548b59ae71bdd1e3bd51c05b715c6f74e2a816b35ce37a93c77b9380b7e2b8dee4c4512d66b9c6f5668ff766016fc571bdd989a35acc728deb2d1eef2d02de8ae37a8b1347b598e51ad75b3dde5b05bc15c7f556278e6a31cb35aeb779bcb709782b8eeb6d4e1cd562966b5c6ff7786f17f0561cd7db9d38aac52cd7b8dee1f1de21e0ad38ae773871548b59ae71bdd3e3bd53c05b715cef74e2a816b35ce37a97c77b9780b7e2b8dee5c4512d66b9c6f56e8ff76e016fc571bddb89a35acc728deb3d1eef3d02de8ae37a8f1347b598f9c6753b2a17da67afad0bdf11dedb826d3fe2b4fd88d37692ca2f11c3b67b9158b16759fcf627eab7b7fe740cd41fdc0b0debc6f38e14cb506db775da6eebb49da2d78b5bc027e1f8249af0498af9b413f36925e6d35acca7bd984f1b319f0e623e25623e6dc57c8a047c92e4912086d75b112bb5726b62e84f1b6265562e21d6c9ca6d8975a6fe83157bfce0504a0c0e296270e0fb1ec0a11331387426a71175fb5f1f68bc989629b732c7639095391e83adccf1c0bd89391e15d436187ef387e381ef28b72786dfd2ed40ac92caf83bc2ca1c4b7c37926339d2ca1c4b7caf8e6339daca1ccb6a2b772636c6ca5d88e1fb3c5d89d55ab91b31ac672031b4574e0c5e8388c17f3031f4730831c483ef9900d7a1c4e0cadfb787eb7062b8f7196f831e561e410cf714e7eff9f6b2f24862f8ad2efe8e681f2b8f2686dfe4ae2686fb888e21d6dfcafcdd34fc3e472d3194795ec2328d89c2ce4bdc56233d477ba5e4512be2d356cca744cca783984f1b319ff6623eadc57c5a89f9b413f3498af914b7a00f8ef7587799e313b2ed52a7edd2166cbb8bd37697166cbb9bd376b7166cbb87d3768f166cbb97d376af166cbb8fd3769f166cbb9fd376bf166c7b80d3f680166c3bce2d716e69a9b6e3dca239b75417bcedb1357cde038fa6cec95593cf9882fbd4d486e9674d4d7abda3a97f855a6f7a5da39c58d538b14a519dd114bf5101e25744ed62dd783ecad3f6eb89c2c662e441c462a4c767640bc702ed45e7e81c9d0f2de7d1d1b9459ce3fe1c9da373748ef373dc37a273748ece6f0de7383fb78c73dc9fa373748ece717e8efb46748eced1f9ade11ce7e796718efb73748eced139cecf71df88ced1393abf359ce3fcdc32ce717f8eced1393ac7f939ee1bd1393a47e7b786739c9f5bc639eecfd1393a47e74371ae4bb75d55f0b69737249db6119f84e3834755e05884e9e7beef328e48f8638cf6525487f7d31101fa5944ed62dd783e82b643748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1393a47e7e81c9da373748eced1397fe774db95856fbb3ee9b48df8241c1f3c2a03c722503f6bd27d1a9ef0c718eda5a80e6ff3e101fa5944ed62dd783e9cb643740eef9ca2d78bc927c07e587b30638b7d7a8bf9f411f3e92ae6d34dcca793984f99984f7b319ffe623e03c47c7a8af9f412f3e928e6d345cca7b3984f52cca795984f6b319fbe623efdc47cba8bf9f410f34989f9948af97410f32911f3692be65324e0934cbcf99c55925e2f26869cbf33b16156ee446ca895cb885538fd4fb321562e2536d8ca1d890db2721762e556ee4a6ca095bb11abb3727762f556ee41acc1ca3d898db5722f62e3acdc9bd8782bf72136c1ca7d894db4723f6293acdc9fd8642b0f2036c5caed894db5720762d3a88cbfd3ad5c43acd1ca6388cdb07235b199561e496c9695ab88cdb6f20862d877785fc37ba4e1c4f03e6518b136561e4a0cf34905318ce921c4da59793031c46d1031c4ad9c18e2369018f6c53a62d867eb8961df6e208631309618c6ca38621853e389617f9f400cfbfb4462d8df2711c3fe3e9918f6f729c4b0bf4f2586fd9df725ecefd389617f6f2486fd7d0631ecef3389617f9f450cfb3bf6a5f4b67d62ecfed7b13ccf4968a715b1d99ef66679bc50e6797826f5a9d1ca35ffdd23330f735b8df41ced9592c70c119fb6623e25623e1dc47c4ac57c52623e3dc47cba8bf9f413f3e92be6d35acca795984f52cca7b3984f17319f8e623ebdc47c7a8af90c10f3e92fe6d35ecca74ccca793984f37319fae623e7dc47c7a8bf9147b7c3a07f269edf8e079e71668bbadd3765ba76d3e7f349b18de6ff0399662cfb2781f89faedad3f1d02f507ed61dd78ce9f5f846abbc469bbc4d3763240db7cbe118f22e7792395931e9f7685f3a949250e3c6f8cf59716beef757c0ef560face9fab9515dea79ecfdf1e8c0f5f77952abc4f6da07e66aedbede4f4a9d4e9532a71e06737e867a700fd2ca276b16e3cef44db213a87774efb604cf2e76fa8d751c491e317d0a72ee9f8a41f4dcd097c6d6897c2fbd4f3e74407e3c3d78a85781f12a89f9939aaabd3a74e4e9f5289033fe7453fbb06e86711b58b75e37957da0ed139bc338f7f9e3b51af4cc411ac73589fbaa4e3937e343527f0f5fddd0bef53cf9f471f8c0f5fdfd6adf03eb581fa9999a37a387deaeaf4299538f07a12f4b347807e1651bb58379ef7a0ed109dc33bf3f8e7b913f5ba883882750beb5397747cd28fa6e604bec6b457e17deaf9ba9783f1e1ef24f42cbc4f6da07ed6a4d78bf373af270a3bf7f57162d5c389558aeaf077eefa04885f11b58b75e339da8bce2de3ccf30acfc9a8d75dc411ac67589fbaa4e3937e3435d7f0f741fb15dea79eafd13b181ffe3e44dfc2fbd406ea67668eeaeff4a98fd3a754e2c06b6cd1cffe01fa5944ed62dd78de9fb643740eefcce39fafcf46bd5e228e60fc1da9106385af8fc6fad3d75abf641737a77d7b126fa4faade92fea5cd0b0bfee3beaf6bb877a6f8976f138d8f79601f2f1bcdf5b723e1e2aff0dd0cf1a3ea758c8cfa07ce7cd7b38b1e2f3e6ec10ea9cb47b8e0ccf9b3ad71f9d0bef9cf6c158e7f796a8d753c411ac5b589fba7ccfb5f1e713013ed3cdfbf309fe4c37d467a801fa9999a3924e9f3a397d4a511d1e3b21ae23284a1cf8d97563e2c0cfefb01da27378671efffcf904ea751571e4f805f4a9cbf7ba0ace0f02e4e3f5fc7dbe83f1e17cbc77e17d6a03f5333347f575fa9474fa94a23a3c7642e4f9be735978de97b643740eefcce39fbf138c7aa5228ebef39a017ceaf23d27c6f97880f303f5fc9dd983f1e17b5c05383f501ba89f99396a80d3a7be4e9f525487c7ce8000fdf49dcbc2f301b41da27378671eff7cbf04d4eb23e208c6e7c9438c15be5f01d69f3ebf36c06e3690f6ed4dbc91eae3daf0d654e792fafd75075999afe7c775c0fc9d66beff463787f1f9a0c64461b703dac2baf1bc3339e27c40376270e37b8e747658c873059d1d6f3ce71cc6d717b8f1bd4ddcebb242e5ccbef3427c6e038ebebec08defab927258c8bc27e578f37d65e0e8eb0bdcf89e2e4987857c2fe4e6b878de971c7d7d713fc3e4f70d7c2e2cc47b02dffb5e3cef478ebebec08daf8de9e7b0ffe5672fa559fad295caf0eeefb0ffe5f1a8344b5fe0c69f750d7058da7b60206ff7bd079e0f2447b72f21af0fc0778bf0dda9569e58846abbc469bbc4b36ddcbc87b7177f3f07f1e373e1e556f6dd2b8bef8135d8ca7c6cc4fd92f87b60b8af121f8b70ff253ebf85fb34f1dcefde0f3ccd2aadcc732ddf1f0a7f711f299edb465a99df0fe27ee73c978cb632df53abdaca3c76719f2bfe6cbad8cabc3db07ff0bdb7f0b927df130af7a72a2786ed3b8818de8f0d2686cf53f99e5578ffc6f7b6c2f6e77b60216e7caf2c6c7fbea716fa5e490cdb86b701f609be9717b6f54862d84f4611c37e329a18b60ddf430cfb22b601be5f18ea33628c253c0ee633e254e2c0f7d470c7eb7c5e22c467b7be6b5fddf7b97ced2bdf5b31c475a5858823df6f31c4f9549e63b16e3cef4dceb97225dea6458930dbb4b5e3d28d38eaecb2dcac5322d8761dcb0ec54e3cf87a890079520de749ad1307e61b1c27d4b98df25dcc7bad6cb9dece729c1360dd58a63df194b36ec43a403ebb92bddb38de1c07d4b98b9c7cb902e625ac83731cfe2c25546eeefab87de16d50e2d449527f51e741671b04c8b956720e806de0e629ada9ce23ce3670f3073e36a41f9caff179a10079585d53db00ed71aed6d436409da79d6d10200f5bc97981bb0dfa9313ea3cef6c0337a7f06d03f487738a00b9597d53db80cfc1a25f4d6d03d479a7b30d02e466996d506eeb72b7c14072429df73adb001c5ebe6d80fea06e3b2a37260ad69786a6b601da2ba27e35b50d50e79516da06c80d9ada06a8f3aab30dc0e1e5db06e823ea863c07972dbfe5f8e2f8f4693a07bdaa61bf2fe62dcefdba394ced7c73a0f747f5bef70b78efd289628a3a5f76f6d900dbb93ee439f301d4a7468a33f71575be41fbcfb7acccfb0a1fe37fe9791d8f83bd1ea5bcf07daef18dff724fdb83c9b5406dd772db45f60fed80f3dcf30b7aef8d7a8807625d6e7fd36304f317bbbbcb7573964b519d819efe37260adbff72c7a7dc714e6f93efd27e86fd28e4fc3330e18f517b8ad1402ae32fe6463ecf87d779de0cf59dd36c9fbff07900309e4b51eeeaf1ee2ae0cd9fd3f1f57221be9fd5d47c8ff678beff570bcdf7a13e4372e7fb6e9ebebef11e9abe57d2cacabcaf74a6b875f1bc8e479cef0f6ebeefdcb0bfae3b6f23d6e5f6f760e7fb94b39ce27c5f42fb19f6a390f3cfc02c31f2cdf77c7d1c7f4f23fde0cf7f437faf88cf2960dd78ce732518cfa55c76bd4b05bcf9fc0d5feb17e078dfe47cef3b1f38c4f6c7d0f37da8f736ee7c9ff2f415752a691c56d17ceeee53e9d7277a5ec723cef70737df4f6862be47accbedefc1cef77d9de514e7fbd1b49f4da4f93ed4fc33304b8c7cf33d5f9f89b9913fffe6eb98e0adf0fe9ee75294fb78bcfb0878f3b9627e7f1fe2daeea6e67b3eef8d3a47b7d07c1fea5a2b77beefebe92bea1c4fe3f044cffbf76e14b7a5f1fdbd37def9ccf7a73731dfbbe765de4aefefe7d17eb654ecfd7d6f62fcfda1f483afbfe07933d475a9bd1d6f3ce7b9d2fdcc9dcfe5878ca9ebe65eafc0e7f14b9c3a58b635d5399fe6d9a4a72e5f6baf762f0b3ef7576c7ff93a253ef7a7709d12ff2676a8eb94fedb38f2ef6487b8e75b5122fb3def7b9273aefbaeb4e4754aeef965be4e69bbf33e25c0761dc70ec54e3cf83aa500b9eb01f724c67b99ce4edbada9cef5746cc5fc8deb94dc7b5814250efc7cab3171e0fb50f04eceba11ebc2dfdfa5b68ebddb38de1c07d4b9819c7cefb9312f611d7cde9ffb1aea9ebdae8fdb17de06254e1dbe860c756e77b641e1ef33515be7cb15dc7c8f7385bb9d6de05e0f51ecf427dbb56201728cbaa6b601da2ba27e35b50d5067afb30d0a7f3de9be6d80f75aee36e0f711a8f3a8b30ddcef39fbb681fbfd8c50f73e686a1bf03d27d1afa6b601ea3ce36c83c2bf17ddb70ddcebf5dcf3b37cbdde0bce3670afd7f36d03f79ab9409f793534b50d9aba5ecfb70d50e75dce36287c2ebf6f1bb8d7ebc1c597cbbfec6c03f77a3ddf3668a1ebf5c636b50d9aba5ecfb70d50e7c32db40d902736b50d50e763ce3670f350df36401f39570ff53dd36cdfc3e2f8e23dc2672867df3b76bf2fe6ad5cdf4d0ef5be22dbb562fc5d41df779351c6f7798a136fbe6f58632258fcbde721ddcf13f9bdc5d75ae83c64a87d8daf27684c1c98f381a3ceb7695ffb2e9d6774cf63a75fff8de7753c0ef63c648039aec637570cf0b45d4eae056afb80735e380f8976f89a56947f4db912ea211e88357fc7d5bda6d8b75c3767b914d5e9efe97f6322cc796fac7b80e39cde263fa0fdec3774ce2cd467affdb3c488c73deaf87e138aaf2bc3f8e13936d47766b39d5be2f3a360beebcaca3cde6502de7c1cf05d1fc1c7863e4ebdc644b0e39af7d880f639f77f236fb3e371e86343a863b87b6ce8e6e92bea948cdd1f977656e6fd8aaf41ebe9791d8f786c38b863438fb1fbeba21ee28158e77b6ce8e12ca7786c48d27e86fd28e475f7fdb3c488e758f75e1769867994ef4180f1c373ecffeabb1a29627caf1af77e3aec1dfa77f30ec63b9fbca1b353af3111f61c927b6c40fb688f8f0d552d746c08750ccf9637705f51670c8dd95a9afbddfd2f1337cfeb78c463c3c11d1ba637716c40acdf8a794303ed678d746c28fc67104de70d3cc7a20e5fbf807994f3062cc3736ca8fb4064bbff1a3bf27c8bbf2877f7787717f0ce76df3894f9d8e07e1fbf31d1b2df5544fbbeef2ace6da16343a8f74cd9f206ee2bea9c4c63f6549afbddfd2f73fd8ce7753ce2b1e1e08e0d6737716c40acf33d36b8f986e2b16109ed67abe8d810ea3aacfe5962c4732ceaf075639847f95e635886e758a56bdbf83d792f8f774bdc2b3297371f07f878e1ded7b59896e1e358a0f711de6383fb9d1f3e365cda42c78650ef99dc6343674f5f51671b8dd9ed34f7fbaeadbcc9f33a1ef1d87070c7861b9b3836b8e7860ef6d8e0deef45f1d87015ed6737d1b121d435a1fdb3c488e758d4e1cfd6318ff2bd59307e788e0d754ccbf6fe9b3f3374cfb9f8cecdf0f9a3768970c701de867cdf2dbe2f20d7e1eb9650e7019a6f53d407befe796f0bbc9fe0eb761b136fbebe93cf9d953875f8da5dd4798cfa95f4d4e5df390cf4bd84cc75dd8312073e9a9aabe190a2e5782ce075bc96f61e5278efccf618ec38e2f9107204e3ebd702c431e3d3c6f169e3c42c64db6d9db6dbb660dbed9db6dbb760dbee75a4c9166cbbd469bbb405db2e73da2e6bc1b6b31d835aa2ed6cbf71d8126d7777daeede826d67fb4da296683bdb3de9f9588047710bf8241c9f44133e83c47ccac57c7a8bf9b4c4713a1f9f1e623e9dc47c3a8bf97410f3498af9b416f36923e6d312df03cfc7a7bf98cf00319f5e623eddc47cba8bf9a4c47ccac47cda89f9b417f36925e6d357cca79f984f4f319f2e623e5dc57c3a8af9f0bdc3147c4ac47cda8af91409f824136ffe0c833f9b282686cf0a5a11abb0726b6243adccbf6180df34e3df11c06f9ab5255699d81f1330fca6597b62f84d33fe1dbd9154c65ffca6197faf74b495f9bea5d556e67b34e137cdf87b473556e6fb2dd45a99af81b18fa20eb82edd6e3b74c0fdb1edeb62075c5b691f751d70dde2382bf3f5f9e3adccf75f986065beae65a295f97e8393acccbfad876dcdfb06b635ff9e1db635ff9e1db635ff9e1db635ff9e1db635ff9e1db67525316c6bfe3d3b6c6bfe3d3b6c6bdef6d8d6fc7b76d8d6fc7b76d8d6d5c4b0adc710c3b6ae21866d5d4b0cdbba8e18b6753d316ceb0662d8d66389615b8f23866d3d9e18b6f504623857399118ce1762dba7b7c5f727ec7f1dcbf398473b3ce62779da9be8f14299e7392cd39828ec3cc76d35d273b4574a1ee3457cda8af99488f9948af97414f3e92ae6d345cca7a7984f3f319fbe623eadc47cda8bf9b413f32913f34989f97417f3e926e6d34bcc6780984f7f319f81623e6dc47c5a8bf924c57c3a88f97416f3e924e6d343cca78f984f6f319f72319f41623ec52de883f36158f744c727ddf6b8c2b75d935eefd882af7779e67ea7385f89ef85c11fedb5a63a9fb11771cf4a7078e11ce238da3e880dea16d3ba793b15531dbcfeba71771d8d16ebc2c7a4a636bddefa82af775faceb9c58c3bf9e628d3a5f75620d9e70623d96628df8f0b96abcbf1b476d7fd39e04da5f97f1d8455f5d8fd654e73fe3f6d7fdeeb8fdfd196caf0fa2fe54382cdd87a185ef4366bca32dac1bcfd15eda119fa15490cfa0403e786f8cf9b08d2716a1da6eebb4ddb605db6eefb4ddbe05db4e3a6d275bb0ed52a7edd2166cbbcc69bbac05dbeeecb4ddb905dbeeeab4ddb505dbeeeeb4ddbd05dbeee3b4dda705dbeee7b4ddcf699bbfa3399818e65cfe1cbbd8b32cce41a37e7b6b2bdb310aef37f818553c7e7fddbd13f6c724c0f1732cbb1527fcc7cf30ef53f6dd2b80dffb35523b7cec7ee3336d134d2f87cfcdf15b2ae39de5f87d0cd68d65f85e0075ceba719f8900eff732f76d47ffb06eb4c3f9073c4b12d9dfbba14e27c7bbb6e0defef79370a9f5c4b21b3935f57e12eb28a5fea36e98beec9b035c1fb72fe93ab856a3c4a9c3fb14eaf475b6c198827befdb06b8ce04db002e63c80975063adb001c5e939cfe94527f50b798ca35149b625a0eaf237faa71d65b94f0ef0388e758aa8775351573d4a974625e4deb6e84f37ff7a8e36bae12e49970fa92706291f6195d789f7abeceec607c46934fe1f7c97df96b807e66ce41e0daabd70bb8de74ac463ab1aa766295a23aa3287e2303c4af88dac5baf11ced45e796714efb60acf3f57ca8572fe20836867c028cc126cf418e0edb764d3aeee54e5be963de11e3f7b71be0fd59e6de647ceeaa913cf87d2aea3c31617fdd39e6564aaff3359b750e6bc9f737788ef64aa93ffc7e2bc07bfc03f623e45c133db108d536fa89758f156bbbaef06dd704dab732e303f38efb1e94f300d459e4bc07058717c609bf07456c787e0b314e02bd67ace7791c31827f35c50875ce7062343a4b8c78ec22363c0f8778ffcbefc30a1da3914e8ce03f8a62843aab9c188dcc12a36a8a917bec0c79dce61ca6919e73db01ceddd4f2773d12e49070e283c7b8c0b1e0ef991c8c0fc727c07e56cbdfe939181f7e1f5a15c867541e3e55e43322904f551e3e23c8a73290cf883c7cf8bb5ec303f954e6e10387f4fb74f7589f66181b638861ffe4bc08fb4803316ca7f1c410ab6262f0c57998526283ec2f6f773ee71e620c16250edcc71ae9f92872445faac2fa4c601ff77c378fff10d756f0b10be7a4c7396df371ef763adf8d7dab559618facea563193edf3dd6597727a7bf388615a0bfb561f2b4b19938e23b816d9c78700c50e71ea7afc3023805ca4933e367a8b35d4778fa8a3a0fd267470f59998f839514b7173dafe3d1d43c87f8a5fb1ce07ea399ed3b983c1ba91d6e7b32b916a8ed03ee758a73d76807bc35955fa0318a7a8807620df7f43c87cf05d9dd5d6ea4b35c8aea5478fadf98286cff87383e431ce7f4367994f6b317e9bc4c88e3b0effa18c4a88a62843a3c978d7096437dfeac07dba9c4a983655b539d77b7c05cc2631efb3f5c869113eabccf712afc354afbe6b7c2f7f5c06deb1eb7b8afa8f30aed771fa1f90bdb8cf3ca2f795ec7a3a9f90df10b745f851a1ef3d8be833d6d4f21d702b55dcb6d637e433be0ada9fc459adf500ff140ace1ced7a8b1bbbb5c95b35c8aea0cf1f4bf3111667ec7ba073bcee96df231dacfbe44f35b88bcc737e7ba73508aead4536cddeb09509fe7378ca712a70e5f4f803adf70e692c29f27f0cf6f70e1f7c7a8f39d169adf429d1f72e7b74a4f5f51e787b4dffd98e62f373f4abffe27cfeb78c4f9ede0e6b73f3631bfb9f3d4c1ce6f239ce514e7b79fd17ef6a71678ff36244b8cf8fc08ea8ca1d8ba9f19f8aed571dfbfb99f21f0fbb77f3a7349e1cff3f9e737b8549113eafca785e6b710e7349b7affc67d7da30e7d665a42f78ec1361b4171ebee791d8f38bf1ddcfcd66dc2febab9e6a9839ddfea9de514e7b7f6b49f75a76b685beafd9b3b07f1fc369a623bdc590ef5797ec3762a71ea60d9d654a79ff5157349e1afcff0cf6fc39dbef1fc56ee38859adf425d0793edfd1bf7f58defebd07e379ce62f6cb37a8adb38cfeb78c4f9ede0e6b7b14dcc6fee3c75b0f3db186739c5f9ad8af6b37134bf85f89cd037bfb97310cf6f0d14db4a6739d4e7f90ddba9c4a983655b539da92d3097f098c7fe0f173e178f3a331ca78a004e61fa7ae0b6753f5fe0bea2cee1b4df1d49f317b6195f1fb4d0f33a1e4dcd6f81cf71d7f098c7f6f59d5f9f4aae056abb96dbc6fc8676c05b537901cd6fa8877820d670e7efb1b2bbbbdc7067b914d519ece97f6322ccfc8e754f769c33d753d27eb690e6b750d7ea0dce12a34a8a11eaf07775dccf17509fe7376ca712a70e7fbe803aa73973c9f882f7d73fbf8d70fac6f3db192d34bf15beaffef9added357d4398bf6bb55347f619b0da7b85dec791d8f38bf1ddcfcb6b189f9cd9da70e767eab7496539cdf56d37e7631cd6f21bea7e39bdfdc3988e7b7e2c4fed816faf385ad2d3097f098773f5fe05c0e75b63b4e85bfa661dffc56f8be1eb86d31bf8df1f41575aea6fdee5a9abfb0cdf8fa903b3dafe3d1d4fc163847aae1318fedebcbcfa6916b81daaee5b631bfa11df0d654be83e637d4433c106bb8a7e737cc15ecee2e37c2592e4575267bfadf980833bf63dd531ce7f436d945fbd99d34bf85fa7c61729618f1e70ba853436c9095f93ef15886af8d0c352fbbf3abefbc2118bff7087c5f8003ee898575bbf705e06b0e4b9c3afcde0a751ea37936e9a9cbf70bcaf63daa5a8785dc36680bebc673b4c7dfa3e2e3a1bb5cb995f93bd16e4e50eeac877382179de353e1bfebb1effbe5f97c6fe51de4c4cbc26b92d39f16fcde4ae6fb25a39cbe947bfa823a2f3bf10df19d97407dadf55d533cd6d357d4f910cdcb1fa6e33bb6137ffff18b9ed7f168eaf8cfd75107381f59c3e715ddfc95db1e4eae056abb96dbc6f1df77be12e52fd0f1dffdac07b1867b7a8ce03353767797ab75964b25defc996bc863ad7bce6384e39cde26afd27ef6453a5685fa8ca62a4b8cca2946a8c3df2d0c75ec74bffb090f3e76663b06f075dda8f30d9aa3f83d01ff7e8cfb1953a0b9ac96ddb16e3c477ba9c49be7fba4a78feef7bafb06f26de3f8e239ffa660a8b6db3a6db76dc1b6db3b6db76fc1b6934edbc9166cbbd469bbb405db2e73da2e6bc1b63b3b6d776ec1b6bb3a6d776dc1b6bb3b6d776fc1b6fb386df769a2edf282b5bdbc21bdde0105efd3f286f438ed9738f0d1d4fb3dfe9deafe05f7a9a9ed60eb4e3fce5ab1feb835eb57ac2b222fb8bee6b816250ef4c6eb9d881553b9152dd7dac34a3cac9d8775f0b08e1e96f2b04e1ed6c5c3ba392cfde841e59e54ee45e5beb40edc7fdc1717d4e1f8b57a8b70f7916d3f0933be9abebfee8016683bdbfd755ba2ed6cf7d76d89b6b3dd5fb725dace767fdd96683bdbfd755ba2ed6cf7d76d89b6b3dd5fb725dace767fdd96683bdbfd75d15e92cafcfbad381fdb9f58b16759cca3a88f7bdc1ef0682c60877842771f7cb09fe3a9778ef5001f52cc5dbf66edb2b35694af5bbd667d794df9f9fff7ffb2d5abd76c5cb1bcba9c5f5b577ede8675ebcbd7ad5fb6767df9cab56bce2bafade6f576b188e0203a63edda659bca579dbf7cc5c5e56b36ac2f5fb3b2fc8c351bce5fbe8e17ea670b21eacbd6af5f71de05ebcbd7af295fb67c79f9c655ebcf2e5f73d18ab52bff4f88977b9f7d9437e8cdcb9db761f5fa5517acde947de10f5534c3f473ff4d8baf5534af9b5f6b8ee90f9ad9d8adf5ff450fefac6f86e903f5cd337db8398d3dd5ccc69e6b4e63ef686663ef694e631f6a66631f6d4e63af3567a17f3667a1c10dcd58e8a8e62c745e43f302789d2dd7ac11b3a739a6b735d3f4aee634f660331b7ba4398d3dddccc69e6f4e63ef6c6663ef6d4e63af34b3b1579bd3d8579bb3104e3ee7b5d088e62c74527316dadc9c85ee1fdbbca83fdacce53e3dae19925f69ce421decd38166cd3a65e39bd7bdaee39b61daa7998d0d684e63c39bd9d8a9cd696c5973163abb390bddf6df6cedbb9bd3e2bb9a19c8979bd3d8d79bd9d8b79bd3d83f9ad9d8ebcd69acef84e635367042331a9bd2ccc61a9bd3d8926636b6ac398d5dd6ccc6ae684e638f36b3b1179ab9dcdb9b23f9dee62cf4f53c0c13ff0f8f97b7576c8b0900>, - "metadataHash": Fr<0x1125672f40d49b4b192a803a41ccb3ddacec4da05bf7d535224059fa9bf766cd>, - "selector": Selector<0x511c8a6f>, + "bytecode": Buffer<0x1f8b08000000000000ffed9d5b8c24d759c7ab677aba67a6a77b76767766e7b2332e2305450a123dd3b3761ce5a113040a020564a3480829d12ebb0e8e8c97d863122362c4ed21912081806c88201188f0406cbfc00b029470110e128ea548e422140b2c0c444402e13c6615576f7ddbbffee6abeaae9ef3d554db53d268aaab4ed5f99fafcee5ff5dce39b5e8f6b1fcda5f2d3d5f50ff79489a7efabf7bb2633fe0bbba9e386b3382736e4670ce07c499609b8f7ceb69dd41aea1312ecc00c646e0ef2e18ebe979f3b5bfc5d7fe96a2d13eedce11aa203a530a2c6984f3e9fde4a334703f0be85bf0bc1cff8ef3adf4ff3b1e7df4ea13f1438f5cbff1e1f8e6e347f1cd07e36b371f7fe4fa637cf0bfa77df07fa77df0c3f3533ef8db78f0eef4ffd5a3a31b3ffb7347f1d1cdf8b1c7af1d3d7af5a78fe20f3d74f433f1cd9fbff1e8830fdffc105ff0f4b439ffff4973feceb439d7eb533ef8fd78f0f271c857af5fcf46fbce69337dd7b40f3e7a02b4bf3a6da61f9df6c1cf9d00eddf4f9be997a67df05fa67d90acae6831b717a6ccf4074f90e9d569337d6ada079f9ff6c1574e50cc071b5366fa678de933fdab6933fddb691ffc8f13a0fdceb4992e36a77c7075da07ef6b4e5fcc07a6cdf4c91364fad16933fdf8b40f3e7302b49f9f36d37f9cf6c1178a3c7887c47d357d6a116fea478148e85bbbd71a7839496872b4a2db449400926b425a6ab82683c91cae495f36bf387c45237c190e17813dd87b5f23e8ad61b1efe06ee15cee25796fe35a3d7c19ef5d843c83bdb7eb26bb816625f211adb289df22aba5f43ca075649f79d7d2bf25e419a5df48ceb79056d2893ce6f08d93a31d0dbfff52ce735ab1eb204dc3287f3f0a5bfea6c2d3549817524cc9b196dc5f1cca45b0b5d2f35b5362bbf6d6836bfb37f6efbb72bd7bf5e0c12bf75def1d5e49deb10c0c521724af3aeeff39d2ed0197c82fa4458ded2b745d6ca26c35e0673b98c3b70a93f7fe21fbe50865e3d1c7f91cf0cc07c7d3ddf729e7ed6fb70cec61de7be54a22ab9692555dc9aa8334c4d072905f0df9cabbe577cbc83b9c2ceeb991e4bd32812c560c3c2b25cb62c5c83ba02cae2579b7279045dbc0d32e5916925f51ccad0a605e54e761f2bee7c15a341cfbf264d131f0744a9645c7c83b9c2ceebd37c97b750259ac1a78564b9685e4571473ab029817d57998bc0f063cfbdc04b23867e03957b22c24bfa2985b3388b95d01cc8bea3c4cdef71e2679af4d208b3503cf5ac9b25833f20e38960c38e2f9096471dec073be6459487e4531afce20e67315c0bca8cec3e47def7d49de172690c50503cf85926571c1c83ba02c06e3dfc5096471d1c073b16459487e4531afcd20e6d50a605e54e761f23e1cb4bff50964b16ee0592f5916eb46de016531e0021b13c862c3c0b351b22c24bf049fd8e43ee58a67ff4a4be1498e3c1b9c6068e17c0e182f05c7d8edf2fb5c425e9be1f3dab7ea8bfcde74cd7b7fe0ebd80e5fa6c118b493be4b7c1ddb4699c44719dabebc83f7d6908f5cafe3fc69a49574220f69b7823dd161c4377239e7b90df55c0769b68cf2f7a3b0e5df5678b615e6e49bfc067078d4ad49ea75c249ad7ed9a11f1cd8feb53f77927ec7a98fd9772a67973e8569fd54d651c37713cc4d25ab0ed2b08f3ead7ef30cf319e62ccc8c6568e29af883a5cd277de5d7e787781dfc5807c93b97a3d123af6f72f645f45ad1a89f6f1c1edaf63c7c5b4ee5ecd28710baafd4f6f8969255d93e04edeb92df793e8433cce1312718a4adb7f05fd22d57046399bedaacd89cb66fde5dc6e4c9fb93df5f46be0efd598f7114a21f2d2879d791e6979bc3b45f015e1d6791558fbc7cb459f5887ee2159c0b9e65273c526f449f6c1ab2081e6fd91d8db709f8de1e652cf5a4a1ca54479a97d3fff4cb459089fe5e527fe49dedc86e7b1edfcba95ef6382688cc047f07329334df1c23b3acf1651972d2fda753d90e9c7ca73dfa2f45661d25973ad2fc9fbaa765b6962133f60b222bdaf23d62c49277ae18182385510e726b0fdf6c516e4df978f8cd5bd1e8f71a87c7db8fd88a8ed7ab3c3cdebebc5634ea671d87c7db9fd68a467d9de3f078fb5a5ad1a81f6c1c1ec1c0d848c6845bfc5dea27f9a9d491395c93ef348f6b222bc6715f00ce7e14440edd2c9faa477f5d54e6de6dd6a99c5d6b2cb9a8cac4fad14439bde26a74cc93fc5ec3772882b93d8398572b8099752e0e9677ef1e271ed24b64b60cb9b6947c592e07bfc041511e44ff87c7b8e1e5ff48ca744995694595a983341c173cfc3c79b6e84bf80e4530af550033bf5f1c2cefde15279fc081b43f91eba6922fcb253eda9036617eb744c7128e427f30fdd681f21df1078b3f5cf2113c75a4797b6d88f16de939ed64f48bbcbb36c4eec0750f18f311a10c3cfa38f7e6ba4ee5ec5af18b1baa4ce4b2f328a757fca28e6dd3dcb628e64b15c0ccef1787cbbbe7c4abeff45922d7f34abe522eb64fb9a6dba783cc07ed93717fc9719abab15339bb56acf5ba2a13f5cf3994d32bd65ab73d1ddb5c14f3420530f3fbc5e1f23e74d253eeb44f91eb9a922fcbe5e1674ede710edf8f768fe4a8e3fed318d7aff9f60bbd3752bfa0f566ab8d95699fc86a6379ba7e1ee632ec13a13197619f1887d9a72fbb6d9ff0b029eabeec9c922fcbe5e1db6a45a3beb6e4c8eb3318cbe1b1d68d5339077d865e3740c7a7d0364efb84d7ba011d85477eafe03b14c1bc5601ccfc7e71b0bc6fdb273c6200a5fde939da56b91cfcf10745d746614c85471feb54ce41fb6ba832d555993a48435ddb217664509797151ef9cd757d8a605ea900667ebf385cde3d6ffba0c87553c997eb9d6da86b09a7fe9b334e1de2bd679cbaa298cf3875f1179f71ea91e38c5347679cfaf871fa9c9a63ba5cd363ba87fdb0681c8fd50f06c4b3ef544e734d26bd968315d3e5d42fef5b639f5e9ba728e68d0a60e6f78bc3e57de83417e540c7c4e89860ae77a5c7d0a47dbe68f89f43dad7d91f96e1bfe4d1c739f9981ced8ae1d9a8189e858ae159af189ec58ae159aa189e32d6882a82a756013cade8383f613c3ad74a953e9cf18e73c6fbc4be467dfe2f9ac3fb3226cce11991cb3cae696e4f0cab06d60eaec998b262bc8f72f79a47c7bcfaf8cdf9323585f1b4f19caf189ea58ae159ac189ef58ae159a8189e8d8ae169570ccfa572f01c700e73045c3cfa38779ed37fc0f166123cb4937acd672c62d3e37c468f79bc45e7333acfc5ee155d4b85fe2a2f9ba7d79c73f151855ebb644bc94afbc03a48c3f5dcb61ce467f93ee537f7a939c3ec8f99eb8270cd09ae1f50058c72ade98be7b0e858c5b91e1e7e79a77276398744dedd36e46eadf1e8b0bee4bed576e437e7ba9c61f6c7ccbc4f300ef5f405ce53ca93c58e8167a76459ec000f397372b414de2a60946be43ee1fd7ab7ede7796b6fd502e7253c941cdca13f3c28ca799dd77cedb18e4d82e732f078d443a7720efa845d5526bd1e6f0769d83fee3a94b3161d5ffb577eefe23b9c61f6c7ccf62f585b48d7aa0846bd16b5139e8396c2931c797dc22ef0dc151ecf802bef16c07317f0ec85c7b3ef54ce411f15ab32edaa327590866d277628670df9cabbe5778cef109f61ae1ce6ed0a60669f25585b4877b92218e5da9e339e96c2931c79fd586c602417bedb09635c00e3ddc025cfadfa62ec32e64ede9ff8849e9a1be6eb302e0ed63adc437e7de090fcea48f3ae8561da4fa5d8dab8cf357c77d4354fbd5cebc65a0f6ea33ce41a5e7aa7e68b3a6ff2b3bd8aca8cf6845dc851ae914b6a3e4c7b7c3f30ee2c9d7e1318a50cd435bd6cb059fb8bd0cea1796ed564463b88b5bf4b8c6bf20c39e93ad2f5c3e01e7047eec914236fc9af168deea3c0b2f25949f397699f95f45f5f9c1b96dd6a8bd49ba49c55f83e79fad32cd42bb6c5381c9e2e39c59651f6d0f6b558959575ca6a3b09968df058f66baa8c6c3782816de005b4819bf3c7e5d48fca190b5947acf6c7bd49b4fcfa918ffce4dd7a3db40eaed136e0653bc91a53c6b57db9cfb6ef612fc8fbae7bc028d72cff481c0e4f97fd9ebc3fa9df2f19fc3960bec7f8731c1defa7c99fe7c19f5ff6c53690c99ec292e4fb0af2dd7192c9ae9289e0e09e7392e6b9fa30ed37d17f52bf96ffdbeada69f23a7261722639bf0bd7f2781479f4babac6b91cfd286cf9f41ea57a3f52c6015afb84c6e1f078ad4975f806995376b89ae2dd54e590b2d78defe8359666cd5be6582aed976d9c7b9b0ac6d3da0fad836bd4d92f2bb95267679bf5e205593a3b79815c636cbff445d4ede3f49c5cd9c1d67050d41f4baee0d0f7f5388e4c8287eba87af5091eeba8727c0f1d13a9b9dfb69215b99fb36f2f77add33c1fee19e6f0982d7d9f63f056453096b416ee080797f7273cf7cdd0bbabc0c11f0707ffbe141b39386d61966dd56b9ccee2e0b4f55a1c5cdbeeaa664f684776dca2b71c6b39729c757d24341e6dab2b33ef2c9eb70e59c839fda856cc8fde63c38bc7e4f5bde4a272cdda0f9e6d54efd37eda3e1cb9463d46646fd5895a408ce4eb960e17473e6396bc3f1917ee9f3ffe1d02e6dbe377d06316edd892e60063d67b3066cda22f7a56fdaa966d6b56edf96736f591a337a9dd807ea459b5db7acd15726aaf3df21389dbd1edb58e344fa4df276b8f526d0fdb3564a6c73f27dd659fe3cf0ecaf864c574a697e687697f658af1c7abfe678d3ffc96938e3f5a27386d9dc91a93e43cc6357986312a0efafd88de22f1ac7adf1fdac41b699a8baa6c75a4f9644e5b9d8b8eeb21fd6894d387b4f5717e523f0adbd624ee53c71dae422692e6f77264c2f95afd80189dca3eb2577c3d1aed6f597649f387e8673e939e733d1ffa9f9f33eecb9167e3660caed73ae34de0ec47c7f721e73ce0d0f1314dbcb7161d9f135dc7f9b3f3c3b47a7eb5c89afb9dcb1a2079eb93afa9e7382fbb0aeb9327dfe48f51cf9ec358ebb57ee34a868cc8d1258de5cbe2dec9717a5ec6bc06ae89d98f46f75d153c32ce4b9918835e867f53f292776bf950665c2fd3eb5b6f29996da9bcb3742fb94ffe715a7bec727d53e739ac876fa439ac5aeed6dc4a49c37547bdea6ad6bcc5bcb570f3302fcc20e6f3338879bb02985bd170ad3bdae0653d3eeab35f0757e3da2c724dc6e6255c9b4bcf9bb826eb3e323d753c192f6b2aff383a1e1f58479a97c107de92da5ab3ec3b558a95a72e6bd929a9df6ea86b65f893e4dd5a8fa32e4b9d57ebb2f4fdc4c0edb057e4884f477885d419ee7d2b63a4e8b7724fd2d691e6d51c5dae1d8d7226f9afd7ac77d2f906e5e57a72fde8f89a1d6d60e77aacabaaccfd14673b3cce1ef9f382c249dd52d2dc1a63ffcbe2e27ca7de278065bea8caecc0d172cbbc669479a19e5de6c5c865df889e273fd536036bdff23beb91c137b6929ed3174c3be78e715f8e3cce49bdd561adc091bdc9e47b378dbcebc01a28ef91b5d5c46620f9c8f53aceb7ebc3b475252f91b5604fbed132de91f5dc45f55c273abecf19cbdf8f7c6c26f26eda4a9223f926aba867528f3cf9d772868cd8476bbb12f571c64254694ce1da50964e4c7e65e9c45e3139593a31e30fe51a6d0bc25568cb89d373e12ee4955ebe24ed534ddead7d3ae4948d289b174b9a6eceb89235e7e649f887b42fb48ab169797e96598a0fb3e2a4dad1a82f2839122ea3396b3f72ebcb7aec13646c93fc25bf3ad2fc404e9db3fa17a97bdc8bc0dabbcec36f42aea2cbd641d924cd0f8fe1691efcd9b3afe7de0bc97bb78cb24b9a7763fcfc71f030f9468c877a9f715f8e3c9ec67568cbe669ccbb0a3cedbd393c4d645d94a7adaae7aac8d31e403d7bdf29f0349111fb014943fbba5eb3927ecc32e257b3f614b3f600b5781ac7718ba779f993b3781a79a6de9b6d9c2f8df39e1ce67c1e8b174edebda7f0d06ea6b919e7364a9ac726e4669c8b71ffeb60be838e959e05dbe61cce35e772e090878cc3d13127ac4b92e6d7c6702e3dcf55c7c7917b729e91c77ed86c4bba6c17503649f3b1319ccb63de6519fdb6b68db1ec92e6e3180b7f0b9c4ac7030fe26d8cfb72e4712ef69d0e7d7ed78a9f5a35f26e036ba0bc47f6c615ce25f990e3caf9a7c1b9249dc843c73dd1b64eecfab94df51cf762386794bf1f9563cfa1def33ba8679f01e7f29a77702e43461cef250dc77badeb73ece098e7b5565ed6d8c179f7728d3e5ec67d86c4c3313879f79e924f1e279167c9499e99909350d77bf38cc7d3677192598a27a6bd88f3ace4daba51be0b46f9bcfc4159eb6cac01a39e7f57b29debb0a89deb1f0adab934bfb2ec5c94c3389fb2973e9c355e70ac5b57b83d6d8f9a3b58df44d2bc38e69b7454d9749d6b47c7fd1d51346acfb56c935e3a4056d92f1a65ffca189eec60433c2cc39fa36d932cbba4f957f0976f8cb14d7e6b4adb2463bf1dfcf15ddaa2e47baf1879333e3c50de237630e1c9920fed8a72fe3fe0c9daa627b216ecdc1393d8f573abeab94e64db663df6fab3e24a5614e6e49bfc1bead9b7c093bde328b48c68e39334e4c9d69a55eb3817dc5e3c2ccbff45ff825cb3d6ace27857d535ab680b16fe65c5ac730ea2971e40bd2479b7a507e8b8373d6f9e76875a1a083c4e0fe0bc4e59ab91f30a19cfa9e72b4a5de0bafff473f7d3f3eec98e817cf6f05e7e676bddcb25ac7bf98e85e3657a3dccd5af9a6e93b7c64b9e6e935439ddb7f4a3514e167a8e61593e762997a57bece4b44faf79909e3a076d71c97b778db2dfd9e70eedf37bd273eab39c63b86fdc97238feb91db97cdf5987715b85e776198567336917551ae77413d5745aef726d433a94765723d9111799da4614c9b8c3d923e8beb7971a62cae47ce24d7c899ac3974729fe35215fce75c536412ae47ee40d9c781cbb0170d8fe4dd7a3d6ff2864664f32ecea3f9a131bc4f3f9bb56e793f0a3b3616d9f7e747d16effb431c4e6c0cb7a5c73478ebc71c57baf5ba7729a7bcbebb57de89fe1ba5fa765eb2f8af95c053033ef70bcb57768f1704b169b069ed38a1ff16ab39485ee4fe8139334d772fac43cb952bfd1fa38f51bea93555aff907a19fdf45ef6deacfa60719dcd8acacc5a33923e1deae016d7f18ab9cbe23af43b699fdc69fa03b3d6afaf92ccc80f2d9f5e0c8c8c41e907c4c8fdd8a947af1978b8be541b1803e1e9693d3e563804a75c9b8b46fda47c56d27c1b5ceed7618b239f9632e9753b42c97847c958736c6bfe3adb4e1c58c65b4ac69237dbedaa932c76952c241f8b73c9f7b56cad92e60bf8be9fc8f9be5ccbee9378e6f3868ed58fc2dafbbce6076b7b9ffe8eb4f73d7d4af63eaffe5fdbfbb68db24b9a3fc0f7fe34ec7952afc8e59e35eecb7166ef9bccdef74c8ebd4f645dd4deb7a39eaba2bdef8f50cf9e45bfe2a50bb6336444bb99a4e19abac2736937b362ec4e4b6fe3fae3d6beb2e473d69ad15eb19b596bb1d0ff2cd7ac18f838201eda11ad7d3d02b6ffae354f866367f2ef5563eca5df8df39de5da964a978cf7d27f6b5f5c597337a93f2407e76e7e71cc183aeb733769c791eb92e6057ceb173146ea98d2813dd7b82f47de18eadc8fcfd4dccd6f600cd5733045d645e76e6ea9e7aa3877f3cba8672f610cf5d2d1973364c47e40d230cec4610dfa633683e4dddac64a7b6123b2f537da1eff33a7cfcada4345c7e07b728149f64bd6f366b2b880dc2f630f95ac1867f2152bd64ec63ad6af383de77a75afa21dfc267c505edc268b9391db58b6d32aadf5ced83a6bbf88d078b26c90d65e3faca7d65e3f55e0dace9cb5cbbe8573531b868f3560be3dd61d891dd4fd2a7dd86f6f0ed32e1b6d2f20b611991063bb6232f9afc630ed5a7a4e5e5fe5f531f3f6f1a18e62edad30eb7e97381c9e43271de7f0246bbc78e8465ee5947dab2faa72701f04fd1dbdfc90223779b7fc2657b1ec448c11138c5efedcacf195fedcbc31977300ac31f734b994d6b5c90dc967e2f49c310d0efceaa0e89c7fc67778f80e8ada0e9cd7f9daf75adb80e37be87dab355fde52b2cae2cb5eed224b67a27ff40cb33f662b4e8b63f06645306abf3edb601c0ecf0807a74ff5c72ac6c19f05077f001c7c56f720f49ee724f6db93acd7e0c56db2e634911b6a5da60c3d4a6436c9de734ef229751f36bda632e306de9fb6b1d7eb3e6c3b46d925cdc3e86b1e49cfc9ff3917f323c67d39f2381bfbf537fa3e6cbfd818a6d5fba989ac8beec376413dd789aab70fdb0751cf3e82f1d62b6e68254346d429258d153341fd57cfe7f5e44b7b0ab75ed7bb836b560c2cf94055e748597318e2807826d5b1e97399d579db9e7591319c7d236fb697bd8aca8c3a9915877bd9c07db902b8591fcbf8d65cf7a01fd9fdce6525c7aac98cdf9af30039b7cf6b6eabeeb7f5bc43e26fa834d6fccacfe570d296f16c52cea7e66e9f530fa30fd7d233bcf49e2c7f0df59e3c7fcdacae3fc7fae5c4f173d7fbb2f49bbfcea94b968f40c736726e08f9b457ac5ed6da7a8c5793347f374677f38a77f78ad5d3ba9b15ab27699e07a7fe27e866523f6973fa9a715f8e49eded65eb6eccbb0abadb57737437917551ddeda27aae8abadb3fa39e7d0d63a9979d71254346ec07240dfb256d5ba30ec431af6a3a10f7ed0989876370f2ee5d251f62d631869c3b26695e19c349f4b3b4adbf1e6248c84974bcc869cfbfb6ecca72ced817c67bc9b535a37c1da37c5eeb8e67c528b4f15ffb88e670ae3997c3bcac43f6950b0a27e3eb25cdad319c4bf7bb9a5f71bed4b22107b6a16575cd4906b9e305e779ad29dc4e787a1677b0be89a4594a4fb2be49d63aa3fc265226a665bfdf36caeea50364957dd528fbb99cb23bcdc338f4f471e8392d9b46d925cd3ae23c2fa5e76c371cafbed7b82f471e4fe65ee70ef32a063c791e38fbc88779cf016ba0bcf799b7f064c947aed771fea6e630ada4137990572447d25e846b12bb7e4ecf7be9204dc3287f3f0a5b7e3dc7a6ae3027df641bf54cea91e7b8d9c8901163cd248db51f19f95807e782db7b4eb7bcbb6360946b56bc1fc7bbaac6fb71ef18e15ff43dc5e9b935a7330e8c9b36ade4dd961e2078b51ec0bd8624cddb72c692acd8ffb6a10770cd5faebb1e47b69fa3ec753bacd89c77a28dff42f37899ce749b62b83d759ba46f963e25cb2e1b7acd5f2f9eab750f2997a57bfcc418aee760c7eb79ea1cb4c525efdd36ca2e697e12edf3a7c0e5643ca14df403c67d39f2b89ef31cda5caec7bcabc0f51ecae17a3b489f1c9372bd8e7aae8a5cefbda8671f3805ae6771264943bdb585f3281ab58996e19fcfb28992d7e9b5bfc8f53886ca7d8e4bde7e187937b1c97fb9c6399693703d7207cf39e6f49727efb6e6988b7c35ef63db9534bf3421ef631fdb00ef93fa46fe6ed94b4eeb9bd267e33cf7ccf4732e283cf4737e6c8ced4ac7d9d37f23e5d1f3d01623bf3d0ad632cac675fa25cd27c6f0158f75d59cca3ea867e751c6e4bd2b46d925cdef621c790a7c44db7993fb9f35eecb91c75738cfd0238e3bc97b1d38fbc887796f006ba0bc47d69517bea2f769aee3fc4fc057f41e9d226bea19d26713bb7e4eef51db898eef53ccf2f7a3727428ae31fffba8679fc5d8e3d5d75ec89011fb38ea7882a7e58447fb940587e4a76d204c433d43d23c9bd367712d19b6636bac2b6b8f08f94dbea8c7bf9651e6c15a3dc0eb10873098034ace9d1c79fd1975800507f925dfe752faaef7df38fa911b4fbce7eac30f5dbf7af4d0cd47eebff1c1c76f3c7654034c813eafa0d7a2d162dc421aaa3c3cb7eedfc2ff45a4e94761abcc02f2ece3b7e4e7a47275bdaa95e522d36a244d075f28e81ed46a611bb2a24bc6237467317db787cc9694ccd8dc446692e6f931325bca90590332bbe39e453e0e653bf0327d25e56c2999097ebaad24cd97c6c8ac9521b345c84c644573b36eaf2ddc6fe29a60e23b68da906bf3461eda0c95bce3bbedf960600d5b0100>, + "metadataHash": Fr<0x1a8b89c75f0ad79c19ba53a8bdfcb25bd4f8d33bfa11f1f52528a8ee58fc2543>, + "selector": Selector<0xbeda04d2>, }, } `; diff --git a/yarn-project/circuits.js/src/keys/derivation.ts b/yarn-project/circuits.js/src/keys/derivation.ts index e6d008c132c..c867bebd61a 100644 --- a/yarn-project/circuits.js/src/keys/derivation.ts +++ b/yarn-project/circuits.js/src/keys/derivation.ts @@ -28,11 +28,15 @@ export function computeIvpkApp(ivpk: PublicKey, address: AztecAddress) { export function computeIvskApp(ivsk: GrumpkinPrivateKey, address: AztecAddress) { const ivpk = curve.mul(Grumpkin.generator, ivsk); + // Here we are intentionally converting Fr (output of poseidon) to Fq. This is fine even though a distribution of + // P = s * G will not be uniform because 2 * (q - r) / q is small. const I = Fq.fromBuffer(poseidon2Hash([address.toField(), ivpk.x, ivpk.y, GeneratorIndex.IVSK_M]).toBuffer()); return new Fq((I.toBigInt() + ivsk.toBigInt()) % Fq.MODULUS); } export function computeOvskApp(ovsk: GrumpkinPrivateKey, address: AztecAddress) { + // Here we are intentionally converting Fr (output of poseidon) to Fq. This is fine even though a distribution of + // P = s * G will not be uniform because 2 * (q - r) / q is small. return GrumpkinPrivateKey.fromBuffer( poseidon2Hash([address.toField(), ovsk.high, ovsk.low, GeneratorIndex.OVSK_M]).toBuffer(), ); diff --git a/yarn-project/end-to-end/src/benchmarks/utils.ts b/yarn-project/end-to-end/src/benchmarks/utils.ts index 1e84591b95a..f761ada9c32 100644 --- a/yarn-project/end-to-end/src/benchmarks/utils.ts +++ b/yarn-project/end-to-end/src/benchmarks/utils.ts @@ -68,8 +68,10 @@ export function getFolderSize(path: string): number { */ export function makeCall(index: number, context: EndToEndContext, contract: BenchmarkingContract) { const owner = context.wallet.getAddress(); + // Setting the outgoing viewer to owner here since the outgoing logs are not important in this context + const outgoingViewer = owner; return new BatchCall(context.wallet, [ - contract.methods.create_note(owner, index + 1).request(), + contract.methods.create_note(owner, outgoingViewer, index + 1).request(), contract.methods.increment_balance(owner, index + 1).request(), ]); } diff --git a/yarn-project/end-to-end/src/e2e_2_pxes.test.ts b/yarn-project/end-to-end/src/e2e_2_pxes.test.ts index 0e61140a4c8..0d3f77be751 100644 --- a/yarn-project/end-to-end/src/e2e_2_pxes.test.ts +++ b/yarn-project/end-to-end/src/e2e_2_pxes.test.ts @@ -82,7 +82,8 @@ describe('e2e_2_pxes', () => { const contract = await TokenContract.deploy(walletA, admin, 'TokenName', 'TokenSymbol', 18).send().deployed(); if (initialAdminBalance > 0n) { - await mintTokens(contract, admin, initialAdminBalance, pxe); + // Minter is minting to herself so contract as minter is the same as contract as recipient + await mintTokens(contract, contract, admin, initialAdminBalance, pxe); } logger.info('L2 contract deployed'); @@ -90,24 +91,30 @@ describe('e2e_2_pxes', () => { return contract.instance; }; - const mintTokens = async (contract: TokenContract, recipient: AztecAddress, balance: bigint, pxe: PXE) => { + const mintTokens = async ( + contractAsMinter: TokenContract, + contractAsRecipient: TokenContract, + recipient: AztecAddress, + balance: bigint, + recipientPxe: PXE, + ) => { const secret = Fr.random(); const secretHash = computeSecretHash(secret); - const receipt = await contract.methods.mint_private(balance, secretHash).send().wait(); + const receipt = await contractAsMinter.methods.mint_private(balance, secretHash).send().wait(); const note = new Note([new Fr(balance), secretHash]); const extendedNote = new ExtendedNote( note, recipient, - contract.address, + contractAsMinter.address, TokenContract.storage.pending_shields.slot, TokenContract.notes.TransparentNote.id, receipt.txHash, ); - await pxe.addNote(extendedNote); + await recipientPxe.addNote(extendedNote); - await contract.methods.redeem_shield(recipient, balance, secret).send().wait(); + await contractAsRecipient.methods.redeem_shield(recipient, balance, secret).send().wait(); }; it('transfers funds from user A to B via PXE A followed by transfer from B to A via PXE B', async () => { @@ -207,7 +214,7 @@ describe('e2e_2_pxes', () => { expect(storedValueOnA).toEqual(newValueToSet); }); - it('private state is "zero" when Private eXecution Environment (PXE) does not have the account private key', async () => { + it('private state is "zero" when PXE does not have the account secret key', async () => { const userABalance = 100n; const userBBalance = 150n; @@ -226,14 +233,15 @@ describe('e2e_2_pxes', () => { }); // Mint tokens to user B - await mintTokens(contractWithWalletA, walletB.getAddress(), userBBalance, pxeA); + const contractWithWalletB = await TokenContract.at(tokenInstance.address, walletB); + await mintTokens(contractWithWalletA, contractWithWalletB, walletB.getAddress(), userBBalance, pxeB); // Check that user A balance is 100 on server A await expectTokenBalance(walletA, tokenInstance.address, walletA.getAddress(), userABalance); // Check that user B balance is 150 on server B await expectTokenBalance(walletB, tokenInstance.address, walletB.getAddress(), userBBalance); - // CHECK THAT PRIVATE BALANCES ARE 0 WHEN ACCOUNT'S PRIVATE KEYS ARE NOT REGISTERED + // CHECK THAT PRIVATE BALANCES ARE 0 WHEN ACCOUNT'S SECRET KEYS ARE NOT REGISTERED // Note: Not checking if the account is synchronized because it is not registered as an account (it would throw). const checkIfSynchronized = false; // Check that user A balance is 0 on server B diff --git a/yarn-project/end-to-end/src/e2e_block_building.test.ts b/yarn-project/end-to-end/src/e2e_block_building.test.ts index 0114145e4c5..f3a731eab2c 100644 --- a/yarn-project/end-to-end/src/e2e_block_building.test.ts +++ b/yarn-project/end-to-end/src/e2e_block_building.test.ts @@ -52,7 +52,10 @@ describe('e2e_block_building', () => { const TX_COUNT = 8; await aztecNode.setConfig({ minTxsPerBlock: TX_COUNT }); const deployer = new ContractDeployer(artifact, owner); - const methods = times(TX_COUNT, i => deployer.deploy(owner.getCompleteAddress().address, i)); + + const ownerAddress = owner.getCompleteAddress().address; + const outgoingViewer = ownerAddress; + const methods = times(TX_COUNT, i => deployer.deploy(ownerAddress, outgoingViewer, i)); for (let i = 0; i < TX_COUNT; i++) { await methods[i].create({ contractAddressSalt: new Fr(BigInt(i + 1)), @@ -264,9 +267,10 @@ describe('e2e_block_building', () => { const account = getSchnorrAccount(pxe, privateKey, keys.masterIncomingViewingSecretKey); await account.deploy().wait(); const thisWallet = await account.getWallet(); + const outgoingViewer = thisWallet.getAddress(); // call test contract - const action = testContract.methods.emit_encrypted_logs_nested(10, thisWallet.getAddress()); + const action = testContract.methods.emit_encrypted_logs_nested(10, thisWallet.getAddress(), outgoingViewer); const tx = await action.prove(); const rct = await action.send().wait(); @@ -288,9 +292,15 @@ describe('e2e_block_building', () => { const account = getSchnorrAccount(pxe, privateKey, keys.masterIncomingViewingSecretKey); await account.deploy().wait(); const thisWallet = await account.getWallet(); + const outgoingViewer = thisWallet.getAddress(); // call test contract - const action = testContract.methods.emit_array_as_encrypted_log([5, 4, 3, 2, 1], thisWallet.getAddress(), true); + const action = testContract.methods.emit_array_as_encrypted_log( + [5, 4, 3, 2, 1], + thisWallet.getAddress(), + outgoingViewer, + true, + ); const tx = await action.prove(); const rct = await action.send().wait(); @@ -316,7 +326,7 @@ async function sendAndWait(calls: ContractFunctionInteraction[]) { calls // First we send them all. .map(call => call.send()) - // Onlt then we wait. + // Only then we wait. .map(p => p.wait()), ); } diff --git a/yarn-project/end-to-end/src/e2e_counter_contract.test.ts b/yarn-project/end-to-end/src/e2e_counter_contract.test.ts index 1297a7c248b..c885a74bb8c 100644 --- a/yarn-project/end-to-end/src/e2e_counter_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_counter_contract.test.ts @@ -10,13 +10,16 @@ describe('e2e_counter_contract', () => { let counterContract: CounterContract; let owner: AztecAddress; + let outgoingViewer: AztecAddress; beforeAll(async () => { // Setup environment ({ teardown, wallet, logger } = await setup(1)); owner = wallet.getAddress(); + // Setting the outgoing viewer to owner to not have to bother with setting up another account. + outgoingViewer = owner; - counterContract = await CounterContract.deploy(wallet, 0, owner).send().deployed(); + counterContract = await CounterContract.deploy(wallet, 0, owner, outgoingViewer).send().deployed(); logger.info(`Counter contract deployed at ${counterContract.address}`); }); @@ -25,7 +28,7 @@ describe('e2e_counter_contract', () => { describe('increments', () => { it('counts', async () => { - const receipt = await counterContract.methods.increment(owner).send().wait(); + const receipt = await counterContract.methods.increment(owner, outgoingViewer).send().wait(); expect(await counterContract.methods.get_counter(owner).simulate()).toBe(1n); expect(receipt.transactionFee).toBeGreaterThan(0n); }); diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts index f6ba62ceaa9..cbe50942445 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts @@ -61,7 +61,15 @@ describe('e2e_deploy_contract contract class registration', () => { }); it('broadcasts a private function', async () => { - const selector = contractClass.privateFunctions[0].selector; + const constructorArtifact = artifact.functions.find(fn => fn.name == 'constructor'); + if (!constructorArtifact) { + // If this gets thrown you've probably modified the StatefulTestContract to no longer include constructor. + // If that's the case you should update this test to use a private function which fits into the bytecode size + // limit. + throw new Error('No constructor found in the StatefulTestContract artifact. Does it still exist?'); + } + const selector = FunctionSelector.fromNameAndParameters(constructorArtifact.name, constructorArtifact.parameters); + const tx = await broadcastPrivateFunction(wallet, artifact, selector).send().wait(); const logs = await pxe.getUnencryptedLogs({ txHash: tx.txHash }); const logData = logs.logs[0].log.data; @@ -94,7 +102,7 @@ describe('e2e_deploy_contract contract class registration', () => { let contract: StatefulTestContract; const deployInstance = async (opts: { constructorName?: string; deployer?: AztecAddress } = {}) => { - const initArgs = [wallet.getAddress(), 42] as StatefulContractCtorArgs; + const initArgs = [wallet.getAddress(), wallet.getAddress(), 42] as StatefulContractCtorArgs; const salt = Fr.random(); const publicKeysHash = Fr.random(); const instance = getContractInstanceFromDeployParams(artifact, { @@ -168,9 +176,9 @@ describe('e2e_deploy_contract contract class registration', () => { }); it('refuses to initialize the instance with wrong args via a private function', async () => { - await expect(contract.methods.constructor(AztecAddress.random(), 43).prove()).rejects.toThrow( - /initialization hash does not match/i, - ); + await expect( + contract.methods.constructor(AztecAddress.random(), AztecAddress.random(), 43).prove(), + ).rejects.toThrow(/initialization hash does not match/i); }); it('initializes the contract and calls a public function', async () => { @@ -196,14 +204,17 @@ describe('e2e_deploy_contract contract class registration', () => { }); describe('using a public constructor', () => { + const ignoredArg = AztecAddress.random(); beforeAll(async () => { - ({ instance, initArgs, contract } = await deployInstance({ constructorName: 'public_constructor' })); + ({ instance, initArgs, contract } = await deployInstance({ + constructorName: 'public_constructor', + })); }); it('refuses to initialize the instance with wrong args via a public function', async () => { const whom = AztecAddress.random(); const receipt = await contract.methods - .public_constructor(whom, 43) + .public_constructor(whom, ignoredArg, 43) .send({ skipPublicSimulation: true }) .wait({ dontThrowOnRevert: true }); expect(receipt.status).toEqual(TxStatus.APP_LOGIC_REVERTED); @@ -248,7 +259,8 @@ describe('e2e_deploy_contract contract class registration', () => { describe('error scenarios in deployment', () => { it('refuses to call a public function on an undeployed contract', async () => { const whom = wallet.getAddress(); - const instance = await t.registerContract(wallet, StatefulTestContract, { initArgs: [whom, 42] }); + const outgoingViewer = whom; + const instance = await t.registerContract(wallet, StatefulTestContract, { initArgs: [whom, outgoingViewer, 42] }); await expect( instance.methods.increment_public_value_no_init_check(whom, 10).send({ skipPublicSimulation: true }).wait(), ).rejects.toThrow(/dropped/); @@ -256,7 +268,7 @@ describe('e2e_deploy_contract contract class registration', () => { it('refuses to deploy an instance from a different deployer', () => { const instance = getContractInstanceFromDeployParams(artifact, { - constructorArgs: [AztecAddress.random(), 42], + constructorArgs: [AztecAddress.random(), AztecAddress.random(), 42], deployer: AztecAddress.random(), }); expect(() => deployInstance(wallet, instance)).toThrow(/does not match/i); diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_method.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_method.test.ts index a881d5a277b..5daa7a72611 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_method.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_method.test.ts @@ -1,4 +1,4 @@ -import { type DebugLogger, type PXE, type Wallet } from '@aztec/aztec.js'; +import { AztecAddress, type DebugLogger, type PXE, type Wallet } from '@aztec/aztec.js'; import { CounterContract, StatefulTestContract } from '@aztec/noir-contracts.js'; import { TestContract } from '@aztec/noir-contracts.js/Test'; import { TokenContract } from '@aztec/noir-contracts.js/Token'; @@ -12,6 +12,8 @@ describe('e2e_deploy_contract deploy method', () => { let logger: DebugLogger; let wallet: Wallet; + const ignoredArg = AztecAddress.random(); + beforeAll(async () => { ({ pxe, logger, wallet } = await t.setup()); }); @@ -21,7 +23,7 @@ describe('e2e_deploy_contract deploy method', () => { it('publicly deploys and initializes a contract', async () => { const owner = wallet.getAddress(); logger.debug(`Deploying stateful test contract`); - const contract = await StatefulTestContract.deploy(wallet, owner, 42).send().deployed(); + const contract = await StatefulTestContract.deploy(wallet, owner, owner, 42).send().deployed(); expect(await contract.methods.summed_values(owner).simulate()).toEqual(42n); logger.debug(`Calling public method on stateful test contract at ${contract.address.toString()}`); await contract.methods.increment_public_value(owner, 84).send().wait(); @@ -31,7 +33,7 @@ describe('e2e_deploy_contract deploy method', () => { it('publicly universally deploys and initializes a contract', async () => { const owner = wallet.getAddress(); const opts = { universalDeploy: true }; - const contract = await StatefulTestContract.deploy(wallet, owner, 42).send(opts).deployed(); + const contract = await StatefulTestContract.deploy(wallet, owner, owner, 42).send(opts).deployed(); expect(await contract.methods.summed_values(owner).simulate()).toEqual(42n); await contract.methods.increment_public_value(owner, 84).send().wait(); expect(await contract.methods.get_public_value(owner).simulate()).toEqual(84n); @@ -46,21 +48,31 @@ describe('e2e_deploy_contract deploy method', () => { it('publicly deploys and initializes via a public function', async () => { const owner = wallet.getAddress(); logger.debug(`Deploying contract via a public constructor`); - const contract = await StatefulTestContract.deployWithOpts({ wallet, method: 'public_constructor' }, owner, 42) + const contract = await StatefulTestContract.deployWithOpts( + { wallet, method: 'public_constructor' }, + owner, + ignoredArg, + 42, + ) .send() .deployed(); expect(await contract.methods.get_public_value(owner).simulate()).toEqual(42n); logger.debug(`Calling a private function to ensure the contract was properly initialized`); - await contract.methods.create_note(owner, 30).send().wait(); + const outgoingViewer = owner; + await contract.methods.create_note(owner, outgoingViewer, 30).send().wait(); expect(await contract.methods.summed_values(owner).simulate()).toEqual(30n); }); it('deploys a contract with a default initializer not named constructor', async () => { logger.debug(`Deploying contract with a default initializer named initialize`); const opts = { skipClassRegistration: true, skipPublicDeployment: true }; - const contract = await CounterContract.deploy(wallet, 10, wallet.getAddress()).send(opts).deployed(); + // Emitting the outgoing logs to the same address as owner to avoid having to set up another account. + const contract = await CounterContract.deploy(wallet, 10, wallet.getAddress(), wallet.getAddress()) + .send(opts) + .deployed(); logger.debug(`Calling a function to ensure the contract was properly initialized`); - await contract.methods.increment(wallet.getAddress()).send().wait(); + // Emitting the outgoing logs to the same address as owner to avoid having to set up another account. + await contract.methods.increment(wallet.getAddress(), wallet.getAddress()).send().wait(); expect(await contract.methods.get_counter(wallet.getAddress()).simulate()).toEqual(11n); }); diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/legacy.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/legacy.test.ts index 8923ae99ac6..3c085962cf8 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/legacy.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/legacy.test.ts @@ -88,7 +88,7 @@ describe('e2e_deploy_contract legacy', () => { // This test requires at least another good transaction to go through in the same block as the bad one. const artifact = TokenContractArtifact; const initArgs = ['TokenName', 'TKN', 18] as const; - const goodDeploy = StatefulTestContract.deploy(wallet, wallet.getAddress(), 42); + const goodDeploy = StatefulTestContract.deploy(wallet, wallet.getAddress(), wallet.getAddress(), 42); const badDeploy = new ContractDeployer(artifact, wallet).deploy(AztecAddress.ZERO, ...initArgs); const firstOpts = { skipPublicSimulation: true, skipClassRegistration: true, skipInstanceDeploy: true }; diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/private_initialization.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/private_initialization.test.ts index 84dab9e5065..8ed9c00c642 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/private_initialization.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/private_initialization.test.ts @@ -33,11 +33,12 @@ describe('e2e_deploy_contract private initialization', () => { // Tests privately initializing an undeployed contract. Also requires pxe registration in advance. test.each(['as entrypoint', 'from an account contract'] as const)( - 'privately initializes an undeployed contract contract %s', + 'privately initializes an undeployed contract %s', async kind => { const testWallet = kind === 'as entrypoint' ? new SignerlessWallet(pxe) : wallet; const owner = await t.registerRandomAccount(); - const initArgs: StatefulContractCtorArgs = [owner, 42]; + const outgoingViewer = owner; + const initArgs: StatefulContractCtorArgs = [owner, outgoingViewer, 42]; const contract = await t.registerContract(testWallet, StatefulTestContract, { initArgs }); logger.info(`Calling the constructor for ${contract.address}`); await contract.methods @@ -47,7 +48,7 @@ describe('e2e_deploy_contract private initialization', () => { logger.info(`Checking if the constructor was run for ${contract.address}`); expect(await contract.methods.summed_values(owner).simulate()).toEqual(42n); logger.info(`Calling a private function that requires initialization on ${contract.address}`); - await contract.methods.create_note(owner, 10).send().wait(); + await contract.methods.create_note(owner, outgoingViewer, 10).send().wait(); expect(await contract.methods.summed_values(owner).simulate()).toEqual(52n); }, ); @@ -55,7 +56,7 @@ describe('e2e_deploy_contract private initialization', () => { // Tests privately initializing multiple undeployed contracts on the same tx through an account contract. it('initializes multiple undeployed contracts in a single tx', async () => { const owner = await t.registerRandomAccount(); - const initArgs: StatefulContractCtorArgs[] = [42, 52].map(value => [owner, value]); + const initArgs: StatefulContractCtorArgs[] = [42, 52].map(value => [owner, owner, value]); const contracts = await Promise.all( initArgs.map(initArgs => t.registerContract(wallet, StatefulTestContract, { initArgs })), ); @@ -68,11 +69,12 @@ describe('e2e_deploy_contract private initialization', () => { // TODO(@spalladino): This won't work until we can read a nullifier in the same tx in which it was emitted. it.skip('initializes and calls a private function in a single tx', async () => { const owner = await t.registerRandomAccount(); - const initArgs: StatefulContractCtorArgs = [owner, 42]; + const initArgs: StatefulContractCtorArgs = [owner, owner, 42]; const contract = await t.registerContract(wallet, StatefulTestContract, { initArgs }); + const outgoingViewer = owner; const batch = new BatchCall(wallet, [ contract.methods.constructor(...initArgs).request(), - contract.methods.create_note(owner, 10).request(), + contract.methods.create_note(owner, outgoingViewer, 10).request(), ]); logger.info(`Executing constructor and private function in batch at ${contract.address}`); await batch.send().wait(); @@ -81,7 +83,7 @@ describe('e2e_deploy_contract private initialization', () => { it('refuses to initialize a contract twice', async () => { const owner = await t.registerRandomAccount(); - const initArgs: StatefulContractCtorArgs = [owner, 42]; + const initArgs: StatefulContractCtorArgs = [owner, owner, 42]; const contract = await t.registerContract(wallet, StatefulTestContract, { initArgs }); await contract.methods .constructor(...initArgs) @@ -97,25 +99,32 @@ describe('e2e_deploy_contract private initialization', () => { it('refuses to call a private function that requires initialization', async () => { const owner = await t.registerRandomAccount(); - const initArgs: StatefulContractCtorArgs = [owner, 42]; + const initArgs: StatefulContractCtorArgs = [owner, owner, 42]; const contract = await t.registerContract(wallet, StatefulTestContract, { initArgs }); // TODO(@spalladino): It'd be nicer to be able to fail the assert with a more descriptive message. - await expect(contract.methods.create_note(owner, 10).send().wait()).rejects.toThrow(/nullifier witness not found/i); + const outgoingViewer = owner; + await expect(contract.methods.create_note(owner, outgoingViewer, 10).send().wait()).rejects.toThrow( + /nullifier witness not found/i, + ); }); it('refuses to initialize a contract with incorrect args', async () => { const owner = await t.registerRandomAccount(); - const contract = await t.registerContract(wallet, StatefulTestContract, { initArgs: [owner, 42] }); - await expect(contract.methods.constructor(owner, 43).prove()).rejects.toThrow(/Initialization hash does not match/); + const outgoingViewer = owner; + const contract = await t.registerContract(wallet, StatefulTestContract, { initArgs: [owner, outgoingViewer, 42] }); + await expect(contract.methods.constructor(owner, outgoingViewer, 43).prove()).rejects.toThrow( + /Initialization hash does not match/, + ); }); it('refuses to initialize an instance from a different deployer', async () => { const owner = await t.registerRandomAccount(); + const outgoingViewer = owner; const contract = await t.registerContract(wallet, StatefulTestContract, { - initArgs: [owner, 42], + initArgs: [owner, outgoingViewer, 42], deployer: owner, }); - await expect(contract.methods.constructor(owner, 42).prove()).rejects.toThrow( + await expect(contract.methods.constructor(owner, outgoingViewer, 42).prove()).rejects.toThrow( /Initializer address is not the contract deployer/i, ); }); diff --git a/yarn-project/end-to-end/src/e2e_fees/dapp_subscription.test.ts b/yarn-project/end-to-end/src/e2e_fees/dapp_subscription.test.ts index b1acfa8c6e0..69d69af4007 100644 --- a/yarn-project/end-to-end/src/e2e_fees/dapp_subscription.test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/dapp_subscription.test.ts @@ -160,7 +160,8 @@ describe('e2e_fees dapp_subscription', () => { expect(await subscriptionContract.methods.is_initialized(aliceAddress).simulate()).toBe(true); const dappPayload = new DefaultDappEntrypoint(aliceAddress, aliceWallet, subscriptionContract.address); - const action = counterContract.methods.increment(bobAddress).request(); + // Emitting the outgoing logs to Alice below + const action = counterContract.methods.increment(bobAddress, aliceAddress).request(); const txExReq = await dappPayload.createTxExecutionRequest({ calls: [action] }); const tx = await pxe.proveTx(txExReq, true); const sentTx = new SentTx(pxe, pxe.sendTx(tx)); @@ -203,7 +204,8 @@ describe('e2e_fees dapp_subscription', () => { async function dappIncrement() { const dappEntrypoint = new DefaultDappEntrypoint(aliceAddress, aliceWallet, subscriptionContract.address); - const action = counterContract.methods.increment(bobAddress).request(); + // Emitting the outgoing logs to Alice below + const action = counterContract.methods.increment(bobAddress, aliceAddress).request(); const txExReq = await dappEntrypoint.createTxExecutionRequest({ calls: [action] }); const tx = await pxe.proveTx(txExReq, true); expect(tx.data.feePayer).toEqual(subscriptionContract.address); diff --git a/yarn-project/end-to-end/src/e2e_fees/fees_test.ts b/yarn-project/end-to-end/src/e2e_fees/fees_test.ts index 0b9e59f5f36..0960f449efa 100644 --- a/yarn-project/end-to-end/src/e2e_fees/fees_test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/fees_test.ts @@ -284,7 +284,10 @@ export class FeesTest { 'setup_subscription', async () => { // Deploy counter contract for testing with Bob as owner - const counterContract = await CounterContract.deploy(this.bobWallet, 0, this.bobAddress).send().deployed(); + // Emitting the outgoing logs to Bob below since we need someone to emit them to. + const counterContract = await CounterContract.deploy(this.bobWallet, 0, this.bobAddress, this.bobAddress) + .send() + .deployed(); // Deploy subscription contract, that allows subscriptions for SUBSCRIPTION_AMOUNT of bananas const subscriptionContract = await AppSubscriptionContract.deploy( diff --git a/yarn-project/end-to-end/src/e2e_keys.test.ts b/yarn-project/end-to-end/src/e2e_keys.test.ts index 41ae31de443..e485431c8ab 100644 --- a/yarn-project/end-to-end/src/e2e_keys.test.ts +++ b/yarn-project/end-to-end/src/e2e_keys.test.ts @@ -72,9 +72,10 @@ describe('Key Registry', () => { const noteValue = 5; const noteOwner = account.getAddress(); + const outgoingViewer = noteOwner; // Setting the outgoing viewer to owner to not have to bother with setting up another account. const noteStorageSlot = 12; - await testContract.methods.call_create_note(noteValue, noteOwner, noteStorageSlot).send().wait(); + await testContract.methods.call_create_note(noteValue, noteOwner, outgoingViewer, noteStorageSlot).send().wait(); expect(await getNumNullifiedNotes(nskApp, testContract.address)).toEqual(0); diff --git a/yarn-project/end-to-end/src/e2e_note_getter.test.ts b/yarn-project/end-to-end/src/e2e_note_getter.test.ts index 1feac9426fd..c26ecffe30d 100644 --- a/yarn-project/end-to-end/src/e2e_note_getter.test.ts +++ b/yarn-project/end-to-end/src/e2e_note_getter.test.ts @@ -151,10 +151,13 @@ describe('e2e_note_getter', () => { describe('status filter', () => { let contract: TestContract; let owner: AztecAddress; + let outgoingViewer: AztecAddress; beforeAll(async () => { contract = await TestContract.deploy(wallet).send().deployed(); owner = wallet.getCompleteAddress().address; + // Setting the outgoing viewer to owner not have to bother with setting up another account. + outgoingViewer = owner; }); const VALUE = 5; @@ -187,12 +190,12 @@ describe('e2e_note_getter', () => { const activeOrNullified = false; it('returns active notes', async () => { - await contract.methods.call_create_note(VALUE, owner, storageSlot).send().wait(); + await contract.methods.call_create_note(VALUE, owner, outgoingViewer, storageSlot).send().wait(); await assertNoteIsReturned(storageSlot, VALUE, activeOrNullified); }); it('does not return nullified notes', async () => { - await contract.methods.call_create_note(VALUE, owner, storageSlot).send().wait(); + await contract.methods.call_create_note(VALUE, owner, outgoingViewer, storageSlot).send().wait(); await contract.methods.call_destroy_note(storageSlot).send().wait(); await assertNoReturnValue(storageSlot, activeOrNullified); @@ -203,12 +206,12 @@ describe('e2e_note_getter', () => { const activeOrNullified = true; it('returns active notes', async () => { - await contract.methods.call_create_note(VALUE, owner, storageSlot).send().wait(); + await contract.methods.call_create_note(VALUE, owner, outgoingViewer, storageSlot).send().wait(); await assertNoteIsReturned(storageSlot, VALUE, activeOrNullified); }); it('returns nullified notes', async () => { - await contract.methods.call_create_note(VALUE, owner, storageSlot).send().wait(); + await contract.methods.call_create_note(VALUE, owner, outgoingViewer, storageSlot).send().wait(); await contract.methods.call_destroy_note(storageSlot).send().wait(); await assertNoteIsReturned(storageSlot, VALUE, activeOrNullified); @@ -217,9 +220,9 @@ describe('e2e_note_getter', () => { it('returns both active and nullified notes', async () => { // We store two notes with two different values in the same storage slot, and then delete one of them. Note that // we can't be sure which one was deleted since we're just deleting based on the storage slot. - await contract.methods.call_create_note(VALUE, owner, storageSlot).send().wait(); + await contract.methods.call_create_note(VALUE, owner, outgoingViewer, storageSlot).send().wait(); await contract.methods - .call_create_note(VALUE + 1, owner, storageSlot) + .call_create_note(VALUE + 1, owner, outgoingViewer, storageSlot) .send() .wait(); await contract.methods.call_destroy_note(storageSlot).send().wait(); diff --git a/yarn-project/end-to-end/src/e2e_pending_note_hashes_contract.test.ts b/yarn-project/end-to-end/src/e2e_pending_note_hashes_contract.test.ts index eb84b613a60..c02326d057e 100644 --- a/yarn-project/end-to-end/src/e2e_pending_note_hashes_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_pending_note_hashes_contract.test.ts @@ -83,7 +83,11 @@ describe('e2e_pending_note_hashes_contract', () => { const deployedContract = await deployContract(); - await deployedContract.methods.test_insert_then_get_then_nullify_flat(mintAmount, owner).send().wait(); + const outgoingViewer = owner; + await deployedContract.methods + .test_insert_then_get_then_nullify_flat(mintAmount, owner, outgoingViewer) + .send() + .wait(); }); it('Squash! Aztec.nr function can "create" and "nullify" note in the same TX', async () => { @@ -93,10 +97,12 @@ describe('e2e_pending_note_hashes_contract', () => { const deployedContract = await deployContract(); + const outgoingViewer = owner; await deployedContract.methods .test_insert_then_get_then_nullify_all_in_nested_calls( mintAmount, owner, + outgoingViewer, deployedContract.methods.insert_note.selector, deployedContract.methods.get_then_nullify_note.selector, ) @@ -118,10 +124,12 @@ describe('e2e_pending_note_hashes_contract', () => { const deployedContract = await deployContract(); + const outgoingViewer = owner; await deployedContract.methods .test_insert2_then_get2_then_nullify2_all_in_nested_calls( mintAmount, owner, + outgoingViewer, deployedContract.methods.insert_note.selector, deployedContract.methods.get_then_nullify_note.selector, ) @@ -141,10 +149,12 @@ describe('e2e_pending_note_hashes_contract', () => { const deployedContract = await deployContract(); + const outgoingViewer = owner; await deployedContract.methods .test_insert2_then_get2_then_nullify1_all_in_nested_calls( mintAmount, owner, + outgoingViewer, deployedContract.methods.insert_note.selector, deployedContract.methods.get_then_nullify_note.selector, ) @@ -167,7 +177,8 @@ describe('e2e_pending_note_hashes_contract', () => { const deployedContract = await deployContract(); // create persistent note - await deployedContract.methods.insert_note(mintAmount, owner).send().wait(); + const outgoingViewer = owner; + await deployedContract.methods.insert_note(mintAmount, owner, outgoingViewer).send().wait(); await expectNoteHashesSquashedExcept(1); // first TX just creates 1 persistent note await expectNullifiersSquashedExcept(0); @@ -178,6 +189,7 @@ describe('e2e_pending_note_hashes_contract', () => { .test_insert1_then_get2_then_nullify2_all_in_nested_calls( mintAmount, owner, + outgoingViewer, deployedContract.methods.insert_note.selector, deployedContract.methods.get_then_nullify_note.selector, ) @@ -204,7 +216,8 @@ describe('e2e_pending_note_hashes_contract', () => { const mintAmount = 65n; const deployedContract = await deployContract(); - await deployedContract.methods.insert_note(mintAmount, owner).send().wait(); + const outgoingViewer = owner; + await deployedContract.methods.insert_note(mintAmount, owner, outgoingViewer).send().wait(); // There is a single new note hash. await expectNoteHashesSquashedExcept(1); @@ -214,6 +227,7 @@ describe('e2e_pending_note_hashes_contract', () => { .test_insert_then_get_then_nullify_all_in_nested_calls( mintAmount, owner, + outgoingViewer, deployedContract.methods.dummy.selector, deployedContract.methods.get_then_nullify_note.selector, ) @@ -225,11 +239,13 @@ describe('e2e_pending_note_hashes_contract', () => { }); it('Should handle overflowing the kernel data structures in nested calls', async () => { + // Setting the outgoing viewer to owner not have to bother with setting up another account. + const outgoingViewer = owner; const notesPerIteration = Math.min(MAX_NEW_NOTE_HASHES_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL); const minToNeedReset = Math.min(MAX_NEW_NOTE_HASHES_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX) + 1; const deployedContract = await deployContract(); await deployedContract.methods - .test_recursively_create_notes(owner, Math.ceil(minToNeedReset / notesPerIteration)) + .test_recursively_create_notes(owner, outgoingViewer, Math.ceil(minToNeedReset / notesPerIteration)) .send() .wait(); }); diff --git a/yarn-project/end-to-end/src/e2e_static_calls.test.ts b/yarn-project/end-to-end/src/e2e_static_calls.test.ts index 07d07eff943..6b12ab3cd37 100644 --- a/yarn-project/end-to-end/src/e2e_static_calls.test.ts +++ b/yarn-project/end-to-end/src/e2e_static_calls.test.ts @@ -1,4 +1,4 @@ -import { type Wallet } from '@aztec/aztec.js'; +import { type AztecAddress, type Wallet } from '@aztec/aztec.js'; import { StaticChildContract, StaticParentContract } from '@aztec/noir-contracts.js'; import { STATIC_CALL_STATE_MODIFICATION_ERROR, STATIC_CONTEXT_ASSERTION_ERROR } from './fixtures/fixtures.js'; @@ -9,27 +9,31 @@ describe('e2e_static_calls', () => { let parentContract: StaticParentContract; let childContract: StaticChildContract; let teardown: () => Promise; + let owner: AztecAddress; + let outgoingViewer: AztecAddress; beforeAll(async () => { ({ teardown, wallet } = await setup()); - parentContract = await StaticParentContract.deploy(wallet).send().deployed(); + owner = wallet.getCompleteAddress().address; + // Setting the outgoing viewer to owner not have to bother with setting up another account. + (outgoingViewer = owner), (parentContract = await StaticParentContract.deploy(wallet).send().deployed()); childContract = await StaticChildContract.deploy(wallet).send().deployed(); // We create a note in the set, such that later reads doesn't fail due to get_notes returning 0 notes - await childContract.methods.private_set_value(42n, wallet.getCompleteAddress().address).send().wait(); + await childContract.methods.private_set_value(42n, owner, outgoingViewer).send().wait(); }); afterAll(() => teardown()); describe('direct view calls to child', () => { it('performs legal private static calls', async () => { - await childContract.methods.private_get_value(42n, wallet.getCompleteAddress().address).send().wait(); + await childContract.methods.private_get_value(42n, owner).send().wait(); }); it('fails when performing non-static calls to poorly written static private functions', async () => { - await expect( - childContract.methods.private_illegal_set_value(42n, wallet.getCompleteAddress().address).send().wait(), - ).rejects.toThrow(STATIC_CALL_STATE_MODIFICATION_ERROR); + await expect(childContract.methods.private_illegal_set_value(42n, owner).send().wait()).rejects.toThrow( + STATIC_CALL_STATE_MODIFICATION_ERROR, + ); }); it('performs legal public static calls', async () => { @@ -47,25 +51,19 @@ describe('e2e_static_calls', () => { it('performs legal private to private static calls', async () => { // Using low level calls await parentContract.methods - .private_static_call(childContract.address, childContract.methods.private_get_value.selector, [ - 42n, - wallet.getCompleteAddress().address, - ]) + .private_static_call(childContract.address, childContract.methods.private_get_value.selector, [42n, owner]) .send() .wait(); // Using the contract interface - await parentContract.methods - .private_get_value_from_child(childContract.address, 42n, wallet.getCompleteAddress().address) - .send() - .wait(); + await parentContract.methods.private_get_value_from_child(childContract.address, 42n, owner).send().wait(); }); it('performs legal (nested) private to private static calls', async () => { await parentContract.methods .private_nested_static_call(childContract.address, childContract.methods.private_get_value.selector, [ 42n, - wallet.getCompleteAddress().address, + owner, ]) .send() .wait(); @@ -114,9 +112,10 @@ describe('e2e_static_calls', () => { it('fails when performing illegal private to private static calls', async () => { await expect( parentContract.methods - .private_static_call(childContract.address, childContract.methods.private_set_value.selector, [ + .private_static_call_3_args(childContract.address, childContract.methods.private_set_value.selector, [ 42n, - wallet.getCompleteAddress().address, + owner, + outgoingViewer, ]) .send() .wait(), @@ -126,10 +125,7 @@ describe('e2e_static_calls', () => { it('fails when performing non-static calls to poorly written private static functions', async () => { await expect( parentContract.methods - .private_call(childContract.address, childContract.methods.private_illegal_set_value.selector, [ - 42n, - wallet.getCompleteAddress().address, - ]) + .private_call(childContract.address, childContract.methods.private_illegal_set_value.selector, [42n, owner]) .send() .wait(), ).rejects.toThrow(STATIC_CONTEXT_ASSERTION_ERROR); @@ -138,9 +134,10 @@ describe('e2e_static_calls', () => { it('fails when performing illegal (nested) private to private static calls', async () => { await expect( parentContract.methods - .private_nested_static_call(childContract.address, childContract.methods.private_set_value.selector, [ + .private_nested_static_call_3_args(childContract.address, childContract.methods.private_set_value.selector, [ 42n, - wallet.getCompleteAddress().address, + owner, + outgoingViewer, ]) .send() .wait(), @@ -192,10 +189,7 @@ describe('e2e_static_calls', () => { it('fails when performing non-static enqueue calls to poorly written public static functions', async () => { await expect( parentContract.methods - .enqueue_call(childContract.address, childContract.methods.pub_illegal_inc_value.selector, [ - 42n, - wallet.getCompleteAddress().address, - ]) + .enqueue_call(childContract.address, childContract.methods.pub_illegal_inc_value.selector, [42n, owner]) .send() .wait(), ).rejects.toThrow(STATIC_CONTEXT_ASSERTION_ERROR); diff --git a/yarn-project/end-to-end/src/flakey_e2e_inclusion_proofs_contract.test.ts b/yarn-project/end-to-end/src/flakey_e2e_inclusion_proofs_contract.test.ts index 6be433e2b2a..0c0c0f9d489 100644 --- a/yarn-project/end-to-end/src/flakey_e2e_inclusion_proofs_contract.test.ts +++ b/yarn-project/end-to-end/src/flakey_e2e_inclusion_proofs_contract.test.ts @@ -274,7 +274,12 @@ describe('e2e_inclusion_proofs_contract', () => { it('proves initialization of a contract', async () => { // Initialize (but not deploy) a test contract - const receipt = await StatefulTestContract.deploy(wallets[0], wallets[0].getAddress(), 42n) + const receipt = await StatefulTestContract.deploy( + wallets[0], + wallets[0].getAddress(), + wallets[0].getAddress(), + 42n, + ) .send({ skipClassRegistration: true, skipPublicDeployment: true }) .wait(); diff --git a/yarn-project/pxe/src/note_processor/note_processor.test.ts b/yarn-project/pxe/src/note_processor/note_processor.test.ts index 30bb4ffbf34..1f7d223fdf0 100644 --- a/yarn-project/pxe/src/note_processor/note_processor.test.ts +++ b/yarn-project/pxe/src/note_processor/note_processor.test.ts @@ -13,8 +13,10 @@ import { Fr, type GrumpkinPrivateKey, INITIAL_L2_BLOCK_NUM, + KeyValidationRequest, MAX_NEW_NOTE_HASHES_PER_TX, type PublicKey, + computeOvskApp, deriveKeys, } from '@aztec/circuits.js'; import { pedersenHash } from '@aztec/foundation/crypto'; @@ -45,8 +47,11 @@ describe('Note Processor', () => { const firstBlockDataStartIndex = (firstBlockNum - 1) * numCommitmentsPerBlock; const firstBlockDataEndIndex = firstBlockNum * numCommitmentsPerBlock; - let ownerMasterIncomingViewingSecretKey: GrumpkinPrivateKey; - let ownerMasterIncomingViewingPublicKey: PublicKey; + let ownerIvskM: GrumpkinPrivateKey; + let ownerIvpkM: PublicKey; + let ownerOvKeys: KeyValidationRequest; + + const app = AztecAddress.random(); // ownedData: [tx1, tx2, ...], the numbers in each tx represents the indices of the note hashes the account owns. const createEncryptedLogsAndOwnedL1NotePayloads = (ownedData: number[][], ownedNotes: TaggedNote[]) => { @@ -63,20 +68,18 @@ describe('Note Processor', () => { const logs: EncryptedNoteFunctionL2Logs[] = []; for (let noteIndex = 0; noteIndex < MAX_NEW_NOTE_HASHES_PER_TX; ++noteIndex) { const isOwner = ownedDataIndices.includes(noteIndex); - const ivsk = isOwner ? ownerMasterIncomingViewingPublicKey : Point.random(); + const ivpk = isOwner ? ownerIvpkM : Point.random(); + const ovKeys = isOwner ? ownerOvKeys : new KeyValidationRequest(Point.random(), Fr.random()); const note = (isOwner && ownedNotes[usedOwnedNote]) || TaggedNote.random(); usedOwnedNote += note === ownedNotes[usedOwnedNote] ? 1 : 0; newNotes.push(note); if (isOwner) { ownedL1NotePayloads.push(note.notePayload); } - // const encryptedNote = - //const log = note.toEncryptedBuffer(publicKey); const ephSk = GrumpkinScalar.random(); - const ovsk = GrumpkinScalar.random(); const recipient = AztecAddress.random(); - const log = note.encrypt(ephSk, recipient, ivsk, ovsk); + const log = note.encrypt(ephSk, recipient, ivpk, ovKeys); // 1 tx containing 1 function invocation containing 1 log logs.push(new EncryptedNoteFunctionL2Logs([new EncryptedL2NoteLog(log)])); } @@ -128,8 +131,13 @@ describe('Note Processor', () => { const ownerSk = Fr.random(); const allOwnerKeys = deriveKeys(ownerSk); - ownerMasterIncomingViewingSecretKey = allOwnerKeys.masterIncomingViewingSecretKey; - ownerMasterIncomingViewingPublicKey = allOwnerKeys.publicKeys.masterIncomingViewingPublicKey; + ownerIvskM = allOwnerKeys.masterIncomingViewingSecretKey; + ownerIvpkM = allOwnerKeys.publicKeys.masterIncomingViewingPublicKey; + // TODO(#6640)): get rid of this ugly conversion + ownerOvKeys = new KeyValidationRequest( + allOwnerKeys.publicKeys.masterOutgoingViewingPublicKey, + Fr.fromBuffer(computeOvskApp(allOwnerKeys.masterOutgoingViewingSecretKey, app).toBuffer()), + ); }); beforeEach(() => { @@ -139,15 +147,8 @@ describe('Note Processor', () => { aztecNode = mock(); keyStore = mock(); simulator = mock(); - keyStore.getMasterIncomingViewingSecretKeyForPublicKey.mockResolvedValue(ownerMasterIncomingViewingSecretKey); - noteProcessor = new NoteProcessor( - ownerMasterIncomingViewingPublicKey, - keyStore, - database, - aztecNode, - INITIAL_L2_BLOCK_NUM, - simulator, - ); + keyStore.getMasterIncomingViewingSecretKeyForPublicKey.mockResolvedValue(ownerIvskM); + noteProcessor = new NoteProcessor(ownerIvpkM, keyStore, database, aztecNode, INITIAL_L2_BLOCK_NUM, simulator); simulator.computeNoteHashAndNullifier.mockImplementation((...args) => Promise.resolve({ @@ -251,7 +252,7 @@ describe('Note Processor', () => { await noteProcessor.process(blocks, encryptedLogsArr); const newNoteProcessor = new NoteProcessor( - ownerMasterIncomingViewingPublicKey, + ownerIvpkM, keyStore, database, aztecNode, diff --git a/yarn-project/simulator/src/acvm/oracle/oracle.ts b/yarn-project/simulator/src/acvm/oracle/oracle.ts index 457a205d00b..2bc2b9fcaee 100644 --- a/yarn-project/simulator/src/acvm/oracle/oracle.ts +++ b/yarn-project/simulator/src/acvm/oracle/oracle.ts @@ -1,4 +1,5 @@ import { MerkleTreeId, UnencryptedL2Log } from '@aztec/circuit-types'; +import { KeyValidationRequest } from '@aztec/circuits.js'; import { EventSelector, FunctionSelector } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr, Point } from '@aztec/foundation/fields'; @@ -306,16 +307,22 @@ export class Oracle { [contractAddress]: ACVMField[], [storageSlot]: ACVMField[], [noteTypeId]: ACVMField[], - [publicKeyX]: ACVMField[], - [publicKeyY]: ACVMField[], + [ovskApp]: ACVMField[], + [ovpkMX]: ACVMField[], + [ovpkMY]: ACVMField[], + [ivpkMX]: ACVMField[], + [ivpkMY]: ACVMField[], preimage: ACVMField[], ): ACVMField[] { - const publicKey = new Point(fromACVMField(publicKeyX), fromACVMField(publicKeyY)); + const ovpkM = new Point(fromACVMField(ovpkMX), fromACVMField(ovpkMY)); + const ovKeys = new KeyValidationRequest(ovpkM, Fr.fromString(ovskApp)); + const ivpkM = new Point(fromACVMField(ivpkMX), fromACVMField(ivpkMY)); const encLog = this.typedOracle.computeEncryptedLog( AztecAddress.fromString(contractAddress), Fr.fromString(storageSlot), Fr.fromString(noteTypeId), - publicKey, + ovKeys, + ivpkM, preimage.map(fromACVMField), ); const bytes: ACVMField[] = []; diff --git a/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts b/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts index f0323cb556e..b4afde67169 100644 --- a/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts +++ b/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts @@ -188,7 +188,8 @@ export abstract class TypedOracle { _contractAddress: AztecAddress, _storageSlot: Fr, _noteTypeId: Fr, - _publicKey: PublicKey, + _ovKeys: KeyValidationRequest, + _ivpkM: PublicKey, _preimage: Fr[], ): Buffer { throw new OracleMethodNotAvailableError('computeEncryptedLog'); diff --git a/yarn-project/simulator/src/client/client_execution_context.ts b/yarn-project/simulator/src/client/client_execution_context.ts index cc12ace4b3d..3ef9681e29a 100644 --- a/yarn-project/simulator/src/client/client_execution_context.ts +++ b/yarn-project/simulator/src/client/client_execution_context.ts @@ -12,6 +12,7 @@ import { CallContext, FunctionSelector, type Header, + type KeyValidationRequest, PrivateContextInputs, PublicCallRequest, type TxContext, @@ -363,14 +364,16 @@ export class ClientExecutionContext extends ViewDataOracle { * @param contractAddress - The contract address of the note. * @param storageSlot - The storage slot the note is at. * @param noteTypeId - The type ID of the note. - * @param ivpk - The master incoming viewing public key. + * @param ovKeys - The outgoing viewing keys to use to encrypt. + * @param ivpkM - The master incoming viewing public key. * @param preimage - The note preimage. */ public override computeEncryptedLog( contractAddress: AztecAddress, storageSlot: Fr, noteTypeId: Fr, - ivpk: Point, + ovKeys: KeyValidationRequest, + ivpkM: Point, preimage: Fr[], ) { const note = new Note(preimage); @@ -379,11 +382,9 @@ export class ClientExecutionContext extends ViewDataOracle { const ephSk = GrumpkinScalar.random(); - // @todo Issue(#6410) Right now we are completely ignoring the outgoing log. Just drawing random data. - const ovsk = GrumpkinScalar.random(); const recipient = AztecAddress.random(); - return taggedNote.encrypt(ephSk, recipient, ivpk, ovsk); + return taggedNote.encrypt(ephSk, recipient, ivpkM, ovKeys); } /** diff --git a/yarn-project/simulator/src/client/private_execution.test.ts b/yarn-project/simulator/src/client/private_execution.test.ts index b6975dab658..a38cef58351 100644 --- a/yarn-project/simulator/src/client/private_execution.test.ts +++ b/yarn-project/simulator/src/client/private_execution.test.ts @@ -26,6 +26,7 @@ import { StateReference, TxContext, computeAppNullifierSecretKey, + computeOvskApp, deriveKeys, getContractInstanceFromDeployParams, getNonEmptyItems, @@ -82,8 +83,10 @@ describe('Private Execution test suite', () => { let ownerCompleteAddress: CompleteAddress; let recipientCompleteAddress: CompleteAddress; - let ownerMasterNullifierSecretKey: GrumpkinPrivateKey; - let recipientMasterNullifierSecretKey: GrumpkinPrivateKey; + let ownerNskM: GrumpkinPrivateKey; + let ownerOvskM: GrumpkinPrivateKey; + let recipientNskM: GrumpkinPrivateKey; + let recipientOvskM: GrumpkinPrivateKey; const treeHeights: { [name: string]: number } = { noteHash: NOTE_HASH_TREE_HEIGHT, @@ -178,11 +181,12 @@ describe('Private Execution test suite', () => { const ownerPartialAddress = Fr.random(); ownerCompleteAddress = CompleteAddress.fromSecretKeyAndPartialAddress(ownerSk, ownerPartialAddress); - ownerMasterNullifierSecretKey = deriveKeys(ownerSk).masterNullifierSecretKey; + ({ masterNullifierSecretKey: ownerNskM, masterOutgoingViewingSecretKey: ownerOvskM } = deriveKeys(ownerSk)); const recipientPartialAddress = Fr.random(); recipientCompleteAddress = CompleteAddress.fromSecretKeyAndPartialAddress(recipientSk, recipientPartialAddress); - recipientMasterNullifierSecretKey = deriveKeys(recipientSk).masterNullifierSecretKey; + ({ masterNullifierSecretKey: recipientNskM, masterOutgoingViewingSecretKey: recipientOvskM } = + deriveKeys(recipientSk)); owner = ownerCompleteAddress.address; recipient = recipientCompleteAddress.address; @@ -190,25 +194,44 @@ describe('Private Execution test suite', () => { beforeEach(async () => { trees = {}; + // TODO(#6640) most of the oracles bellow seem to be stateless - move to beforeAll oracle = mock(); - oracle.getKeyValidationRequest.mockImplementation((npkMHash: Fr, contractAddress: AztecAddress) => { - if (npkMHash.equals(ownerCompleteAddress.publicKeys.masterNullifierPublicKey.hash())) { + oracle.getKeyValidationRequest.mockImplementation((pkMHash: Fr, contractAddress: AztecAddress) => { + if (pkMHash.equals(ownerCompleteAddress.publicKeys.masterNullifierPublicKey.hash())) { return Promise.resolve( new KeyValidationRequest( ownerCompleteAddress.publicKeys.masterNullifierPublicKey, - computeAppNullifierSecretKey(ownerMasterNullifierSecretKey, contractAddress), + computeAppNullifierSecretKey(ownerNskM, contractAddress), ), ); } - if (npkMHash.equals(recipientCompleteAddress.publicKeys.masterNullifierPublicKey.hash())) { + if (pkMHash.equals(ownerCompleteAddress.publicKeys.masterOutgoingViewingPublicKey.hash())) { + return Promise.resolve( + new KeyValidationRequest( + ownerCompleteAddress.publicKeys.masterOutgoingViewingPublicKey, + // TODO(#6640)): nuke this ugly conversion + Fr.fromBuffer(computeOvskApp(ownerOvskM, contractAddress).toBuffer()), + ), + ); + } + if (pkMHash.equals(recipientCompleteAddress.publicKeys.masterNullifierPublicKey.hash())) { return Promise.resolve( new KeyValidationRequest( recipientCompleteAddress.publicKeys.masterNullifierPublicKey, - computeAppNullifierSecretKey(recipientMasterNullifierSecretKey, contractAddress), + computeAppNullifierSecretKey(recipientNskM, contractAddress), ), ); } - throw new Error(`Unknown master nullifier public key hash: ${npkMHash}`); + if (pkMHash.equals(recipientCompleteAddress.publicKeys.masterOutgoingViewingPublicKey.hash())) { + return Promise.resolve( + new KeyValidationRequest( + recipientCompleteAddress.publicKeys.masterOutgoingViewingPublicKey, + // TODO(#6640)): nuke this ugly conversion + Fr.fromBuffer(computeOvskApp(recipientOvskM, contractAddress).toBuffer()), + ), + ); + } + throw new Error(`Unknown master public key hash: ${pkMHash}`); }); // We call insertLeaves here with no leaves to populate empty public data tree root --> this is necessary to be @@ -223,7 +246,7 @@ describe('Private Execution test suite', () => { if (address.equals(recipient)) { return Promise.resolve(recipientCompleteAddress); } - throw new Error(`Unknown address: ${address}`); + throw new Error(`Unknown address: ${address}. Recipient: ${recipient}, Owner: ${owner}`); }); // This oracle gets called when reading ivpk_m from key registry --> we return zero witness indicating that // the keys were not registered. This triggers non-registered keys flow in which getCompleteAddress oracle @@ -279,7 +302,9 @@ describe('Private Execution test suite', () => { // NB: this test does NOT cover correct enc/dec of values, just whether // the kernels correctly populate non-note encrypted logs const artifact = getFunctionArtifact(TestContractArtifact, 'emit_array_as_encrypted_log'); - const args = [times(5, () => Fr.random()), owner, false]; + // We emit the outgoing here to recipient for no reason at all + const outgoingViewer = recipient; + const args = [times(5, () => Fr.random()), owner, outgoingViewer, false]; const result = await runSimulator({ artifact, msgSender: owner, args }); const newEncryptedLogs = getNonEmptyItems(result.callStackItem.publicInputs.encryptedLogsHashes); @@ -338,7 +363,7 @@ describe('Private Execution test suite', () => { }); it('should have a constructor with arguments that inserts notes', async () => { - const initArgs = [owner, 140]; + const initArgs = [owner, owner, 140]; const instance = getContractInstanceFromDeployParams(StatefulTestContractArtifact, { constructorArgs: initArgs }); oracle.getContractInstance.mockResolvedValue(instance); const artifact = getFunctionArtifact(StatefulTestContractArtifact, 'constructor'); @@ -348,6 +373,7 @@ describe('Private Execution test suite', () => { expect(result.newNotes).toHaveLength(1); const newNote = result.newNotes[0]; expect(newNote.storageSlot).toEqual(computeSlotForMapping(new Fr(1n), owner)); + // TODO(#6640)): update the constants here expect(newNote.noteTypeId).toEqual(new Fr(869710811710178111116101n)); // ValueNote const newNoteHashes = getNonEmptyItems(result.callStackItem.publicInputs.newNoteHashes); @@ -373,11 +399,12 @@ describe('Private Execution test suite', () => { it('should run the create_note function', async () => { const artifact = getFunctionArtifact(StatefulTestContractArtifact, 'create_note_no_init_check'); - const result = await runSimulator({ args: [owner, 140], artifact }); + const result = await runSimulator({ args: [owner, owner, 140], artifact }); expect(result.newNotes).toHaveLength(1); const newNote = result.newNotes[0]; expect(newNote.storageSlot).toEqual(computeSlotForMapping(new Fr(1n), owner)); + // TODO(#6640): update the constants here expect(newNote.noteTypeId).toEqual(new Fr(869710811710178111116101n)); // ValueNote const newNoteHashes = getNonEmptyItems(result.callStackItem.publicInputs.newNoteHashes); @@ -934,7 +961,8 @@ describe('Private Execution test suite', () => { const contractAddress = AztecAddress.random(); const artifact = getFunctionArtifact(PendingNoteHashesContractArtifact, 'test_insert_then_get_then_nullify_flat'); - const args = [amountToTransfer, owner]; + const outgoingViewer = owner; + const args = [amountToTransfer, owner, outgoingViewer]; const result = await runSimulator({ args: args, artifact: artifact, @@ -982,7 +1010,7 @@ describe('Private Execution test suite', () => { const nullifier = result.callStackItem.publicInputs.newNullifiers[0]; const expectedNullifier = poseidon2Hash([ innerNoteHash, - computeAppNullifierSecretKey(ownerMasterNullifierSecretKey, contractAddress), + computeAppNullifierSecretKey(ownerNskM, contractAddress), GeneratorIndex.NOTE_NULLIFIER, ]); expect(nullifier.value).toEqual(expectedNullifier); @@ -1008,7 +1036,14 @@ describe('Private Execution test suite', () => { getThenNullifyArtifact.parameters, ); - const args = [amountToTransfer, owner, insertFnSelector.toField(), getThenNullifyFnSelector.toField()]; + const outgoingViewer = owner; + const args = [ + amountToTransfer, + owner, + outgoingViewer, + insertFnSelector.toField(), + getThenNullifyFnSelector.toField(), + ]; const result = await runSimulator({ args: args, artifact: artifact, @@ -1060,7 +1095,7 @@ describe('Private Execution test suite', () => { const nullifier = execGetThenNullify.callStackItem.publicInputs.newNullifiers[0]; const expectedNullifier = poseidon2Hash([ innerNoteHash, - computeAppNullifierSecretKey(ownerMasterNullifierSecretKey, contractAddress), + computeAppNullifierSecretKey(ownerNskM, contractAddress), GeneratorIndex.NOTE_NULLIFIER, ]); expect(nullifier.value).toEqual(expectedNullifier);